xref: /petsc/src/dm/impls/da/dagtol.c (revision a47bb6026d66c0cbe5a34d54939c7cab294bec32)
147c6ae99SBarry Smith 
247c6ae99SBarry Smith /*
347c6ae99SBarry Smith   Code for manipulating distributed regular arrays in parallel.
447c6ae99SBarry Smith */
547c6ae99SBarry Smith 
6af0996ceSBarry Smith #include <petsc/private/dmdaimpl.h>    /*I   "petscdmda.h"   I*/
747c6ae99SBarry Smith 
87087cfbeSBarry Smith PetscErrorCode  DMGlobalToLocalBegin_DA(DM da,Vec g,InsertMode mode,Vec l)
947c6ae99SBarry Smith {
1047c6ae99SBarry Smith   PetscErrorCode ierr;
1147c6ae99SBarry Smith   DM_DA          *dd = (DM_DA*)da->data;
1247c6ae99SBarry Smith 
1347c6ae99SBarry Smith   PetscFunctionBegin;
1447c6ae99SBarry Smith   PetscValidHeaderSpecific(da,DM_CLASSID,1);
1547c6ae99SBarry Smith   PetscValidHeaderSpecific(g,VEC_CLASSID,2);
1647c6ae99SBarry Smith   PetscValidHeaderSpecific(l,VEC_CLASSID,4);
1747c6ae99SBarry Smith   ierr = VecScatterBegin(dd->gtol,g,l,mode,SCATTER_FORWARD);CHKERRQ(ierr);
1847c6ae99SBarry Smith   PetscFunctionReturn(0);
1947c6ae99SBarry Smith }
2047c6ae99SBarry Smith 
2147c6ae99SBarry Smith 
227087cfbeSBarry Smith PetscErrorCode  DMGlobalToLocalEnd_DA(DM da,Vec g,InsertMode mode,Vec l)
2347c6ae99SBarry Smith {
2447c6ae99SBarry Smith   PetscErrorCode ierr;
2547c6ae99SBarry Smith   DM_DA          *dd = (DM_DA*)da->data;
2647c6ae99SBarry Smith 
2747c6ae99SBarry Smith   PetscFunctionBegin;
2847c6ae99SBarry Smith   PetscValidHeaderSpecific(da,DM_CLASSID,1);
2947c6ae99SBarry Smith   PetscValidHeaderSpecific(g,VEC_CLASSID,2);
3047c6ae99SBarry Smith   PetscValidHeaderSpecific(l,VEC_CLASSID,4);
3147c6ae99SBarry Smith   ierr = VecScatterEnd(dd->gtol,g,l,mode,SCATTER_FORWARD);CHKERRQ(ierr);
3247c6ae99SBarry Smith   PetscFunctionReturn(0);
3347c6ae99SBarry Smith }
3447c6ae99SBarry Smith 
357087cfbeSBarry Smith PetscErrorCode  DMLocalToGlobalBegin_DA(DM da,Vec l,InsertMode mode,Vec g)
369a42bb27SBarry Smith {
379a42bb27SBarry Smith   PetscErrorCode ierr;
389a42bb27SBarry Smith   DM_DA          *dd = (DM_DA*)da->data;
399a42bb27SBarry Smith 
409a42bb27SBarry Smith   PetscFunctionBegin;
419a42bb27SBarry Smith   PetscValidHeaderSpecific(da,DM_CLASSID,1);
429a42bb27SBarry Smith   PetscValidHeaderSpecific(l,VEC_CLASSID,2);
439a42bb27SBarry Smith   PetscValidHeaderSpecific(g,VEC_CLASSID,3);
449a42bb27SBarry Smith   if (mode == ADD_VALUES) {
459a42bb27SBarry Smith     ierr = VecScatterBegin(dd->gtol,l,g,ADD_VALUES,SCATTER_REVERSE);CHKERRQ(ierr);
469a42bb27SBarry Smith   } else if (mode == INSERT_VALUES) {
47ba302962SPatrick 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");
48ba302962SPatrick 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");
49ba302962SPatrick 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");
50bd1fc5aeSBarry Smith     ierr = VecScatterBegin(dd->gtol,l,g,INSERT_VALUES,SCATTER_REVERSE_LOCAL);CHKERRQ(ierr);
51ce94432eSBarry Smith   } else SETERRQ(PetscObjectComm((PetscObject)da),PETSC_ERR_SUP,"Not yet implemented");
529a42bb27SBarry Smith   PetscFunctionReturn(0);
539a42bb27SBarry Smith }
549a42bb27SBarry Smith 
557087cfbeSBarry Smith PetscErrorCode  DMLocalToGlobalEnd_DA(DM da,Vec l,InsertMode mode,Vec g)
569a42bb27SBarry Smith {
579a42bb27SBarry Smith   PetscErrorCode ierr;
589a42bb27SBarry Smith   DM_DA          *dd = (DM_DA*)da->data;
599a42bb27SBarry Smith 
609a42bb27SBarry Smith   PetscFunctionBegin;
619a42bb27SBarry Smith   PetscValidHeaderSpecific(da,DM_CLASSID,1);
629a42bb27SBarry Smith   PetscValidHeaderSpecific(l,VEC_CLASSID,2);
639a42bb27SBarry Smith   PetscValidHeaderSpecific(g,VEC_CLASSID,3);
649a42bb27SBarry Smith   if (mode == ADD_VALUES) {
659a42bb27SBarry Smith     ierr = VecScatterEnd(dd->gtol,l,g,ADD_VALUES,SCATTER_REVERSE);CHKERRQ(ierr);
669a42bb27SBarry Smith   } else if (mode == INSERT_VALUES) {
67bd1fc5aeSBarry Smith     ierr = VecScatterEnd(dd->gtol,l,g,INSERT_VALUES,SCATTER_REVERSE_LOCAL);CHKERRQ(ierr);
68ce94432eSBarry Smith   } else SETERRQ(PetscObjectComm((PetscObject)da),PETSC_ERR_SUP,"Not yet implemented");
699a42bb27SBarry Smith   PetscFunctionReturn(0);
709a42bb27SBarry Smith }
719a42bb27SBarry Smith 
7209573ac7SBarry Smith extern PetscErrorCode DMDAGetNatural_Private(DM,PetscInt*,IS*);
7347c6ae99SBarry Smith /*
74aa219208SBarry Smith    DMDAGlobalToNatural_Create - Create the global to natural scatter object
7547c6ae99SBarry Smith 
76aa219208SBarry Smith    Collective on DMDA
7747c6ae99SBarry Smith 
7847c6ae99SBarry Smith    Input Parameter:
7947c6ae99SBarry Smith .  da - the distributed array context
8047c6ae99SBarry Smith 
8147c6ae99SBarry Smith    Level: developer
8247c6ae99SBarry Smith 
83aa219208SBarry Smith    Notes: This is an internal routine called by DMDAGlobalToNatural() to
8447c6ae99SBarry Smith      create the scatter context.
8547c6ae99SBarry Smith 
8647c6ae99SBarry Smith .keywords: distributed array, global to local, begin
8747c6ae99SBarry Smith 
88aa219208SBarry Smith .seealso: DMDAGlobalToNaturalBegin(), DMDAGlobalToNaturalEnd(), DMLocalToGlobalBegin(), DMDACreate2d(),
89aa219208SBarry Smith           DMGlobalToLocalBegin(), DMGlobalToLocalEnd(), DMDACreateNaturalVector()
9047c6ae99SBarry Smith */
91aa219208SBarry Smith PetscErrorCode DMDAGlobalToNatural_Create(DM da)
9247c6ae99SBarry Smith {
9347c6ae99SBarry Smith   PetscErrorCode ierr;
9447c6ae99SBarry Smith   PetscInt       m,start,Nlocal;
9547c6ae99SBarry Smith   IS             from,to;
9647c6ae99SBarry Smith   Vec            global;
9747c6ae99SBarry Smith   DM_DA          *dd = (DM_DA*)da->data;
9847c6ae99SBarry Smith 
9947c6ae99SBarry Smith   PetscFunctionBegin;
10047c6ae99SBarry Smith   PetscValidHeaderSpecific(da,DM_CLASSID,1);
101ce94432eSBarry Smith   if (!dd->natural) SETERRQ(PetscObjectComm((PetscObject)da),PETSC_ERR_ORDER,"Natural layout vector not yet created; cannot scatter into it");
10247c6ae99SBarry Smith 
10347c6ae99SBarry Smith   /* create the scatter context */
10447c6ae99SBarry Smith   ierr = VecGetLocalSize(dd->natural,&m);CHKERRQ(ierr);
1050298fd71SBarry Smith   ierr = VecGetOwnershipRange(dd->natural,&start,NULL);CHKERRQ(ierr);
10647c6ae99SBarry Smith 
107aa219208SBarry Smith   ierr = DMDAGetNatural_Private(da,&Nlocal,&to);CHKERRQ(ierr);
10847c6ae99SBarry Smith   if (Nlocal != m) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Internal error: Nlocal %D local vector size %D",Nlocal,m);
109ce94432eSBarry Smith   ierr = ISCreateStride(PetscObjectComm((PetscObject)da),m,start,1,&from);CHKERRQ(ierr);
110ce94432eSBarry Smith   ierr = VecCreateMPIWithArray(PetscObjectComm((PetscObject)da),dd->w,dd->Nlocal,PETSC_DETERMINE,0,&global);CHKERRQ(ierr);
11147c6ae99SBarry Smith   ierr = VecScatterCreate(global,from,dd->natural,to,&dd->gton);CHKERRQ(ierr);
112fcfd50ebSBarry Smith   ierr = VecDestroy(&global);CHKERRQ(ierr);
113fcfd50ebSBarry Smith   ierr = ISDestroy(&from);CHKERRQ(ierr);
114fcfd50ebSBarry Smith   ierr = ISDestroy(&to);CHKERRQ(ierr);
11547c6ae99SBarry Smith   PetscFunctionReturn(0);
11647c6ae99SBarry Smith }
11747c6ae99SBarry Smith 
11847c6ae99SBarry Smith /*@
119aa219208SBarry Smith    DMDAGlobalToNaturalBegin - Maps values from the global vector to a global vector
12047c6ae99SBarry Smith    in the "natural" grid ordering. Must be followed by
121aa219208SBarry Smith    DMDAGlobalToNaturalEnd() to complete the exchange.
12247c6ae99SBarry Smith 
123aa219208SBarry Smith    Neighbor-wise Collective on DMDA
12447c6ae99SBarry Smith 
12547c6ae99SBarry Smith    Input Parameters:
12647c6ae99SBarry Smith +  da - the distributed array context
12747c6ae99SBarry Smith .  g - the global vector
12847c6ae99SBarry Smith -  mode - one of INSERT_VALUES or ADD_VALUES
12947c6ae99SBarry Smith 
13047c6ae99SBarry Smith    Output Parameter:
13147c6ae99SBarry Smith .  l  - the natural ordering values
13247c6ae99SBarry Smith 
13347c6ae99SBarry Smith    Level: advanced
13447c6ae99SBarry Smith 
13547c6ae99SBarry Smith    Notes:
13647c6ae99SBarry Smith    The global and natrual vectors used here need not be the same as those
137aa219208SBarry Smith    obtained from DMCreateGlobalVector() and DMDACreateNaturalVector(), BUT they
13847c6ae99SBarry Smith    must have the same parallel data layout; they could, for example, be
139aa219208SBarry Smith    obtained with VecDuplicate() from the DMDA originating vectors.
14047c6ae99SBarry Smith 
141aa219208SBarry Smith    You must call DMDACreateNaturalVector() before using this routine
14247c6ae99SBarry Smith 
14347c6ae99SBarry Smith .keywords: distributed array, global to local, begin
14447c6ae99SBarry Smith 
145aa219208SBarry Smith .seealso: DMDAGlobalToNaturalEnd(), DMLocalToGlobalBegin(), DMDACreate2d(),
146aa219208SBarry Smith           DMGlobalToLocalBegin(), DMGlobalToLocalEnd(), DMDACreateNaturalVector()
1479a42bb27SBarry Smith 
14847c6ae99SBarry Smith @*/
1497087cfbeSBarry Smith PetscErrorCode  DMDAGlobalToNaturalBegin(DM da,Vec g,InsertMode mode,Vec l)
15047c6ae99SBarry Smith {
15147c6ae99SBarry Smith   PetscErrorCode ierr;
15247c6ae99SBarry Smith   DM_DA          *dd = (DM_DA*)da->data;
15347c6ae99SBarry Smith 
15447c6ae99SBarry Smith   PetscFunctionBegin;
15547c6ae99SBarry Smith   PetscValidHeaderSpecific(da,DM_CLASSID,1);
15647c6ae99SBarry Smith   PetscValidHeaderSpecific(l,VEC_CLASSID,2);
15747c6ae99SBarry Smith   PetscValidHeaderSpecific(g,VEC_CLASSID,4);
15847c6ae99SBarry Smith   if (!dd->gton) {
15947c6ae99SBarry Smith     /* create the scatter context */
160aa219208SBarry Smith     ierr = DMDAGlobalToNatural_Create(da);CHKERRQ(ierr);
16147c6ae99SBarry Smith   }
16247c6ae99SBarry Smith   ierr = VecScatterBegin(dd->gton,g,l,mode,SCATTER_FORWARD);CHKERRQ(ierr);
16347c6ae99SBarry Smith   PetscFunctionReturn(0);
16447c6ae99SBarry Smith }
16547c6ae99SBarry Smith 
16647c6ae99SBarry Smith /*@
167aa219208SBarry Smith    DMDAGlobalToNaturalEnd - Maps values from the global vector to a global vector
168aa219208SBarry Smith    in the natural ordering. Must be preceeded by DMDAGlobalToNaturalBegin().
16947c6ae99SBarry Smith 
170aa219208SBarry Smith    Neighbor-wise Collective on DMDA
17147c6ae99SBarry Smith 
17247c6ae99SBarry Smith    Input Parameters:
17347c6ae99SBarry Smith +  da - the distributed array context
17447c6ae99SBarry Smith .  g - the global vector
17547c6ae99SBarry Smith -  mode - one of INSERT_VALUES or ADD_VALUES
17647c6ae99SBarry Smith 
17747c6ae99SBarry Smith    Output Parameter:
17847c6ae99SBarry Smith .  l  - the global values in the natural ordering
17947c6ae99SBarry Smith 
18047c6ae99SBarry Smith    Level: advanced
18147c6ae99SBarry Smith 
18247c6ae99SBarry Smith    Notes:
18347c6ae99SBarry Smith    The global and local vectors used here need not be the same as those
184aa219208SBarry Smith    obtained from DMCreateGlobalVector() and DMDACreateNaturalVector(), BUT they
18547c6ae99SBarry Smith    must have the same parallel data layout; they could, for example, be
186aa219208SBarry Smith    obtained with VecDuplicate() from the DMDA originating vectors.
18747c6ae99SBarry Smith 
18847c6ae99SBarry Smith .keywords: distributed array, global to local, end
18947c6ae99SBarry Smith 
190aa219208SBarry Smith .seealso: DMDAGlobalToNaturalBegin(), DMLocalToGlobalBegin(), DMDACreate2d(),
191aa219208SBarry Smith           DMGlobalToLocalBegin(), DMGlobalToLocalEnd(), DMDACreateNaturalVector()
1929a42bb27SBarry Smith 
19347c6ae99SBarry Smith @*/
1947087cfbeSBarry Smith PetscErrorCode  DMDAGlobalToNaturalEnd(DM da,Vec g,InsertMode mode,Vec l)
19547c6ae99SBarry Smith {
19647c6ae99SBarry Smith   PetscErrorCode ierr;
19747c6ae99SBarry Smith   DM_DA          *dd = (DM_DA*)da->data;
19847c6ae99SBarry Smith 
19947c6ae99SBarry Smith   PetscFunctionBegin;
20047c6ae99SBarry Smith   PetscValidHeaderSpecific(da,DM_CLASSID,1);
20147c6ae99SBarry Smith   PetscValidHeaderSpecific(l,VEC_CLASSID,2);
20247c6ae99SBarry Smith   PetscValidHeaderSpecific(g,VEC_CLASSID,4);
20347c6ae99SBarry Smith   ierr = VecScatterEnd(dd->gton,g,l,mode,SCATTER_FORWARD);CHKERRQ(ierr);
20447c6ae99SBarry Smith   PetscFunctionReturn(0);
20547c6ae99SBarry Smith }
20647c6ae99SBarry Smith 
20747c6ae99SBarry Smith /*@
208aa219208SBarry Smith    DMDANaturalToGlobalBegin - Maps values from a global vector in the "natural" ordering
209aa219208SBarry Smith    to a global vector in the PETSc DMDA grid ordering. Must be followed by
210aa219208SBarry Smith    DMDANaturalToGlobalEnd() to complete the exchange.
21147c6ae99SBarry Smith 
212aa219208SBarry Smith    Neighbor-wise Collective on DMDA
21347c6ae99SBarry Smith 
21447c6ae99SBarry Smith    Input Parameters:
21547c6ae99SBarry Smith +  da - the distributed array context
21647c6ae99SBarry Smith .  g - the global vector in a natural ordering
21747c6ae99SBarry Smith -  mode - one of INSERT_VALUES or ADD_VALUES
21847c6ae99SBarry Smith 
21947c6ae99SBarry Smith    Output Parameter:
220aa219208SBarry Smith .  l  - the values in the DMDA ordering
22147c6ae99SBarry Smith 
22247c6ae99SBarry Smith    Level: advanced
22347c6ae99SBarry Smith 
22447c6ae99SBarry Smith    Notes:
22547c6ae99SBarry Smith    The global and natural vectors used here need not be the same as those
226aa219208SBarry Smith    obtained from DMCreateGlobalVector() and DMDACreateNaturalVector(), BUT they
22747c6ae99SBarry Smith    must have the same parallel data layout; they could, for example, be
228aa219208SBarry Smith    obtained with VecDuplicate() from the DMDA originating vectors.
22947c6ae99SBarry Smith 
23047c6ae99SBarry Smith .keywords: distributed array, global to local, begin
23147c6ae99SBarry Smith 
232aa219208SBarry Smith .seealso: DMDAGlobalToNaturalEnd(), DMDAGlobalToNaturalBegin(), DMLocalToGlobalBegin(), DMDACreate2d(),
233aa219208SBarry Smith           DMGlobalToLocalBegin(), DMGlobalToLocalEnd(), DMDACreateNaturalVector()
23447c6ae99SBarry Smith 
23547c6ae99SBarry Smith @*/
2367087cfbeSBarry Smith PetscErrorCode  DMDANaturalToGlobalBegin(DM da,Vec g,InsertMode mode,Vec l)
23747c6ae99SBarry Smith {
23847c6ae99SBarry Smith   PetscErrorCode ierr;
23947c6ae99SBarry Smith   DM_DA          *dd = (DM_DA*)da->data;
24047c6ae99SBarry Smith 
24147c6ae99SBarry Smith   PetscFunctionBegin;
24247c6ae99SBarry Smith   PetscValidHeaderSpecific(da,DM_CLASSID,1);
24347c6ae99SBarry Smith   PetscValidHeaderSpecific(l,VEC_CLASSID,2);
24447c6ae99SBarry Smith   PetscValidHeaderSpecific(g,VEC_CLASSID,4);
24547c6ae99SBarry Smith   if (!dd->gton) {
24647c6ae99SBarry Smith     /* create the scatter context */
247aa219208SBarry Smith     ierr = DMDAGlobalToNatural_Create(da);CHKERRQ(ierr);
24847c6ae99SBarry Smith   }
24947c6ae99SBarry Smith   ierr = VecScatterBegin(dd->gton,g,l,mode,SCATTER_REVERSE);CHKERRQ(ierr);
25047c6ae99SBarry Smith   PetscFunctionReturn(0);
25147c6ae99SBarry Smith }
25247c6ae99SBarry Smith 
25347c6ae99SBarry Smith /*@
254aa219208SBarry Smith    DMDANaturalToGlobalEnd - Maps values from the natural ordering global vector
255aa219208SBarry Smith    to a global vector in the PETSc DMDA ordering. Must be preceeded by DMDANaturalToGlobalBegin().
25647c6ae99SBarry Smith 
257aa219208SBarry Smith    Neighbor-wise Collective on DMDA
25847c6ae99SBarry Smith 
25947c6ae99SBarry Smith    Input Parameters:
26047c6ae99SBarry Smith +  da - the distributed array context
26147c6ae99SBarry Smith .  g - the global vector in a natural ordering
26247c6ae99SBarry Smith -  mode - one of INSERT_VALUES or ADD_VALUES
26347c6ae99SBarry Smith 
26447c6ae99SBarry Smith    Output Parameter:
265aa219208SBarry Smith .  l  - the global values in the PETSc DMDA ordering
26647c6ae99SBarry Smith 
267*a47bb602SJed Brown    Level: advanced
26847c6ae99SBarry Smith 
26947c6ae99SBarry Smith    Notes:
27047c6ae99SBarry Smith    The global and local vectors used here need not be the same as those
271aa219208SBarry Smith    obtained from DMCreateGlobalVector() and DMDACreateNaturalVector(), BUT they
27247c6ae99SBarry Smith    must have the same parallel data layout; they could, for example, be
273aa219208SBarry Smith    obtained with VecDuplicate() from the DMDA originating vectors.
27447c6ae99SBarry Smith 
27547c6ae99SBarry Smith .keywords: distributed array, global to local, end
27647c6ae99SBarry Smith 
277aa219208SBarry Smith .seealso: DMDAGlobalToNaturalBegin(), DMDAGlobalToNaturalEnd(), DMLocalToGlobalBegin(), DMDACreate2d(),
278aa219208SBarry Smith           DMGlobalToLocalBegin(), DMGlobalToLocalEnd(), DMDACreateNaturalVector()
27947c6ae99SBarry Smith 
28047c6ae99SBarry Smith @*/
2817087cfbeSBarry Smith PetscErrorCode  DMDANaturalToGlobalEnd(DM da,Vec g,InsertMode mode,Vec l)
28247c6ae99SBarry Smith {
28347c6ae99SBarry Smith   PetscErrorCode ierr;
28447c6ae99SBarry Smith   DM_DA          *dd = (DM_DA*)da->data;
28547c6ae99SBarry Smith 
28647c6ae99SBarry Smith   PetscFunctionBegin;
28747c6ae99SBarry Smith   PetscValidHeaderSpecific(da,DM_CLASSID,1);
28847c6ae99SBarry Smith   PetscValidHeaderSpecific(l,VEC_CLASSID,2);
28947c6ae99SBarry Smith   PetscValidHeaderSpecific(g,VEC_CLASSID,4);
29047c6ae99SBarry Smith   ierr = VecScatterEnd(dd->gton,g,l,mode,SCATTER_REVERSE);CHKERRQ(ierr);
29147c6ae99SBarry Smith   PetscFunctionReturn(0);
29247c6ae99SBarry Smith }
29347c6ae99SBarry Smith 
294