/* PetscDLLibraryRegister - This function is called when the dynamic library it is in is opened. This one registers all the matrix methods that are in the basic PETSc Matrix library. */ PETSC_EXTERN PetscErrorCode PetscDLLibraryRegister_petscmat(void) { PetscErrorCode ierr; PetscFunctionBegin; ierr = MatInitializePackage();CHKERRQ(ierr); PetscFunctionReturn(0); }
/*@C MatMFFDRegister - Adds a method to the MatMFFD registry. Not Collective Input Parameters: + name_solver - name of a new user-defined compute-h module - routine_create - routine to create method context Level: developer Notes: MatMFFDRegister() may be called multiple times to add several user-defined solvers. Sample usage: .vb MatMFFDRegister("my_h",MyHCreate); .ve Then, your solver can be chosen with the procedural interface via $ MatMFFDSetType(mfctx,"my_h") or at runtime via the option $ -mat_mffd_type my_h .keywords: MatMFFD, register .seealso: MatMFFDRegisterAll(), MatMFFDRegisterDestroy() @*/ PetscErrorCode MatMFFDRegister(const char sname[],PetscErrorCode (*function)(MatMFFD)) { PetscErrorCode ierr; PetscFunctionBegin; ierr = MatInitializePackage();CHKERRQ(ierr); ierr = PetscFunctionListAdd(&MatMFFDList,sname,function);CHKERRQ(ierr); PetscFunctionReturn(0); }
/*@ MatCoarsenCreate - Creates a coarsen context. Collective on MPI_Comm Input Parameter: . comm - MPI communicator Output Parameter: . newcrs - location to put the context Level: beginner .keywords: Coarsen, create, context .seealso: MatCoarsenSetType(), MatCoarsenApply(), MatCoarsenDestroy(), MatCoarsenSetAdjacency() @*/ PetscErrorCode MatCoarsenCreate(MPI_Comm comm, MatCoarsen *newcrs) { MatCoarsen agg; PetscErrorCode ierr; PetscFunctionBegin; *newcrs = 0; ierr = MatInitializePackage();CHKERRQ(ierr); ierr = PetscHeaderCreate(agg, _p_MatCoarsen, struct _MatCoarsenOps, MAT_COARSEN_CLASSID,"MatCoarsen","Matrix/graph coarsen", "MatCoarsen", comm, MatCoarsenDestroy, MatCoarsenView);CHKERRQ(ierr); *newcrs = agg; PetscFunctionReturn(0); }
/*@ MatCreate - Creates a matrix where the type is determined from either a call to MatSetType() or from the options database with a call to MatSetFromOptions(). The default matrix type is AIJ, using the routines MatCreateSeqAIJ() or MatCreateAIJ() if you do not set a type in the options database. If you never call MatSetType() or MatSetFromOptions() it will generate an error when you try to use the matrix. Collective on MPI_Comm Input Parameter: . comm - MPI communicator Output Parameter: . A - the matrix Options Database Keys: + -mat_type seqaij - AIJ type, uses MatCreateSeqAIJ() . -mat_type mpiaij - AIJ type, uses MatCreateAIJ() . -mat_type seqdense - dense type, uses MatCreateSeqDense() . -mat_type mpidense - dense type, uses MatCreateDense() . -mat_type seqbaij - block AIJ type, uses MatCreateSeqBAIJ() - -mat_type mpibaij - block AIJ type, uses MatCreateBAIJ() Even More Options Database Keys: See the manpages for particular formats (e.g., MatCreateSeqAIJ()) for additional format-specific options. Notes: Level: beginner User manual sections: + sec_matcreate - chapter_matrices .keywords: matrix, create .seealso: MatCreateSeqAIJ(), MatCreateAIJ(), MatCreateSeqDense(), MatCreateDense(), MatCreateSeqBAIJ(), MatCreateBAIJ(), MatCreateSeqSBAIJ(), MatCreateSBAIJ(), MatConvert() @*/ PetscErrorCode MatCreate(MPI_Comm comm,Mat *A) { Mat B; PetscErrorCode ierr; PetscFunctionBegin; PetscValidPointer(A,2); *A = NULL; ierr = MatInitializePackage();CHKERRQ(ierr); ierr = PetscHeaderCreate(B,_p_Mat,struct _MatOps,MAT_CLASSID,"Mat","Matrix","Mat",comm,MatDestroy,MatView);CHKERRQ(ierr); ierr = PetscLayoutCreate(comm,&B->rmap);CHKERRQ(ierr); ierr = PetscLayoutCreate(comm,&B->cmap);CHKERRQ(ierr); B->preallocated = PETSC_FALSE; *A = B; PetscFunctionReturn(0); }
/*@ MatCreate - Creates a matrix where the type is determined from either a call to MatSetType() or from the options database with a call to MatSetFromOptions(). The default matrix type is AIJ, using the routines MatCreateSeqAIJ() or MatCreateMPIAIJ() if you do not set a type in the options database. If you never call MatSetType() or MatSetFromOptions() it will generate an error when you try to use the matrix. Collective on MPI_Comm Input Parameter: . comm - MPI communicator Output Parameter: . A - the matrix Options Database Keys: + -mat_type seqaij - AIJ type, uses MatCreateSeqAIJ() . -mat_type mpiaij - AIJ type, uses MatCreateMPIAIJ() . -mat_type seqdense - dense type, uses MatCreateSeqDense() . -mat_type mpidense - dense type, uses MatCreateMPIDense() . -mat_type seqbaij - block AIJ type, uses MatCreateSeqBAIJ() - -mat_type mpibaij - block AIJ type, uses MatCreateMPIBAIJ() Even More Options Database Keys: See the manpages for particular formats (e.g., MatCreateSeqAIJ()) for additional format-specific options. Notes: Level: beginner User manual sections: + sec_matcreate - chapter_matrices .keywords: matrix, create .seealso: MatCreateSeqAIJ(), MatCreateMPIAIJ(), MatCreateSeqDense(), MatCreateMPIDense(), MatCreateSeqBAIJ(), MatCreateMPIBAIJ(), MatCreateSeqSBAIJ(), MatCreateMPISBAIJ(), MatConvert() @*/ PetscErrorCode PETSCMAT_DLLEXPORT MatCreate(MPI_Comm comm,Mat *A) { Mat B; PetscErrorCode ierr; PetscFunctionBegin; PetscValidPointer(A,2); *A = PETSC_NULL; #ifndef PETSC_USE_DYNAMIC_LIBRARIES ierr = MatInitializePackage(PETSC_NULL);CHKERRQ(ierr); #endif ierr = PetscHeaderCreate(B,_p_Mat,struct _MatOps,MAT_COOKIE,0,"Mat",comm,MatDestroy,MatView);CHKERRQ(ierr); ierr = PetscLayoutCreate(comm,&B->rmap);CHKERRQ(ierr); ierr = PetscLayoutCreate(comm,&B->cmap);CHKERRQ(ierr); B->preallocated = PETSC_FALSE; *A = B; PetscFunctionReturn(0); }
/*@ MatPartitioningCreate - Creates a partitioning context. Collective on MPI_Comm Input Parameter: . comm - MPI communicator Output Parameter: . newp - location to put the context Level: beginner .keywords: Partitioning, create, context .seealso: MatPartitioningSetType(), MatPartitioningApply(), MatPartitioningDestroy(), MatPartitioningSetAdjacency() @*/ PetscErrorCode MatPartitioningCreate(MPI_Comm comm,MatPartitioning *newp) { MatPartitioning part; PetscErrorCode ierr; PetscMPIInt size; PetscFunctionBegin; *newp = 0; #if !defined(PETSC_USE_DYNAMIC_LIBRARIES) ierr = MatInitializePackage();CHKERRQ(ierr); #endif ierr = PetscHeaderCreate(part,_p_MatPartitioning,struct _MatPartitioningOps,MAT_PARTITIONING_CLASSID,"MatPartitioning","Matrix/graph partitioning","MatOrderings",comm,MatPartitioningDestroy,MatPartitioningView);CHKERRQ(ierr); part->vertex_weights = NULL; part->part_weights = NULL; ierr = MPI_Comm_size(comm,&size);CHKERRQ(ierr); part->n = (PetscInt)size; *newp = part; PetscFunctionReturn(0); }
/*@ MatNullSpaceCreate - Creates a data structure used to project vectors out of null spaces. Collective on MPI_Comm Input Parameters: + comm - the MPI communicator associated with the object . has_cnst - PETSC_TRUE if the null space contains the constant vector; otherwise PETSC_FALSE . n - number of vectors (excluding constant vector) in null space - vecs - the vectors that span the null space (excluding the constant vector); these vectors must be orthonormal. These vectors are NOT copied, so do not change them after this call. You should free the array that you pass in and destroy the vectors (this will reduce the reference count for them by one). Output Parameter: . SP - the null space context Level: advanced Notes: See MatNullSpaceSetFunction() as an alternative way of providing the null space information instead of setting vecs. If has_cnst is PETSC_TRUE you do not need to pass a constant vector in as a fourth argument to this routine, nor do you need to pass in a function that eliminates the constant function into MatNullSpaceSetFunction(). Users manual sections: . sec_singular .keywords: PC, null space, create .seealso: MatNullSpaceDestroy(), MatNullSpaceRemove(), KSPSetNullSpace(), MatNullSpace, MatNullSpaceSetFunction() @*/ PetscErrorCode MatNullSpaceCreate(MPI_Comm comm,PetscBool has_cnst,PetscInt n,const Vec vecs[],MatNullSpace *SP) { MatNullSpace sp; PetscErrorCode ierr; PetscInt i; PetscFunctionBegin; if (n < 0) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Number of vectors (given %D) cannot be negative",n); if (n) PetscValidPointer(vecs,4); for (i=0; i<n; i++) PetscValidHeaderSpecific(vecs[i],VEC_CLASSID,4); PetscValidPointer(SP,5); *SP = NULL; #if !defined(PETSC_USE_DYNAMIC_LIBRARIES) ierr = MatInitializePackage();CHKERRQ(ierr); #endif ierr = PetscHeaderCreate(sp,_p_MatNullSpace,int,MAT_NULLSPACE_CLASSID,"MatNullSpace","Null space","Mat",comm,MatNullSpaceDestroy,MatNullSpaceView);CHKERRQ(ierr); sp->has_cnst = has_cnst; sp->n = n; sp->vecs = 0; sp->alpha = 0; sp->remove = 0; sp->rmctx = 0; if (n) { ierr = PetscMalloc(n*sizeof(Vec),&sp->vecs);CHKERRQ(ierr); ierr = PetscMalloc(n*sizeof(PetscScalar),&sp->alpha);CHKERRQ(ierr); ierr = PetscLogObjectMemory(sp,n*(sizeof(Vec)+sizeof(PetscScalar)));CHKERRQ(ierr); for (i=0; i<n; i++) { ierr = PetscObjectReference((PetscObject)vecs[i]);CHKERRQ(ierr); sp->vecs[i] = vecs[i]; } } *SP = sp; PetscFunctionReturn(0); }
/*@ MatColoringCreate - Creates a matrix coloring context. Collective on MatColoring Input Parameters: . comm - MPI communicator Output Parameter: . mcptr - the new MatColoring context Options Database Keys: + -mat_coloring_type - the type of coloring algorithm used . -mat_coloring_maxcolors - the maximum number of relevant colors, all nodes not in a color are in maxcolors+1 . -mat_coloring_distance - compute a distance 1,2,... coloring. . -mat_coloring_view - print information about the coloring and the produced index sets - -mat_coloring_valid - debugging option that prints all coloring incompatibilities Level: beginner .keywords: Coloring, Matrix .seealso: MatColoring, MatColoringApply() @*/ PetscErrorCode MatColoringCreate(Mat m,MatColoring *mcptr) { MatColoring mc; PetscErrorCode ierr; PetscFunctionBegin; *mcptr = 0; #if !defined(PETSC_USE_DYNAMIC_LIBRARIES) ierr = MatInitializePackage();CHKERRQ(ierr); #endif ierr = PetscHeaderCreate(mc,_p_MatColoring, struct _MatColoringOps, MAT_COLORING_CLASSID,"MatColoring","Matrix coloring", "MatColoring",PetscObjectComm((PetscObject)m),MatColoringDestroy, MatColoringView);CHKERRQ(ierr); ierr = PetscObjectReference((PetscObject)m);CHKERRQ(ierr); mc->mat = m; mc->dist = 2; /* default to Jacobian computation case */ mc->maxcolors = IS_COLORING_MAX; *mcptr = mc; mc->valid = PETSC_FALSE; mc->weight_type = MAT_COLORING_WEIGHT_RANDOM; mc->user_weights = NULL; mc->user_lperm = NULL; PetscFunctionReturn(0); }
/*@C MatNullSpaceCreate - Creates a data structure used to project vectors out of null spaces. Collective on MPI_Comm Input Parameters: + comm - the MPI communicator associated with the object . has_cnst - PETSC_TRUE if the null space contains the constant vector; otherwise PETSC_FALSE . n - number of vectors (excluding constant vector) in null space - vecs - the vectors that span the null space (excluding the constant vector); these vectors must be orthonormal. These vectors are NOT copied, so do not change them after this call. You should free the array that you pass in and destroy the vectors (this will reduce the reference count for them by one). Output Parameter: . SP - the null space context Level: advanced Notes: See MatNullSpaceSetFunction() as an alternative way of providing the null space information instead of setting vecs. If has_cnst is PETSC_TRUE you do not need to pass a constant vector in as a fourth argument to this routine, nor do you need to pass in a function that eliminates the constant function into MatNullSpaceSetFunction(). Users manual sections: . sec_singular .keywords: PC, null space, create .seealso: MatNullSpaceDestroy(), MatNullSpaceRemove(), MatSetNullSpace(), MatNullSpace, MatNullSpaceSetFunction() @*/ PetscErrorCode MatNullSpaceCreate(MPI_Comm comm,PetscBool has_cnst,PetscInt n,const Vec vecs[],MatNullSpace *SP) { MatNullSpace sp; PetscErrorCode ierr; PetscInt i; PetscFunctionBegin; if (n < 0) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Number of vectors (given %D) cannot be negative",n); if (n) PetscValidPointer(vecs,4); for (i=0; i<n; i++) PetscValidHeaderSpecific(vecs[i],VEC_CLASSID,4); PetscValidPointer(SP,5); if (n) { for (i=0; i<n; i++) { /* prevent the user from changes values in the vector */ ierr = VecLockPush(vecs[i]);CHKERRQ(ierr); } } #if defined(PETSC_USE_DEBUG) if (n) { PetscScalar *dots; for (i=0; i<n; i++) { PetscReal norm; ierr = VecNorm(vecs[i],NORM_2,&norm);CHKERRQ(ierr); if (PetscAbsReal(norm - 1) > PETSC_SQRT_MACHINE_EPSILON) SETERRQ2(PetscObjectComm((PetscObject)vecs[i]),PETSC_ERR_ARG_WRONG,"Vector %D must have 2-norm of 1.0, it is %g",i,(double)norm); } if (has_cnst) { for (i=0; i<n; i++) { PetscScalar sum; ierr = VecSum(vecs[i],&sum);CHKERRQ(ierr); if (PetscAbsScalar(sum) > PETSC_SQRT_MACHINE_EPSILON) SETERRQ2(PetscObjectComm((PetscObject)vecs[i]),PETSC_ERR_ARG_WRONG,"Vector %D must be orthogonal to constant vector, inner product is %g",i,(double)PetscAbsScalar(sum)); } } ierr = PetscMalloc1(n-1,&dots);CHKERRQ(ierr); for (i=0; i<n-1; i++) { PetscInt j; ierr = VecMDot(vecs[i],n-i-1,vecs+i+1,dots);CHKERRQ(ierr); for (j=0;j<n-i-1;j++) { if (PetscAbsScalar(dots[j]) > PETSC_SQRT_MACHINE_EPSILON) SETERRQ3(PetscObjectComm((PetscObject)vecs[i]),PETSC_ERR_ARG_WRONG,"Vector %D must be orthogonal to vector %D, inner product is %g",i,i+j+1,(double)PetscAbsScalar(dots[j])); } } PetscFree(dots);CHKERRQ(ierr); } #endif *SP = NULL; ierr = MatInitializePackage();CHKERRQ(ierr); ierr = PetscHeaderCreate(sp,MAT_NULLSPACE_CLASSID,"MatNullSpace","Null space","Mat",comm,MatNullSpaceDestroy,MatNullSpaceView);CHKERRQ(ierr); sp->has_cnst = has_cnst; sp->n = n; sp->vecs = 0; sp->alpha = 0; sp->remove = 0; sp->rmctx = 0; if (n) { ierr = PetscMalloc1(n,&sp->vecs);CHKERRQ(ierr); ierr = PetscMalloc1(n,&sp->alpha);CHKERRQ(ierr); ierr = PetscLogObjectMemory((PetscObject)sp,n*(sizeof(Vec)+sizeof(PetscScalar)));CHKERRQ(ierr); for (i=0; i<n; i++) { ierr = PetscObjectReference((PetscObject)vecs[i]);CHKERRQ(ierr); sp->vecs[i] = vecs[i]; } } *SP = sp; PetscFunctionReturn(0); }
/* PetscInitialize_DynamicLibraries - Adds the default dynamic link libraries to the search path. */ PETSC_INTERN PetscErrorCode PetscInitialize_DynamicLibraries(void) { char *libname[32]; PetscErrorCode ierr; PetscInt nmax,i; #if defined(PETSC_USE_DYNAMIC_LIBRARIES) && defined(PETSC_USE_SHARED_LIBRARIES) PetscBool preload; #endif PetscFunctionBegin; nmax = 32; ierr = PetscOptionsGetStringArray(NULL,NULL,"-dll_prepend",libname,&nmax,NULL);CHKERRQ(ierr); for (i=0; i<nmax; i++) { ierr = PetscDLLibraryPrepend(PETSC_COMM_WORLD,&PetscDLLibrariesLoaded,libname[i]);CHKERRQ(ierr); ierr = PetscFree(libname[i]);CHKERRQ(ierr); } #if !defined(PETSC_USE_DYNAMIC_LIBRARIES) || !defined(PETSC_USE_SHARED_LIBRARIES) /* This just initializes the most basic PETSc stuff. The classes, from PetscDraw to PetscTS, are initialized the first time an XXCreate() is called. */ ierr = PetscSysInitializePackage();CHKERRQ(ierr); #else preload = PETSC_FALSE; ierr = PetscOptionsGetBool(NULL,NULL,"-dynamic_library_preload",&preload,NULL);CHKERRQ(ierr); if (preload) { PetscBool found; #if defined(PETSC_USE_SINGLE_LIBRARY) ierr = PetscLoadDynamicLibrary("",&found);CHKERRQ(ierr); if (!found) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_FILE_OPEN,"Unable to locate PETSc dynamic library \n You cannot move the dynamic libraries!"); #else ierr = PetscLoadDynamicLibrary("sys",&found);CHKERRQ(ierr); if (!found) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_FILE_OPEN,"Unable to locate PETSc dynamic library \n You cannot move the dynamic libraries!"); ierr = PetscLoadDynamicLibrary("vec",&found);CHKERRQ(ierr); if (!found) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_FILE_OPEN,"Unable to locate PETSc Vec dynamic library \n You cannot move the dynamic libraries!"); ierr = PetscLoadDynamicLibrary("mat",&found);CHKERRQ(ierr); if (!found) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_FILE_OPEN,"Unable to locate PETSc Mat dynamic library \n You cannot move the dynamic libraries!"); ierr = PetscLoadDynamicLibrary("dm",&found);CHKERRQ(ierr); if (!found) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_FILE_OPEN,"Unable to locate PETSc DM dynamic library \n You cannot move the dynamic libraries!"); ierr = PetscLoadDynamicLibrary("ksp",&found);CHKERRQ(ierr); if (!found) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_FILE_OPEN,"Unable to locate PETSc KSP dynamic library \n You cannot move the dynamic libraries!"); ierr = PetscLoadDynamicLibrary("snes",&found);CHKERRQ(ierr); if (!found) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_FILE_OPEN,"Unable to locate PETSc SNES dynamic library \n You cannot move the dynamic libraries!"); ierr = PetscLoadDynamicLibrary("ts",&found);CHKERRQ(ierr); if (!found) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_FILE_OPEN,"Unable to locate PETSc TS dynamic library \n You cannot move the dynamic libraries!"); #endif } #endif nmax = 32; ierr = PetscOptionsGetStringArray(NULL,NULL,"-dll_append",libname,&nmax,NULL);CHKERRQ(ierr); for (i=0; i<nmax; i++) { ierr = PetscDLLibraryAppend(PETSC_COMM_WORLD,&PetscDLLibrariesLoaded,libname[i]);CHKERRQ(ierr); ierr = PetscFree(libname[i]);CHKERRQ(ierr); } #if defined(PETSC_HAVE_THREADSAFETY) /* These must be done here because it is not safe for individual threads to call these initialize routines */ ierr = AOInitializePackage();CHKERRQ(ierr); ierr = PetscSFInitializePackage();CHKERRQ(ierr); #if !defined(PETSC_USE_COMPLEX) ierr = CharacteristicInitializePackage();CHKERRQ(ierr); #endif ierr = ISInitializePackage();CHKERRQ(ierr); ierr = VecInitializePackage();CHKERRQ(ierr); ierr = MatInitializePackage();CHKERRQ(ierr); ierr = DMInitializePackage();CHKERRQ(ierr); ierr = PCInitializePackage();CHKERRQ(ierr); ierr = KSPInitializePackage();CHKERRQ(ierr); ierr = SNESInitializePackage();CHKERRQ(ierr); ierr = TSInitializePackage();CHKERRQ(ierr); ierr = PetscCommDuplicate(PETSC_COMM_SELF,&PETSC_COMM_SELF_INNER,NULL);CHKERRQ(ierr); ierr = PetscCommDuplicate(PETSC_COMM_WORLD,&PETSC_COMM_WORLD_INNER,NULL);CHKERRQ(ierr); #endif PetscFunctionReturn(0); }