xref: /petsc/src/dm/impls/da/dagtol.c (revision b45d2f2cb7e031d9c0de5873eca80614ca7b863b)
147c6ae99SBarry Smith 
247c6ae99SBarry Smith /*
347c6ae99SBarry Smith   Code for manipulating distributed regular arrays in parallel.
447c6ae99SBarry Smith */
547c6ae99SBarry Smith 
6*b45d2f2cSJed Brown #include <petsc-private/daimpl.h>    /*I   "petscdmda.h"   I*/
747c6ae99SBarry Smith 
847c6ae99SBarry Smith #undef __FUNCT__
99a42bb27SBarry Smith #define __FUNCT__ "DMGlobalToLocalBegin_DA"
107087cfbeSBarry Smith PetscErrorCode  DMGlobalToLocalBegin_DA(DM da,Vec g,InsertMode mode,Vec l)
1147c6ae99SBarry Smith {
1247c6ae99SBarry Smith   PetscErrorCode ierr;
1347c6ae99SBarry Smith   DM_DA          *dd = (DM_DA*)da->data;
1447c6ae99SBarry Smith 
1547c6ae99SBarry Smith   PetscFunctionBegin;
1647c6ae99SBarry Smith   PetscValidHeaderSpecific(da,DM_CLASSID,1);
1747c6ae99SBarry Smith   PetscValidHeaderSpecific(g,VEC_CLASSID,2);
1847c6ae99SBarry Smith   PetscValidHeaderSpecific(l,VEC_CLASSID,4);
1947c6ae99SBarry Smith   ierr = VecScatterBegin(dd->gtol,g,l,mode,SCATTER_FORWARD);CHKERRQ(ierr);
2047c6ae99SBarry Smith   PetscFunctionReturn(0);
2147c6ae99SBarry Smith }
2247c6ae99SBarry Smith 
2347c6ae99SBarry Smith 
2447c6ae99SBarry Smith #undef __FUNCT__
259a42bb27SBarry Smith #define __FUNCT__ "DMGlobalToLocalEnd_DA"
267087cfbeSBarry Smith PetscErrorCode  DMGlobalToLocalEnd_DA(DM da,Vec g,InsertMode mode,Vec l)
2747c6ae99SBarry Smith {
2847c6ae99SBarry Smith   PetscErrorCode ierr;
2947c6ae99SBarry Smith   DM_DA          *dd = (DM_DA*)da->data;
3047c6ae99SBarry Smith 
3147c6ae99SBarry Smith   PetscFunctionBegin;
3247c6ae99SBarry Smith   PetscValidHeaderSpecific(da,DM_CLASSID,1);
3347c6ae99SBarry Smith   PetscValidHeaderSpecific(g,VEC_CLASSID,2);
3447c6ae99SBarry Smith   PetscValidHeaderSpecific(l,VEC_CLASSID,4);
3547c6ae99SBarry Smith   ierr = VecScatterEnd(dd->gtol,g,l,mode,SCATTER_FORWARD);CHKERRQ(ierr);
3647c6ae99SBarry Smith   PetscFunctionReturn(0);
3747c6ae99SBarry Smith }
3847c6ae99SBarry Smith 
399a42bb27SBarry Smith #undef __FUNCT__
409a42bb27SBarry Smith #define __FUNCT__ "DMLocalToGlobalBegin_DA"
417087cfbeSBarry Smith PetscErrorCode  DMLocalToGlobalBegin_DA(DM da,Vec l,InsertMode mode,Vec g)
429a42bb27SBarry Smith {
439a42bb27SBarry Smith   PetscErrorCode ierr;
449a42bb27SBarry Smith   DM_DA          *dd = (DM_DA*)da->data;
459a42bb27SBarry Smith 
469a42bb27SBarry Smith   PetscFunctionBegin;
479a42bb27SBarry Smith   PetscValidHeaderSpecific(da,DM_CLASSID,1);
489a42bb27SBarry Smith   PetscValidHeaderSpecific(l,VEC_CLASSID,2);
499a42bb27SBarry Smith   PetscValidHeaderSpecific(g,VEC_CLASSID,3);
509a42bb27SBarry Smith   if (mode == ADD_VALUES) {
519a42bb27SBarry Smith     ierr = VecScatterBegin(dd->gtol,l,g,ADD_VALUES,SCATTER_REVERSE);CHKERRQ(ierr);
529a42bb27SBarry Smith   } else if (mode == INSERT_VALUES) {
539a42bb27SBarry Smith     ierr = VecScatterBegin(dd->ltog,l,g,mode,SCATTER_FORWARD);CHKERRQ(ierr);
549a42bb27SBarry Smith   } else SETERRQ(((PetscObject)da)->comm,PETSC_ERR_SUP,"Not yet implemented");
559a42bb27SBarry Smith   PetscFunctionReturn(0);
569a42bb27SBarry Smith }
579a42bb27SBarry Smith 
589a42bb27SBarry Smith #undef __FUNCT__
599a42bb27SBarry Smith #define __FUNCT__ "DMLocalToGlobalEnd_DA"
607087cfbeSBarry Smith PetscErrorCode  DMLocalToGlobalEnd_DA(DM da,Vec l,InsertMode mode,Vec g)
619a42bb27SBarry Smith {
629a42bb27SBarry Smith   PetscErrorCode ierr;
639a42bb27SBarry Smith   DM_DA          *dd = (DM_DA*)da->data;
649a42bb27SBarry Smith 
659a42bb27SBarry Smith   PetscFunctionBegin;
669a42bb27SBarry Smith   PetscValidHeaderSpecific(da,DM_CLASSID,1);
679a42bb27SBarry Smith   PetscValidHeaderSpecific(l,VEC_CLASSID,2);
689a42bb27SBarry Smith   PetscValidHeaderSpecific(g,VEC_CLASSID,3);
699a42bb27SBarry Smith   if (mode == ADD_VALUES) {
709a42bb27SBarry Smith     ierr = VecScatterEnd(dd->gtol,l,g,ADD_VALUES,SCATTER_REVERSE);CHKERRQ(ierr);
719a42bb27SBarry Smith   } else if (mode == INSERT_VALUES) {
729a42bb27SBarry Smith     ierr = VecScatterEnd(dd->ltog,l,g,mode,SCATTER_FORWARD);CHKERRQ(ierr);
739a42bb27SBarry Smith   } else SETERRQ(((PetscObject)da)->comm,PETSC_ERR_SUP,"Not yet implemented");
749a42bb27SBarry Smith   PetscFunctionReturn(0);
759a42bb27SBarry Smith }
769a42bb27SBarry Smith 
7709573ac7SBarry Smith extern PetscErrorCode DMDAGetNatural_Private(DM,PetscInt*,IS*);
7847c6ae99SBarry Smith #undef __FUNCT__
79aa219208SBarry Smith #define __FUNCT__ "DMDAGlobalToNatural_Create"
8047c6ae99SBarry Smith /*
81aa219208SBarry Smith    DMDAGlobalToNatural_Create - Create the global to natural scatter object
8247c6ae99SBarry Smith 
83aa219208SBarry Smith    Collective on DMDA
8447c6ae99SBarry Smith 
8547c6ae99SBarry Smith    Input Parameter:
8647c6ae99SBarry Smith .  da - the distributed array context
8747c6ae99SBarry Smith 
8847c6ae99SBarry Smith    Level: developer
8947c6ae99SBarry Smith 
90aa219208SBarry Smith    Notes: This is an internal routine called by DMDAGlobalToNatural() to
9147c6ae99SBarry Smith      create the scatter context.
9247c6ae99SBarry Smith 
9347c6ae99SBarry Smith .keywords: distributed array, global to local, begin
9447c6ae99SBarry Smith 
95aa219208SBarry Smith .seealso: DMDAGlobalToNaturalBegin(), DMDAGlobalToNaturalEnd(), DMLocalToGlobalBegin(), DMDACreate2d(),
96aa219208SBarry Smith           DMGlobalToLocalBegin(), DMGlobalToLocalEnd(), DMDACreateNaturalVector()
9747c6ae99SBarry Smith */
98aa219208SBarry Smith PetscErrorCode DMDAGlobalToNatural_Create(DM da)
9947c6ae99SBarry Smith {
10047c6ae99SBarry Smith   PetscErrorCode ierr;
10147c6ae99SBarry Smith   PetscInt       m,start,Nlocal;
10247c6ae99SBarry Smith   IS             from,to;
10347c6ae99SBarry Smith   Vec            global;
10447c6ae99SBarry Smith   DM_DA          *dd = (DM_DA*)da->data;
10547c6ae99SBarry Smith 
10647c6ae99SBarry Smith   PetscFunctionBegin;
10747c6ae99SBarry Smith   PetscValidHeaderSpecific(da,DM_CLASSID,1);
10847c6ae99SBarry Smith   if (!dd->natural) {
10947c6ae99SBarry Smith     SETERRQ(((PetscObject)da)->comm,PETSC_ERR_ORDER,"Natural layout vector not yet created; cannot scatter into it");
11047c6ae99SBarry Smith   }
11147c6ae99SBarry Smith 
11247c6ae99SBarry Smith   /* create the scatter context */
11347c6ae99SBarry Smith   ierr = VecGetLocalSize(dd->natural,&m);CHKERRQ(ierr);
11447c6ae99SBarry Smith   ierr = VecGetOwnershipRange(dd->natural,&start,PETSC_NULL);CHKERRQ(ierr);
11547c6ae99SBarry Smith 
116aa219208SBarry Smith   ierr = DMDAGetNatural_Private(da,&Nlocal,&to);CHKERRQ(ierr);
11747c6ae99SBarry Smith   if (Nlocal != m) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Internal error: Nlocal %D local vector size %D",Nlocal,m);
11847c6ae99SBarry Smith   ierr = ISCreateStride(((PetscObject)da)->comm,m,start,1,&from);CHKERRQ(ierr);
11947c6ae99SBarry Smith   ierr = VecCreateMPIWithArray(((PetscObject)da)->comm,dd->Nlocal,PETSC_DETERMINE,0,&global);
12047c6ae99SBarry Smith   ierr = VecSetBlockSize(global,dd->w);CHKERRQ(ierr);
12147c6ae99SBarry Smith   ierr = VecScatterCreate(global,from,dd->natural,to,&dd->gton);CHKERRQ(ierr);
122fcfd50ebSBarry Smith   ierr = VecDestroy(&global);CHKERRQ(ierr);
123fcfd50ebSBarry Smith   ierr = ISDestroy(&from);CHKERRQ(ierr);
124fcfd50ebSBarry Smith   ierr = ISDestroy(&to);CHKERRQ(ierr);
12547c6ae99SBarry Smith   PetscFunctionReturn(0);
12647c6ae99SBarry Smith }
12747c6ae99SBarry Smith 
12847c6ae99SBarry Smith #undef __FUNCT__
129aa219208SBarry Smith #define __FUNCT__ "DMDAGlobalToNaturalBegin"
13047c6ae99SBarry Smith /*@
131aa219208SBarry Smith    DMDAGlobalToNaturalBegin - Maps values from the global vector to a global vector
13247c6ae99SBarry Smith    in the "natural" grid ordering. Must be followed by
133aa219208SBarry Smith    DMDAGlobalToNaturalEnd() to complete the exchange.
13447c6ae99SBarry Smith 
135aa219208SBarry Smith    Neighbor-wise Collective on DMDA
13647c6ae99SBarry Smith 
13747c6ae99SBarry Smith    Input Parameters:
13847c6ae99SBarry Smith +  da - the distributed array context
13947c6ae99SBarry Smith .  g - the global vector
14047c6ae99SBarry Smith -  mode - one of INSERT_VALUES or ADD_VALUES
14147c6ae99SBarry Smith 
14247c6ae99SBarry Smith    Output Parameter:
14347c6ae99SBarry Smith .  l  - the natural ordering values
14447c6ae99SBarry Smith 
14547c6ae99SBarry Smith    Level: advanced
14647c6ae99SBarry Smith 
14747c6ae99SBarry Smith    Notes:
14847c6ae99SBarry Smith    The global and natrual vectors used here need not be the same as those
149aa219208SBarry Smith    obtained from DMCreateGlobalVector() and DMDACreateNaturalVector(), BUT they
15047c6ae99SBarry Smith    must have the same parallel data layout; they could, for example, be
151aa219208SBarry Smith    obtained with VecDuplicate() from the DMDA originating vectors.
15247c6ae99SBarry Smith 
153aa219208SBarry Smith    You must call DMDACreateNaturalVector() before using this routine
15447c6ae99SBarry Smith 
15547c6ae99SBarry Smith .keywords: distributed array, global to local, begin
15647c6ae99SBarry Smith 
157aa219208SBarry Smith .seealso: DMDAGlobalToNaturalEnd(), DMLocalToGlobalBegin(), DMDACreate2d(),
158aa219208SBarry Smith           DMGlobalToLocalBegin(), DMGlobalToLocalEnd(), DMDACreateNaturalVector()
1599a42bb27SBarry Smith 
16047c6ae99SBarry Smith @*/
1617087cfbeSBarry Smith PetscErrorCode  DMDAGlobalToNaturalBegin(DM da,Vec g,InsertMode mode,Vec l)
16247c6ae99SBarry Smith {
16347c6ae99SBarry Smith   PetscErrorCode ierr;
16447c6ae99SBarry Smith   DM_DA          *dd = (DM_DA*)da->data;
16547c6ae99SBarry Smith 
16647c6ae99SBarry Smith   PetscFunctionBegin;
16747c6ae99SBarry Smith   PetscValidHeaderSpecific(da,DM_CLASSID,1);
16847c6ae99SBarry Smith   PetscValidHeaderSpecific(l,VEC_CLASSID,2);
16947c6ae99SBarry Smith   PetscValidHeaderSpecific(g,VEC_CLASSID,4);
17047c6ae99SBarry Smith   if (!dd->gton) {
17147c6ae99SBarry Smith     /* create the scatter context */
172aa219208SBarry Smith     ierr = DMDAGlobalToNatural_Create(da);CHKERRQ(ierr);
17347c6ae99SBarry Smith   }
17447c6ae99SBarry Smith   ierr = VecScatterBegin(dd->gton,g,l,mode,SCATTER_FORWARD);CHKERRQ(ierr);
17547c6ae99SBarry Smith   PetscFunctionReturn(0);
17647c6ae99SBarry Smith }
17747c6ae99SBarry Smith 
17847c6ae99SBarry Smith #undef __FUNCT__
179aa219208SBarry Smith #define __FUNCT__ "DMDAGlobalToNaturalEnd"
18047c6ae99SBarry Smith /*@
181aa219208SBarry Smith    DMDAGlobalToNaturalEnd - Maps values from the global vector to a global vector
182aa219208SBarry Smith    in the natural ordering. Must be preceeded by DMDAGlobalToNaturalBegin().
18347c6ae99SBarry Smith 
184aa219208SBarry Smith    Neighbor-wise Collective on DMDA
18547c6ae99SBarry Smith 
18647c6ae99SBarry Smith    Input Parameters:
18747c6ae99SBarry Smith +  da - the distributed array context
18847c6ae99SBarry Smith .  g - the global vector
18947c6ae99SBarry Smith -  mode - one of INSERT_VALUES or ADD_VALUES
19047c6ae99SBarry Smith 
19147c6ae99SBarry Smith    Output Parameter:
19247c6ae99SBarry Smith .  l  - the global values in the natural ordering
19347c6ae99SBarry Smith 
19447c6ae99SBarry Smith    Level: advanced
19547c6ae99SBarry Smith 
19647c6ae99SBarry Smith    Notes:
19747c6ae99SBarry Smith    The global and local vectors used here need not be the same as those
198aa219208SBarry Smith    obtained from DMCreateGlobalVector() and DMDACreateNaturalVector(), BUT they
19947c6ae99SBarry Smith    must have the same parallel data layout; they could, for example, be
200aa219208SBarry Smith    obtained with VecDuplicate() from the DMDA originating vectors.
20147c6ae99SBarry Smith 
20247c6ae99SBarry Smith .keywords: distributed array, global to local, end
20347c6ae99SBarry Smith 
204aa219208SBarry Smith .seealso: DMDAGlobalToNaturalBegin(), DMLocalToGlobalBegin(), DMDACreate2d(),
205aa219208SBarry Smith           DMGlobalToLocalBegin(), DMGlobalToLocalEnd(), DMDACreateNaturalVector()
2069a42bb27SBarry Smith 
20747c6ae99SBarry Smith @*/
2087087cfbeSBarry Smith PetscErrorCode  DMDAGlobalToNaturalEnd(DM da,Vec g,InsertMode mode,Vec l)
20947c6ae99SBarry Smith {
21047c6ae99SBarry Smith   PetscErrorCode ierr;
21147c6ae99SBarry Smith   DM_DA          *dd = (DM_DA*)da->data;
21247c6ae99SBarry Smith 
21347c6ae99SBarry Smith   PetscFunctionBegin;
21447c6ae99SBarry Smith   PetscValidHeaderSpecific(da,DM_CLASSID,1);
21547c6ae99SBarry Smith   PetscValidHeaderSpecific(l,VEC_CLASSID,2);
21647c6ae99SBarry Smith   PetscValidHeaderSpecific(g,VEC_CLASSID,4);
21747c6ae99SBarry Smith   ierr = VecScatterEnd(dd->gton,g,l,mode,SCATTER_FORWARD);CHKERRQ(ierr);
21847c6ae99SBarry Smith   PetscFunctionReturn(0);
21947c6ae99SBarry Smith }
22047c6ae99SBarry Smith 
22147c6ae99SBarry Smith #undef __FUNCT__
222aa219208SBarry Smith #define __FUNCT__ "DMDANaturalToGlobalBegin"
22347c6ae99SBarry Smith /*@
224aa219208SBarry Smith    DMDANaturalToGlobalBegin - Maps values from a global vector in the "natural" ordering
225aa219208SBarry Smith    to a global vector in the PETSc DMDA grid ordering. Must be followed by
226aa219208SBarry Smith    DMDANaturalToGlobalEnd() to complete the exchange.
22747c6ae99SBarry Smith 
228aa219208SBarry Smith    Neighbor-wise Collective on DMDA
22947c6ae99SBarry Smith 
23047c6ae99SBarry Smith    Input Parameters:
23147c6ae99SBarry Smith +  da - the distributed array context
23247c6ae99SBarry Smith .  g - the global vector in a natural ordering
23347c6ae99SBarry Smith -  mode - one of INSERT_VALUES or ADD_VALUES
23447c6ae99SBarry Smith 
23547c6ae99SBarry Smith    Output Parameter:
236aa219208SBarry Smith .  l  - the values in the DMDA ordering
23747c6ae99SBarry Smith 
23847c6ae99SBarry Smith    Level: advanced
23947c6ae99SBarry Smith 
24047c6ae99SBarry Smith    Notes:
24147c6ae99SBarry Smith    The global and natural vectors used here need not be the same as those
242aa219208SBarry Smith    obtained from DMCreateGlobalVector() and DMDACreateNaturalVector(), BUT they
24347c6ae99SBarry Smith    must have the same parallel data layout; they could, for example, be
244aa219208SBarry Smith    obtained with VecDuplicate() from the DMDA originating vectors.
24547c6ae99SBarry Smith 
24647c6ae99SBarry Smith .keywords: distributed array, global to local, begin
24747c6ae99SBarry Smith 
248aa219208SBarry Smith .seealso: DMDAGlobalToNaturalEnd(), DMDAGlobalToNaturalBegin(), DMLocalToGlobalBegin(), DMDACreate2d(),
249aa219208SBarry Smith           DMGlobalToLocalBegin(), DMGlobalToLocalEnd(), DMDACreateNaturalVector()
25047c6ae99SBarry Smith 
25147c6ae99SBarry Smith @*/
2527087cfbeSBarry Smith PetscErrorCode  DMDANaturalToGlobalBegin(DM da,Vec g,InsertMode mode,Vec l)
25347c6ae99SBarry Smith {
25447c6ae99SBarry Smith   PetscErrorCode ierr;
25547c6ae99SBarry Smith   DM_DA          *dd = (DM_DA*)da->data;
25647c6ae99SBarry Smith 
25747c6ae99SBarry Smith   PetscFunctionBegin;
25847c6ae99SBarry Smith   PetscValidHeaderSpecific(da,DM_CLASSID,1);
25947c6ae99SBarry Smith   PetscValidHeaderSpecific(l,VEC_CLASSID,2);
26047c6ae99SBarry Smith   PetscValidHeaderSpecific(g,VEC_CLASSID,4);
26147c6ae99SBarry Smith   if (!dd->gton) {
26247c6ae99SBarry Smith     /* create the scatter context */
263aa219208SBarry Smith     ierr = DMDAGlobalToNatural_Create(da);CHKERRQ(ierr);
26447c6ae99SBarry Smith   }
26547c6ae99SBarry Smith   ierr = VecScatterBegin(dd->gton,g,l,mode,SCATTER_REVERSE);CHKERRQ(ierr);
26647c6ae99SBarry Smith   PetscFunctionReturn(0);
26747c6ae99SBarry Smith }
26847c6ae99SBarry Smith 
26947c6ae99SBarry Smith #undef __FUNCT__
270aa219208SBarry Smith #define __FUNCT__ "DMDANaturalToGlobalEnd"
27147c6ae99SBarry Smith /*@
272aa219208SBarry Smith    DMDANaturalToGlobalEnd - Maps values from the natural ordering global vector
273aa219208SBarry Smith    to a global vector in the PETSc DMDA ordering. Must be preceeded by DMDANaturalToGlobalBegin().
27447c6ae99SBarry Smith 
275aa219208SBarry Smith    Neighbor-wise Collective on DMDA
27647c6ae99SBarry Smith 
27747c6ae99SBarry Smith    Input Parameters:
27847c6ae99SBarry Smith +  da - the distributed array context
27947c6ae99SBarry Smith .  g - the global vector in a natural ordering
28047c6ae99SBarry Smith -  mode - one of INSERT_VALUES or ADD_VALUES
28147c6ae99SBarry Smith 
28247c6ae99SBarry Smith    Output Parameter:
283aa219208SBarry Smith .  l  - the global values in the PETSc DMDA ordering
28447c6ae99SBarry Smith 
28547c6ae99SBarry Smith    Level: intermediate
28647c6ae99SBarry Smith 
28747c6ae99SBarry Smith    Notes:
28847c6ae99SBarry Smith    The global and local vectors used here need not be the same as those
289aa219208SBarry Smith    obtained from DMCreateGlobalVector() and DMDACreateNaturalVector(), BUT they
29047c6ae99SBarry Smith    must have the same parallel data layout; they could, for example, be
291aa219208SBarry Smith    obtained with VecDuplicate() from the DMDA originating vectors.
29247c6ae99SBarry Smith 
29347c6ae99SBarry Smith .keywords: distributed array, global to local, end
29447c6ae99SBarry Smith 
295aa219208SBarry Smith .seealso: DMDAGlobalToNaturalBegin(), DMDAGlobalToNaturalEnd(), DMLocalToGlobalBegin(), DMDACreate2d(),
296aa219208SBarry Smith           DMGlobalToLocalBegin(), DMGlobalToLocalEnd(), DMDACreateNaturalVector()
29747c6ae99SBarry Smith 
29847c6ae99SBarry Smith @*/
2997087cfbeSBarry Smith PetscErrorCode  DMDANaturalToGlobalEnd(DM da,Vec g,InsertMode mode,Vec l)
30047c6ae99SBarry Smith {
30147c6ae99SBarry Smith   PetscErrorCode ierr;
30247c6ae99SBarry Smith   DM_DA          *dd = (DM_DA*)da->data;
30347c6ae99SBarry Smith 
30447c6ae99SBarry Smith   PetscFunctionBegin;
30547c6ae99SBarry Smith   PetscValidHeaderSpecific(da,DM_CLASSID,1);
30647c6ae99SBarry Smith   PetscValidHeaderSpecific(l,VEC_CLASSID,2);
30747c6ae99SBarry Smith   PetscValidHeaderSpecific(g,VEC_CLASSID,4);
30847c6ae99SBarry Smith   ierr = VecScatterEnd(dd->gton,g,l,mode,SCATTER_REVERSE);CHKERRQ(ierr);
30947c6ae99SBarry Smith   PetscFunctionReturn(0);
31047c6ae99SBarry Smith }
31147c6ae99SBarry Smith 
312