PetscErrorCode private_PetscViewerCreate_XDMF(MPI_Comm comm,const char filename[],PetscViewer *v) { long int *bytes; PetscContainer container; PetscViewer viewer; PetscErrorCode ierr; PetscFunctionBegin; ierr = PetscViewerCreate(comm,&viewer);CHKERRQ(ierr); ierr = PetscViewerSetType(viewer,PETSCVIEWERASCII);CHKERRQ(ierr); ierr = PetscViewerFileSetMode(viewer,FILE_MODE_WRITE);CHKERRQ(ierr); ierr = PetscViewerFileSetName(viewer,filename);CHKERRQ(ierr); ierr = PetscMalloc1(1,&bytes);CHKERRQ(ierr); bytes[0] = 0; ierr = PetscContainerCreate(comm,&container);CHKERRQ(ierr); ierr = PetscContainerSetPointer(container,(void*)bytes);CHKERRQ(ierr); ierr = PetscObjectCompose((PetscObject)viewer,"XDMFViewerContext",(PetscObject)container);CHKERRQ(ierr); /* write xdmf header */ ierr = PetscViewerASCIIPrintf(viewer,"<?xml version=\"1.0\" encoding=\"utf-8\"?>\n");CHKERRQ(ierr); ierr = PetscViewerASCIIPrintf(viewer,"<Xdmf xmlns:xi=\"http://www.w3.org/2001/XInclude\" Version=\"2.99\">\n");CHKERRQ(ierr); /* write xdmf domain */ ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr); ierr = PetscViewerASCIIPrintf(viewer,"<Domain>\n");CHKERRQ(ierr); *v = viewer; PetscFunctionReturn(0); }
/* DMSetVI - Marks a DM as associated with a VI problem. This causes the interpolation/restriction operators to be restricted to only those variables NOT associated with active constraints. */ PetscErrorCode DMSetVI(DM dm,IS inactive) { PetscErrorCode ierr; PetscContainer isnes; DM_SNESVI *dmsnesvi; PetscFunctionBegin; if (!dm) PetscFunctionReturn(0); ierr = PetscObjectReference((PetscObject)inactive);CHKERRQ(ierr); ierr = PetscObjectQuery((PetscObject)dm,"VI",(PetscObject *)&isnes);CHKERRQ(ierr); if (!isnes) { ierr = PetscContainerCreate(((PetscObject)dm)->comm,&isnes);CHKERRQ(ierr); ierr = PetscContainerSetUserDestroy(isnes,(PetscErrorCode (*)(void*))DMDestroy_SNESVI);CHKERRQ(ierr); ierr = PetscNew(DM_SNESVI,&dmsnesvi);CHKERRQ(ierr); ierr = PetscContainerSetPointer(isnes,(void*)dmsnesvi);CHKERRQ(ierr); ierr = PetscObjectCompose((PetscObject)dm,"VI",(PetscObject)isnes);CHKERRQ(ierr); ierr = PetscContainerDestroy(&isnes);CHKERRQ(ierr); dmsnesvi->createinterpolation = dm->ops->createinterpolation; dm->ops->createinterpolation = DMCreateInterpolation_SNESVI; dmsnesvi->coarsen = dm->ops->coarsen; dm->ops->coarsen = DMCoarsen_SNESVI; dmsnesvi->createglobalvector = dm->ops->createglobalvector; dm->ops->createglobalvector = DMCreateGlobalVector_SNESVI; } else { ierr = PetscContainerGetPointer(isnes,(void**)&dmsnesvi);CHKERRQ(ierr); ierr = ISDestroy(&dmsnesvi->inactive);CHKERRQ(ierr); } ierr = DMClearGlobalVectors(dm);CHKERRQ(ierr); ierr = ISGetLocalSize(inactive,&dmsnesvi->n);CHKERRQ(ierr); dmsnesvi->inactive = inactive; dmsnesvi->dm = dm; PetscFunctionReturn(0); }
int main(int argc,char **argv) { PetscErrorCode ierr; PetscContainer container; ierr = PetscInitialize(&argc,&argv,(char*)0,help);if (ierr) return ierr; ierr = PetscContainerCreate(PETSC_COMM_SELF,&container);CHKERRQ(ierr); ierr = PetscContainerDestroy(container);CHKERRQ(ierr); ierr = PetscFinalize(); return ierr; }
PetscErrorCode PETSC_DLLEXPORT PetscFwkComponentConfigureTestIC(PetscFwk fwk, PetscInt state, PetscObject *component) { MPI_Comm comm; PetscContainer container; PetscErrorCode ierr; PetscFunctionBegin; ierr = PetscObjectGetComm((PetscObject)fwk, &comm); CHKERRQ(ierr); if(!*component) { ierr = PetscContainerCreate(comm, &container); CHKERRQ(ierr); ierr = PetscObjectSetName((PetscObject)container, "TestIIB"); CHKERRQ(ierr); *component = (PetscObject)container; ierr = PetscPrintf(comm, "%s: created component\n", __FUNCT__); CHKERRQ(ierr); } else { container = *((PetscContainer*)component); ierr = PetscPrintf(comm, "%s: configuring to state %d\n", __FUNCT__, state); CHKERRQ(ierr); } PetscFunctionReturn(0); }/* PetscFwkComponentConfigureTestIC() */
PetscErrorCode MatMatMultSymbolic_MPIAIJ_MPIAIJ(Mat A,Mat B,PetscReal fill,Mat *C) { PetscErrorCode ierr; PetscInt start,end; Mat_MatMatMultMPI *mult; PetscContainer container; PetscFunctionBegin; if (A->cmap->rstart != B->rmap->rstart || A->cmap->rend != B->rmap->rend){ SETERRQ4(PETSC_ERR_ARG_SIZ,"Matrix local dimensions are incompatible, (%D, %D) != (%D,%D)",A->cmap->rstart,A->cmap->rend,B->rmap->rstart,B->rmap->rend); } ierr = PetscNew(Mat_MatMatMultMPI,&mult);CHKERRQ(ierr); /* create a seq matrix B_seq = submatrix of B by taking rows of B that equal to nonzero col of A */ ierr = MatGetBrowsOfAcols(A,B,MAT_INITIAL_MATRIX,&mult->isrowb,&mult->iscolb,&mult->brstart,&mult->B_seq);CHKERRQ(ierr); /* create a seq matrix A_seq = submatrix of A by taking all local rows of A */ start = A->rmap->rstart; end = A->rmap->rend; ierr = ISCreateStride(PETSC_COMM_SELF,end-start,start,1,&mult->isrowa);CHKERRQ(ierr); ierr = MatGetLocalMatCondensed(A,MAT_INITIAL_MATRIX,&mult->isrowa,&mult->isrowb,&mult->A_loc);CHKERRQ(ierr); /* compute C_seq = A_seq * B_seq */ ierr = MatMatMult_SeqAIJ_SeqAIJ(mult->A_loc,mult->B_seq,MAT_INITIAL_MATRIX,fill,&mult->C_seq);CHKERRQ(ierr); /* create mpi matrix C by concatinating C_seq */ ierr = PetscObjectReference((PetscObject)mult->C_seq);CHKERRQ(ierr); /* prevent C_seq being destroyed by MatMerge() */ ierr = MatMerge(((PetscObject)A)->comm,mult->C_seq,B->cmap->n,MAT_INITIAL_MATRIX,C);CHKERRQ(ierr); /* attach the supporting struct to C for reuse of symbolic C */ ierr = PetscContainerCreate(PETSC_COMM_SELF,&container);CHKERRQ(ierr); ierr = PetscContainerSetPointer(container,mult);CHKERRQ(ierr); ierr = PetscObjectCompose((PetscObject)(*C),"Mat_MatMatMultMPI",(PetscObject)container);CHKERRQ(ierr); ierr = PetscContainerSetUserDestroy(container,PetscContainerDestroy_Mat_MatMatMultMPI);CHKERRQ(ierr); mult->MatDestroy = (*C)->ops->destroy; mult->MatDuplicate = (*C)->ops->duplicate; (*C)->ops->destroy = MatDestroy_MPIAIJ_MatMatMult; (*C)->ops->duplicate = MatDuplicate_MPIAIJ_MatMatMult; PetscFunctionReturn(0); }
PetscErrorCode PETSC_DLLEXPORT PetscFwkComponentConfigureTestIB(PetscFwk fwk, PetscInt state, PetscObject *component) { MPI_Comm comm; PetscContainer container; PetscErrorCode ierr; PetscFunctionBegin; ierr = PetscObjectGetComm((PetscObject)fwk, &comm); CHKERRQ(ierr); if(!*component) { ierr = PetscContainerCreate(comm, &container); CHKERRQ(ierr); ierr = PetscObjectSetName((PetscObject)container, "TestIB"); CHKERRQ(ierr); *component = (PetscObject)container; ierr = PetscPrintf(comm, "%s: created component\n", __FUNCT__); CHKERRQ(ierr); ierr = PetscPrintf(comm, "%s: registering dependence: TestIB --> TestIA\n", __FUNCT__); CHKERRQ(ierr); ierr = PetscFwkRegisterDependence(fwk, "${PETSC_DIR}/${PETSC_ARCH}/lib/libtestcomponents.a:TestIB", "${PETSC_DIR}/${PETSC_ARCH}/lib/libtestcomponents:TestIA"); CHKERRQ(ierr); } else { container = *((PetscContainer*)component); ierr = PetscPrintf(comm, "%s: configuring to state %d\n", __FUNCT__, state); CHKERRQ(ierr); } PetscFunctionReturn(0); }/* PetscFwkComponentConfigureTestIB() */
PetscErrorCode MatMatMultSymbolic_MPIAIJ_MPIDense(Mat A,Mat B,PetscReal fill,Mat *C) { PetscErrorCode ierr; Mat_MPIAIJ *aij = (Mat_MPIAIJ*) A->data; PetscInt nz = aij->B->cmap->n; PetscContainer cont; MPIAIJ_MPIDense *contents; VecScatter ctx = aij->Mvctx; VecScatter_MPI_General *from = (VecScatter_MPI_General*) ctx->fromdata; VecScatter_MPI_General *to = ( VecScatter_MPI_General*) ctx->todata; PetscInt m=A->rmap->n,n=B->cmap->n; PetscFunctionBegin; ierr = MatCreate(((PetscObject)B)->comm,C);CHKERRQ(ierr); ierr = MatSetSizes(*C,m,n,A->rmap->N,B->cmap->N);CHKERRQ(ierr); ierr = MatSetType(*C,MATMPIDENSE);CHKERRQ(ierr); ierr = MatAssemblyBegin(*C,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); ierr = MatAssemblyEnd(*C,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); ierr = PetscContainerCreate(((PetscObject)A)->comm,&cont);CHKERRQ(ierr); ierr = PetscNew(MPIAIJ_MPIDense,&contents);CHKERRQ(ierr); ierr = PetscContainerSetPointer(cont,contents);CHKERRQ(ierr); ierr = PetscContainerSetUserDestroy(cont,MPIAIJ_MPIDenseDestroy);CHKERRQ(ierr); /* Create work matrix used to store off processor rows of B needed for local product */ ierr = MatCreateSeqDense(PETSC_COMM_SELF,nz,B->cmap->N,PETSC_NULL,&contents->workB);CHKERRQ(ierr); /* Create work arrays needed */ ierr = PetscMalloc4(B->cmap->N*from->starts[from->n],PetscScalar,&contents->rvalues, B->cmap->N*to->starts[to->n],PetscScalar,&contents->svalues, from->n,MPI_Request,&contents->rwaits, to->n,MPI_Request,&contents->swaits);CHKERRQ(ierr); ierr = PetscObjectCompose((PetscObject)(*C),"workB",(PetscObject)cont);CHKERRQ(ierr); ierr = PetscContainerDestroy(cont);CHKERRQ(ierr); PetscFunctionReturn(0); }
void assemble_matrix(EquationSystems & es, const std::string & system_name) { EigenProblem * p = es.parameters.get<EigenProblem *>("_eigen_problem"); EigenSystem & eigen_system = es.get_system<EigenSystem>(system_name); if (!p->isNonlinearEigenvalueSolver()) { p->computeJacobian( *eigen_system.current_local_solution.get(), *eigen_system.matrix_A, Moose::KT_NONEIGEN); } else { Mat petsc_mat_A = static_cast<PetscMatrix<Number> &>(*eigen_system.matrix_A).mat(); PetscObjectComposeFunction((PetscObject)petsc_mat_A, "formJacobian", Moose::SlepcSupport::mooseSlepcEigenFormJacobianA); PetscObjectComposeFunction((PetscObject)petsc_mat_A, "formFunction", Moose::SlepcSupport::mooseSlepcEigenFormFunctionA); PetscContainer container; PetscContainerCreate(eigen_system.comm().get(), &container); PetscContainerSetPointer(container, p); PetscObjectCompose((PetscObject)petsc_mat_A, "formJacobianCtx", nullptr); PetscObjectCompose((PetscObject)petsc_mat_A, "formJacobianCtx", (PetscObject)container); PetscObjectCompose((PetscObject)petsc_mat_A, "formFunctionCtx", nullptr); PetscObjectCompose((PetscObject)petsc_mat_A, "formFunctionCtx", (PetscObject)container); PetscContainerDestroy(&container); // Let libmesh do not close matrices before solve eigen_system.eigen_solver->set_close_matrix_before_solve(false); } if (eigen_system.generalized()) { if (eigen_system.matrix_B) { if (!p->isNonlinearEigenvalueSolver()) { p->computeJacobian( *eigen_system.current_local_solution.get(), *eigen_system.matrix_B, Moose::KT_EIGEN); } else { Mat petsc_mat_B = static_cast<PetscMatrix<Number> &>(*eigen_system.matrix_B).mat(); PetscObjectComposeFunction((PetscObject)petsc_mat_B, "formJacobian", Moose::SlepcSupport::mooseSlepcEigenFormJacobianB); PetscObjectComposeFunction((PetscObject)petsc_mat_B, "formFunction", Moose::SlepcSupport::mooseSlepcEigenFormFunctionB); PetscContainer container; PetscContainerCreate(eigen_system.comm().get(), &container); PetscContainerSetPointer(container, p); PetscObjectCompose((PetscObject)petsc_mat_B, "formFunctionCtx", nullptr); PetscObjectCompose((PetscObject)petsc_mat_B, "formFunctionCtx", (PetscObject)container); PetscObjectCompose((PetscObject)petsc_mat_B, "formJacobianCtx", nullptr); PetscObjectCompose((PetscObject)petsc_mat_B, "formJacobianCtx", (PetscObject)container); PetscContainerDestroy(&container); } } else mooseError("It is a generalized eigenvalue problem but matrix B is empty\n"); } }
/* obj - PETSc object on which request is made base - Fortran array address addr - C array address res - will contain offset from C to Fortran shift - number of bytes that prevent base and addr from being commonly aligned N - size of the array align indicates alignment relative to PetscScalar, 1 means aligned on PetscScalar, 2 means aligned on 2 PetscScalar etc */ PetscErrorCode PetscScalarAddressToFortran(PetscObject obj,PetscInt align,PetscScalar *base,PetscScalar *addr,PetscInt N,size_t *res) { size_t tmp1 = (size_t) base,tmp2; size_t tmp3 = (size_t) addr; size_t itmp2; PetscInt shift; #if !defined(PETSC_HAVE_CRAY90_POINTER) if (tmp3 > tmp1) { /* C is bigger than Fortran */ tmp2 = (tmp3 - tmp1)/sizeof(PetscScalar); itmp2 = (size_t) tmp2; shift = (align*sizeof(PetscScalar) - (PetscInt)((tmp3 - tmp1) % (align*sizeof(PetscScalar)))) % (align*sizeof(PetscScalar)); } else { tmp2 = (tmp1 - tmp3)/sizeof(PetscScalar); itmp2 = -((size_t) tmp2); shift = (PetscInt)((tmp1 - tmp3) % (align*sizeof(PetscScalar))); } #else if (tmp3 > tmp1) { /* C is bigger than Fortran */ tmp2 = (tmp3 - tmp1); itmp2 = (size_t) tmp2; } else { tmp2 = (tmp1 - tmp3); itmp2 = -((size_t) tmp2); } shift = 0; #endif if (shift) { /* Fortran and C not PetscScalar aligned,recover by copying values into memory that is aligned with the Fortran */ PetscErrorCode ierr; PetscScalar *work; PetscContainer container; ierr = PetscMalloc1(N+align,&work);CHKERRQ(ierr); /* recompute shift for newly allocated space */ tmp3 = (size_t) work; if (tmp3 > tmp1) { /* C is bigger than Fortran */ shift = (align*sizeof(PetscScalar) - (PetscInt)((tmp3 - tmp1) % (align*sizeof(PetscScalar)))) % (align*sizeof(PetscScalar)); } else { shift = (PetscInt)((tmp1 - tmp3) % (align*sizeof(PetscScalar))); } /* shift work by that number of bytes */ work = (PetscScalar*)(((char*)work) + shift); ierr = PetscMemcpy(work,addr,N*sizeof(PetscScalar));CHKERRQ(ierr); /* store in the first location in addr how much you shift it */ ((PetscInt*)addr)[0] = shift; ierr = PetscContainerCreate(PETSC_COMM_SELF,&container);CHKERRQ(ierr); ierr = PetscContainerSetPointer(container,addr);CHKERRQ(ierr); ierr = PetscObjectCompose(obj,"GetArrayPtr",(PetscObject)container);CHKERRQ(ierr); tmp3 = (size_t) work; if (tmp3 > tmp1) { /* C is bigger than Fortran */ tmp2 = (tmp3 - tmp1)/sizeof(PetscScalar); itmp2 = (size_t) tmp2; shift = (align*sizeof(PetscScalar) - (PetscInt)((tmp3 - tmp1) % (align*sizeof(PetscScalar)))) % (align*sizeof(PetscScalar)); } else { tmp2 = (tmp1 - tmp3)/sizeof(PetscScalar); itmp2 = -((size_t) tmp2); shift = (PetscInt)((tmp1 - tmp3) % (align*sizeof(PetscScalar))); } if (shift) { (*PetscErrorPrintf)("PetscScalarAddressToFortran:C and Fortran arrays are\n"); (*PetscErrorPrintf)("not commonly aligned.\n"); (*PetscErrorPrintf)("Locations/sizeof(PetscScalar): C %f Fortran %f\n",((PetscReal)tmp3)/(PetscReal)sizeof(PetscScalar),((PetscReal)tmp1)/(PetscReal)sizeof(PetscScalar)); MPI_Abort(PETSC_COMM_WORLD,1); } ierr = PetscInfo(obj,"Efficiency warning, copying array in XXXGetArray() due\n\ to alignment differences between C and Fortran\n");CHKERRQ(ierr); } *res = itmp2; return 0; }
PetscErrorCode MatRARtSymbolic_SeqAIJ_SeqAIJ(Mat A,Mat R,PetscReal fill,Mat *C) { PetscErrorCode ierr; Mat P; PetscInt *rti,*rtj; Mat_RARt *rart; PetscContainer container; MatTransposeColoring matcoloring; ISColoring iscoloring; Mat Rt_dense,RARt_dense; PetscLogDouble GColor=0.0,MCCreate=0.0,MDenCreate=0.0,t0,tf,etime=0.0; Mat_SeqAIJ *c; PetscFunctionBegin; ierr = PetscGetTime(&t0);CHKERRQ(ierr); /* create symbolic P=Rt */ ierr = MatGetSymbolicTranspose_SeqAIJ(R,&rti,&rtj);CHKERRQ(ierr); ierr = MatCreateSeqAIJWithArrays(PETSC_COMM_SELF,R->cmap->n,R->rmap->n,rti,rtj,PETSC_NULL,&P);CHKERRQ(ierr); /* get symbolic C=Pt*A*P */ ierr = MatPtAPSymbolic_SeqAIJ_SeqAIJ(A,P,fill,C);CHKERRQ(ierr); (*C)->rmap->bs = R->rmap->bs; (*C)->cmap->bs = R->rmap->bs; /* create a supporting struct */ ierr = PetscNew(Mat_RARt,&rart);CHKERRQ(ierr); /* attach the supporting struct to C */ ierr = PetscContainerCreate(PETSC_COMM_SELF,&container);CHKERRQ(ierr); ierr = PetscContainerSetPointer(container,rart);CHKERRQ(ierr); ierr = PetscContainerSetUserDestroy(container,PetscContainerDestroy_Mat_RARt);CHKERRQ(ierr); ierr = PetscObjectCompose((PetscObject)(*C),"Mat_RARt",(PetscObject)container);CHKERRQ(ierr); ierr = PetscContainerDestroy(&container);CHKERRQ(ierr); ierr = PetscGetTime(&tf);CHKERRQ(ierr); etime += tf - t0; /* Create MatTransposeColoring from symbolic C=R*A*R^T */ c=(Mat_SeqAIJ*)(*C)->data; ierr = PetscGetTime(&t0);CHKERRQ(ierr); ierr = MatGetColoring(*C,MATCOLORINGLF,&iscoloring);CHKERRQ(ierr); ierr = PetscGetTime(&tf);CHKERRQ(ierr); GColor += tf - t0; ierr = PetscGetTime(&t0);CHKERRQ(ierr); ierr = MatTransposeColoringCreate(*C,iscoloring,&matcoloring);CHKERRQ(ierr); rart->matcoloring = matcoloring; ierr = ISColoringDestroy(&iscoloring);CHKERRQ(ierr); ierr = PetscGetTime(&tf);CHKERRQ(ierr); MCCreate += tf - t0; ierr = PetscGetTime(&t0);CHKERRQ(ierr); /* Create Rt_dense */ ierr = MatCreate(PETSC_COMM_SELF,&Rt_dense);CHKERRQ(ierr); ierr = MatSetSizes(Rt_dense,A->cmap->n,matcoloring->ncolors,A->cmap->n,matcoloring->ncolors);CHKERRQ(ierr); ierr = MatSetType(Rt_dense,MATSEQDENSE);CHKERRQ(ierr); ierr = MatSeqDenseSetPreallocation(Rt_dense,PETSC_NULL);CHKERRQ(ierr); Rt_dense->assembled = PETSC_TRUE; rart->Rt = Rt_dense; /* Create RARt_dense = R*A*Rt_dense */ ierr = MatCreate(PETSC_COMM_SELF,&RARt_dense);CHKERRQ(ierr); ierr = MatSetSizes(RARt_dense,(*C)->rmap->n,matcoloring->ncolors,(*C)->rmap->n,matcoloring->ncolors);CHKERRQ(ierr); ierr = MatSetType(RARt_dense,MATSEQDENSE);CHKERRQ(ierr); ierr = MatSeqDenseSetPreallocation(RARt_dense,PETSC_NULL);CHKERRQ(ierr); rart->RARt = RARt_dense; /* Allocate work array to store columns of A*R^T used in MatMatMatMultNumeric_SeqAIJ_SeqAIJ_SeqDense() */ ierr = PetscMalloc(A->rmap->n*4*sizeof(PetscScalar),&rart->work);CHKERRQ(ierr); ierr = PetscGetTime(&tf);CHKERRQ(ierr); MDenCreate += tf - t0; rart->destroy = (*C)->ops->destroy; (*C)->ops->destroy = MatDestroy_SeqAIJ_RARt; /* clean up */ ierr = MatRestoreSymbolicTranspose_SeqAIJ(R,&rti,&rtj);CHKERRQ(ierr); ierr = MatDestroy(&P);CHKERRQ(ierr); #if defined(PETSC_USE_INFO) { PetscReal density= (PetscReal)(c->nz)/(RARt_dense->rmap->n*RARt_dense->cmap->n); ierr = PetscInfo6(*C,"RARt_den %D %D; Rt_den %D %D, (RARt->nz %D)/(m*ncolors)=%g\n",RARt_dense->rmap->n,RARt_dense->cmap->n,Rt_dense->rmap->n,Rt_dense->cmap->n,c->nz,density);CHKERRQ(ierr); ierr = PetscInfo5(*C,"Sym = GetColor %g + MColorCreate %g + MDenCreate %g + other %g = %g\n",GColor,MCCreate,MDenCreate,etime,GColor+MCCreate+MDenCreate+etime);CHKERRQ(ierr); } #endif PetscFunctionReturn(0); }