diff --git a/cpp/full_code/test_tracer_set.cpp b/cpp/full_code/test_tracer_set.cpp index 836a3311917b00ad5c8cc29d9c0dc1e656a91335..74112e870fcfdaaac173f23aafae28b17fe8e8bb 100644 --- a/cpp/full_code/test_tracer_set.cpp +++ b/cpp/full_code/test_tracer_set.cpp @@ -80,15 +80,19 @@ int test_tracer_set<rnumber>::do_work(void) this->dkz); particles_input_random<long long int, double, 3> bla( - this->comm, 1000, 1, pset.getSpatialLowLimitZ(), pset.getSpatialUpLimitZ()); + this->comm, + 1000, + 1, + pset.getSpatialLowLimitZ(), + pset.getSpatialUpLimitZ()); fti->set_field(vec_field); trhs->setVelocity(fti); pset.init(bla); - //particle_solver psolver(pset); + particle_solver psolver(pset); - //psolver.Euler(0.1, *trhs); + psolver.Euler(0.1, *trhs); // deallocate delete trhs; diff --git a/cpp/particles/interpolation/particle_set.hpp b/cpp/particles/interpolation/particle_set.hpp index 6f7c82c1ca3a5f66aff90c5f4dd241d4a53b45e0..7330cfe80a8f50490879eb38c8dbb8ac6f62c949 100644 --- a/cpp/particles/interpolation/particle_set.hpp +++ b/cpp/particles/interpolation/particle_set.hpp @@ -135,6 +135,10 @@ class particle_set: public abstract_particle_set assert(IDXC_Y == 1); assert(IDXC_Z == 2); + DEBUG_MSG("current partition interval %d %d\n", + current_partition_interval.first, + current_partition_interval.second); + this->number_particles_per_partition.reset(new partsize_t[partition_interval_size]); this->offset_particles_for_partition.reset(new partsize_t[partition_interval_size+1]); } @@ -279,22 +283,30 @@ class particle_set: public abstract_particle_set this->local_index = particles_input.getMyParticlesIndexes(); this->local_number_of_particles = particles_input.getLocalNbParticles(); - //particles_utils::partition_extra_z<partsize_t, state_size>(&this->local_state[0], this->local_number_of_particles, partition_interval_size, - // this->local_number_of_particles_per_partition.get(), current_offset_particles_for_partition.get(), - //[&](const particle_rnumber& z_pos){ - // const int partition_level = this->pinterpolator.pbc_field_layer(z_pos, IDXC_Z); - // assert(current_partition_interval.first <= partition_level && partition_level < current_partition_interval.second); - // return partition_level - current_partition_interval.first; - //}, - //[&](const partsize_t idx1, const partsize_t idx2){ - // std::swap(this->local_index[idx1], this->local_index[idx2]); - // for(int idx_rhs = 0 ; idx_rhs < int(my_particles_rhs.size()) ; ++idx_rhs){ - // for(int idx_val = 0 ; idx_val < size_particle_rhs ; ++idx_val){ - // std::swap(my_particles_rhs[idx_rhs][idx1*size_particle_rhs + idx_val], - // my_particles_rhs[idx_rhs][idx2*size_particle_rhs + idx_val]); - // } - // } - //}); + for (partsize_t idx=0; idx < this->local_number_of_particles; idx++) + { + DEBUG_MSG_WAIT(this->mpi_comm, "idx = %d, z = %g\n", + this->local_index[idx], + this->local_state[idx*state_size+2]); + } + + particles_utils::partition_extra_z<partsize_t, state_size>( + &this->local_state[0], + this->local_number_of_particles, + partition_interval_size, + this->number_particles_per_partition.get(), + this->offset_particles_for_partition.get(), + [&](const particle_rnumber& z_pos){ + const int partition_level = this->pinterpolator.pbc_field_layer(z_pos, IDXC_Z); + DEBUG_MSG("z_pos = %g, partition_level is %d\n", + z_pos, + partition_level); + assert(current_partition_interval.first <= partition_level && partition_level < current_partition_interval.second); + return partition_level - current_partition_interval.first; + }, + [&](const partsize_t idx1, const partsize_t idx2){ + std::swap(this->local_index[idx1], this->local_index[idx2]); + }); return EXIT_SUCCESS; } diff --git a/cpp/particles/particles_distr_mpi.hpp b/cpp/particles/particles_distr_mpi.hpp index 2cc73cd5d732ec3fd5877ae5d5a5fbc694f2f913..17dc121646ae54883a709a8a5009b60a64d209b7 100644 --- a/cpp/particles/particles_distr_mpi.hpp +++ b/cpp/particles/particles_distr_mpi.hpp @@ -182,6 +182,10 @@ public: partsize_t myTotalNbParticles = 0; for(int idxPartition = 0 ; idxPartition < current_partition_size ; ++idxPartition){ myTotalNbParticles += current_my_nb_particles_per_partition[idxPartition]; + DEBUG_MSG("idxPartition = %d, current_offset_particles_for_partition = %d, current_my_nb_particles_per_partition = %d\n", + idxPartition, + current_offset_particles_for_partition[idxPartition], + current_my_nb_particles_per_partition[idxPartition]); current_offset_particles_for_partition[idxPartition+1] = current_offset_particles_for_partition[idxPartition] + current_my_nb_particles_per_partition[idxPartition]; } @@ -211,7 +215,10 @@ public: const int nbPartitionsToSend = std::min(current_partition_size, interpolation_size-(idxLower-1)); assert(nbPartitionsToSend >= 0); + DEBUG_MSG("idxLower = %d, nbPartitionsToSend = %d, current_offset_particles_for_partition = %d, current_offset_particles_for_partition[0] = %d\n", + idxLower, nbPartitionsToSend, current_offset_particles_for_partition[nbPartitionsToSend], current_offset_particles_for_partition[0]); const partsize_t nbParticlesToSend = current_offset_particles_for_partition[nbPartitionsToSend] - current_offset_particles_for_partition[0]; + assert(nbParticlesToSend >= 0); const int nbPartitionsToRecv = std::min(partition_interval_size_per_proc[destProc], (interpolation_size+1)-(idxLower-1)); assert(nbPartitionsToRecv > 0); @@ -558,6 +565,11 @@ public: for(partsize_t idx = 0 ; idx < current_my_nb_particles_per_partition[idxPartition] ; ++idx){ const int partition_level = in_computer.pbc_field_layer((*inout_positions_particles)[(idx+partOffset)*size_particle_positions+IDXC_Z], IDXC_Z); variable_used_only_in_assert(partition_level); + DEBUG_MSG("partition_level = %d, current_parition_interval.first = %d, idxPartition = %d\n", + partition_level, + current_partition_interval.first, + idxPartition + ); assert(partition_level == current_partition_interval.first + idxPartition || partition_level == (current_partition_interval.first + idxPartition-1+int(field_grid_dim[IDXC_Z]))%int(field_grid_dim[IDXC_Z]) || partition_level == (current_partition_interval.first + idxPartition+1)%int(field_grid_dim[IDXC_Z])); diff --git a/cpp/particles/particles_input_random.hpp b/cpp/particles/particles_input_random.hpp index 7d5bacefddb3c9a81fe93ecd007c7cdcad657549..d862acc30ada993b1f8cefc1cd68a2bf0f274218 100644 --- a/cpp/particles/particles_input_random.hpp +++ b/cpp/particles/particles_input_random.hpp @@ -64,6 +64,7 @@ class particles_input_random: public abstract_particles_input<partsize_t, partic // initialize a separate random number generator for each MPI process std::mt19937_64 rgen; std::uniform_real_distribution<particle_rnumber> udist(0.0, 1.0); + std::uniform_real_distribution<particle_rnumber> uzdist(my_spatial_low_limit, my_spatial_up_limit); std::normal_distribution<particle_rnumber> gdist; // seed random number generators such that no seed is ever repeated if we change the value of rseed. // basically use a multi-dimensional array indexing technique to come up with actual seed. @@ -96,10 +97,11 @@ class particles_input_random: public abstract_particles_input<partsize_t, partic this->nprocs*(this->total_number_of_particles/this->nprocs) + std::min(partsize_t(this->myrank), partsize_t(this->total_number_of_particles%this->nprocs))); for (int cc=0; cc < 2; cc++) - this->local_particle_state[cc] = twopi*udist(rgen); - this->local_particle_state[2] = udist(rgen)*(my_spatial_up_limit - my_spatial_low_limit) + my_spatial_low_limit; + this->local_particle_state[idx*state_size + cc] = twopi*udist(rgen); + this->local_particle_state[idx*state_size + 2] = uzdist(rgen); + DEBUG_MSG("zpos = %g\n", this->local_particle_state[idx*state_size + 2]); for (int cc = 3; cc < state_size; cc++) - this->local_particle_state[cc] = gdist(rgen); + this->local_particle_state[idx*state_size + cc] = gdist(rgen); } }