HYPRE_Int hypre_SysPFMGSetupRAPOp( hypre_SStructPMatrix *R, hypre_SStructPMatrix *A, hypre_SStructPMatrix *P, HYPRE_Int cdir, hypre_Index cindex, hypre_Index cstride, hypre_SStructPMatrix *Ac ) { HYPRE_Int nvars; HYPRE_Int vi,vj; hypre_StructMatrix *R_s; hypre_StructMatrix *A_s; hypre_StructMatrix *P_s; hypre_StructMatrix *Ac_s; HYPRE_Int P_stored_as_transpose = 0; nvars = hypre_SStructPMatrixNVars(A); /*-------------------------------------------------------------------------- * Symmetry within a block is exploited, but not symmetry of the form * A_{vi,vj} = A_{vj,vi}^T. *--------------------------------------------------------------------------*/ for (vi = 0; vi < nvars; vi++) { R_s = hypre_SStructPMatrixSMatrix(R, vi, vi); for (vj = 0; vj < nvars; vj++) { A_s = hypre_SStructPMatrixSMatrix(A, vi, vj); Ac_s = hypre_SStructPMatrixSMatrix(Ac, vi, vj); P_s = hypre_SStructPMatrixSMatrix(P, vj, vj); if (A_s != NULL) { hypre_SemiBuildRAP(A_s, P_s, R_s, cdir, cindex, cstride, P_stored_as_transpose, Ac_s); /* Assemble here? */ hypre_StructMatrixAssemble(Ac_s); } } } return hypre_error_flag; }
HYPRE_Int hypre_PFMGSetupRAPOp( hypre_StructMatrix *R, hypre_StructMatrix *A, hypre_StructMatrix *P, HYPRE_Int cdir, hypre_Index cindex, hypre_Index cstride, HYPRE_Int rap_type, hypre_StructMatrix *Ac ) { HYPRE_Int P_stored_as_transpose = 0; hypre_StructStencil *stencil; stencil = hypre_StructMatrixStencil(A); if (rap_type == 0) { switch (hypre_StructStencilNDim(stencil)) { case 2: /*-------------------------------------------------------------------- * Set lower triangular (+ diagonal) coefficients *--------------------------------------------------------------------*/ hypre_PFMG2BuildRAPSym(A, P, R, cdir, cindex, cstride, Ac); /*-------------------------------------------------------------------- * For non-symmetric A, set upper triangular coefficients as well *--------------------------------------------------------------------*/ if(!hypre_StructMatrixSymmetric(A)) hypre_PFMG2BuildRAPNoSym(A, P, R, cdir, cindex, cstride, Ac); break; case 3: /*-------------------------------------------------------------------- * Set lower triangular (+ diagonal) coefficients *--------------------------------------------------------------------*/ hypre_PFMG3BuildRAPSym(A, P, R, cdir, cindex, cstride, Ac); /*-------------------------------------------------------------------- * For non-symmetric A, set upper triangular coefficients as well *--------------------------------------------------------------------*/ if(!hypre_StructMatrixSymmetric(A)) hypre_PFMG3BuildRAPNoSym(A, P, R, cdir, cindex, cstride, Ac); break; } } else if (rap_type == 1) { switch (hypre_StructStencilNDim(stencil)) { case 2: hypre_PFMGBuildCoarseOp5(A, P, R, cdir, cindex, cstride, Ac); break; case 3: hypre_PFMGBuildCoarseOp7(A, P, R, cdir, cindex, cstride, Ac); break; } } else if (rap_type == 2) { hypre_SemiBuildRAP(A, P, R, cdir, cindex, cstride, P_stored_as_transpose, Ac); } hypre_StructMatrixAssemble(Ac); return hypre_error_flag; }
HYPRE_Int hypre_SMGSetupRAPOp( hypre_StructMatrix *R, hypre_StructMatrix *A, hypre_StructMatrix *PT, hypre_StructMatrix *Ac, hypre_Index cindex, hypre_Index cstride ) { HYPRE_Int ierr = 0; #if NEWRAP HYPRE_Int cdir; HYPRE_Int P_stored_as_transpose = 1; #endif hypre_StructStencil *stencil; stencil = hypre_StructMatrixStencil(A); #if OLDRAP switch (hypre_StructStencilDim(stencil)) { case 2: /*-------------------------------------------------------------------- * Set lower triangular (+ diagonal) coefficients *--------------------------------------------------------------------*/ ierr = hypre_SMG2BuildRAPSym(A, PT, R, Ac, cindex, cstride); /*-------------------------------------------------------------------- * For non-symmetric A, set upper triangular coefficients as well *--------------------------------------------------------------------*/ if(!hypre_StructMatrixSymmetric(A)) { ierr += hypre_SMG2BuildRAPNoSym(A, PT, R, Ac, cindex, cstride); /*----------------------------------------------------------------- * Collapse stencil for periodic probems on coarsest grid. *-----------------------------------------------------------------*/ ierr = hypre_SMG2RAPPeriodicNoSym(Ac, cindex, cstride); } else { /*----------------------------------------------------------------- * Collapse stencil for periodic problems on coarsest grid. *-----------------------------------------------------------------*/ ierr = hypre_SMG2RAPPeriodicSym(Ac, cindex, cstride); } break; case 3: /*-------------------------------------------------------------------- * Set lower triangular (+ diagonal) coefficients *--------------------------------------------------------------------*/ ierr = hypre_SMG3BuildRAPSym(A, PT, R, Ac, cindex, cstride); /*-------------------------------------------------------------------- * For non-symmetric A, set upper triangular coefficients as well *--------------------------------------------------------------------*/ if(!hypre_StructMatrixSymmetric(A)) { ierr += hypre_SMG3BuildRAPNoSym(A, PT, R, Ac, cindex, cstride); /*----------------------------------------------------------------- * Collapse stencil for periodic probems on coarsest grid. *-----------------------------------------------------------------*/ ierr = hypre_SMG3RAPPeriodicNoSym(Ac, cindex, cstride); } else { /*----------------------------------------------------------------- * Collapse stencil for periodic problems on coarsest grid. *-----------------------------------------------------------------*/ ierr = hypre_SMG3RAPPeriodicSym(Ac, cindex, cstride); } break; } #endif #if NEWRAP switch (hypre_StructStencilDim(stencil)) { case 2: cdir = 1; ierr = hypre_SemiBuildRAP(A, PT, R, cdir, cindex, cstride, P_stored_as_transpose, Ac); break; case 3: cdir = 2; ierr = hypre_SemiBuildRAP(A, PT, R, cdir, cindex, cstride, P_stored_as_transpose, Ac); break; } #endif hypre_StructMatrixAssemble(Ac); return ierr; }