<div dir="ltr"><div>BDDC is a domain decomposition solver of the non-overlapping type and cannot be used on assembled operators.</div><div>If you want to use it, you need to restructure your code a bit.</div><div><br></div><div>I presume from your message that your current approach is</div><div><br></div><div>1) generate_assembled_csr</div><div>2) decompose_csr? or decompose_mesh?</div><div>3) get_subdomain_relevant_entries</div><div>4) set in local matrix</div><div><br></div><div>this is wrong since you are summing up redundant matrix values in the final MATIS format (you can check that MatMultEqual return false if you compare the assembled operator and the MATIS operator)</div><div><br></div><div>You should restructure your code as</div><div><br></div><div>1) decompose mesh</div><div>2) generate_csr_only_for_local_subdomain</div><div>3) set values in local ordering into the MATIS object</div><div><br></div><div>you can start with a simple 2 cells problem, each assigned to a different process to understand how to move forward.</div><div><br></div><div>You can play with src/ksp/ksp/tutorials/ex71.c which uses a structured grid to understand how to setup a MATIS for a  PDE solve</div><div><br></div><div>Hope this helps</div><div><br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">Il giorno lun 15 mag 2023 alle ore 17:08 ziming xiong <<a href="mailto:xiongziming2010@gmail.com">xiongziming2010@gmail.com</a>> ha scritto:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr">Hello sir,<br>I am a PhD student and am trying to use the PCBDDC method in petsc to solve the matrix, but the final result is wrong. So I would like to ask you a few questions.<br>First I will describe the flow of my code, I first used the finite element method to build the total matrix in CSR format (total boundary conditions have been imposed), where I did not build the total matrix, but only the parameters ia, ja,value in CSR format, through which the parameters of the metis (xadj, adjncy) are derived. The matrix is successfully divided into 2 subdomains using metis. After getting the global index of the points of each subdomain by the part parameter of metis. I apply ISLocalToGlobalMappingCreate to case mapping and use ISGlobalToLocalMappingApply to convert the global index of points within each process to local index and use MatSetValueLocal to populate the corresponding subdomain matrix for each process. Here I am missing the relationship of the boundary points between subdomains, and by using ISGlobalToLocalMappingApply (I use IS_GTOLM_MASK to get the points outside the subdomains converted to -1) I can get the index of the missing relationship in the global matrix as well as the value. After creating the global MATIS use MatISSetLocalMat to synchronize the subdomain matrix to the global MATIS. After using MatSetValues to add the relationship of the boundary points between subdomains into the global MATIS. The final calculation is performed, but the final result is not correct.<br>My question is:<br>1. in PetscCall(MatAssemblyBegin(matIS, MAT_FINAL_ASSEMBLY)).<br>    PetscCall(MatAssemblyEnd(matIS, MAT_FINAL_ASSEMBLY)).<br>After that, when viewing the matrix by PetscCall(MatView(matIS,PETSC_VIEWER_STDOUT_WORLD));, each process will output the non-zero items of the matrix separately, but this index is the local index is this normal?<br>2. I found that after using MatSetValues to add the relationship of boundary points between subdomains into the global MATIS, the calculation result does not change. Why is this? Can I interpolate directly into the global MATIS if I know the global matrix index of the missing relations?<div><br></div><div><br></div><div><div>Best regards,</div><div>Ziming XIONG</div></div><div> <br></div></div>
</blockquote></div><br clear="all"><br><span class="gmail_signature_prefix">-- </span><br><div dir="ltr" class="gmail_signature">Stefano</div>