17e14e8a7SBarry Smith #ifdef PETSC_RCS_HEADER 273f4d377SMatthew Knepley static char vcid[] = "$Id: matreg.c,v 1.18 2001/07/20 21:19:21 bsmith Exp $"; 37e14e8a7SBarry Smith #endif 47e14e8a7SBarry Smith /* 599cd5145SBarry Smith Mechanism for register PETSc matrix types 67e14e8a7SBarry Smith */ 7aa59fb91SSatish Balay #include "src/mat/matimpl.h" /*I "petscmat.h" I*/ 899cd5145SBarry Smith #include "petscsys.h" 97e14e8a7SBarry Smith 1091af72abSBarry Smith PetscTruth MatRegisterAllCalled = PETSC_FALSE; 117e14e8a7SBarry Smith 127e14e8a7SBarry Smith /* 1399cd5145SBarry Smith Contains the list of registered Mat routines 147e14e8a7SBarry Smith */ 15b0a32e0cSBarry Smith PetscFList MatList = 0; 167e14e8a7SBarry Smith 174a2ae208SSatish Balay #undef __FUNCT__ 184a2ae208SSatish Balay #define __FUNCT__ "MatSetType" 197e14e8a7SBarry Smith /*@C 2099cd5145SBarry Smith MatSetType - Builds matrix object for a particular matrix type 217e14e8a7SBarry Smith 2299cd5145SBarry Smith Collective on Mat 237e14e8a7SBarry Smith 247e14e8a7SBarry Smith Input Parameters: 2599cd5145SBarry Smith + mat - the matrix object 2699cd5145SBarry Smith - matype - matrix type 277e14e8a7SBarry Smith 287e14e8a7SBarry Smith Options Database Key: 2999cd5145SBarry Smith . -mat_type <method> - Sets the type; use -help for a list 3099cd5145SBarry Smith of available methods (for instance, seqaij) 317e14e8a7SBarry Smith 327e14e8a7SBarry Smith Notes: 3399cd5145SBarry Smith See "${PETSC_DIR}/include/petscmat.h" for available methods 347e14e8a7SBarry Smith 357e14e8a7SBarry Smith Level: intermediate 367e14e8a7SBarry Smith 3799cd5145SBarry Smith .keywords: Mat, set, method 387e14e8a7SBarry Smith 396e0d5acbSBarry Smith .seealso: PCSetType(), VecSetType(), MatCreate(), MatType, Mat 407e14e8a7SBarry Smith @*/ 41273d9f13SBarry Smith int MatSetType(Mat mat,MatType matype) 427e14e8a7SBarry Smith { 4399cd5145SBarry Smith int ierr,(*r)(Mat); 4499cd5145SBarry Smith PetscTruth sametype; 457e14e8a7SBarry Smith 467e14e8a7SBarry Smith PetscFunctionBegin; 4799cd5145SBarry Smith PetscValidHeaderSpecific(mat,MAT_COOKIE); 487e14e8a7SBarry Smith 4999cd5145SBarry Smith ierr = PetscTypeCompare((PetscObject)mat,matype,&sametype);CHKERRQ(ierr); 5035d8aa7fSBarry Smith if (!sametype) { 51*5694455fSKris Buschelman MatPreallocated(mat); 5299cd5145SBarry Smith /* Get the function pointers for the matrix requested */ 5399cd5145SBarry Smith if (!MatRegisterAllCalled) {ierr = MatRegisterAll(PETSC_NULL);CHKERRQ(ierr);} 54c134de8dSSatish Balay ierr = PetscFListFind(mat->comm,MatList,matype,(void(**)(void))&r);CHKERRQ(ierr); 5529bbc08cSBarry Smith if (!r) SETERRQ1(1,"Unknown Mat type given: %s",matype); 567e14e8a7SBarry Smith 5735d8aa7fSBarry Smith /* free the old data structure if it existed */ 5835d8aa7fSBarry Smith if (mat->ops->destroy) { 5935d8aa7fSBarry Smith ierr = (*mat->ops->destroy)(mat);CHKERRQ(ierr); 6035d8aa7fSBarry Smith } 6135d8aa7fSBarry Smith if (mat->rmap) { 628a124369SBarry Smith ierr = PetscMapDestroy(mat->rmap);CHKERRQ(ierr); 6335d8aa7fSBarry Smith mat->rmap = 0; 6435d8aa7fSBarry Smith } 6535d8aa7fSBarry Smith if (mat->cmap) { 668a124369SBarry Smith ierr = PetscMapDestroy(mat->cmap);CHKERRQ(ierr); 6735d8aa7fSBarry Smith mat->cmap = 0; 6835d8aa7fSBarry Smith } 69*5694455fSKris Buschelman if (mat->qlist) { 70*5694455fSKris Buschelman ierr = PetscFListDestroy(&mat->qlist);CHKERRQ(ierr); 71*5694455fSKris Buschelman mat->qlist = 0; 72*5694455fSKris Buschelman } 73*5694455fSKris Buschelman if (mat->olist) { 74*5694455fSKris Buschelman ierr = PetscOListDestroy(&mat->olist);CHKERRQ(ierr); 75*5694455fSKris Buschelman mat->olist = 0; 76*5694455fSKris Buschelman } 7735d8aa7fSBarry Smith /* create the new data structure */ 7899cd5145SBarry Smith ierr = (*r)(mat);CHKERRQ(ierr); 797e14e8a7SBarry Smith 80b9b97703SBarry Smith ierr = PetscObjectChangeTypeName((PetscObject)mat,matype);CHKERRQ(ierr); 8135d8aa7fSBarry Smith } 8235d8aa7fSBarry Smith ierr = PetscPublishAll(mat);CHKERRQ(ierr); 837e14e8a7SBarry Smith PetscFunctionReturn(0); 847e14e8a7SBarry Smith } 857e14e8a7SBarry Smith 8635d8aa7fSBarry Smith 874a2ae208SSatish Balay #undef __FUNCT__ 884a2ae208SSatish Balay #define __FUNCT__ "MatRegisterDestroy" 897e14e8a7SBarry Smith /*@C 9099cd5145SBarry Smith MatRegisterDestroy - Frees the list of matrix types that were 913cea93caSBarry Smith registered by MatRegister()/MatRegisterDynamic(). 927e14e8a7SBarry Smith 937e14e8a7SBarry Smith Not Collective 947e14e8a7SBarry Smith 957e14e8a7SBarry Smith Level: advanced 967e14e8a7SBarry Smith 9799cd5145SBarry Smith .keywords: Mat, register, destroy 987e14e8a7SBarry Smith 993cea93caSBarry Smith .seealso: MatRegister(), MatRegisterAll(), MatRegisterDynamic() 1007e14e8a7SBarry Smith @*/ 10199cd5145SBarry Smith int MatRegisterDestroy(void) 1027e14e8a7SBarry Smith { 1037e14e8a7SBarry Smith int ierr; 1047e14e8a7SBarry Smith 1057e14e8a7SBarry Smith PetscFunctionBegin; 10699cd5145SBarry Smith if (MatList) { 107b0a32e0cSBarry Smith ierr = PetscFListDestroy(&MatList);CHKERRQ(ierr); 10899cd5145SBarry Smith MatList = 0; 1097e14e8a7SBarry Smith } 1100e9836bfSBarry Smith MatRegisterAllCalled = PETSC_FALSE; 1117e14e8a7SBarry Smith PetscFunctionReturn(0); 1127e14e8a7SBarry Smith } 1137e14e8a7SBarry Smith 1144a2ae208SSatish Balay #undef __FUNCT__ 1154a2ae208SSatish Balay #define __FUNCT__ "MatGetType" 1167e14e8a7SBarry Smith /*@C 117f87b78b8SBarry Smith MatGetType - Gets the matrix type as a string from the matrix object. 1187e14e8a7SBarry Smith 1197e14e8a7SBarry Smith Not Collective 1207e14e8a7SBarry Smith 1217e14e8a7SBarry Smith Input Parameter: 12299cd5145SBarry Smith . mat - the matrix 1237e14e8a7SBarry Smith 1247e14e8a7SBarry Smith Output Parameter: 12599cd5145SBarry Smith . name - name of matrix type 1267e14e8a7SBarry Smith 1277e14e8a7SBarry Smith Level: intermediate 1287e14e8a7SBarry Smith 12999cd5145SBarry Smith .keywords: Mat, get, method, name 1307e14e8a7SBarry Smith 13199cd5145SBarry Smith .seealso: MatSetType() 1327e14e8a7SBarry Smith @*/ 133273d9f13SBarry Smith int MatGetType(Mat mat,MatType *type) 1347e14e8a7SBarry Smith { 1357e14e8a7SBarry Smith PetscFunctionBegin; 13699cd5145SBarry Smith *type = mat->type_name; 1377e14e8a7SBarry Smith PetscFunctionReturn(0); 1387e14e8a7SBarry Smith } 1397e14e8a7SBarry Smith 1407e14e8a7SBarry Smith 1414a2ae208SSatish Balay #undef __FUNCT__ 1424a2ae208SSatish Balay #define __FUNCT__ "MatRegister" 1433cea93caSBarry Smith /*@C 1443cea93caSBarry Smith MatRegister - See MatRegisterDynamic() 1453cea93caSBarry Smith 1467f6c08e0SMatthew Knepley Level: advanced 1473cea93caSBarry Smith @*/ 14899cd5145SBarry Smith int MatRegister(char *sname,char *path,char *name,int (*function)(Mat)) 1497e14e8a7SBarry Smith { 1507e14e8a7SBarry Smith int ierr; 151e10c49a3SBarry Smith char fullname[PETSC_MAX_PATH_LEN]; 1527e14e8a7SBarry Smith 1537e14e8a7SBarry Smith PetscFunctionBegin; 154b0a32e0cSBarry Smith ierr = PetscFListConcat(path,name,fullname);CHKERRQ(ierr); 155c134de8dSSatish Balay ierr = PetscFListAdd(&MatList,sname,fullname,(void (*)(void))function);CHKERRQ(ierr); 15699cd5145SBarry Smith PetscFunctionReturn(0); 15799cd5145SBarry Smith } 15899cd5145SBarry Smith 15999cd5145SBarry Smith 16099cd5145SBarry Smith 16199cd5145SBarry Smith 162273d9f13SBarry Smith 163273d9f13SBarry Smith 164273d9f13SBarry Smith 165273d9f13SBarry Smith 166273d9f13SBarry Smith 167273d9f13SBarry Smith 168