Actual source code: ex9.c

petsc-3.12.4 2020-02-04
Report Typos and Errors

  2: static char help[] = "Tests repeated setups and solves of PCFIELDSPLIT.\n\n";
  3:  #include <petscksp.h>

  5: static PetscErrorCode replace_submats(Mat A)
  6: {
  8:   IS             *r,*c;
  9:   PetscInt       i,j,nr,nc;

 12:   MatNestGetSubMats(A,&nr,&nc,NULL);
 13:   PetscMalloc1(nr,&r);
 14:   PetscMalloc1(nc,&c);
 15:   MatNestGetISs(A,r,c);
 16:   for (i=0;i<nr;i++) {
 17:     for (j=0;j<nc;j++) {
 18:       Mat        sA,nA;
 19:       const char *prefix;

 21:       MatCreateSubMatrix(A,r[i],c[j],MAT_INITIAL_MATRIX,&sA);
 22:       MatDuplicate(sA,MAT_COPY_VALUES,&nA);
 23:       MatGetOptionsPrefix(sA,&prefix);
 24:       MatSetOptionsPrefix(nA,prefix);
 25:       MatNestSetSubMat(A,i,j,nA);
 26:       MatDestroy(&nA);
 27:       MatDestroy(&sA);
 28:     }
 29:   }
 30:   PetscFree(r);
 31:   PetscFree(c);
 32:   return(0);
 33: }

 35: int main(int argc, char *argv[])
 36: {
 37:    KSP            ksp;
 38:    PC             pc;
 39:    Mat            M,A,P,sA[2][2],sP[2][2];
 40:    Vec            x,b;
 41:    IS             f[2];
 42:    PetscInt       i,j,rstart,rend;

 45:    PetscInitialize(&argc,&argv,(char*)0,help);if (ierr) return ierr;
 46:    MatCreateAIJ(PETSC_COMM_WORLD,10,10,PETSC_DECIDE,PETSC_DECIDE,1,NULL,0,NULL,&M);
 47:    MatAssemblyBegin(M,MAT_FINAL_ASSEMBLY);
 48:    MatAssemblyEnd(M,MAT_FINAL_ASSEMBLY);
 49:    MatShift(M,1.);
 50:    MatGetOwnershipRange(M,&rstart,&rend);
 51:    ISCreateStride(PetscObjectComm((PetscObject)M),7,rstart,1,&f[0]);
 52:    ISComplement(f[0],rstart,rend,&f[1]);
 53:    for (i=0;i<2;i++) {
 54:      for (j=0;j<2;j++) {
 55:        MatCreateSubMatrix(M,f[i],f[j],MAT_INITIAL_MATRIX,&sA[i][j]);
 56:        MatCreateSubMatrix(M,f[i],f[j],MAT_INITIAL_MATRIX,&sP[i][j]);
 57:      }
 58:    }
 59:    MatCreateNest(PetscObjectComm((PetscObject)M),2,f,2,f,&sA[0][0],&A);
 60:    MatCreateNest(PetscObjectComm((PetscObject)M),2,f,2,f,&sP[0][0],&P);
 61:    MatDestroy(&M);

 63:    KSPCreate(PetscObjectComm((PetscObject)A),&ksp);
 64:    KSPSetOperators(ksp,A,P);
 65:    KSPGetPC(ksp,&pc);
 66:    PCSetType(pc,PCFIELDSPLIT);
 67:    KSPSetFromOptions(ksp);
 68:    MatCreateVecs(A,&x,&b);
 69:    VecSetRandom(b,NULL);
 70:    KSPSolve(ksp,b,x);
 71:    replace_submats(A);
 72:    replace_submats(P);
 73:    KSPSolve(ksp,b,x);

 75:    KSPDestroy(&ksp);
 76:    VecDestroy(&x);
 77:    VecDestroy(&b);
 78:    MatDestroy(&A);
 79:    MatDestroy(&P);
 80:    for (i=0;i<2;i++) {
 81:      ISDestroy(&f[i]);
 82:      for (j=0;j<2;j++) {
 83:        MatDestroy(&sA[i][j]);
 84:        MatDestroy(&sP[i][j]);
 85:      }
 86:    }
 87:    PetscFinalize();
 88:    return ierr;
 89: }

 91: /*TEST

 93:    test:
 94:      nsize: 1
 95:      filter: sed -e "s/CONVERGED_RTOL/CONVERGED_ATOL/g"
 96:      args: -pc_fieldsplit_diag_use_amat {{0 1}} -pc_fieldsplit_diag_use_amat {{0 1}} -pc_fieldsplit_type {{additive multiplicative}} -ksp_converged_reason -ksp_error_if_not_converged

 98:    test:
 99:      suffix: schur
100:      nsize: 1
101:      filter: sed -e "s/CONVERGED_RTOL/CONVERGED_ATOL/g"
102:      args: -pc_fieldsplit_diag_use_amat {{0 1}} -pc_fieldsplit_diag_use_amat {{0 1}} -pc_fieldsplit_type schur -pc_fieldsplit_schur_scale 1.0 -pc_fieldsplit_schur_fact_type {{diag lower upper full}} -ksp_converged_reason -ksp_error_if_not_converged

104: TEST*/