xref: /petsc/src/dm/impls/da/dagtol.c (revision 9a42bb27a39f0cdf3306a1e22d33cd9809484eaa)
147c6ae99SBarry Smith #define PETSCDM_DLL
247c6ae99SBarry Smith 
347c6ae99SBarry Smith /*
447c6ae99SBarry Smith   Code for manipulating distributed regular arrays in parallel.
547c6ae99SBarry Smith */
647c6ae99SBarry Smith 
747c6ae99SBarry Smith #include "private/daimpl.h"    /*I   "petscda.h"   I*/
847c6ae99SBarry Smith 
947c6ae99SBarry Smith #undef __FUNCT__
10*9a42bb27SBarry Smith #define __FUNCT__ "DMGlobalToLocalBegin_DA"
11*9a42bb27SBarry Smith PetscErrorCode PETSCDM_DLLEXPORT DMGlobalToLocalBegin_DA(DM da,Vec g,InsertMode mode,Vec l)
1247c6ae99SBarry Smith {
1347c6ae99SBarry Smith   PetscErrorCode ierr;
1447c6ae99SBarry Smith   DM_DA          *dd = (DM_DA*)da->data;
1547c6ae99SBarry Smith 
1647c6ae99SBarry Smith   PetscFunctionBegin;
1747c6ae99SBarry Smith   PetscValidHeaderSpecific(da,DM_CLASSID,1);
1847c6ae99SBarry Smith   PetscValidHeaderSpecific(g,VEC_CLASSID,2);
1947c6ae99SBarry Smith   PetscValidHeaderSpecific(l,VEC_CLASSID,4);
2047c6ae99SBarry Smith   ierr = VecScatterBegin(dd->gtol,g,l,mode,SCATTER_FORWARD);CHKERRQ(ierr);
2147c6ae99SBarry Smith   PetscFunctionReturn(0);
2247c6ae99SBarry Smith }
2347c6ae99SBarry Smith 
2447c6ae99SBarry Smith 
2547c6ae99SBarry Smith #undef __FUNCT__
26*9a42bb27SBarry Smith #define __FUNCT__ "DMGlobalToLocalEnd_DA"
27*9a42bb27SBarry Smith PetscErrorCode PETSCDM_DLLEXPORT DMGlobalToLocalEnd_DA(DM da,Vec g,InsertMode mode,Vec l)
2847c6ae99SBarry Smith {
2947c6ae99SBarry Smith   PetscErrorCode ierr;
3047c6ae99SBarry Smith   DM_DA          *dd = (DM_DA*)da->data;
3147c6ae99SBarry Smith 
3247c6ae99SBarry Smith   PetscFunctionBegin;
3347c6ae99SBarry Smith   PetscValidHeaderSpecific(da,DM_CLASSID,1);
3447c6ae99SBarry Smith   PetscValidHeaderSpecific(g,VEC_CLASSID,2);
3547c6ae99SBarry Smith   PetscValidHeaderSpecific(l,VEC_CLASSID,4);
3647c6ae99SBarry Smith   ierr = VecScatterEnd(dd->gtol,g,l,mode,SCATTER_FORWARD);CHKERRQ(ierr);
3747c6ae99SBarry Smith   PetscFunctionReturn(0);
3847c6ae99SBarry Smith }
3947c6ae99SBarry Smith 
40*9a42bb27SBarry Smith #undef __FUNCT__
41*9a42bb27SBarry Smith #define __FUNCT__ "DMLocalToGlobalBegin_DA"
42*9a42bb27SBarry Smith PetscErrorCode PETSCDM_DLLEXPORT DMLocalToGlobalBegin_DA(DM da,Vec l,InsertMode mode,Vec g)
43*9a42bb27SBarry Smith {
44*9a42bb27SBarry Smith   PetscErrorCode ierr;
45*9a42bb27SBarry Smith   DM_DA          *dd = (DM_DA*)da->data;
46*9a42bb27SBarry Smith 
47*9a42bb27SBarry Smith   PetscFunctionBegin;
48*9a42bb27SBarry Smith   PetscValidHeaderSpecific(da,DM_CLASSID,1);
49*9a42bb27SBarry Smith   PetscValidHeaderSpecific(l,VEC_CLASSID,2);
50*9a42bb27SBarry Smith   PetscValidHeaderSpecific(g,VEC_CLASSID,3);
51*9a42bb27SBarry Smith   if (mode == ADD_VALUES) {
52*9a42bb27SBarry Smith     ierr = VecScatterBegin(dd->gtol,l,g,ADD_VALUES,SCATTER_REVERSE);CHKERRQ(ierr);
53*9a42bb27SBarry Smith   } else if (mode == INSERT_VALUES) {
54*9a42bb27SBarry Smith     ierr = VecScatterBegin(dd->ltog,l,g,mode,SCATTER_FORWARD);CHKERRQ(ierr);
55*9a42bb27SBarry Smith   } else SETERRQ(((PetscObject)da)->comm,PETSC_ERR_SUP,"Not yet implemented");
56*9a42bb27SBarry Smith   PetscFunctionReturn(0);
57*9a42bb27SBarry Smith }
58*9a42bb27SBarry Smith 
59*9a42bb27SBarry Smith #undef __FUNCT__
60*9a42bb27SBarry Smith #define __FUNCT__ "DMLocalToGlobalEnd_DA"
61*9a42bb27SBarry Smith PetscErrorCode PETSCDM_DLLEXPORT DMLocalToGlobalEnd_DA(DM da,Vec l,InsertMode mode,Vec g)
62*9a42bb27SBarry Smith {
63*9a42bb27SBarry Smith   PetscErrorCode ierr;
64*9a42bb27SBarry Smith   DM_DA          *dd = (DM_DA*)da->data;
65*9a42bb27SBarry Smith 
66*9a42bb27SBarry Smith   PetscFunctionBegin;
67*9a42bb27SBarry Smith   PetscValidHeaderSpecific(da,DM_CLASSID,1);
68*9a42bb27SBarry Smith   PetscValidHeaderSpecific(l,VEC_CLASSID,2);
69*9a42bb27SBarry Smith   PetscValidHeaderSpecific(g,VEC_CLASSID,3);
70*9a42bb27SBarry Smith   if (mode == ADD_VALUES) {
71*9a42bb27SBarry Smith     ierr = VecScatterEnd(dd->gtol,l,g,ADD_VALUES,SCATTER_REVERSE);CHKERRQ(ierr);
72*9a42bb27SBarry Smith   } else if (mode == INSERT_VALUES) {
73*9a42bb27SBarry Smith     ierr = VecScatterEnd(dd->ltog,l,g,mode,SCATTER_FORWARD);CHKERRQ(ierr);
74*9a42bb27SBarry Smith   } else SETERRQ(((PetscObject)da)->comm,PETSC_ERR_SUP,"Not yet implemented");
75*9a42bb27SBarry Smith   PetscFunctionReturn(0);
76*9a42bb27SBarry Smith }
77*9a42bb27SBarry Smith 
78*9a42bb27SBarry Smith EXTERN PetscErrorCode DAGetNatural_Private(DM,PetscInt*,IS*);
7947c6ae99SBarry Smith #undef __FUNCT__
8047c6ae99SBarry Smith #define __FUNCT__ "DAGlobalToNatural_Create"
8147c6ae99SBarry Smith /*
8247c6ae99SBarry Smith    DAGlobalToNatural_Create - Create the global to natural scatter object
8347c6ae99SBarry Smith 
8447c6ae99SBarry Smith    Collective on DA
8547c6ae99SBarry Smith 
8647c6ae99SBarry Smith    Input Parameter:
8747c6ae99SBarry Smith .  da - the distributed array context
8847c6ae99SBarry Smith 
8947c6ae99SBarry Smith    Level: developer
9047c6ae99SBarry Smith 
9147c6ae99SBarry Smith    Notes: This is an internal routine called by DAGlobalToNatural() to
9247c6ae99SBarry Smith      create the scatter context.
9347c6ae99SBarry Smith 
9447c6ae99SBarry Smith .keywords: distributed array, global to local, begin
9547c6ae99SBarry Smith 
96*9a42bb27SBarry Smith .seealso: DAGlobalToNaturalBegin(), DAGlobalToNaturalEnd(), DMLocalToGlobalBegin(), DACreate2d(),
97*9a42bb27SBarry Smith           DMGlobalToLocalBegin(), DMGlobalToLocalEnd(), DACreateNaturalVector()
9847c6ae99SBarry Smith */
99*9a42bb27SBarry Smith PetscErrorCode DAGlobalToNatural_Create(DM da)
10047c6ae99SBarry Smith {
10147c6ae99SBarry Smith   PetscErrorCode ierr;
10247c6ae99SBarry Smith   PetscInt       m,start,Nlocal;
10347c6ae99SBarry Smith   IS             from,to;
10447c6ae99SBarry Smith   Vec            global;
10547c6ae99SBarry Smith   DM_DA          *dd = (DM_DA*)da->data;
10647c6ae99SBarry Smith 
10747c6ae99SBarry Smith   PetscFunctionBegin;
10847c6ae99SBarry Smith   PetscValidHeaderSpecific(da,DM_CLASSID,1);
10947c6ae99SBarry Smith   if (!dd->natural) {
11047c6ae99SBarry Smith     SETERRQ(((PetscObject)da)->comm,PETSC_ERR_ORDER,"Natural layout vector not yet created; cannot scatter into it");
11147c6ae99SBarry Smith   }
11247c6ae99SBarry Smith 
11347c6ae99SBarry Smith   /* create the scatter context */
11447c6ae99SBarry Smith   ierr = VecGetLocalSize(dd->natural,&m);CHKERRQ(ierr);
11547c6ae99SBarry Smith   ierr = VecGetOwnershipRange(dd->natural,&start,PETSC_NULL);CHKERRQ(ierr);
11647c6ae99SBarry Smith 
11747c6ae99SBarry Smith   ierr = DAGetNatural_Private(da,&Nlocal,&to);CHKERRQ(ierr);
11847c6ae99SBarry Smith   if (Nlocal != m) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Internal error: Nlocal %D local vector size %D",Nlocal,m);
11947c6ae99SBarry Smith   ierr = ISCreateStride(((PetscObject)da)->comm,m,start,1,&from);CHKERRQ(ierr);
12047c6ae99SBarry Smith   ierr = VecCreateMPIWithArray(((PetscObject)da)->comm,dd->Nlocal,PETSC_DETERMINE,0,&global);
12147c6ae99SBarry Smith   ierr = VecSetBlockSize(global,dd->w);CHKERRQ(ierr);
12247c6ae99SBarry Smith   ierr = VecScatterCreate(global,from,dd->natural,to,&dd->gton);CHKERRQ(ierr);
12347c6ae99SBarry Smith   ierr = VecDestroy(global);CHKERRQ(ierr);
12447c6ae99SBarry Smith   ierr = ISDestroy(from);CHKERRQ(ierr);
12547c6ae99SBarry Smith   ierr = ISDestroy(to);CHKERRQ(ierr);
12647c6ae99SBarry Smith   PetscFunctionReturn(0);
12747c6ae99SBarry Smith }
12847c6ae99SBarry Smith 
12947c6ae99SBarry Smith #undef __FUNCT__
13047c6ae99SBarry Smith #define __FUNCT__ "DAGlobalToNaturalBegin"
13147c6ae99SBarry Smith /*@
13247c6ae99SBarry Smith    DAGlobalToNaturalBegin - Maps values from the global vector to a global vector
13347c6ae99SBarry Smith    in the "natural" grid ordering. Must be followed by
13447c6ae99SBarry Smith    DAGlobalToNaturalEnd() to complete the exchange.
13547c6ae99SBarry Smith 
13647c6ae99SBarry Smith    Neighbor-wise Collective on DA
13747c6ae99SBarry Smith 
13847c6ae99SBarry Smith    Input Parameters:
13947c6ae99SBarry Smith +  da - the distributed array context
14047c6ae99SBarry Smith .  g - the global vector
14147c6ae99SBarry Smith -  mode - one of INSERT_VALUES or ADD_VALUES
14247c6ae99SBarry Smith 
14347c6ae99SBarry Smith    Output Parameter:
14447c6ae99SBarry Smith .  l  - the natural ordering values
14547c6ae99SBarry Smith 
14647c6ae99SBarry Smith    Level: advanced
14747c6ae99SBarry Smith 
14847c6ae99SBarry Smith    Notes:
14947c6ae99SBarry Smith    The global and natrual vectors used here need not be the same as those
15047c6ae99SBarry Smith    obtained from DACreateGlobalVector() and DACreateNaturalVector(), BUT they
15147c6ae99SBarry Smith    must have the same parallel data layout; they could, for example, be
15247c6ae99SBarry Smith    obtained with VecDuplicate() from the DA originating vectors.
15347c6ae99SBarry Smith 
15447c6ae99SBarry Smith    You must call DACreateNaturalVector() before using this routine
15547c6ae99SBarry Smith 
15647c6ae99SBarry Smith .keywords: distributed array, global to local, begin
15747c6ae99SBarry Smith 
158*9a42bb27SBarry Smith .seealso: DAGlobalToNaturalEnd(), DMLocalToGlobalBegin(), DACreate2d(),
159*9a42bb27SBarry Smith           DMGlobalToLocalBegin(), DMGlobalToLocalEnd(), DACreateNaturalVector()
160*9a42bb27SBarry Smith 
16147c6ae99SBarry Smith @*/
162*9a42bb27SBarry Smith PetscErrorCode PETSCDM_DLLEXPORT DAGlobalToNaturalBegin(DM da,Vec g,InsertMode mode,Vec l)
16347c6ae99SBarry Smith {
16447c6ae99SBarry Smith   PetscErrorCode ierr;
16547c6ae99SBarry Smith   DM_DA          *dd = (DM_DA*)da->data;
16647c6ae99SBarry Smith 
16747c6ae99SBarry Smith   PetscFunctionBegin;
16847c6ae99SBarry Smith   PetscValidHeaderSpecific(da,DM_CLASSID,1);
16947c6ae99SBarry Smith   PetscValidHeaderSpecific(l,VEC_CLASSID,2);
17047c6ae99SBarry Smith   PetscValidHeaderSpecific(g,VEC_CLASSID,4);
17147c6ae99SBarry Smith   if (!dd->gton) {
17247c6ae99SBarry Smith     /* create the scatter context */
17347c6ae99SBarry Smith     ierr = DAGlobalToNatural_Create(da);CHKERRQ(ierr);
17447c6ae99SBarry Smith   }
17547c6ae99SBarry Smith   ierr = VecScatterBegin(dd->gton,g,l,mode,SCATTER_FORWARD);CHKERRQ(ierr);
17647c6ae99SBarry Smith   PetscFunctionReturn(0);
17747c6ae99SBarry Smith }
17847c6ae99SBarry Smith 
17947c6ae99SBarry Smith #undef __FUNCT__
18047c6ae99SBarry Smith #define __FUNCT__ "DAGlobalToNaturalEnd"
18147c6ae99SBarry Smith /*@
18247c6ae99SBarry Smith    DAGlobalToNaturalEnd - Maps values from the global vector to a global vector
18347c6ae99SBarry Smith    in the natural ordering. Must be preceeded by DAGlobalToNaturalBegin().
18447c6ae99SBarry Smith 
18547c6ae99SBarry Smith    Neighbor-wise Collective on DA
18647c6ae99SBarry Smith 
18747c6ae99SBarry Smith    Input Parameters:
18847c6ae99SBarry Smith +  da - the distributed array context
18947c6ae99SBarry Smith .  g - the global vector
19047c6ae99SBarry Smith -  mode - one of INSERT_VALUES or ADD_VALUES
19147c6ae99SBarry Smith 
19247c6ae99SBarry Smith    Output Parameter:
19347c6ae99SBarry Smith .  l  - the global values in the natural ordering
19447c6ae99SBarry Smith 
19547c6ae99SBarry Smith    Level: advanced
19647c6ae99SBarry Smith 
19747c6ae99SBarry Smith    Notes:
19847c6ae99SBarry Smith    The global and local vectors used here need not be the same as those
19947c6ae99SBarry Smith    obtained from DACreateGlobalVector() and DACreateNaturalVector(), BUT they
20047c6ae99SBarry Smith    must have the same parallel data layout; they could, for example, be
20147c6ae99SBarry Smith    obtained with VecDuplicate() from the DA originating vectors.
20247c6ae99SBarry Smith 
20347c6ae99SBarry Smith .keywords: distributed array, global to local, end
20447c6ae99SBarry Smith 
205*9a42bb27SBarry Smith .seealso: DAGlobalToNaturalBegin(), DMLocalToGlobalBegin(), DACreate2d(),
206*9a42bb27SBarry Smith           DMGlobalToLocalBegin(), DMGlobalToLocalEnd(), DACreateNaturalVector()
207*9a42bb27SBarry Smith 
20847c6ae99SBarry Smith @*/
209*9a42bb27SBarry Smith PetscErrorCode PETSCDM_DLLEXPORT DAGlobalToNaturalEnd(DM da,Vec g,InsertMode mode,Vec l)
21047c6ae99SBarry Smith {
21147c6ae99SBarry Smith   PetscErrorCode ierr;
21247c6ae99SBarry Smith   DM_DA          *dd = (DM_DA*)da->data;
21347c6ae99SBarry Smith 
21447c6ae99SBarry Smith   PetscFunctionBegin;
21547c6ae99SBarry Smith   PetscValidHeaderSpecific(da,DM_CLASSID,1);
21647c6ae99SBarry Smith   PetscValidHeaderSpecific(l,VEC_CLASSID,2);
21747c6ae99SBarry Smith   PetscValidHeaderSpecific(g,VEC_CLASSID,4);
21847c6ae99SBarry Smith   ierr = VecScatterEnd(dd->gton,g,l,mode,SCATTER_FORWARD);CHKERRQ(ierr);
21947c6ae99SBarry Smith   PetscFunctionReturn(0);
22047c6ae99SBarry Smith }
22147c6ae99SBarry Smith 
22247c6ae99SBarry Smith #undef __FUNCT__
22347c6ae99SBarry Smith #define __FUNCT__ "DANaturalToGlobalBegin"
22447c6ae99SBarry Smith /*@
22547c6ae99SBarry Smith    DANaturalToGlobalBegin - Maps values from a global vector in the "natural" ordering
22647c6ae99SBarry Smith    to a global vector in the PETSc DA grid ordering. Must be followed by
22747c6ae99SBarry Smith    DANaturalToGlobalEnd() to complete the exchange.
22847c6ae99SBarry Smith 
22947c6ae99SBarry Smith    Neighbor-wise Collective on DA
23047c6ae99SBarry Smith 
23147c6ae99SBarry Smith    Input Parameters:
23247c6ae99SBarry Smith +  da - the distributed array context
23347c6ae99SBarry Smith .  g - the global vector in a natural ordering
23447c6ae99SBarry Smith -  mode - one of INSERT_VALUES or ADD_VALUES
23547c6ae99SBarry Smith 
23647c6ae99SBarry Smith    Output Parameter:
23747c6ae99SBarry Smith .  l  - the values in the DA ordering
23847c6ae99SBarry Smith 
23947c6ae99SBarry Smith    Level: advanced
24047c6ae99SBarry Smith 
24147c6ae99SBarry Smith    Notes:
24247c6ae99SBarry Smith    The global and natural vectors used here need not be the same as those
24347c6ae99SBarry Smith    obtained from DACreateGlobalVector() and DACreateNaturalVector(), BUT they
24447c6ae99SBarry Smith    must have the same parallel data layout; they could, for example, be
24547c6ae99SBarry Smith    obtained with VecDuplicate() from the DA originating vectors.
24647c6ae99SBarry Smith 
24747c6ae99SBarry Smith .keywords: distributed array, global to local, begin
24847c6ae99SBarry Smith 
249*9a42bb27SBarry Smith .seealso: DAGlobalToNaturalEnd(), DAGlobalToNaturalBegin(), DMLocalToGlobalBegin(), DACreate2d(),
250*9a42bb27SBarry Smith           DMGlobalToLocalBegin(), DMGlobalToLocalEnd(), DACreateNaturalVector()
25147c6ae99SBarry Smith 
25247c6ae99SBarry Smith @*/
253*9a42bb27SBarry Smith PetscErrorCode PETSCDM_DLLEXPORT DANaturalToGlobalBegin(DM da,Vec g,InsertMode mode,Vec l)
25447c6ae99SBarry Smith {
25547c6ae99SBarry Smith   PetscErrorCode ierr;
25647c6ae99SBarry Smith   DM_DA          *dd = (DM_DA*)da->data;
25747c6ae99SBarry Smith 
25847c6ae99SBarry Smith   PetscFunctionBegin;
25947c6ae99SBarry Smith   PetscValidHeaderSpecific(da,DM_CLASSID,1);
26047c6ae99SBarry Smith   PetscValidHeaderSpecific(l,VEC_CLASSID,2);
26147c6ae99SBarry Smith   PetscValidHeaderSpecific(g,VEC_CLASSID,4);
26247c6ae99SBarry Smith   if (!dd->gton) {
26347c6ae99SBarry Smith     /* create the scatter context */
26447c6ae99SBarry Smith     ierr = DAGlobalToNatural_Create(da);CHKERRQ(ierr);
26547c6ae99SBarry Smith   }
26647c6ae99SBarry Smith   ierr = VecScatterBegin(dd->gton,g,l,mode,SCATTER_REVERSE);CHKERRQ(ierr);
26747c6ae99SBarry Smith   PetscFunctionReturn(0);
26847c6ae99SBarry Smith }
26947c6ae99SBarry Smith 
27047c6ae99SBarry Smith #undef __FUNCT__
27147c6ae99SBarry Smith #define __FUNCT__ "DANaturalToGlobalEnd"
27247c6ae99SBarry Smith /*@
27347c6ae99SBarry Smith    DANaturalToGlobalEnd - Maps values from the natural ordering global vector
27447c6ae99SBarry Smith    to a global vector in the PETSc DA ordering. Must be preceeded by DANaturalToGlobalBegin().
27547c6ae99SBarry Smith 
27647c6ae99SBarry Smith    Neighbor-wise Collective on DA
27747c6ae99SBarry Smith 
27847c6ae99SBarry Smith    Input Parameters:
27947c6ae99SBarry Smith +  da - the distributed array context
28047c6ae99SBarry Smith .  g - the global vector in a natural ordering
28147c6ae99SBarry Smith -  mode - one of INSERT_VALUES or ADD_VALUES
28247c6ae99SBarry Smith 
28347c6ae99SBarry Smith    Output Parameter:
28447c6ae99SBarry Smith .  l  - the global values in the PETSc DA ordering
28547c6ae99SBarry Smith 
28647c6ae99SBarry Smith    Level: intermediate
28747c6ae99SBarry Smith 
28847c6ae99SBarry Smith    Notes:
28947c6ae99SBarry Smith    The global and local vectors used here need not be the same as those
29047c6ae99SBarry Smith    obtained from DACreateGlobalVector() and DACreateNaturalVector(), BUT they
29147c6ae99SBarry Smith    must have the same parallel data layout; they could, for example, be
29247c6ae99SBarry Smith    obtained with VecDuplicate() from the DA originating vectors.
29347c6ae99SBarry Smith 
29447c6ae99SBarry Smith .keywords: distributed array, global to local, end
29547c6ae99SBarry Smith 
296*9a42bb27SBarry Smith .seealso: DAGlobalToNaturalBegin(), DAGlobalToNaturalEnd(), DMLocalToGlobalBegin(), DACreate2d(),
297*9a42bb27SBarry Smith           DMGlobalToLocalBegin(), DMGlobalToLocalEnd(), DACreateNaturalVector()
29847c6ae99SBarry Smith 
29947c6ae99SBarry Smith @*/
300*9a42bb27SBarry Smith PetscErrorCode PETSCDM_DLLEXPORT DANaturalToGlobalEnd(DM da,Vec g,InsertMode mode,Vec l)
30147c6ae99SBarry Smith {
30247c6ae99SBarry Smith   PetscErrorCode ierr;
30347c6ae99SBarry Smith   DM_DA          *dd = (DM_DA*)da->data;
30447c6ae99SBarry Smith 
30547c6ae99SBarry Smith   PetscFunctionBegin;
30647c6ae99SBarry Smith   PetscValidHeaderSpecific(da,DM_CLASSID,1);
30747c6ae99SBarry Smith   PetscValidHeaderSpecific(l,VEC_CLASSID,2);
30847c6ae99SBarry Smith   PetscValidHeaderSpecific(g,VEC_CLASSID,4);
30947c6ae99SBarry Smith   ierr = VecScatterEnd(dd->gton,g,l,mode,SCATTER_REVERSE);CHKERRQ(ierr);
31047c6ae99SBarry Smith   PetscFunctionReturn(0);
31147c6ae99SBarry Smith }
31247c6ae99SBarry Smith 
313