xref: /petsc/src/dm/impls/da/dagtol.c (revision 95452b02e12c0ee11232c7ff2b24b568a8e07e43)
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) {
45ba302962SPatrick Sanan     if (dd->bx != DM_BOUNDARY_GHOSTED && dd->bx != DM_BOUNDARY_NONE && dd->s > 0 && dd->m == 1) SETERRQ(PetscObjectComm((PetscObject)da),PETSC_ERR_SUP,"Available only for boundary none or with parallelism in x direction");
46ba302962SPatrick Sanan     if (dd->bx != DM_BOUNDARY_GHOSTED && dd->by != DM_BOUNDARY_NONE && dd->s > 0 && dd->n == 1) SETERRQ(PetscObjectComm((PetscObject)da),PETSC_ERR_SUP,"Available only for boundary none or with parallelism in y direction");
47ba302962SPatrick Sanan     if (dd->bx != DM_BOUNDARY_GHOSTED && dd->bz != DM_BOUNDARY_NONE && dd->s > 0 && dd->p == 1) SETERRQ(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 
74aa219208SBarry Smith    Collective on DMDA
7547c6ae99SBarry Smith 
7647c6ae99SBarry Smith    Input Parameter:
7747c6ae99SBarry Smith .  da - the distributed array context
7847c6ae99SBarry Smith 
7947c6ae99SBarry Smith    Level: developer
8047c6ae99SBarry Smith 
81*95452b02SPatrick Sanan    Notes:
82*95452b02SPatrick Sanan     This is an internal routine called by DMDAGlobalToNatural() to
8347c6ae99SBarry Smith      create the scatter context.
8447c6ae99SBarry Smith 
8547c6ae99SBarry Smith .keywords: distributed array, global to local, begin
8647c6ae99SBarry Smith 
87aa219208SBarry Smith .seealso: DMDAGlobalToNaturalBegin(), DMDAGlobalToNaturalEnd(), DMLocalToGlobalBegin(), DMDACreate2d(),
88aa219208SBarry Smith           DMGlobalToLocalBegin(), DMGlobalToLocalEnd(), DMDACreateNaturalVector()
8947c6ae99SBarry Smith */
90aa219208SBarry Smith PetscErrorCode DMDAGlobalToNatural_Create(DM da)
9147c6ae99SBarry Smith {
9247c6ae99SBarry Smith   PetscErrorCode ierr;
9347c6ae99SBarry Smith   PetscInt       m,start,Nlocal;
9447c6ae99SBarry Smith   IS             from,to;
9547c6ae99SBarry Smith   Vec            global;
9647c6ae99SBarry Smith   DM_DA          *dd = (DM_DA*)da->data;
9747c6ae99SBarry Smith 
9847c6ae99SBarry Smith   PetscFunctionBegin;
9947c6ae99SBarry Smith   PetscValidHeaderSpecific(da,DM_CLASSID,1);
100ce94432eSBarry Smith   if (!dd->natural) SETERRQ(PetscObjectComm((PetscObject)da),PETSC_ERR_ORDER,"Natural layout vector not yet created; cannot scatter into it");
10147c6ae99SBarry Smith 
10247c6ae99SBarry Smith   /* create the scatter context */
10347c6ae99SBarry Smith   ierr = VecGetLocalSize(dd->natural,&m);CHKERRQ(ierr);
1040298fd71SBarry Smith   ierr = VecGetOwnershipRange(dd->natural,&start,NULL);CHKERRQ(ierr);
10547c6ae99SBarry Smith 
106aa219208SBarry Smith   ierr = DMDAGetNatural_Private(da,&Nlocal,&to);CHKERRQ(ierr);
10747c6ae99SBarry Smith   if (Nlocal != m) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Internal error: Nlocal %D local vector size %D",Nlocal,m);
108ce94432eSBarry Smith   ierr = ISCreateStride(PetscObjectComm((PetscObject)da),m,start,1,&from);CHKERRQ(ierr);
109ce94432eSBarry Smith   ierr = VecCreateMPIWithArray(PetscObjectComm((PetscObject)da),dd->w,dd->Nlocal,PETSC_DETERMINE,0,&global);CHKERRQ(ierr);
11047c6ae99SBarry Smith   ierr = VecScatterCreate(global,from,dd->natural,to,&dd->gton);CHKERRQ(ierr);
111fcfd50ebSBarry Smith   ierr = VecDestroy(&global);CHKERRQ(ierr);
112fcfd50ebSBarry Smith   ierr = ISDestroy(&from);CHKERRQ(ierr);
113fcfd50ebSBarry Smith   ierr = ISDestroy(&to);CHKERRQ(ierr);
11447c6ae99SBarry Smith   PetscFunctionReturn(0);
11547c6ae99SBarry Smith }
11647c6ae99SBarry Smith 
11747c6ae99SBarry Smith /*@
118aa219208SBarry Smith    DMDAGlobalToNaturalBegin - Maps values from the global vector to a global vector
11947c6ae99SBarry Smith    in the "natural" grid ordering. Must be followed by
120aa219208SBarry Smith    DMDAGlobalToNaturalEnd() to complete the exchange.
12147c6ae99SBarry Smith 
122aa219208SBarry Smith    Neighbor-wise Collective on DMDA
12347c6ae99SBarry Smith 
12447c6ae99SBarry Smith    Input Parameters:
12547c6ae99SBarry Smith +  da - the distributed array context
12647c6ae99SBarry Smith .  g - the global vector
12747c6ae99SBarry Smith -  mode - one of INSERT_VALUES or ADD_VALUES
12847c6ae99SBarry Smith 
12947c6ae99SBarry Smith    Output Parameter:
13047c6ae99SBarry Smith .  l  - the natural ordering values
13147c6ae99SBarry Smith 
13247c6ae99SBarry Smith    Level: advanced
13347c6ae99SBarry Smith 
13447c6ae99SBarry Smith    Notes:
13547c6ae99SBarry Smith    The global and natrual vectors used here need not be the same as those
136aa219208SBarry Smith    obtained from DMCreateGlobalVector() and DMDACreateNaturalVector(), BUT they
13747c6ae99SBarry Smith    must have the same parallel data layout; they could, for example, be
138aa219208SBarry Smith    obtained with VecDuplicate() from the DMDA originating vectors.
13947c6ae99SBarry Smith 
140aa219208SBarry Smith    You must call DMDACreateNaturalVector() before using this routine
14147c6ae99SBarry Smith 
14247c6ae99SBarry Smith .keywords: distributed array, global to local, begin
14347c6ae99SBarry Smith 
144aa219208SBarry Smith .seealso: DMDAGlobalToNaturalEnd(), DMLocalToGlobalBegin(), DMDACreate2d(),
145aa219208SBarry Smith           DMGlobalToLocalBegin(), DMGlobalToLocalEnd(), DMDACreateNaturalVector()
1469a42bb27SBarry Smith 
14747c6ae99SBarry Smith @*/
148dd9d0712SPatrick Sanan PetscErrorCode  DMDAGlobalToNaturalBegin(DM da,Vec g,InsertMode mode,Vec n)
14947c6ae99SBarry Smith {
15047c6ae99SBarry Smith   PetscErrorCode ierr;
15147c6ae99SBarry Smith   DM_DA          *dd = (DM_DA*)da->data;
15247c6ae99SBarry Smith 
15347c6ae99SBarry Smith   PetscFunctionBegin;
15447c6ae99SBarry Smith   PetscValidHeaderSpecific(da,DM_CLASSID,1);
155dd9d0712SPatrick Sanan   PetscValidHeaderSpecific(g,VEC_CLASSID,2);
156dd9d0712SPatrick Sanan   PetscValidHeaderSpecific(n,VEC_CLASSID,4);
15747c6ae99SBarry Smith   if (!dd->gton) {
15847c6ae99SBarry Smith     /* create the scatter context */
159aa219208SBarry Smith     ierr = DMDAGlobalToNatural_Create(da);CHKERRQ(ierr);
16047c6ae99SBarry Smith   }
161dd9d0712SPatrick Sanan   ierr = VecScatterBegin(dd->gton,g,n,mode,SCATTER_FORWARD);CHKERRQ(ierr);
16247c6ae99SBarry Smith   PetscFunctionReturn(0);
16347c6ae99SBarry Smith }
16447c6ae99SBarry Smith 
16547c6ae99SBarry Smith /*@
166aa219208SBarry Smith    DMDAGlobalToNaturalEnd - Maps values from the global vector to a global vector
167aa219208SBarry Smith    in the natural ordering. Must be preceeded by DMDAGlobalToNaturalBegin().
16847c6ae99SBarry Smith 
169aa219208SBarry Smith    Neighbor-wise Collective on DMDA
17047c6ae99SBarry Smith 
17147c6ae99SBarry Smith    Input Parameters:
17247c6ae99SBarry Smith +  da - the distributed array context
17347c6ae99SBarry Smith .  g - the global vector
17447c6ae99SBarry Smith -  mode - one of INSERT_VALUES or ADD_VALUES
17547c6ae99SBarry Smith 
17647c6ae99SBarry Smith    Output Parameter:
17747c6ae99SBarry Smith .  l  - the global values in the natural ordering
17847c6ae99SBarry Smith 
17947c6ae99SBarry Smith    Level: advanced
18047c6ae99SBarry Smith 
18147c6ae99SBarry Smith    Notes:
18247c6ae99SBarry Smith    The global and local vectors used here need not be the same as those
183aa219208SBarry Smith    obtained from DMCreateGlobalVector() and DMDACreateNaturalVector(), BUT they
18447c6ae99SBarry Smith    must have the same parallel data layout; they could, for example, be
185aa219208SBarry Smith    obtained with VecDuplicate() from the DMDA originating vectors.
18647c6ae99SBarry Smith 
18747c6ae99SBarry Smith .keywords: distributed array, global to local, end
18847c6ae99SBarry Smith 
189aa219208SBarry Smith .seealso: DMDAGlobalToNaturalBegin(), DMLocalToGlobalBegin(), DMDACreate2d(),
190aa219208SBarry Smith           DMGlobalToLocalBegin(), DMGlobalToLocalEnd(), DMDACreateNaturalVector()
1919a42bb27SBarry Smith 
19247c6ae99SBarry Smith @*/
193dd9d0712SPatrick Sanan PetscErrorCode  DMDAGlobalToNaturalEnd(DM da,Vec g,InsertMode mode,Vec n)
19447c6ae99SBarry Smith {
19547c6ae99SBarry Smith   PetscErrorCode ierr;
19647c6ae99SBarry Smith   DM_DA          *dd = (DM_DA*)da->data;
19747c6ae99SBarry Smith 
19847c6ae99SBarry Smith   PetscFunctionBegin;
19947c6ae99SBarry Smith   PetscValidHeaderSpecific(da,DM_CLASSID,1);
200dd9d0712SPatrick Sanan   PetscValidHeaderSpecific(g,VEC_CLASSID,2);
201dd9d0712SPatrick Sanan   PetscValidHeaderSpecific(n,VEC_CLASSID,4);
202dd9d0712SPatrick Sanan   ierr = VecScatterEnd(dd->gton,g,n,mode,SCATTER_FORWARD);CHKERRQ(ierr);
20347c6ae99SBarry Smith   PetscFunctionReturn(0);
20447c6ae99SBarry Smith }
20547c6ae99SBarry Smith 
20647c6ae99SBarry Smith /*@
207aa219208SBarry Smith    DMDANaturalToGlobalBegin - Maps values from a global vector in the "natural" ordering
208aa219208SBarry Smith    to a global vector in the PETSc DMDA grid ordering. Must be followed by
209aa219208SBarry Smith    DMDANaturalToGlobalEnd() to complete the exchange.
21047c6ae99SBarry Smith 
211aa219208SBarry Smith    Neighbor-wise Collective on DMDA
21247c6ae99SBarry Smith 
21347c6ae99SBarry Smith    Input Parameters:
21447c6ae99SBarry Smith +  da - the distributed array context
21547c6ae99SBarry Smith .  g - the global vector in a natural ordering
21647c6ae99SBarry Smith -  mode - one of INSERT_VALUES or ADD_VALUES
21747c6ae99SBarry Smith 
21847c6ae99SBarry Smith    Output Parameter:
219aa219208SBarry Smith .  l  - the values in the DMDA ordering
22047c6ae99SBarry Smith 
22147c6ae99SBarry Smith    Level: advanced
22247c6ae99SBarry Smith 
22347c6ae99SBarry Smith    Notes:
22447c6ae99SBarry Smith    The global and natural vectors used here need not be the same as those
225aa219208SBarry Smith    obtained from DMCreateGlobalVector() and DMDACreateNaturalVector(), BUT they
22647c6ae99SBarry Smith    must have the same parallel data layout; they could, for example, be
227aa219208SBarry Smith    obtained with VecDuplicate() from the DMDA originating vectors.
22847c6ae99SBarry Smith 
22947c6ae99SBarry Smith .keywords: distributed array, global to local, begin
23047c6ae99SBarry Smith 
231aa219208SBarry Smith .seealso: DMDAGlobalToNaturalEnd(), DMDAGlobalToNaturalBegin(), DMLocalToGlobalBegin(), DMDACreate2d(),
232aa219208SBarry Smith           DMGlobalToLocalBegin(), DMGlobalToLocalEnd(), DMDACreateNaturalVector()
23347c6ae99SBarry Smith 
23447c6ae99SBarry Smith @*/
235dd9d0712SPatrick Sanan PetscErrorCode  DMDANaturalToGlobalBegin(DM da,Vec n,InsertMode mode,Vec g)
23647c6ae99SBarry Smith {
23747c6ae99SBarry Smith   PetscErrorCode ierr;
23847c6ae99SBarry Smith   DM_DA          *dd = (DM_DA*)da->data;
23947c6ae99SBarry Smith 
24047c6ae99SBarry Smith   PetscFunctionBegin;
24147c6ae99SBarry Smith   PetscValidHeaderSpecific(da,DM_CLASSID,1);
242dd9d0712SPatrick Sanan   PetscValidHeaderSpecific(n,VEC_CLASSID,2);
24347c6ae99SBarry Smith   PetscValidHeaderSpecific(g,VEC_CLASSID,4);
24447c6ae99SBarry Smith   if (!dd->gton) {
24547c6ae99SBarry Smith     /* create the scatter context */
246aa219208SBarry Smith     ierr = DMDAGlobalToNatural_Create(da);CHKERRQ(ierr);
24747c6ae99SBarry Smith   }
248dd9d0712SPatrick Sanan   ierr = VecScatterBegin(dd->gton,n,g,mode,SCATTER_REVERSE);CHKERRQ(ierr);
24947c6ae99SBarry Smith   PetscFunctionReturn(0);
25047c6ae99SBarry Smith }
25147c6ae99SBarry Smith 
25247c6ae99SBarry Smith /*@
253aa219208SBarry Smith    DMDANaturalToGlobalEnd - Maps values from the natural ordering global vector
254aa219208SBarry Smith    to a global vector in the PETSc DMDA ordering. Must be preceeded by DMDANaturalToGlobalBegin().
25547c6ae99SBarry Smith 
256aa219208SBarry Smith    Neighbor-wise Collective on DMDA
25747c6ae99SBarry Smith 
25847c6ae99SBarry Smith    Input Parameters:
25947c6ae99SBarry Smith +  da - the distributed array context
26047c6ae99SBarry Smith .  g - the global vector in a natural ordering
26147c6ae99SBarry Smith -  mode - one of INSERT_VALUES or ADD_VALUES
26247c6ae99SBarry Smith 
26347c6ae99SBarry Smith    Output Parameter:
264aa219208SBarry Smith .  l  - the global values in the PETSc DMDA ordering
26547c6ae99SBarry Smith 
266a47bb602SJed Brown    Level: advanced
26747c6ae99SBarry Smith 
26847c6ae99SBarry Smith    Notes:
26947c6ae99SBarry Smith    The global and local vectors used here need not be the same as those
270aa219208SBarry Smith    obtained from DMCreateGlobalVector() and DMDACreateNaturalVector(), BUT they
27147c6ae99SBarry Smith    must have the same parallel data layout; they could, for example, be
272aa219208SBarry Smith    obtained with VecDuplicate() from the DMDA originating vectors.
27347c6ae99SBarry Smith 
27447c6ae99SBarry Smith .keywords: distributed array, global to local, end
27547c6ae99SBarry Smith 
276aa219208SBarry Smith .seealso: DMDAGlobalToNaturalBegin(), DMDAGlobalToNaturalEnd(), DMLocalToGlobalBegin(), DMDACreate2d(),
277aa219208SBarry Smith           DMGlobalToLocalBegin(), DMGlobalToLocalEnd(), DMDACreateNaturalVector()
27847c6ae99SBarry Smith 
27947c6ae99SBarry Smith @*/
280dd9d0712SPatrick Sanan PetscErrorCode  DMDANaturalToGlobalEnd(DM da,Vec n,InsertMode mode,Vec g)
28147c6ae99SBarry Smith {
28247c6ae99SBarry Smith   PetscErrorCode ierr;
28347c6ae99SBarry Smith   DM_DA          *dd = (DM_DA*)da->data;
28447c6ae99SBarry Smith 
28547c6ae99SBarry Smith   PetscFunctionBegin;
28647c6ae99SBarry Smith   PetscValidHeaderSpecific(da,DM_CLASSID,1);
287dd9d0712SPatrick Sanan   PetscValidHeaderSpecific(n,VEC_CLASSID,2);
28847c6ae99SBarry Smith   PetscValidHeaderSpecific(g,VEC_CLASSID,4);
289dd9d0712SPatrick Sanan   ierr = VecScatterEnd(dd->gton,n,g,mode,SCATTER_REVERSE);CHKERRQ(ierr);
29047c6ae99SBarry Smith   PetscFunctionReturn(0);
29147c6ae99SBarry Smith }
292