Actual source code: ex77.c

petsc-3.13.6 2020-09-29
Report Typos and Errors
  1:  #include <petsc.h>

  3: static char help[] = "Solves a linear system with a block of right-hand sides using KSPHPDDM.\n\n";

  5: int main(int argc,char **args)
  6: {
  7:   Mat               X,B;         /* computed solutions and RHS */
  8:   Vec               cx,cb;       /* columns of X and B */
  9:   Mat               A,KA = NULL; /* linear system matrix */
 10:   KSP               ksp;         /* linear solver context */
 11:   const PetscScalar *b;
 12:   PetscScalar       *x,*S = NULL,*T = NULL;
 13:   PetscInt          m,n,M,N = 5,i,j;
 14:   const char        *deft = MATAIJ;
 15:   PetscViewer       viewer;
 16:   char              dir[PETSC_MAX_PATH_LEN],name[256],type[256];
 17:   PetscBool         flg;
 18:   PetscErrorCode    ierr;

 20:   PetscInitialize(&argc,&args,NULL,help);if (ierr) return ierr;
 21:   PetscStrcpy(dir,".");
 22:   PetscOptionsGetString(NULL,NULL,"-load_dir",dir,sizeof(dir),NULL);
 23:   PetscOptionsGetInt(NULL,NULL,"-N",&N,NULL);
 24:   MatCreate(PETSC_COMM_WORLD,&A);
 25:   KSPCreate(PETSC_COMM_WORLD,&ksp);
 26:   KSPSetOperators(ksp,A,A);
 27:   PetscSNPrintf(name,sizeof(name),"%s/A_400.dat",dir);
 28:   PetscViewerBinaryOpen(PETSC_COMM_WORLD,name,FILE_MODE_READ,&viewer);
 29:   MatLoad(A,viewer);
 30:   PetscViewerDestroy(&viewer);
 31:   PetscOptionsBegin(PETSC_COMM_WORLD,"","","");
 32:   PetscOptionsFList("-mat_type","Matrix type","MatSetType",MatList,deft,type,256,&flg);
 33:   PetscOptionsEnd();
 34:   if (flg) {
 35:     PetscStrcmp(type,MATKAIJ,&flg);
 36:     if (!flg) {
 37:       MatSetOption(A,MAT_SYMMETRIC,PETSC_TRUE);
 38:       MatConvert(A,type,MAT_INPLACE_MATRIX,&A);
 39:     }
 40:     else {
 41:       PetscCalloc2(N*N,&S,N*N,&T);
 42:       for (i=0; i<N; i++) {
 43:         for (j=0; j<N; j++) {
 44:           S[i*(N+1)] = 1e+6; /* really easy problem used for testing */
 45:           T[i*(N+1)] = 1e-2;
 46:         }
 47:       }
 48:       MatCreateKAIJ(A,N,N,S,T,&KA);
 49:     }
 50:   }
 51:   MatGetLocalSize(A,&m,NULL);
 52:   MatCreateDense(PETSC_COMM_WORLD,m,PETSC_DECIDE,PETSC_DECIDE,N,NULL,&B);
 53:   MatCreateDense(PETSC_COMM_WORLD,m,PETSC_DECIDE,PETSC_DECIDE,N,NULL,&X);
 54:   MatSetRandom(B,NULL);
 55:   KSPSetFromOptions(ksp);
 56:   if (!flg) {
 57:     KSPSetUp(ksp);
 58:     PetscObjectTypeCompare((PetscObject)ksp,KSPHPDDM,&flg);
 59: #if defined(PETSC_HAVE_HPDDM)
 60:     if (flg) {
 61:       KSPHPDDMMatSolve(ksp,B,X);
 62:     } else
 63: #endif
 64:     {
 65:       MatGetSize(A,&M,NULL);
 66:       for (n=0; n<N; n++) {
 67:         MatDenseGetColumn(B,n,(PetscScalar**)&b);
 68:         MatDenseGetColumn(X,n,&x);
 69:         VecCreateMPIWithArray(PETSC_COMM_WORLD,1,m,M,b,&cb);
 70:         VecCreateMPIWithArray(PETSC_COMM_WORLD,1,m,M,x,&cx);
 71:         KSPSolve(ksp,cb,cx);
 72:         VecDestroy(&cx);
 73:         VecDestroy(&cb);
 74:         MatDenseRestoreColumn(X,&x);
 75:         MatDenseRestoreColumn(B,(PetscScalar**)&b);
 76:       }
 77:     }
 78:   } else {
 79:     KSPSetOperators(ksp,KA,KA);
 80:     MatGetSize(KA,&M,NULL);
 81:     /* from column- to row-major to be consistent with MatKAIJ format */
 82:     MatTranspose(B,MAT_INPLACE_MATRIX,&B);
 83:     MatDenseGetArrayRead(B,&b);
 84:     MatDenseGetArray(X,&x);
 85:     VecCreateMPIWithArray(PETSC_COMM_WORLD,1,m*N,M,b,&cb);
 86:     VecCreateMPIWithArray(PETSC_COMM_WORLD,1,m*N,M,x,&cx);
 87:     KSPSolve(ksp,cb,cx);
 88:     VecDestroy(&cx);
 89:     VecDestroy(&cb);
 90:     MatDenseRestoreArray(X,&x);
 91:     MatDenseRestoreArrayRead(B,&b);
 92:   }
 93:   MatDestroy(&X);
 94:   MatDestroy(&B);
 95:   PetscFree2(S,T);
 96:   MatDestroy(&KA);
 97:   MatDestroy(&A);
 98:   KSPDestroy(&ksp);
 99:   PetscFinalize();
100:   return ierr;
101: }

103: /*TEST

105:    testset:
106:       nsize: 2
107:       requires: hpddm datafilespath double !complex !define(PETSC_USE_64BIT_INDICES)
108:       args: -ksp_converged_reason -ksp_max_it 500 -load_dir ${DATAFILESPATH}/matrices/hpddm/GCRODR -mat_type {{aij sbaij}shared output}
109:       test:
110:          suffix: 1
111:          args:
112:       test:
113:          suffix: 2
114:          args: -ksp_type hpddm -pc_type asm -ksp_hpddm_type {{gmres bgmres}separate_output}
115:       test:
116:          suffix: 3
117:          args: -ksp_type hpddm -ksp_hpddm_recycle 10 -ksp_hpddm_type {{gcrodr bgcrodr}separate_output}

119:    test:
120:       nsize: 2
121:       requires: hpddm datafilespath double !complex !define(PETSC_USE_64BIT_INDICES)
122:       args: -N 12 -ksp_converged_reason -ksp_max_it 500 -load_dir ${DATAFILESPATH}/matrices/hpddm/GCRODR -mat_type kaij -pc_type pbjacobi -ksp_type hpddm -ksp_hpddm_type {{gmres bgmres}separate_output}

124: TEST*/