xref: /petsc/src/dm/interface/dm.c (revision d7bf68aed858a02b69c3ac329d35f78f24359a6b)
147c6ae99SBarry Smith #define PETSCDM_DLL
247c6ae99SBarry Smith 
347c6ae99SBarry Smith #include "private/dmimpl.h"     /*I      "petscda.h"     I*/
447c6ae99SBarry Smith 
547c6ae99SBarry Smith #undef __FUNCT__
647c6ae99SBarry Smith #define __FUNCT__ "DMDestroy"
747c6ae99SBarry Smith /*@
847c6ae99SBarry Smith     DMDestroy - Destroys a vector packer or DA.
947c6ae99SBarry Smith 
1047c6ae99SBarry Smith     Collective on DM
1147c6ae99SBarry Smith 
1247c6ae99SBarry Smith     Input Parameter:
1347c6ae99SBarry Smith .   dm - the DM object to destroy
1447c6ae99SBarry Smith 
1547c6ae99SBarry Smith     Level: developer
1647c6ae99SBarry Smith 
1747c6ae99SBarry Smith .seealso DMView(), DMCreateGlobalVector(), DMGetInterpolation(), DMGetColoring(), DMGetMatrix()
1847c6ae99SBarry Smith 
1947c6ae99SBarry Smith @*/
2047c6ae99SBarry Smith PetscErrorCode PETSCDM_DLLEXPORT DMDestroy(DM dm)
2147c6ae99SBarry Smith {
2247c6ae99SBarry Smith   PetscErrorCode ierr;
2347c6ae99SBarry Smith 
2447c6ae99SBarry Smith   PetscFunctionBegin;
250c010503SBarry Smith   ierr = (*dm->ops->destroy)(dm);CHKERRQ(ierr);
2647c6ae99SBarry Smith   PetscFunctionReturn(0);
2747c6ae99SBarry Smith }
2847c6ae99SBarry Smith 
2947c6ae99SBarry Smith #undef __FUNCT__
30*d7bf68aeSBarry Smith #define __FUNCT__ "DMSetUp"
31*d7bf68aeSBarry Smith /*@
32*d7bf68aeSBarry Smith     DMSetUp - sets up the data structures inside a DM object
33*d7bf68aeSBarry Smith 
34*d7bf68aeSBarry Smith     Collective on DM
35*d7bf68aeSBarry Smith 
36*d7bf68aeSBarry Smith     Input Parameter:
37*d7bf68aeSBarry Smith .   dm - the DM object to setup
38*d7bf68aeSBarry Smith 
39*d7bf68aeSBarry Smith     Level: developer
40*d7bf68aeSBarry Smith 
41*d7bf68aeSBarry Smith .seealso DMView(), DMCreateGlobalVector(), DMGetInterpolation(), DMGetColoring(), DMGetMatrix()
42*d7bf68aeSBarry Smith 
43*d7bf68aeSBarry Smith @*/
44*d7bf68aeSBarry Smith PetscErrorCode PETSCDM_DLLEXPORT DMSetUp(DM dm)
45*d7bf68aeSBarry Smith {
46*d7bf68aeSBarry Smith   PetscErrorCode ierr;
47*d7bf68aeSBarry Smith 
48*d7bf68aeSBarry Smith   PetscFunctionBegin;
49*d7bf68aeSBarry Smith   if (dm->ops->setup) {
50*d7bf68aeSBarry Smith     ierr = (*dm->ops->setup)(dm);CHKERRQ(ierr);
51*d7bf68aeSBarry Smith   }
52*d7bf68aeSBarry Smith   PetscFunctionReturn(0);
53*d7bf68aeSBarry Smith }
54*d7bf68aeSBarry Smith 
55*d7bf68aeSBarry Smith #undef __FUNCT__
56*d7bf68aeSBarry Smith #define __FUNCT__ "DMSetFromOptions"
57*d7bf68aeSBarry Smith /*@
58*d7bf68aeSBarry Smith     DMSetFromOptions - sets parameters in a DM from the options database
59*d7bf68aeSBarry Smith 
60*d7bf68aeSBarry Smith     Collective on DM
61*d7bf68aeSBarry Smith 
62*d7bf68aeSBarry Smith     Input Parameter:
63*d7bf68aeSBarry Smith .   dm - the DM object to set options for
64*d7bf68aeSBarry Smith 
65*d7bf68aeSBarry Smith     Level: developer
66*d7bf68aeSBarry Smith 
67*d7bf68aeSBarry Smith .seealso DMView(), DMCreateGlobalVector(), DMGetInterpolation(), DMGetColoring(), DMGetMatrix()
68*d7bf68aeSBarry Smith 
69*d7bf68aeSBarry Smith @*/
70*d7bf68aeSBarry Smith PetscErrorCode PETSCDM_DLLEXPORT DMSetFromOptions(DM dm)
71*d7bf68aeSBarry Smith {
72*d7bf68aeSBarry Smith   PetscErrorCode ierr;
73*d7bf68aeSBarry Smith 
74*d7bf68aeSBarry Smith   PetscFunctionBegin;
75*d7bf68aeSBarry Smith   if (dm->ops->setfromoptions) {
76*d7bf68aeSBarry Smith     ierr = (*dm->ops->setfromoptions)(dm);CHKERRQ(ierr);
77*d7bf68aeSBarry Smith   }
78*d7bf68aeSBarry Smith   PetscFunctionReturn(0);
79*d7bf68aeSBarry Smith }
80*d7bf68aeSBarry Smith 
81*d7bf68aeSBarry Smith #undef __FUNCT__
8247c6ae99SBarry Smith #define __FUNCT__ "DMView"
8347c6ae99SBarry Smith /*@
8447c6ae99SBarry Smith     DMView - Views a vector packer or DA.
8547c6ae99SBarry Smith 
8647c6ae99SBarry Smith     Collective on DM
8747c6ae99SBarry Smith 
8847c6ae99SBarry Smith     Input Parameter:
8947c6ae99SBarry Smith +   dm - the DM object to view
9047c6ae99SBarry Smith -   v - the viewer
9147c6ae99SBarry Smith 
9247c6ae99SBarry Smith     Level: developer
9347c6ae99SBarry Smith 
9447c6ae99SBarry Smith .seealso DMDestroy(), DMCreateGlobalVector(), DMGetInterpolation(), DMGetColoring(), DMGetMatrix()
9547c6ae99SBarry Smith 
9647c6ae99SBarry Smith @*/
9747c6ae99SBarry Smith PetscErrorCode PETSCDM_DLLEXPORT DMView(DM dm,PetscViewer v)
9847c6ae99SBarry Smith {
9947c6ae99SBarry Smith   PetscErrorCode ierr;
10047c6ae99SBarry Smith 
10147c6ae99SBarry Smith   PetscFunctionBegin;
1020c010503SBarry Smith   if (dm->ops->view) {
1030c010503SBarry Smith     ierr = (*dm->ops->view)(dm,v);CHKERRQ(ierr);
10447c6ae99SBarry Smith   }
10547c6ae99SBarry Smith   PetscFunctionReturn(0);
10647c6ae99SBarry Smith }
10747c6ae99SBarry Smith 
10847c6ae99SBarry Smith #undef __FUNCT__
10947c6ae99SBarry Smith #define __FUNCT__ "DMCreateGlobalVector"
11047c6ae99SBarry Smith /*@
11147c6ae99SBarry Smith     DMCreateGlobalVector - Creates a global vector from a DA or DMComposite object
11247c6ae99SBarry Smith 
11347c6ae99SBarry Smith     Collective on DM
11447c6ae99SBarry Smith 
11547c6ae99SBarry Smith     Input Parameter:
11647c6ae99SBarry Smith .   dm - the DM object
11747c6ae99SBarry Smith 
11847c6ae99SBarry Smith     Output Parameter:
11947c6ae99SBarry Smith .   vec - the global vector
12047c6ae99SBarry Smith 
12147c6ae99SBarry Smith     Level: developer
12247c6ae99SBarry Smith 
12347c6ae99SBarry Smith .seealso DMDestroy(), DMView(), DMGetInterpolation(), DMGetColoring(), DMGetMatrix()
12447c6ae99SBarry Smith 
12547c6ae99SBarry Smith @*/
12647c6ae99SBarry Smith PetscErrorCode PETSCDM_DLLEXPORT DMCreateGlobalVector(DM dm,Vec *vec)
12747c6ae99SBarry Smith {
12847c6ae99SBarry Smith   PetscErrorCode ierr;
12947c6ae99SBarry Smith 
13047c6ae99SBarry Smith   PetscFunctionBegin;
13147c6ae99SBarry Smith   ierr = (*dm->ops->createglobalvector)(dm,vec);CHKERRQ(ierr);
13247c6ae99SBarry Smith   PetscFunctionReturn(0);
13347c6ae99SBarry Smith }
13447c6ae99SBarry Smith 
13547c6ae99SBarry Smith #undef __FUNCT__
13647c6ae99SBarry Smith #define __FUNCT__ "DMCreateLocalVector"
13747c6ae99SBarry Smith /*@
13847c6ae99SBarry Smith     DMCreateLocalVector - Creates a local vector from a DA or DMComposite object
13947c6ae99SBarry Smith 
14047c6ae99SBarry Smith     Not Collective
14147c6ae99SBarry Smith 
14247c6ae99SBarry Smith     Input Parameter:
14347c6ae99SBarry Smith .   dm - the DM object
14447c6ae99SBarry Smith 
14547c6ae99SBarry Smith     Output Parameter:
14647c6ae99SBarry Smith .   vec - the local vector
14747c6ae99SBarry Smith 
14847c6ae99SBarry Smith     Level: developer
14947c6ae99SBarry Smith 
15047c6ae99SBarry Smith .seealso DMDestroy(), DMView(), DMGetInterpolation(), DMGetColoring(), DMGetMatrix()
15147c6ae99SBarry Smith 
15247c6ae99SBarry Smith @*/
15347c6ae99SBarry Smith PetscErrorCode PETSCDM_DLLEXPORT DMCreateLocalVector(DM dm,Vec *vec)
15447c6ae99SBarry Smith {
15547c6ae99SBarry Smith   PetscErrorCode ierr;
15647c6ae99SBarry Smith 
15747c6ae99SBarry Smith   PetscFunctionBegin;
15847c6ae99SBarry Smith   ierr = (*dm->ops->createlocalvector)(dm,vec);CHKERRQ(ierr);
15947c6ae99SBarry Smith   PetscFunctionReturn(0);
16047c6ae99SBarry Smith }
16147c6ae99SBarry Smith 
16247c6ae99SBarry Smith #undef __FUNCT__
16347c6ae99SBarry Smith #define __FUNCT__ "DMGetInterpolation"
16447c6ae99SBarry Smith /*@
16547c6ae99SBarry Smith     DMGetInterpolation - Gets interpolation matrix between two DA or DMComposite objects
16647c6ae99SBarry Smith 
16747c6ae99SBarry Smith     Collective on DM
16847c6ae99SBarry Smith 
16947c6ae99SBarry Smith     Input Parameter:
17047c6ae99SBarry Smith +   dm1 - the DM object
17147c6ae99SBarry Smith -   dm2 - the second, finer DM object
17247c6ae99SBarry Smith 
17347c6ae99SBarry Smith     Output Parameter:
17447c6ae99SBarry Smith +  mat - the interpolation
17547c6ae99SBarry Smith -  vec - the scaling (optional)
17647c6ae99SBarry Smith 
17747c6ae99SBarry Smith     Level: developer
17847c6ae99SBarry Smith 
17947c6ae99SBarry Smith .seealso DMDestroy(), DMView(), DMCreateGlobalVector(), DMGetColoring(), DMGetMatrix()
18047c6ae99SBarry Smith 
18147c6ae99SBarry Smith @*/
18247c6ae99SBarry Smith PetscErrorCode PETSCDM_DLLEXPORT DMGetInterpolation(DM dm1,DM dm2,Mat *mat,Vec *vec)
18347c6ae99SBarry Smith {
18447c6ae99SBarry Smith   PetscErrorCode ierr;
18547c6ae99SBarry Smith 
18647c6ae99SBarry Smith   PetscFunctionBegin;
18747c6ae99SBarry Smith   ierr = (*dm1->ops->getinterpolation)(dm1,dm2,mat,vec);CHKERRQ(ierr);
18847c6ae99SBarry Smith   PetscFunctionReturn(0);
18947c6ae99SBarry Smith }
19047c6ae99SBarry Smith 
19147c6ae99SBarry Smith #undef __FUNCT__
19247c6ae99SBarry Smith #define __FUNCT__ "DMGetInjection"
19347c6ae99SBarry Smith /*@
19447c6ae99SBarry Smith     DMGetInjection - Gets injection matrix between two DA or DMComposite objects
19547c6ae99SBarry Smith 
19647c6ae99SBarry Smith     Collective on DM
19747c6ae99SBarry Smith 
19847c6ae99SBarry Smith     Input Parameter:
19947c6ae99SBarry Smith +   dm1 - the DM object
20047c6ae99SBarry Smith -   dm2 - the second, finer DM object
20147c6ae99SBarry Smith 
20247c6ae99SBarry Smith     Output Parameter:
20347c6ae99SBarry Smith .   ctx - the injection
20447c6ae99SBarry Smith 
20547c6ae99SBarry Smith     Level: developer
20647c6ae99SBarry Smith 
20747c6ae99SBarry Smith .seealso DMDestroy(), DMView(), DMCreateGlobalVector(), DMGetColoring(), DMGetMatrix(), DMGetInterpolation()
20847c6ae99SBarry Smith 
20947c6ae99SBarry Smith @*/
21047c6ae99SBarry Smith PetscErrorCode PETSCDM_DLLEXPORT DMGetInjection(DM dm1,DM dm2,VecScatter *ctx)
21147c6ae99SBarry Smith {
21247c6ae99SBarry Smith   PetscErrorCode ierr;
21347c6ae99SBarry Smith 
21447c6ae99SBarry Smith   PetscFunctionBegin;
21547c6ae99SBarry Smith   ierr = (*dm1->ops->getinjection)(dm1,dm2,ctx);CHKERRQ(ierr);
21647c6ae99SBarry Smith   PetscFunctionReturn(0);
21747c6ae99SBarry Smith }
21847c6ae99SBarry Smith 
21947c6ae99SBarry Smith #undef __FUNCT__
22047c6ae99SBarry Smith #define __FUNCT__ "DMGetColoring"
22147c6ae99SBarry Smith /*@
22247c6ae99SBarry Smith     DMGetColoring - Gets coloring for a DA or DMComposite
22347c6ae99SBarry Smith 
22447c6ae99SBarry Smith     Collective on DM
22547c6ae99SBarry Smith 
22647c6ae99SBarry Smith     Input Parameter:
22747c6ae99SBarry Smith +   dm - the DM object
22847c6ae99SBarry Smith .   ctype - IS_COLORING_GHOSTED or IS_COLORING_GLOBAL
22947c6ae99SBarry Smith -   matype - either MATAIJ or MATBAIJ
23047c6ae99SBarry Smith 
23147c6ae99SBarry Smith     Output Parameter:
23247c6ae99SBarry Smith .   coloring - the coloring
23347c6ae99SBarry Smith 
23447c6ae99SBarry Smith     Level: developer
23547c6ae99SBarry Smith 
23647c6ae99SBarry Smith .seealso DMDestroy(), DMView(), DMCreateGlobalVector(), DMGetInterpolation(), DMGetMatrix()
23747c6ae99SBarry Smith 
23847c6ae99SBarry Smith @*/
23947c6ae99SBarry Smith PetscErrorCode PETSCDM_DLLEXPORT DMGetColoring(DM dm,ISColoringType ctype,const MatType mtype,ISColoring *coloring)
24047c6ae99SBarry Smith {
24147c6ae99SBarry Smith   PetscErrorCode ierr;
24247c6ae99SBarry Smith 
24347c6ae99SBarry Smith   PetscFunctionBegin;
24447c6ae99SBarry Smith   if (!dm->ops->getcoloring) SETERRQ(((PetscObject)dm)->comm,PETSC_ERR_SUP,"No coloring for this type of DM yet");
24547c6ae99SBarry Smith   ierr = (*dm->ops->getcoloring)(dm,ctype,mtype,coloring);CHKERRQ(ierr);
24647c6ae99SBarry Smith   PetscFunctionReturn(0);
24747c6ae99SBarry Smith }
24847c6ae99SBarry Smith 
24947c6ae99SBarry Smith #undef __FUNCT__
25047c6ae99SBarry Smith #define __FUNCT__ "DMGetMatrix"
25147c6ae99SBarry Smith /*@C
25247c6ae99SBarry Smith     DMGetMatrix - Gets empty Jacobian for a DA or DMComposite
25347c6ae99SBarry Smith 
25447c6ae99SBarry Smith     Collective on DM
25547c6ae99SBarry Smith 
25647c6ae99SBarry Smith     Input Parameter:
25747c6ae99SBarry Smith +   dm - the DM object
25847c6ae99SBarry Smith -   mtype - Supported types are MATSEQAIJ, MATMPIAIJ, MATSEQBAIJ, MATMPIBAIJ, or
25947c6ae99SBarry Smith             any type which inherits from one of these (such as MATAIJ, MATLUSOL, etc.).
26047c6ae99SBarry Smith 
26147c6ae99SBarry Smith     Output Parameter:
26247c6ae99SBarry Smith .   mat - the empty Jacobian
26347c6ae99SBarry Smith 
26447c6ae99SBarry Smith     Level: developer
26547c6ae99SBarry Smith 
26647c6ae99SBarry Smith .seealso DMDestroy(), DMView(), DMCreateGlobalVector(), DMGetInterpolation(), DMGetMatrix()
26747c6ae99SBarry Smith 
26847c6ae99SBarry Smith @*/
26947c6ae99SBarry Smith PetscErrorCode PETSCDM_DLLEXPORT DMGetMatrix(DM dm, const MatType mtype,Mat *mat)
27047c6ae99SBarry Smith {
27147c6ae99SBarry Smith   PetscErrorCode ierr;
27247c6ae99SBarry Smith 
27347c6ae99SBarry Smith   PetscFunctionBegin;
27447c6ae99SBarry Smith   ierr = (*dm->ops->getmatrix)(dm,mtype,mat);CHKERRQ(ierr);
27547c6ae99SBarry Smith   PetscFunctionReturn(0);
27647c6ae99SBarry Smith }
27747c6ae99SBarry Smith 
27847c6ae99SBarry Smith #undef __FUNCT__
27947c6ae99SBarry Smith #define __FUNCT__ "DMRefine"
28047c6ae99SBarry Smith /*@
28147c6ae99SBarry Smith     DMRefine - Refines a DM object
28247c6ae99SBarry Smith 
28347c6ae99SBarry Smith     Collective on DM
28447c6ae99SBarry Smith 
28547c6ae99SBarry Smith     Input Parameter:
28647c6ae99SBarry Smith +   dm - the DM object
28747c6ae99SBarry Smith -   comm - the communicator to contain the new DM object (or PETSC_NULL)
28847c6ae99SBarry Smith 
28947c6ae99SBarry Smith     Output Parameter:
29047c6ae99SBarry Smith .   dmf - the refined DM
29147c6ae99SBarry Smith 
29247c6ae99SBarry Smith     Level: developer
29347c6ae99SBarry Smith 
29447c6ae99SBarry Smith .seealso DMCoarsen(), DMDestroy(), DMView(), DMCreateGlobalVector(), DMGetInterpolation()
29547c6ae99SBarry Smith 
29647c6ae99SBarry Smith @*/
29747c6ae99SBarry Smith PetscErrorCode PETSCDM_DLLEXPORT DMRefine(DM dm,MPI_Comm comm,DM *dmf)
29847c6ae99SBarry Smith {
29947c6ae99SBarry Smith   PetscErrorCode ierr;
30047c6ae99SBarry Smith 
30147c6ae99SBarry Smith   PetscFunctionBegin;
30247c6ae99SBarry Smith   ierr = (*dm->ops->refine)(dm,comm,dmf);CHKERRQ(ierr);
30347c6ae99SBarry Smith   PetscFunctionReturn(0);
30447c6ae99SBarry Smith }
30547c6ae99SBarry Smith 
30647c6ae99SBarry Smith #undef __FUNCT__
30747c6ae99SBarry Smith #define __FUNCT__ "DMGlobalToLocalBegin"
30847c6ae99SBarry Smith /*@
30947c6ae99SBarry Smith     DMGlobalToLocalBegin - Begins updating local vectors from global vector
31047c6ae99SBarry Smith 
31147c6ae99SBarry Smith     Neighbor-wise Collective on DM
31247c6ae99SBarry Smith 
31347c6ae99SBarry Smith     Input Parameters:
31447c6ae99SBarry Smith +   dm - the DM object
31547c6ae99SBarry Smith .   g - the global vector
31647c6ae99SBarry Smith .   mode - INSERT_VALUES or ADD_VALUES
31747c6ae99SBarry Smith -   l - the local vector
31847c6ae99SBarry Smith 
31947c6ae99SBarry Smith 
32047c6ae99SBarry Smith     Level: beginner
32147c6ae99SBarry Smith 
32247c6ae99SBarry Smith .seealso DMCoarsen(), DMDestroy(), DMView(), DMCreateGlobalVector(), DMGetInterpolation(), DMGlobalToLocalEnd(), DMLocalToGlobal()
32347c6ae99SBarry Smith 
32447c6ae99SBarry Smith @*/
32547c6ae99SBarry Smith PetscErrorCode PETSCDM_DLLEXPORT DMGlobalToLocalBegin(DM dm,Vec g,InsertMode mode,Vec l)
32647c6ae99SBarry Smith {
32747c6ae99SBarry Smith   PetscErrorCode ierr;
32847c6ae99SBarry Smith 
32947c6ae99SBarry Smith   PetscFunctionBegin;
33047c6ae99SBarry Smith   ierr = (*dm->ops->globaltolocalbegin)(dm,g,mode,l);CHKERRQ(ierr);
33147c6ae99SBarry Smith   PetscFunctionReturn(0);
33247c6ae99SBarry Smith }
33347c6ae99SBarry Smith 
33447c6ae99SBarry Smith #undef __FUNCT__
33547c6ae99SBarry Smith #define __FUNCT__ "DMGlobalToLocalEnd"
33647c6ae99SBarry Smith /*@
33747c6ae99SBarry Smith     DMGlobalToLocalEnd - Ends updating local vectors from global vector
33847c6ae99SBarry Smith 
33947c6ae99SBarry Smith     Neighbor-wise Collective on DM
34047c6ae99SBarry Smith 
34147c6ae99SBarry Smith     Input Parameters:
34247c6ae99SBarry Smith +   dm - the DM object
34347c6ae99SBarry Smith .   g - the global vector
34447c6ae99SBarry Smith .   mode - INSERT_VALUES or ADD_VALUES
34547c6ae99SBarry Smith -   l - the local vector
34647c6ae99SBarry Smith 
34747c6ae99SBarry Smith 
34847c6ae99SBarry Smith     Level: beginner
34947c6ae99SBarry Smith 
35047c6ae99SBarry Smith .seealso DMCoarsen(), DMDestroy(), DMView(), DMCreateGlobalVector(), DMGetInterpolation(), DMGlobalToLocalEnd(), DMLocalToGlobal()
35147c6ae99SBarry Smith 
35247c6ae99SBarry Smith @*/
35347c6ae99SBarry Smith PetscErrorCode PETSCDM_DLLEXPORT DMGlobalToLocalEnd(DM dm,Vec g,InsertMode mode,Vec l)
35447c6ae99SBarry Smith {
35547c6ae99SBarry Smith   PetscErrorCode ierr;
35647c6ae99SBarry Smith 
35747c6ae99SBarry Smith   PetscFunctionBegin;
35847c6ae99SBarry Smith   ierr = (*dm->ops->globaltolocalend)(dm,g,mode,l);CHKERRQ(ierr);
35947c6ae99SBarry Smith   PetscFunctionReturn(0);
36047c6ae99SBarry Smith }
36147c6ae99SBarry Smith 
36247c6ae99SBarry Smith #undef __FUNCT__
36347c6ae99SBarry Smith #define __FUNCT__ "DMLocalToGlobal"
36447c6ae99SBarry Smith /*@
36547c6ae99SBarry Smith     DMLocalToGlobal - updates global vectors from local vectors
36647c6ae99SBarry Smith 
36747c6ae99SBarry Smith     Neighbor-wise Collective on DM
36847c6ae99SBarry Smith 
36947c6ae99SBarry Smith     Input Parameters:
37047c6ae99SBarry Smith +   dm - the DM object
37147c6ae99SBarry Smith .   g - the global vector
37247c6ae99SBarry Smith .   mode - INSERT_VALUES or ADD_VALUES
37347c6ae99SBarry Smith -   l - the local vector
37447c6ae99SBarry Smith 
37547c6ae99SBarry Smith 
37647c6ae99SBarry Smith     Level: beginner
37747c6ae99SBarry Smith 
37847c6ae99SBarry Smith .seealso DMCoarsen(), DMDestroy(), DMView(), DMCreateGlobalVector(), DMGetInterpolation(), DMGlobalToLocalEnd(), DMGlobalToLocalBegin()
37947c6ae99SBarry Smith 
38047c6ae99SBarry Smith @*/
38147c6ae99SBarry Smith PetscErrorCode PETSCDM_DLLEXPORT DMLocalToGlobal(DM dm,Vec g,InsertMode mode,Vec l)
38247c6ae99SBarry Smith {
38347c6ae99SBarry Smith   PetscErrorCode ierr;
38447c6ae99SBarry Smith 
38547c6ae99SBarry Smith   PetscFunctionBegin;
38647c6ae99SBarry Smith   ierr = (*dm->ops->localtoglobal)(dm,g,mode,l);CHKERRQ(ierr);
38747c6ae99SBarry Smith   PetscFunctionReturn(0);
38847c6ae99SBarry Smith }
38947c6ae99SBarry Smith 
39047c6ae99SBarry Smith #undef __FUNCT__
39147c6ae99SBarry Smith #define __FUNCT__ "DMComputeJacobianDefault"
39247c6ae99SBarry Smith /*@
39347c6ae99SBarry Smith     DMComputeJacobianDefault - computes the Jacobian using the DMComputeFunction() if Jacobian computer is not provided
39447c6ae99SBarry Smith 
39547c6ae99SBarry Smith     Collective on DM
39647c6ae99SBarry Smith 
39747c6ae99SBarry Smith     Input Parameter:
39847c6ae99SBarry Smith +   dm - the DM object
39947c6ae99SBarry Smith .   x - location to compute Jacobian at; may be ignored for linear problems
40047c6ae99SBarry Smith .   A - matrix that defines the operator for the linear solve
40147c6ae99SBarry Smith -   B - the matrix used to construct the preconditioner
40247c6ae99SBarry Smith 
40347c6ae99SBarry Smith     Level: developer
40447c6ae99SBarry Smith 
40547c6ae99SBarry Smith .seealso DMView(), DMCreateGlobalVector(), DMGetInterpolation(), DMGetColoring(), DMGetMatrix(), DMGetContext(), DMSetInitialGuess(),
40647c6ae99SBarry Smith          DMSetFunction()
40747c6ae99SBarry Smith 
40847c6ae99SBarry Smith @*/
40947c6ae99SBarry Smith PetscErrorCode PETSCDM_DLLEXPORT DMComputeJacobianDefault(DM dm,Vec x,Mat A,Mat B,MatStructure *stflag)
41047c6ae99SBarry Smith {
41147c6ae99SBarry Smith   PetscErrorCode ierr;
41247c6ae99SBarry Smith   PetscFunctionBegin;
41347c6ae99SBarry Smith   *stflag = SAME_NONZERO_PATTERN;
41447c6ae99SBarry Smith   ierr  = MatFDColoringApply(B,dm->fd,x,stflag,dm);CHKERRQ(ierr);
41547c6ae99SBarry Smith   if (A != B) {
41647c6ae99SBarry Smith     ierr = MatAssemblyBegin(A,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
41747c6ae99SBarry Smith     ierr = MatAssemblyEnd(A,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
41847c6ae99SBarry Smith   }
41947c6ae99SBarry Smith   PetscFunctionReturn(0);
42047c6ae99SBarry Smith }
42147c6ae99SBarry Smith 
42247c6ae99SBarry Smith #undef __FUNCT__
42347c6ae99SBarry Smith #define __FUNCT__ "DMCoarsen"
42447c6ae99SBarry Smith /*@
42547c6ae99SBarry Smith     DMCoarsen - Coarsens a DM object
42647c6ae99SBarry Smith 
42747c6ae99SBarry Smith     Collective on DM
42847c6ae99SBarry Smith 
42947c6ae99SBarry Smith     Input Parameter:
43047c6ae99SBarry Smith +   dm - the DM object
43147c6ae99SBarry Smith -   comm - the communicator to contain the new DM object (or PETSC_NULL)
43247c6ae99SBarry Smith 
43347c6ae99SBarry Smith     Output Parameter:
43447c6ae99SBarry Smith .   dmc - the coarsened DM
43547c6ae99SBarry Smith 
43647c6ae99SBarry Smith     Level: developer
43747c6ae99SBarry Smith 
43847c6ae99SBarry Smith .seealso DMRefine(), DMDestroy(), DMView(), DMCreateGlobalVector(), DMGetInterpolation()
43947c6ae99SBarry Smith 
44047c6ae99SBarry Smith @*/
44147c6ae99SBarry Smith PetscErrorCode PETSCDM_DLLEXPORT DMCoarsen(DM dm, MPI_Comm comm, DM *dmc)
44247c6ae99SBarry Smith {
44347c6ae99SBarry Smith   PetscErrorCode ierr;
44447c6ae99SBarry Smith 
44547c6ae99SBarry Smith   PetscFunctionBegin;
44647c6ae99SBarry Smith   ierr = (*dm->ops->coarsen)(dm, comm, dmc);CHKERRQ(ierr);
44747c6ae99SBarry Smith   (*dmc)->ops->initialguess = dm->ops->initialguess;
44847c6ae99SBarry Smith   (*dmc)->ops->function     = dm->ops->function;
44947c6ae99SBarry Smith   (*dmc)->ops->functionj    = dm->ops->functionj;
45047c6ae99SBarry Smith   if (dm->ops->jacobian != DMComputeJacobianDefault) {
45147c6ae99SBarry Smith     (*dmc)->ops->jacobian     = dm->ops->jacobian;
45247c6ae99SBarry Smith   }
45347c6ae99SBarry Smith   PetscFunctionReturn(0);
45447c6ae99SBarry Smith }
45547c6ae99SBarry Smith 
45647c6ae99SBarry Smith #undef __FUNCT__
45747c6ae99SBarry Smith #define __FUNCT__ "DMRefineHierarchy"
45847c6ae99SBarry Smith /*@C
45947c6ae99SBarry Smith     DMRefineHierarchy - Refines a DM object, all levels at once
46047c6ae99SBarry Smith 
46147c6ae99SBarry Smith     Collective on DM
46247c6ae99SBarry Smith 
46347c6ae99SBarry Smith     Input Parameter:
46447c6ae99SBarry Smith +   dm - the DM object
46547c6ae99SBarry Smith -   nlevels - the number of levels of refinement
46647c6ae99SBarry Smith 
46747c6ae99SBarry Smith     Output Parameter:
46847c6ae99SBarry Smith .   dmf - the refined DM hierarchy
46947c6ae99SBarry Smith 
47047c6ae99SBarry Smith     Level: developer
47147c6ae99SBarry Smith 
47247c6ae99SBarry Smith .seealso DMCoarsenHierarchy(), DMDestroy(), DMView(), DMCreateGlobalVector(), DMGetInterpolation()
47347c6ae99SBarry Smith 
47447c6ae99SBarry Smith @*/
47547c6ae99SBarry Smith PetscErrorCode PETSCDM_DLLEXPORT DMRefineHierarchy(DM dm,PetscInt nlevels,DM dmf[])
47647c6ae99SBarry Smith {
47747c6ae99SBarry Smith   PetscErrorCode ierr;
47847c6ae99SBarry Smith 
47947c6ae99SBarry Smith   PetscFunctionBegin;
48047c6ae99SBarry Smith   if (nlevels < 0) SETERRQ(((PetscObject)dm)->comm,PETSC_ERR_ARG_OUTOFRANGE,"nlevels cannot be negative");
48147c6ae99SBarry Smith   if (nlevels == 0) PetscFunctionReturn(0);
48247c6ae99SBarry Smith   if (dm->ops->refinehierarchy) {
48347c6ae99SBarry Smith     ierr = (*dm->ops->refinehierarchy)(dm,nlevels,dmf);CHKERRQ(ierr);
48447c6ae99SBarry Smith   } else if (dm->ops->refine) {
48547c6ae99SBarry Smith     PetscInt i;
48647c6ae99SBarry Smith 
48747c6ae99SBarry Smith     ierr = DMRefine(dm,((PetscObject)dm)->comm,&dmf[0]);CHKERRQ(ierr);
48847c6ae99SBarry Smith     for (i=1; i<nlevels; i++) {
48947c6ae99SBarry Smith       ierr = DMRefine(dmf[i-1],((PetscObject)dm)->comm,&dmf[i]);CHKERRQ(ierr);
49047c6ae99SBarry Smith     }
49147c6ae99SBarry Smith   } else {
49247c6ae99SBarry Smith     SETERRQ(((PetscObject)dm)->comm,PETSC_ERR_SUP,"No RefineHierarchy for this DM yet");
49347c6ae99SBarry Smith   }
49447c6ae99SBarry Smith   PetscFunctionReturn(0);
49547c6ae99SBarry Smith }
49647c6ae99SBarry Smith 
49747c6ae99SBarry Smith #undef __FUNCT__
49847c6ae99SBarry Smith #define __FUNCT__ "DMCoarsenHierarchy"
49947c6ae99SBarry Smith /*@C
50047c6ae99SBarry Smith     DMCoarsenHierarchy - Coarsens a DM object, all levels at once
50147c6ae99SBarry Smith 
50247c6ae99SBarry Smith     Collective on DM
50347c6ae99SBarry Smith 
50447c6ae99SBarry Smith     Input Parameter:
50547c6ae99SBarry Smith +   dm - the DM object
50647c6ae99SBarry Smith -   nlevels - the number of levels of coarsening
50747c6ae99SBarry Smith 
50847c6ae99SBarry Smith     Output Parameter:
50947c6ae99SBarry Smith .   dmc - the coarsened DM hierarchy
51047c6ae99SBarry Smith 
51147c6ae99SBarry Smith     Level: developer
51247c6ae99SBarry Smith 
51347c6ae99SBarry Smith .seealso DMRefineHierarchy(), DMDestroy(), DMView(), DMCreateGlobalVector(), DMGetInterpolation()
51447c6ae99SBarry Smith 
51547c6ae99SBarry Smith @*/
51647c6ae99SBarry Smith PetscErrorCode PETSCDM_DLLEXPORT DMCoarsenHierarchy(DM dm, PetscInt nlevels, DM dmc[])
51747c6ae99SBarry Smith {
51847c6ae99SBarry Smith   PetscErrorCode ierr;
51947c6ae99SBarry Smith 
52047c6ae99SBarry Smith   PetscFunctionBegin;
52147c6ae99SBarry Smith   if (nlevels < 0) SETERRQ(((PetscObject)dm)->comm,PETSC_ERR_ARG_OUTOFRANGE,"nlevels cannot be negative");
52247c6ae99SBarry Smith   if (nlevels == 0) PetscFunctionReturn(0);
52347c6ae99SBarry Smith   PetscValidPointer(dmc,3);
52447c6ae99SBarry Smith   if (dm->ops->coarsenhierarchy) {
52547c6ae99SBarry Smith     ierr = (*dm->ops->coarsenhierarchy)(dm, nlevels, dmc);CHKERRQ(ierr);
52647c6ae99SBarry Smith   } else if (dm->ops->coarsen) {
52747c6ae99SBarry Smith     PetscInt i;
52847c6ae99SBarry Smith 
52947c6ae99SBarry Smith     ierr = DMCoarsen(dm,((PetscObject)dm)->comm,&dmc[0]);CHKERRQ(ierr);
53047c6ae99SBarry Smith     for (i=1; i<nlevels; i++) {
53147c6ae99SBarry Smith       ierr = DMCoarsen(dmc[i-1],((PetscObject)dm)->comm,&dmc[i]);CHKERRQ(ierr);
53247c6ae99SBarry Smith     }
53347c6ae99SBarry Smith   } else {
53447c6ae99SBarry Smith     SETERRQ(((PetscObject)dm)->comm,PETSC_ERR_SUP,"No CoarsenHierarchy for this DM yet");
53547c6ae99SBarry Smith   }
53647c6ae99SBarry Smith   PetscFunctionReturn(0);
53747c6ae99SBarry Smith }
53847c6ae99SBarry Smith 
53947c6ae99SBarry Smith #undef __FUNCT__
54047c6ae99SBarry Smith #define __FUNCT__ "DMGetAggregates"
54147c6ae99SBarry Smith /*@
54247c6ae99SBarry Smith    DMGetAggregates - Gets the aggregates that map between
54347c6ae99SBarry Smith    grids associated with two DMs.
54447c6ae99SBarry Smith 
54547c6ae99SBarry Smith    Collective on DM
54647c6ae99SBarry Smith 
54747c6ae99SBarry Smith    Input Parameters:
54847c6ae99SBarry Smith +  dmc - the coarse grid DM
54947c6ae99SBarry Smith -  dmf - the fine grid DM
55047c6ae99SBarry Smith 
55147c6ae99SBarry Smith    Output Parameters:
55247c6ae99SBarry Smith .  rest - the restriction matrix (transpose of the projection matrix)
55347c6ae99SBarry Smith 
55447c6ae99SBarry Smith    Level: intermediate
55547c6ae99SBarry Smith 
55647c6ae99SBarry Smith .keywords: interpolation, restriction, multigrid
55747c6ae99SBarry Smith 
55847c6ae99SBarry Smith .seealso: DMRefine(), DMGetInjection(), DMGetInterpolation()
55947c6ae99SBarry Smith @*/
56047c6ae99SBarry Smith PetscErrorCode PETSCDM_DLLEXPORT DMGetAggregates(DM dmc, DM dmf, Mat *rest)
56147c6ae99SBarry Smith {
56247c6ae99SBarry Smith   PetscErrorCode ierr;
56347c6ae99SBarry Smith 
56447c6ae99SBarry Smith   PetscFunctionBegin;
56547c6ae99SBarry Smith   ierr = (*dmc->ops->getaggregates)(dmc, dmf, rest);CHKERRQ(ierr);
56647c6ae99SBarry Smith   PetscFunctionReturn(0);
56747c6ae99SBarry Smith }
56847c6ae99SBarry Smith 
56947c6ae99SBarry Smith #undef __FUNCT__
57047c6ae99SBarry Smith #define __FUNCT__ "DMSetContext"
57147c6ae99SBarry Smith /*@
57247c6ae99SBarry Smith     DMSetContext - Set a user context into a DM object
57347c6ae99SBarry Smith 
57447c6ae99SBarry Smith     Not Collective
57547c6ae99SBarry Smith 
57647c6ae99SBarry Smith     Input Parameters:
57747c6ae99SBarry Smith +   dm - the DM object
57847c6ae99SBarry Smith -   ctx - the user context
57947c6ae99SBarry Smith 
58047c6ae99SBarry Smith     Level: intermediate
58147c6ae99SBarry Smith 
58247c6ae99SBarry Smith .seealso DMView(), DMCreateGlobalVector(), DMGetInterpolation(), DMGetColoring(), DMGetMatrix(), DMGetContext()
58347c6ae99SBarry Smith 
58447c6ae99SBarry Smith @*/
58547c6ae99SBarry Smith PetscErrorCode PETSCDM_DLLEXPORT DMSetContext(DM dm,void *ctx)
58647c6ae99SBarry Smith {
58747c6ae99SBarry Smith   PetscFunctionBegin;
58847c6ae99SBarry Smith   dm->ctx = ctx;
58947c6ae99SBarry Smith   PetscFunctionReturn(0);
59047c6ae99SBarry Smith }
59147c6ae99SBarry Smith 
59247c6ae99SBarry Smith #undef __FUNCT__
59347c6ae99SBarry Smith #define __FUNCT__ "DMGetContext"
59447c6ae99SBarry Smith /*@
59547c6ae99SBarry Smith     DMGetContext - Gets a user context from a DM object
59647c6ae99SBarry Smith 
59747c6ae99SBarry Smith     Not Collective
59847c6ae99SBarry Smith 
59947c6ae99SBarry Smith     Input Parameter:
60047c6ae99SBarry Smith .   dm - the DM object
60147c6ae99SBarry Smith 
60247c6ae99SBarry Smith     Output Parameter:
60347c6ae99SBarry Smith .   ctx - the user context
60447c6ae99SBarry Smith 
60547c6ae99SBarry Smith     Level: intermediate
60647c6ae99SBarry Smith 
60747c6ae99SBarry Smith .seealso DMView(), DMCreateGlobalVector(), DMGetInterpolation(), DMGetColoring(), DMGetMatrix(), DMGetContext()
60847c6ae99SBarry Smith 
60947c6ae99SBarry Smith @*/
61047c6ae99SBarry Smith PetscErrorCode PETSCDM_DLLEXPORT DMGetContext(DM dm,void **ctx)
61147c6ae99SBarry Smith {
61247c6ae99SBarry Smith   PetscFunctionBegin;
61347c6ae99SBarry Smith   *ctx = dm->ctx;
61447c6ae99SBarry Smith   PetscFunctionReturn(0);
61547c6ae99SBarry Smith }
61647c6ae99SBarry Smith 
61747c6ae99SBarry Smith #undef __FUNCT__
61847c6ae99SBarry Smith #define __FUNCT__ "DMSetInitialGuess"
61947c6ae99SBarry Smith /*@
62047c6ae99SBarry Smith     DMSetInitialGuess - sets a function to compute an initial guess vector entries for the solvers
62147c6ae99SBarry Smith 
62247c6ae99SBarry Smith     Logically Collective on DM
62347c6ae99SBarry Smith 
62447c6ae99SBarry Smith     Input Parameter:
62547c6ae99SBarry Smith +   dm - the DM object to destroy
62647c6ae99SBarry Smith -   f - the function to compute the initial guess
62747c6ae99SBarry Smith 
62847c6ae99SBarry Smith     Level: intermediate
62947c6ae99SBarry Smith 
63047c6ae99SBarry Smith .seealso DMView(), DMCreateGlobalVector(), DMGetInterpolation(), DMGetColoring(), DMGetMatrix(), DMGetContext(), DMSetFunction(), DMSetJacobian()
63147c6ae99SBarry Smith 
63247c6ae99SBarry Smith @*/
63347c6ae99SBarry Smith PetscErrorCode PETSCDM_DLLEXPORT DMSetInitialGuess(DM dm,PetscErrorCode (*f)(DM,Vec))
63447c6ae99SBarry Smith {
63547c6ae99SBarry Smith   PetscFunctionBegin;
63647c6ae99SBarry Smith   dm->ops->initialguess = f;
63747c6ae99SBarry Smith   PetscFunctionReturn(0);
63847c6ae99SBarry Smith }
63947c6ae99SBarry Smith 
64047c6ae99SBarry Smith #undef __FUNCT__
64147c6ae99SBarry Smith #define __FUNCT__ "DMSetFunction"
64247c6ae99SBarry Smith /*@
64347c6ae99SBarry Smith     DMSetFunction - sets a function to compute the right hand side vector entries for the KSP solver or nonlinear function for SNES
64447c6ae99SBarry Smith 
64547c6ae99SBarry Smith     Logically Collective on DM
64647c6ae99SBarry Smith 
64747c6ae99SBarry Smith     Input Parameter:
64847c6ae99SBarry Smith +   dm - the DM object
64947c6ae99SBarry Smith -   f - the function to compute (use PETSC_NULL to cancel a previous function that was set)
65047c6ae99SBarry Smith 
65147c6ae99SBarry Smith     Level: intermediate
65247c6ae99SBarry Smith 
65347c6ae99SBarry Smith     Notes: This sets both the function for function evaluations and the function used to compute Jacobians via finite differences if no Jacobian
65447c6ae99SBarry Smith            computer is provided with DMSetJacobian(). Canceling cancels the function, but not the function used to compute the Jacobian.
65547c6ae99SBarry Smith 
65647c6ae99SBarry Smith .seealso DMView(), DMCreateGlobalVector(), DMGetInterpolation(), DMGetColoring(), DMGetMatrix(), DMGetContext(), DMSetInitialGuess(),
65747c6ae99SBarry Smith          DMSetJacobian()
65847c6ae99SBarry Smith 
65947c6ae99SBarry Smith @*/
66047c6ae99SBarry Smith PetscErrorCode PETSCDM_DLLEXPORT DMSetFunction(DM dm,PetscErrorCode (*f)(DM,Vec,Vec))
66147c6ae99SBarry Smith {
66247c6ae99SBarry Smith   PetscFunctionBegin;
66347c6ae99SBarry Smith   dm->ops->function = f;
66447c6ae99SBarry Smith   if (f) {
66547c6ae99SBarry Smith     dm->ops->functionj = f;
66647c6ae99SBarry Smith   }
66747c6ae99SBarry Smith   PetscFunctionReturn(0);
66847c6ae99SBarry Smith }
66947c6ae99SBarry Smith 
67047c6ae99SBarry Smith #undef __FUNCT__
67147c6ae99SBarry Smith #define __FUNCT__ "DMSetJacobian"
67247c6ae99SBarry Smith /*@
67347c6ae99SBarry Smith     DMSetJacobian - sets a function to compute the matrix entries for the KSP solver or Jacobian for SNES
67447c6ae99SBarry Smith 
67547c6ae99SBarry Smith     Logically Collective on DM
67647c6ae99SBarry Smith 
67747c6ae99SBarry Smith     Input Parameter:
67847c6ae99SBarry Smith +   dm - the DM object to destroy
67947c6ae99SBarry Smith -   f - the function to compute the matrix entries
68047c6ae99SBarry Smith 
68147c6ae99SBarry Smith     Level: intermediate
68247c6ae99SBarry Smith 
68347c6ae99SBarry Smith .seealso DMView(), DMCreateGlobalVector(), DMGetInterpolation(), DMGetColoring(), DMGetMatrix(), DMGetContext(), DMSetInitialGuess(),
68447c6ae99SBarry Smith          DMSetFunction()
68547c6ae99SBarry Smith 
68647c6ae99SBarry Smith @*/
68747c6ae99SBarry Smith PetscErrorCode PETSCDM_DLLEXPORT DMSetJacobian(DM dm,PetscErrorCode (*f)(DM,Vec,Mat,Mat,MatStructure*))
68847c6ae99SBarry Smith {
68947c6ae99SBarry Smith   PetscFunctionBegin;
69047c6ae99SBarry Smith   dm->ops->jacobian = f;
69147c6ae99SBarry Smith   PetscFunctionReturn(0);
69247c6ae99SBarry Smith }
69347c6ae99SBarry Smith 
69447c6ae99SBarry Smith #undef __FUNCT__
69547c6ae99SBarry Smith #define __FUNCT__ "DMComputeInitialGuess"
69647c6ae99SBarry Smith /*@
69747c6ae99SBarry Smith     DMComputeInitialGuess - computes an initial guess vector entries for the KSP solvers
69847c6ae99SBarry Smith 
69947c6ae99SBarry Smith     Collective on DM
70047c6ae99SBarry Smith 
70147c6ae99SBarry Smith     Input Parameter:
70247c6ae99SBarry Smith +   dm - the DM object to destroy
70347c6ae99SBarry Smith -   x - the vector to hold the initial guess values
70447c6ae99SBarry Smith 
70547c6ae99SBarry Smith     Level: developer
70647c6ae99SBarry Smith 
70747c6ae99SBarry Smith .seealso DMView(), DMCreateGlobalVector(), DMGetInterpolation(), DMGetColoring(), DMGetMatrix(), DMGetContext(), DMSetRhs(), DMSetMat()
70847c6ae99SBarry Smith 
70947c6ae99SBarry Smith @*/
71047c6ae99SBarry Smith PetscErrorCode PETSCDM_DLLEXPORT DMComputeInitialGuess(DM dm,Vec x)
71147c6ae99SBarry Smith {
71247c6ae99SBarry Smith   PetscErrorCode ierr;
71347c6ae99SBarry Smith   PetscFunctionBegin;
71447c6ae99SBarry Smith   if (!dm->ops->initialguess) SETERRQ(((PetscObject)dm)->comm,PETSC_ERR_ARG_WRONGSTATE,"Need to provide function with DMSetInitialGuess()");
71547c6ae99SBarry Smith   ierr = (*dm->ops->initialguess)(dm,x);CHKERRQ(ierr);
71647c6ae99SBarry Smith   PetscFunctionReturn(0);
71747c6ae99SBarry Smith }
71847c6ae99SBarry Smith 
71947c6ae99SBarry Smith #undef __FUNCT__
72047c6ae99SBarry Smith #define __FUNCT__ "DMHasInitialGuess"
72147c6ae99SBarry Smith /*@
72247c6ae99SBarry Smith     DMHasInitialGuess - does the DM object have an initial guess function
72347c6ae99SBarry Smith 
72447c6ae99SBarry Smith     Not Collective
72547c6ae99SBarry Smith 
72647c6ae99SBarry Smith     Input Parameter:
72747c6ae99SBarry Smith .   dm - the DM object to destroy
72847c6ae99SBarry Smith 
72947c6ae99SBarry Smith     Output Parameter:
73047c6ae99SBarry Smith .   flg - PETSC_TRUE if function exists
73147c6ae99SBarry Smith 
73247c6ae99SBarry Smith     Level: developer
73347c6ae99SBarry Smith 
73447c6ae99SBarry Smith .seealso DMView(), DMCreateGlobalVector(), DMGetInterpolation(), DMGetColoring(), DMGetMatrix(), DMGetContext(), DMSetFunction(), DMSetJacobian()
73547c6ae99SBarry Smith 
73647c6ae99SBarry Smith @*/
73747c6ae99SBarry Smith PetscErrorCode PETSCDM_DLLEXPORT DMHasInitialGuess(DM dm,PetscBool  *flg)
73847c6ae99SBarry Smith {
73947c6ae99SBarry Smith   PetscFunctionBegin;
74047c6ae99SBarry Smith   *flg =  (dm->ops->initialguess) ? PETSC_TRUE : PETSC_FALSE;
74147c6ae99SBarry Smith   PetscFunctionReturn(0);
74247c6ae99SBarry Smith }
74347c6ae99SBarry Smith 
74447c6ae99SBarry Smith #undef __FUNCT__
74547c6ae99SBarry Smith #define __FUNCT__ "DMHasFunction"
74647c6ae99SBarry Smith /*@
74747c6ae99SBarry Smith     DMHasFunction - does the DM object have a function
74847c6ae99SBarry Smith 
74947c6ae99SBarry Smith     Not Collective
75047c6ae99SBarry Smith 
75147c6ae99SBarry Smith     Input Parameter:
75247c6ae99SBarry Smith .   dm - the DM object to destroy
75347c6ae99SBarry Smith 
75447c6ae99SBarry Smith     Output Parameter:
75547c6ae99SBarry Smith .   flg - PETSC_TRUE if function exists
75647c6ae99SBarry Smith 
75747c6ae99SBarry Smith     Level: developer
75847c6ae99SBarry Smith 
75947c6ae99SBarry Smith .seealso DMView(), DMCreateGlobalVector(), DMGetInterpolation(), DMGetColoring(), DMGetMatrix(), DMGetContext(), DMSetFunction(), DMSetJacobian()
76047c6ae99SBarry Smith 
76147c6ae99SBarry Smith @*/
76247c6ae99SBarry Smith PetscErrorCode PETSCDM_DLLEXPORT DMHasFunction(DM dm,PetscBool  *flg)
76347c6ae99SBarry Smith {
76447c6ae99SBarry Smith   PetscFunctionBegin;
76547c6ae99SBarry Smith   *flg =  (dm->ops->function) ? PETSC_TRUE : PETSC_FALSE;
76647c6ae99SBarry Smith   PetscFunctionReturn(0);
76747c6ae99SBarry Smith }
76847c6ae99SBarry Smith 
76947c6ae99SBarry Smith #undef __FUNCT__
77047c6ae99SBarry Smith #define __FUNCT__ "DMHasJacobian"
77147c6ae99SBarry Smith /*@
77247c6ae99SBarry Smith     DMHasJacobian - does the DM object have a matrix function
77347c6ae99SBarry Smith 
77447c6ae99SBarry Smith     Not Collective
77547c6ae99SBarry Smith 
77647c6ae99SBarry Smith     Input Parameter:
77747c6ae99SBarry Smith .   dm - the DM object to destroy
77847c6ae99SBarry Smith 
77947c6ae99SBarry Smith     Output Parameter:
78047c6ae99SBarry Smith .   flg - PETSC_TRUE if function exists
78147c6ae99SBarry Smith 
78247c6ae99SBarry Smith     Level: developer
78347c6ae99SBarry Smith 
78447c6ae99SBarry Smith .seealso DMView(), DMCreateGlobalVector(), DMGetInterpolation(), DMGetColoring(), DMGetMatrix(), DMGetContext(), DMSetFunction(), DMSetJacobian()
78547c6ae99SBarry Smith 
78647c6ae99SBarry Smith @*/
78747c6ae99SBarry Smith PetscErrorCode PETSCDM_DLLEXPORT DMHasJacobian(DM dm,PetscBool  *flg)
78847c6ae99SBarry Smith {
78947c6ae99SBarry Smith   PetscFunctionBegin;
79047c6ae99SBarry Smith   *flg =  (dm->ops->jacobian) ? PETSC_TRUE : PETSC_FALSE;
79147c6ae99SBarry Smith   PetscFunctionReturn(0);
79247c6ae99SBarry Smith }
79347c6ae99SBarry Smith 
79447c6ae99SBarry Smith #undef __FUNCT__
79547c6ae99SBarry Smith #define __FUNCT__ "DMComputeFunction"
79647c6ae99SBarry Smith /*@
79747c6ae99SBarry Smith     DMComputeFunction - computes the right hand side vector entries for the KSP solver or nonlinear function for SNES
79847c6ae99SBarry Smith 
79947c6ae99SBarry Smith     Collective on DM
80047c6ae99SBarry Smith 
80147c6ae99SBarry Smith     Input Parameter:
80247c6ae99SBarry Smith +   dm - the DM object to destroy
80347c6ae99SBarry Smith .   x - the location where the function is evaluationed, may be ignored for linear problems
80447c6ae99SBarry Smith -   b - the vector to hold the right hand side entries
80547c6ae99SBarry Smith 
80647c6ae99SBarry Smith     Level: developer
80747c6ae99SBarry Smith 
80847c6ae99SBarry Smith .seealso DMView(), DMCreateGlobalVector(), DMGetInterpolation(), DMGetColoring(), DMGetMatrix(), DMGetContext(), DMSetInitialGuess(),
80947c6ae99SBarry Smith          DMSetJacobian()
81047c6ae99SBarry Smith 
81147c6ae99SBarry Smith @*/
81247c6ae99SBarry Smith PetscErrorCode PETSCDM_DLLEXPORT DMComputeFunction(DM dm,Vec x,Vec b)
81347c6ae99SBarry Smith {
81447c6ae99SBarry Smith   PetscErrorCode ierr;
81547c6ae99SBarry Smith   PetscFunctionBegin;
81647c6ae99SBarry Smith   if (!dm->ops->function) SETERRQ(((PetscObject)dm)->comm,PETSC_ERR_ARG_WRONGSTATE,"Need to provide function with DMSetFunction()");
81747c6ae99SBarry Smith   if (!x) x = dm->x;
81847c6ae99SBarry Smith   ierr = (*dm->ops->function)(dm,x,b);CHKERRQ(ierr);
81947c6ae99SBarry Smith   PetscFunctionReturn(0);
82047c6ae99SBarry Smith }
82147c6ae99SBarry Smith 
82247c6ae99SBarry Smith 
82347c6ae99SBarry Smith #undef __FUNCT__
82447c6ae99SBarry Smith #define __FUNCT__ "DMComputeJacobian"
82547c6ae99SBarry Smith /*@
82647c6ae99SBarry Smith     DMComputeJacobian - compute the matrix entries for the solver
82747c6ae99SBarry Smith 
82847c6ae99SBarry Smith     Collective on DM
82947c6ae99SBarry Smith 
83047c6ae99SBarry Smith     Input Parameter:
83147c6ae99SBarry Smith +   dm - the DM object
83247c6ae99SBarry Smith .   x - location to compute Jacobian at; may be ignored for linear problems
83347c6ae99SBarry Smith .   A - matrix that defines the operator for the linear solve
83447c6ae99SBarry Smith -   B - the matrix used to construct the preconditioner
83547c6ae99SBarry Smith 
83647c6ae99SBarry Smith     Level: developer
83747c6ae99SBarry Smith 
83847c6ae99SBarry Smith .seealso DMView(), DMCreateGlobalVector(), DMGetInterpolation(), DMGetColoring(), DMGetMatrix(), DMGetContext(), DMSetInitialGuess(),
83947c6ae99SBarry Smith          DMSetFunction()
84047c6ae99SBarry Smith 
84147c6ae99SBarry Smith @*/
84247c6ae99SBarry Smith PetscErrorCode PETSCDM_DLLEXPORT DMComputeJacobian(DM dm,Vec x,Mat A,Mat B,MatStructure *stflag)
84347c6ae99SBarry Smith {
84447c6ae99SBarry Smith   PetscErrorCode ierr;
84547c6ae99SBarry Smith 
84647c6ae99SBarry Smith   PetscFunctionBegin;
84747c6ae99SBarry Smith   if (!dm->ops->jacobian) {
84847c6ae99SBarry Smith     ISColoring    coloring;
84947c6ae99SBarry Smith     MatFDColoring fd;
85047c6ae99SBarry Smith 
85147c6ae99SBarry Smith     ierr = DMGetColoring(dm,IS_COLORING_GHOSTED,MATAIJ,&coloring);CHKERRQ(ierr);
85247c6ae99SBarry Smith     ierr = MatFDColoringCreate(B,coloring,&fd);CHKERRQ(ierr);
85347c6ae99SBarry Smith     ierr = ISColoringDestroy(coloring);CHKERRQ(ierr);
85447c6ae99SBarry Smith     ierr = MatFDColoringSetFunction(fd,(PetscErrorCode (*)(void))dm->ops->functionj,dm);CHKERRQ(ierr);
85547c6ae99SBarry Smith     dm->fd = fd;
85647c6ae99SBarry Smith     dm->ops->jacobian = DMComputeJacobianDefault;
85747c6ae99SBarry Smith 
85847c6ae99SBarry Smith     if (!dm->x) {
85947c6ae99SBarry Smith       ierr = MatGetVecs(B,&dm->x,PETSC_NULL);CHKERRQ(ierr);
86047c6ae99SBarry Smith     }
86147c6ae99SBarry Smith   }
86247c6ae99SBarry Smith   if (!x) x = dm->x;
86347c6ae99SBarry Smith   ierr = (*dm->ops->jacobian)(dm,x,A,B,stflag);CHKERRQ(ierr);
86447c6ae99SBarry Smith   PetscFunctionReturn(0);
86547c6ae99SBarry Smith }
866264ace61SBarry Smith 
867264ace61SBarry Smith PetscFList DMList                       = PETSC_NULL;
868264ace61SBarry Smith PetscBool  DMRegisterAllCalled          = PETSC_FALSE;
869264ace61SBarry Smith 
870264ace61SBarry Smith #undef __FUNCT__
871264ace61SBarry Smith #define __FUNCT__ "DMSetType"
872264ace61SBarry Smith /*@C
873264ace61SBarry Smith   DMSetType - Builds a DM, for a particular DM implementation.
874264ace61SBarry Smith 
875264ace61SBarry Smith   Collective on DM
876264ace61SBarry Smith 
877264ace61SBarry Smith   Input Parameters:
878264ace61SBarry Smith + dm     - The DM object
879264ace61SBarry Smith - method - The name of the DM type
880264ace61SBarry Smith 
881264ace61SBarry Smith   Options Database Key:
882264ace61SBarry Smith . -dm_type <type> - Sets the DM type; use -help for a list of available types
883264ace61SBarry Smith 
884264ace61SBarry Smith   Notes:
885264ace61SBarry Smith   See "petsc/include/petscda.h" for available DM types (for instance, DM1D, DM2D, or DM3D).
886264ace61SBarry Smith 
887264ace61SBarry Smith   Level: intermediate
888264ace61SBarry Smith 
889264ace61SBarry Smith .keywords: DM, set, type
890264ace61SBarry Smith .seealso: DMGetType(), DMCreate()
891264ace61SBarry Smith @*/
892264ace61SBarry Smith PetscErrorCode PETSCDM_DLLEXPORT DMSetType(DM dm, const DMType method)
893264ace61SBarry Smith {
894264ace61SBarry Smith   PetscErrorCode (*r)(DM);
895264ace61SBarry Smith   PetscBool      match;
896264ace61SBarry Smith   PetscErrorCode ierr;
897264ace61SBarry Smith 
898264ace61SBarry Smith   PetscFunctionBegin;
899264ace61SBarry Smith   PetscValidHeaderSpecific(dm, DM_CLASSID,1);
900264ace61SBarry Smith   ierr = PetscTypeCompare((PetscObject) dm, method, &match);CHKERRQ(ierr);
901264ace61SBarry Smith   if (match) PetscFunctionReturn(0);
902264ace61SBarry Smith 
903264ace61SBarry Smith   if (!DMRegisterAllCalled) {ierr = DMRegisterAll(PETSC_NULL);CHKERRQ(ierr);}
904264ace61SBarry Smith   ierr = PetscFListFind(DMList, ((PetscObject)dm)->comm, method,(void (**)(void)) &r);CHKERRQ(ierr);
905264ace61SBarry Smith   if (!r) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_UNKNOWN_TYPE, "Unknown DM type: %s", method);
906264ace61SBarry Smith 
907264ace61SBarry Smith   if (dm->ops->destroy) {
908264ace61SBarry Smith     ierr = (*dm->ops->destroy)(dm);CHKERRQ(ierr);
909264ace61SBarry Smith   }
910264ace61SBarry Smith   ierr = (*r)(dm);CHKERRQ(ierr);
911264ace61SBarry Smith   ierr = PetscObjectChangeTypeName((PetscObject)dm,method);CHKERRQ(ierr);
912264ace61SBarry Smith   PetscFunctionReturn(0);
913264ace61SBarry Smith }
914264ace61SBarry Smith 
915264ace61SBarry Smith #undef __FUNCT__
916264ace61SBarry Smith #define __FUNCT__ "DMGetType"
917264ace61SBarry Smith /*@C
918264ace61SBarry Smith   DMGetType - Gets the DM type name (as a string) from the DM.
919264ace61SBarry Smith 
920264ace61SBarry Smith   Not Collective
921264ace61SBarry Smith 
922264ace61SBarry Smith   Input Parameter:
923264ace61SBarry Smith . dm  - The DM
924264ace61SBarry Smith 
925264ace61SBarry Smith   Output Parameter:
926264ace61SBarry Smith . type - The DM type name
927264ace61SBarry Smith 
928264ace61SBarry Smith   Level: intermediate
929264ace61SBarry Smith 
930264ace61SBarry Smith .keywords: DM, get, type, name
931264ace61SBarry Smith .seealso: DMSetType(), DMCreate()
932264ace61SBarry Smith @*/
933264ace61SBarry Smith PetscErrorCode PETSCDM_DLLEXPORT DMGetType(DM dm, const DMType *type)
934264ace61SBarry Smith {
935264ace61SBarry Smith   PetscErrorCode ierr;
936264ace61SBarry Smith 
937264ace61SBarry Smith   PetscFunctionBegin;
938264ace61SBarry Smith   PetscValidHeaderSpecific(dm, DM_CLASSID,1);
939264ace61SBarry Smith   PetscValidCharPointer(type,2);
940264ace61SBarry Smith   if (!DMRegisterAllCalled) {
941264ace61SBarry Smith     ierr = DMRegisterAll(PETSC_NULL);CHKERRQ(ierr);
942264ace61SBarry Smith   }
943264ace61SBarry Smith   *type = ((PetscObject)dm)->type_name;
944264ace61SBarry Smith   PetscFunctionReturn(0);
945264ace61SBarry Smith }
946264ace61SBarry Smith 
947264ace61SBarry Smith 
948264ace61SBarry Smith /*--------------------------------------------------------------------------------------------------------------------*/
949264ace61SBarry Smith 
950264ace61SBarry Smith #undef __FUNCT__
951264ace61SBarry Smith #define __FUNCT__ "DMRegister"
952264ace61SBarry Smith /*@C
953264ace61SBarry Smith   DMRegister - See DMRegisterDynamic()
954264ace61SBarry Smith 
955264ace61SBarry Smith   Level: advanced
956264ace61SBarry Smith @*/
957264ace61SBarry Smith PetscErrorCode PETSCDM_DLLEXPORT DMRegister(const char sname[], const char path[], const char name[], PetscErrorCode (*function)(DM))
958264ace61SBarry Smith {
959264ace61SBarry Smith   char fullname[PETSC_MAX_PATH_LEN];
960264ace61SBarry Smith   PetscErrorCode ierr;
961264ace61SBarry Smith 
962264ace61SBarry Smith   PetscFunctionBegin;
963264ace61SBarry Smith   ierr = PetscStrcpy(fullname, path);CHKERRQ(ierr);
964264ace61SBarry Smith   ierr = PetscStrcat(fullname, ":");CHKERRQ(ierr);
965264ace61SBarry Smith   ierr = PetscStrcat(fullname, name);CHKERRQ(ierr);
966264ace61SBarry Smith   ierr = PetscFListAdd(&DMList, sname, fullname, (void (*)(void)) function);CHKERRQ(ierr);
967264ace61SBarry Smith   PetscFunctionReturn(0);
968264ace61SBarry Smith }
969264ace61SBarry Smith 
970264ace61SBarry Smith 
971264ace61SBarry Smith /*--------------------------------------------------------------------------------------------------------------------*/
972264ace61SBarry Smith #undef __FUNCT__
973264ace61SBarry Smith #define __FUNCT__ "DMRegisterDestroy"
974264ace61SBarry Smith /*@C
975264ace61SBarry Smith    DMRegisterDestroy - Frees the list of DM methods that were registered by DMRegister()/DMRegisterDynamic().
976264ace61SBarry Smith 
977264ace61SBarry Smith    Not Collective
978264ace61SBarry Smith 
979264ace61SBarry Smith    Level: advanced
980264ace61SBarry Smith 
981264ace61SBarry Smith .keywords: DM, register, destroy
982264ace61SBarry Smith .seealso: DMRegister(), DMRegisterAll(), DMRegisterDynamic()
983264ace61SBarry Smith @*/
984264ace61SBarry Smith PetscErrorCode PETSCDM_DLLEXPORT DMRegisterDestroy(void)
985264ace61SBarry Smith {
986264ace61SBarry Smith   PetscErrorCode ierr;
987264ace61SBarry Smith 
988264ace61SBarry Smith   PetscFunctionBegin;
989264ace61SBarry Smith   ierr = PetscFListDestroy(&DMList);CHKERRQ(ierr);
990264ace61SBarry Smith   DMRegisterAllCalled = PETSC_FALSE;
991264ace61SBarry Smith   PetscFunctionReturn(0);
992264ace61SBarry Smith }
993