void cell_cell_transfer(GhostCommunication *gc, int data_parts) { int pl, p, offset; Particle *part1, *part2, *pt1, *pt2; GHOST_TRACE(fprintf(stderr, "%d: local_transfer: type %d data_parts %d\n", this_node,gc->type,data_parts)); /* transfer data */ offset = gc->n_part_lists/2; for (pl = 0; pl < offset; pl++) { Cell *src_list = gc->part_lists[pl]; Cell *dst_list = gc->part_lists[pl + offset]; if (data_parts == GHOSTTRANS_PARTNUM) { prepare_ghost_cell(dst_list, src_list->n); } else { int np = src_list->n; part1 = src_list->part; part2 = dst_list->part; for (p = 0; p < np; p++) { pt1 = &part1[p]; pt2 = &part2[p]; if (data_parts & GHOSTTRANS_PROPRTS) { memcpy(&pt2->p, &pt1->p, sizeof(ParticleProperties)); #ifdef GHOSTS_HAVE_BONDS realloc_intlist(&(pt2->bl), pt2->bl.n = pt1->bl.n); memcpy(&pt2->bl.e, &pt1->bl.e, pt1->bl.n*sizeof(int)); #ifdef EXCLUSIONS realloc_intlist(&(pt2->el), pt2->el.n = pt1->el.n); memcpy(&pt2->el.e, &pt1->el.e, pt1->el.n*sizeof(int)); #endif #endif } if (data_parts & GHOSTTRANS_POSSHFTD) { /* ok, this is not nice, but perhaps fast */ int i; memcpy(&pt2->r, &pt1->r, sizeof(ParticlePosition)); for (i = 0; i < 3; i++) pt2->r.p[i] += gc->shift[i]; } else if (data_parts & GHOSTTRANS_POSITION) memcpy(&pt2->r, &pt1->r, sizeof(ParticlePosition)); if (data_parts & GHOSTTRANS_MOMENTUM) memcpy(&pt2->m, &pt1->m, sizeof(ParticleMomentum)); if (data_parts & GHOSTTRANS_FORCE) add_force(&pt2->f, &pt1->f); #ifdef LB if (data_parts & GHOSTTRANS_COUPLING) memcpy(&pt2->lc, &pt1->lc, sizeof(ParticleLatticeCoupling)); #endif } } } }
void cell_cell_transfer(GhostCommunication *gc, int data_parts) { int pl, p, offset; Particle *part1, *part2, *pt1, *pt2; GHOST_TRACE(fprintf(stderr, "%d: local_transfer: type %d data_parts %d\n", this_node,gc->type,data_parts)); /* transfer data */ offset = gc->n_part_lists/2; for (pl = 0; pl < offset; pl++) { Cell *src_list = gc->part_lists[pl]; Cell *dst_list = gc->part_lists[pl + offset]; if (data_parts & GHOSTTRANS_PARTNUM) { prepare_ghost_cell(dst_list, src_list->n); } else { int np = src_list->n; part1 = src_list->part; part2 = dst_list->part; for (p = 0; p < np; p++) { pt1 = &part1[p]; pt2 = &part2[p]; if (data_parts & GHOSTTRANS_PROPRTS) { memcpy(&pt2->p, &pt1->p, sizeof(ParticleProperties)); #ifdef GHOSTS_HAVE_BONDS realloc_intlist(&(pt2->bl), pt2->bl.n = pt1->bl.n); memcpy(&pt2->bl.e, &pt1->bl.e, pt1->bl.n*sizeof(int)); #ifdef EXCLUSIONS realloc_intlist(&(pt2->el), pt2->el.n = pt1->el.n); memcpy(&pt2->el.e, &pt1->el.e, pt1->el.n*sizeof(int)); #endif #endif } if (data_parts & GHOSTTRANS_POSSHFTD) { /* ok, this is not nice, but perhaps fast */ int i; memcpy(&pt2->r, &pt1->r, sizeof(ParticlePosition)); for (i = 0; i < 3; i++) pt2->r.p[i] += gc->shift[i]; #ifdef LEES_EDWARDS /* special wrapping conditions for x component of y LE shift */ if( gc->shift[1] != 0.0 ){ /* LE transforms are wrapped */ if( pt2->r.p[0] - (my_left[0] + dst_list->myIndex[0]*dd.cell_size[0]) > 2*dd.cell_size[0] ) pt2->r.p[0]-=box_l[0]; if( pt2->r.p[0] - (my_left[0] + dst_list->myIndex[0]*dd.cell_size[0]) < -2*dd.cell_size[0] ) pt2->r.p[0]+=box_l[0]; } #endif } else if (data_parts & GHOSTTRANS_POSITION) memcpy(&pt2->r, &pt1->r, sizeof(ParticlePosition)); if (data_parts & GHOSTTRANS_MOMENTUM) { memcpy(&pt2->m, &pt1->m, sizeof(ParticleMomentum)); #ifdef LEES_EDWARDS /* special wrapping conditions for x component of y LE shift */ if( gc->shift[1] > 0.0 ) pt2->m.v[0] += lees_edwards_rate; else if( gc->shift[1] < 0.0 ) pt2->m.v[0] -= lees_edwards_rate; #endif } if (data_parts & GHOSTTRANS_FORCE) add_force(&pt2->f, &pt1->f); #ifdef LB if (data_parts & GHOSTTRANS_COUPLING) memcpy(&pt2->lc, &pt1->lc, sizeof(ParticleLatticeCoupling)); #endif #ifdef ENGINE if (data_parts & GHOSTTRANS_SWIMMING) memcpy(&pt2->swim, &pt1->swim, sizeof(ParticleParametersSwimming)); #endif } } } }
void put_recv_buffer(GhostCommunication *gc, int data_parts) { /* put back data */ char *retrieve = r_buffer; std::vector<int>::const_iterator bond_retrieve = r_bondbuffer.begin(); for (int pl = 0; pl < gc->n_part_lists; pl++) { ParticleList *cur_list = gc->part_lists[pl]; if (data_parts == GHOSTTRANS_PARTNUM) { GHOST_TRACE(fprintf(stderr, "%d: reallocating cell %p to size %d, assigned to node %d\n", this_node, cur_list, *(int *)retrieve, gc->node)); prepare_ghost_cell(cur_list, *(int *)retrieve); retrieve += sizeof(int); } else { int np = cur_list->n; Particle *part = cur_list->part; for (int p = 0; p < np; p++) { Particle *pt = &part[p]; if (data_parts & GHOSTTRANS_PROPRTS) { memcpy(&pt->p, retrieve, sizeof(ParticleProperties)); retrieve += sizeof(ParticleProperties); #ifdef GHOSTS_HAVE_BONDS int n_bonds; memcpy(&n_bonds, retrieve, sizeof(int)); retrieve += sizeof(int); if (n_bonds) { realloc_intlist(&pt->bl, pt->bl.n = n_bonds); std::copy(bond_retrieve, bond_retrieve + n_bonds, pt->bl.e); bond_retrieve += n_bonds; } #ifdef EXCLUSIONS memcpy(&n_bonds, retrieve, sizeof(int)); retrieve += sizeof(int); if (n_bonds) { realloc_intlist(&pt->el, pt->el.n = n_bonds); std::copy(bond_retrieve, bond_retrieve + n_bonds, pt->el.e); bond_retrieve += n_bonds; } #endif #endif if (local_particles[pt->p.identity] == NULL) { local_particles[pt->p.identity] = pt; } } if (data_parts & GHOSTTRANS_POSITION) { memcpy(&pt->r, retrieve, sizeof(ParticlePosition)); retrieve += sizeof(ParticlePosition); } if (data_parts & GHOSTTRANS_MOMENTUM) { memcpy(&pt->m, retrieve, sizeof(ParticleMomentum)); retrieve += sizeof(ParticleMomentum); } if (data_parts & GHOSTTRANS_FORCE) { memcpy(&pt->f, retrieve, sizeof(ParticleForce)); retrieve += sizeof(ParticleForce); } #ifdef LB if (data_parts & GHOSTTRANS_COUPLING) { memcpy(&pt->lc, retrieve, sizeof(ParticleLatticeCoupling)); retrieve += sizeof(ParticleLatticeCoupling); } #endif } } } if (data_parts & GHOSTTRANS_PROPRTS) { // skip the final information on bonds to be sent in a second round retrieve += sizeof(int); } if (retrieve - r_buffer != n_r_buffer) { fprintf(stderr, "%d: recv buffer size %d differs " "from what I read out (%ld)\n", this_node, n_r_buffer, retrieve - r_buffer); errexit(); } if (bond_retrieve != r_bondbuffer.end()) { fprintf(stderr, "%d: recv bond buffer was not used up, %ld elements remain\n", this_node, r_bondbuffer.end() - bond_retrieve ); errexit(); } r_bondbuffer.resize(0); }
void put_recv_buffer(GhostCommunication *gc, int data_parts) { /* put back data */ char *retrieve = r_buffer; std::vector<int>::const_iterator bond_retrieve = r_bondbuffer.begin(); for (int pl = 0; pl < gc->n_part_lists; pl++) { ParticleList *cur_list = gc->part_lists[pl]; if (data_parts & GHOSTTRANS_PARTNUM) { GHOST_TRACE(fprintf(stderr, "%d: reallocating cell %p to size %d, assigned to node %d\n", this_node, cur_list, *(int *)retrieve, gc->node)); prepare_ghost_cell(cur_list, *(int *)retrieve); retrieve += sizeof(int); } else { int np = cur_list->n; Particle *part = cur_list->part; for (int p = 0; p < np; p++) { Particle *pt = &part[p]; if (data_parts & GHOSTTRANS_PROPRTS) { memcpy(&pt->p, retrieve, sizeof(ParticleProperties)); retrieve += sizeof(ParticleProperties); #ifdef GHOSTS_HAVE_BONDS int n_bonds; memcpy(&n_bonds, retrieve, sizeof(int)); retrieve += sizeof(int); if (n_bonds) { realloc_intlist(&pt->bl, pt->bl.n = n_bonds); std::copy(bond_retrieve, bond_retrieve + n_bonds, pt->bl.e); bond_retrieve += n_bonds; } #ifdef EXCLUSIONS memcpy(&n_bonds, retrieve, sizeof(int)); retrieve += sizeof(int); if (n_bonds) { realloc_intlist(&pt->el, pt->el.n = n_bonds); std::copy(bond_retrieve, bond_retrieve + n_bonds, pt->el.e); bond_retrieve += n_bonds; } #endif #endif if (local_particles[pt->p.identity] == NULL) { local_particles[pt->p.identity] = pt; } } if (data_parts & GHOSTTRANS_POSITION) { memcpy(&pt->r, retrieve, sizeof(ParticlePosition)); retrieve += sizeof(ParticlePosition); #ifdef LEES_EDWARDS /* special wrapping conditions for x component of y LE shift */ if( gc->shift[1] != 0.0 ){ /* LE transforms are wrapped ---Using this method because its a shortcut to getting a neat-looking verlet list. */ if( pt->r.p[0] - (my_left[0] + cur_list->myIndex[0]*dd.cell_size[0]) > 2*dd.cell_size[0] ) pt->r.p[0]-=box_l[0]; if( pt->r.p[0] - (my_left[0] + cur_list->myIndex[0]*dd.cell_size[0]) < -2*dd.cell_size[0] ) pt->r.p[0]+=box_l[0]; } #endif } if (data_parts & GHOSTTRANS_MOMENTUM) { memcpy(&pt->m, retrieve, sizeof(ParticleMomentum)); retrieve += sizeof(ParticleMomentum); #ifdef LEES_EDWARDS /* give ghost particles correct velocity for the main * non-ghost LE reference frame */ if( gc->shift[1] > 0.0 ) pt->m.v[0] += lees_edwards_rate; else if( gc->shift[1] < 0.0 ) pt->m.v[0] -= lees_edwards_rate; #endif } if (data_parts & GHOSTTRANS_FORCE) { memcpy(&pt->f, retrieve, sizeof(ParticleForce)); retrieve += sizeof(ParticleForce); } #ifdef LB if (data_parts & GHOSTTRANS_COUPLING) { memcpy(&pt->lc, retrieve, sizeof(ParticleLatticeCoupling)); retrieve += sizeof(ParticleLatticeCoupling); } #endif #ifdef ENGINE if (data_parts & GHOSTTRANS_SWIMMING) { memcpy(&pt->swim, retrieve, sizeof(ParticleParametersSwimming)); retrieve += sizeof(ParticleParametersSwimming); } #endif } } } if (data_parts & GHOSTTRANS_PROPRTS) { // skip the final information on bonds to be sent in a second round retrieve += sizeof(int); } if (retrieve - r_buffer != n_r_buffer) { fprintf(stderr, "%d: recv buffer size %d differs " "from what I read out (%ld)\n", this_node, n_r_buffer, retrieve - r_buffer); errexit(); } if (bond_retrieve != r_bondbuffer.end()) { fprintf(stderr, "%d: recv bond buffer was not used up, %ld elements remain\n", this_node, r_bondbuffer.end() - bond_retrieve ); errexit(); } r_bondbuffer.resize(0); }