<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class="">Hello,<div class="">While trying out Stefano’s PCApplyMat_MG() code (*), we stumbled upon weird numerical errors when reusing a Mat for both MatProduct_AB and MatProduct_AtB.</div><div class="">This reminded me that there has been a long-standing issue with MatTransposeMatMult(), see <a href="https://www.mcs.anl.gov/petsc/petsc-current/src/ksp/pc/impls/hpddm/hpddm.cxx.html#line608" class="">https://www.mcs.anl.gov/petsc/petsc-current/src/ksp/pc/impls/hpddm/hpddm.cxx.html#line608</a>, that I never looked into.</div><div class="">I’ve now been trying to figure this out, because this has side effects in multiple places (PCMG and PCHPDDM at least), and thus could impact user-code as well?</div><div class="">With this commit: <a href="https://gitlab.com/petsc/petsc/-/commit/03d8bd538039defc2fcc3e37d523735c4aaceba0" class="">https://gitlab.com/petsc/petsc/-/commit/03d8bd538039defc2fcc3e37d523735c4aaceba0</a></div><div class="">+</div><div class="">$ mpirun -n 4 src/ksp/ksp/tutorials/ex76 -ksp_converged_reason -pc_type hpddm -pc_hpddm_levels_1_eps_nev 20 -ksp_type preonly -mat_type aij -load_dir ${DATAFILESPATH}/matrices/hpddm/GENEO -rhs 2 -pc_hpddm_coarse_correction balanced -C_input_mattransposematmult -D_output_mattransposematmult</div><div class="">I’m seeing that C is nonzero, but D is full of zeros.</div><div class=""><div class="">Mat Object: 4 MPI processes</div><div class="">  type: mpidense</div><div class="">5.7098316584361917e-08 1.0159399260517841e-07</div><div class="">1.5812349976211856e-07 2.0688121715350138e-07</div><div class="">2.4887556933361981e-08 4.8111092300772958e-08</div><div class="">1.4606298643602107e-07 1.7213611729839211e-07</div></div><div class="">[…]</div><div class=""><div class="">Mat Object: 4 MPI processes</div><div class="">  type: mpidense</div><div class="">0.0000000000000000e+00 0.0000000000000000e+00</div><div class="">0.0000000000000000e+00 0.0000000000000000e+00</div><div class="">0.0000000000000000e+00 0.0000000000000000e+00</div><div class="">0.0000000000000000e+00 0.0000000000000000e+00</div></div><div class="">[…]</div><div class=""><br class=""></div><div class="">If one switches to a MatType which has no MatProduct_AtB implementation with B of type MPIDense (reminder: in that case, the product is computed column-by-column), e.g., -mat_type sbaij, one gets the expected result.</div><div class=""><div class="">Mat Object: 4 MPI processes</div><div class="">  type: mpidense</div><div class="">7.2003197398135299e-01 9.5191869895699011e-01</div><div class="">6.1793966541680234e-02 9.3884397585488877e-01</div><div class="">1.0022337823233585e-02 2.4653068080134588e-01</div><div class="">1.4463931936094099e-01 8.6111517670701687e-01</div></div><div class=""><br class=""></div><div class="">Is there a bug somewhere with the MatAIJ implementation, or am I doing something which is not allowed by the MatProduct() machinery?</div><div class=""><br class=""></div><div class="">Thanks,</div><div class="">Pierre</div><div class=""><br class=""></div><div class="">(*) <a href="https://gitlab.com/petsc/petsc/-/merge_requests/3717" class="">https://gitlab.com/petsc/petsc/-/merge_requests/3717</a> </div></body></html>