xref: /petsc/src/dm/interface/dm.c (revision 3014e516e65a6935c8d92df3f982a2be080c343d)
147c6ae99SBarry Smith #define PETSCDM_DLL
247c6ae99SBarry Smith 
3e1589f56SBarry Smith #include "private/dmimpl.h"     /*I      "petscdm.h"     I*/
447c6ae99SBarry Smith 
547c6ae99SBarry Smith #undef __FUNCT__
6a4121054SBarry Smith #define __FUNCT__ "DMCreate"
7a4121054SBarry Smith /*@
8a4121054SBarry Smith   DMCreate - Creates an empty vector object. The type can then be set with DMetType().
9a4121054SBarry Smith 
10a4121054SBarry Smith    If you never  call DMSetType()  it will generate an
11a4121054SBarry Smith    error when you try to use the vector.
12a4121054SBarry Smith 
13a4121054SBarry Smith   Collective on MPI_Comm
14a4121054SBarry Smith 
15a4121054SBarry Smith   Input Parameter:
16a4121054SBarry Smith . comm - The communicator for the DM object
17a4121054SBarry Smith 
18a4121054SBarry Smith   Output Parameter:
19a4121054SBarry Smith . dm - The DM object
20a4121054SBarry Smith 
21a4121054SBarry Smith   Level: beginner
22a4121054SBarry Smith 
23a4121054SBarry Smith .seealso: DMSetType(), DMDA, DMSLICED, DMCOMPOSITE
24a4121054SBarry Smith @*/
25a4121054SBarry Smith PetscErrorCode PETSCVEC_DLLEXPORT DMCreate(MPI_Comm comm, DM *vec)
26a4121054SBarry Smith {
27a4121054SBarry Smith   DM             v;
28a4121054SBarry Smith   PetscErrorCode ierr;
29a4121054SBarry Smith 
30a4121054SBarry Smith   PetscFunctionBegin;
31a4121054SBarry Smith   PetscValidPointer(vec,2);
32a4121054SBarry Smith   *vec = PETSC_NULL;
33a4121054SBarry Smith #ifndef PETSC_USE_DYNAMIC_LIBRARIES
34a4121054SBarry Smith   ierr = DMInitializePackage(PETSC_NULL);CHKERRQ(ierr);
35a4121054SBarry Smith #endif
36a4121054SBarry Smith 
37a4121054SBarry Smith   ierr = PetscHeaderCreate(v, _p_DM, struct _DMOps, DM_CLASSID, -1, "DM", comm, DMDestroy, DMView);CHKERRQ(ierr);
38a4121054SBarry Smith   ierr = PetscMemzero(v->ops, sizeof(struct _DMOps));CHKERRQ(ierr);
39a4121054SBarry Smith   *vec = v;
40a4121054SBarry Smith   PetscFunctionReturn(0);
41a4121054SBarry Smith }
42a4121054SBarry Smith 
43a4121054SBarry Smith 
44a4121054SBarry Smith #undef __FUNCT__
459a42bb27SBarry Smith #define __FUNCT__ "DMSetVecType"
469a42bb27SBarry Smith /*@C
47564755cdSBarry Smith        DMSetVecType - Sets the type of vector created with DMCreateLocalVector() and DMCreateGlobalVector()
489a42bb27SBarry Smith 
49aa219208SBarry Smith    Logically Collective on DMDA
509a42bb27SBarry Smith 
519a42bb27SBarry Smith    Input Parameter:
529a42bb27SBarry Smith +  da - initial distributed array
539a42bb27SBarry Smith .  ctype - the vector type, currently either VECSTANDARD or VECCUDA
549a42bb27SBarry Smith 
559a42bb27SBarry Smith    Options Database:
569a42bb27SBarry Smith .   -da_vec_type ctype
579a42bb27SBarry Smith 
589a42bb27SBarry Smith    Level: intermediate
599a42bb27SBarry Smith 
60aa219208SBarry Smith .seealso: DMDACreate1d(), DMDACreate2d(), DMDACreate3d(), DMDestroy(), DMDA, DMDAInterpolationType, VecType
619a42bb27SBarry Smith @*/
629a42bb27SBarry Smith PetscErrorCode PETSCDM_DLLEXPORT DMSetVecType(DM da,const VecType ctype)
639a42bb27SBarry Smith {
649a42bb27SBarry Smith   PetscErrorCode ierr;
659a42bb27SBarry Smith 
669a42bb27SBarry Smith   PetscFunctionBegin;
679a42bb27SBarry Smith   PetscValidHeaderSpecific(da,DM_CLASSID,1);
689a42bb27SBarry Smith   ierr = PetscFree(da->vectype);CHKERRQ(ierr);
699a42bb27SBarry Smith   ierr = PetscStrallocpy(ctype,&da->vectype);CHKERRQ(ierr);
709a42bb27SBarry Smith   PetscFunctionReturn(0);
719a42bb27SBarry Smith }
729a42bb27SBarry Smith 
739a42bb27SBarry Smith #undef __FUNCT__
749a42bb27SBarry Smith #define __FUNCT__ "DMSetOptionsPrefix"
759a42bb27SBarry Smith /*@C
769a42bb27SBarry Smith    DMSetOptionsPrefix - Sets the prefix used for searching for all
77aa219208SBarry Smith    DMDA options in the database.
789a42bb27SBarry Smith 
79aa219208SBarry Smith    Logically Collective on DMDA
809a42bb27SBarry Smith 
819a42bb27SBarry Smith    Input Parameter:
82aa219208SBarry Smith +  da - the DMDA context
839a42bb27SBarry Smith -  prefix - the prefix to prepend to all option names
849a42bb27SBarry Smith 
859a42bb27SBarry Smith    Notes:
869a42bb27SBarry Smith    A hyphen (-) must NOT be given at the beginning of the prefix name.
879a42bb27SBarry Smith    The first character of all runtime options is AUTOMATICALLY the hyphen.
889a42bb27SBarry Smith 
899a42bb27SBarry Smith    Level: advanced
909a42bb27SBarry Smith 
91aa219208SBarry Smith .keywords: DMDA, set, options, prefix, database
929a42bb27SBarry Smith 
939a42bb27SBarry Smith .seealso: DMSetFromOptions()
949a42bb27SBarry Smith @*/
959a42bb27SBarry Smith PetscErrorCode PETSCDM_DLLEXPORT DMSetOptionsPrefix(DM dm,const char prefix[])
969a42bb27SBarry Smith {
979a42bb27SBarry Smith   PetscErrorCode ierr;
989a42bb27SBarry Smith 
999a42bb27SBarry Smith   PetscFunctionBegin;
1009a42bb27SBarry Smith   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
1019a42bb27SBarry Smith   ierr = PetscObjectSetOptionsPrefix((PetscObject)dm,prefix);CHKERRQ(ierr);
1029a42bb27SBarry Smith   PetscFunctionReturn(0);
1039a42bb27SBarry Smith }
1049a42bb27SBarry Smith 
1059a42bb27SBarry Smith #undef __FUNCT__
10647c6ae99SBarry Smith #define __FUNCT__ "DMDestroy"
10747c6ae99SBarry Smith /*@
108aa219208SBarry Smith     DMDestroy - Destroys a vector packer or DMDA.
10947c6ae99SBarry Smith 
11047c6ae99SBarry Smith     Collective on DM
11147c6ae99SBarry Smith 
11247c6ae99SBarry Smith     Input Parameter:
11347c6ae99SBarry Smith .   dm - the DM object to destroy
11447c6ae99SBarry Smith 
11547c6ae99SBarry Smith     Level: developer
11647c6ae99SBarry Smith 
11747c6ae99SBarry Smith .seealso DMView(), DMCreateGlobalVector(), DMGetInterpolation(), DMGetColoring(), DMGetMatrix()
11847c6ae99SBarry Smith 
11947c6ae99SBarry Smith @*/
12047c6ae99SBarry Smith PetscErrorCode PETSCDM_DLLEXPORT DMDestroy(DM dm)
12147c6ae99SBarry Smith {
12247c6ae99SBarry Smith   PetscErrorCode ierr;
12347c6ae99SBarry Smith 
12447c6ae99SBarry Smith   PetscFunctionBegin;
1250c010503SBarry Smith   ierr = (*dm->ops->destroy)(dm);CHKERRQ(ierr);
12647c6ae99SBarry Smith   PetscFunctionReturn(0);
12747c6ae99SBarry Smith }
12847c6ae99SBarry Smith 
12947c6ae99SBarry Smith #undef __FUNCT__
130d7bf68aeSBarry Smith #define __FUNCT__ "DMSetUp"
131d7bf68aeSBarry Smith /*@
132d7bf68aeSBarry Smith     DMSetUp - sets up the data structures inside a DM object
133d7bf68aeSBarry Smith 
134d7bf68aeSBarry Smith     Collective on DM
135d7bf68aeSBarry Smith 
136d7bf68aeSBarry Smith     Input Parameter:
137d7bf68aeSBarry Smith .   dm - the DM object to setup
138d7bf68aeSBarry Smith 
139d7bf68aeSBarry Smith     Level: developer
140d7bf68aeSBarry Smith 
141d7bf68aeSBarry Smith .seealso DMView(), DMCreateGlobalVector(), DMGetInterpolation(), DMGetColoring(), DMGetMatrix()
142d7bf68aeSBarry Smith 
143d7bf68aeSBarry Smith @*/
144d7bf68aeSBarry Smith PetscErrorCode PETSCDM_DLLEXPORT DMSetUp(DM dm)
145d7bf68aeSBarry Smith {
146d7bf68aeSBarry Smith   PetscErrorCode ierr;
147d7bf68aeSBarry Smith 
148d7bf68aeSBarry Smith   PetscFunctionBegin;
149d7bf68aeSBarry Smith   if (dm->ops->setup) {
150d7bf68aeSBarry Smith     ierr = (*dm->ops->setup)(dm);CHKERRQ(ierr);
151d7bf68aeSBarry Smith   }
152d7bf68aeSBarry Smith   PetscFunctionReturn(0);
153d7bf68aeSBarry Smith }
154d7bf68aeSBarry Smith 
155d7bf68aeSBarry Smith #undef __FUNCT__
156d7bf68aeSBarry Smith #define __FUNCT__ "DMSetFromOptions"
157d7bf68aeSBarry Smith /*@
158d7bf68aeSBarry Smith     DMSetFromOptions - sets parameters in a DM from the options database
159d7bf68aeSBarry Smith 
160d7bf68aeSBarry Smith     Collective on DM
161d7bf68aeSBarry Smith 
162d7bf68aeSBarry Smith     Input Parameter:
163d7bf68aeSBarry Smith .   dm - the DM object to set options for
164d7bf68aeSBarry Smith 
165d7bf68aeSBarry Smith     Level: developer
166d7bf68aeSBarry Smith 
167d7bf68aeSBarry Smith .seealso DMView(), DMCreateGlobalVector(), DMGetInterpolation(), DMGetColoring(), DMGetMatrix()
168d7bf68aeSBarry Smith 
169d7bf68aeSBarry Smith @*/
170d7bf68aeSBarry Smith PetscErrorCode PETSCDM_DLLEXPORT DMSetFromOptions(DM dm)
171d7bf68aeSBarry Smith {
172d7bf68aeSBarry Smith   PetscErrorCode ierr;
173d7bf68aeSBarry Smith 
174d7bf68aeSBarry Smith   PetscFunctionBegin;
175d7bf68aeSBarry Smith   if (dm->ops->setfromoptions) {
176d7bf68aeSBarry Smith     ierr = (*dm->ops->setfromoptions)(dm);CHKERRQ(ierr);
177d7bf68aeSBarry Smith   }
178d7bf68aeSBarry Smith   PetscFunctionReturn(0);
179d7bf68aeSBarry Smith }
180d7bf68aeSBarry Smith 
181d7bf68aeSBarry Smith #undef __FUNCT__
18247c6ae99SBarry Smith #define __FUNCT__ "DMView"
18347c6ae99SBarry Smith /*@
184aa219208SBarry Smith     DMView - Views a vector packer or DMDA.
18547c6ae99SBarry Smith 
18647c6ae99SBarry Smith     Collective on DM
18747c6ae99SBarry Smith 
18847c6ae99SBarry Smith     Input Parameter:
18947c6ae99SBarry Smith +   dm - the DM object to view
19047c6ae99SBarry Smith -   v - the viewer
19147c6ae99SBarry Smith 
19247c6ae99SBarry Smith     Level: developer
19347c6ae99SBarry Smith 
19447c6ae99SBarry Smith .seealso DMDestroy(), DMCreateGlobalVector(), DMGetInterpolation(), DMGetColoring(), DMGetMatrix()
19547c6ae99SBarry Smith 
19647c6ae99SBarry Smith @*/
19747c6ae99SBarry Smith PetscErrorCode PETSCDM_DLLEXPORT DMView(DM dm,PetscViewer v)
19847c6ae99SBarry Smith {
19947c6ae99SBarry Smith   PetscErrorCode ierr;
20047c6ae99SBarry Smith 
20147c6ae99SBarry Smith   PetscFunctionBegin;
202*3014e516SBarry Smith  if (!v) {
203*3014e516SBarry Smith     ierr = PetscViewerASCIIGetStdout(((PetscObject)dm)->comm,&v);CHKERRQ(ierr);
204*3014e516SBarry Smith   }
2050c010503SBarry Smith   if (dm->ops->view) {
2060c010503SBarry Smith     ierr = (*dm->ops->view)(dm,v);CHKERRQ(ierr);
20747c6ae99SBarry Smith   }
20847c6ae99SBarry Smith   PetscFunctionReturn(0);
20947c6ae99SBarry Smith }
21047c6ae99SBarry Smith 
21147c6ae99SBarry Smith #undef __FUNCT__
21247c6ae99SBarry Smith #define __FUNCT__ "DMCreateGlobalVector"
21347c6ae99SBarry Smith /*@
214aa219208SBarry Smith     DMCreateGlobalVector - Creates a global vector from a DMDA or DMComposite object
21547c6ae99SBarry Smith 
21647c6ae99SBarry Smith     Collective on DM
21747c6ae99SBarry Smith 
21847c6ae99SBarry Smith     Input Parameter:
21947c6ae99SBarry Smith .   dm - the DM object
22047c6ae99SBarry Smith 
22147c6ae99SBarry Smith     Output Parameter:
22247c6ae99SBarry Smith .   vec - the global vector
22347c6ae99SBarry Smith 
22447c6ae99SBarry Smith     Level: developer
22547c6ae99SBarry Smith 
22647c6ae99SBarry Smith .seealso DMDestroy(), DMView(), DMGetInterpolation(), DMGetColoring(), DMGetMatrix()
22747c6ae99SBarry Smith 
22847c6ae99SBarry Smith @*/
22947c6ae99SBarry Smith PetscErrorCode PETSCDM_DLLEXPORT DMCreateGlobalVector(DM dm,Vec *vec)
23047c6ae99SBarry Smith {
23147c6ae99SBarry Smith   PetscErrorCode ierr;
23247c6ae99SBarry Smith 
23347c6ae99SBarry Smith   PetscFunctionBegin;
23447c6ae99SBarry Smith   ierr = (*dm->ops->createglobalvector)(dm,vec);CHKERRQ(ierr);
23547c6ae99SBarry Smith   PetscFunctionReturn(0);
23647c6ae99SBarry Smith }
23747c6ae99SBarry Smith 
23847c6ae99SBarry Smith #undef __FUNCT__
23947c6ae99SBarry Smith #define __FUNCT__ "DMCreateLocalVector"
24047c6ae99SBarry Smith /*@
241aa219208SBarry Smith     DMCreateLocalVector - Creates a local vector from a DMDA or DMComposite object
24247c6ae99SBarry Smith 
24347c6ae99SBarry Smith     Not Collective
24447c6ae99SBarry Smith 
24547c6ae99SBarry Smith     Input Parameter:
24647c6ae99SBarry Smith .   dm - the DM object
24747c6ae99SBarry Smith 
24847c6ae99SBarry Smith     Output Parameter:
24947c6ae99SBarry Smith .   vec - the local vector
25047c6ae99SBarry Smith 
25147c6ae99SBarry Smith     Level: developer
25247c6ae99SBarry Smith 
25347c6ae99SBarry Smith .seealso DMDestroy(), DMView(), DMGetInterpolation(), DMGetColoring(), DMGetMatrix()
25447c6ae99SBarry Smith 
25547c6ae99SBarry Smith @*/
25647c6ae99SBarry Smith PetscErrorCode PETSCDM_DLLEXPORT DMCreateLocalVector(DM dm,Vec *vec)
25747c6ae99SBarry Smith {
25847c6ae99SBarry Smith   PetscErrorCode ierr;
25947c6ae99SBarry Smith 
26047c6ae99SBarry Smith   PetscFunctionBegin;
26147c6ae99SBarry Smith   ierr = (*dm->ops->createlocalvector)(dm,vec);CHKERRQ(ierr);
26247c6ae99SBarry Smith   PetscFunctionReturn(0);
26347c6ae99SBarry Smith }
26447c6ae99SBarry Smith 
26547c6ae99SBarry Smith #undef __FUNCT__
26647c6ae99SBarry Smith #define __FUNCT__ "DMGetInterpolation"
26747c6ae99SBarry Smith /*@
268aa219208SBarry Smith     DMGetInterpolation - Gets interpolation matrix between two DMDA or DMComposite objects
26947c6ae99SBarry Smith 
27047c6ae99SBarry Smith     Collective on DM
27147c6ae99SBarry Smith 
27247c6ae99SBarry Smith     Input Parameter:
27347c6ae99SBarry Smith +   dm1 - the DM object
27447c6ae99SBarry Smith -   dm2 - the second, finer DM object
27547c6ae99SBarry Smith 
27647c6ae99SBarry Smith     Output Parameter:
27747c6ae99SBarry Smith +  mat - the interpolation
27847c6ae99SBarry Smith -  vec - the scaling (optional)
27947c6ae99SBarry Smith 
28047c6ae99SBarry Smith     Level: developer
28147c6ae99SBarry Smith 
28247c6ae99SBarry Smith .seealso DMDestroy(), DMView(), DMCreateGlobalVector(), DMGetColoring(), DMGetMatrix()
28347c6ae99SBarry Smith 
28447c6ae99SBarry Smith @*/
28547c6ae99SBarry Smith PetscErrorCode PETSCDM_DLLEXPORT DMGetInterpolation(DM dm1,DM dm2,Mat *mat,Vec *vec)
28647c6ae99SBarry Smith {
28747c6ae99SBarry Smith   PetscErrorCode ierr;
28847c6ae99SBarry Smith 
28947c6ae99SBarry Smith   PetscFunctionBegin;
29047c6ae99SBarry Smith   ierr = (*dm1->ops->getinterpolation)(dm1,dm2,mat,vec);CHKERRQ(ierr);
29147c6ae99SBarry Smith   PetscFunctionReturn(0);
29247c6ae99SBarry Smith }
29347c6ae99SBarry Smith 
29447c6ae99SBarry Smith #undef __FUNCT__
29547c6ae99SBarry Smith #define __FUNCT__ "DMGetInjection"
29647c6ae99SBarry Smith /*@
297aa219208SBarry Smith     DMGetInjection - Gets injection matrix between two DMDA or DMComposite objects
29847c6ae99SBarry Smith 
29947c6ae99SBarry Smith     Collective on DM
30047c6ae99SBarry Smith 
30147c6ae99SBarry Smith     Input Parameter:
30247c6ae99SBarry Smith +   dm1 - the DM object
30347c6ae99SBarry Smith -   dm2 - the second, finer DM object
30447c6ae99SBarry Smith 
30547c6ae99SBarry Smith     Output Parameter:
30647c6ae99SBarry Smith .   ctx - the injection
30747c6ae99SBarry Smith 
30847c6ae99SBarry Smith     Level: developer
30947c6ae99SBarry Smith 
31047c6ae99SBarry Smith .seealso DMDestroy(), DMView(), DMCreateGlobalVector(), DMGetColoring(), DMGetMatrix(), DMGetInterpolation()
31147c6ae99SBarry Smith 
31247c6ae99SBarry Smith @*/
31347c6ae99SBarry Smith PetscErrorCode PETSCDM_DLLEXPORT DMGetInjection(DM dm1,DM dm2,VecScatter *ctx)
31447c6ae99SBarry Smith {
31547c6ae99SBarry Smith   PetscErrorCode ierr;
31647c6ae99SBarry Smith 
31747c6ae99SBarry Smith   PetscFunctionBegin;
31847c6ae99SBarry Smith   ierr = (*dm1->ops->getinjection)(dm1,dm2,ctx);CHKERRQ(ierr);
31947c6ae99SBarry Smith   PetscFunctionReturn(0);
32047c6ae99SBarry Smith }
32147c6ae99SBarry Smith 
32247c6ae99SBarry Smith #undef __FUNCT__
32347c6ae99SBarry Smith #define __FUNCT__ "DMGetColoring"
32447c6ae99SBarry Smith /*@
325aa219208SBarry Smith     DMGetColoring - Gets coloring for a DMDA or DMComposite
32647c6ae99SBarry Smith 
32747c6ae99SBarry Smith     Collective on DM
32847c6ae99SBarry Smith 
32947c6ae99SBarry Smith     Input Parameter:
33047c6ae99SBarry Smith +   dm - the DM object
33147c6ae99SBarry Smith .   ctype - IS_COLORING_GHOSTED or IS_COLORING_GLOBAL
33247c6ae99SBarry Smith -   matype - either MATAIJ or MATBAIJ
33347c6ae99SBarry Smith 
33447c6ae99SBarry Smith     Output Parameter:
33547c6ae99SBarry Smith .   coloring - the coloring
33647c6ae99SBarry Smith 
33747c6ae99SBarry Smith     Level: developer
33847c6ae99SBarry Smith 
33947c6ae99SBarry Smith .seealso DMDestroy(), DMView(), DMCreateGlobalVector(), DMGetInterpolation(), DMGetMatrix()
34047c6ae99SBarry Smith 
34147c6ae99SBarry Smith @*/
34247c6ae99SBarry Smith PetscErrorCode PETSCDM_DLLEXPORT DMGetColoring(DM dm,ISColoringType ctype,const MatType mtype,ISColoring *coloring)
34347c6ae99SBarry Smith {
34447c6ae99SBarry Smith   PetscErrorCode ierr;
34547c6ae99SBarry Smith 
34647c6ae99SBarry Smith   PetscFunctionBegin;
34747c6ae99SBarry Smith   if (!dm->ops->getcoloring) SETERRQ(((PetscObject)dm)->comm,PETSC_ERR_SUP,"No coloring for this type of DM yet");
34847c6ae99SBarry Smith   ierr = (*dm->ops->getcoloring)(dm,ctype,mtype,coloring);CHKERRQ(ierr);
34947c6ae99SBarry Smith   PetscFunctionReturn(0);
35047c6ae99SBarry Smith }
35147c6ae99SBarry Smith 
35247c6ae99SBarry Smith #undef __FUNCT__
35347c6ae99SBarry Smith #define __FUNCT__ "DMGetMatrix"
35447c6ae99SBarry Smith /*@C
355aa219208SBarry Smith     DMGetMatrix - Gets empty Jacobian for a DMDA or DMComposite
35647c6ae99SBarry Smith 
35747c6ae99SBarry Smith     Collective on DM
35847c6ae99SBarry Smith 
35947c6ae99SBarry Smith     Input Parameter:
36047c6ae99SBarry Smith +   dm - the DM object
36147c6ae99SBarry Smith -   mtype - Supported types are MATSEQAIJ, MATMPIAIJ, MATSEQBAIJ, MATMPIBAIJ, or
36294013140SBarry Smith             any type which inherits from one of these (such as MATAIJ)
36347c6ae99SBarry Smith 
36447c6ae99SBarry Smith     Output Parameter:
36547c6ae99SBarry Smith .   mat - the empty Jacobian
36647c6ae99SBarry Smith 
36747c6ae99SBarry Smith     Level: developer
36847c6ae99SBarry Smith 
36994013140SBarry Smith     Notes: This properly preallocates the number of nonzeros in the sparse matrix so you
37094013140SBarry Smith        do not need to do it yourself.
37194013140SBarry Smith 
37294013140SBarry Smith        By default it also sets the nonzero structure and puts in the zero entries. To prevent setting
373aa219208SBarry Smith        the nonzero pattern call DMDASetMatPreallocateOnly()
37494013140SBarry Smith 
37594013140SBarry Smith        For structured grid problems, when you call MatView() on this matrix it is displayed using the global natural ordering, NOT in the ordering used
37694013140SBarry Smith        internally by PETSc.
37794013140SBarry Smith 
37894013140SBarry Smith        For structured grid problems, in general it is easiest to use MatSetValuesStencil() or MatSetValuesLocal() to put values into the matrix because MatSetValues() requires
379aa219208SBarry Smith        the indices for the global numbering for DMDAs which is complicated.
38094013140SBarry Smith 
38147c6ae99SBarry Smith .seealso DMDestroy(), DMView(), DMCreateGlobalVector(), DMGetInterpolation(), DMGetMatrix()
38247c6ae99SBarry Smith 
38347c6ae99SBarry Smith @*/
38447c6ae99SBarry Smith PetscErrorCode PETSCDM_DLLEXPORT DMGetMatrix(DM dm, const MatType mtype,Mat *mat)
38547c6ae99SBarry Smith {
38647c6ae99SBarry Smith   PetscErrorCode ierr;
38747c6ae99SBarry Smith 
38847c6ae99SBarry Smith   PetscFunctionBegin;
38947c6ae99SBarry Smith   ierr = (*dm->ops->getmatrix)(dm,mtype,mat);CHKERRQ(ierr);
39047c6ae99SBarry Smith   PetscFunctionReturn(0);
39147c6ae99SBarry Smith }
39247c6ae99SBarry Smith 
39347c6ae99SBarry Smith #undef __FUNCT__
39447c6ae99SBarry Smith #define __FUNCT__ "DMRefine"
39547c6ae99SBarry Smith /*@
39647c6ae99SBarry Smith     DMRefine - Refines a DM object
39747c6ae99SBarry Smith 
39847c6ae99SBarry Smith     Collective on DM
39947c6ae99SBarry Smith 
40047c6ae99SBarry Smith     Input Parameter:
40147c6ae99SBarry Smith +   dm - the DM object
40247c6ae99SBarry Smith -   comm - the communicator to contain the new DM object (or PETSC_NULL)
40347c6ae99SBarry Smith 
40447c6ae99SBarry Smith     Output Parameter:
40547c6ae99SBarry Smith .   dmf - the refined DM
40647c6ae99SBarry Smith 
40747c6ae99SBarry Smith     Level: developer
40847c6ae99SBarry Smith 
40947c6ae99SBarry Smith .seealso DMCoarsen(), DMDestroy(), DMView(), DMCreateGlobalVector(), DMGetInterpolation()
41047c6ae99SBarry Smith 
41147c6ae99SBarry Smith @*/
41247c6ae99SBarry Smith PetscErrorCode PETSCDM_DLLEXPORT DMRefine(DM dm,MPI_Comm comm,DM *dmf)
41347c6ae99SBarry Smith {
41447c6ae99SBarry Smith   PetscErrorCode ierr;
41547c6ae99SBarry Smith 
41647c6ae99SBarry Smith   PetscFunctionBegin;
41747c6ae99SBarry Smith   ierr = (*dm->ops->refine)(dm,comm,dmf);CHKERRQ(ierr);
41847c6ae99SBarry Smith   PetscFunctionReturn(0);
41947c6ae99SBarry Smith }
42047c6ae99SBarry Smith 
42147c6ae99SBarry Smith #undef __FUNCT__
42247c6ae99SBarry Smith #define __FUNCT__ "DMGlobalToLocalBegin"
42347c6ae99SBarry Smith /*@
42447c6ae99SBarry Smith     DMGlobalToLocalBegin - Begins updating local vectors from global vector
42547c6ae99SBarry Smith 
42647c6ae99SBarry Smith     Neighbor-wise Collective on DM
42747c6ae99SBarry Smith 
42847c6ae99SBarry Smith     Input Parameters:
42947c6ae99SBarry Smith +   dm - the DM object
43047c6ae99SBarry Smith .   g - the global vector
43147c6ae99SBarry Smith .   mode - INSERT_VALUES or ADD_VALUES
43247c6ae99SBarry Smith -   l - the local vector
43347c6ae99SBarry Smith 
43447c6ae99SBarry Smith 
43547c6ae99SBarry Smith     Level: beginner
43647c6ae99SBarry Smith 
4379a42bb27SBarry Smith .seealso DMCoarsen(), DMDestroy(), DMView(), DMCreateGlobalVector(), DMGetInterpolation(), DMGlobalToLocalEnd(), DMLocalToGlobalBegin()
43847c6ae99SBarry Smith 
43947c6ae99SBarry Smith @*/
44047c6ae99SBarry Smith PetscErrorCode PETSCDM_DLLEXPORT DMGlobalToLocalBegin(DM dm,Vec g,InsertMode mode,Vec l)
44147c6ae99SBarry Smith {
44247c6ae99SBarry Smith   PetscErrorCode ierr;
44347c6ae99SBarry Smith 
44447c6ae99SBarry Smith   PetscFunctionBegin;
44547c6ae99SBarry Smith   ierr = (*dm->ops->globaltolocalbegin)(dm,g,mode,l);CHKERRQ(ierr);
44647c6ae99SBarry Smith   PetscFunctionReturn(0);
44747c6ae99SBarry Smith }
44847c6ae99SBarry Smith 
44947c6ae99SBarry Smith #undef __FUNCT__
45047c6ae99SBarry Smith #define __FUNCT__ "DMGlobalToLocalEnd"
45147c6ae99SBarry Smith /*@
45247c6ae99SBarry Smith     DMGlobalToLocalEnd - Ends updating local vectors from global vector
45347c6ae99SBarry Smith 
45447c6ae99SBarry Smith     Neighbor-wise Collective on DM
45547c6ae99SBarry Smith 
45647c6ae99SBarry Smith     Input Parameters:
45747c6ae99SBarry Smith +   dm - the DM object
45847c6ae99SBarry Smith .   g - the global vector
45947c6ae99SBarry Smith .   mode - INSERT_VALUES or ADD_VALUES
46047c6ae99SBarry Smith -   l - the local vector
46147c6ae99SBarry Smith 
46247c6ae99SBarry Smith 
46347c6ae99SBarry Smith     Level: beginner
46447c6ae99SBarry Smith 
4659a42bb27SBarry Smith .seealso DMCoarsen(), DMDestroy(), DMView(), DMCreateGlobalVector(), DMGetInterpolation(), DMGlobalToLocalEnd(), DMLocalToGlobalBegin()
46647c6ae99SBarry Smith 
46747c6ae99SBarry Smith @*/
46847c6ae99SBarry Smith PetscErrorCode PETSCDM_DLLEXPORT DMGlobalToLocalEnd(DM dm,Vec g,InsertMode mode,Vec l)
46947c6ae99SBarry Smith {
47047c6ae99SBarry Smith   PetscErrorCode ierr;
47147c6ae99SBarry Smith 
47247c6ae99SBarry Smith   PetscFunctionBegin;
47347c6ae99SBarry Smith   ierr = (*dm->ops->globaltolocalend)(dm,g,mode,l);CHKERRQ(ierr);
47447c6ae99SBarry Smith   PetscFunctionReturn(0);
47547c6ae99SBarry Smith }
47647c6ae99SBarry Smith 
47747c6ae99SBarry Smith #undef __FUNCT__
4789a42bb27SBarry Smith #define __FUNCT__ "DMLocalToGlobalBegin"
47947c6ae99SBarry Smith /*@
4809a42bb27SBarry Smith     DMLocalToGlobalBegin - updates global vectors from local vectors
4819a42bb27SBarry Smith 
4829a42bb27SBarry Smith     Neighbor-wise Collective on DM
4839a42bb27SBarry Smith 
4849a42bb27SBarry Smith     Input Parameters:
4859a42bb27SBarry Smith +   dm - the DM object
4869a42bb27SBarry Smith .   g - the global vector
4879a42bb27SBarry Smith .   mode - if INSERT_VALUES then no parallel communication is used, if ADD_VALUES then all ghost points from the same base point accumulate into that
4889a42bb27SBarry Smith            base point.
4899a42bb27SBarry Smith -   l - the local vector
4909a42bb27SBarry Smith 
4919a42bb27SBarry Smith     Notes: In the ADD_VALUES case you normally would zero the receiving vector before beginning this operation. If you would like to simply add the non-ghosted values in the local
4929a42bb27SBarry Smith            array into the global array you need to either (1) zero the ghosted locations and use ADD_VALUES or (2) use INSERT_VALUES into a work global array and then add the work
4939a42bb27SBarry Smith            global array to the final global array with VecAXPY().
4949a42bb27SBarry Smith 
4959a42bb27SBarry Smith     Level: beginner
4969a42bb27SBarry Smith 
4979a42bb27SBarry Smith .seealso DMCoarsen(), DMDestroy(), DMView(), DMCreateGlobalVector(), DMGetInterpolation(), DMGlobalToLocalEnd(), DMGlobalToLocalBegin()
4989a42bb27SBarry Smith 
4999a42bb27SBarry Smith @*/
5009a42bb27SBarry Smith PetscErrorCode PETSCDM_DLLEXPORT DMLocalToGlobalBegin(DM dm,Vec g,InsertMode mode,Vec l)
5019a42bb27SBarry Smith {
5029a42bb27SBarry Smith   PetscErrorCode ierr;
5039a42bb27SBarry Smith 
5049a42bb27SBarry Smith   PetscFunctionBegin;
5059a42bb27SBarry Smith   ierr = (*dm->ops->localtoglobalbegin)(dm,g,mode,l);CHKERRQ(ierr);
5069a42bb27SBarry Smith   PetscFunctionReturn(0);
5079a42bb27SBarry Smith }
5089a42bb27SBarry Smith 
5099a42bb27SBarry Smith #undef __FUNCT__
5109a42bb27SBarry Smith #define __FUNCT__ "DMLocalToGlobalEnd"
5119a42bb27SBarry Smith /*@
5129a42bb27SBarry Smith     DMLocalToGlobalEnd - updates global vectors from local vectors
51347c6ae99SBarry Smith 
51447c6ae99SBarry Smith     Neighbor-wise Collective on DM
51547c6ae99SBarry Smith 
51647c6ae99SBarry Smith     Input Parameters:
51747c6ae99SBarry Smith +   dm - the DM object
51847c6ae99SBarry Smith .   g - the global vector
51947c6ae99SBarry Smith .   mode - INSERT_VALUES or ADD_VALUES
52047c6ae99SBarry Smith -   l - the local vector
52147c6ae99SBarry Smith 
52247c6ae99SBarry Smith 
52347c6ae99SBarry Smith     Level: beginner
52447c6ae99SBarry Smith 
5259a42bb27SBarry Smith .seealso DMCoarsen(), DMDestroy(), DMView(), DMCreateGlobalVector(), DMGetInterpolation(), DMGlobalToLocalEnd(), DMGlobalToLocalEnd()
52647c6ae99SBarry Smith 
52747c6ae99SBarry Smith @*/
5289a42bb27SBarry Smith PetscErrorCode PETSCDM_DLLEXPORT DMLocalToGlobalEnd(DM dm,Vec g,InsertMode mode,Vec l)
52947c6ae99SBarry Smith {
53047c6ae99SBarry Smith   PetscErrorCode ierr;
53147c6ae99SBarry Smith 
53247c6ae99SBarry Smith   PetscFunctionBegin;
5339a42bb27SBarry Smith   ierr = (*dm->ops->localtoglobalend)(dm,g,mode,l);CHKERRQ(ierr);
53447c6ae99SBarry Smith   PetscFunctionReturn(0);
53547c6ae99SBarry Smith }
53647c6ae99SBarry Smith 
53747c6ae99SBarry Smith #undef __FUNCT__
53847c6ae99SBarry Smith #define __FUNCT__ "DMComputeJacobianDefault"
53947c6ae99SBarry Smith /*@
54047c6ae99SBarry Smith     DMComputeJacobianDefault - computes the Jacobian using the DMComputeFunction() if Jacobian computer is not provided
54147c6ae99SBarry Smith 
54247c6ae99SBarry Smith     Collective on DM
54347c6ae99SBarry Smith 
54447c6ae99SBarry Smith     Input Parameter:
54547c6ae99SBarry Smith +   dm - the DM object
54647c6ae99SBarry Smith .   x - location to compute Jacobian at; may be ignored for linear problems
54747c6ae99SBarry Smith .   A - matrix that defines the operator for the linear solve
54847c6ae99SBarry Smith -   B - the matrix used to construct the preconditioner
54947c6ae99SBarry Smith 
55047c6ae99SBarry Smith     Level: developer
55147c6ae99SBarry Smith 
55247c6ae99SBarry Smith .seealso DMView(), DMCreateGlobalVector(), DMGetInterpolation(), DMGetColoring(), DMGetMatrix(), DMGetContext(), DMSetInitialGuess(),
55347c6ae99SBarry Smith          DMSetFunction()
55447c6ae99SBarry Smith 
55547c6ae99SBarry Smith @*/
55647c6ae99SBarry Smith PetscErrorCode PETSCDM_DLLEXPORT DMComputeJacobianDefault(DM dm,Vec x,Mat A,Mat B,MatStructure *stflag)
55747c6ae99SBarry Smith {
55847c6ae99SBarry Smith   PetscErrorCode ierr;
55947c6ae99SBarry Smith   PetscFunctionBegin;
56047c6ae99SBarry Smith   *stflag = SAME_NONZERO_PATTERN;
56147c6ae99SBarry Smith   ierr  = MatFDColoringApply(B,dm->fd,x,stflag,dm);CHKERRQ(ierr);
56247c6ae99SBarry Smith   if (A != B) {
56347c6ae99SBarry Smith     ierr = MatAssemblyBegin(A,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
56447c6ae99SBarry Smith     ierr = MatAssemblyEnd(A,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
56547c6ae99SBarry Smith   }
56647c6ae99SBarry Smith   PetscFunctionReturn(0);
56747c6ae99SBarry Smith }
56847c6ae99SBarry Smith 
56947c6ae99SBarry Smith #undef __FUNCT__
57047c6ae99SBarry Smith #define __FUNCT__ "DMCoarsen"
57147c6ae99SBarry Smith /*@
57247c6ae99SBarry Smith     DMCoarsen - Coarsens a DM object
57347c6ae99SBarry Smith 
57447c6ae99SBarry Smith     Collective on DM
57547c6ae99SBarry Smith 
57647c6ae99SBarry Smith     Input Parameter:
57747c6ae99SBarry Smith +   dm - the DM object
57847c6ae99SBarry Smith -   comm - the communicator to contain the new DM object (or PETSC_NULL)
57947c6ae99SBarry Smith 
58047c6ae99SBarry Smith     Output Parameter:
58147c6ae99SBarry Smith .   dmc - the coarsened DM
58247c6ae99SBarry Smith 
58347c6ae99SBarry Smith     Level: developer
58447c6ae99SBarry Smith 
58547c6ae99SBarry Smith .seealso DMRefine(), DMDestroy(), DMView(), DMCreateGlobalVector(), DMGetInterpolation()
58647c6ae99SBarry Smith 
58747c6ae99SBarry Smith @*/
58847c6ae99SBarry Smith PetscErrorCode PETSCDM_DLLEXPORT DMCoarsen(DM dm, MPI_Comm comm, DM *dmc)
58947c6ae99SBarry Smith {
59047c6ae99SBarry Smith   PetscErrorCode ierr;
59147c6ae99SBarry Smith 
59247c6ae99SBarry Smith   PetscFunctionBegin;
59347c6ae99SBarry Smith   ierr = (*dm->ops->coarsen)(dm, comm, dmc);CHKERRQ(ierr);
59447c6ae99SBarry Smith   (*dmc)->ops->initialguess = dm->ops->initialguess;
59547c6ae99SBarry Smith   (*dmc)->ops->function     = dm->ops->function;
59647c6ae99SBarry Smith   (*dmc)->ops->functionj    = dm->ops->functionj;
59747c6ae99SBarry Smith   if (dm->ops->jacobian != DMComputeJacobianDefault) {
59847c6ae99SBarry Smith     (*dmc)->ops->jacobian     = dm->ops->jacobian;
59947c6ae99SBarry Smith   }
60047c6ae99SBarry Smith   PetscFunctionReturn(0);
60147c6ae99SBarry Smith }
60247c6ae99SBarry Smith 
60347c6ae99SBarry Smith #undef __FUNCT__
60447c6ae99SBarry Smith #define __FUNCT__ "DMRefineHierarchy"
60547c6ae99SBarry Smith /*@C
60647c6ae99SBarry Smith     DMRefineHierarchy - Refines a DM object, all levels at once
60747c6ae99SBarry Smith 
60847c6ae99SBarry Smith     Collective on DM
60947c6ae99SBarry Smith 
61047c6ae99SBarry Smith     Input Parameter:
61147c6ae99SBarry Smith +   dm - the DM object
61247c6ae99SBarry Smith -   nlevels - the number of levels of refinement
61347c6ae99SBarry Smith 
61447c6ae99SBarry Smith     Output Parameter:
61547c6ae99SBarry Smith .   dmf - the refined DM hierarchy
61647c6ae99SBarry Smith 
61747c6ae99SBarry Smith     Level: developer
61847c6ae99SBarry Smith 
61947c6ae99SBarry Smith .seealso DMCoarsenHierarchy(), DMDestroy(), DMView(), DMCreateGlobalVector(), DMGetInterpolation()
62047c6ae99SBarry Smith 
62147c6ae99SBarry Smith @*/
62247c6ae99SBarry Smith PetscErrorCode PETSCDM_DLLEXPORT DMRefineHierarchy(DM dm,PetscInt nlevels,DM dmf[])
62347c6ae99SBarry Smith {
62447c6ae99SBarry Smith   PetscErrorCode ierr;
62547c6ae99SBarry Smith 
62647c6ae99SBarry Smith   PetscFunctionBegin;
62747c6ae99SBarry Smith   if (nlevels < 0) SETERRQ(((PetscObject)dm)->comm,PETSC_ERR_ARG_OUTOFRANGE,"nlevels cannot be negative");
62847c6ae99SBarry Smith   if (nlevels == 0) PetscFunctionReturn(0);
62947c6ae99SBarry Smith   if (dm->ops->refinehierarchy) {
63047c6ae99SBarry Smith     ierr = (*dm->ops->refinehierarchy)(dm,nlevels,dmf);CHKERRQ(ierr);
63147c6ae99SBarry Smith   } else if (dm->ops->refine) {
63247c6ae99SBarry Smith     PetscInt i;
63347c6ae99SBarry Smith 
63447c6ae99SBarry Smith     ierr = DMRefine(dm,((PetscObject)dm)->comm,&dmf[0]);CHKERRQ(ierr);
63547c6ae99SBarry Smith     for (i=1; i<nlevels; i++) {
63647c6ae99SBarry Smith       ierr = DMRefine(dmf[i-1],((PetscObject)dm)->comm,&dmf[i]);CHKERRQ(ierr);
63747c6ae99SBarry Smith     }
63847c6ae99SBarry Smith   } else {
63947c6ae99SBarry Smith     SETERRQ(((PetscObject)dm)->comm,PETSC_ERR_SUP,"No RefineHierarchy for this DM yet");
64047c6ae99SBarry Smith   }
64147c6ae99SBarry Smith   PetscFunctionReturn(0);
64247c6ae99SBarry Smith }
64347c6ae99SBarry Smith 
64447c6ae99SBarry Smith #undef __FUNCT__
64547c6ae99SBarry Smith #define __FUNCT__ "DMCoarsenHierarchy"
64647c6ae99SBarry Smith /*@C
64747c6ae99SBarry Smith     DMCoarsenHierarchy - Coarsens a DM object, all levels at once
64847c6ae99SBarry Smith 
64947c6ae99SBarry Smith     Collective on DM
65047c6ae99SBarry Smith 
65147c6ae99SBarry Smith     Input Parameter:
65247c6ae99SBarry Smith +   dm - the DM object
65347c6ae99SBarry Smith -   nlevels - the number of levels of coarsening
65447c6ae99SBarry Smith 
65547c6ae99SBarry Smith     Output Parameter:
65647c6ae99SBarry Smith .   dmc - the coarsened DM hierarchy
65747c6ae99SBarry Smith 
65847c6ae99SBarry Smith     Level: developer
65947c6ae99SBarry Smith 
66047c6ae99SBarry Smith .seealso DMRefineHierarchy(), DMDestroy(), DMView(), DMCreateGlobalVector(), DMGetInterpolation()
66147c6ae99SBarry Smith 
66247c6ae99SBarry Smith @*/
66347c6ae99SBarry Smith PetscErrorCode PETSCDM_DLLEXPORT DMCoarsenHierarchy(DM dm, PetscInt nlevels, DM dmc[])
66447c6ae99SBarry Smith {
66547c6ae99SBarry Smith   PetscErrorCode ierr;
66647c6ae99SBarry Smith 
66747c6ae99SBarry Smith   PetscFunctionBegin;
66847c6ae99SBarry Smith   if (nlevels < 0) SETERRQ(((PetscObject)dm)->comm,PETSC_ERR_ARG_OUTOFRANGE,"nlevels cannot be negative");
66947c6ae99SBarry Smith   if (nlevels == 0) PetscFunctionReturn(0);
67047c6ae99SBarry Smith   PetscValidPointer(dmc,3);
67147c6ae99SBarry Smith   if (dm->ops->coarsenhierarchy) {
67247c6ae99SBarry Smith     ierr = (*dm->ops->coarsenhierarchy)(dm, nlevels, dmc);CHKERRQ(ierr);
67347c6ae99SBarry Smith   } else if (dm->ops->coarsen) {
67447c6ae99SBarry Smith     PetscInt i;
67547c6ae99SBarry Smith 
67647c6ae99SBarry Smith     ierr = DMCoarsen(dm,((PetscObject)dm)->comm,&dmc[0]);CHKERRQ(ierr);
67747c6ae99SBarry Smith     for (i=1; i<nlevels; i++) {
67847c6ae99SBarry Smith       ierr = DMCoarsen(dmc[i-1],((PetscObject)dm)->comm,&dmc[i]);CHKERRQ(ierr);
67947c6ae99SBarry Smith     }
68047c6ae99SBarry Smith   } else {
68147c6ae99SBarry Smith     SETERRQ(((PetscObject)dm)->comm,PETSC_ERR_SUP,"No CoarsenHierarchy for this DM yet");
68247c6ae99SBarry Smith   }
68347c6ae99SBarry Smith   PetscFunctionReturn(0);
68447c6ae99SBarry Smith }
68547c6ae99SBarry Smith 
68647c6ae99SBarry Smith #undef __FUNCT__
68747c6ae99SBarry Smith #define __FUNCT__ "DMGetAggregates"
68847c6ae99SBarry Smith /*@
68947c6ae99SBarry Smith    DMGetAggregates - Gets the aggregates that map between
69047c6ae99SBarry Smith    grids associated with two DMs.
69147c6ae99SBarry Smith 
69247c6ae99SBarry Smith    Collective on DM
69347c6ae99SBarry Smith 
69447c6ae99SBarry Smith    Input Parameters:
69547c6ae99SBarry Smith +  dmc - the coarse grid DM
69647c6ae99SBarry Smith -  dmf - the fine grid DM
69747c6ae99SBarry Smith 
69847c6ae99SBarry Smith    Output Parameters:
69947c6ae99SBarry Smith .  rest - the restriction matrix (transpose of the projection matrix)
70047c6ae99SBarry Smith 
70147c6ae99SBarry Smith    Level: intermediate
70247c6ae99SBarry Smith 
70347c6ae99SBarry Smith .keywords: interpolation, restriction, multigrid
70447c6ae99SBarry Smith 
70547c6ae99SBarry Smith .seealso: DMRefine(), DMGetInjection(), DMGetInterpolation()
70647c6ae99SBarry Smith @*/
70747c6ae99SBarry Smith PetscErrorCode PETSCDM_DLLEXPORT DMGetAggregates(DM dmc, DM dmf, Mat *rest)
70847c6ae99SBarry Smith {
70947c6ae99SBarry Smith   PetscErrorCode ierr;
71047c6ae99SBarry Smith 
71147c6ae99SBarry Smith   PetscFunctionBegin;
71247c6ae99SBarry Smith   ierr = (*dmc->ops->getaggregates)(dmc, dmf, rest);CHKERRQ(ierr);
71347c6ae99SBarry Smith   PetscFunctionReturn(0);
71447c6ae99SBarry Smith }
71547c6ae99SBarry Smith 
71647c6ae99SBarry Smith #undef __FUNCT__
71747c6ae99SBarry Smith #define __FUNCT__ "DMSetContext"
71847c6ae99SBarry Smith /*@
71947c6ae99SBarry Smith     DMSetContext - Set a user context into a DM object
72047c6ae99SBarry Smith 
72147c6ae99SBarry Smith     Not Collective
72247c6ae99SBarry Smith 
72347c6ae99SBarry Smith     Input Parameters:
72447c6ae99SBarry Smith +   dm - the DM object
72547c6ae99SBarry Smith -   ctx - the user context
72647c6ae99SBarry Smith 
72747c6ae99SBarry Smith     Level: intermediate
72847c6ae99SBarry Smith 
72947c6ae99SBarry Smith .seealso DMView(), DMCreateGlobalVector(), DMGetInterpolation(), DMGetColoring(), DMGetMatrix(), DMGetContext()
73047c6ae99SBarry Smith 
73147c6ae99SBarry Smith @*/
73247c6ae99SBarry Smith PetscErrorCode PETSCDM_DLLEXPORT DMSetContext(DM dm,void *ctx)
73347c6ae99SBarry Smith {
73447c6ae99SBarry Smith   PetscFunctionBegin;
73547c6ae99SBarry Smith   dm->ctx = ctx;
73647c6ae99SBarry Smith   PetscFunctionReturn(0);
73747c6ae99SBarry Smith }
73847c6ae99SBarry Smith 
73947c6ae99SBarry Smith #undef __FUNCT__
74047c6ae99SBarry Smith #define __FUNCT__ "DMGetContext"
74147c6ae99SBarry Smith /*@
74247c6ae99SBarry Smith     DMGetContext - Gets a user context from a DM object
74347c6ae99SBarry Smith 
74447c6ae99SBarry Smith     Not Collective
74547c6ae99SBarry Smith 
74647c6ae99SBarry Smith     Input Parameter:
74747c6ae99SBarry Smith .   dm - the DM object
74847c6ae99SBarry Smith 
74947c6ae99SBarry Smith     Output Parameter:
75047c6ae99SBarry Smith .   ctx - the user context
75147c6ae99SBarry Smith 
75247c6ae99SBarry Smith     Level: intermediate
75347c6ae99SBarry Smith 
75447c6ae99SBarry Smith .seealso DMView(), DMCreateGlobalVector(), DMGetInterpolation(), DMGetColoring(), DMGetMatrix(), DMGetContext()
75547c6ae99SBarry Smith 
75647c6ae99SBarry Smith @*/
75747c6ae99SBarry Smith PetscErrorCode PETSCDM_DLLEXPORT DMGetContext(DM dm,void **ctx)
75847c6ae99SBarry Smith {
75947c6ae99SBarry Smith   PetscFunctionBegin;
76047c6ae99SBarry Smith   *ctx = dm->ctx;
76147c6ae99SBarry Smith   PetscFunctionReturn(0);
76247c6ae99SBarry Smith }
76347c6ae99SBarry Smith 
76447c6ae99SBarry Smith #undef __FUNCT__
76547c6ae99SBarry Smith #define __FUNCT__ "DMSetInitialGuess"
76647c6ae99SBarry Smith /*@
76747c6ae99SBarry Smith     DMSetInitialGuess - sets a function to compute an initial guess vector entries for the solvers
76847c6ae99SBarry Smith 
76947c6ae99SBarry Smith     Logically Collective on DM
77047c6ae99SBarry Smith 
77147c6ae99SBarry Smith     Input Parameter:
77247c6ae99SBarry Smith +   dm - the DM object to destroy
77347c6ae99SBarry Smith -   f - the function to compute the initial guess
77447c6ae99SBarry Smith 
77547c6ae99SBarry Smith     Level: intermediate
77647c6ae99SBarry Smith 
77747c6ae99SBarry Smith .seealso DMView(), DMCreateGlobalVector(), DMGetInterpolation(), DMGetColoring(), DMGetMatrix(), DMGetContext(), DMSetFunction(), DMSetJacobian()
77847c6ae99SBarry Smith 
77947c6ae99SBarry Smith @*/
78047c6ae99SBarry Smith PetscErrorCode PETSCDM_DLLEXPORT DMSetInitialGuess(DM dm,PetscErrorCode (*f)(DM,Vec))
78147c6ae99SBarry Smith {
78247c6ae99SBarry Smith   PetscFunctionBegin;
78347c6ae99SBarry Smith   dm->ops->initialguess = f;
78447c6ae99SBarry Smith   PetscFunctionReturn(0);
78547c6ae99SBarry Smith }
78647c6ae99SBarry Smith 
78747c6ae99SBarry Smith #undef __FUNCT__
78847c6ae99SBarry Smith #define __FUNCT__ "DMSetFunction"
78947c6ae99SBarry Smith /*@
79047c6ae99SBarry Smith     DMSetFunction - sets a function to compute the right hand side vector entries for the KSP solver or nonlinear function for SNES
79147c6ae99SBarry Smith 
79247c6ae99SBarry Smith     Logically Collective on DM
79347c6ae99SBarry Smith 
79447c6ae99SBarry Smith     Input Parameter:
79547c6ae99SBarry Smith +   dm - the DM object
79647c6ae99SBarry Smith -   f - the function to compute (use PETSC_NULL to cancel a previous function that was set)
79747c6ae99SBarry Smith 
79847c6ae99SBarry Smith     Level: intermediate
79947c6ae99SBarry Smith 
80047c6ae99SBarry Smith     Notes: This sets both the function for function evaluations and the function used to compute Jacobians via finite differences if no Jacobian
80147c6ae99SBarry Smith            computer is provided with DMSetJacobian(). Canceling cancels the function, but not the function used to compute the Jacobian.
80247c6ae99SBarry Smith 
80347c6ae99SBarry Smith .seealso DMView(), DMCreateGlobalVector(), DMGetInterpolation(), DMGetColoring(), DMGetMatrix(), DMGetContext(), DMSetInitialGuess(),
80447c6ae99SBarry Smith          DMSetJacobian()
80547c6ae99SBarry Smith 
80647c6ae99SBarry Smith @*/
80747c6ae99SBarry Smith PetscErrorCode PETSCDM_DLLEXPORT DMSetFunction(DM dm,PetscErrorCode (*f)(DM,Vec,Vec))
80847c6ae99SBarry Smith {
80947c6ae99SBarry Smith   PetscFunctionBegin;
81047c6ae99SBarry Smith   dm->ops->function = f;
81147c6ae99SBarry Smith   if (f) {
81247c6ae99SBarry Smith     dm->ops->functionj = f;
81347c6ae99SBarry Smith   }
81447c6ae99SBarry Smith   PetscFunctionReturn(0);
81547c6ae99SBarry Smith }
81647c6ae99SBarry Smith 
81747c6ae99SBarry Smith #undef __FUNCT__
81847c6ae99SBarry Smith #define __FUNCT__ "DMSetJacobian"
81947c6ae99SBarry Smith /*@
82047c6ae99SBarry Smith     DMSetJacobian - sets a function to compute the matrix entries for the KSP solver or Jacobian for SNES
82147c6ae99SBarry Smith 
82247c6ae99SBarry Smith     Logically Collective on DM
82347c6ae99SBarry Smith 
82447c6ae99SBarry Smith     Input Parameter:
82547c6ae99SBarry Smith +   dm - the DM object to destroy
82647c6ae99SBarry Smith -   f - the function to compute the matrix entries
82747c6ae99SBarry Smith 
82847c6ae99SBarry Smith     Level: intermediate
82947c6ae99SBarry Smith 
83047c6ae99SBarry Smith .seealso DMView(), DMCreateGlobalVector(), DMGetInterpolation(), DMGetColoring(), DMGetMatrix(), DMGetContext(), DMSetInitialGuess(),
83147c6ae99SBarry Smith          DMSetFunction()
83247c6ae99SBarry Smith 
83347c6ae99SBarry Smith @*/
83447c6ae99SBarry Smith PetscErrorCode PETSCDM_DLLEXPORT DMSetJacobian(DM dm,PetscErrorCode (*f)(DM,Vec,Mat,Mat,MatStructure*))
83547c6ae99SBarry Smith {
83647c6ae99SBarry Smith   PetscFunctionBegin;
83747c6ae99SBarry Smith   dm->ops->jacobian = f;
83847c6ae99SBarry Smith   PetscFunctionReturn(0);
83947c6ae99SBarry Smith }
84047c6ae99SBarry Smith 
84147c6ae99SBarry Smith #undef __FUNCT__
84247c6ae99SBarry Smith #define __FUNCT__ "DMComputeInitialGuess"
84347c6ae99SBarry Smith /*@
84447c6ae99SBarry Smith     DMComputeInitialGuess - computes an initial guess vector entries for the KSP solvers
84547c6ae99SBarry Smith 
84647c6ae99SBarry Smith     Collective on DM
84747c6ae99SBarry Smith 
84847c6ae99SBarry Smith     Input Parameter:
84947c6ae99SBarry Smith +   dm - the DM object to destroy
85047c6ae99SBarry Smith -   x - the vector to hold the initial guess values
85147c6ae99SBarry Smith 
85247c6ae99SBarry Smith     Level: developer
85347c6ae99SBarry Smith 
85447c6ae99SBarry Smith .seealso DMView(), DMCreateGlobalVector(), DMGetInterpolation(), DMGetColoring(), DMGetMatrix(), DMGetContext(), DMSetRhs(), DMSetMat()
85547c6ae99SBarry Smith 
85647c6ae99SBarry Smith @*/
85747c6ae99SBarry Smith PetscErrorCode PETSCDM_DLLEXPORT DMComputeInitialGuess(DM dm,Vec x)
85847c6ae99SBarry Smith {
85947c6ae99SBarry Smith   PetscErrorCode ierr;
86047c6ae99SBarry Smith   PetscFunctionBegin;
86147c6ae99SBarry Smith   if (!dm->ops->initialguess) SETERRQ(((PetscObject)dm)->comm,PETSC_ERR_ARG_WRONGSTATE,"Need to provide function with DMSetInitialGuess()");
86247c6ae99SBarry Smith   ierr = (*dm->ops->initialguess)(dm,x);CHKERRQ(ierr);
86347c6ae99SBarry Smith   PetscFunctionReturn(0);
86447c6ae99SBarry Smith }
86547c6ae99SBarry Smith 
86647c6ae99SBarry Smith #undef __FUNCT__
86747c6ae99SBarry Smith #define __FUNCT__ "DMHasInitialGuess"
86847c6ae99SBarry Smith /*@
86947c6ae99SBarry Smith     DMHasInitialGuess - does the DM object have an initial guess function
87047c6ae99SBarry Smith 
87147c6ae99SBarry Smith     Not Collective
87247c6ae99SBarry Smith 
87347c6ae99SBarry Smith     Input Parameter:
87447c6ae99SBarry Smith .   dm - the DM object to destroy
87547c6ae99SBarry Smith 
87647c6ae99SBarry Smith     Output Parameter:
87747c6ae99SBarry Smith .   flg - PETSC_TRUE if function exists
87847c6ae99SBarry Smith 
87947c6ae99SBarry Smith     Level: developer
88047c6ae99SBarry Smith 
88147c6ae99SBarry Smith .seealso DMView(), DMCreateGlobalVector(), DMGetInterpolation(), DMGetColoring(), DMGetMatrix(), DMGetContext(), DMSetFunction(), DMSetJacobian()
88247c6ae99SBarry Smith 
88347c6ae99SBarry Smith @*/
88447c6ae99SBarry Smith PetscErrorCode PETSCDM_DLLEXPORT DMHasInitialGuess(DM dm,PetscBool  *flg)
88547c6ae99SBarry Smith {
88647c6ae99SBarry Smith   PetscFunctionBegin;
88747c6ae99SBarry Smith   *flg =  (dm->ops->initialguess) ? PETSC_TRUE : PETSC_FALSE;
88847c6ae99SBarry Smith   PetscFunctionReturn(0);
88947c6ae99SBarry Smith }
89047c6ae99SBarry Smith 
89147c6ae99SBarry Smith #undef __FUNCT__
89247c6ae99SBarry Smith #define __FUNCT__ "DMHasFunction"
89347c6ae99SBarry Smith /*@
89447c6ae99SBarry Smith     DMHasFunction - does the DM object have a function
89547c6ae99SBarry Smith 
89647c6ae99SBarry Smith     Not Collective
89747c6ae99SBarry Smith 
89847c6ae99SBarry Smith     Input Parameter:
89947c6ae99SBarry Smith .   dm - the DM object to destroy
90047c6ae99SBarry Smith 
90147c6ae99SBarry Smith     Output Parameter:
90247c6ae99SBarry Smith .   flg - PETSC_TRUE if function exists
90347c6ae99SBarry Smith 
90447c6ae99SBarry Smith     Level: developer
90547c6ae99SBarry Smith 
90647c6ae99SBarry Smith .seealso DMView(), DMCreateGlobalVector(), DMGetInterpolation(), DMGetColoring(), DMGetMatrix(), DMGetContext(), DMSetFunction(), DMSetJacobian()
90747c6ae99SBarry Smith 
90847c6ae99SBarry Smith @*/
90947c6ae99SBarry Smith PetscErrorCode PETSCDM_DLLEXPORT DMHasFunction(DM dm,PetscBool  *flg)
91047c6ae99SBarry Smith {
91147c6ae99SBarry Smith   PetscFunctionBegin;
91247c6ae99SBarry Smith   *flg =  (dm->ops->function) ? PETSC_TRUE : PETSC_FALSE;
91347c6ae99SBarry Smith   PetscFunctionReturn(0);
91447c6ae99SBarry Smith }
91547c6ae99SBarry Smith 
91647c6ae99SBarry Smith #undef __FUNCT__
91747c6ae99SBarry Smith #define __FUNCT__ "DMHasJacobian"
91847c6ae99SBarry Smith /*@
91947c6ae99SBarry Smith     DMHasJacobian - does the DM object have a matrix function
92047c6ae99SBarry Smith 
92147c6ae99SBarry Smith     Not Collective
92247c6ae99SBarry Smith 
92347c6ae99SBarry Smith     Input Parameter:
92447c6ae99SBarry Smith .   dm - the DM object to destroy
92547c6ae99SBarry Smith 
92647c6ae99SBarry Smith     Output Parameter:
92747c6ae99SBarry Smith .   flg - PETSC_TRUE if function exists
92847c6ae99SBarry Smith 
92947c6ae99SBarry Smith     Level: developer
93047c6ae99SBarry Smith 
93147c6ae99SBarry Smith .seealso DMView(), DMCreateGlobalVector(), DMGetInterpolation(), DMGetColoring(), DMGetMatrix(), DMGetContext(), DMSetFunction(), DMSetJacobian()
93247c6ae99SBarry Smith 
93347c6ae99SBarry Smith @*/
93447c6ae99SBarry Smith PetscErrorCode PETSCDM_DLLEXPORT DMHasJacobian(DM dm,PetscBool  *flg)
93547c6ae99SBarry Smith {
93647c6ae99SBarry Smith   PetscFunctionBegin;
93747c6ae99SBarry Smith   *flg =  (dm->ops->jacobian) ? PETSC_TRUE : PETSC_FALSE;
93847c6ae99SBarry Smith   PetscFunctionReturn(0);
93947c6ae99SBarry Smith }
94047c6ae99SBarry Smith 
94147c6ae99SBarry Smith #undef __FUNCT__
94247c6ae99SBarry Smith #define __FUNCT__ "DMComputeFunction"
94347c6ae99SBarry Smith /*@
94447c6ae99SBarry Smith     DMComputeFunction - computes the right hand side vector entries for the KSP solver or nonlinear function for SNES
94547c6ae99SBarry Smith 
94647c6ae99SBarry Smith     Collective on DM
94747c6ae99SBarry Smith 
94847c6ae99SBarry Smith     Input Parameter:
94947c6ae99SBarry Smith +   dm - the DM object to destroy
95047c6ae99SBarry Smith .   x - the location where the function is evaluationed, may be ignored for linear problems
95147c6ae99SBarry Smith -   b - the vector to hold the right hand side entries
95247c6ae99SBarry Smith 
95347c6ae99SBarry Smith     Level: developer
95447c6ae99SBarry Smith 
95547c6ae99SBarry Smith .seealso DMView(), DMCreateGlobalVector(), DMGetInterpolation(), DMGetColoring(), DMGetMatrix(), DMGetContext(), DMSetInitialGuess(),
95647c6ae99SBarry Smith          DMSetJacobian()
95747c6ae99SBarry Smith 
95847c6ae99SBarry Smith @*/
95947c6ae99SBarry Smith PetscErrorCode PETSCDM_DLLEXPORT DMComputeFunction(DM dm,Vec x,Vec b)
96047c6ae99SBarry Smith {
96147c6ae99SBarry Smith   PetscErrorCode ierr;
96247c6ae99SBarry Smith   PetscFunctionBegin;
96347c6ae99SBarry Smith   if (!dm->ops->function) SETERRQ(((PetscObject)dm)->comm,PETSC_ERR_ARG_WRONGSTATE,"Need to provide function with DMSetFunction()");
96447c6ae99SBarry Smith   if (!x) x = dm->x;
96547c6ae99SBarry Smith   ierr = (*dm->ops->function)(dm,x,b);CHKERRQ(ierr);
96647c6ae99SBarry Smith   PetscFunctionReturn(0);
96747c6ae99SBarry Smith }
96847c6ae99SBarry Smith 
96947c6ae99SBarry Smith 
97047c6ae99SBarry Smith #undef __FUNCT__
97147c6ae99SBarry Smith #define __FUNCT__ "DMComputeJacobian"
97247c6ae99SBarry Smith /*@
97347c6ae99SBarry Smith     DMComputeJacobian - compute the matrix entries for the solver
97447c6ae99SBarry Smith 
97547c6ae99SBarry Smith     Collective on DM
97647c6ae99SBarry Smith 
97747c6ae99SBarry Smith     Input Parameter:
97847c6ae99SBarry Smith +   dm - the DM object
97947c6ae99SBarry Smith .   x - location to compute Jacobian at; may be ignored for linear problems
98047c6ae99SBarry Smith .   A - matrix that defines the operator for the linear solve
98147c6ae99SBarry Smith -   B - the matrix used to construct the preconditioner
98247c6ae99SBarry Smith 
98347c6ae99SBarry Smith     Level: developer
98447c6ae99SBarry Smith 
98547c6ae99SBarry Smith .seealso DMView(), DMCreateGlobalVector(), DMGetInterpolation(), DMGetColoring(), DMGetMatrix(), DMGetContext(), DMSetInitialGuess(),
98647c6ae99SBarry Smith          DMSetFunction()
98747c6ae99SBarry Smith 
98847c6ae99SBarry Smith @*/
98947c6ae99SBarry Smith PetscErrorCode PETSCDM_DLLEXPORT DMComputeJacobian(DM dm,Vec x,Mat A,Mat B,MatStructure *stflag)
99047c6ae99SBarry Smith {
99147c6ae99SBarry Smith   PetscErrorCode ierr;
99247c6ae99SBarry Smith 
99347c6ae99SBarry Smith   PetscFunctionBegin;
99447c6ae99SBarry Smith   if (!dm->ops->jacobian) {
99547c6ae99SBarry Smith     ISColoring    coloring;
99647c6ae99SBarry Smith     MatFDColoring fd;
99747c6ae99SBarry Smith 
99847c6ae99SBarry Smith     ierr = DMGetColoring(dm,IS_COLORING_GHOSTED,MATAIJ,&coloring);CHKERRQ(ierr);
99947c6ae99SBarry Smith     ierr = MatFDColoringCreate(B,coloring,&fd);CHKERRQ(ierr);
100047c6ae99SBarry Smith     ierr = ISColoringDestroy(coloring);CHKERRQ(ierr);
100147c6ae99SBarry Smith     ierr = MatFDColoringSetFunction(fd,(PetscErrorCode (*)(void))dm->ops->functionj,dm);CHKERRQ(ierr);
100247c6ae99SBarry Smith     dm->fd = fd;
100347c6ae99SBarry Smith     dm->ops->jacobian = DMComputeJacobianDefault;
100447c6ae99SBarry Smith 
100547c6ae99SBarry Smith     if (!dm->x) {
100647c6ae99SBarry Smith       ierr = MatGetVecs(B,&dm->x,PETSC_NULL);CHKERRQ(ierr);
100747c6ae99SBarry Smith     }
100847c6ae99SBarry Smith   }
100947c6ae99SBarry Smith   if (!x) x = dm->x;
101047c6ae99SBarry Smith   ierr = (*dm->ops->jacobian)(dm,x,A,B,stflag);CHKERRQ(ierr);
101147c6ae99SBarry Smith   PetscFunctionReturn(0);
101247c6ae99SBarry Smith }
1013264ace61SBarry Smith 
1014264ace61SBarry Smith PetscFList DMList                       = PETSC_NULL;
1015264ace61SBarry Smith PetscBool  DMRegisterAllCalled          = PETSC_FALSE;
1016264ace61SBarry Smith 
1017264ace61SBarry Smith #undef __FUNCT__
1018264ace61SBarry Smith #define __FUNCT__ "DMSetType"
1019264ace61SBarry Smith /*@C
1020264ace61SBarry Smith   DMSetType - Builds a DM, for a particular DM implementation.
1021264ace61SBarry Smith 
1022264ace61SBarry Smith   Collective on DM
1023264ace61SBarry Smith 
1024264ace61SBarry Smith   Input Parameters:
1025264ace61SBarry Smith + dm     - The DM object
1026264ace61SBarry Smith - method - The name of the DM type
1027264ace61SBarry Smith 
1028264ace61SBarry Smith   Options Database Key:
1029264ace61SBarry Smith . -dm_type <type> - Sets the DM type; use -help for a list of available types
1030264ace61SBarry Smith 
1031264ace61SBarry Smith   Notes:
1032e1589f56SBarry Smith   See "petsc/include/petscdm.h" for available DM types (for instance, DM1D, DM2D, or DM3D).
1033264ace61SBarry Smith 
1034264ace61SBarry Smith   Level: intermediate
1035264ace61SBarry Smith 
1036264ace61SBarry Smith .keywords: DM, set, type
1037264ace61SBarry Smith .seealso: DMGetType(), DMCreate()
1038264ace61SBarry Smith @*/
1039264ace61SBarry Smith PetscErrorCode PETSCDM_DLLEXPORT DMSetType(DM dm, const DMType method)
1040264ace61SBarry Smith {
1041264ace61SBarry Smith   PetscErrorCode (*r)(DM);
1042264ace61SBarry Smith   PetscBool      match;
1043264ace61SBarry Smith   PetscErrorCode ierr;
1044264ace61SBarry Smith 
1045264ace61SBarry Smith   PetscFunctionBegin;
1046264ace61SBarry Smith   PetscValidHeaderSpecific(dm, DM_CLASSID,1);
1047264ace61SBarry Smith   ierr = PetscTypeCompare((PetscObject) dm, method, &match);CHKERRQ(ierr);
1048264ace61SBarry Smith   if (match) PetscFunctionReturn(0);
1049264ace61SBarry Smith 
1050264ace61SBarry Smith   if (!DMRegisterAllCalled) {ierr = DMRegisterAll(PETSC_NULL);CHKERRQ(ierr);}
1051264ace61SBarry Smith   ierr = PetscFListFind(DMList, ((PetscObject)dm)->comm, method,(void (**)(void)) &r);CHKERRQ(ierr);
1052264ace61SBarry Smith   if (!r) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_UNKNOWN_TYPE, "Unknown DM type: %s", method);
1053264ace61SBarry Smith 
1054264ace61SBarry Smith   if (dm->ops->destroy) {
1055264ace61SBarry Smith     ierr = (*dm->ops->destroy)(dm);CHKERRQ(ierr);
1056264ace61SBarry Smith   }
1057264ace61SBarry Smith   ierr = (*r)(dm);CHKERRQ(ierr);
1058264ace61SBarry Smith   ierr = PetscObjectChangeTypeName((PetscObject)dm,method);CHKERRQ(ierr);
1059264ace61SBarry Smith   PetscFunctionReturn(0);
1060264ace61SBarry Smith }
1061264ace61SBarry Smith 
1062264ace61SBarry Smith #undef __FUNCT__
1063264ace61SBarry Smith #define __FUNCT__ "DMGetType"
1064264ace61SBarry Smith /*@C
1065264ace61SBarry Smith   DMGetType - Gets the DM type name (as a string) from the DM.
1066264ace61SBarry Smith 
1067264ace61SBarry Smith   Not Collective
1068264ace61SBarry Smith 
1069264ace61SBarry Smith   Input Parameter:
1070264ace61SBarry Smith . dm  - The DM
1071264ace61SBarry Smith 
1072264ace61SBarry Smith   Output Parameter:
1073264ace61SBarry Smith . type - The DM type name
1074264ace61SBarry Smith 
1075264ace61SBarry Smith   Level: intermediate
1076264ace61SBarry Smith 
1077264ace61SBarry Smith .keywords: DM, get, type, name
1078264ace61SBarry Smith .seealso: DMSetType(), DMCreate()
1079264ace61SBarry Smith @*/
1080264ace61SBarry Smith PetscErrorCode PETSCDM_DLLEXPORT DMGetType(DM dm, const DMType *type)
1081264ace61SBarry Smith {
1082264ace61SBarry Smith   PetscErrorCode ierr;
1083264ace61SBarry Smith 
1084264ace61SBarry Smith   PetscFunctionBegin;
1085264ace61SBarry Smith   PetscValidHeaderSpecific(dm, DM_CLASSID,1);
1086264ace61SBarry Smith   PetscValidCharPointer(type,2);
1087264ace61SBarry Smith   if (!DMRegisterAllCalled) {
1088264ace61SBarry Smith     ierr = DMRegisterAll(PETSC_NULL);CHKERRQ(ierr);
1089264ace61SBarry Smith   }
1090264ace61SBarry Smith   *type = ((PetscObject)dm)->type_name;
1091264ace61SBarry Smith   PetscFunctionReturn(0);
1092264ace61SBarry Smith }
1093264ace61SBarry Smith 
1094264ace61SBarry Smith 
1095264ace61SBarry Smith /*--------------------------------------------------------------------------------------------------------------------*/
1096264ace61SBarry Smith 
1097264ace61SBarry Smith #undef __FUNCT__
1098264ace61SBarry Smith #define __FUNCT__ "DMRegister"
1099264ace61SBarry Smith /*@C
1100264ace61SBarry Smith   DMRegister - See DMRegisterDynamic()
1101264ace61SBarry Smith 
1102264ace61SBarry Smith   Level: advanced
1103264ace61SBarry Smith @*/
1104264ace61SBarry Smith PetscErrorCode PETSCDM_DLLEXPORT DMRegister(const char sname[], const char path[], const char name[], PetscErrorCode (*function)(DM))
1105264ace61SBarry Smith {
1106264ace61SBarry Smith   char fullname[PETSC_MAX_PATH_LEN];
1107264ace61SBarry Smith   PetscErrorCode ierr;
1108264ace61SBarry Smith 
1109264ace61SBarry Smith   PetscFunctionBegin;
1110264ace61SBarry Smith   ierr = PetscStrcpy(fullname, path);CHKERRQ(ierr);
1111264ace61SBarry Smith   ierr = PetscStrcat(fullname, ":");CHKERRQ(ierr);
1112264ace61SBarry Smith   ierr = PetscStrcat(fullname, name);CHKERRQ(ierr);
1113264ace61SBarry Smith   ierr = PetscFListAdd(&DMList, sname, fullname, (void (*)(void)) function);CHKERRQ(ierr);
1114264ace61SBarry Smith   PetscFunctionReturn(0);
1115264ace61SBarry Smith }
1116264ace61SBarry Smith 
1117264ace61SBarry Smith 
1118264ace61SBarry Smith /*--------------------------------------------------------------------------------------------------------------------*/
1119264ace61SBarry Smith #undef __FUNCT__
1120264ace61SBarry Smith #define __FUNCT__ "DMRegisterDestroy"
1121264ace61SBarry Smith /*@C
1122264ace61SBarry Smith    DMRegisterDestroy - Frees the list of DM methods that were registered by DMRegister()/DMRegisterDynamic().
1123264ace61SBarry Smith 
1124264ace61SBarry Smith    Not Collective
1125264ace61SBarry Smith 
1126264ace61SBarry Smith    Level: advanced
1127264ace61SBarry Smith 
1128264ace61SBarry Smith .keywords: DM, register, destroy
1129264ace61SBarry Smith .seealso: DMRegister(), DMRegisterAll(), DMRegisterDynamic()
1130264ace61SBarry Smith @*/
1131264ace61SBarry Smith PetscErrorCode PETSCDM_DLLEXPORT DMRegisterDestroy(void)
1132264ace61SBarry Smith {
1133264ace61SBarry Smith   PetscErrorCode ierr;
1134264ace61SBarry Smith 
1135264ace61SBarry Smith   PetscFunctionBegin;
1136264ace61SBarry Smith   ierr = PetscFListDestroy(&DMList);CHKERRQ(ierr);
1137264ace61SBarry Smith   DMRegisterAllCalled = PETSC_FALSE;
1138264ace61SBarry Smith   PetscFunctionReturn(0);
1139264ace61SBarry Smith }
114023f975d1SBarry Smith 
114123f975d1SBarry Smith #if defined(PETSC_HAVE_MATLAB_ENGINE)
114223f975d1SBarry Smith #include "mex.h"
114323f975d1SBarry Smith 
1144*3014e516SBarry Smith typedef struct {char *funcname; char *jacname; mxArray *ctx;} DMMatlabContext;
114523f975d1SBarry Smith 
114623f975d1SBarry Smith #undef __FUNCT__
114723f975d1SBarry Smith #define __FUNCT__ "DMComputeFunction_Matlab"
114823f975d1SBarry Smith /*
114923f975d1SBarry Smith    DMComputeFunction_Matlab - Calls the function that has been set with
115023f975d1SBarry Smith                          DMSetFunctionMatlab().
115123f975d1SBarry Smith 
115223f975d1SBarry Smith    For linear problems x is null
115323f975d1SBarry Smith 
115423f975d1SBarry Smith .seealso: DMSetFunction(), DMGetFunction()
115523f975d1SBarry Smith */
115623f975d1SBarry Smith PetscErrorCode PETSCDM_DLLEXPORT DMComputeFunction_Matlab(DM dm,Vec x,Vec y)
115723f975d1SBarry Smith {
115823f975d1SBarry Smith   PetscErrorCode    ierr;
115923f975d1SBarry Smith   DMMatlabContext   *sctx;
116023f975d1SBarry Smith   int               nlhs = 1,nrhs = 4;
116123f975d1SBarry Smith   mxArray	    *plhs[1],*prhs[4];
116223f975d1SBarry Smith   long long int     lx = 0,ly = 0,ls = 0;
116323f975d1SBarry Smith 
116423f975d1SBarry Smith   PetscFunctionBegin;
116523f975d1SBarry Smith   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
116623f975d1SBarry Smith   PetscValidHeaderSpecific(y,VEC_CLASSID,3);
116723f975d1SBarry Smith   PetscCheckSameComm(dm,1,y,3);
116823f975d1SBarry Smith 
116923f975d1SBarry Smith   /* call Matlab function in ctx with arguments x and y */
117023f975d1SBarry Smith   ierr = DMGetContext(dm,(void**)&sctx);CHKERRQ(ierr);
117123f975d1SBarry Smith   ierr = PetscMemcpy(&ls,&dm,sizeof(dm));CHKERRQ(ierr);
117223f975d1SBarry Smith   ierr = PetscMemcpy(&lx,&x,sizeof(x));CHKERRQ(ierr);
1173*3014e516SBarry Smith   ierr = PetscMemcpy(&ly,&y,sizeof(y));CHKERRQ(ierr);
117423f975d1SBarry Smith   prhs[0] =  mxCreateDoubleScalar((double)ls);
117523f975d1SBarry Smith   prhs[1] =  mxCreateDoubleScalar((double)lx);
117623f975d1SBarry Smith   prhs[2] =  mxCreateDoubleScalar((double)ly);
117723f975d1SBarry Smith   prhs[3] =  mxCreateString(sctx->funcname);
117823f975d1SBarry Smith   ierr    =  mexCallMATLAB(nlhs,plhs,nrhs,prhs,"DMComputeFunctionInternal");CHKERRQ(ierr);
117923f975d1SBarry Smith   ierr    =  mxGetScalar(plhs[0]);CHKERRQ(ierr);
118023f975d1SBarry Smith   mxDestroyArray(prhs[0]);
118123f975d1SBarry Smith   mxDestroyArray(prhs[1]);
118223f975d1SBarry Smith   mxDestroyArray(prhs[2]);
118323f975d1SBarry Smith   mxDestroyArray(prhs[3]);
118423f975d1SBarry Smith   mxDestroyArray(plhs[0]);
118523f975d1SBarry Smith   PetscFunctionReturn(0);
118623f975d1SBarry Smith }
118723f975d1SBarry Smith 
118823f975d1SBarry Smith 
118923f975d1SBarry Smith #undef __FUNCT__
119023f975d1SBarry Smith #define __FUNCT__ "DMSetFunctionMatlab"
119123f975d1SBarry Smith /*
119223f975d1SBarry Smith    DMSetFunctionMatlab - Sets the function evaluation routine
119323f975d1SBarry Smith 
119423f975d1SBarry Smith */
119523f975d1SBarry Smith PetscErrorCode PETSCDM_DLLEXPORT DMSetFunctionMatlab(DM dm,const char *func)
119623f975d1SBarry Smith {
119723f975d1SBarry Smith   PetscErrorCode    ierr;
119823f975d1SBarry Smith   DMMatlabContext   *sctx;
119923f975d1SBarry Smith 
120023f975d1SBarry Smith   PetscFunctionBegin;
120123f975d1SBarry Smith   /* currently sctx is memory bleed */
1202*3014e516SBarry Smith   ierr = DMGetContext(dm,(void**)&sctx);CHKERRQ(ierr);
1203*3014e516SBarry Smith   if (!sctx) {
120423f975d1SBarry Smith     ierr = PetscMalloc(sizeof(DMMatlabContext),&sctx);CHKERRQ(ierr);
1205*3014e516SBarry Smith   }
120623f975d1SBarry Smith   ierr = PetscStrallocpy(func,&sctx->funcname);CHKERRQ(ierr);
120723f975d1SBarry Smith   ierr = DMSetContext(dm,sctx);CHKERRQ(ierr);
120823f975d1SBarry Smith   ierr = DMSetFunction(dm,DMComputeFunction_Matlab);CHKERRQ(ierr);
120923f975d1SBarry Smith   PetscFunctionReturn(0);
121023f975d1SBarry Smith }
1211*3014e516SBarry Smith 
1212*3014e516SBarry Smith #undef __FUNCT__
1213*3014e516SBarry Smith #define __FUNCT__ "DMComputeJacobian_Matlab"
1214*3014e516SBarry Smith /*
1215*3014e516SBarry Smith    DMComputeJacobian_Matlab - Calls the function that has been set with
1216*3014e516SBarry Smith                          DMSetJacobianMatlab().
1217*3014e516SBarry Smith 
1218*3014e516SBarry Smith    For linear problems x is null
1219*3014e516SBarry Smith 
1220*3014e516SBarry Smith .seealso: DMSetFunction(), DMGetFunction()
1221*3014e516SBarry Smith */
1222*3014e516SBarry Smith PetscErrorCode PETSCDM_DLLEXPORT DMComputeJacobian_Matlab(DM dm,Vec x,Mat A,Mat B,MatStructure *str)
1223*3014e516SBarry Smith {
1224*3014e516SBarry Smith   PetscErrorCode    ierr;
1225*3014e516SBarry Smith   DMMatlabContext   *sctx;
1226*3014e516SBarry Smith   int               nlhs = 2,nrhs = 5;
1227*3014e516SBarry Smith   mxArray	    *plhs[2],*prhs[5];
1228*3014e516SBarry Smith   long long int     lx = 0,lA = 0,lB = 0,ls = 0;
1229*3014e516SBarry Smith 
1230*3014e516SBarry Smith   PetscFunctionBegin;
1231*3014e516SBarry Smith   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
1232*3014e516SBarry Smith   PetscValidHeaderSpecific(A,MAT_CLASSID,3);
1233*3014e516SBarry Smith 
1234*3014e516SBarry Smith   /* call Matlab function in ctx with arguments x, A, and B */
1235*3014e516SBarry Smith   ierr = DMGetContext(dm,(void**)&sctx);CHKERRQ(ierr);
1236*3014e516SBarry Smith   ierr = PetscMemcpy(&ls,&dm,sizeof(dm));CHKERRQ(ierr);
1237*3014e516SBarry Smith   ierr = PetscMemcpy(&lx,&x,sizeof(x));CHKERRQ(ierr);
1238*3014e516SBarry Smith   ierr = PetscMemcpy(&lA,&A,sizeof(A));CHKERRQ(ierr);
1239*3014e516SBarry Smith   ierr = PetscMemcpy(&lB,&B,sizeof(B));CHKERRQ(ierr);
1240*3014e516SBarry Smith   prhs[0] =  mxCreateDoubleScalar((double)ls);
1241*3014e516SBarry Smith   prhs[1] =  mxCreateDoubleScalar((double)lx);
1242*3014e516SBarry Smith   prhs[2] =  mxCreateDoubleScalar((double)lA);
1243*3014e516SBarry Smith   prhs[3] =  mxCreateDoubleScalar((double)lB);
1244*3014e516SBarry Smith   prhs[4] =  mxCreateString(sctx->jacname);
1245*3014e516SBarry Smith   ierr    =  mexCallMATLAB(nlhs,plhs,nrhs,prhs,"DMComputeJacobianInternal");CHKERRQ(ierr);
1246*3014e516SBarry Smith   *str    =  mxGetScalar(plhs[0]);CHKERRQ(ierr);
1247*3014e516SBarry Smith   ierr    =  mxGetScalar(plhs[1]);CHKERRQ(ierr);
1248*3014e516SBarry Smith   mxDestroyArray(prhs[0]);
1249*3014e516SBarry Smith   mxDestroyArray(prhs[1]);
1250*3014e516SBarry Smith   mxDestroyArray(prhs[2]);
1251*3014e516SBarry Smith   mxDestroyArray(prhs[3]);
1252*3014e516SBarry Smith   mxDestroyArray(prhs[4]);
1253*3014e516SBarry Smith   mxDestroyArray(plhs[0]);
1254*3014e516SBarry Smith   mxDestroyArray(plhs[1]);
1255*3014e516SBarry Smith   PetscFunctionReturn(0);
1256*3014e516SBarry Smith }
1257*3014e516SBarry Smith 
1258*3014e516SBarry Smith 
1259*3014e516SBarry Smith #undef __FUNCT__
1260*3014e516SBarry Smith #define __FUNCT__ "DMSetJacobianMatlab"
1261*3014e516SBarry Smith /*
1262*3014e516SBarry Smith    DMSetJacobianMatlab - Sets the Jacobian function evaluation routine
1263*3014e516SBarry Smith 
1264*3014e516SBarry Smith */
1265*3014e516SBarry Smith PetscErrorCode PETSCDM_DLLEXPORT DMSetJacobianMatlab(DM dm,const char *func)
1266*3014e516SBarry Smith {
1267*3014e516SBarry Smith   PetscErrorCode    ierr;
1268*3014e516SBarry Smith   DMMatlabContext   *sctx;
1269*3014e516SBarry Smith 
1270*3014e516SBarry Smith   PetscFunctionBegin;
1271*3014e516SBarry Smith   /* currently sctx is memory bleed */
1272*3014e516SBarry Smith   ierr = DMGetContext(dm,(void**)&sctx);CHKERRQ(ierr);
1273*3014e516SBarry Smith   if (!sctx) {
1274*3014e516SBarry Smith     ierr = PetscMalloc(sizeof(DMMatlabContext),&sctx);CHKERRQ(ierr);
1275*3014e516SBarry Smith   }
1276*3014e516SBarry Smith   ierr = PetscStrallocpy(func,&sctx->jacname);CHKERRQ(ierr);
1277*3014e516SBarry Smith   ierr = DMSetContext(dm,sctx);CHKERRQ(ierr);
1278*3014e516SBarry Smith   ierr = DMSetJacobian(dm,DMComputeJacobian_Matlab);CHKERRQ(ierr);
1279*3014e516SBarry Smith   PetscFunctionReturn(0);
1280*3014e516SBarry Smith }
128123f975d1SBarry Smith #endif
1282