xref: /petsc/src/mat/interface/matreg.c (revision 1c9cd33768b1fd01403e37595b64fe66efc857ab)
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