xref: /petsc/src/dm/impls/swarm/swarm_migrate.c (revision 2712d1f298c5422eb734c0099baf811412ec8056)
1df21e3a8SDave May 
2df21e3a8SDave May #include <petsc/private/dmswarmimpl.h>    /*I   "petscdmswarm.h"   I*/
3df21e3a8SDave May #include "data_bucket.h"
4df21e3a8SDave May #include "data_ex.h"
5df21e3a8SDave May 
6df21e3a8SDave May 
7df21e3a8SDave May #undef __FUNCT__
8df21e3a8SDave May #define __FUNCT__ "DMSwarmMigrate_Push_Basic"
9df21e3a8SDave May PetscErrorCode DMSwarmMigrate_Push_Basic(DM dm,PetscBool remove_sent_points)
10df21e3a8SDave May {
11df21e3a8SDave May   DM_Swarm *swarm = (DM_Swarm*)dm->data;
12df21e3a8SDave May   PetscErrorCode ierr;
13df21e3a8SDave May   DataEx de;
14df21e3a8SDave May   PetscInt p,npoints,*rankval,n_points_recv;
15df21e3a8SDave May   PetscMPIInt rank,nrank;
16df21e3a8SDave May   void *point_buffer,*recv_points;
17df21e3a8SDave May   size_t sizeof_dmswarm_point;
18df21e3a8SDave May 
19df21e3a8SDave May   ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)dm),&rank);CHKERRQ(ierr);
20df21e3a8SDave May 
21df21e3a8SDave May   ierr = DataBucketGetSizes(swarm->db,&npoints,NULL,NULL);CHKERRQ(ierr);
22df21e3a8SDave May   ierr = DMSwarmGetField(dm,"DMSwarm_rank",NULL,NULL,(void**)&rankval);CHKERRQ(ierr);
23df21e3a8SDave May 
24df21e3a8SDave May   de = DataExCreate(PetscObjectComm((PetscObject)dm),0);CHKERRQ(ierr);
25df21e3a8SDave May 
26df21e3a8SDave May   ierr = DataExTopologyInitialize(de);CHKERRQ(ierr);
27df21e3a8SDave May   for (p=0; p<npoints; p++) {
28df21e3a8SDave May     nrank = rankval[p];
29df21e3a8SDave May     if (nrank != rank) {
30df21e3a8SDave May       ierr = DataExTopologyAddNeighbour(de,nrank);CHKERRQ(ierr);
31df21e3a8SDave May     }
32df21e3a8SDave May   }
33df21e3a8SDave May   ierr = DataExTopologyFinalize(de);CHKERRQ(ierr);
34df21e3a8SDave May 
35df21e3a8SDave May   ierr = DataExInitializeSendCount(de);CHKERRQ(ierr);
36df21e3a8SDave May   for (p=0; p<npoints; p++) {
37df21e3a8SDave May     nrank = rankval[p];
38df21e3a8SDave May     if (nrank != rank) {
39df21e3a8SDave May       ierr = DataExAddToSendCount(de,nrank,1);CHKERRQ(ierr);
40df21e3a8SDave May     }
41df21e3a8SDave May   }
42df21e3a8SDave May   ierr = DataExFinalizeSendCount(de);CHKERRQ(ierr);
43df21e3a8SDave May 
44df21e3a8SDave May   ierr = DataBucketCreatePackedArray(swarm->db,&sizeof_dmswarm_point,&point_buffer);CHKERRQ(ierr);
45df21e3a8SDave May   ierr = DataExPackInitialize(de,sizeof_dmswarm_point);CHKERRQ(ierr);
46df21e3a8SDave May   for (p=0; p<npoints; p++) {
47df21e3a8SDave May     nrank = rankval[p];
48df21e3a8SDave May     if (nrank != rank) {
49df21e3a8SDave May       /* copy point into buffer */
50df21e3a8SDave May       ierr = DataBucketFillPackedArray(swarm->db,p,point_buffer);CHKERRQ(ierr);
51df21e3a8SDave May       /* insert point buffer into DataExchanger */
52df21e3a8SDave May       ierr = DataExPackData(de,nrank,1,point_buffer);CHKERRQ(ierr);
53df21e3a8SDave May     }
54df21e3a8SDave May   }
55df21e3a8SDave May   ierr = DataExPackFinalize(de);CHKERRQ(ierr);
56df21e3a8SDave May 
57df21e3a8SDave May 
58df21e3a8SDave May   if (remove_sent_points) {
59df21e3a8SDave May     /* remove points which left processor */
60df21e3a8SDave May     ierr = DataBucketGetSizes(swarm->db,&npoints,NULL,NULL);CHKERRQ(ierr);
61df21e3a8SDave May     for (p=0; p<npoints; p++) {
62df21e3a8SDave May       nrank = rankval[p];
63df21e3a8SDave May       if (nrank != rank) {
64df21e3a8SDave May         /* kill point */
65df21e3a8SDave May         ierr = DataBucketRemovePointAtIndex(swarm->db,p);CHKERRQ(ierr);
66df21e3a8SDave May         DataBucketGetSizes(swarm->db,&npoints,NULL,NULL);CHKERRQ(ierr); /* you need to update npoints as the list size decreases! */
67df21e3a8SDave May         p--; /* check replacement point */
68df21e3a8SDave May       }
69df21e3a8SDave May     }
70df21e3a8SDave May   }
71df21e3a8SDave May   ierr = DMSwarmRestoreField(dm,"DMSwarm_rank",NULL,NULL,(void**)&rankval);CHKERRQ(ierr);
72df21e3a8SDave May 
73df21e3a8SDave May   ierr = DataExBegin(de);CHKERRQ(ierr);
74df21e3a8SDave May   ierr = DataExEnd(de);CHKERRQ(ierr);
75df21e3a8SDave May 
76df21e3a8SDave May   ierr = DataExGetRecvData(de,&n_points_recv,(void**)&recv_points);CHKERRQ(ierr);
77df21e3a8SDave May 
78df21e3a8SDave May 	ierr = DataBucketGetSizes(swarm->db,&npoints,NULL,NULL);CHKERRQ(ierr);
79df21e3a8SDave May 	ierr = DataBucketSetSizes(swarm->db,npoints + n_points_recv,-1);CHKERRQ(ierr);
80df21e3a8SDave May 	for (p=0; p<n_points_recv; p++) {
81df21e3a8SDave May     void *data_p = (void*)( (char*)recv_points + p*sizeof_dmswarm_point );
82df21e3a8SDave May 
83df21e3a8SDave May     ierr = DataBucketInsertPackedArray(swarm->db,npoints+p,data_p);CHKERRQ(ierr);
84df21e3a8SDave May   }
85df21e3a8SDave May   ierr = DataExView(de);CHKERRQ(ierr);
86df21e3a8SDave May   ierr = DataBucketDestroyPackedArray(swarm->db,&point_buffer);CHKERRQ(ierr);
87df21e3a8SDave May   ierr = DataExDestroy(de);CHKERRQ(ierr);
88df21e3a8SDave May 
89df21e3a8SDave May   PetscFunctionReturn(0);
90df21e3a8SDave May }
91*2712d1f2SDave May 
92*2712d1f2SDave May #undef __FUNCT__
93*2712d1f2SDave May #define __FUNCT__ "DMSwarmMigrate_GlobalToLocal_Basic"
94*2712d1f2SDave May PetscErrorCode DMSwarmMigrate_GlobalToLocal_Basic(DM dm,PetscInt *globalsize)
95*2712d1f2SDave May {
96*2712d1f2SDave May   DM_Swarm *swarm = (DM_Swarm*)dm->data;
97*2712d1f2SDave May   PetscErrorCode ierr;
98*2712d1f2SDave May   DataEx de;
99*2712d1f2SDave May   PetscInt p,npoints,*rankval,n_points_recv;
100*2712d1f2SDave May   PetscMPIInt rank,nrank,negrank;
101*2712d1f2SDave May   void *point_buffer,*recv_points;
102*2712d1f2SDave May   size_t sizeof_dmswarm_point;
103*2712d1f2SDave May 
104*2712d1f2SDave May   ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)dm),&rank);CHKERRQ(ierr);
105*2712d1f2SDave May 
106*2712d1f2SDave May   ierr = DataBucketGetSizes(swarm->db,&npoints,NULL,NULL);CHKERRQ(ierr);
107*2712d1f2SDave May   *globalsize = npoints;
108*2712d1f2SDave May   ierr = DMSwarmGetField(dm,"DMSwarm_rank",NULL,NULL,(void**)&rankval);CHKERRQ(ierr);
109*2712d1f2SDave May 
110*2712d1f2SDave May   de = DataExCreate(PetscObjectComm((PetscObject)dm),0);CHKERRQ(ierr);
111*2712d1f2SDave May 
112*2712d1f2SDave May   ierr = DataExTopologyInitialize(de);CHKERRQ(ierr);
113*2712d1f2SDave May   for (p=0; p<npoints; p++) {
114*2712d1f2SDave May     negrank = rankval[p];
115*2712d1f2SDave May     if (negrank < 0) {
116*2712d1f2SDave May       nrank = -negrank - 1;
117*2712d1f2SDave May       ierr = DataExTopologyAddNeighbour(de,nrank);CHKERRQ(ierr);
118*2712d1f2SDave May     }
119*2712d1f2SDave May   }
120*2712d1f2SDave May   ierr = DataExTopologyFinalize(de);CHKERRQ(ierr);
121*2712d1f2SDave May 
122*2712d1f2SDave May   ierr = DataExInitializeSendCount(de);CHKERRQ(ierr);
123*2712d1f2SDave May   for (p=0; p<npoints; p++) {
124*2712d1f2SDave May     negrank = rankval[p];
125*2712d1f2SDave May     if (negrank < 0) {
126*2712d1f2SDave May       nrank = -negrank - 1;
127*2712d1f2SDave May       ierr = DataExAddToSendCount(de,nrank,1);CHKERRQ(ierr);
128*2712d1f2SDave May     }
129*2712d1f2SDave May   }
130*2712d1f2SDave May   ierr = DataExFinalizeSendCount(de);CHKERRQ(ierr);
131*2712d1f2SDave May 
132*2712d1f2SDave May   ierr = DataBucketCreatePackedArray(swarm->db,&sizeof_dmswarm_point,&point_buffer);CHKERRQ(ierr);
133*2712d1f2SDave May   ierr = DataExPackInitialize(de,sizeof_dmswarm_point);CHKERRQ(ierr);
134*2712d1f2SDave May   for (p=0; p<npoints; p++) {
135*2712d1f2SDave May     negrank = rankval[p];
136*2712d1f2SDave May     if (negrank < 0) {
137*2712d1f2SDave May       nrank = -negrank - 1;
138*2712d1f2SDave May       rankval[p] = nrank;
139*2712d1f2SDave May       /* copy point into buffer */
140*2712d1f2SDave May       ierr = DataBucketFillPackedArray(swarm->db,p,point_buffer);CHKERRQ(ierr);
141*2712d1f2SDave May       /* insert point buffer into DataExchanger */
142*2712d1f2SDave May       ierr = DataExPackData(de,nrank,1,point_buffer);CHKERRQ(ierr);
143*2712d1f2SDave May       rankval[p] = negrank;
144*2712d1f2SDave May     }
145*2712d1f2SDave May   }
146*2712d1f2SDave May   ierr = DataExPackFinalize(de);CHKERRQ(ierr);
147*2712d1f2SDave May 
148*2712d1f2SDave May   ierr = DMSwarmRestoreField(dm,"DMSwarm_rank",NULL,NULL,(void**)&rankval);CHKERRQ(ierr);
149*2712d1f2SDave May 
150*2712d1f2SDave May   ierr = DataExBegin(de);CHKERRQ(ierr);
151*2712d1f2SDave May   ierr = DataExEnd(de);CHKERRQ(ierr);
152*2712d1f2SDave May 
153*2712d1f2SDave May   ierr = DataExGetRecvData(de,&n_points_recv,(void**)&recv_points);CHKERRQ(ierr);
154*2712d1f2SDave May 
155*2712d1f2SDave May 	ierr = DataBucketGetSizes(swarm->db,&npoints,NULL,NULL);CHKERRQ(ierr);
156*2712d1f2SDave May 	ierr = DataBucketSetSizes(swarm->db,npoints + n_points_recv,-1);CHKERRQ(ierr);
157*2712d1f2SDave May 	for (p=0; p<n_points_recv; p++) {
158*2712d1f2SDave May     void *data_p = (void*)( (char*)recv_points + p*sizeof_dmswarm_point );
159*2712d1f2SDave May 
160*2712d1f2SDave May     ierr = DataBucketInsertPackedArray(swarm->db,npoints+p,data_p);CHKERRQ(ierr);
161*2712d1f2SDave May   }
162*2712d1f2SDave May   ierr = DataExView(de);CHKERRQ(ierr);
163*2712d1f2SDave May   ierr = DataBucketDestroyPackedArray(swarm->db,&point_buffer);CHKERRQ(ierr);
164*2712d1f2SDave May   ierr = DataExDestroy(de);CHKERRQ(ierr);
165*2712d1f2SDave May 
166*2712d1f2SDave May   PetscFunctionReturn(0);
167*2712d1f2SDave May }
168