Actual source code: matreg.c

  1: #define PETSCMAT_DLL

  3: /*
  4:      Mechanism for register PETSc matrix types
  5: */
 6:  #include src/mat/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 PETSCMAT_DLLEXPORT MatSetType(Mat mat, MatType matype)
 41: {
 42:   PetscErrorCode ierr,(*r)(Mat);
 43:   PetscTruth     sametype;

 47:   if (mat->m < 0 && mat->M < 0 && mat->n < 0 && mat->N < 0) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Must call MatSetSizes() first");
 48:   PetscTypeCompare((PetscObject)mat,matype,&sametype);
 49:   if (!sametype) {
 50:     /* Get the function pointers for the matrix requested */
 51:     if (!MatRegisterAllCalled) {MatRegisterAll(PETSC_NULL);}
 52:      PetscFListFind(mat->comm,MatList,matype,(void(**)(void))&r);
 53:     if (!r) SETERRQ1(PETSC_ERR_ARG_UNKNOWN_TYPE,"Unknown Mat type given: %s",matype);

 55:     /* free the old data structure if it existed */
 56:     if (mat->ops->destroy) {
 57:       MatPreallocated(mat);
 58:       (*mat->ops->destroy)(mat);
 59:       mat->ops->destroy = PETSC_NULL;
 60:       mat->preallocated = PETSC_FALSE;
 61:     }

 63:     if (mat->rmap) {
 64:       PetscMapDestroy(mat->rmap);
 65:       mat->rmap = 0;
 66:     }
 67:     if (mat->cmap) {
 68:       PetscMapDestroy(mat->cmap);
 69:       mat->cmap = 0;
 70:     }
 71:     /* create the new data structure */
 72:     (*r)(mat);
 73:     PetscObjectChangeTypeName((PetscObject)mat,matype);
 74:   }
 75:   PetscPublishAll(mat);
 76:   return(0);
 77: }


 82: /*@C
 83:    MatRegisterDestroy - Frees the list of matrix types that were
 84:    registered by MatRegister()/MatRegisterDynamic().

 86:    Not Collective

 88:    Level: advanced

 90: .keywords: Mat, register, destroy

 92: .seealso: MatRegister(), MatRegisterAll(), MatRegisterDynamic()
 93: @*/
 94: PetscErrorCode PETSCMAT_DLLEXPORT MatRegisterDestroy(void)
 95: {

 99:   if (MatList) {
100:     PetscFListDestroy(&MatList);
101:     MatList = 0;
102:   }
103:   MatRegisterAllCalled = PETSC_FALSE;
104:   return(0);
105: }

109: /*@C
110:    MatGetType - Gets the matrix type as a string from the matrix object.

112:    Not Collective

114:    Input Parameter:
115: .  mat - the matrix

117:    Output Parameter:
118: .  name - name of matrix type

120:    Level: intermediate

122: .keywords: Mat, MatType, get, method, name

124: .seealso: MatSetType()
125: @*/
126: PetscErrorCode PETSCMAT_DLLEXPORT MatGetType(Mat mat,MatType *type)
127: {
129:   *type = mat->type_name;
130:   return(0);
131: }


136: /*@C
137:   MatRegister - See MatRegisterDynamic()

139:   Level: advanced
140: @*/
141: PetscErrorCode PETSCMAT_DLLEXPORT MatRegister(const char sname[],const char path[],const char name[],PetscErrorCode (*function)(Mat))
142: {
144:   char           fullname[PETSC_MAX_PATH_LEN];

147:   PetscFListConcat(path,name,fullname);
148:   PetscFListAdd(&MatList,sname,fullname,(void (*)(void))function);
149:   return(0);
150: }