/*@ MatXAIJSetPreallocation - set preallocation for serial and parallel AIJ, BAIJ, and SBAIJ matrices Collective on Mat Input Arguments: + A - matrix being preallocated . bs - block size . dnnz - number of nonzero blocks per block row of diagonal part of parallel matrix . onnz - number of nonzero blocks per block row of off-diagonal part of parallel matrix . dnnzu - number of nonzero blocks per block row of upper-triangular part of diagonal part of parallel matrix - onnzu - number of nonzero blocks per block row of upper-triangular part of off-diagonal part of parallel matrix Level: beginner .seealso: MatSeqAIJSetPreallocation(), MatMPIAIJSetPreallocation(), MatSeqBAIJSetPreallocation(), MatMPIBAIJSetPreallocation(), MatSeqSBAIJSetPreallocation(), MatMPISBAIJSetPreallocation(), PetscSplitOwnership() @*/ PetscErrorCode MatXAIJSetPreallocation(Mat A,PetscInt bs,const PetscInt dnnz[],const PetscInt onnz[],const PetscInt dnnzu[],const PetscInt onnzu[]) { PetscErrorCode ierr; void (*aij)(void); PetscFunctionBegin; ierr = MatSetBlockSize(A,bs); CHKERRQ(ierr); ierr = PetscLayoutSetUp(A->rmap); CHKERRQ(ierr); ierr = PetscLayoutSetUp(A->cmap); CHKERRQ(ierr); ierr = MatSeqBAIJSetPreallocation(A,bs,0,dnnz); CHKERRQ(ierr); ierr = MatMPIBAIJSetPreallocation(A,bs,0,dnnz,0,onnz); CHKERRQ(ierr); ierr = MatSeqSBAIJSetPreallocation(A,bs,0,dnnzu); CHKERRQ(ierr); ierr = MatMPISBAIJSetPreallocation(A,bs,0,dnnzu,0,onnzu); CHKERRQ(ierr); /* In general, we have to do extra work to preallocate for scalar (AIJ) matrices so we check whether it will do any good before going on with it. */ ierr = PetscObjectQueryFunction((PetscObject)A,"MatMPIAIJSetPreallocation_C",&aij); CHKERRQ(ierr); if (!aij) { ierr = PetscObjectQueryFunction((PetscObject)A,"MatSeqAIJSetPreallocation_C",&aij); CHKERRQ(ierr); } if (aij) { if (bs == 1) { ierr = MatSeqAIJSetPreallocation(A,0,dnnz); CHKERRQ(ierr); ierr = MatMPIAIJSetPreallocation(A,0,dnnz,0,onnz); CHKERRQ(ierr); } else { /* Convert block-row precallocation to scalar-row */ PetscInt i,m,*sdnnz,*sonnz; ierr = MatGetLocalSize(A,&m,NULL); CHKERRQ(ierr); ierr = PetscMalloc2((!!dnnz)*m,PetscInt,&sdnnz,(!!onnz)*m,PetscInt,&sonnz); CHKERRQ(ierr); for (i=0; i<m; i++) { if (dnnz) sdnnz[i] = dnnz[i/bs] * bs; if (onnz) sonnz[i] = onnz[i/bs] * bs; } ierr = MatSeqAIJSetPreallocation(A,0,dnnz ? sdnnz : NULL); CHKERRQ(ierr); ierr = MatMPIAIJSetPreallocation(A,0,dnnz ? sdnnz : NULL,0,onnz ? sonnz : NULL); CHKERRQ(ierr); ierr = PetscFree2(sdnnz,sonnz); CHKERRQ(ierr); } } PetscFunctionReturn(0); }
PetscErrorCode DMlibMeshGetSystem(DM dm, libMesh::NonlinearImplicitSystem *& sys) { PetscErrorCode (*f)(DM,libMesh::NonlinearImplicitSystem *&) = libmesh_nullptr; PetscErrorCode ierr; PetscFunctionBegin; PetscValidHeaderSpecific(dm,DM_CLASSID,1); #if PETSC_RELEASE_LESS_THAN(3,4,0) ierr = PetscObjectQueryFunction((PetscObject)dm,"DMlibMeshGetSystem_C",(PetscVoidFunction*)&f);CHKERRQ(ierr); #else ierr = PetscObjectQueryFunction((PetscObject)dm,"DMlibMeshGetSystem_C",&f);CHKERRQ(ierr); #endif if(!f) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP, "DM has no implementation for DMlibMeshGetSystem"); ierr = (*f)(dm,sys);CHKERRQ(ierr); PetscFunctionReturn(0); }
EXTERN_C_END #undef __FUNCT__ #define __FUNCT__ "PCRedundantGetOperators" /*@ PCRedundantGetOperators - gets the sequential matrix and preconditioner matrix Not Collective Input Parameter: . pc - the preconditioner context Output Parameters: + mat - the matrix - pmat - the (possibly different) preconditioner matrix Level: advanced .keywords: PC, redundant solve @*/ PetscErrorCode PETSCKSP_DLLEXPORT PCRedundantGetOperators(PC pc,Mat *mat,Mat *pmat) { PetscErrorCode ierr,(*f)(PC,Mat*,Mat*); PetscFunctionBegin; PetscValidHeaderSpecific(pc,PC_COOKIE,1); if (mat) PetscValidPointer(mat,2); if (pmat) PetscValidPointer(pmat,3); ierr = PetscObjectQueryFunction((PetscObject)pc,"PCRedundantGetOperators_C",(void (**)(void))&f);CHKERRQ(ierr); if (f) { ierr = (*f)(pc,mat,pmat);CHKERRQ(ierr); } PetscFunctionReturn(0); }
EXTERN_C_END #undef __FUNCT__ #define __FUNCT__ "PCRedundantGetPC" /*@ PCRedundantGetPC - Gets the sequential PC created by the redundant PC. Not Collective Input Parameter: . pc - the preconditioner context Output Parameter: . innerpc - the sequential PC Level: advanced .keywords: PC, redundant solve @*/ PetscErrorCode PETSCKSP_DLLEXPORT PCRedundantGetPC(PC pc,PC *innerpc) { PetscErrorCode ierr,(*f)(PC,PC*); PetscFunctionBegin; PetscValidHeaderSpecific(pc,PC_COOKIE,1); PetscValidPointer(innerpc,2); ierr = PetscObjectQueryFunction((PetscObject)pc,"PCRedundantGetPC_C",(void (**)(void))&f);CHKERRQ(ierr); if (f) { ierr = (*f)(pc,innerpc);CHKERRQ(ierr); } PetscFunctionReturn(0); }
EXTERN_C_END #undef __FUNCT__ #define __FUNCT__ "PCRedundantSetScatter" /*@ PCRedundantSetScatter - Sets the scatter used to copy values into the redundant local solve and the scatter to move them back into the global vector. Collective on PC Input Parameters: + pc - the preconditioner context . in - the scatter to move the values in - out - the scatter to move them out Level: advanced .keywords: PC, redundant solve @*/ PetscErrorCode PETSCKSP_DLLEXPORT PCRedundantSetScatter(PC pc,VecScatter in,VecScatter out) { PetscErrorCode ierr,(*f)(PC,VecScatter,VecScatter); PetscFunctionBegin; PetscValidHeaderSpecific(pc,PC_COOKIE,1); PetscValidHeaderSpecific(in,VEC_SCATTER_COOKIE,2); PetscValidHeaderSpecific(out,VEC_SCATTER_COOKIE,3); ierr = PetscObjectQueryFunction((PetscObject)pc,"PCRedundantSetScatter_C",(void (**)(void))&f);CHKERRQ(ierr); if (f) { ierr = (*f)(pc,in,out);CHKERRQ(ierr); } PetscFunctionReturn(0); }
EXTERN_C_END #undef __FUNCT__ #define __FUNCT__ "PCRedundantSetNumber" /*@ PCRedundantSetNumber - Sets the number of redundant preconditioner contexts. Collective on PC Input Parameters: + pc - the preconditioner context - nredundant - number of redundant preconditioner contexts; for example if you are using 64 MPI processes and use an nredundant of 4 there will be 4 parallel solves each on 16 = 64/4 processes. Level: advanced .keywords: PC, redundant solve @*/ PetscErrorCode PETSCKSP_DLLEXPORT PCRedundantSetNumber(PC pc,PetscInt nredundant) { PetscErrorCode ierr,(*f)(PC,PetscInt); PetscFunctionBegin; PetscValidHeaderSpecific(pc,PC_COOKIE,1); if (nredundant <= 0) SETERRQ1(PETSC_ERR_ARG_WRONG, "num of redundant pc %D must be positive",nredundant); ierr = PetscObjectQueryFunction((PetscObject)pc,"PCRedundantSetNumber_C",(void (**)(void))&f);CHKERRQ(ierr); if (f) { ierr = (*f)(pc,nredundant);CHKERRQ(ierr); } PetscFunctionReturn(0); }
/*@ MatGetSchurComplement - Obtain the Schur complement from eliminating part of the matrix in another part. Collective on Mat Input Parameters: + A - matrix in which the complement is to be taken . isrow0 - rows to eliminate . iscol0 - columns to eliminate, (isrow0,iscol0) should be square and nonsingular . isrow1 - rows in which the Schur complement is formed . iscol1 - columns in which the Schur complement is formed . mreuse - MAT_INITIAL_MATRIX or MAT_REUSE_MATRIX, use MAT_IGNORE_MATRIX to put nothing in S . plump - the type of approximation used for the inverse of the (0,0) block used in forming Sp: MAT_SCHUR_COMPLEMENT_AINV_DIAG or MAT_SCHUR_COMPLEMENT_AINV_LUMP - preuse - MAT_INITIAL_MATRIX or MAT_REUSE_MATRIX, use MAT_IGNORE_MATRIX to put nothing in Sp Output Parameters: + S - exact Schur complement, often of type MATSCHURCOMPLEMENT which is difficult to use for preconditioning - Sp - approximate Schur complement suitable for preconditioning Note: Since the real Schur complement is usually dense, providing a good approximation to newpmat usually requires application-specific information. The default for assembled matrices is to use the inverse of the diagonal of the (0,0) block A00 in place of A00^{-1}. This rarely produce a scalable algorithm. Optionally, A00 can be lumped before forming inv(diag(A00)). Sometimes users would like to provide problem-specific data in the Schur complement, usually only for special row and column index sets. In that case, the user should call PetscObjectComposeFunction() to set "MatNestGetSubMat_C" to their function. If their function needs to fall back to the default implementation, it should call MatGetSchurComplement_Basic(). Level: advanced Concepts: matrices^submatrices .seealso: MatGetSubMatrix(), PCFIELDSPLIT, MatCreateSchurComplement(), MatSchurComplementAinvType @*/ PetscErrorCode MatGetSchurComplement(Mat A,IS isrow0,IS iscol0,IS isrow1,IS iscol1,MatReuse mreuse,Mat *S,MatSchurComplementAinvType ainvtype,MatReuse preuse,Mat *Sp) { PetscErrorCode ierr,(*f)(Mat,IS,IS,IS,IS,MatReuse,Mat*,MatReuse,Mat*) = NULL; PetscFunctionBegin; PetscValidHeaderSpecific(A,MAT_CLASSID,1); PetscValidHeaderSpecific(isrow0,IS_CLASSID,2); PetscValidHeaderSpecific(iscol0,IS_CLASSID,3); PetscValidHeaderSpecific(isrow1,IS_CLASSID,4); PetscValidHeaderSpecific(iscol1,IS_CLASSID,5); if (mreuse == MAT_REUSE_MATRIX) PetscValidHeaderSpecific(*S,MAT_CLASSID,7); if (preuse == MAT_REUSE_MATRIX) PetscValidHeaderSpecific(*Sp,MAT_CLASSID,9); PetscValidType(A,1); if (A->factortype) SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); f = NULL; if (mreuse == MAT_REUSE_MATRIX) { /* This is the only situation, in which we can demand that the user pass a non-NULL pointer to non-garbage in S. */ ierr = PetscObjectQueryFunction((PetscObject)*S,"MatGetSchurComplement_C",&f);CHKERRQ(ierr); } if (f) { ierr = (*f)(A,isrow0,iscol0,isrow1,iscol1,mreuse,S,preuse,Sp);CHKERRQ(ierr); } else { ierr = MatGetSchurComplement_Basic(A,isrow0,iscol0,isrow1,iscol1,mreuse,S,ainvtype,preuse,Sp);CHKERRQ(ierr); } PetscFunctionReturn(0); }
EXTERN_C_END #undef __FUNCT__ #define __FUNCT__ "MatMPIAdjSetPreallocation" /*@C MatMPIAdjSetPreallocation - Sets the array used for storing the matrix elements Collective on MPI_Comm Input Parameters: + A - the matrix . i - the indices into j for the start of each row . j - the column indices for each row (sorted for each row). The indices in i and j start with zero (NOT with one). - values - [optional] edge weights Level: intermediate .seealso: MatCreate(), MatCreateMPIAdj(), MatSetValues() @*/ PetscErrorCode PETSCMAT_DLLEXPORT MatMPIAdjSetPreallocation(Mat B,PetscInt *i,PetscInt *j,PetscInt *values) { PetscErrorCode ierr,(*f)(Mat,PetscInt*,PetscInt*,PetscInt*); PetscFunctionBegin; ierr = PetscObjectQueryFunction((PetscObject)B,"MatMPIAdjSetPreallocation_C",(void (**)(void))&f);CHKERRQ(ierr); if (f) { ierr = (*f)(B,i,j,values);CHKERRQ(ierr); } PetscFunctionReturn(0); }
/*@ SNESNASMGetDamping - Gets the update damping for NASM Not Collective Input Parameters: + SNES - the SNES context - dmp - damping Level: intermediate .keywords: SNES, NASM, damping .seealso: SNESNASM, SNESNASMSetDamping() @*/ PetscErrorCode SNESNASMGetDamping(SNES snes,PetscReal *dmp) { PetscErrorCode (*f)(SNES,PetscReal*); PetscErrorCode ierr; PetscFunctionBegin; ierr = PetscObjectQueryFunction((PetscObject)snes,"SNESNASMGetDamping_C",(void (**)(void))&f);CHKERRQ(ierr); if (f) {ierr = (f)(snes,dmp);CHKERRQ(ierr);} PetscFunctionReturn(0); }
/*@ SNESNASMSetComputeFinalJacobian - Schedules the computation of the global and subdomain jacobians upon convergence Collective on SNES Input Parameters: + SNES - the SNES context - flg - indication of whether to compute the jacobians or not Level: developer Notes: This is used almost exclusively in the implementation of ASPIN, where the converged subdomain and global jacobian is needed at each linear iteration. .keywords: SNES, NASM, ASPIN .seealso: SNESNASM, SNESNASMGetSubdomains() @*/ PetscErrorCode SNESNASMSetComputeFinalJacobian(SNES snes,PetscBool flg) { PetscErrorCode (*f)(SNES,PetscBool); PetscErrorCode ierr; PetscFunctionBegin; ierr = PetscObjectQueryFunction((PetscObject)snes,"SNESNASMSetComputeFinalJacobian_C",&f);CHKERRQ(ierr); if (f) {ierr = (f)(snes,flg);CHKERRQ(ierr);} PetscFunctionReturn(0); }
/*@ SNESNASMGetSubdomains - Get the local subdomain context. Not Collective Input Parameters: . SNES - the SNES context Output Parameters: + n - the number of local subdomains . subsnes - solvers defined on the local subdomains . iscatter - scatters into the nonoverlapping portions of the local subdomains . oscatter - scatters into the overlapping portions of the local subdomains - gscatter - scatters into the (ghosted) local vector of the local subdomain Level: intermediate .keywords: SNES, NASM .seealso: SNESNASM, SNESNASMSetSubdomains() @*/ PetscErrorCode SNESNASMGetSubdomains(SNES snes,PetscInt *n,SNES *subsnes[],VecScatter *iscatter[],VecScatter *oscatter[],VecScatter *gscatter[]) { PetscErrorCode ierr; PetscErrorCode (*f)(SNES,PetscInt*,SNES**,VecScatter**,VecScatter**,VecScatter**); PetscFunctionBegin; ierr = PetscObjectQueryFunction((PetscObject)snes,"SNESNASMGetSubdomains_C",&f);CHKERRQ(ierr); if (f) {ierr = (f)(snes,n,subsnes,iscatter,oscatter,gscatter);CHKERRQ(ierr);} PetscFunctionReturn(0); }
/*@ SNESNASMGetSubdomainVecs - Get the processor-local subdomain vectors Not Collective Input Parameters: . SNES - the SNES context Output Parameters: + n - the number of local subdomains . x - The subdomain solution vector . y - The subdomain step vector . b - The subdomain RHS vector - xl - The subdomain local vectors (ghosted) Level: developer .keywords: SNES, NASM .seealso: SNESNASM, SNESNASMGetSubdomains() @*/ PetscErrorCode SNESNASMGetSubdomainVecs(SNES snes,PetscInt *n,Vec **x,Vec **y,Vec **b, Vec **xl) { PetscErrorCode ierr; PetscErrorCode (*f)(SNES,PetscInt*,Vec**,Vec**,Vec**,Vec**); PetscFunctionBegin; ierr = PetscObjectQueryFunction((PetscObject)snes,"SNESNASMGetSubdomainVecs_C",&f);CHKERRQ(ierr); if (f) {ierr = (f)(snes,n,x,y,b,xl);CHKERRQ(ierr);} PetscFunctionReturn(0); }
/*@C SNESVISetComputeVariableBounds - Sets a function that is called to compute the variable bounds Input parameter + snes - the SNES context - compute - computes the bounds Level: advanced .seealso: SNESVISetVariableBounds() @*/ PetscErrorCode SNESVISetComputeVariableBounds(SNES snes, PetscErrorCode (*compute)(SNES,Vec,Vec)) { PetscErrorCode ierr,(*f)(SNES,PetscErrorCode (*)(SNES,Vec,Vec)); PetscFunctionBegin; PetscValidHeaderSpecific(snes,SNES_CLASSID,1); ierr = PetscObjectQueryFunction((PetscObject)snes,"SNESVISetComputeVariableBounds_C",&f);CHKERRQ(ierr); if (!f) {ierr = SNESSetType(snes,SNESVINEWTONRSLS);CHKERRQ(ierr);} ierr = PetscUseMethod(snes,"SNESVISetComputeVariableBounds_C",(SNES,PetscErrorCode (*)(SNES,Vec,Vec)),(snes,compute));CHKERRQ(ierr); PetscFunctionReturn(0); }
/*@ TSSundialsSetGMRESRestart - Sets the dimension of the Krylov space used by GMRES in the linear solver in SUNDIALS. SUNDIALS DOES NOT use restarted GMRES so this is ALSO the maximum number of GMRES steps that will be used. Collective on TS Input parameters: + ts - the time-step context - restart - number of direction vectors (the restart size). Level: advanced .keywords: GMRES, restart .seealso: TSSundialsGetIterations(), TSSundialsSetType(), TSSundialsSetLinearTolerance(), TSSundialsSetGramSchmidtType(), TSSundialsSetTolerance(), TSSundialsGetIterations(), TSSundialsSetType(), TSSundialsSetGMRESRestart(), TSSundialsSetLinearTolerance(), TSSundialsSetTolerance(), TSSundialsGetPC(), TSSundialsSetExactFinalTime() @*/ PetscErrorCode PETSCTS_DLLEXPORT TSSundialsSetGMRESRestart(TS ts,int restart) { PetscErrorCode ierr,(*f)(TS,int); PetscFunctionBegin; ierr = PetscObjectQueryFunction((PetscObject)ts,"TSSundialsSetGMRESRestart_C",(void (**)(void))&f);CHKERRQ(ierr); if (f) { ierr = (*f)(ts,restart);CHKERRQ(ierr); } PetscFunctionReturn(0); }
/*@ TSSundialsMonitorInternalSteps - Monitor Sundials internal steps (Defaults to false). Input Parameter: + ts - the time-step context - ft - PETSC_TRUE if monitor, else PETSC_FALSE Level: beginner .seealso:TSSundialsGetIterations(), TSSundialsSetType(), TSSundialsSetGMRESRestart(), TSSundialsSetLinearTolerance(), TSSundialsSetGramSchmidtType(), TSSundialsSetTolerance(), TSSundialsGetIterations(), TSSundialsSetType(), TSSundialsSetGMRESRestart(), TSSundialsSetLinearTolerance(), TSSundialsSetTolerance(), TSSundialsGetPC() @*/ PetscErrorCode PETSCTS_DLLEXPORT TSSundialsMonitorInternalSteps(TS ts,PetscTruth ft) { PetscErrorCode ierr,(*f)(TS,PetscTruth); PetscFunctionBegin; ierr = PetscObjectQueryFunction((PetscObject)ts,"TSSundialsMonitorInternalSteps_C",(void (**)(void))&f);CHKERRQ(ierr); if (f) { ierr = (*f)(ts,ft);CHKERRQ(ierr); } PetscFunctionReturn(0); }
/*@ TSSundialsSetTolerance - Sets the absolute and relative tolerance used by Sundials for error control. Collective on TS Input parameters: + ts - the time-step context . aabs - the absolute tolerance - rel - the relative tolerance See the Cvode/Sundials users manual for exact details on these parameters. Essentially these regulate the size of the error for a SINGLE timestep. Level: intermediate .keywords: Sundials, tolerance .seealso: TSSundialsGetIterations(), TSSundialsSetType(), TSSundialsSetGMRESRestart(), TSSundialsSetLinearTolerance(), TSSundialsSetGramSchmidtType(), TSSundialsGetIterations(), TSSundialsSetType(), TSSundialsSetGMRESRestart(), TSSundialsSetLinearTolerance(), TSSundialsSetTolerance(), TSSundialsGetPC(), TSSundialsSetExactFinalTime() @*/ PetscErrorCode PETSCTS_DLLEXPORT TSSundialsSetTolerance(TS ts,double aabs,double rel) { PetscErrorCode ierr,(*f)(TS,double,double); PetscFunctionBegin; ierr = PetscObjectQueryFunction((PetscObject)ts,"TSSundialsSetTolerance_C",(void (**)(void))&f);CHKERRQ(ierr); if (f) { ierr = (*f)(ts,aabs,rel);CHKERRQ(ierr); } PetscFunctionReturn(0); }
/*@ TSSundialsSetGramSchmidtType - Sets type of orthogonalization used in GMRES method by SUNDIALS linear solver. Collective on TS Input parameters: + ts - the time-step context - type - either SUNDIALS_MODIFIED_GS or SUNDIALS_CLASSICAL_GS Level: advanced .keywords: Sundials, orthogonalization .seealso: TSSundialsGetIterations(), TSSundialsSetType(), TSSundialsSetGMRESRestart(), TSSundialsSetLinearTolerance(), TSSundialsSetTolerance(), TSSundialsGetIterations(), TSSundialsSetType(), TSSundialsSetGMRESRestart(), TSSundialsSetLinearTolerance(), TSSundialsSetTolerance(), TSSundialsGetPC(), TSSundialsSetExactFinalTime() @*/ PetscErrorCode PETSCTS_DLLEXPORT TSSundialsSetGramSchmidtType(TS ts,TSSundialsGramSchmidtType type) { PetscErrorCode ierr,(*f)(TS,TSSundialsGramSchmidtType); PetscFunctionBegin; ierr = PetscObjectQueryFunction((PetscObject)ts,"TSSundialsSetGramSchmidtType_C",(void (**)(void))&f);CHKERRQ(ierr); if (f) { ierr = (*f)(ts,type);CHKERRQ(ierr); } PetscFunctionReturn(0); }
/*@ KSPGMRESSetPreAllocateVectors - Causes GMRES and FGMRES to preallocate all its needed work vectors at initial setup rather than the default, which is to allocate them in chunks when needed. Collective on KSP Input Parameter: . ksp - iterative context obtained from KSPCreate Options Database Key: . -ksp_gmres_preallocate - Activates KSPGmresSetPreAllocateVectors() Level: intermediate .keywords: GMRES, preallocate, vectors .seealso: KSPGMRESSetRestart(), KSPGMRESSetOrthogonalization() @*/ PetscErrorCode PETSCKSP_DLLEXPORT KSPGMRESSetPreAllocateVectors(KSP ksp) { PetscErrorCode ierr,(*f)(KSP); PetscFunctionBegin; ierr = PetscObjectQueryFunction((PetscObject)ksp,"KSPGMRESSetPreAllocateVectors_C",(void (**)(void))&f);CHKERRQ(ierr); if (f) { ierr = (*f)(ksp);CHKERRQ(ierr); } PetscFunctionReturn(0); }
/* this routines queries the already registered MatScaleUserImp_XXX implementations for the given matrix, and calls the correct routine. i.e if MatType is SeqAIJ, MatScaleUserImpl_SeqAIJ() gets called, and if MatType is MPIAIJ, MatScaleUserImpl_MPIAIJ() gets called */ PetscErrorCode MatScaleUserImpl(Mat mat,PetscScalar a) { PetscErrorCode ierr,(*f)(Mat,PetscScalar); PetscFunctionBegin; ierr = PetscObjectQueryFunction((PetscObject)mat,"MatScaleUserImpl_C",&f);CHKERRQ(ierr); if (f) { ierr = (*f)(mat,a);CHKERRQ(ierr); } PetscFunctionReturn(0); }
dErr dViewerDHMSetTimeUnits(dViewer viewer,const char *units,dReal scale) { dErr err,(*r)(dViewer,const char*,dReal); dFunctionBegin; err = PetscObjectQueryFunction((PetscObject)viewer,"dViewerDHMSetTimeUnits_C",(void(**)(void))&r);dCHK(err); if (r) { err = (*r)(viewer,units,scale);dCHK(err); } dFunctionReturn(0); }
dErr dViewerDHMSetTime(dViewer viewer,dReal time) { dErr err,(*r)(dViewer,dReal); dFunctionBegin; err = PetscObjectQueryFunction((PetscObject)viewer,"dViewerDHMSetTime_C",(void(**)(void))&r);dCHK(err); if (r) { err = (*r)(viewer,time);dCHK(err); } dFunctionReturn(0); }
/*@ KSPRichardsonSetScale - Set the damping factor; if this routine is not called, the factor defaults to 1.0. Collective on KSP Input Parameters: + ksp - the iterative context - scale - the relaxation factor Level: intermediate .keywords: KSP, Richardson, set, scale @*/ PetscErrorCode PETSCKSP_DLLEXPORT KSPRichardsonSetScale(KSP ksp,PetscReal scale) { PetscErrorCode ierr,(*f)(KSP,PetscReal); PetscFunctionBegin; PetscValidHeaderSpecific(ksp,KSP_COOKIE,1); ierr = PetscObjectQueryFunction((PetscObject)ksp,"KSPRichardsonSetScale_C",(void (**)(void))&f);CHKERRQ(ierr); if (f) { ierr = (*f)(ksp,scale);CHKERRQ(ierr); } PetscFunctionReturn(0); }
/*@ PetscMatlabEnginePut - Puts a Petsc object into the MATLAB space. For parallel objects, each processors part is put in a separate MATLAB process. Collective on PetscObject Input Parameters: + mengine - the MATLAB engine - object - the PETSc object, for example Vec Level: advanced .seealso: PetscMatlabEngineDestroy(), PetscMatlabEngineCreate(), PetscMatlabEngineGet(), PetscMatlabEngineEvaluate(), PetscMatlabEngineGetOutput(), PetscMatlabEnginePrintOutput(), PETSC_MATLAB_ENGINE_(), PetscMatlabEnginePutArray(), MatlabEngineGetArray(), PetscMatlabEngine @*/ PetscErrorCode PetscMatlabEnginePut(PetscMatlabEngine mengine,PetscObject obj) { PetscErrorCode ierr,(*put)(PetscObject,void*); PetscFunctionBegin; ierr = PetscObjectQueryFunction(obj,"PetscMatlabEnginePut_C",&put);CHKERRQ(ierr); if (!put) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"Object %s cannot be put into MATLAB engine",obj->class_name); ierr = PetscInfo(0,"Putting MATLAB object\n");CHKERRQ(ierr); ierr = (*put)(obj,mengine->ep);CHKERRQ(ierr); ierr = PetscInfo1(0,"Put MATLAB object: %s\n",obj->name);CHKERRQ(ierr); PetscFunctionReturn(0); }
/*@C PCShellSetApplyRichardson - Sets routine to use as preconditioner in Richardson iteration. Collective on PC Input Parameters: + pc - the preconditioner context - apply - the application-provided preconditioning routine Calling sequence of apply: .vb PetscErrorCode apply (PC pc,Vec b,Vec x,Vec r,PetscReal rtol,PetscReal abstol,PetscReal dtol,PetscInt maxits) .ve + pc - the preconditioner, get the application context with PCShellGetContext() . b - right-hand-side . x - current iterate . r - work space . rtol - relative tolerance of residual norm to stop at . abstol - absolute tolerance of residual norm to stop at . dtol - if residual norm increases by this factor than return - maxits - number of iterations to run Notes: the function MUST return an error code of 0 on success and nonzero on failure. Level: developer .keywords: PC, shell, set, apply, Richardson, user-provided .seealso: PCShellSetApply(), PCShellSetContext() @*/ PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetApplyRichardson(PC pc,PetscErrorCode (*apply)(PC,Vec,Vec,Vec,PetscReal,PetscReal,PetscReal,PetscInt,PetscTruth,PetscInt*,PCRichardsonConvergedReason*)) { PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(PC,Vec,Vec,Vec,PetscReal,PetscReal,PetscReal,PetscInt,PetscTruth,PetscInt*,PCRichardsonConvergedReason*)); PetscFunctionBegin; PetscValidHeaderSpecific(pc,PC_COOKIE,1); ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetApplyRichardson_C",(void (**)(void))&f);CHKERRQ(ierr); if (f) { ierr = (*f)(pc,apply);CHKERRQ(ierr); } PetscFunctionReturn(0); }
/*@C PCShellSetName - Sets an optional name to associate with a shell preconditioner. Not Collective Input Parameters: + pc - the preconditioner context - name - character string describing shell preconditioner Level: developer .keywords: PC, shell, set, name, user-provided .seealso: PCShellGetName() @*/ PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetName(PC pc,const char name[]) { PetscErrorCode ierr,(*f)(PC,const char []); PetscFunctionBegin; PetscValidHeaderSpecific(pc,PC_COOKIE,1); ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetName_C",(void (**)(void))&f);CHKERRQ(ierr); if (f) { ierr = (*f)(pc,name);CHKERRQ(ierr); } PetscFunctionReturn(0); }
/*@C PCShellSetPostSolve - Sets routine to apply to the operators/vectors before a KSPSolve() is applied. This usually does something like scale the linear system in some application specific way. Collective on PC Input Parameters: + pc - the preconditioner context - postsolve - the application-provided presolve routine Calling sequence of postsolve: .vb PetscErrorCode postsolve(PC,KSP ksp,Vec b,Vec x) .ve + pc - the preconditioner, get the application context with PCShellGetContext() . xin - input vector - xout - output vector Notes: the function MUST return an error code of 0 on success and nonzero on failure. Level: developer .keywords: PC, shell, set, apply, user-provided .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApplyTranspose(), PCShellSetPreSolve(), PCShellSetContext() @*/ PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetPostSolve(PC pc,PetscErrorCode (*postsolve)(PC,KSP,Vec,Vec)) { PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(PC,KSP,Vec,Vec)); PetscFunctionBegin; PetscValidHeaderSpecific(pc,PC_COOKIE,1); ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetPostSolve_C",(void (**)(void))&f);CHKERRQ(ierr); if (f) { ierr = (*f)(pc,postsolve);CHKERRQ(ierr); } PetscFunctionReturn(0); }
/*@C PCShellSetApplyBA - Sets routine to use as preconditioner times operator. Collective on PC Input Parameters: + pc - the preconditioner context - applyBA - the application-provided BA routine Calling sequence of apply: .vb PetscErrorCode applyBA (PC pc,Vec xin,Vec xout) .ve + pc - the preconditioner, get the application context with PCShellGetContext() . xin - input vector - xout - output vector Notes: the function MUST return an error code of 0 on success and nonzero on failure. Level: developer .keywords: PC, shell, set, apply, user-provided .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApplyTranspose(), PCShellSetContext(), PCShellSetApply() @*/ PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetApplyBA(PC pc,PetscErrorCode (*applyBA)(PC,PCSide,Vec,Vec,Vec)) { PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(PC,PCSide,Vec,Vec,Vec)); PetscFunctionBegin; PetscValidHeaderSpecific(pc,PC_COOKIE,1); ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetApplyBA_C",(void (**)(void))&f);CHKERRQ(ierr); if (f) { ierr = (*f)(pc,applyBA);CHKERRQ(ierr); } PetscFunctionReturn(0); }
/*@C PCShellSetView - Sets routine to use as viewer of shell preconditioner Collective on PC Input Parameters: + pc - the preconditioner context - view - the application-provided view routine Calling sequence of apply: .vb PetscErrorCode view(PC pc,PetscViewer v) .ve + pc - the preconditioner, get the application context with PCShellGetContext() - v - viewer Notes: the function MUST return an error code of 0 on success and nonzero on failure. Level: developer .keywords: PC, shell, set, apply, user-provided .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApplyTranspose() @*/ PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetView(PC pc,PetscErrorCode (*view)(PC,PetscViewer)) { PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(PC,PetscViewer)); PetscFunctionBegin; PetscValidHeaderSpecific(pc,PC_COOKIE,1); ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetView_C",(void (**)(void))&f);CHKERRQ(ierr); if (f) { ierr = (*f)(pc,view);CHKERRQ(ierr); } PetscFunctionReturn(0); }
/*@ PCEisenstatNoDiagonalScaling - Causes the Eisenstat preconditioner not to do additional diagonal preconditioning. For matrices with a constant along the diagonal, this may save a small amount of work. Collective on PC Input Parameter: . pc - the preconditioner context Options Database Key: . -pc_eisenstat_no_diagonal_scaling - Activates PCEisenstatNoDiagonalScaling() Level: intermediate Note: If you use the KPSSetDiagonalScaling() or -ksp_diagonal_scale option then you will likley want to use this routine since it will save you some unneeded flops. .keywords: PC, Eisenstat, use, diagonal, scaling, SSOR .seealso: PCEisenstatSetOmega() @*/ PetscErrorCode PETSCKSP_DLLEXPORT PCEisenstatNoDiagonalScaling(PC pc) { PetscErrorCode ierr,(*f)(PC); PetscFunctionBegin; PetscValidHeaderSpecific(pc,PC_COOKIE,1); ierr = PetscObjectQueryFunction((PetscObject)pc,"PCEisenstatNoDiagonalScaling_C",(void (**)(void))&f);CHKERRQ(ierr); if (f) { ierr = (*f)(pc);CHKERRQ(ierr); } PetscFunctionReturn(0); }
/*@ PCKSPGetKSP - Gets the KSP context for a KSP PC. Not Collective but KSP returned is parallel if PC was parallel Input Parameter: . pc - the preconditioner context Output Parameters: . ksp - the PC solver Notes: You must call KSPSetUp() before calling PCKSPGetKSP(). Level: advanced .keywords: PC, KSP, get, context @*/ PetscErrorCode PETSCKSP_DLLEXPORT PCKSPGetKSP(PC pc,KSP *ksp) { PetscErrorCode ierr,(*f)(PC,KSP*); PetscFunctionBegin; PetscValidHeaderSpecific(pc,PC_COOKIE,1); PetscValidPointer(ksp,2); ierr = PetscObjectQueryFunction((PetscObject)pc,"PCKSPGetKSP_C",(void (**)(void))&f);CHKERRQ(ierr); if (f) { ierr = (*f)(pc,ksp);CHKERRQ(ierr); } PetscFunctionReturn(0); }