Actual source code: matreg.c
1: #define PETSCMAT_DLL
3: /*
4: Mechanism for register PETSc matrix types
5: */
6: #include private/matimpl.h
7: #include petscsys.h
9: PetscTruth MatRegisterAllCalled = PETSC_FALSE;
11: /*
12: Contains the list of registered Mat routines
13: */
14: PetscFList MatList = 0;
18: /*@C
19: MatSetType - Builds matrix object for a particular matrix type
21: Collective on Mat
23: Input Parameters:
24: + mat - the matrix object
25: - matype - matrix type
27: Options Database Key:
28: . -mat_type <method> - Sets the type; use -help for a list
29: of available methods (for instance, seqaij)
31: Notes:
32: See "${PETSC_DIR}/include/petscmat.h" for available methods
34: Level: intermediate
36: .keywords: Mat, MatType, set, method
38: .seealso: PCSetType(), VecSetType(), MatCreate(), MatType, Mat
39: @*/
40: PetscErrorCode MatSetType(Mat mat, const MatType matype)
41: {
42: PetscErrorCode ierr,(*r)(Mat);
43: PetscTruth sametype;
48: PetscTypeCompare((PetscObject)mat,matype,&sametype);
49: if (sametype) return(0);
51: PetscFListFind(MatList,((PetscObject)mat)->comm,matype,(void(**)(void))&r);
52: if (!r) SETERRQ1(PETSC_ERR_ARG_UNKNOWN_TYPE,"Unknown Mat type given: %s",matype);
53:
54: /* free the old data structure if it existed */
55: if (mat->ops->destroy) {
56: MatPreallocated(mat);
57: (*mat->ops->destroy)(mat);
58: mat->ops->destroy = PETSC_NULL;
59: mat->preallocated = PETSC_FALSE;
60: }
62: /* create the new data structure */
63: if (mat->rmap->n < 0 && mat->rmap->N < 0 && mat->cmap->n < 0 && mat->cmap->N < 0) {
64: mat->ops->create = r;
65: } else {
66: (*r)(mat);
67: }
68: PetscPublishAll(mat);
69: return(0);
70: }
75: /*@C
76: MatRegisterDestroy - Frees the list of matrix types that were
77: registered by MatRegister()/MatRegisterDynamic().
79: Not Collective
81: Level: advanced
83: .keywords: Mat, register, destroy
85: .seealso: MatRegister(), MatRegisterAll(), MatRegisterDynamic()
86: @*/
87: PetscErrorCode MatRegisterDestroy(void)
88: {
92: PetscFListDestroy(&MatList);
93: MatRegisterAllCalled = PETSC_FALSE;
94: return(0);
95: }
99: /*@C
100: MatGetType - Gets the matrix type as a string from the matrix object.
102: Not Collective
104: Input Parameter:
105: . mat - the matrix
107: Output Parameter:
108: . name - name of matrix type
110: Level: intermediate
112: .keywords: Mat, MatType, get, method, name
114: .seealso: MatSetType()
115: @*/
116: PetscErrorCode MatGetType(Mat mat,const MatType *type)
117: {
121: *type = ((PetscObject)mat)->type_name;
122: return(0);
123: }
128: /*@C
129: MatRegister - See MatRegisterDynamic()
131: Level: advanced
132: @*/
133: PetscErrorCode MatRegister(const char sname[],const char path[],const char name[],PetscErrorCode (*function)(Mat))
134: {
136: char fullname[PETSC_MAX_PATH_LEN];
139: PetscFListConcat(path,name,fullname);
140: PetscFListAdd(&MatList,sname,fullname,(void (*)(void))function);
141: return(0);
142: }