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) { 515694455fSKris 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); 60*0dd8e64fSKris Buschelman mat->ops->destroy = PETSC_NULL; 6135d8aa7fSBarry Smith } 6235d8aa7fSBarry Smith if (mat->rmap) { 638a124369SBarry Smith ierr = PetscMapDestroy(mat->rmap);CHKERRQ(ierr); 6435d8aa7fSBarry Smith mat->rmap = 0; 6535d8aa7fSBarry Smith } 6635d8aa7fSBarry Smith if (mat->cmap) { 678a124369SBarry Smith ierr = PetscMapDestroy(mat->cmap);CHKERRQ(ierr); 6835d8aa7fSBarry Smith mat->cmap = 0; 6935d8aa7fSBarry Smith } 705694455fSKris Buschelman if (mat->qlist) { 715694455fSKris Buschelman ierr = PetscFListDestroy(&mat->qlist);CHKERRQ(ierr); 725694455fSKris Buschelman mat->qlist = 0; 735694455fSKris Buschelman } 745694455fSKris Buschelman if (mat->olist) { 755694455fSKris Buschelman ierr = PetscOListDestroy(&mat->olist);CHKERRQ(ierr); 765694455fSKris Buschelman mat->olist = 0; 775694455fSKris Buschelman } 7835d8aa7fSBarry Smith /* create the new data structure */ 7999cd5145SBarry Smith ierr = (*r)(mat);CHKERRQ(ierr); 807e14e8a7SBarry Smith 81b9b97703SBarry Smith ierr = PetscObjectChangeTypeName((PetscObject)mat,matype);CHKERRQ(ierr); 8235d8aa7fSBarry Smith } 8335d8aa7fSBarry Smith ierr = PetscPublishAll(mat);CHKERRQ(ierr); 847e14e8a7SBarry Smith PetscFunctionReturn(0); 857e14e8a7SBarry Smith } 867e14e8a7SBarry Smith 8735d8aa7fSBarry Smith 884a2ae208SSatish Balay #undef __FUNCT__ 894a2ae208SSatish Balay #define __FUNCT__ "MatRegisterDestroy" 907e14e8a7SBarry Smith /*@C 9199cd5145SBarry Smith MatRegisterDestroy - Frees the list of matrix types that were 923cea93caSBarry Smith registered by MatRegister()/MatRegisterDynamic(). 937e14e8a7SBarry Smith 947e14e8a7SBarry Smith Not Collective 957e14e8a7SBarry Smith 967e14e8a7SBarry Smith Level: advanced 977e14e8a7SBarry Smith 9899cd5145SBarry Smith .keywords: Mat, register, destroy 997e14e8a7SBarry Smith 1003cea93caSBarry Smith .seealso: MatRegister(), MatRegisterAll(), MatRegisterDynamic() 1017e14e8a7SBarry Smith @*/ 10299cd5145SBarry Smith int MatRegisterDestroy(void) 1037e14e8a7SBarry Smith { 1047e14e8a7SBarry Smith int ierr; 1057e14e8a7SBarry Smith 1067e14e8a7SBarry Smith PetscFunctionBegin; 10799cd5145SBarry Smith if (MatList) { 108b0a32e0cSBarry Smith ierr = PetscFListDestroy(&MatList);CHKERRQ(ierr); 10999cd5145SBarry Smith MatList = 0; 1107e14e8a7SBarry Smith } 1110e9836bfSBarry Smith MatRegisterAllCalled = PETSC_FALSE; 1127e14e8a7SBarry Smith PetscFunctionReturn(0); 1137e14e8a7SBarry Smith } 1147e14e8a7SBarry Smith 1154a2ae208SSatish Balay #undef __FUNCT__ 1164a2ae208SSatish Balay #define __FUNCT__ "MatGetType" 1177e14e8a7SBarry Smith /*@C 118f87b78b8SBarry Smith MatGetType - Gets the matrix type as a string from the matrix object. 1197e14e8a7SBarry Smith 1207e14e8a7SBarry Smith Not Collective 1217e14e8a7SBarry Smith 1227e14e8a7SBarry Smith Input Parameter: 12399cd5145SBarry Smith . mat - the matrix 1247e14e8a7SBarry Smith 1257e14e8a7SBarry Smith Output Parameter: 12699cd5145SBarry Smith . name - name of matrix type 1277e14e8a7SBarry Smith 1287e14e8a7SBarry Smith Level: intermediate 1297e14e8a7SBarry Smith 13099cd5145SBarry Smith .keywords: Mat, get, method, name 1317e14e8a7SBarry Smith 13299cd5145SBarry Smith .seealso: MatSetType() 1337e14e8a7SBarry Smith @*/ 134273d9f13SBarry Smith int MatGetType(Mat mat,MatType *type) 1357e14e8a7SBarry Smith { 1367e14e8a7SBarry Smith PetscFunctionBegin; 13799cd5145SBarry Smith *type = mat->type_name; 1387e14e8a7SBarry Smith PetscFunctionReturn(0); 1397e14e8a7SBarry Smith } 1407e14e8a7SBarry Smith 1417e14e8a7SBarry Smith 1424a2ae208SSatish Balay #undef __FUNCT__ 1434a2ae208SSatish Balay #define __FUNCT__ "MatRegister" 1443cea93caSBarry Smith /*@C 1453cea93caSBarry Smith MatRegister - See MatRegisterDynamic() 1463cea93caSBarry Smith 1477f6c08e0SMatthew Knepley Level: advanced 1483cea93caSBarry Smith @*/ 14999cd5145SBarry Smith int MatRegister(char *sname,char *path,char *name,int (*function)(Mat)) 1507e14e8a7SBarry Smith { 1517e14e8a7SBarry Smith int ierr; 152e10c49a3SBarry Smith char fullname[PETSC_MAX_PATH_LEN]; 1537e14e8a7SBarry Smith 1547e14e8a7SBarry Smith PetscFunctionBegin; 155b0a32e0cSBarry Smith ierr = PetscFListConcat(path,name,fullname);CHKERRQ(ierr); 156c134de8dSSatish Balay ierr = PetscFListAdd(&MatList,sname,fullname,(void (*)(void))function);CHKERRQ(ierr); 15799cd5145SBarry Smith PetscFunctionReturn(0); 15899cd5145SBarry Smith } 15999cd5145SBarry Smith 16099cd5145SBarry Smith 16199cd5145SBarry Smith 16299cd5145SBarry Smith 163273d9f13SBarry Smith 164273d9f13SBarry Smith 165273d9f13SBarry Smith 166273d9f13SBarry Smith 167273d9f13SBarry Smith 168273d9f13SBarry Smith 169