Skip to content
Snippets Groups Projects
Commit 567f855e authored by Rafael Ravedutti's avatar Rafael Ravedutti
Browse files

Adjust sizes for exchange methods

parent bd671caa
No related branches found
No related tags found
No related merge requests found
...@@ -14,8 +14,6 @@ size_t read_particle_data(PairsSimulation *ps, const char *filename, double *gri ...@@ -14,8 +14,6 @@ size_t read_particle_data(PairsSimulation *ps, const char *filename, double *gri
std::string line; std::string line;
size_t n = 0; size_t n = 0;
int read_grid_data = 0; int read_grid_data = 0;
// TODO: store this from PairsSimulation class
const int num_dims = 3;
if(in_file.is_open()) { if(in_file.is_open()) {
while(std::getline(in_file, line)) { while(std::getline(in_file, line)) {
...@@ -25,6 +23,8 @@ size_t read_particle_data(PairsSimulation *ps, const char *filename, double *gri ...@@ -25,6 +23,8 @@ size_t read_particle_data(PairsSimulation *ps, const char *filename, double *gri
while(std::getline(line_stream, in0, ',')) { while(std::getline(line_stream, in0, ',')) {
if(!read_grid_data) { if(!read_grid_data) {
// TODO: store this from PairsSimulation class
const int num_dims = 3;
PAIRS_ASSERT(i < num_dims * 2); PAIRS_ASSERT(i < num_dims * 2);
grid_buffer[i] = std::stod(in0); grid_buffer[i] = std::stod(in0);
} else { } else {
......
...@@ -35,35 +35,36 @@ class Comm: ...@@ -35,35 +35,36 @@ class Comm:
@pairs_inline @pairs_inline
def synchronize(self): def synchronize(self):
prop_list = [self.sim.property(p) for p in ['position']] prop_list = [self.sim.property(p) for p in ['position']]
for d in range(self.sim.ndims()): for step in range(self.dom_part.number_of_steps()):
PackGhostParticles(self, d, prop_list) PackGhostParticles(self, step, prop_list)
CommunicateData(self, d, prop_list) CommunicateData(self, step, prop_list)
UnpackGhostParticles(self, d, prop_list) UnpackGhostParticles(self, step, prop_list)
@pairs_inline @pairs_inline
def borders(self): def borders(self):
prop_list = [self.sim.property(p) for p in ['mass', 'position']] prop_list = [self.sim.property(p) for p in ['mass', 'position']]
self.nsend_all.set(0) self.nsend_all.set(0)
for d in range(self.sim.ndims()): for step in range(self.dom_part.number_of_steps()):
DetermineGhostParticles(self, d, self.sim.cell_spacing()) DetermineGhostParticles(self, step, self.sim.cell_spacing())
CommunicateSizes(self, d) CommunicateSizes(self, step)
SetCommunicationOffsets(self, d) SetCommunicationOffsets(self, step)
PackGhostParticles(self, d, prop_list) PackGhostParticles(self, step, prop_list)
CommunicateData(self, d, prop_list) CommunicateData(self, step, prop_list)
UnpackGhostParticles(self, d, prop_list) UnpackGhostParticles(self, step, prop_list)
@pairs_inline @pairs_inline
def exchange(self): def exchange(self):
prop_list = [self.sim.property(p) for p in ['mass', 'position', 'velocity']] prop_list = [self.sim.property(p) for p in ['mass', 'position', 'velocity']]
for d in range(self.sim.ndims()): for step in range(self.dom_part.number_of_steps()):
DetermineGhostParticles(self, d, 0.0) self.nsend_all.set(0)
PackGhostParticles(self, d, prop_list) DetermineGhostParticles(self, step, 0.0)
PackGhostParticles(self, step, prop_list)
RemoveExchangedParticles_part1(self) RemoveExchangedParticles_part1(self)
RemoveExchangedParticles_part2(self, prop_list) RemoveExchangedParticles_part2(self, prop_list)
CommunicateSizes(self, d) CommunicateSizes(self, step)
CommunicateData(self, d, prop_list) CommunicateData(self, step, prop_list)
ChangeSizeAfterExchange(self) ChangeSizeAfterExchange(self, step)
UnpackGhostParticles(self, d, prop_list) UnpackGhostParticles(self, step, prop_list)
class CommunicateSizes(Lowerable): class CommunicateSizes(Lowerable):
...@@ -135,9 +136,13 @@ class SetCommunicationOffsets(Lowerable): ...@@ -135,9 +136,13 @@ class SetCommunicationOffsets(Lowerable):
recv_offsets = self.comm.recv_offsets recv_offsets = self.comm.recv_offsets
self.sim.module_name(f"set_communication_offsets{self.step}") self.sim.module_name(f"set_communication_offsets{self.step}")
isend = 0
irecv = 0
for j in self.comm.dom_part.step_indexes(self.step): for j in self.comm.dom_part.step_indexes(self.step):
send_offsets[j].set(send_offsets[j - 1] + nsend[j - 1] if j > 0 else 0) send_offsets[j].set(isend)
recv_offsets[j].set(recv_offsets[j - 1] + nrecv[j - 1] if j > 0 else 0) recv_offsets[j].set(irecv)
isend += nsend[j]
irecv += nrecv[j]
class PackGhostParticles(Lowerable): class PackGhostParticles(Lowerable):
...@@ -159,7 +164,9 @@ class PackGhostParticles(Lowerable): ...@@ -159,7 +164,9 @@ class PackGhostParticles(Lowerable):
elems_per_particle = self.get_elems_per_particle() elems_per_particle = self.get_elems_per_particle()
self.sim.module_name(f"pack_ghost_particles{self.step}_" + "_".join([str(p.id()) for p in self.prop_list])) self.sim.module_name(f"pack_ghost_particles{self.step}_" + "_".join([str(p.id()) for p in self.prop_list]))
for i in For(self.sim, 0, sum([self.comm.nsend[j] for j in self.comm.dom_part.step_indexes(self.step)])): step_indexes = self.comm.dom_part.step_indexes(self.step)
start = self.comm.send_offsets[step_indexes[0]]
for i in For(self.sim, start, start + sum([self.comm.nsend[j] for j in step_indexes])):
p_offset = 0 p_offset = 0
m = send_map[i] m = send_map[i]
buffer_index = i * elems_per_particle buffer_index = i * elems_per_particle
...@@ -198,7 +205,9 @@ class UnpackGhostParticles(Lowerable): ...@@ -198,7 +205,9 @@ class UnpackGhostParticles(Lowerable):
elems_per_particle = self.get_elems_per_particle() elems_per_particle = self.get_elems_per_particle()
self.sim.module_name(f"unpack_ghost_particles{self.step}_" + "_".join([str(p.id()) for p in self.prop_list])) self.sim.module_name(f"unpack_ghost_particles{self.step}_" + "_".join([str(p.id()) for p in self.prop_list]))
for i in For(self.sim, 0, sum([self.comm.nrecv[j] for j in self.comm.dom_part.step_indexes(self.step)])): step_indexes = self.comm.dom_part.step_indexes(self.step)
start = self.comm.recv_offsets[step_indexes[0]]
for i in For(self.sim, start, start + sum([self.comm.nrecv[j] for j in step_indexes])):
p_offset = 0 p_offset = 0
buffer_index = i * elems_per_particle buffer_index = i * elems_per_particle
for p in self.prop_list: for p in self.prop_list:
...@@ -225,8 +234,8 @@ class RemoveExchangedParticles_part1(Lowerable): ...@@ -225,8 +234,8 @@ class RemoveExchangedParticles_part1(Lowerable):
self.sim.module_name("remove_exchanged_particles_pt1") self.sim.module_name("remove_exchanged_particles_pt1")
send_pos = self.sim.add_temp_var(self.sim.nparticles) send_pos = self.sim.add_temp_var(self.sim.nparticles)
for i in For(self.sim, 0, self.comm.nsend_all): for i in For(self.sim, 0, self.comm.nsend_all):
for is_local in Branch(self.sim, self.comm.send_map[i] < self.sim.nlocal - self.comm.nsend_all): for need_copy in Branch(self.sim, self.comm.send_map[i] < self.sim.nlocal - self.comm.nsend_all):
if is_local: if need_copy:
for _ in While(self.sim, BinOp.cmp(self.comm.exchg_flag[send_pos], 1)): for _ in While(self.sim, BinOp.cmp(self.comm.exchg_flag[send_pos], 1)):
send_pos.set(send_pos - 1) send_pos.set(send_pos - 1)
...@@ -263,14 +272,15 @@ class RemoveExchangedParticles_part2(Lowerable): ...@@ -263,14 +272,15 @@ class RemoveExchangedParticles_part2(Lowerable):
class ChangeSizeAfterExchange(Lowerable): class ChangeSizeAfterExchange(Lowerable):
def __init__(self, comm): def __init__(self, comm, step):
super().__init__(comm.sim) super().__init__(comm.sim)
self.comm = comm self.comm = comm
self.step = step
self.sim.add_statement(self) self.sim.add_statement(self)
@pairs_host_block @pairs_host_block
def lower(self): def lower(self):
sim = self.sim sim = self.sim
sim.module_name("change_size_after_exchange") sim.module_name(f"change_size_after_exchange{self.step}")
sim.check_resize(self.sim.particle_capacity, self.sim.nlocal) sim.check_resize(self.sim.particle_capacity, self.sim.nlocal)
self.sim.nlocal.set(sim.nlocal + self.comm.nrecv) self.sim.nlocal.set(sim.nlocal + sum([self.comm.nrecv[j] for j in self.comm.dom_part.step_indexes(self.step)]))
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment