xref: /petsc/src/dm/impls/da/dagtol.c (revision 7a8be3513cf479fb6a672bd91de7eb6883fcfd02)
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   PetscErrorCode ierr;
1047c6ae99SBarry Smith   DM_DA          *dd = (DM_DA*)da->data;
1147c6ae99SBarry Smith 
1247c6ae99SBarry Smith   PetscFunctionBegin;
1347c6ae99SBarry Smith   PetscValidHeaderSpecific(da,DM_CLASSID,1);
1447c6ae99SBarry Smith   PetscValidHeaderSpecific(g,VEC_CLASSID,2);
1547c6ae99SBarry Smith   PetscValidHeaderSpecific(l,VEC_CLASSID,4);
1647c6ae99SBarry Smith   ierr = VecScatterBegin(dd->gtol,g,l,mode,SCATTER_FORWARD);CHKERRQ(ierr);
1747c6ae99SBarry Smith   PetscFunctionReturn(0);
1847c6ae99SBarry Smith }
1947c6ae99SBarry Smith 
207087cfbeSBarry Smith PetscErrorCode  DMGlobalToLocalEnd_DA(DM da,Vec g,InsertMode mode,Vec l)
2147c6ae99SBarry Smith {
2247c6ae99SBarry Smith   PetscErrorCode ierr;
2347c6ae99SBarry Smith   DM_DA          *dd = (DM_DA*)da->data;
2447c6ae99SBarry Smith 
2547c6ae99SBarry Smith   PetscFunctionBegin;
2647c6ae99SBarry Smith   PetscValidHeaderSpecific(da,DM_CLASSID,1);
2747c6ae99SBarry Smith   PetscValidHeaderSpecific(g,VEC_CLASSID,2);
2847c6ae99SBarry Smith   PetscValidHeaderSpecific(l,VEC_CLASSID,4);
2947c6ae99SBarry Smith   ierr = VecScatterEnd(dd->gtol,g,l,mode,SCATTER_FORWARD);CHKERRQ(ierr);
3047c6ae99SBarry Smith   PetscFunctionReturn(0);
3147c6ae99SBarry Smith }
3247c6ae99SBarry Smith 
337087cfbeSBarry Smith PetscErrorCode  DMLocalToGlobalBegin_DA(DM da,Vec l,InsertMode mode,Vec g)
349a42bb27SBarry Smith {
359a42bb27SBarry Smith   PetscErrorCode ierr;
369a42bb27SBarry Smith   DM_DA          *dd = (DM_DA*)da->data;
379a42bb27SBarry Smith 
389a42bb27SBarry Smith   PetscFunctionBegin;
399a42bb27SBarry Smith   PetscValidHeaderSpecific(da,DM_CLASSID,1);
409a42bb27SBarry Smith   PetscValidHeaderSpecific(l,VEC_CLASSID,2);
41dd9d0712SPatrick Sanan   PetscValidHeaderSpecific(g,VEC_CLASSID,4);
429a42bb27SBarry Smith   if (mode == ADD_VALUES) {
439a42bb27SBarry Smith     ierr = VecScatterBegin(dd->gtol,l,g,ADD_VALUES,SCATTER_REVERSE);CHKERRQ(ierr);
449a42bb27SBarry Smith   } else if (mode == INSERT_VALUES) {
452c71b3e2SJacob Faibussowitsch     PetscCheckFalse(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");
462c71b3e2SJacob Faibussowitsch     PetscCheckFalse(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");
472c71b3e2SJacob Faibussowitsch     PetscCheckFalse(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");
48bd1fc5aeSBarry Smith     ierr = VecScatterBegin(dd->gtol,l,g,INSERT_VALUES,SCATTER_REVERSE_LOCAL);CHKERRQ(ierr);
49ce94432eSBarry Smith   } else SETERRQ(PetscObjectComm((PetscObject)da),PETSC_ERR_SUP,"Not yet implemented");
509a42bb27SBarry Smith   PetscFunctionReturn(0);
519a42bb27SBarry Smith }
529a42bb27SBarry Smith 
537087cfbeSBarry Smith PetscErrorCode  DMLocalToGlobalEnd_DA(DM da,Vec l,InsertMode mode,Vec g)
549a42bb27SBarry Smith {
559a42bb27SBarry Smith   PetscErrorCode ierr;
569a42bb27SBarry Smith   DM_DA          *dd = (DM_DA*)da->data;
579a42bb27SBarry Smith 
589a42bb27SBarry Smith   PetscFunctionBegin;
599a42bb27SBarry Smith   PetscValidHeaderSpecific(da,DM_CLASSID,1);
609a42bb27SBarry Smith   PetscValidHeaderSpecific(l,VEC_CLASSID,2);
61dd9d0712SPatrick Sanan   PetscValidHeaderSpecific(g,VEC_CLASSID,4);
629a42bb27SBarry Smith   if (mode == ADD_VALUES) {
639a42bb27SBarry Smith     ierr = VecScatterEnd(dd->gtol,l,g,ADD_VALUES,SCATTER_REVERSE);CHKERRQ(ierr);
649a42bb27SBarry Smith   } else if (mode == INSERT_VALUES) {
65bd1fc5aeSBarry Smith     ierr = VecScatterEnd(dd->gtol,l,g,INSERT_VALUES,SCATTER_REVERSE_LOCAL);CHKERRQ(ierr);
66ce94432eSBarry Smith   } else SETERRQ(PetscObjectComm((PetscObject)da),PETSC_ERR_SUP,"Not yet implemented");
679a42bb27SBarry Smith   PetscFunctionReturn(0);
689a42bb27SBarry Smith }
699a42bb27SBarry Smith 
7009573ac7SBarry Smith extern PetscErrorCode DMDAGetNatural_Private(DM,PetscInt*,IS*);
7147c6ae99SBarry Smith /*
72aa219208SBarry Smith    DMDAGlobalToNatural_Create - Create the global to natural scatter object
7347c6ae99SBarry Smith 
74d083f849SBarry Smith    Collective on da
7547c6ae99SBarry Smith 
7647c6ae99SBarry Smith    Input Parameter:
7747c6ae99SBarry Smith .  da - the distributed array context
7847c6ae99SBarry Smith 
7947c6ae99SBarry Smith    Level: developer
8047c6ae99SBarry Smith 
8195452b02SPatrick Sanan    Notes:
8295452b02SPatrick Sanan     This is an internal routine called by DMDAGlobalToNatural() to
8347c6ae99SBarry Smith      create the scatter context.
8447c6ae99SBarry Smith 
85aa219208SBarry Smith .seealso: DMDAGlobalToNaturalBegin(), DMDAGlobalToNaturalEnd(), DMLocalToGlobalBegin(), DMDACreate2d(),
86aa219208SBarry Smith           DMGlobalToLocalBegin(), DMGlobalToLocalEnd(), DMDACreateNaturalVector()
8747c6ae99SBarry Smith */
88aa219208SBarry Smith PetscErrorCode DMDAGlobalToNatural_Create(DM da)
8947c6ae99SBarry Smith {
9047c6ae99SBarry Smith   PetscErrorCode ierr;
9147c6ae99SBarry Smith   PetscInt       m,start,Nlocal;
9247c6ae99SBarry Smith   IS             from,to;
9347c6ae99SBarry Smith   Vec            global;
9447c6ae99SBarry Smith   DM_DA          *dd = (DM_DA*)da->data;
9547c6ae99SBarry Smith 
9647c6ae99SBarry Smith   PetscFunctionBegin;
9747c6ae99SBarry Smith   PetscValidHeaderSpecific(da,DM_CLASSID,1);
98*7a8be351SBarry Smith   PetscCheck(dd->natural,PetscObjectComm((PetscObject)da),PETSC_ERR_ORDER,"Natural layout vector not yet created; cannot scatter into it");
9947c6ae99SBarry Smith 
10047c6ae99SBarry Smith   /* create the scatter context */
10147c6ae99SBarry Smith   ierr = VecGetLocalSize(dd->natural,&m);CHKERRQ(ierr);
1020298fd71SBarry Smith   ierr = VecGetOwnershipRange(dd->natural,&start,NULL);CHKERRQ(ierr);
10347c6ae99SBarry Smith 
104aa219208SBarry Smith   ierr = DMDAGetNatural_Private(da,&Nlocal,&to);CHKERRQ(ierr);
1052c71b3e2SJacob Faibussowitsch   PetscCheckFalse(Nlocal != m,PETSC_COMM_SELF,PETSC_ERR_PLIB,"Internal error: Nlocal %D local vector size %D",Nlocal,m);
106ce94432eSBarry Smith   ierr = ISCreateStride(PetscObjectComm((PetscObject)da),m,start,1,&from);CHKERRQ(ierr);
107ea78f98cSLisandro Dalcin   ierr = VecCreateMPIWithArray(PetscObjectComm((PetscObject)da),dd->w,dd->Nlocal,PETSC_DETERMINE,NULL,&global);CHKERRQ(ierr);
1089448b7f1SJunchao Zhang   ierr = VecScatterCreate(global,from,dd->natural,to,&dd->gton);CHKERRQ(ierr);
109fcfd50ebSBarry Smith   ierr = VecDestroy(&global);CHKERRQ(ierr);
110fcfd50ebSBarry Smith   ierr = ISDestroy(&from);CHKERRQ(ierr);
111fcfd50ebSBarry Smith   ierr = ISDestroy(&to);CHKERRQ(ierr);
11247c6ae99SBarry Smith   PetscFunctionReturn(0);
11347c6ae99SBarry Smith }
11447c6ae99SBarry Smith 
11547c6ae99SBarry Smith /*@
116aa219208SBarry Smith    DMDAGlobalToNaturalBegin - Maps values from the global vector to a global vector
11747c6ae99SBarry Smith    in the "natural" grid ordering. Must be followed by
118aa219208SBarry Smith    DMDAGlobalToNaturalEnd() to complete the exchange.
11947c6ae99SBarry Smith 
120d083f849SBarry Smith    Neighbor-wise Collective on da
12147c6ae99SBarry Smith 
12247c6ae99SBarry Smith    Input Parameters:
12347c6ae99SBarry Smith +  da - the distributed array context
12447c6ae99SBarry Smith .  g - the global vector
12547c6ae99SBarry Smith -  mode - one of INSERT_VALUES or ADD_VALUES
12647c6ae99SBarry Smith 
12747c6ae99SBarry Smith    Output Parameter:
12847c6ae99SBarry Smith .  l  - the natural ordering values
12947c6ae99SBarry Smith 
13047c6ae99SBarry Smith    Level: advanced
13147c6ae99SBarry Smith 
13247c6ae99SBarry Smith    Notes:
13347c6ae99SBarry Smith    The global and natrual vectors used here need not be the same as those
134aa219208SBarry Smith    obtained from DMCreateGlobalVector() and DMDACreateNaturalVector(), BUT they
13547c6ae99SBarry Smith    must have the same parallel data layout; they could, for example, be
136aa219208SBarry Smith    obtained with VecDuplicate() from the DMDA originating vectors.
13747c6ae99SBarry Smith 
138aa219208SBarry Smith    You must call DMDACreateNaturalVector() before using this routine
13947c6ae99SBarry Smith 
140aa219208SBarry Smith .seealso: DMDAGlobalToNaturalEnd(), DMLocalToGlobalBegin(), DMDACreate2d(),
141aa219208SBarry Smith           DMGlobalToLocalBegin(), DMGlobalToLocalEnd(), DMDACreateNaturalVector()
1429a42bb27SBarry Smith 
14347c6ae99SBarry Smith @*/
144dd9d0712SPatrick Sanan PetscErrorCode  DMDAGlobalToNaturalBegin(DM da,Vec g,InsertMode mode,Vec n)
14547c6ae99SBarry Smith {
14647c6ae99SBarry Smith   PetscErrorCode ierr;
14747c6ae99SBarry Smith   DM_DA          *dd = (DM_DA*)da->data;
14847c6ae99SBarry Smith 
14947c6ae99SBarry Smith   PetscFunctionBegin;
150a9a02de4SBarry Smith   PetscValidHeaderSpecificType(da,DM_CLASSID,1,DMDA);
151dd9d0712SPatrick Sanan   PetscValidHeaderSpecific(g,VEC_CLASSID,2);
152dd9d0712SPatrick Sanan   PetscValidHeaderSpecific(n,VEC_CLASSID,4);
15347c6ae99SBarry Smith   if (!dd->gton) {
15447c6ae99SBarry Smith     /* create the scatter context */
155aa219208SBarry Smith     ierr = DMDAGlobalToNatural_Create(da);CHKERRQ(ierr);
15647c6ae99SBarry Smith   }
157dd9d0712SPatrick Sanan   ierr = VecScatterBegin(dd->gton,g,n,mode,SCATTER_FORWARD);CHKERRQ(ierr);
15847c6ae99SBarry Smith   PetscFunctionReturn(0);
15947c6ae99SBarry Smith }
16047c6ae99SBarry Smith 
16147c6ae99SBarry Smith /*@
162aa219208SBarry Smith    DMDAGlobalToNaturalEnd - Maps values from the global vector to a global vector
163a5b23f4aSJose E. Roman    in the natural ordering. Must be preceded by DMDAGlobalToNaturalBegin().
16447c6ae99SBarry Smith 
165d083f849SBarry Smith    Neighbor-wise Collective on da
16647c6ae99SBarry Smith 
16747c6ae99SBarry Smith    Input Parameters:
16847c6ae99SBarry Smith +  da - the distributed array context
16947c6ae99SBarry Smith .  g - the global vector
17047c6ae99SBarry Smith -  mode - one of INSERT_VALUES or ADD_VALUES
17147c6ae99SBarry Smith 
17247c6ae99SBarry Smith    Output Parameter:
17347c6ae99SBarry Smith .  l  - the global values in the natural ordering
17447c6ae99SBarry Smith 
17547c6ae99SBarry Smith    Level: advanced
17647c6ae99SBarry Smith 
17747c6ae99SBarry Smith    Notes:
17847c6ae99SBarry Smith    The global and local vectors used here need not be the same as those
179aa219208SBarry Smith    obtained from DMCreateGlobalVector() and DMDACreateNaturalVector(), BUT they
18047c6ae99SBarry Smith    must have the same parallel data layout; they could, for example, be
181aa219208SBarry Smith    obtained with VecDuplicate() from the DMDA originating vectors.
18247c6ae99SBarry Smith 
183aa219208SBarry Smith .seealso: DMDAGlobalToNaturalBegin(), DMLocalToGlobalBegin(), DMDACreate2d(),
184aa219208SBarry Smith           DMGlobalToLocalBegin(), DMGlobalToLocalEnd(), DMDACreateNaturalVector()
1859a42bb27SBarry Smith 
18647c6ae99SBarry Smith @*/
187dd9d0712SPatrick Sanan PetscErrorCode  DMDAGlobalToNaturalEnd(DM da,Vec g,InsertMode mode,Vec n)
18847c6ae99SBarry Smith {
18947c6ae99SBarry Smith   PetscErrorCode ierr;
19047c6ae99SBarry Smith   DM_DA          *dd = (DM_DA*)da->data;
19147c6ae99SBarry Smith 
19247c6ae99SBarry Smith   PetscFunctionBegin;
193a9a02de4SBarry Smith   PetscValidHeaderSpecificType(da,DM_CLASSID,1,DMDA);
194dd9d0712SPatrick Sanan   PetscValidHeaderSpecific(g,VEC_CLASSID,2);
195dd9d0712SPatrick Sanan   PetscValidHeaderSpecific(n,VEC_CLASSID,4);
196dd9d0712SPatrick Sanan   ierr = VecScatterEnd(dd->gton,g,n,mode,SCATTER_FORWARD);CHKERRQ(ierr);
19747c6ae99SBarry Smith   PetscFunctionReturn(0);
19847c6ae99SBarry Smith }
19947c6ae99SBarry Smith 
20047c6ae99SBarry Smith /*@
201aa219208SBarry Smith    DMDANaturalToGlobalBegin - Maps values from a global vector in the "natural" ordering
202aa219208SBarry Smith    to a global vector in the PETSc DMDA grid ordering. Must be followed by
203aa219208SBarry Smith    DMDANaturalToGlobalEnd() to complete the exchange.
20447c6ae99SBarry Smith 
205d083f849SBarry Smith    Neighbor-wise Collective on da
20647c6ae99SBarry Smith 
20747c6ae99SBarry Smith    Input Parameters:
20847c6ae99SBarry Smith +  da - the distributed array context
20947c6ae99SBarry Smith .  g - the global vector in a natural ordering
21047c6ae99SBarry Smith -  mode - one of INSERT_VALUES or ADD_VALUES
21147c6ae99SBarry Smith 
21247c6ae99SBarry Smith    Output Parameter:
213aa219208SBarry Smith .  l  - the values in the DMDA ordering
21447c6ae99SBarry Smith 
21547c6ae99SBarry Smith    Level: advanced
21647c6ae99SBarry Smith 
21747c6ae99SBarry Smith    Notes:
21847c6ae99SBarry Smith    The global and natural vectors used here need not be the same as those
219aa219208SBarry Smith    obtained from DMCreateGlobalVector() and DMDACreateNaturalVector(), BUT they
22047c6ae99SBarry Smith    must have the same parallel data layout; they could, for example, be
221aa219208SBarry Smith    obtained with VecDuplicate() from the DMDA originating vectors.
22247c6ae99SBarry Smith 
223aa219208SBarry Smith .seealso: DMDAGlobalToNaturalEnd(), DMDAGlobalToNaturalBegin(), DMLocalToGlobalBegin(), DMDACreate2d(),
224aa219208SBarry Smith           DMGlobalToLocalBegin(), DMGlobalToLocalEnd(), DMDACreateNaturalVector()
22547c6ae99SBarry Smith 
22647c6ae99SBarry Smith @*/
227dd9d0712SPatrick Sanan PetscErrorCode  DMDANaturalToGlobalBegin(DM da,Vec n,InsertMode mode,Vec g)
22847c6ae99SBarry Smith {
22947c6ae99SBarry Smith   PetscErrorCode ierr;
23047c6ae99SBarry Smith   DM_DA          *dd = (DM_DA*)da->data;
23147c6ae99SBarry Smith 
23247c6ae99SBarry Smith   PetscFunctionBegin;
233a9a02de4SBarry Smith   PetscValidHeaderSpecificType(da,DM_CLASSID,1,DMDA);
234dd9d0712SPatrick Sanan   PetscValidHeaderSpecific(n,VEC_CLASSID,2);
23547c6ae99SBarry Smith   PetscValidHeaderSpecific(g,VEC_CLASSID,4);
23647c6ae99SBarry Smith   if (!dd->gton) {
23747c6ae99SBarry Smith     /* create the scatter context */
238aa219208SBarry Smith     ierr = DMDAGlobalToNatural_Create(da);CHKERRQ(ierr);
23947c6ae99SBarry Smith   }
240dd9d0712SPatrick Sanan   ierr = VecScatterBegin(dd->gton,n,g,mode,SCATTER_REVERSE);CHKERRQ(ierr);
24147c6ae99SBarry Smith   PetscFunctionReturn(0);
24247c6ae99SBarry Smith }
24347c6ae99SBarry Smith 
24447c6ae99SBarry Smith /*@
245aa219208SBarry Smith    DMDANaturalToGlobalEnd - Maps values from the natural ordering global vector
246a5b23f4aSJose E. Roman    to a global vector in the PETSc DMDA ordering. Must be preceded by DMDANaturalToGlobalBegin().
24747c6ae99SBarry Smith 
248d083f849SBarry Smith    Neighbor-wise Collective on da
24947c6ae99SBarry Smith 
25047c6ae99SBarry Smith    Input Parameters:
25147c6ae99SBarry Smith +  da - the distributed array context
25247c6ae99SBarry Smith .  g - the global vector in a natural ordering
25347c6ae99SBarry Smith -  mode - one of INSERT_VALUES or ADD_VALUES
25447c6ae99SBarry Smith 
25547c6ae99SBarry Smith    Output Parameter:
256aa219208SBarry Smith .  l  - the global values in the PETSc DMDA ordering
25747c6ae99SBarry Smith 
258a47bb602SJed Brown    Level: advanced
25947c6ae99SBarry Smith 
26047c6ae99SBarry Smith    Notes:
26147c6ae99SBarry Smith    The global and local vectors used here need not be the same as those
262aa219208SBarry Smith    obtained from DMCreateGlobalVector() and DMDACreateNaturalVector(), BUT they
26347c6ae99SBarry Smith    must have the same parallel data layout; they could, for example, be
264aa219208SBarry Smith    obtained with VecDuplicate() from the DMDA originating vectors.
26547c6ae99SBarry Smith 
266aa219208SBarry Smith .seealso: DMDAGlobalToNaturalBegin(), DMDAGlobalToNaturalEnd(), DMLocalToGlobalBegin(), DMDACreate2d(),
267aa219208SBarry Smith           DMGlobalToLocalBegin(), DMGlobalToLocalEnd(), DMDACreateNaturalVector()
26847c6ae99SBarry Smith 
26947c6ae99SBarry Smith @*/
270dd9d0712SPatrick Sanan PetscErrorCode  DMDANaturalToGlobalEnd(DM da,Vec n,InsertMode mode,Vec g)
27147c6ae99SBarry Smith {
27247c6ae99SBarry Smith   PetscErrorCode ierr;
27347c6ae99SBarry Smith   DM_DA          *dd = (DM_DA*)da->data;
27447c6ae99SBarry Smith 
27547c6ae99SBarry Smith   PetscFunctionBegin;
276a9a02de4SBarry Smith   PetscValidHeaderSpecificType(da,DM_CLASSID,1,DMDA);
277dd9d0712SPatrick Sanan   PetscValidHeaderSpecific(n,VEC_CLASSID,2);
27847c6ae99SBarry Smith   PetscValidHeaderSpecific(g,VEC_CLASSID,4);
279dd9d0712SPatrick Sanan   ierr = VecScatterEnd(dd->gton,n,g,mode,SCATTER_REVERSE);CHKERRQ(ierr);
28047c6ae99SBarry Smith   PetscFunctionReturn(0);
28147c6ae99SBarry Smith }
282