xref: /petsc/src/dm/impls/da/dagtol.c (revision dd9d0712af5784eb2b459f29af1faa11b23025a4)
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);
41*dd9d0712SPatrick 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);
61*dd9d0712SPatrick 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 
81aa219208SBarry Smith    Notes: This is an internal routine called by DMDAGlobalToNatural() to
8247c6ae99SBarry Smith      create the scatter context.
8347c6ae99SBarry Smith 
8447c6ae99SBarry Smith .keywords: distributed array, global to local, begin
8547c6ae99SBarry Smith 
86aa219208SBarry Smith .seealso: DMDAGlobalToNaturalBegin(), DMDAGlobalToNaturalEnd(), DMLocalToGlobalBegin(), DMDACreate2d(),
87aa219208SBarry Smith           DMGlobalToLocalBegin(), DMGlobalToLocalEnd(), DMDACreateNaturalVector()
8847c6ae99SBarry Smith */
89aa219208SBarry Smith PetscErrorCode DMDAGlobalToNatural_Create(DM da)
9047c6ae99SBarry Smith {
9147c6ae99SBarry Smith   PetscErrorCode ierr;
9247c6ae99SBarry Smith   PetscInt       m,start,Nlocal;
9347c6ae99SBarry Smith   IS             from,to;
9447c6ae99SBarry Smith   Vec            global;
9547c6ae99SBarry Smith   DM_DA          *dd = (DM_DA*)da->data;
9647c6ae99SBarry Smith 
9747c6ae99SBarry Smith   PetscFunctionBegin;
9847c6ae99SBarry Smith   PetscValidHeaderSpecific(da,DM_CLASSID,1);
99ce94432eSBarry Smith   if (!dd->natural) SETERRQ(PetscObjectComm((PetscObject)da),PETSC_ERR_ORDER,"Natural layout vector not yet created; cannot scatter into it");
10047c6ae99SBarry Smith 
10147c6ae99SBarry Smith   /* create the scatter context */
10247c6ae99SBarry Smith   ierr = VecGetLocalSize(dd->natural,&m);CHKERRQ(ierr);
1030298fd71SBarry Smith   ierr = VecGetOwnershipRange(dd->natural,&start,NULL);CHKERRQ(ierr);
10447c6ae99SBarry Smith 
105aa219208SBarry Smith   ierr = DMDAGetNatural_Private(da,&Nlocal,&to);CHKERRQ(ierr);
10647c6ae99SBarry Smith   if (Nlocal != m) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Internal error: Nlocal %D local vector size %D",Nlocal,m);
107ce94432eSBarry Smith   ierr = ISCreateStride(PetscObjectComm((PetscObject)da),m,start,1,&from);CHKERRQ(ierr);
108ce94432eSBarry Smith   ierr = VecCreateMPIWithArray(PetscObjectComm((PetscObject)da),dd->w,dd->Nlocal,PETSC_DETERMINE,0,&global);CHKERRQ(ierr);
10947c6ae99SBarry Smith   ierr = VecScatterCreate(global,from,dd->natural,to,&dd->gton);CHKERRQ(ierr);
110fcfd50ebSBarry Smith   ierr = VecDestroy(&global);CHKERRQ(ierr);
111fcfd50ebSBarry Smith   ierr = ISDestroy(&from);CHKERRQ(ierr);
112fcfd50ebSBarry Smith   ierr = ISDestroy(&to);CHKERRQ(ierr);
11347c6ae99SBarry Smith   PetscFunctionReturn(0);
11447c6ae99SBarry Smith }
11547c6ae99SBarry Smith 
11647c6ae99SBarry Smith /*@
117aa219208SBarry Smith    DMDAGlobalToNaturalBegin - Maps values from the global vector to a global vector
11847c6ae99SBarry Smith    in the "natural" grid ordering. Must be followed by
119aa219208SBarry Smith    DMDAGlobalToNaturalEnd() to complete the exchange.
12047c6ae99SBarry Smith 
121aa219208SBarry Smith    Neighbor-wise Collective on DMDA
12247c6ae99SBarry Smith 
12347c6ae99SBarry Smith    Input Parameters:
12447c6ae99SBarry Smith +  da - the distributed array context
12547c6ae99SBarry Smith .  g - the global vector
12647c6ae99SBarry Smith -  mode - one of INSERT_VALUES or ADD_VALUES
12747c6ae99SBarry Smith 
12847c6ae99SBarry Smith    Output Parameter:
12947c6ae99SBarry Smith .  l  - the natural ordering values
13047c6ae99SBarry Smith 
13147c6ae99SBarry Smith    Level: advanced
13247c6ae99SBarry Smith 
13347c6ae99SBarry Smith    Notes:
13447c6ae99SBarry Smith    The global and natrual vectors used here need not be the same as those
135aa219208SBarry Smith    obtained from DMCreateGlobalVector() and DMDACreateNaturalVector(), BUT they
13647c6ae99SBarry Smith    must have the same parallel data layout; they could, for example, be
137aa219208SBarry Smith    obtained with VecDuplicate() from the DMDA originating vectors.
13847c6ae99SBarry Smith 
139aa219208SBarry Smith    You must call DMDACreateNaturalVector() before using this routine
14047c6ae99SBarry Smith 
14147c6ae99SBarry Smith .keywords: distributed array, global to local, begin
14247c6ae99SBarry Smith 
143aa219208SBarry Smith .seealso: DMDAGlobalToNaturalEnd(), DMLocalToGlobalBegin(), DMDACreate2d(),
144aa219208SBarry Smith           DMGlobalToLocalBegin(), DMGlobalToLocalEnd(), DMDACreateNaturalVector()
1459a42bb27SBarry Smith 
14647c6ae99SBarry Smith @*/
147*dd9d0712SPatrick Sanan PetscErrorCode  DMDAGlobalToNaturalBegin(DM da,Vec g,InsertMode mode,Vec n)
14847c6ae99SBarry Smith {
14947c6ae99SBarry Smith   PetscErrorCode ierr;
15047c6ae99SBarry Smith   DM_DA          *dd = (DM_DA*)da->data;
15147c6ae99SBarry Smith 
15247c6ae99SBarry Smith   PetscFunctionBegin;
15347c6ae99SBarry Smith   PetscValidHeaderSpecific(da,DM_CLASSID,1);
154*dd9d0712SPatrick Sanan   PetscValidHeaderSpecific(g,VEC_CLASSID,2);
155*dd9d0712SPatrick Sanan   PetscValidHeaderSpecific(n,VEC_CLASSID,4);
15647c6ae99SBarry Smith   if (!dd->gton) {
15747c6ae99SBarry Smith     /* create the scatter context */
158aa219208SBarry Smith     ierr = DMDAGlobalToNatural_Create(da);CHKERRQ(ierr);
15947c6ae99SBarry Smith   }
160*dd9d0712SPatrick Sanan   ierr = VecScatterBegin(dd->gton,g,n,mode,SCATTER_FORWARD);CHKERRQ(ierr);
16147c6ae99SBarry Smith   PetscFunctionReturn(0);
16247c6ae99SBarry Smith }
16347c6ae99SBarry Smith 
16447c6ae99SBarry Smith /*@
165aa219208SBarry Smith    DMDAGlobalToNaturalEnd - Maps values from the global vector to a global vector
166aa219208SBarry Smith    in the natural ordering. Must be preceeded by DMDAGlobalToNaturalBegin().
16747c6ae99SBarry Smith 
168aa219208SBarry Smith    Neighbor-wise Collective on DMDA
16947c6ae99SBarry Smith 
17047c6ae99SBarry Smith    Input Parameters:
17147c6ae99SBarry Smith +  da - the distributed array context
17247c6ae99SBarry Smith .  g - the global vector
17347c6ae99SBarry Smith -  mode - one of INSERT_VALUES or ADD_VALUES
17447c6ae99SBarry Smith 
17547c6ae99SBarry Smith    Output Parameter:
17647c6ae99SBarry Smith .  l  - the global values in the natural ordering
17747c6ae99SBarry Smith 
17847c6ae99SBarry Smith    Level: advanced
17947c6ae99SBarry Smith 
18047c6ae99SBarry Smith    Notes:
18147c6ae99SBarry Smith    The global and local vectors used here need not be the same as those
182aa219208SBarry Smith    obtained from DMCreateGlobalVector() and DMDACreateNaturalVector(), BUT they
18347c6ae99SBarry Smith    must have the same parallel data layout; they could, for example, be
184aa219208SBarry Smith    obtained with VecDuplicate() from the DMDA originating vectors.
18547c6ae99SBarry Smith 
18647c6ae99SBarry Smith .keywords: distributed array, global to local, end
18747c6ae99SBarry Smith 
188aa219208SBarry Smith .seealso: DMDAGlobalToNaturalBegin(), DMLocalToGlobalBegin(), DMDACreate2d(),
189aa219208SBarry Smith           DMGlobalToLocalBegin(), DMGlobalToLocalEnd(), DMDACreateNaturalVector()
1909a42bb27SBarry Smith 
19147c6ae99SBarry Smith @*/
192*dd9d0712SPatrick Sanan PetscErrorCode  DMDAGlobalToNaturalEnd(DM da,Vec g,InsertMode mode,Vec n)
19347c6ae99SBarry Smith {
19447c6ae99SBarry Smith   PetscErrorCode ierr;
19547c6ae99SBarry Smith   DM_DA          *dd = (DM_DA*)da->data;
19647c6ae99SBarry Smith 
19747c6ae99SBarry Smith   PetscFunctionBegin;
19847c6ae99SBarry Smith   PetscValidHeaderSpecific(da,DM_CLASSID,1);
199*dd9d0712SPatrick Sanan   PetscValidHeaderSpecific(g,VEC_CLASSID,2);
200*dd9d0712SPatrick Sanan   PetscValidHeaderSpecific(n,VEC_CLASSID,4);
201*dd9d0712SPatrick Sanan   ierr = VecScatterEnd(dd->gton,g,n,mode,SCATTER_FORWARD);CHKERRQ(ierr);
20247c6ae99SBarry Smith   PetscFunctionReturn(0);
20347c6ae99SBarry Smith }
20447c6ae99SBarry Smith 
20547c6ae99SBarry Smith /*@
206aa219208SBarry Smith    DMDANaturalToGlobalBegin - Maps values from a global vector in the "natural" ordering
207aa219208SBarry Smith    to a global vector in the PETSc DMDA grid ordering. Must be followed by
208aa219208SBarry Smith    DMDANaturalToGlobalEnd() to complete the exchange.
20947c6ae99SBarry Smith 
210aa219208SBarry Smith    Neighbor-wise Collective on DMDA
21147c6ae99SBarry Smith 
21247c6ae99SBarry Smith    Input Parameters:
21347c6ae99SBarry Smith +  da - the distributed array context
21447c6ae99SBarry Smith .  g - the global vector in a natural ordering
21547c6ae99SBarry Smith -  mode - one of INSERT_VALUES or ADD_VALUES
21647c6ae99SBarry Smith 
21747c6ae99SBarry Smith    Output Parameter:
218aa219208SBarry Smith .  l  - the values in the DMDA ordering
21947c6ae99SBarry Smith 
22047c6ae99SBarry Smith    Level: advanced
22147c6ae99SBarry Smith 
22247c6ae99SBarry Smith    Notes:
22347c6ae99SBarry Smith    The global and natural vectors used here need not be the same as those
224aa219208SBarry Smith    obtained from DMCreateGlobalVector() and DMDACreateNaturalVector(), BUT they
22547c6ae99SBarry Smith    must have the same parallel data layout; they could, for example, be
226aa219208SBarry Smith    obtained with VecDuplicate() from the DMDA originating vectors.
22747c6ae99SBarry Smith 
22847c6ae99SBarry Smith .keywords: distributed array, global to local, begin
22947c6ae99SBarry Smith 
230aa219208SBarry Smith .seealso: DMDAGlobalToNaturalEnd(), DMDAGlobalToNaturalBegin(), DMLocalToGlobalBegin(), DMDACreate2d(),
231aa219208SBarry Smith           DMGlobalToLocalBegin(), DMGlobalToLocalEnd(), DMDACreateNaturalVector()
23247c6ae99SBarry Smith 
23347c6ae99SBarry Smith @*/
234*dd9d0712SPatrick Sanan PetscErrorCode  DMDANaturalToGlobalBegin(DM da,Vec n,InsertMode mode,Vec g)
23547c6ae99SBarry Smith {
23647c6ae99SBarry Smith   PetscErrorCode ierr;
23747c6ae99SBarry Smith   DM_DA          *dd = (DM_DA*)da->data;
23847c6ae99SBarry Smith 
23947c6ae99SBarry Smith   PetscFunctionBegin;
24047c6ae99SBarry Smith   PetscValidHeaderSpecific(da,DM_CLASSID,1);
241*dd9d0712SPatrick Sanan   PetscValidHeaderSpecific(n,VEC_CLASSID,2);
24247c6ae99SBarry Smith   PetscValidHeaderSpecific(g,VEC_CLASSID,4);
24347c6ae99SBarry Smith   if (!dd->gton) {
24447c6ae99SBarry Smith     /* create the scatter context */
245aa219208SBarry Smith     ierr = DMDAGlobalToNatural_Create(da);CHKERRQ(ierr);
24647c6ae99SBarry Smith   }
247*dd9d0712SPatrick Sanan   ierr = VecScatterBegin(dd->gton,n,g,mode,SCATTER_REVERSE);CHKERRQ(ierr);
24847c6ae99SBarry Smith   PetscFunctionReturn(0);
24947c6ae99SBarry Smith }
25047c6ae99SBarry Smith 
25147c6ae99SBarry Smith /*@
252aa219208SBarry Smith    DMDANaturalToGlobalEnd - Maps values from the natural ordering global vector
253aa219208SBarry Smith    to a global vector in the PETSc DMDA ordering. Must be preceeded by DMDANaturalToGlobalBegin().
25447c6ae99SBarry Smith 
255aa219208SBarry Smith    Neighbor-wise Collective on DMDA
25647c6ae99SBarry Smith 
25747c6ae99SBarry Smith    Input Parameters:
25847c6ae99SBarry Smith +  da - the distributed array context
25947c6ae99SBarry Smith .  g - the global vector in a natural ordering
26047c6ae99SBarry Smith -  mode - one of INSERT_VALUES or ADD_VALUES
26147c6ae99SBarry Smith 
26247c6ae99SBarry Smith    Output Parameter:
263aa219208SBarry Smith .  l  - the global values in the PETSc DMDA ordering
26447c6ae99SBarry Smith 
26547c6ae99SBarry Smith    Level: intermediate
26647c6ae99SBarry Smith 
26747c6ae99SBarry Smith    Notes:
26847c6ae99SBarry Smith    The global and local vectors used here need not be the same as those
269aa219208SBarry Smith    obtained from DMCreateGlobalVector() and DMDACreateNaturalVector(), BUT they
27047c6ae99SBarry Smith    must have the same parallel data layout; they could, for example, be
271aa219208SBarry Smith    obtained with VecDuplicate() from the DMDA originating vectors.
27247c6ae99SBarry Smith 
27347c6ae99SBarry Smith .keywords: distributed array, global to local, end
27447c6ae99SBarry Smith 
275aa219208SBarry Smith .seealso: DMDAGlobalToNaturalBegin(), DMDAGlobalToNaturalEnd(), DMLocalToGlobalBegin(), DMDACreate2d(),
276aa219208SBarry Smith           DMGlobalToLocalBegin(), DMGlobalToLocalEnd(), DMDACreateNaturalVector()
27747c6ae99SBarry Smith 
27847c6ae99SBarry Smith @*/
279*dd9d0712SPatrick Sanan PetscErrorCode  DMDANaturalToGlobalEnd(DM da,Vec n,InsertMode mode,Vec g)
28047c6ae99SBarry Smith {
28147c6ae99SBarry Smith   PetscErrorCode ierr;
28247c6ae99SBarry Smith   DM_DA          *dd = (DM_DA*)da->data;
28347c6ae99SBarry Smith 
28447c6ae99SBarry Smith   PetscFunctionBegin;
28547c6ae99SBarry Smith   PetscValidHeaderSpecific(da,DM_CLASSID,1);
286*dd9d0712SPatrick Sanan   PetscValidHeaderSpecific(n,VEC_CLASSID,2);
28747c6ae99SBarry Smith   PetscValidHeaderSpecific(g,VEC_CLASSID,4);
288*dd9d0712SPatrick Sanan   ierr = VecScatterEnd(dd->gton,n,g,mode,SCATTER_REVERSE);CHKERRQ(ierr);
28947c6ae99SBarry Smith   PetscFunctionReturn(0);
29047c6ae99SBarry Smith }
291