xref: /petsc/src/dm/impls/da/dagtol.c (revision 1dca8a0504492127e77eac64bc165d7372dd6d63)
147c6ae99SBarry Smith /*
247c6ae99SBarry Smith   Code for manipulating distributed regular arrays in parallel.
347c6ae99SBarry Smith */
447c6ae99SBarry Smith 
5af0996ceSBarry Smith #include <petsc/private/dmdaimpl.h>    /*I   "petscdmda.h"   I*/
647c6ae99SBarry Smith 
77087cfbeSBarry Smith PetscErrorCode  DMGlobalToLocalBegin_DA(DM da,Vec g,InsertMode mode,Vec l)
847c6ae99SBarry Smith {
947c6ae99SBarry Smith   DM_DA          *dd = (DM_DA*)da->data;
1047c6ae99SBarry Smith 
1147c6ae99SBarry Smith   PetscFunctionBegin;
1247c6ae99SBarry Smith   PetscValidHeaderSpecific(da,DM_CLASSID,1);
1347c6ae99SBarry Smith   PetscValidHeaderSpecific(g,VEC_CLASSID,2);
1447c6ae99SBarry Smith   PetscValidHeaderSpecific(l,VEC_CLASSID,4);
159566063dSJacob Faibussowitsch   PetscCall(VecScatterBegin(dd->gtol,g,l,mode,SCATTER_FORWARD));
1647c6ae99SBarry Smith   PetscFunctionReturn(0);
1747c6ae99SBarry Smith }
1847c6ae99SBarry Smith 
197087cfbeSBarry Smith PetscErrorCode  DMGlobalToLocalEnd_DA(DM da,Vec g,InsertMode mode,Vec l)
2047c6ae99SBarry Smith {
2147c6ae99SBarry Smith   DM_DA          *dd = (DM_DA*)da->data;
2247c6ae99SBarry Smith 
2347c6ae99SBarry Smith   PetscFunctionBegin;
2447c6ae99SBarry Smith   PetscValidHeaderSpecific(da,DM_CLASSID,1);
2547c6ae99SBarry Smith   PetscValidHeaderSpecific(g,VEC_CLASSID,2);
2647c6ae99SBarry Smith   PetscValidHeaderSpecific(l,VEC_CLASSID,4);
279566063dSJacob Faibussowitsch   PetscCall(VecScatterEnd(dd->gtol,g,l,mode,SCATTER_FORWARD));
2847c6ae99SBarry Smith   PetscFunctionReturn(0);
2947c6ae99SBarry Smith }
3047c6ae99SBarry Smith 
317087cfbeSBarry Smith PetscErrorCode  DMLocalToGlobalBegin_DA(DM da,Vec l,InsertMode mode,Vec g)
329a42bb27SBarry Smith {
339a42bb27SBarry Smith   DM_DA          *dd = (DM_DA*)da->data;
349a42bb27SBarry Smith 
359a42bb27SBarry Smith   PetscFunctionBegin;
369a42bb27SBarry Smith   PetscValidHeaderSpecific(da,DM_CLASSID,1);
379a42bb27SBarry Smith   PetscValidHeaderSpecific(l,VEC_CLASSID,2);
38dd9d0712SPatrick Sanan   PetscValidHeaderSpecific(g,VEC_CLASSID,4);
399a42bb27SBarry Smith   if (mode == ADD_VALUES) {
409566063dSJacob Faibussowitsch     PetscCall(VecScatterBegin(dd->gtol,l,g,ADD_VALUES,SCATTER_REVERSE));
419a42bb27SBarry Smith   } else if (mode == INSERT_VALUES) {
42*1dca8a05SBarry Smith     PetscCheck(dd->bx == DM_BOUNDARY_GHOSTED || dd->bx == DM_BOUNDARY_NONE || dd->s <= 0 || dd->m != 1,PetscObjectComm((PetscObject)da),PETSC_ERR_SUP,"Available only for boundary none or with parallelism in x direction");
43*1dca8a05SBarry Smith     PetscCheck(dd->bx == DM_BOUNDARY_GHOSTED || dd->by == DM_BOUNDARY_NONE || dd->s <= 0 || dd->n != 1,PetscObjectComm((PetscObject)da),PETSC_ERR_SUP,"Available only for boundary none or with parallelism in y direction");
44*1dca8a05SBarry Smith     PetscCheck(dd->bx == DM_BOUNDARY_GHOSTED || dd->bz == DM_BOUNDARY_NONE || dd->s <= 0 || dd->p != 1,PetscObjectComm((PetscObject)da),PETSC_ERR_SUP,"Available only for boundary none or with parallelism in z direction");
459566063dSJacob Faibussowitsch     PetscCall(VecScatterBegin(dd->gtol,l,g,INSERT_VALUES,SCATTER_REVERSE_LOCAL));
46ce94432eSBarry Smith   } else SETERRQ(PetscObjectComm((PetscObject)da),PETSC_ERR_SUP,"Not yet implemented");
479a42bb27SBarry Smith   PetscFunctionReturn(0);
489a42bb27SBarry Smith }
499a42bb27SBarry Smith 
507087cfbeSBarry Smith PetscErrorCode  DMLocalToGlobalEnd_DA(DM da,Vec l,InsertMode mode,Vec g)
519a42bb27SBarry Smith {
529a42bb27SBarry Smith   DM_DA          *dd = (DM_DA*)da->data;
539a42bb27SBarry Smith 
549a42bb27SBarry Smith   PetscFunctionBegin;
559a42bb27SBarry Smith   PetscValidHeaderSpecific(da,DM_CLASSID,1);
569a42bb27SBarry Smith   PetscValidHeaderSpecific(l,VEC_CLASSID,2);
57dd9d0712SPatrick Sanan   PetscValidHeaderSpecific(g,VEC_CLASSID,4);
589a42bb27SBarry Smith   if (mode == ADD_VALUES) {
599566063dSJacob Faibussowitsch     PetscCall(VecScatterEnd(dd->gtol,l,g,ADD_VALUES,SCATTER_REVERSE));
609a42bb27SBarry Smith   } else if (mode == INSERT_VALUES) {
619566063dSJacob Faibussowitsch     PetscCall(VecScatterEnd(dd->gtol,l,g,INSERT_VALUES,SCATTER_REVERSE_LOCAL));
62ce94432eSBarry Smith   } else SETERRQ(PetscObjectComm((PetscObject)da),PETSC_ERR_SUP,"Not yet implemented");
639a42bb27SBarry Smith   PetscFunctionReturn(0);
649a42bb27SBarry Smith }
659a42bb27SBarry Smith 
6609573ac7SBarry Smith extern PetscErrorCode DMDAGetNatural_Private(DM,PetscInt*,IS*);
6747c6ae99SBarry Smith /*
68aa219208SBarry Smith    DMDAGlobalToNatural_Create - Create the global to natural scatter object
6947c6ae99SBarry Smith 
70d083f849SBarry Smith    Collective on da
7147c6ae99SBarry Smith 
7247c6ae99SBarry Smith    Input Parameter:
7347c6ae99SBarry Smith .  da - the distributed array context
7447c6ae99SBarry Smith 
7547c6ae99SBarry Smith    Level: developer
7647c6ae99SBarry Smith 
7795452b02SPatrick Sanan    Notes:
7895452b02SPatrick Sanan     This is an internal routine called by DMDAGlobalToNatural() to
7947c6ae99SBarry Smith      create the scatter context.
8047c6ae99SBarry Smith 
81aa219208SBarry Smith .seealso: DMDAGlobalToNaturalBegin(), DMDAGlobalToNaturalEnd(), DMLocalToGlobalBegin(), DMDACreate2d(),
82aa219208SBarry Smith           DMGlobalToLocalBegin(), DMGlobalToLocalEnd(), DMDACreateNaturalVector()
8347c6ae99SBarry Smith */
84aa219208SBarry Smith PetscErrorCode DMDAGlobalToNatural_Create(DM da)
8547c6ae99SBarry Smith {
8647c6ae99SBarry Smith   PetscInt       m,start,Nlocal;
8747c6ae99SBarry Smith   IS             from,to;
8847c6ae99SBarry Smith   Vec            global;
8947c6ae99SBarry Smith   DM_DA          *dd = (DM_DA*)da->data;
9047c6ae99SBarry Smith 
9147c6ae99SBarry Smith   PetscFunctionBegin;
9247c6ae99SBarry Smith   PetscValidHeaderSpecific(da,DM_CLASSID,1);
937a8be351SBarry Smith   PetscCheck(dd->natural,PetscObjectComm((PetscObject)da),PETSC_ERR_ORDER,"Natural layout vector not yet created; cannot scatter into it");
9447c6ae99SBarry Smith 
9547c6ae99SBarry Smith   /* create the scatter context */
969566063dSJacob Faibussowitsch   PetscCall(VecGetLocalSize(dd->natural,&m));
979566063dSJacob Faibussowitsch   PetscCall(VecGetOwnershipRange(dd->natural,&start,NULL));
9847c6ae99SBarry Smith 
999566063dSJacob Faibussowitsch   PetscCall(DMDAGetNatural_Private(da,&Nlocal,&to));
10063a3b9bcSJacob Faibussowitsch   PetscCheck(Nlocal == m,PETSC_COMM_SELF,PETSC_ERR_PLIB,"Internal error: Nlocal %" PetscInt_FMT " local vector size %" PetscInt_FMT,Nlocal,m);
1019566063dSJacob Faibussowitsch   PetscCall(ISCreateStride(PetscObjectComm((PetscObject)da),m,start,1,&from));
1029566063dSJacob Faibussowitsch   PetscCall(VecCreateMPIWithArray(PetscObjectComm((PetscObject)da),dd->w,dd->Nlocal,PETSC_DETERMINE,NULL,&global));
1039566063dSJacob Faibussowitsch   PetscCall(VecScatterCreate(global,from,dd->natural,to,&dd->gton));
1049566063dSJacob Faibussowitsch   PetscCall(VecDestroy(&global));
1059566063dSJacob Faibussowitsch   PetscCall(ISDestroy(&from));
1069566063dSJacob Faibussowitsch   PetscCall(ISDestroy(&to));
10747c6ae99SBarry Smith   PetscFunctionReturn(0);
10847c6ae99SBarry Smith }
10947c6ae99SBarry Smith 
11047c6ae99SBarry Smith /*@
111aa219208SBarry Smith    DMDAGlobalToNaturalBegin - Maps values from the global vector to a global vector
11247c6ae99SBarry Smith    in the "natural" grid ordering. Must be followed by
113aa219208SBarry Smith    DMDAGlobalToNaturalEnd() to complete the exchange.
11447c6ae99SBarry Smith 
115d083f849SBarry Smith    Neighbor-wise Collective on da
11647c6ae99SBarry Smith 
11747c6ae99SBarry Smith    Input Parameters:
11847c6ae99SBarry Smith +  da - the distributed array context
11947c6ae99SBarry Smith .  g - the global vector
12047c6ae99SBarry Smith -  mode - one of INSERT_VALUES or ADD_VALUES
12147c6ae99SBarry Smith 
12247c6ae99SBarry Smith    Output Parameter:
12347c6ae99SBarry Smith .  l  - the natural ordering values
12447c6ae99SBarry Smith 
12547c6ae99SBarry Smith    Level: advanced
12647c6ae99SBarry Smith 
12747c6ae99SBarry Smith    Notes:
12847c6ae99SBarry Smith    The global and natrual vectors used here need not be the same as those
129aa219208SBarry Smith    obtained from DMCreateGlobalVector() and DMDACreateNaturalVector(), BUT they
13047c6ae99SBarry Smith    must have the same parallel data layout; they could, for example, be
131aa219208SBarry Smith    obtained with VecDuplicate() from the DMDA originating vectors.
13247c6ae99SBarry Smith 
133aa219208SBarry Smith    You must call DMDACreateNaturalVector() before using this routine
13447c6ae99SBarry Smith 
135aa219208SBarry Smith .seealso: DMDAGlobalToNaturalEnd(), DMLocalToGlobalBegin(), DMDACreate2d(),
136aa219208SBarry Smith           DMGlobalToLocalBegin(), DMGlobalToLocalEnd(), DMDACreateNaturalVector()
1379a42bb27SBarry Smith 
13847c6ae99SBarry Smith @*/
139dd9d0712SPatrick Sanan PetscErrorCode  DMDAGlobalToNaturalBegin(DM da,Vec g,InsertMode mode,Vec n)
14047c6ae99SBarry Smith {
14147c6ae99SBarry Smith   DM_DA          *dd = (DM_DA*)da->data;
14247c6ae99SBarry Smith 
14347c6ae99SBarry Smith   PetscFunctionBegin;
144a9a02de4SBarry Smith   PetscValidHeaderSpecificType(da,DM_CLASSID,1,DMDA);
145dd9d0712SPatrick Sanan   PetscValidHeaderSpecific(g,VEC_CLASSID,2);
146dd9d0712SPatrick Sanan   PetscValidHeaderSpecific(n,VEC_CLASSID,4);
14747c6ae99SBarry Smith   if (!dd->gton) {
14847c6ae99SBarry Smith     /* create the scatter context */
1499566063dSJacob Faibussowitsch     PetscCall(DMDAGlobalToNatural_Create(da));
15047c6ae99SBarry Smith   }
1519566063dSJacob Faibussowitsch   PetscCall(VecScatterBegin(dd->gton,g,n,mode,SCATTER_FORWARD));
15247c6ae99SBarry Smith   PetscFunctionReturn(0);
15347c6ae99SBarry Smith }
15447c6ae99SBarry Smith 
15547c6ae99SBarry Smith /*@
156aa219208SBarry Smith    DMDAGlobalToNaturalEnd - Maps values from the global vector to a global vector
157a5b23f4aSJose E. Roman    in the natural ordering. Must be preceded by DMDAGlobalToNaturalBegin().
15847c6ae99SBarry Smith 
159d083f849SBarry Smith    Neighbor-wise Collective on da
16047c6ae99SBarry Smith 
16147c6ae99SBarry Smith    Input Parameters:
16247c6ae99SBarry Smith +  da - the distributed array context
16347c6ae99SBarry Smith .  g - the global vector
16447c6ae99SBarry Smith -  mode - one of INSERT_VALUES or ADD_VALUES
16547c6ae99SBarry Smith 
16647c6ae99SBarry Smith    Output Parameter:
16747c6ae99SBarry Smith .  l  - the global values in the natural ordering
16847c6ae99SBarry Smith 
16947c6ae99SBarry Smith    Level: advanced
17047c6ae99SBarry Smith 
17147c6ae99SBarry Smith    Notes:
17247c6ae99SBarry Smith    The global and local vectors used here need not be the same as those
173aa219208SBarry Smith    obtained from DMCreateGlobalVector() and DMDACreateNaturalVector(), BUT they
17447c6ae99SBarry Smith    must have the same parallel data layout; they could, for example, be
175aa219208SBarry Smith    obtained with VecDuplicate() from the DMDA originating vectors.
17647c6ae99SBarry Smith 
177aa219208SBarry Smith .seealso: DMDAGlobalToNaturalBegin(), DMLocalToGlobalBegin(), DMDACreate2d(),
178aa219208SBarry Smith           DMGlobalToLocalBegin(), DMGlobalToLocalEnd(), DMDACreateNaturalVector()
1799a42bb27SBarry Smith 
18047c6ae99SBarry Smith @*/
181dd9d0712SPatrick Sanan PetscErrorCode  DMDAGlobalToNaturalEnd(DM da,Vec g,InsertMode mode,Vec n)
18247c6ae99SBarry Smith {
18347c6ae99SBarry Smith   DM_DA          *dd = (DM_DA*)da->data;
18447c6ae99SBarry Smith 
18547c6ae99SBarry Smith   PetscFunctionBegin;
186a9a02de4SBarry Smith   PetscValidHeaderSpecificType(da,DM_CLASSID,1,DMDA);
187dd9d0712SPatrick Sanan   PetscValidHeaderSpecific(g,VEC_CLASSID,2);
188dd9d0712SPatrick Sanan   PetscValidHeaderSpecific(n,VEC_CLASSID,4);
1899566063dSJacob Faibussowitsch   PetscCall(VecScatterEnd(dd->gton,g,n,mode,SCATTER_FORWARD));
19047c6ae99SBarry Smith   PetscFunctionReturn(0);
19147c6ae99SBarry Smith }
19247c6ae99SBarry Smith 
19347c6ae99SBarry Smith /*@
194aa219208SBarry Smith    DMDANaturalToGlobalBegin - Maps values from a global vector in the "natural" ordering
195aa219208SBarry Smith    to a global vector in the PETSc DMDA grid ordering. Must be followed by
196aa219208SBarry Smith    DMDANaturalToGlobalEnd() to complete the exchange.
19747c6ae99SBarry Smith 
198d083f849SBarry Smith    Neighbor-wise Collective on da
19947c6ae99SBarry Smith 
20047c6ae99SBarry Smith    Input Parameters:
20147c6ae99SBarry Smith +  da - the distributed array context
20247c6ae99SBarry Smith .  g - the global vector in a natural ordering
20347c6ae99SBarry Smith -  mode - one of INSERT_VALUES or ADD_VALUES
20447c6ae99SBarry Smith 
20547c6ae99SBarry Smith    Output Parameter:
206aa219208SBarry Smith .  l  - the values in the DMDA ordering
20747c6ae99SBarry Smith 
20847c6ae99SBarry Smith    Level: advanced
20947c6ae99SBarry Smith 
21047c6ae99SBarry Smith    Notes:
21147c6ae99SBarry Smith    The global and natural vectors used here need not be the same as those
212aa219208SBarry Smith    obtained from DMCreateGlobalVector() and DMDACreateNaturalVector(), BUT they
21347c6ae99SBarry Smith    must have the same parallel data layout; they could, for example, be
214aa219208SBarry Smith    obtained with VecDuplicate() from the DMDA originating vectors.
21547c6ae99SBarry Smith 
216aa219208SBarry Smith .seealso: DMDAGlobalToNaturalEnd(), DMDAGlobalToNaturalBegin(), DMLocalToGlobalBegin(), DMDACreate2d(),
217aa219208SBarry Smith           DMGlobalToLocalBegin(), DMGlobalToLocalEnd(), DMDACreateNaturalVector()
21847c6ae99SBarry Smith 
21947c6ae99SBarry Smith @*/
220dd9d0712SPatrick Sanan PetscErrorCode  DMDANaturalToGlobalBegin(DM da,Vec n,InsertMode mode,Vec g)
22147c6ae99SBarry Smith {
22247c6ae99SBarry Smith   DM_DA          *dd = (DM_DA*)da->data;
22347c6ae99SBarry Smith 
22447c6ae99SBarry Smith   PetscFunctionBegin;
225a9a02de4SBarry Smith   PetscValidHeaderSpecificType(da,DM_CLASSID,1,DMDA);
226dd9d0712SPatrick Sanan   PetscValidHeaderSpecific(n,VEC_CLASSID,2);
22747c6ae99SBarry Smith   PetscValidHeaderSpecific(g,VEC_CLASSID,4);
22847c6ae99SBarry Smith   if (!dd->gton) {
22947c6ae99SBarry Smith     /* create the scatter context */
2309566063dSJacob Faibussowitsch     PetscCall(DMDAGlobalToNatural_Create(da));
23147c6ae99SBarry Smith   }
2329566063dSJacob Faibussowitsch   PetscCall(VecScatterBegin(dd->gton,n,g,mode,SCATTER_REVERSE));
23347c6ae99SBarry Smith   PetscFunctionReturn(0);
23447c6ae99SBarry Smith }
23547c6ae99SBarry Smith 
23647c6ae99SBarry Smith /*@
237aa219208SBarry Smith    DMDANaturalToGlobalEnd - Maps values from the natural ordering global vector
238a5b23f4aSJose E. Roman    to a global vector in the PETSc DMDA ordering. Must be preceded by DMDANaturalToGlobalBegin().
23947c6ae99SBarry Smith 
240d083f849SBarry Smith    Neighbor-wise Collective on da
24147c6ae99SBarry Smith 
24247c6ae99SBarry Smith    Input Parameters:
24347c6ae99SBarry Smith +  da - the distributed array context
24447c6ae99SBarry Smith .  g - the global vector in a natural ordering
24547c6ae99SBarry Smith -  mode - one of INSERT_VALUES or ADD_VALUES
24647c6ae99SBarry Smith 
24747c6ae99SBarry Smith    Output Parameter:
248aa219208SBarry Smith .  l  - the global values in the PETSc DMDA ordering
24947c6ae99SBarry Smith 
250a47bb602SJed Brown    Level: advanced
25147c6ae99SBarry Smith 
25247c6ae99SBarry Smith    Notes:
25347c6ae99SBarry Smith    The global and local vectors used here need not be the same as those
254aa219208SBarry Smith    obtained from DMCreateGlobalVector() and DMDACreateNaturalVector(), BUT they
25547c6ae99SBarry Smith    must have the same parallel data layout; they could, for example, be
256aa219208SBarry Smith    obtained with VecDuplicate() from the DMDA originating vectors.
25747c6ae99SBarry Smith 
258aa219208SBarry Smith .seealso: DMDAGlobalToNaturalBegin(), DMDAGlobalToNaturalEnd(), DMLocalToGlobalBegin(), DMDACreate2d(),
259aa219208SBarry Smith           DMGlobalToLocalBegin(), DMGlobalToLocalEnd(), DMDACreateNaturalVector()
26047c6ae99SBarry Smith 
26147c6ae99SBarry Smith @*/
262dd9d0712SPatrick Sanan PetscErrorCode  DMDANaturalToGlobalEnd(DM da,Vec n,InsertMode mode,Vec g)
26347c6ae99SBarry Smith {
26447c6ae99SBarry Smith   DM_DA          *dd = (DM_DA*)da->data;
26547c6ae99SBarry Smith 
26647c6ae99SBarry Smith   PetscFunctionBegin;
267a9a02de4SBarry Smith   PetscValidHeaderSpecificType(da,DM_CLASSID,1,DMDA);
268dd9d0712SPatrick Sanan   PetscValidHeaderSpecific(n,VEC_CLASSID,2);
26947c6ae99SBarry Smith   PetscValidHeaderSpecific(g,VEC_CLASSID,4);
2709566063dSJacob Faibussowitsch   PetscCall(VecScatterEnd(dd->gton,n,g,mode,SCATTER_REVERSE));
27147c6ae99SBarry Smith   PetscFunctionReturn(0);
27247c6ae99SBarry Smith }
273