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