xref: /petsc/src/dm/impls/da/dareg.c (revision 47c6ae997ffd1b2afd66b6474dff5950ae8613d1)
1*47c6ae99SBarry Smith #define PETSCDM_DLL
2*47c6ae99SBarry Smith 
3*47c6ae99SBarry Smith #include "private/daimpl.h"    /*I "petscda.h"  I*/
4*47c6ae99SBarry Smith 
5*47c6ae99SBarry Smith PetscFList DAList                       = PETSC_NULL;
6*47c6ae99SBarry Smith PetscBool  DARegisterAllCalled          = PETSC_FALSE;
7*47c6ae99SBarry Smith 
8*47c6ae99SBarry Smith #undef __FUNCT__
9*47c6ae99SBarry Smith #define __FUNCT__ "DASetType"
10*47c6ae99SBarry Smith /*@C
11*47c6ae99SBarry Smith   DASetType - Builds a DA, for a particular DA implementation.
12*47c6ae99SBarry Smith 
13*47c6ae99SBarry Smith   Collective on DA
14*47c6ae99SBarry Smith 
15*47c6ae99SBarry Smith   Input Parameters:
16*47c6ae99SBarry Smith + da     - The DA object
17*47c6ae99SBarry Smith - method - The name of the DA type
18*47c6ae99SBarry Smith 
19*47c6ae99SBarry Smith   Options Database Key:
20*47c6ae99SBarry Smith . -da_type <type> - Sets the DA type; use -help for a list of available types
21*47c6ae99SBarry Smith 
22*47c6ae99SBarry Smith   Notes:
23*47c6ae99SBarry Smith   See "petsc/include/petscda.h" for available DA types (for instance, DA1D, DA2D, or DA3D).
24*47c6ae99SBarry Smith 
25*47c6ae99SBarry Smith   Level: intermediate
26*47c6ae99SBarry Smith 
27*47c6ae99SBarry Smith .keywords: DA, set, type
28*47c6ae99SBarry Smith .seealso: DAGetType(), DACreate()
29*47c6ae99SBarry Smith @*/
30*47c6ae99SBarry Smith PetscErrorCode PETSCDM_DLLEXPORT DASetType(DA da, const DAType method)
31*47c6ae99SBarry Smith {
32*47c6ae99SBarry Smith   PetscErrorCode (*r)(DA);
33*47c6ae99SBarry Smith   PetscBool      match;
34*47c6ae99SBarry Smith   PetscErrorCode ierr;
35*47c6ae99SBarry Smith 
36*47c6ae99SBarry Smith   PetscFunctionBegin;
37*47c6ae99SBarry Smith   PetscValidHeaderSpecific(da, DM_CLASSID,1);
38*47c6ae99SBarry Smith   ierr = PetscTypeCompare((PetscObject) da, method, &match);CHKERRQ(ierr);
39*47c6ae99SBarry Smith   if (match) PetscFunctionReturn(0);
40*47c6ae99SBarry Smith 
41*47c6ae99SBarry Smith   if (!DARegisterAllCalled) {ierr = DARegisterAll(PETSC_NULL);CHKERRQ(ierr);}
42*47c6ae99SBarry Smith   ierr = PetscFListFind(DAList, ((PetscObject)da)->comm, method,(void (**)(void)) &r);CHKERRQ(ierr);
43*47c6ae99SBarry Smith   if (!r) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_UNKNOWN_TYPE, "Unknown DA type: %s", method);
44*47c6ae99SBarry Smith 
45*47c6ae99SBarry Smith   if (da->ops->destroy) {
46*47c6ae99SBarry Smith     ierr = (*da->ops->destroy)(da);CHKERRQ(ierr);
47*47c6ae99SBarry Smith   }
48*47c6ae99SBarry Smith   ierr = (*r)(da);CHKERRQ(ierr);
49*47c6ae99SBarry Smith   ierr = PetscObjectChangeTypeName((PetscObject)da,method);CHKERRQ(ierr);
50*47c6ae99SBarry Smith   PetscFunctionReturn(0);
51*47c6ae99SBarry Smith }
52*47c6ae99SBarry Smith 
53*47c6ae99SBarry Smith #undef __FUNCT__
54*47c6ae99SBarry Smith #define __FUNCT__ "DAGetType"
55*47c6ae99SBarry Smith /*@C
56*47c6ae99SBarry Smith   DAGetType - Gets the DA type name (as a string) from the DA.
57*47c6ae99SBarry Smith 
58*47c6ae99SBarry Smith   Not Collective
59*47c6ae99SBarry Smith 
60*47c6ae99SBarry Smith   Input Parameter:
61*47c6ae99SBarry Smith . da  - The DA
62*47c6ae99SBarry Smith 
63*47c6ae99SBarry Smith   Output Parameter:
64*47c6ae99SBarry Smith . type - The DA type name
65*47c6ae99SBarry Smith 
66*47c6ae99SBarry Smith   Level: intermediate
67*47c6ae99SBarry Smith 
68*47c6ae99SBarry Smith .keywords: DA, get, type, name
69*47c6ae99SBarry Smith .seealso: DASetType(), DACreate()
70*47c6ae99SBarry Smith @*/
71*47c6ae99SBarry Smith PetscErrorCode PETSCDM_DLLEXPORT DAGetType(DA da, const DAType *type)
72*47c6ae99SBarry Smith {
73*47c6ae99SBarry Smith   PetscErrorCode ierr;
74*47c6ae99SBarry Smith 
75*47c6ae99SBarry Smith   PetscFunctionBegin;
76*47c6ae99SBarry Smith   PetscValidHeaderSpecific(da, DM_CLASSID,1);
77*47c6ae99SBarry Smith   PetscValidCharPointer(type,2);
78*47c6ae99SBarry Smith   if (!DARegisterAllCalled) {
79*47c6ae99SBarry Smith     ierr = DARegisterAll(PETSC_NULL);CHKERRQ(ierr);
80*47c6ae99SBarry Smith   }
81*47c6ae99SBarry Smith   *type = ((PetscObject)da)->type_name;
82*47c6ae99SBarry Smith   PetscFunctionReturn(0);
83*47c6ae99SBarry Smith }
84*47c6ae99SBarry Smith 
85*47c6ae99SBarry Smith 
86*47c6ae99SBarry Smith /*--------------------------------------------------------------------------------------------------------------------*/
87*47c6ae99SBarry Smith 
88*47c6ae99SBarry Smith #undef __FUNCT__
89*47c6ae99SBarry Smith #define __FUNCT__ "DARegister"
90*47c6ae99SBarry Smith /*@C
91*47c6ae99SBarry Smith   DARegister - See DARegisterDynamic()
92*47c6ae99SBarry Smith 
93*47c6ae99SBarry Smith   Level: advanced
94*47c6ae99SBarry Smith @*/
95*47c6ae99SBarry Smith PetscErrorCode PETSCDM_DLLEXPORT DARegister(const char sname[], const char path[], const char name[], PetscErrorCode (*function)(DA))
96*47c6ae99SBarry Smith {
97*47c6ae99SBarry Smith   char fullname[PETSC_MAX_PATH_LEN];
98*47c6ae99SBarry Smith   PetscErrorCode ierr;
99*47c6ae99SBarry Smith 
100*47c6ae99SBarry Smith   PetscFunctionBegin;
101*47c6ae99SBarry Smith   ierr = PetscStrcpy(fullname, path);CHKERRQ(ierr);
102*47c6ae99SBarry Smith   ierr = PetscStrcat(fullname, ":");CHKERRQ(ierr);
103*47c6ae99SBarry Smith   ierr = PetscStrcat(fullname, name);CHKERRQ(ierr);
104*47c6ae99SBarry Smith   ierr = PetscFListAdd(&DAList, sname, fullname, (void (*)(void)) function);CHKERRQ(ierr);
105*47c6ae99SBarry Smith   PetscFunctionReturn(0);
106*47c6ae99SBarry Smith }
107*47c6ae99SBarry Smith 
108*47c6ae99SBarry Smith 
109*47c6ae99SBarry Smith /*--------------------------------------------------------------------------------------------------------------------*/
110*47c6ae99SBarry Smith #undef __FUNCT__
111*47c6ae99SBarry Smith #define __FUNCT__ "DARegisterDestroy"
112*47c6ae99SBarry Smith /*@C
113*47c6ae99SBarry Smith    DARegisterDestroy - Frees the list of DA methods that were registered by DARegister()/DARegisterDynamic().
114*47c6ae99SBarry Smith 
115*47c6ae99SBarry Smith    Not Collective
116*47c6ae99SBarry Smith 
117*47c6ae99SBarry Smith    Level: advanced
118*47c6ae99SBarry Smith 
119*47c6ae99SBarry Smith .keywords: DA, register, destroy
120*47c6ae99SBarry Smith .seealso: DARegister(), DARegisterAll(), DARegisterDynamic()
121*47c6ae99SBarry Smith @*/
122*47c6ae99SBarry Smith PetscErrorCode PETSCDM_DLLEXPORT DARegisterDestroy(void)
123*47c6ae99SBarry Smith {
124*47c6ae99SBarry Smith   PetscErrorCode ierr;
125*47c6ae99SBarry Smith 
126*47c6ae99SBarry Smith   PetscFunctionBegin;
127*47c6ae99SBarry Smith   ierr = PetscFListDestroy(&DAList);CHKERRQ(ierr);
128*47c6ae99SBarry Smith   DARegisterAllCalled = PETSC_FALSE;
129*47c6ae99SBarry Smith   PetscFunctionReturn(0);
130*47c6ae99SBarry Smith }
131