int main(int argc,char **args) { const PetscInt inds[] = {0,1}; PetscScalar avals[] = {2,3,5,7}; Mat S; User user; PetscErrorCode ierr; Vec base; ierr = PetscInitialize(&argc,&args,(char*)0,help);if (ierr) return ierr; ierr = PetscNew(&user);CHKERRQ(ierr); ierr = MatCreateSeqAIJ(PETSC_COMM_WORLD,2,2,2,NULL,&user->B);CHKERRQ(ierr); ierr = MatSetUp(user->B);CHKERRQ(ierr); ierr = MatSetValues(user->B,2,inds,2,inds,avals,INSERT_VALUES);CHKERRQ(ierr); ierr = MatAssemblyBegin(user->B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); ierr = MatAssemblyEnd(user->B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); ierr = MatCreateVecs(user->B,&base,NULL);CHKERRQ(ierr); ierr = MatCreateShell(PETSC_COMM_WORLD,2,2,2,2,user,&S);CHKERRQ(ierr); ierr = MatSetUp(S);CHKERRQ(ierr); ierr = MatShellSetOperation(S,MATOP_MULT,(void (*)(void))MatMult_User);CHKERRQ(ierr); ierr = MatShellSetOperation(S,MATOP_MULT_TRANSPOSE,(void (*)(void))MatMultTranspose_User);CHKERRQ(ierr); ierr = MatShellTestMult(S,MyFunction,base,user,NULL);CHKERRQ(ierr); ierr = MatShellTestMultTranspose(S,MyFunction,base,user,NULL);CHKERRQ(ierr); ierr = VecDestroy(&base);CHKERRQ(ierr); ierr = MatDestroy(&user->B);CHKERRQ(ierr); ierr = MatDestroy(&S);CHKERRQ(ierr); ierr = PetscFree(user);CHKERRQ(ierr); ierr = PetscFinalize(); return ierr; }
int main(int argc,char **args) { const PetscScalar xvals[] = {11,13},yvals[] = {17,19}; const PetscInt inds[] = {0,1}; PetscScalar avals[] = {2,3,5,7}; Mat S1,S2; Vec X,Y; User user; PetscErrorCode ierr; ierr = PetscInitialize(&argc,&args,(char*)0,help);if (ierr) return ierr; ierr = PetscNew(&user);CHKERRQ(ierr); ierr = MatCreateSeqAIJ(PETSC_COMM_WORLD,2,2,2,NULL,&user->A);CHKERRQ(ierr); ierr = MatSetUp(user->A);CHKERRQ(ierr); ierr = MatSetValues(user->A,2,inds,2,inds,avals,INSERT_VALUES);CHKERRQ(ierr); ierr = MatAssemblyBegin(user->A,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); ierr = MatAssemblyEnd(user->A,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); ierr = VecCreateSeq(PETSC_COMM_WORLD,2,&X);CHKERRQ(ierr); ierr = VecSetValues(X,2,inds,xvals,INSERT_VALUES);CHKERRQ(ierr); ierr = VecAssemblyBegin(X);CHKERRQ(ierr); ierr = VecAssemblyEnd(X);CHKERRQ(ierr); ierr = VecDuplicate(X,&Y);CHKERRQ(ierr); ierr = VecSetValues(Y,2,inds,yvals,INSERT_VALUES);CHKERRQ(ierr); ierr = VecAssemblyBegin(Y);CHKERRQ(ierr); ierr = VecAssemblyEnd(Y);CHKERRQ(ierr); ierr = MatCreateShell(PETSC_COMM_WORLD,2,2,2,2,user,&S1);CHKERRQ(ierr); ierr = MatSetUp(S1);CHKERRQ(ierr); ierr = MatShellSetOperation(S1,MATOP_MULT,(void (*)(void))MatMult_User);CHKERRQ(ierr); ierr = MatShellSetOperation(S1,MATOP_COPY,(void (*)(void))MatCopy_User);CHKERRQ(ierr); ierr = MatShellSetOperation(S1,MATOP_DESTROY,(void (*)(void))MatDestroy_User);CHKERRQ(ierr); ierr = MatCreateShell(PETSC_COMM_WORLD,2,2,2,2,NULL,&S2);CHKERRQ(ierr); ierr = MatSetUp(S2);CHKERRQ(ierr); ierr = MatShellSetOperation(S2,MATOP_MULT,(void (*)(void))MatMult_User);CHKERRQ(ierr); ierr = MatShellSetOperation(S2,MATOP_COPY,(void (*)(void))MatCopy_User);CHKERRQ(ierr); ierr = MatShellSetOperation(S2,MATOP_DESTROY,(void (*)(void))MatDestroy_User);CHKERRQ(ierr); ierr = MatScale(S1,31);CHKERRQ(ierr); ierr = MatShift(S1,37);CHKERRQ(ierr); ierr = MatDiagonalScale(S1,X,Y);CHKERRQ(ierr); ierr = MatCopy(S1,S2,SAME_NONZERO_PATTERN);CHKERRQ(ierr); ierr = MatMult(S1,X,Y);CHKERRQ(ierr); ierr = VecView(Y,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr); ierr = MatMult(S2,X,Y);CHKERRQ(ierr); ierr = VecView(Y,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr); ierr = MatDestroy(&S1);CHKERRQ(ierr); ierr = MatDestroy(&S2);CHKERRQ(ierr); ierr = VecDestroy(&X);CHKERRQ(ierr); ierr = VecDestroy(&Y);CHKERRQ(ierr); ierr = PetscFinalize(); return ierr; }
int main(int argc,char **args) { Mat A1,A2,A3,A4,nest; Mat mata[4]; Mat aij; MPI_Comm comm; PetscInt m,n,istart,iend,ii,i,J,j; PetscScalar v; PetscMPIInt size; PetscErrorCode ierr; ierr = PetscInitialize(&argc,&args,(char*)0,help);if (ierr) return ierr; comm = PETSC_COMM_WORLD; ierr = MPI_Comm_size(comm,&size);CHKERRQ(ierr); /* Assemble the matrix for the five point stencil, YET AGAIN */ ierr = MatCreate(comm,&A1);CHKERRQ(ierr); m=2,n=2; ierr = MatSetSizes(A1,PETSC_DECIDE,PETSC_DECIDE,m*n,m*n);CHKERRQ(ierr); ierr = MatSetFromOptions(A1);CHKERRQ(ierr); ierr = MatSetUp(A1);CHKERRQ(ierr); ierr = MatGetOwnershipRange(A1,&istart,&iend);CHKERRQ(ierr); for (ii=istart; ii<iend; ii++) { v = -1.0; i = ii/n; j = ii - i*n; if (i>0) {J = ii - n; ierr = MatSetValues(A1,1,&ii,1,&J,&v,INSERT_VALUES);CHKERRQ(ierr);} if (i<m-1) {J = ii + n; ierr = MatSetValues(A1,1,&ii,1,&J,&v,INSERT_VALUES);CHKERRQ(ierr);} if (j>0) {J = ii - 1; ierr = MatSetValues(A1,1,&ii,1,&J,&v,INSERT_VALUES);CHKERRQ(ierr);} if (j<n-1) {J = ii + 1; ierr = MatSetValues(A1,1,&ii,1,&J,&v,INSERT_VALUES);CHKERRQ(ierr);} v = 4.0; ierr = MatSetValues(A1,1,&ii,1,&ii,&v,INSERT_VALUES);CHKERRQ(ierr); } ierr = MatAssemblyBegin(A1,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); ierr = MatAssemblyEnd(A1,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); ierr = MatView(A1,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr); ierr = MatDuplicate(A1,MAT_COPY_VALUES,&A2);CHKERRQ(ierr); ierr = MatDuplicate(A1,MAT_COPY_VALUES,&A3);CHKERRQ(ierr); ierr = MatDuplicate(A1,MAT_COPY_VALUES,&A4);CHKERRQ(ierr); /*create a nest matrix */ ierr = MatCreate(comm,&nest);CHKERRQ(ierr); ierr = MatSetType(nest,MATNEST);CHKERRQ(ierr); mata[0]=A1,mata[1]=A2,mata[2]=A3,mata[3]=A4; ierr = MatNestSetSubMats(nest,2,NULL,2,NULL,mata);CHKERRQ(ierr); ierr = MatSetUp(nest);CHKERRQ(ierr); ierr = MatConvert(nest,MATAIJ,MAT_INITIAL_MATRIX,&aij);CHKERRQ(ierr); ierr = MatView(aij,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr); ierr = MatDestroy(&nest);CHKERRQ(ierr); ierr = MatDestroy(&aij);CHKERRQ(ierr); ierr = MatDestroy(&A1);CHKERRQ(ierr); ierr = MatDestroy(&A2);CHKERRQ(ierr); ierr = MatDestroy(&A3);CHKERRQ(ierr); ierr = MatDestroy(&A4);CHKERRQ(ierr); ierr = PetscFinalize(); return ierr; }
int main(int argc,char **args) { PetscErrorCode ierr; Mat A,B,C; PetscBool different=PETSC_FALSE,skip=PETSC_FALSE; PetscInt m0,m1,n=128,i; PetscInitialize(&argc,&args,(char*)0,help); ierr = PetscOptionsGetBool(NULL,"-different",&different,NULL);CHKERRQ(ierr); ierr = PetscOptionsGetBool(NULL,"-skip",&skip,NULL);CHKERRQ(ierr); /* Create matrices A = tridiag(1,-2,1) and B = diag(7); */ ierr = MatCreate(PETSC_COMM_WORLD,&A);CHKERRQ(ierr); ierr = MatCreate(PETSC_COMM_WORLD,&B);CHKERRQ(ierr); ierr = MatSetSizes(A,PETSC_DECIDE,PETSC_DECIDE,n,n);CHKERRQ(ierr); ierr = MatSetSizes(B,PETSC_DECIDE,PETSC_DECIDE,n,n);CHKERRQ(ierr); ierr = MatSetFromOptions(A);CHKERRQ(ierr); ierr = MatSetFromOptions(B);CHKERRQ(ierr); ierr = MatSetUp(A);CHKERRQ(ierr); ierr = MatSetUp(B);CHKERRQ(ierr); ierr = MatGetOwnershipRange(A,&m0,&m1);CHKERRQ(ierr); for (i=m0;i<m1;i++) { if (i>0) { ierr = MatSetValue(A,i,i-1,-1.0,INSERT_VALUES);CHKERRQ(ierr); } if (i<n-1) { ierr = MatSetValue(A,i,i+1,-1.0,INSERT_VALUES);CHKERRQ(ierr); } ierr = MatSetValue(A,i,i,2.0,INSERT_VALUES);CHKERRQ(ierr); ierr = MatSetValue(B,i,i,7.0,INSERT_VALUES);CHKERRQ(ierr); } ierr = MatAssemblyBegin(A,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); ierr = MatAssemblyEnd(A,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); ierr = MatAssemblyBegin(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); ierr = MatAssemblyEnd(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); ierr = MatDuplicate(A,MAT_COPY_VALUES,&C);CHKERRQ(ierr); /* Add B */ ierr = MatAXPY(C,1.0,B,(different)?DIFFERENT_NONZERO_PATTERN:SUBSET_NONZERO_PATTERN);CHKERRQ(ierr); /* Add A */ if (!skip) { ierr = MatAXPY(C,1.0,A,SUBSET_NONZERO_PATTERN);CHKERRQ(ierr); } /* Free memory */ ierr = MatDestroy(&A);CHKERRQ(ierr); ierr = MatDestroy(&B);CHKERRQ(ierr); ierr = MatDestroy(&C);CHKERRQ(ierr); ierr = PetscFinalize(); return 0; }
PETSC_EXTERN PetscErrorCode MatGetFactor_seqaij_essl(Mat A,MatFactorType ftype,Mat *F) { Mat B; PetscErrorCode ierr; Mat_Essl *essl; PetscFunctionBegin; if (A->cmap->N != A->rmap->N) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"matrix must be square"); ierr = MatCreate(PetscObjectComm((PetscObject)A),&B);CHKERRQ(ierr); ierr = MatSetSizes(B,PETSC_DECIDE,PETSC_DECIDE,A->rmap->n,A->cmap->n);CHKERRQ(ierr); ierr = PetscStrallocpy("essl",&((PetscObject)B)->type_name);CHKERRQ(ierr); ierr = MatSetUp(B);CHKERRQ(ierr); ierr = PetscNewLog(B,&essl);CHKERRQ(ierr); B->data = essl; B->ops->lufactorsymbolic = MatLUFactorSymbolic_Essl; B->ops->destroy = MatDestroy_Essl; B->ops->getinfo = MatGetInfo_External; ierr = PetscObjectComposeFunction((PetscObject)B,"MatFactorGetSolverType_C",MatFactorGetSolverType_essl);CHKERRQ(ierr); B->factortype = MAT_FACTOR_LU; ierr = PetscFree(B->solvertype);CHKERRQ(ierr); ierr = PetscStrallocpy(MATSOLVERESSL,&B->solvertype);CHKERRQ(ierr); *F = B; PetscFunctionReturn(0); }
int SparseGp_KGradient (SparseGp *gp, HyperParam hp, int lengthInd) { PetscErrorCode ierr; (void) ierr; int N = gp->trainObs->size2; /* create sparse K matrix */ ierr = MatCreate (PETSC_COMM_WORLD, &(gp->_KGradient)); CHKERRQ(ierr); ierr = MatSetSizes (gp->_KGradient, gp->nlocal, gp->nlocal, N, N); CHKERRQ(ierr); ierr = MatSetFromOptions(gp->_KGradient); CHKERRQ(ierr); ierr = MatSetUp (gp->_KGradient); CHKERRQ(ierr); /* assemble matrix */ switch (hp) { case GP_HYPERPARAM_SIGMA0: { petsc_util_fillSigma0GradMatFromKernel (gp->kern, gp->trainObs, &(gp->_KGradient), 0, N, gp->rstart, gp->rend); break; } case GP_HYPERPARAM_LENGTH_I: { petsc_util_fillLenghtGradMatFromKernel (gp->kern, gp->trainObs, &(gp->_KGradient), 0, N, gp->rstart, gp->rend, lengthInd); break; } default: printf ("Unknown hyperparameter type\n"); exit (EXIT_FAILURE); } ierr = MatAssemblyBegin(gp->_KGradient, MAT_FINAL_ASSEMBLY); CHKERRQ (ierr); ierr = MatAssemblyEnd(gp->_KGradient, MAT_FINAL_ASSEMBLY); CHKERRQ (ierr); return EXIT_SUCCESS; }
PETSC_EXTERN PetscErrorCode MatGetFactor_seqaij_matlab(Mat A,MatFactorType ftype,Mat *F) { PetscErrorCode ierr; PetscFunctionBegin; if (A->cmap->N != A->rmap->N) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"matrix must be square"); ierr = MatCreate(PetscObjectComm((PetscObject)A),F); CHKERRQ(ierr); ierr = MatSetSizes(*F,A->rmap->n,A->cmap->n,A->rmap->n,A->cmap->n); CHKERRQ(ierr); ierr = PetscStrallocpy("matlab",&((PetscObject)*F)->type_name); CHKERRQ(ierr); ierr = MatSetUp(*F); CHKERRQ(ierr); (*F)->ops->destroy = MatDestroy_matlab; (*F)->ops->getinfo = MatGetInfo_External; (*F)->ops->lufactorsymbolic = MatLUFactorSymbolic_Matlab; (*F)->ops->ilufactorsymbolic = MatLUFactorSymbolic_Matlab; ierr = PetscObjectComposeFunction((PetscObject)(*F),"MatFactorGetSolverPackage_C",MatFactorGetSolverPackage_seqaij_matlab); CHKERRQ(ierr); (*F)->factortype = ftype; ierr = PetscFree((*F)->solvertype); CHKERRQ(ierr); ierr = PetscStrallocpy(MATSOLVERMATLAB,&(*F)->solvertype); CHKERRQ(ierr); PetscFunctionReturn(0); }
static PetscErrorCode PCSetUp_Eisenstat(PC pc) { PetscErrorCode ierr; PetscInt M,N,m,n; PC_Eisenstat *eis = (PC_Eisenstat*)pc->data; PetscFunctionBegin; if (!pc->setupcalled) { ierr = MatGetSize(pc->mat,&M,&N);CHKERRQ(ierr); ierr = MatGetLocalSize(pc->mat,&m,&n);CHKERRQ(ierr); ierr = MatCreate(((PetscObject)pc)->comm,&eis->shell);CHKERRQ(ierr); ierr = MatSetSizes(eis->shell,m,n,M,N);CHKERRQ(ierr); ierr = MatSetType(eis->shell,MATSHELL);CHKERRQ(ierr); ierr = MatSetUp(eis->shell);CHKERRQ(ierr); ierr = MatShellSetContext(eis->shell,(void*)pc);CHKERRQ(ierr); ierr = PetscLogObjectParent(pc,eis->shell);CHKERRQ(ierr); ierr = MatShellSetOperation(eis->shell,MATOP_MULT,(void(*)(void))PCMult_Eisenstat);CHKERRQ(ierr); } if (!eis->usediag) PetscFunctionReturn(0); if (!pc->setupcalled) { ierr = MatGetVecs(pc->pmat,&eis->diag,0);CHKERRQ(ierr); ierr = PetscLogObjectParent(pc,eis->diag);CHKERRQ(ierr); } ierr = MatGetDiagonal(pc->pmat,eis->diag);CHKERRQ(ierr); PetscFunctionReturn(0); }
PetscErrorCode ComputeRHSMatrix(PetscInt m,PetscInt nrhs,Mat* C) { PetscErrorCode ierr; PetscRandom rand; Mat RHS; PetscScalar *array,rval; PetscInt i,k; PetscFunctionBegin; ierr = MatCreate(PETSC_COMM_WORLD,&RHS);CHKERRQ(ierr); ierr = MatSetSizes(RHS,m,PETSC_DECIDE,PETSC_DECIDE,nrhs);CHKERRQ(ierr); ierr = MatSetType(RHS,MATSEQDENSE);CHKERRQ(ierr); ierr = MatSetUp(RHS);CHKERRQ(ierr); ierr = PetscRandomCreate(PETSC_COMM_WORLD,&rand);CHKERRQ(ierr); ierr = PetscRandomSetFromOptions(rand);CHKERRQ(ierr); ierr = MatDenseGetArray(RHS,&array);CHKERRQ(ierr); for (i=0; i<m; i++){ ierr = PetscRandomGetValue(rand,&rval);CHKERRQ(ierr); array[i] = rval; } if (nrhs > 1){ for (k=1; k<nrhs; k++){ for (i=0; i<m; i++){ array[m*k+i] = array[i]; } } } ierr = MatDenseRestoreArray(RHS,&array);CHKERRQ(ierr); ierr = MatAssemblyBegin(RHS,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); ierr = MatAssemblyEnd(RHS,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); *C = RHS; ierr = PetscRandomDestroy(&rand);CHKERRQ(ierr); PetscFunctionReturn(0); }
int main(int argc, char **argv) { Mat A; KSP ksp; DM shell; Vec *left, *right; MPI_Comm c; PetscErrorCode ierr; ierr = PetscInitialize(&argc, &argv, NULL, NULL);if (ierr) return ierr; c = PETSC_COMM_WORLD; ierr = MatCreate(c, &A); CHKERRQ(ierr); ierr = MatSetSizes(A, 1, 1, PETSC_DECIDE, PETSC_DECIDE); CHKERRQ(ierr); ierr = MatSetFromOptions(A); CHKERRQ(ierr); ierr = MatSetUp(A); CHKERRQ(ierr); ierr = KSPCreate(c, &ksp); CHKERRQ(ierr); ierr = KSPSetOperators(ksp, A, A); CHKERRQ(ierr); ierr = KSPSetFromOptions(ksp); CHKERRQ(ierr); ierr = DMShellCreate(c, &shell); CHKERRQ(ierr); ierr = DMSetFromOptions(shell); CHKERRQ(ierr); ierr = DMSetUp(shell); CHKERRQ(ierr); ierr = KSPSetDM(ksp, shell); CHKERRQ(ierr); ierr = KSPCreateVecs(ksp, 1, &right, 1, &left); CHKERRQ(ierr); ierr = VecView(right[0], PETSC_VIEWER_STDOUT_(c));CHKERRQ(ierr); ierr = VecDestroyVecs(1,&right); CHKERRQ(ierr); ierr = VecDestroyVecs(1,&left); CHKERRQ(ierr); ierr = DMDestroy(&shell); CHKERRQ(ierr); ierr = KSPDestroy(&ksp); CHKERRQ(ierr); ierr = MatDestroy(&A); CHKERRQ(ierr); PetscFinalize(); return 0; }
static PetscErrorCode KSPSetUp_TSIRM(KSP ksp) { PetscErrorCode ierr; KSP_TSIRM *tsirm = (KSP_TSIRM*)ksp->data; PetscFunctionBegin; /* Initialization */ tsirm->tol_ls = 1e-40; tsirm->size_ls = 12; tsirm->maxiter_ls = 15; tsirm->cgls = 0; /* Matrix of the system */ ierr = KSPGetOperators(ksp,&tsirm->A,NULL); CHKERRQ(ierr); /* Matrix of the system */ ierr = MatGetSize(tsirm->A,&tsirm->size,NULL); CHKERRQ(ierr); /* Size of the system */ ierr = MatGetOwnershipRange(tsirm->A,&tsirm->Istart,&tsirm->Iend); CHKERRQ(ierr); /* Matrix S of residuals */ ierr = MatCreate(PETSC_COMM_WORLD,&tsirm->S); CHKERRQ(ierr); ierr = MatSetSizes(tsirm->S,tsirm->Iend-tsirm->Istart,PETSC_DECIDE,tsirm->size,tsirm->size_ls); CHKERRQ(ierr); ierr = MatSetType(tsirm->S,MATDENSE); CHKERRQ(ierr); ierr = MatSetUp(tsirm->S); CHKERRQ(ierr); /* Residual and vector Alpha computed in the minimization step */ ierr = MatCreateVecs(tsirm->S,&tsirm->Alpha,&tsirm->r); CHKERRQ(ierr); PetscFunctionReturn(0); }
/*@ MatCreateTranspose - Creates a new matrix object that behaves like A' Collective on Mat Input Parameter: . A - the (possibly rectangular) matrix Output Parameter: . N - the matrix that represents A' Level: intermediate Notes: The transpose A' is NOT actually formed! Rather the new matrix object performs the matrix-vector product by using the MatMultTranspose() on the original matrix .seealso: MatCreateNormal(), MatMult(), MatMultTranspose(), MatCreate() @*/ PetscErrorCode MatCreateTranspose(Mat A,Mat *N) { PetscErrorCode ierr; PetscInt m,n; Mat_Transpose *Na; PetscFunctionBegin; ierr = MatGetLocalSize(A,&m,&n);CHKERRQ(ierr); ierr = MatCreate(PetscObjectComm((PetscObject)A),N);CHKERRQ(ierr); ierr = MatSetSizes(*N,n,m,PETSC_DECIDE,PETSC_DECIDE);CHKERRQ(ierr); ierr = PetscLayoutSetUp((*N)->rmap);CHKERRQ(ierr); ierr = PetscLayoutSetUp((*N)->cmap);CHKERRQ(ierr); ierr = PetscObjectChangeTypeName((PetscObject)*N,MATTRANSPOSEMAT);CHKERRQ(ierr); ierr = PetscNewLog(*N,&Na);CHKERRQ(ierr); (*N)->data = (void*) Na; ierr = PetscObjectReference((PetscObject)A);CHKERRQ(ierr); Na->A = A; (*N)->ops->destroy = MatDestroy_Transpose; (*N)->ops->mult = MatMult_Transpose; (*N)->ops->multadd = MatMultAdd_Transpose; (*N)->ops->multtranspose = MatMultTranspose_Transpose; (*N)->ops->multtransposeadd = MatMultTransposeAdd_Transpose; (*N)->ops->duplicate = MatDuplicate_Transpose; (*N)->ops->getvecs = MatCreateVecs_Transpose; (*N)->ops->axpy = MatAXPY_Transpose; (*N)->assembled = PETSC_TRUE; ierr = PetscObjectComposeFunction((PetscObject)(*N),"MatTransposeGetMat_C",MatTransposeGetMat_Transpose);CHKERRQ(ierr); ierr = MatSetBlockSizes(*N,PetscAbs(A->cmap->bs),PetscAbs(A->rmap->bs));CHKERRQ(ierr); ierr = MatSetUp(*N);CHKERRQ(ierr); PetscFunctionReturn(0); }
int main(int argc,char **argv) { PetscErrorCode ierr; PetscInt time_steps = 100,steps; PetscMPIInt size; Vec global; PetscReal dt,ftime; TS ts; MatStructure A_structure; Mat A = 0; ierr = PetscInitialize(&argc,&argv,(char*)0,help);CHKERRQ(ierr); ierr = MPI_Comm_size(PETSC_COMM_WORLD,&size);CHKERRQ(ierr); ierr = PetscOptionsGetInt(NULL,"-time",&time_steps,NULL);CHKERRQ(ierr); /* set initial conditions */ ierr = VecCreate(PETSC_COMM_WORLD,&global);CHKERRQ(ierr); ierr = VecSetSizes(global,PETSC_DECIDE,3);CHKERRQ(ierr); ierr = VecSetFromOptions(global);CHKERRQ(ierr); ierr = Initial(global,NULL);CHKERRQ(ierr); /* make timestep context */ ierr = TSCreate(PETSC_COMM_WORLD,&ts);CHKERRQ(ierr); ierr = TSSetProblemType(ts,TS_NONLINEAR);CHKERRQ(ierr); ierr = TSMonitorSet(ts,Monitor,NULL,NULL);CHKERRQ(ierr); dt = 0.1; /* The user provides the RHS and Jacobian */ ierr = TSSetRHSFunction(ts,NULL,RHSFunction,NULL);CHKERRQ(ierr); ierr = MatCreate(PETSC_COMM_WORLD,&A);CHKERRQ(ierr); ierr = MatSetSizes(A,PETSC_DECIDE,PETSC_DECIDE,3,3);CHKERRQ(ierr); ierr = MatSetFromOptions(A);CHKERRQ(ierr); ierr = MatSetUp(A);CHKERRQ(ierr); ierr = RHSJacobian(ts,0.0,global,&A,&A,&A_structure,NULL);CHKERRQ(ierr); ierr = TSSetRHSJacobian(ts,A,A,RHSJacobian,NULL);CHKERRQ(ierr); ierr = TSSetFromOptions(ts);CHKERRQ(ierr); ierr = TSSetInitialTimeStep(ts,0.0,dt);CHKERRQ(ierr); ierr = TSSetDuration(ts,time_steps,1);CHKERRQ(ierr); ierr = TSSetSolution(ts,global);CHKERRQ(ierr); ierr = TSSolve(ts,global);CHKERRQ(ierr); ierr = TSGetSolveTime(ts,&ftime);CHKERRQ(ierr); ierr = TSGetTimeStepNumber(ts,&steps);CHKERRQ(ierr); /* free the memories */ ierr = TSDestroy(&ts);CHKERRQ(ierr); ierr = VecDestroy(&global);CHKERRQ(ierr); ierr = MatDestroy(&A);CHKERRQ(ierr); ierr = PetscFinalize(); return 0; }
int main(int argc, char **argv) { Mat mat; MatNullSpace nsp; PetscBool prefix = PETSC_FALSE, flg; PetscErrorCode ierr; PetscInt zero = 0; PetscScalar value = 0; ierr = PetscInitialize(&argc, &argv, NULL, help); if (ierr) return ierr; ierr = PetscOptionsGetBool(NULL, NULL, "-with_prefix",&prefix,NULL);CHKERRQ(ierr); ierr = MatCreateDense(PETSC_COMM_WORLD, 1, 1, 1, 1, NULL, &mat);CHKERRQ(ierr); ierr = MatSetOptionsPrefix(mat, prefix ? "prefix_" : NULL);CHKERRQ(ierr); ierr = MatSetUp(mat);CHKERRQ(ierr); ierr = MatSetValues(mat, 1, &zero, 1, &zero, &value, INSERT_VALUES);CHKERRQ(ierr); ierr = MatAssemblyBegin(mat, MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); ierr = MatAssemblyEnd(mat, MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); ierr = MatNullSpaceCreate(PETSC_COMM_WORLD, PETSC_TRUE, 0, NULL, &nsp);CHKERRQ(ierr); ierr = MatNullSpaceTest(nsp, mat, &flg);CHKERRQ(ierr); if (!flg) SETERRQ(PETSC_COMM_WORLD,PETSC_ERR_PLIB,"Null space test failed!"); ierr = MatNullSpaceDestroy(&nsp);CHKERRQ(ierr); ierr = MatDestroy(&mat);CHKERRQ(ierr); ierr = PetscFinalize(); return ierr; }
static PetscErrorCode DMCreateMatrix_Shell(DM dm,Mat *J) { PetscErrorCode ierr; DM_Shell *shell = (DM_Shell*)dm->data; Mat A; PetscFunctionBegin; PetscValidHeaderSpecific(dm,DM_CLASSID,1); PetscValidPointer(J,3); if (!shell->A) { if (shell->Xglobal) { PetscInt m,M; ierr = PetscInfo(dm,"Naively creating matrix using global vector distribution without preallocation\n"); CHKERRQ(ierr); ierr = VecGetSize(shell->Xglobal,&M); CHKERRQ(ierr); ierr = VecGetLocalSize(shell->Xglobal,&m); CHKERRQ(ierr); ierr = MatCreate(PetscObjectComm((PetscObject)dm),&shell->A); CHKERRQ(ierr); ierr = MatSetSizes(shell->A,m,m,M,M); CHKERRQ(ierr); ierr = MatSetType(shell->A,dm->mattype); CHKERRQ(ierr); ierr = MatSetUp(shell->A); CHKERRQ(ierr); } else SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_USER,"Must call DMShellSetMatrix(), DMShellSetCreateMatrix(), or provide a vector"); } A = shell->A; /* the check below is tacky and incomplete */ if (dm->mattype) { PetscBool flg,aij,seqaij,mpiaij; ierr = PetscObjectTypeCompare((PetscObject)A,dm->mattype,&flg); CHKERRQ(ierr); ierr = PetscObjectTypeCompare((PetscObject)A,MATSEQAIJ,&seqaij); CHKERRQ(ierr); ierr = PetscObjectTypeCompare((PetscObject)A,MATMPIAIJ,&mpiaij); CHKERRQ(ierr); ierr = PetscStrcmp(dm->mattype,MATAIJ,&aij); CHKERRQ(ierr); if (!flg) { if (!(aij && (seqaij || mpiaij))) SETERRQ2(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_NOTSAMETYPE,"Requested matrix of type %s, but only %s available",dm->mattype,((PetscObject)A)->type_name); } } if (((PetscObject)A)->refct < 2) { /* We have an exclusive reference so we can give it out */ ierr = PetscObjectReference((PetscObject)A); CHKERRQ(ierr); ierr = MatZeroEntries(A); CHKERRQ(ierr); *J = A; } else { /* Need to create a copy, could use MAT_SHARE_NONZERO_PATTERN in most cases */ ierr = MatDuplicate(A,MAT_DO_NOT_COPY_VALUES,J); CHKERRQ(ierr); ierr = MatZeroEntries(*J); CHKERRQ(ierr); } PetscFunctionReturn(0); }
/* RHSMatrixLaplacian - User-provided routine to compute the right-hand-side matrix for the Laplacian operator Input Parameters: ts - the TS context t - current time (ignored) X - current solution (ignored) dummy - optional user-defined context, as set by TSetRHSJacobian() Output Parameters: AA - Jacobian matrix BB - optionally different matrix from which the preconditioner is built str - flag indicating matrix structure */ PetscErrorCode RHSMatrixLaplaciangllDM(TS ts,PetscReal t,Vec X,Mat A,Mat BB,void *ctx) { PetscReal **temp; PetscReal vv; AppCtx *appctx = (AppCtx*)ctx; /* user-defined application context */ PetscErrorCode ierr; PetscInt i,xs,xn,l,j; PetscInt *rowsDM; PetscBool flg = PETSC_FALSE; ierr = PetscOptionsGetBool(NULL,NULL,"-gll_mf",&flg,NULL);CHKERRQ(ierr); if (!flg) { /* Creates the element stiffness matrix for the given gll */ ierr = PetscGLLElementLaplacianCreate(&appctx->SEMop.gll,&temp);CHKERRQ(ierr); /* workarround for clang analyzer warning: Division by zero */ if (appctx->param.N <= 1) SETERRQ(PETSC_COMM_WORLD,PETSC_ERR_ARG_WRONG,"Spectral element order should be > 1"); /* scale by the size of the element */ for (i=0; i<appctx->param.N; i++) { vv=-appctx->param.mu*2.0/appctx->param.Le; for (j=0; j<appctx->param.N; j++) temp[i][j]=temp[i][j]*vv; } ierr = MatSetOption(A,MAT_NEW_NONZERO_ALLOCATION_ERR,PETSC_FALSE);CHKERRQ(ierr); ierr = DMDAGetCorners(appctx->da,&xs,NULL,NULL,&xn,NULL,NULL);CHKERRQ(ierr); xs = xs/(appctx->param.N-1); xn = xn/(appctx->param.N-1); ierr = PetscMalloc1(appctx->param.N,&rowsDM);CHKERRQ(ierr); /* loop over local elements */ for (j=xs; j<xs+xn; j++) { for (l=0; l<appctx->param.N; l++) { rowsDM[l] = 1+(j-xs)*(appctx->param.N-1)+l; } ierr = MatSetValuesLocal(A,appctx->param.N,rowsDM,appctx->param.N,rowsDM,&temp[0][0],ADD_VALUES);CHKERRQ(ierr); } ierr = PetscFree(rowsDM);CHKERRQ(ierr); ierr = MatAssemblyBegin(A,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); ierr = MatAssemblyEnd(A,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); ierr = VecReciprocal(appctx->SEMop.mass);CHKERRQ(ierr); ierr = MatDiagonalScale(A,appctx->SEMop.mass,0);CHKERRQ(ierr); ierr = VecReciprocal(appctx->SEMop.mass);CHKERRQ(ierr); ierr = PetscGLLElementLaplacianDestroy(&appctx->SEMop.gll,&temp);CHKERRQ(ierr); } else { ierr = MatSetType(A,MATSHELL);CHKERRQ(ierr); ierr = MatSetUp(A);CHKERRQ(ierr); ierr = MatShellSetContext(A,appctx);CHKERRQ(ierr); ierr = MatShellSetOperation(A,MATOP_MULT,(void (*)(void))MatMult_Laplacian);CHKERRQ(ierr); } return 0; }
/* MatConvert_Basic - Converts from any input format to another format. For parallel formats, the new matrix distribution is determined by PETSc. Does not do preallocation so in general will be slow */ PETSC_INTERN PetscErrorCode MatConvert_Basic(Mat mat, MatType newtype,MatReuse reuse,Mat *newmat) { Mat M; const PetscScalar *vwork; PetscErrorCode ierr; PetscInt nz,i,m,n,rstart,rend,lm,ln; const PetscInt *cwork; PetscBool isSBAIJ; PetscFunctionBegin; ierr = PetscObjectTypeCompare((PetscObject)mat,MATSEQSBAIJ,&isSBAIJ);CHKERRQ(ierr); if (!isSBAIJ) { ierr = PetscObjectTypeCompare((PetscObject)mat,MATMPISBAIJ,&isSBAIJ);CHKERRQ(ierr); } if (isSBAIJ) SETERRQ(PetscObjectComm((PetscObject)mat),PETSC_ERR_SUP,"Cannot convert from SBAIJ matrix since cannot obtain entire rows of matrix"); ierr = MatGetSize(mat,&m,&n);CHKERRQ(ierr); ierr = MatGetLocalSize(mat,&lm,&ln);CHKERRQ(ierr); if (ln == n) ln = PETSC_DECIDE; /* try to preserve column ownership */ ierr = MatCreate(PetscObjectComm((PetscObject)mat),&M);CHKERRQ(ierr); ierr = MatSetSizes(M,lm,ln,m,n);CHKERRQ(ierr); ierr = MatSetBlockSizesFromMats(M,mat,mat);CHKERRQ(ierr); ierr = MatSetType(M,newtype);CHKERRQ(ierr); ierr = MatSeqDenseSetPreallocation(M,NULL);CHKERRQ(ierr); ierr = MatMPIDenseSetPreallocation(M,NULL);CHKERRQ(ierr); ierr = MatSetUp(M);CHKERRQ(ierr); ierr = MatSetOption(M,MAT_NEW_NONZERO_LOCATION_ERR,PETSC_FALSE);CHKERRQ(ierr); ierr = MatSetOption(M,MAT_NEW_NONZERO_ALLOCATION_ERR,PETSC_FALSE);CHKERRQ(ierr); ierr = PetscObjectTypeCompare((PetscObject)M,MATSEQSBAIJ,&isSBAIJ);CHKERRQ(ierr); if (!isSBAIJ) { ierr = PetscObjectTypeCompare((PetscObject)M,MATMPISBAIJ,&isSBAIJ);CHKERRQ(ierr); } if (isSBAIJ) { ierr = MatSetOption(M,MAT_IGNORE_LOWER_TRIANGULAR,PETSC_TRUE);CHKERRQ(ierr); } ierr = MatGetOwnershipRange(mat,&rstart,&rend);CHKERRQ(ierr); for (i=rstart; i<rend; i++) { ierr = MatGetRow(mat,i,&nz,&cwork,&vwork);CHKERRQ(ierr); ierr = MatSetValues(M,1,&i,nz,cwork,vwork,INSERT_VALUES);CHKERRQ(ierr); ierr = MatRestoreRow(mat,i,&nz,&cwork,&vwork);CHKERRQ(ierr); } ierr = MatAssemblyBegin(M,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); ierr = MatAssemblyEnd(M,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); if (reuse == MAT_INPLACE_MATRIX) { ierr = MatHeaderReplace(mat,&M);CHKERRQ(ierr); } else { *newmat = M; } PetscFunctionReturn(0); }
int main(int argc,char **args) { Mat C,A; PetscInt i,j,m = 3,n = 2,rstart,rend; PetscMPIInt size,rank; PetscErrorCode ierr; PetscScalar v; IS isrow,iscol; ierr = PetscInitialize(&argc,&args,(char*)0,help);if (ierr) return ierr; ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRQ(ierr); ierr = MPI_Comm_size(PETSC_COMM_WORLD,&size);CHKERRQ(ierr); n = 2*size; ierr = MatCreate(PETSC_COMM_WORLD,&C);CHKERRQ(ierr); ierr = MatSetSizes(C,PETSC_DECIDE,PETSC_DECIDE,m*n,m*n);CHKERRQ(ierr); ierr = MatSetFromOptions(C);CHKERRQ(ierr); ierr = MatSetUp(C);CHKERRQ(ierr); /* This is JUST to generate a nice test matrix, all processors fill up the entire matrix. This is not something one would ever do in practice. */ ierr = MatGetOwnershipRange(C,&rstart,&rend);CHKERRQ(ierr); for (i=rstart; i<rend; i++) { for (j=0; j<m*n; j++) { v = i + j + 1; ierr = MatSetValues(C,1,&i,1,&j,&v,INSERT_VALUES);CHKERRQ(ierr); } } ierr = MatAssemblyBegin(C,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); ierr = MatAssemblyEnd(C,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); ierr = PetscViewerPushFormat(PETSC_VIEWER_STDOUT_WORLD,PETSC_VIEWER_ASCII_COMMON);CHKERRQ(ierr); ierr = MatView(C,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr); /* Generate a new matrix consisting of every second row and column of the original matrix */ ierr = MatGetOwnershipRange(C,&rstart,&rend);CHKERRQ(ierr); /* Create parallel IS with the rows we want on THIS processor */ ierr = ISCreateStride(PETSC_COMM_WORLD,(rend-rstart)/2,rstart,2,&isrow);CHKERRQ(ierr); /* Create parallel IS with the rows we want on THIS processor (same as rows for now) */ ierr = ISCreateStride(PETSC_COMM_WORLD,(rend-rstart)/2,rstart,2,&iscol);CHKERRQ(ierr); ierr = MatGetSubMatrix(C,isrow,iscol,MAT_INITIAL_MATRIX,&A);CHKERRQ(ierr); ierr = MatGetSubMatrix(C,isrow,iscol,MAT_REUSE_MATRIX,&A);CHKERRQ(ierr); ierr = MatView(A,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr); ierr = ISDestroy(&isrow);CHKERRQ(ierr); ierr = ISDestroy(&iscol);CHKERRQ(ierr); ierr = MatDestroy(&A);CHKERRQ(ierr); ierr = MatDestroy(&C);CHKERRQ(ierr); ierr = PetscFinalize(); return ierr; }
void Field_solver::alloc_petsc_matrix_seqaij( Mat *A, PetscInt nrow, PetscInt ncol, PetscInt nonzero_per_row ) { PetscErrorCode ierr; ierr = MatCreateSeqAIJ( PETSC_COMM_SELF, nrow, ncol, nonzero_per_row, NULL, A ); CHKERRXX( ierr ); ierr = MatSetUp( *A ); CHKERRXX( ierr ); return; }
PetscErrorCode RunTest(void) { PetscInt N = 100; PetscBool draw = PETSC_FALSE; PetscReal rnorm; Mat A; Vec b,x,r; KSP ksp; PC pc; PetscErrorCode ierr; PetscFunctionBegin; ierr = PetscOptionsGetInt(0,"-N",&N,NULL);CHKERRQ(ierr); ierr = PetscOptionsGetBool(0,"-draw",&draw,NULL);CHKERRQ(ierr); ierr = MatCreate(PETSC_COMM_WORLD,&A);CHKERRQ(ierr); ierr = MatSetSizes(A,PETSC_DECIDE,PETSC_DECIDE,N,N);CHKERRQ(ierr); ierr = MatSetType(A,MATPYTHON);CHKERRQ(ierr); ierr = MatPythonSetType(A,"example1.py:Laplace1D");CHKERRQ(ierr); ierr = MatSetUp(A);CHKERRQ(ierr); ierr = MatGetVecs(A,&x,&b);CHKERRQ(ierr); ierr = VecSet(b,1);CHKERRQ(ierr); ierr = KSPCreate(PETSC_COMM_WORLD,&ksp);CHKERRQ(ierr); ierr = KSPSetType(ksp,KSPPYTHON);CHKERRQ(ierr); ierr = KSPPythonSetType(ksp,"example1.py:ConjGrad");CHKERRQ(ierr); ierr = KSPGetPC(ksp,&pc);CHKERRQ(ierr); ierr = PCSetType(pc,PCPYTHON);CHKERRQ(ierr); ierr = PCPythonSetType(pc,"example1.py:Jacobi");CHKERRQ(ierr); ierr = KSPSetOperators(ksp,A,A);CHKERRQ(ierr); ierr = KSPSetFromOptions(ksp);CHKERRQ(ierr); ierr = KSPSolve(ksp,b,x);CHKERRQ(ierr); ierr = VecDuplicate(b,&r);CHKERRQ(ierr); ierr = MatMult(A,x,r);CHKERRQ(ierr); ierr = VecAYPX(r,-1,b);CHKERRQ(ierr); ierr = VecNorm(r,NORM_2,&rnorm);CHKERRQ(ierr); ierr = PetscPrintf(PETSC_COMM_WORLD,"error norm = %g\n",rnorm);CHKERRQ(ierr); if (draw) { ierr = VecView(x,PETSC_VIEWER_DRAW_WORLD);CHKERRQ(ierr); ierr = PetscSleep(2);CHKERRQ(ierr); } ierr = VecDestroy(&x);CHKERRQ(ierr); ierr = VecDestroy(&b);CHKERRQ(ierr); ierr = VecDestroy(&r);CHKERRQ(ierr); ierr = MatDestroy(&A);CHKERRQ(ierr); ierr = KSPDestroy(&ksp);CHKERRQ(ierr); PetscFunctionReturn(0); }
PetscErrorCode BSSPsi(BSS self, Vec c, Vec xs, Vec ys) { // yj = sum(i) ci ui(xj) // PetscErrorCode ierr; // ierr = BSSChcek(self); CHKERRQ(ierr); PetscErrorCode ierr; int nc; VecGetSize(c, &nc); int nb; BSSGetSize(self, &nb); int nx; VecGetSize(xs, &nx); int ny; VecGetSize(ys, &ny); if(nc != nb) { SETERRQ(self->comm, 1, "size of c must be same as basis size"); } if(nx != ny) { SETERRQ(self->comm, 1, "xs and ys must be same size"); } Mat f_jx_ib; ierr = MatCreate(self->comm, &f_jx_ib); CHKERRQ(ierr); ierr = MatSetSizes(f_jx_ib, PETSC_DECIDE, PETSC_DECIDE, nx, nb); CHKERRQ(ierr); ierr = MatSetUp(f_jx_ib); CHKERRQ(ierr); PetscScalar *x_ptr; VecGetArray(xs, &x_ptr); PetscReal *x_r_ptr; PetscMalloc1(nx, &x_r_ptr); for(int ix = 0; ix < nx; ix++) x_r_ptr[ix] = creal(x_ptr[ix]); PetscScalar *x_c_ptr; PetscMalloc1(nx, &x_c_ptr); ierr = CScalingCalc(self->c_scaling, x_r_ptr, nx, NULL, x_c_ptr); CHKERRQ(ierr); for(int jx = 0; jx < nx; jx++) { for(int ib = 0; ib < nb; ib++) { PetscScalar y; PetscBool zeroq; ierr = CalcBSpline(self->order, self->ts_r, self->ts_s, self->b_idx_list[ib], x_r_ptr[jx], x_c_ptr[jx], &y, &zeroq); CHKERRQ(ierr); if(!zeroq) { ierr = MatSetValue(f_jx_ib, jx, ib, y, INSERT_VALUES); CHKERRQ(ierr); } } } MatAssemblyBegin(f_jx_ib, MAT_FINAL_ASSEMBLY); MatAssemblyEnd(f_jx_ib, MAT_FINAL_ASSEMBLY); ierr = MatMult(f_jx_ib, c, ys); CHKERRQ(ierr); MatDestroy(&f_jx_ib); VecRestoreArray(xs, &x_ptr); PetscFree(x_r_ptr); PetscFree(x_c_ptr); return 0; }
int main(int argc,char **args) { Mat C; Vec u,x,b,e; PetscInt i,n = 10,midx[3]; PetscErrorCode ierr; PetscScalar v[3]; PetscReal omega = 1.0,norm; PetscInitialize(&argc,&args,(char*)0,help); ierr = PetscOptionsGetReal(NULL,"-omega",&omega,NULL);CHKERRQ(ierr); ierr = PetscOptionsGetInt(NULL,"-n",&n,NULL);CHKERRQ(ierr); ierr = MatCreate(PETSC_COMM_SELF,&C);CHKERRQ(ierr); ierr = MatSetSizes(C,n,n,n,n);CHKERRQ(ierr); ierr = MatSetType(C,MATSEQDENSE);CHKERRQ(ierr); ierr = MatSetUp(C);CHKERRQ(ierr); ierr = VecCreateSeq(PETSC_COMM_SELF,n,&b);CHKERRQ(ierr); ierr = VecCreateSeq(PETSC_COMM_SELF,n,&x);CHKERRQ(ierr); ierr = VecCreateSeq(PETSC_COMM_SELF,n,&u);CHKERRQ(ierr); ierr = VecCreateSeq(PETSC_COMM_SELF,n,&e);CHKERRQ(ierr); ierr = VecSet(u,1.0);CHKERRQ(ierr); ierr = VecSet(x,0.0);CHKERRQ(ierr); v[0] = -1.; v[1] = 2.; v[2] = -1.; for (i=1; i<n-1; i++) { midx[0] = i-1; midx[1] = i; midx[2] = i+1; ierr = MatSetValues(C,1,&i,3,midx,v,INSERT_VALUES);CHKERRQ(ierr); } i = 0; midx[0] = 0; midx[1] = 1; v[0] = 2.0; v[1] = -1.; ierr = MatSetValues(C,1,&i,2,midx,v,INSERT_VALUES);CHKERRQ(ierr); i = n-1; midx[0] = n-2; midx[1] = n-1; v[0] = -1.0; v[1] = 2.; ierr = MatSetValues(C,1,&i,2,midx,v,INSERT_VALUES);CHKERRQ(ierr); ierr = MatAssemblyBegin(C,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); ierr = MatAssemblyEnd(C,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); ierr = MatMult(C,u,b);CHKERRQ(ierr); for (i=0; i<n; i++) { ierr = MatSOR(C,b,omega,SOR_FORWARD_SWEEP,0.0,1,1,x);CHKERRQ(ierr); ierr = VecWAXPY(e,-1.0,x,u);CHKERRQ(ierr); ierr = VecNorm(e,NORM_2,&norm);CHKERRQ(ierr); ierr = PetscPrintf(PETSC_COMM_SELF,"2-norm of error %g\n",(double)norm);CHKERRQ(ierr); } ierr = MatDestroy(&C);CHKERRQ(ierr); ierr = VecDestroy(&x);CHKERRQ(ierr); ierr = VecDestroy(&b);CHKERRQ(ierr); ierr = VecDestroy(&u);CHKERRQ(ierr); ierr = VecDestroy(&e);CHKERRQ(ierr); ierr = PetscFinalize(); return 0; }
/*@ MatCreateMFFD - Creates a matrix-free matrix. See also MatCreateSNESMF() Collective on Vec Input Parameters: + comm - MPI communicator . m - number of local rows (or PETSC_DECIDE to have calculated if M is given) This value should be the same as the local size used in creating the y vector for the matrix-vector product y = Ax. . n - This value should be the same as the local size used in creating the x vector for the matrix-vector product y = Ax. (or PETSC_DECIDE to have calculated if N is given) For square matrices n is almost always m. . M - number of global rows (or PETSC_DETERMINE to have calculated if m is given) - N - number of global columns (or PETSC_DETERMINE to have calculated if n is given) Output Parameter: . J - the matrix-free matrix Options Database Keys: call MatSetFromOptions() to trigger these + -mat_mffd_type - wp or ds (see MATMFFD_WP or MATMFFD_DS) . -mat_mffd_err - square root of estimated relative error in function evaluation . -mat_mffd_period - how often h is recomputed, defaults to 1, everytime . -mat_mffd_check_positivity - possibly decrease h until U + h*a has only positive values - -mat_mffd_complex - use the Lyness trick with complex numbers to compute the matrix-vector product instead of differencing (requires real valued functions but that PETSc be configured for complex numbers) Level: advanced Notes: The matrix-free matrix context merely contains the function pointers and work space for performing finite difference approximations of Jacobian-vector products, F'(u)*a, The default code uses the following approach to compute h .vb F'(u)*a = [F(u+h*a) - F(u)]/h where h = error_rel*u'a/||a||^2 if |u'a| > umin*||a||_{1} = error_rel*umin*sign(u'a)*||a||_{1}/||a||^2 otherwise where error_rel = square root of relative error in function evaluation umin = minimum iterate parameter .ve You can call SNESSetJacobian() with MatMFFDComputeJacobian() if you are using matrix and not a different preconditioner matrix The user can set the error_rel via MatMFFDSetFunctionError() and umin via MatMFFDDSSetUmin(); see Users-Manual: ch_snes for details. The user should call MatDestroy() when finished with the matrix-free matrix context. Options Database Keys: + -mat_mffd_err <error_rel> - Sets error_rel . -mat_mffd_unim <umin> - Sets umin (for default PETSc routine that computes h only) - -mat_mffd_check_positivity .keywords: default, matrix-free, create, matrix .seealso: MatDestroy(), MatMFFDSetFunctionError(), MatMFFDDSSetUmin(), MatMFFDSetFunction() MatMFFDSetHHistory(), MatMFFDResetHHistory(), MatCreateSNESMF(), MatMFFDGetH(), MatMFFDRegister(), MatMFFDComputeJacobian() @*/ PetscErrorCode MatCreateMFFD(MPI_Comm comm,PetscInt m,PetscInt n,PetscInt M,PetscInt N,Mat *J) { PetscErrorCode ierr; PetscFunctionBegin; ierr = MatCreate(comm,J);CHKERRQ(ierr); ierr = MatSetSizes(*J,m,n,M,N);CHKERRQ(ierr); ierr = MatSetType(*J,MATMFFD);CHKERRQ(ierr); ierr = MatSetUp(*J);CHKERRQ(ierr); PetscFunctionReturn(0); }
PetscErrorCode BSSCreateR2Mat(BSS self, Mat *M) { PetscErrorCode ierr; ierr = BSSCheck(self); CHKERRQ(ierr); int nb = self->num_basis; MatCreate(self->comm, M); MatSetSizes(*M, PETSC_DECIDE, PETSC_DECIDE, nb*nb, nb*nb); MatSetUp(*M); return 0; }
/*@C MatSeqAIJFromMatlab - Given a MATLAB sparse matrix, fills a SeqAIJ matrix with its transpose. Not Collective Input Parameters: + mmat - a MATLAB sparse matris - mat - an already created MATSEQAIJ Level: intermediate @*/ PETSC_EXTERN PetscErrorCode MatSeqAIJFromMatlab(mxArray *mmat,Mat mat) { PetscErrorCode ierr; PetscInt nz,n,m,*i,*j,k; mwIndex nnz,nn,nm,*ii,*jj; Mat_SeqAIJ *aij = (Mat_SeqAIJ*)mat->data; PetscFunctionBegin; nn = mxGetN(mmat); /* rows of transpose of matrix */ nm = mxGetM(mmat); nnz = (mxGetJc(mmat))[nn]; ii = mxGetJc(mmat); jj = mxGetIr(mmat); n = (PetscInt) nn; m = (PetscInt) nm; nz = (PetscInt) nnz; if (mat->rmap->n < 0 && mat->cmap->n < 0) { /* matrix has not yet had its size set */ ierr = MatSetSizes(mat,n,m,PETSC_DETERMINE,PETSC_DETERMINE); CHKERRQ(ierr); ierr = MatSetUp(mat); CHKERRQ(ierr); } else { if (mat->rmap->n != n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_SUP,"Cannot change size of PETSc matrix %D to %D",mat->rmap->n,n); if (mat->cmap->n != m) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_SUP,"Cannot change size of PETSc matrix %D to %D",mat->cmap->n,m); } if (nz != aij->nz) { /* number of nonzeros in matrix has changed, so need new data structure */ ierr = MatSeqXAIJFreeAIJ(mat,&aij->a,&aij->j,&aij->i); CHKERRQ(ierr); aij->nz = nz; ierr = PetscMalloc3(aij->nz,&aij->a,aij->nz,&aij->j,mat->rmap->n+1,&aij->i); CHKERRQ(ierr); aij->singlemalloc = PETSC_TRUE; } ierr = PetscMemcpy(aij->a,mxGetPr(mmat),aij->nz*sizeof(PetscScalar)); CHKERRQ(ierr); /* MATLAB stores by column, not row so we pass in the transpose of the matrix */ i = aij->i; for (k=0; k<n+1; k++) i[k] = (PetscInt) ii[k]; j = aij->j; for (k=0; k<nz; k++) j[k] = (PetscInt) jj[k]; for (k=0; k<mat->rmap->n; k++) aij->ilen[k] = aij->imax[k] = aij->i[k+1] - aij->i[k]; ierr = MatAssemblyBegin(mat,MAT_FINAL_ASSEMBLY); CHKERRQ(ierr); ierr = MatAssemblyEnd(mat,MAT_FINAL_ASSEMBLY); CHKERRQ(ierr); PetscFunctionReturn(0); }
PetscErrorCode fill(Mat m, Vec v) { PetscInt idxn[3] = {0, 1, 2}; PetscInt localRows = 0; PetscMPIInt rank,size; PetscErrorCode ierr; PetscFunctionBegin; ierr = MPI_Comm_rank(MPI_COMM_WORLD, &rank);CHKERRQ(ierr); ierr = MPI_Comm_size(MPI_COMM_WORLD, &size);CHKERRQ(ierr); if (rank == 1 || rank == 2) localRows = 4; if (size == 1) localRows = 8; ierr = MatSetSizes(m, localRows, PETSC_DECIDE, PETSC_DECIDE, 3);CHKERRQ(ierr); ierr = VecSetSizes(v, localRows, PETSC_DECIDE);CHKERRQ(ierr); ierr = MatSetFromOptions(m);CHKERRQ(ierr); ierr = VecSetFromOptions(v);CHKERRQ(ierr); ierr = MatSetUp(m);CHKERRQ(ierr); if (size == 1) { PetscInt idxm1[4] = {0, 1, 2, 3}; PetscScalar values1[12] = {1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1}; PetscInt idxm2[4] = {4, 5, 6, 7}; PetscScalar values2[12] = {1, 2, 0, 1, 2, 1, 1, 3, 0, 1, 3, 1}; ierr = MatSetValues(m, 4, idxm1, 3, idxn, values1, INSERT_VALUES);CHKERRQ(ierr); ierr = VecSetValue(v, 0, 1.1, INSERT_VALUES); VecSetValue(v, 1, 2.5, INSERT_VALUES);CHKERRQ(ierr); ierr = VecSetValue(v, 2, 3, INSERT_VALUES); VecSetValue(v, 3, 4, INSERT_VALUES);CHKERRQ(ierr); ierr = MatSetValues(m, 4, idxm2, 3, idxn, values2, INSERT_VALUES);CHKERRQ(ierr); ierr = VecSetValue(v, 4, 5, INSERT_VALUES); VecSetValue(v, 5, 6, INSERT_VALUES);CHKERRQ(ierr); ierr = VecSetValue(v, 6, 7, INSERT_VALUES); VecSetValue(v, 7, 8, INSERT_VALUES);CHKERRQ(ierr); } else if (rank == 1) { PetscInt idxm[4] = {0, 1, 2, 3}; PetscScalar values[12] = {1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1}; ierr = MatSetValues(m, 4, idxm, 3, idxn, values, INSERT_VALUES);CHKERRQ(ierr); ierr = VecSetValue(v, 0, 1.1, INSERT_VALUES); VecSetValue(v, 1, 2.5, INSERT_VALUES);CHKERRQ(ierr); ierr = VecSetValue(v, 2, 3, INSERT_VALUES); VecSetValue(v, 3, 4, INSERT_VALUES);CHKERRQ(ierr); } else if (rank == 2) { PetscInt idxm[4] = {4, 5, 6, 7}; PetscScalar values[12] = {1, 2, 0, 1, 2, 1, 1, 3, 0, 1, 3, 1}; ierr = MatSetValues(m, 4, idxm, 3, idxn, values, INSERT_VALUES);CHKERRQ(ierr); ierr = VecSetValue(v, 4, 5, INSERT_VALUES); VecSetValue(v, 5, 6, INSERT_VALUES);CHKERRQ(ierr); ierr = VecSetValue(v, 6, 7, INSERT_VALUES); VecSetValue(v, 7, 8, INSERT_VALUES);CHKERRQ(ierr); } ierr = MatAssemblyBegin(m, MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); ierr = MatAssemblyEnd(m, MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); ierr = VecAssemblyBegin(v);CHKERRQ(ierr); ierr = VecAssemblyEnd(v);CHKERRQ(ierr); PetscFunctionReturn(0); }
/*@C MatCreateShell - Creates a new matrix class for use with a user-defined private data storage format. Collective on MPI_Comm Input Parameters: + comm - MPI communicator . m - number of local rows (must be given) . n - number of local columns (must be given) . M - number of global rows (may be PETSC_DETERMINE) . N - number of global columns (may be PETSC_DETERMINE) - ctx - pointer to data needed by the shell matrix routines Output Parameter: . A - the matrix Level: advanced Usage: $ extern int mult(Mat,Vec,Vec); $ MatCreateShell(comm,m,n,M,N,ctx,&mat); $ MatShellSetOperation(mat,MATOP_MULT,(void(*)(void))mult); $ [ Use matrix for operations that have been set ] $ MatDestroy(mat); Notes: The shell matrix type is intended to provide a simple class to use with KSP (such as, for use with matrix-free methods). You should not use the shell type if you plan to define a complete matrix class. Fortran Notes: The context can only be an integer or a PetscObject unfortunately it cannot be a Fortran array or derived type. PETSc requires that matrices and vectors being used for certain operations are partitioned accordingly. For example, when creating a shell matrix, A, that supports parallel matrix-vector products using MatMult(A,x,y) the user should set the number of local matrix rows to be the number of local elements of the corresponding result vector, y. Note that this is information is required for use of the matrix interface routines, even though the shell matrix may not actually be physically partitioned. For example, $ $ Vec x, y $ extern int mult(Mat,Vec,Vec); $ Mat A $ $ VecCreateMPI(comm,PETSC_DECIDE,M,&y); $ VecCreateMPI(comm,PETSC_DECIDE,N,&x); $ VecGetLocalSize(y,&m); $ VecGetLocalSize(x,&n); $ MatCreateShell(comm,m,n,M,N,ctx,&A); $ MatShellSetOperation(mat,MATOP_MULT,(void(*)(void))mult); $ MatMult(A,x,y); $ MatDestroy(A); $ VecDestroy(y); VecDestroy(x); $ .keywords: matrix, shell, create .seealso: MatShellSetOperation(), MatHasOperation(), MatShellGetContext(), MatShellSetContext() @*/ PetscErrorCode MatCreateShell(MPI_Comm comm,PetscInt m,PetscInt n,PetscInt M,PetscInt N,void *ctx,Mat *A) { PetscErrorCode ierr; PetscFunctionBegin; ierr = MatCreate(comm,A);CHKERRQ(ierr); ierr = MatSetSizes(*A,m,n,M,N);CHKERRQ(ierr); ierr = MatSetType(*A,MATSHELL);CHKERRQ(ierr); ierr = MatShellSetContext(*A,ctx);CHKERRQ(ierr); ierr = MatSetUp(*A);CHKERRQ(ierr); PetscFunctionReturn(0); }
void SingleLongPipe::initialize() { MatCreate(PETSC_COMM_WORLD, &M); MatSetSizes(M, local_n, local_n, global_n, global_n); MatSetFromOptions(M); MatMPIAIJSetPreallocation(M, 2, nullptr, 2, nullptr); MatSeqAIJSetPreallocation(M, 2, nullptr); MatSetUp(M); KSPCreate(PETSC_COMM_WORLD, &ksp); KSPSetOperators(ksp, M, M); KSPSetFromOptions(ksp); KSPSetUp(ksp); }
PETSC_INTERN PetscErrorCode MatConvert_Shell(Mat oldmat, MatType newtype,MatReuse reuse,Mat *newmat) { Mat mat; Vec in,out; PetscErrorCode ierr; PetscInt i,M,m,*rows,start,end; MPI_Comm comm; PetscScalar *array,zero = 0.0,one = 1.0; PetscFunctionBegin; ierr = PetscObjectGetComm((PetscObject)oldmat,&comm);CHKERRQ(ierr); ierr = MatGetOwnershipRange(oldmat,&start,&end);CHKERRQ(ierr); ierr = VecCreateMPI(comm,end-start,PETSC_DECIDE,&in);CHKERRQ(ierr); ierr = VecDuplicate(in,&out);CHKERRQ(ierr); ierr = VecGetSize(in,&M);CHKERRQ(ierr); ierr = VecGetLocalSize(in,&m);CHKERRQ(ierr); ierr = PetscMalloc1(m+1,&rows);CHKERRQ(ierr); for (i=0; i<m; i++) rows[i] = start + i; ierr = MatCreate(comm,&mat);CHKERRQ(ierr); ierr = MatSetSizes(mat,m,M,M,M);CHKERRQ(ierr); ierr = MatSetType(mat,newtype);CHKERRQ(ierr); ierr = MatSetBlockSizesFromMats(mat,oldmat,oldmat);CHKERRQ(ierr); ierr = MatSetUp(mat);CHKERRQ(ierr); for (i=0; i<M; i++) { ierr = VecSet(in,zero);CHKERRQ(ierr); ierr = VecSetValues(in,1,&i,&one,INSERT_VALUES);CHKERRQ(ierr); ierr = VecAssemblyBegin(in);CHKERRQ(ierr); ierr = VecAssemblyEnd(in);CHKERRQ(ierr); ierr = MatMult(oldmat,in,out);CHKERRQ(ierr); ierr = VecGetArray(out,&array);CHKERRQ(ierr); ierr = MatSetValues(mat,m,rows,1,&i,array,INSERT_VALUES);CHKERRQ(ierr); ierr = VecRestoreArray(out,&array);CHKERRQ(ierr); } ierr = PetscFree(rows);CHKERRQ(ierr); ierr = VecDestroy(&in);CHKERRQ(ierr); ierr = VecDestroy(&out);CHKERRQ(ierr); ierr = MatAssemblyBegin(mat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); ierr = MatAssemblyEnd(mat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); if (reuse == MAT_INPLACE_MATRIX) { ierr = MatHeaderReplace(oldmat,&mat);CHKERRQ(ierr); } else { *newmat = mat; } PetscFunctionReturn(0); }
/*@ MatCreateIS - Creates a "process" unassmembled matrix, it is assembled on each process but not across processes. Input Parameters: + comm - MPI communicator that will share the matrix . bs - local and global block size of the matrix . m,n,M,N - local and/or global sizes of the left and right vector used in matrix vector products - map - mapping that defines the global number for each local number Output Parameter: . A - the resulting matrix Level: advanced Notes: See MATIS for more details m and n are NOT related to the size of the map, they are the size of the part of the vector owned by that process. m + nghosts (or n + nghosts) is the length of map since map maps all local points plus the ghost points to global indices. .seealso: MATIS, MatSetLocalToGlobalMapping() @*/ PetscErrorCode MatCreateIS(MPI_Comm comm,PetscInt bs,PetscInt m,PetscInt n,PetscInt M,PetscInt N,ISLocalToGlobalMapping map,Mat *A) { PetscErrorCode ierr; PetscFunctionBegin; ierr = MatCreate(comm,A);CHKERRQ(ierr); ierr = MatSetBlockSize(*A,bs);CHKERRQ(ierr); ierr = MatSetSizes(*A,m,n,M,N);CHKERRQ(ierr); ierr = MatSetType(*A,MATIS);CHKERRQ(ierr); ierr = MatSetUp(*A);CHKERRQ(ierr); ierr = MatSetLocalToGlobalMapping(*A,map,map);CHKERRQ(ierr); PetscFunctionReturn(0); }