Actual source code: matreg.c
1: #define PETSCMAT_DLL
3: /*
4: Mechanism for register PETSc matrix types
5: */
6: #include private/matimpl.h
8: PetscTruth MatRegisterAllCalled = PETSC_FALSE;
10: /*
11: Contains the list of registered Mat routines
12: */
13: PetscFList MatList = 0;
17: /*@C
18: MatSetType - Builds matrix object for a particular matrix type
20: Collective on Mat
22: Input Parameters:
23: + mat - the matrix object
24: - matype - matrix type
26: Options Database Key:
27: . -mat_type <method> - Sets the type; use -help for a list
28: of available methods (for instance, seqaij)
30: Notes:
31: See "${PETSC_DIR}/include/petscmat.h" for available methods
33: Level: intermediate
35: .keywords: Mat, MatType, set, method
37: .seealso: PCSetType(), VecSetType(), MatCreate(), MatType, Mat
38: @*/
39: PetscErrorCode MatSetType(Mat mat, const MatType matype)
40: {
41: PetscErrorCode ierr,(*r)(Mat);
42: PetscTruth sametype;
47: PetscTypeCompare((PetscObject)mat,matype,&sametype);
48: if (sametype) return(0);
50: PetscFListFind(MatList,((PetscObject)mat)->comm,matype,(void(**)(void))&r);
51: if (!r) SETERRQ1(PETSC_ERR_ARG_UNKNOWN_TYPE,"Unknown Mat type given: %s",matype);
52:
53: /* free the old data structure if it existed */
54: if (mat->ops->destroy) {
55: MatPreallocated(mat);
56: (*mat->ops->destroy)(mat);
57: mat->ops->destroy = PETSC_NULL;
58: mat->preallocated = PETSC_FALSE;
59: }
61: /* create the new data structure */
62: if (mat->rmap->n < 0 && mat->rmap->N < 0 && mat->cmap->n < 0 && mat->cmap->N < 0) {
63: mat->ops->create = r;
64: } else {
65: (*r)(mat);
66: }
67: PetscPublishAll(mat);
68: return(0);
69: }
74: /*@C
75: MatRegisterDestroy - Frees the list of matrix types that were
76: registered by MatRegister()/MatRegisterDynamic().
78: Not Collective
80: Level: advanced
82: .keywords: Mat, register, destroy
84: .seealso: MatRegister(), MatRegisterAll(), MatRegisterDynamic()
85: @*/
86: PetscErrorCode MatRegisterDestroy(void)
87: {
91: PetscFListDestroy(&MatList);
92: MatRegisterAllCalled = PETSC_FALSE;
93: return(0);
94: }
98: /*@C
99: MatGetType - Gets the matrix type as a string from the matrix object.
101: Not Collective
103: Input Parameter:
104: . mat - the matrix
106: Output Parameter:
107: . name - name of matrix type
109: Level: intermediate
111: .keywords: Mat, MatType, get, method, name
113: .seealso: MatSetType()
114: @*/
115: PetscErrorCode MatGetType(Mat mat,const MatType *type)
116: {
120: *type = ((PetscObject)mat)->type_name;
121: return(0);
122: }
127: /*@C
128: MatRegister - See MatRegisterDynamic()
130: Level: advanced
131: @*/
132: PetscErrorCode MatRegister(const char sname[],const char path[],const char name[],PetscErrorCode (*function)(Mat))
133: {
135: char fullname[PETSC_MAX_PATH_LEN];
138: PetscFListConcat(path,name,fullname);
139: PetscFListAdd(&MatList,sname,fullname,(void (*)(void))function);
140: return(0);
141: }