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: }