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