1be1d678aSKris Buschelman 27e14e8a7SBarry Smith /* 399cd5145SBarry Smith Mechanism for register PETSc matrix types 47e14e8a7SBarry Smith */ 5b45d2f2cSJed Brown #include <petsc-private/matimpl.h> /*I "petscmat.h" I*/ 67e14e8a7SBarry Smith 7ace3abfcSBarry Smith PetscBool MatRegisterAllCalled = PETSC_FALSE; 87e14e8a7SBarry Smith 97e14e8a7SBarry Smith /* 1099cd5145SBarry Smith Contains the list of registered Mat routines 117e14e8a7SBarry Smith */ 12140e18c1SBarry Smith PetscFunctionList MatList = 0; 137e14e8a7SBarry Smith 144a2ae208SSatish Balay #undef __FUNCT__ 154a2ae208SSatish Balay #define __FUNCT__ "MatSetType" 167e14e8a7SBarry Smith /*@C 1799cd5145SBarry Smith MatSetType - Builds matrix object for a particular matrix type 187e14e8a7SBarry Smith 1999cd5145SBarry Smith Collective on Mat 207e14e8a7SBarry Smith 217e14e8a7SBarry Smith Input Parameters: 2299cd5145SBarry Smith + mat - the matrix object 2399cd5145SBarry Smith - matype - matrix type 247e14e8a7SBarry Smith 257e14e8a7SBarry Smith Options Database Key: 2699cd5145SBarry Smith . -mat_type <method> - Sets the type; use -help for a list 2799cd5145SBarry Smith of available methods (for instance, seqaij) 287e14e8a7SBarry Smith 297e14e8a7SBarry Smith Notes: 3099cd5145SBarry Smith See "${PETSC_DIR}/include/petscmat.h" for available methods 317e14e8a7SBarry Smith 327e14e8a7SBarry Smith Level: intermediate 337e14e8a7SBarry Smith 34c2bf8781Svictorle .keywords: Mat, MatType, set, method 357e14e8a7SBarry Smith 366e0d5acbSBarry Smith .seealso: PCSetType(), VecSetType(), MatCreate(), MatType, Mat 377e14e8a7SBarry Smith @*/ 3819fd82e9SBarry Smith PetscErrorCode MatSetType(Mat mat, MatType matype) 397e14e8a7SBarry Smith { 40dfbe8321SBarry Smith PetscErrorCode ierr,(*r)(Mat); 4101bebe75SBarry Smith PetscBool sametype,found; 4201bebe75SBarry Smith MatBaseName names = MatBaseNameList; 437e14e8a7SBarry Smith 447e14e8a7SBarry Smith PetscFunctionBegin; 450700a824SBarry Smith PetscValidHeaderSpecific(mat,MAT_CLASSID,1); 46117016b1SBarry Smith 4701bebe75SBarry Smith while (names) { 4801bebe75SBarry Smith ierr = PetscStrcmp(matype,names->bname,&found);CHKERRQ(ierr); 4901bebe75SBarry Smith if (found) { 5001bebe75SBarry Smith PetscMPIInt size; 51ce94432eSBarry Smith ierr = MPI_Comm_size(PetscObjectComm((PetscObject)mat),&size);CHKERRQ(ierr); 5201bebe75SBarry Smith if (size == 1) matype = names->sname; 5301bebe75SBarry Smith else matype = names->mname; 5401bebe75SBarry Smith break; 5501bebe75SBarry Smith } 5601bebe75SBarry Smith names = names->next; 5701bebe75SBarry Smith } 5801bebe75SBarry Smith 59251f4c67SDmitry Karpeev ierr = PetscObjectTypeCompare((PetscObject)mat,matype,&sametype);CHKERRQ(ierr); 6092ff6ae8SBarry Smith if (sametype) PetscFunctionReturn(0); 6192ff6ae8SBarry Smith 62*1c9cd337SJed Brown ierr = PetscFunctionListFind(MatList,matype,&r);CHKERRQ(ierr); 63e32f2f54SBarry Smith if (!r) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_UNKNOWN_TYPE,"Unknown Mat type given: %s",matype); 647e14e8a7SBarry Smith 6535d8aa7fSBarry Smith /* free the old data structure if it existed */ 6635d8aa7fSBarry Smith if (mat->ops->destroy) { 6735d8aa7fSBarry Smith ierr = (*mat->ops->destroy)(mat);CHKERRQ(ierr); 6826fbe8dcSKarl Rupp 690298fd71SBarry Smith mat->ops->destroy = NULL; 7035d8aa7fSBarry Smith } 7167d6de01SJed Brown mat->preallocated = PETSC_FALSE; 72a2ec6df8SKris Buschelman 7335d8aa7fSBarry Smith /* create the new data structure */ 7499cd5145SBarry Smith ierr = (*r)(mat);CHKERRQ(ierr); 757e14e8a7SBarry Smith PetscFunctionReturn(0); 767e14e8a7SBarry Smith } 777e14e8a7SBarry Smith 7835d8aa7fSBarry Smith 794a2ae208SSatish Balay #undef __FUNCT__ 804a2ae208SSatish Balay #define __FUNCT__ "MatRegisterDestroy" 817e14e8a7SBarry Smith /*@C 8299cd5145SBarry Smith MatRegisterDestroy - Frees the list of matrix types that were 83607a6623SBarry Smith registered by MatRegister(). 847e14e8a7SBarry Smith 857e14e8a7SBarry Smith Not Collective 867e14e8a7SBarry Smith 877e14e8a7SBarry Smith Level: advanced 887e14e8a7SBarry Smith 8999cd5145SBarry Smith .keywords: Mat, register, destroy 907e14e8a7SBarry Smith 91607a6623SBarry Smith .seealso: MatRegister(), MatRegisterAll() 927e14e8a7SBarry Smith @*/ 937087cfbeSBarry Smith PetscErrorCode MatRegisterDestroy(void) 947e14e8a7SBarry Smith { 95dfbe8321SBarry Smith PetscErrorCode ierr; 967e14e8a7SBarry Smith 977e14e8a7SBarry Smith PetscFunctionBegin; 98140e18c1SBarry Smith ierr = PetscFunctionListDestroy(&MatList);CHKERRQ(ierr); 9926fbe8dcSKarl Rupp 1000e9836bfSBarry Smith MatRegisterAllCalled = PETSC_FALSE; 1017e14e8a7SBarry Smith PetscFunctionReturn(0); 1027e14e8a7SBarry Smith } 1037e14e8a7SBarry Smith 1044a2ae208SSatish Balay #undef __FUNCT__ 1054a2ae208SSatish Balay #define __FUNCT__ "MatGetType" 1067e14e8a7SBarry Smith /*@C 107f87b78b8SBarry Smith MatGetType - Gets the matrix type as a string from the matrix object. 1087e14e8a7SBarry Smith 1097e14e8a7SBarry Smith Not Collective 1107e14e8a7SBarry Smith 1117e14e8a7SBarry Smith Input Parameter: 11299cd5145SBarry Smith . mat - the matrix 1137e14e8a7SBarry Smith 1147e14e8a7SBarry Smith Output Parameter: 11599cd5145SBarry Smith . name - name of matrix type 1167e14e8a7SBarry Smith 1177e14e8a7SBarry Smith Level: intermediate 1187e14e8a7SBarry Smith 119c2bf8781Svictorle .keywords: Mat, MatType, get, method, name 1207e14e8a7SBarry Smith 12199cd5145SBarry Smith .seealso: MatSetType() 1227e14e8a7SBarry Smith @*/ 12319fd82e9SBarry Smith PetscErrorCode MatGetType(Mat mat,MatType *type) 1247e14e8a7SBarry Smith { 1257e14e8a7SBarry Smith PetscFunctionBegin; 1260700a824SBarry Smith PetscValidHeaderSpecific(mat,MAT_CLASSID,1); 127c4e43342SLisandro Dalcin PetscValidPointer(type,2); 1287adad957SLisandro Dalcin *type = ((PetscObject)mat)->type_name; 1297e14e8a7SBarry Smith PetscFunctionReturn(0); 1307e14e8a7SBarry Smith } 1317e14e8a7SBarry Smith 1327e14e8a7SBarry Smith 1334a2ae208SSatish Balay #undef __FUNCT__ 1344a2ae208SSatish Balay #define __FUNCT__ "MatRegister" 1353cea93caSBarry Smith /*@C 1361c84c290SBarry Smith MatRegister - - Adds a new matrix type 1371c84c290SBarry Smith 1381c84c290SBarry Smith Not Collective 1391c84c290SBarry Smith 1401c84c290SBarry Smith Input Parameters: 1411c84c290SBarry Smith + name - name of a new user-defined matrix type 1421c84c290SBarry Smith - routine_create - routine to create method context 1431c84c290SBarry Smith 1441c84c290SBarry Smith Notes: 1451c84c290SBarry Smith MatRegister() may be called multiple times to add several user-defined solvers. 1461c84c290SBarry Smith 1471c84c290SBarry Smith Sample usage: 1481c84c290SBarry Smith .vb 149bdf89e91SBarry Smith MatRegister("my_mat",MyMatCreate); 1501c84c290SBarry Smith .ve 1511c84c290SBarry Smith 1521c84c290SBarry Smith Then, your solver can be chosen with the procedural interface via 1531c84c290SBarry Smith $ MatSetType(Mat,"my_mat") 1541c84c290SBarry Smith or at runtime via the option 1551c84c290SBarry Smith $ -mat_type my_mat 1561c84c290SBarry Smith 1571c84c290SBarry Smith Level: advanced 1581c84c290SBarry Smith 1591c84c290SBarry Smith .keywords: Mat, register 1601c84c290SBarry Smith 1611c84c290SBarry Smith .seealso: MatRegisterAll(), MatRegisterDestroy() 1621c84c290SBarry Smith 1633cea93caSBarry Smith 1647f6c08e0SMatthew Knepley Level: advanced 1653cea93caSBarry Smith @*/ 166bdf89e91SBarry Smith PetscErrorCode MatRegister(const char sname[],PetscErrorCode (*function)(Mat)) 1677e14e8a7SBarry Smith { 168dfbe8321SBarry Smith PetscErrorCode ierr; 1697e14e8a7SBarry Smith 1707e14e8a7SBarry Smith PetscFunctionBegin; 171bdf89e91SBarry Smith ierr = PetscFunctionListAdd(&MatList,sname,(void (*)(void))function);CHKERRQ(ierr); 17299cd5145SBarry Smith PetscFunctionReturn(0); 17399cd5145SBarry Smith } 17499cd5145SBarry Smith 17501bebe75SBarry Smith MatBaseName MatBaseNameList = 0; 17601bebe75SBarry Smith 17701bebe75SBarry Smith #undef __FUNCT__ 17801bebe75SBarry Smith #define __FUNCT__ "MatRegisterBaseName" 17901bebe75SBarry Smith /*@C 18001bebe75SBarry Smith MatRegisterBaseName - Registers a name that can be used for either a sequential or its corresponding parallel matrix type. 18101bebe75SBarry Smith 18201bebe75SBarry Smith Input Parameters: 18301bebe75SBarry Smith + bname - the basename, for example, MATAIJ 18401bebe75SBarry Smith . sname - the name of the sequential matrix type, for example, MATSEQAIJ 18501bebe75SBarry Smith - mname - the name of the parallel matrix type, for example, MATMPIAIJ 18601bebe75SBarry Smith 18701bebe75SBarry Smith 18801bebe75SBarry Smith Level: advanced 18901bebe75SBarry Smith @*/ 19001bebe75SBarry Smith PetscErrorCode MatRegisterBaseName(const char bname[],const char sname[],const char mname[]) 19101bebe75SBarry Smith { 19201bebe75SBarry Smith PetscErrorCode ierr; 19301bebe75SBarry Smith MatBaseName names; 19401bebe75SBarry Smith 19501bebe75SBarry Smith PetscFunctionBegin; 19601bebe75SBarry Smith ierr = PetscNew(struct _p_MatBaseName,&names);CHKERRQ(ierr); 19701bebe75SBarry Smith ierr = PetscStrallocpy(bname,&names->bname);CHKERRQ(ierr); 19801bebe75SBarry Smith ierr = PetscStrallocpy(sname,&names->sname);CHKERRQ(ierr); 19901bebe75SBarry Smith ierr = PetscStrallocpy(mname,&names->mname);CHKERRQ(ierr); 20001bebe75SBarry Smith if (!MatBaseNameList) { 20101bebe75SBarry Smith MatBaseNameList = names; 20201bebe75SBarry Smith } else { 20301bebe75SBarry Smith MatBaseName next = MatBaseNameList; 20401bebe75SBarry Smith while (next->next) next = next->next; 20501bebe75SBarry Smith next->next = names; 20601bebe75SBarry Smith } 20701bebe75SBarry Smith PetscFunctionReturn(0); 20801bebe75SBarry Smith } 20901bebe75SBarry Smith 21099cd5145SBarry Smith 211273d9f13SBarry Smith 212273d9f13SBarry Smith 213273d9f13SBarry Smith 214273d9f13SBarry Smith 215273d9f13SBarry Smith 216