From c926a2e3e8d625f956ca998dbab8511a5fa6faab Mon Sep 17 00:00:00 2001 From: Pablo Seleson Date: Fri, 21 Jul 2023 16:39:00 -0400 Subject: [PATCH 1/4] Add optional current position output (in addition to reference) Co-authored-by: Sam Reeve <6740307+streeve@users.noreply.github.com> --- examples/crack_branching.cpp | 2 +- examples/elastic_wave.cpp | 4 +-- examples/kalthoff_winkler.cpp | 2 +- src/CabanaPD_Boundary.hpp | 6 ++--- src/CabanaPD_Comm.hpp | 2 +- src/CabanaPD_Force.hpp | 16 ++++++------ src/CabanaPD_Particles.hpp | 49 +++++++++++++++++++++++++---------- src/CabanaPD_Prenotch.hpp | 2 +- src/CabanaPD_Solver.hpp | 2 +- unit_test/tstComm.hpp | 4 +-- unit_test/tstForce.hpp | 6 ++--- unit_test/tstIntegrator.hpp | 4 +-- 12 files changed, 61 insertions(+), 38 deletions(-) diff --git a/examples/crack_branching.cpp b/examples/crack_branching.cpp index 356e22bc..4cbf682b 100644 --- a/examples/crack_branching.cpp +++ b/examples/crack_branching.cpp @@ -91,7 +91,7 @@ int main( int argc, char* argv[] ) inputs.num_cells, halo_width ); // Define particle initialization. - auto x = particles->sliceRefPosition(); + auto x = particles->sliceReferencePosition(); auto v = particles->sliceVelocity(); auto f = particles->sliceForce(); auto rho = particles->sliceDensity(); diff --git a/examples/elastic_wave.cpp b/examples/elastic_wave.cpp index 9b89ae52..4ca4112e 100644 --- a/examples/elastic_wave.cpp +++ b/examples/elastic_wave.cpp @@ -64,7 +64,7 @@ int main( int argc, char* argv[] ) inputs.num_cells, halo_width ); // Define particle initialization. - auto x = particles->sliceRefPosition(); + auto x = particles->sliceReferencePosition(); auto u = particles->sliceDisplacement(); auto v = particles->sliceVelocity(); auto rho = particles->sliceDensity(); @@ -96,7 +96,7 @@ int main( int argc, char* argv[] ) cabana_pd->init_force(); cabana_pd->run(); - x = particles->sliceRefPosition(); + x = particles->sliceReferencePosition(); u = particles->sliceDisplacement(); double num_cell_x = inputs.num_cells[0]; auto profile = Kokkos::View( diff --git a/examples/kalthoff_winkler.cpp b/examples/kalthoff_winkler.cpp index 4315b55c..d7065e5d 100644 --- a/examples/kalthoff_winkler.cpp +++ b/examples/kalthoff_winkler.cpp @@ -95,7 +95,7 @@ int main( int argc, char* argv[] ) inputs.num_cells, halo_width ); // Define particle initialization. - auto x = particles->sliceRefPosition(); + auto x = particles->sliceReferencePosition(); auto v = particles->sliceVelocity(); auto f = particles->sliceForce(); auto rho = particles->sliceDensity(); diff --git a/src/CabanaPD_Boundary.hpp b/src/CabanaPD_Boundary.hpp index d0cb8e31..2e45522f 100644 --- a/src/CabanaPD_Boundary.hpp +++ b/src/CabanaPD_Boundary.hpp @@ -87,7 +87,7 @@ struct BoundaryIndexSpace auto index_space = _view; auto count = _count; - auto x = particles.sliceRefPosition(); + auto x = particles.sliceReferencePosition(); Kokkos::RangePolicy policy( 0, particles.n_local ); auto index_functor = KOKKOS_LAMBDA( const std::size_t pid ) { @@ -163,7 +163,7 @@ struct BoundaryCondition void apply( ExecSpace, ParticleType& particles ) { auto f = particles.sliceForce(); - auto x = particles.sliceRefPosition(); + auto x = particles.sliceReferencePosition(); auto index_space = _index_space._view; Kokkos::RangePolicy policy( 0, index_space.size() ); auto value = _value; @@ -234,7 +234,7 @@ struct BoundaryCondition void apply( ExecSpace, ParticleType& particles ) { auto f = particles.sliceForce(); - auto x = particles.sliceRefPosition(); + auto x = particles.sliceReferencePosition(); auto index_space = _index_space._view; Kokkos::RangePolicy policy( 0, index_space.size() ); auto value = _value; diff --git a/src/CabanaPD_Comm.hpp b/src/CabanaPD_Comm.hpp index 940a383a..fa6f443b 100644 --- a/src/CabanaPD_Comm.hpp +++ b/src/CabanaPD_Comm.hpp @@ -251,7 +251,7 @@ class Comm MPI_Comm_size( local_grid->globalGrid().comm(), &mpi_size ); MPI_Comm_rank( local_grid->globalGrid().comm(), &mpi_rank ); - auto positions = particles.sliceRefPosition(); + auto positions = particles.sliceReferencePosition(); // Get all 26 neighbor ranks. auto halo_width = local_grid->haloCellWidth(); auto topology = Cajita::getTopology( *local_grid ); diff --git a/src/CabanaPD_Force.hpp b/src/CabanaPD_Force.hpp index 4bf05ca9..13f52459 100644 --- a/src/CabanaPD_Force.hpp +++ b/src/CabanaPD_Force.hpp @@ -402,7 +402,7 @@ class Force> const ParallelType neigh_op_tag ) { auto n_local = particles.n_local; - auto x = particles.sliceRefPosition(); + auto x = particles.sliceReferencePosition(); auto u = particles.sliceDisplacement(); const auto vol = particles.sliceVolume(); auto m = particles.sliceWeightedVolume(); @@ -430,7 +430,7 @@ class Force> const ParallelType neigh_op_tag ) const { auto n_local = particles.n_local; - const auto x = particles.sliceRefPosition(); + const auto x = particles.sliceReferencePosition(); auto u = particles.sliceDisplacement(); const auto vol = particles.sliceVolume(); auto m = particles.sliceWeightedVolume(); @@ -567,7 +567,7 @@ class Force> const MuView& mu ) { auto n_local = particles.n_local; - auto x = particles.sliceRefPosition(); + auto x = particles.sliceReferencePosition(); auto u = particles.sliceDisplacement(); const auto vol = particles.sliceVolume(); auto m = particles.sliceWeightedVolume(); @@ -606,7 +606,7 @@ class Force> const MuView& mu ) const { auto n_local = particles.n_local; - const auto x = particles.sliceRefPosition(); + const auto x = particles.sliceReferencePosition(); auto u = particles.sliceDisplacement(); const auto vol = particles.sliceVolume(); auto m = particles.sliceWeightedVolume(); @@ -1210,7 +1210,7 @@ void computeForce( const ForceType& force, ParticleType& particles, const ParallelType& neigh_op_tag ) { auto n_local = particles.n_local; - auto x = particles.sliceRefPosition(); + auto x = particles.sliceReferencePosition(); auto u = particles.sliceDisplacement(); auto f = particles.sliceForce(); auto f_a = particles.sliceForceAtomic(); @@ -1240,7 +1240,7 @@ double computeEnergy( const ForceType force, ParticleType& particles, const ParallelType& neigh_op_tag ) { auto n_local = particles.n_local; - auto x = particles.sliceRefPosition(); + auto x = particles.sliceReferencePosition(); auto u = particles.sliceDisplacement(); auto f = particles.sliceForce(); auto W = particles.sliceStrainEnergy(); @@ -1269,7 +1269,7 @@ void computeForce( const ForceType& force, ParticleType& particles, const ParallelType& neigh_op_tag ) { auto n_local = particles.n_local; - auto x = particles.sliceRefPosition(); + auto x = particles.sliceReferencePosition(); auto u = particles.sliceDisplacement(); auto f = particles.sliceForce(); auto f_a = particles.sliceForceAtomic(); @@ -1300,7 +1300,7 @@ double computeEnergy( const ForceType force, ParticleType& particles, const ParallelType& neigh_op_tag ) { auto n_local = particles.n_local; - auto x = particles.sliceRefPosition(); + auto x = particles.sliceReferencePosition(); auto u = particles.sliceDisplacement(); auto f = particles.sliceForce(); auto W = particles.sliceStrainEnergy(); diff --git a/src/CabanaPD_Particles.hpp b/src/CabanaPD_Particles.hpp index 94dde8f8..40f20343 100644 --- a/src/CabanaPD_Particles.hpp +++ b/src/CabanaPD_Particles.hpp @@ -111,6 +111,7 @@ class Particles // FIXME: enable variable aosoa. using aosoa_x_type = Cabana::AoSoA; using aosoa_u_type = Cabana::AoSoA; + using aosoa_y_type = Cabana::AoSoA; using aosoa_f_type = Cabana::AoSoA; using aosoa_vol_type = Cabana::AoSoA; using aosoa_nofail_type = Cabana::AoSoA; @@ -213,12 +214,13 @@ class Particles int num_particles = particles_per_cell * owned_cells.size(); resize( num_particles, 0 ); - auto x = sliceRefPosition(); + auto x = sliceReferencePosition(); auto v = sliceVelocity(); auto f = sliceForce(); auto type = sliceType(); auto rho = sliceDensity(); auto u = sliceDisplacement(); + auto y = sliceCurrentPosition(); auto vol = sliceVolume(); auto nofail = sliceNoFail(); @@ -253,6 +255,7 @@ class Particles { x( pid, d ) = cell_coord[d]; u( pid, d ) = 0.0; + y( pid, d ) = 0.0; v( pid, d ) = 0.0; f( pid, d ) = 0.0; } @@ -295,13 +298,21 @@ class Particles KOKKOS_LAMBDA( const int pid ) { init_functor( pid ); } ); } - auto sliceRefPosition() + auto sliceReferencePosition() { - return Cabana::slice<0>( _aosoa_x, "positions" ); + return Cabana::slice<0>( _aosoa_x, "reference_positions" ); } - auto sliceRefPosition() const + auto sliceReferencePosition() const { - return Cabana::slice<0>( _aosoa_x, "positions" ); + return Cabana::slice<0>( _aosoa_x, "reference_positions" ); + } + auto sliceCurrentPosition() + { + return Cabana::slice<0>( _aosoa_y, "current_positions" ); + } + auto sliceCurrentPosition() const + { + return Cabana::slice<0>( _aosoa_y, "current_positions" ); } auto sliceDisplacement() { @@ -369,6 +380,7 @@ class Particles _aosoa_x.resize( new_local + new_ghost ); _aosoa_u.resize( new_local + new_ghost ); + _aosoa_y.resize( new_local + new_ghost ); _aosoa_vol.resize( new_local + new_ghost ); _aosoa_f.resize( new_local ); _aosoa_other.resize( new_local ); @@ -376,19 +388,28 @@ class Particles size = _aosoa_x.size(); }; - void output( const int output_step, const double output_time ) + auto getPosition( const bool use_reference ) + { + if ( use_reference ) + return sliceReferencePosition(); + else + return sliceCurrentPosition(); + } + + void output( const int output_step, const double output_time, + const bool use_reference = true ) { #ifdef Cabana_ENABLE_HDF5 Cabana::Experimental::HDF5ParticleOutput::writeTimeStep( h5_config, "particles", MPI_COMM_WORLD, output_step, output_time, - n_local, sliceRefPosition(), sliceStrainEnergy(), sliceForce(), - sliceDisplacement(), sliceVelocity(), sliceDamage() ); + n_local, getPosition( use_reference ), sliceStrainEnergy(), + sliceForce(), sliceDisplacement(), sliceVelocity(), sliceDamage() ); #else #ifdef Cabana_ENABLE_SILO Cajita::Experimental::SiloParticleOutput::writePartialRangeTimeStep( "particles", local_grid->globalGrid(), output_step, output_time, 0, - n_local, sliceRefPosition(), sliceStrainEnergy(), sliceForce(), - sliceDisplacement(), sliceVelocity(), sliceDamage() ); + n_local, getPosition( use_reference ), sliceStrainEnergy(), + sliceForce(), sliceDisplacement(), sliceVelocity(), sliceDamage() ); #else log( std::cout, "No particle output enabled for step ", output_step, " (", output_time, ")" ); @@ -401,6 +422,7 @@ class Particles protected: aosoa_x_type _aosoa_x; aosoa_u_type _aosoa_u; + aosoa_y_type _aosoa_y; aosoa_f_type _aosoa_f; aosoa_vol_type _aosoa_vol; aosoa_nofail_type _aosoa_nofail; @@ -505,12 +527,13 @@ class Particles _aosoa_m.resize( new_local + new_ghost ); } - void output( const int output_step, const double output_time ) + void output( const int output_step, const double output_time, + const bool use_reference = true ) { #ifdef Cabana_ENABLE_HDF5 Cabana::Experimental::HDF5ParticleOutput::writeTimeStep( h5_config, "particles", MPI_COMM_WORLD, output_step, output_time, - n_local, base_type::sliceRefPosition(), + n_local, base_type::getPosition( use_reference ), base_type::sliceStrainEnergy(), base_type::sliceForce(), base_type::sliceDisplacement(), base_type::sliceVelocity(), base_type::sliceDamage(), sliceWeightedVolume(), @@ -519,7 +542,7 @@ class Particles #ifdef Cabana_ENABLE_SILO Cajita::Experimental::SiloParticleOutput::writePartialRangeTimeStep( "particles", local_grid->globalGrid(), output_step, output_time, 0, - n_local, base_type::sliceRefPosition(), + n_local, base_type::getPosition( use_reference ), base_type::sliceStrainEnergy(), base_type::sliceForce(), base_type::sliceDisplacement(), base_type::sliceVelocity(), base_type::sliceDamage(), sliceWeightedVolume(), diff --git a/src/CabanaPD_Prenotch.hpp b/src/CabanaPD_Prenotch.hpp index dec33edf..d29aa794 100644 --- a/src/CabanaPD_Prenotch.hpp +++ b/src/CabanaPD_Prenotch.hpp @@ -218,7 +218,7 @@ struct Prenotch void create( ExecSpace, NeighborView& mu, Particles& particles, Neighbors& neighbors ) { - auto x = particles.sliceRefPosition(); + auto x = particles.sliceReferencePosition(); Kokkos::RangePolicy policy( 0, particles.n_local ); auto v1 = _v1; diff --git a/src/CabanaPD_Solver.hpp b/src/CabanaPD_Solver.hpp index 1a895ddf..ac5a94be 100644 --- a/src/CabanaPD_Solver.hpp +++ b/src/CabanaPD_Solver.hpp @@ -140,7 +140,7 @@ class SolverElastic double mesh_max[3] = { particles->ghost_mesh_hi[0], particles->ghost_mesh_hi[1], particles->ghost_mesh_hi[2] }; - auto x = particles->sliceRefPosition(); + auto x = particles->sliceReferencePosition(); neighbors = std::make_shared( x, 0, particles->n_local, force_model.delta, 1.0, mesh_min, mesh_max ); diff --git a/unit_test/tstComm.hpp b/unit_test/tstComm.hpp index 3b4a274e..c838bcee 100644 --- a/unit_test/tstComm.hpp +++ b/unit_test/tstComm.hpp @@ -58,7 +58,7 @@ void testHalo() // No ints are communicated in CabanaPD. We use the volume field for MPI // rank here for convenience. auto rank = particles.sliceVolume(); - auto x = particles.sliceRefPosition(); + auto x = particles.sliceReferencePosition(); auto init_functor = KOKKOS_LAMBDA( const int pid ) { rank( pid ) = static_cast( current_rank ); @@ -78,7 +78,7 @@ void testHalo() CabanaPD::Comm comm( particles ); HostAoSoA aosoa_host( "host_aosoa", particles.size ); - x = particles.sliceRefPosition(); + x = particles.sliceReferencePosition(); rank = particles.sliceVolume(); auto x_host = Cabana::slice<0>( aosoa_host ); auto rank_host = Cabana::slice<1>( aosoa_host ); diff --git a/unit_test/tstForce.hpp b/unit_test/tstForce.hpp index 0f643dd0..82d524d4 100644 --- a/unit_test/tstForce.hpp +++ b/unit_test/tstForce.hpp @@ -386,7 +386,7 @@ createParticles( ModelType, LinearTag, const double dx, const double s0 ) CabanaPD::Particles; ptype particles( TEST_EXECSPACE{}, box_min, box_max, num_cells, 0 ); - auto x = particles.sliceRefPosition(); + auto x = particles.sliceReferencePosition(); auto u = particles.sliceDisplacement(); auto v = particles.sliceVelocity(); auto init_functor = KOKKOS_LAMBDA( const int pid ) @@ -414,7 +414,7 @@ createParticles( ModelType, QuadraticTag, const double dx, const double s0 ) using ptype = CabanaPD::Particles; ptype particles( TEST_EXECSPACE{}, box_min, box_max, num_cells, 0 ); - auto x = particles.sliceRefPosition(); + auto x = particles.sliceReferencePosition(); auto u = particles.sliceDisplacement(); auto v = particles.sliceVelocity(); auto init_functor = KOKKOS_LAMBDA( const int pid ) @@ -702,7 +702,7 @@ void testForce( ModelType model, const DamageType damage_tag, const double dx, Cabana::VerletList; // Add to delta to make sure neighbors are found. - auto x = particles.sliceRefPosition(); + auto x = particles.sliceReferencePosition(); verlet_list neigh_list( x, 0, particles.n_local, model.delta + 1e-14, 1.0, mesh_min, mesh_max ); int max_neighbors = diff --git a/unit_test/tstIntegrator.hpp b/unit_test/tstIntegrator.hpp index ec735bd9..22e92100 100644 --- a/unit_test/tstIntegrator.hpp +++ b/unit_test/tstIntegrator.hpp @@ -45,7 +45,7 @@ void testIntegratorReversibility( int steps ) CabanaPD::Particles particles( exec_space(), box_min, box_max, num_cells, 0 ); - auto x = particles.sliceRefPosition(); + auto x = particles.sliceReferencePosition(); std::size_t num_particle = x.size(); CabanaPD::Integrator integrator( 0.001 ); @@ -86,7 +86,7 @@ void testIntegratorReversibility( int steps ) Cabana::deep_copy( x_final, x ); // Check the results - x = particles.sliceRefPosition(); + x = particles.sliceReferencePosition(); for ( std::size_t p = 0; p < num_particle; ++p ) for ( std::size_t d = 0; d < 3; ++d ) EXPECT_DOUBLE_EQ( x_final( p, d ), x_init( p, d ) ); From 336f2fa350424f15c77ae484a6dabdce57efe3cd Mon Sep 17 00:00:00 2001 From: Sam Reeve <6740307+streeve@users.noreply.github.com> Date: Mon, 24 Jul 2023 13:25:19 -0400 Subject: [PATCH 2/4] fixup: allow unused if no particle output enabled --- src/CabanaPD_Particles.hpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/CabanaPD_Particles.hpp b/src/CabanaPD_Particles.hpp index 40f20343..ded0430d 100644 --- a/src/CabanaPD_Particles.hpp +++ b/src/CabanaPD_Particles.hpp @@ -396,8 +396,9 @@ class Particles return sliceCurrentPosition(); } - void output( const int output_step, const double output_time, - const bool use_reference = true ) + void output( [[maybe_unused]] const int output_step, + [[maybe_unused]] const double output_time, + [[maybe_unused]] const bool use_reference = true ) { #ifdef Cabana_ENABLE_HDF5 Cabana::Experimental::HDF5ParticleOutput::writeTimeStep( @@ -411,8 +412,7 @@ class Particles n_local, getPosition( use_reference ), sliceStrainEnergy(), sliceForce(), sliceDisplacement(), sliceVelocity(), sliceDamage() ); #else - log( std::cout, "No particle output enabled for step ", output_step, - " (", output_time, ")" ); + log( std::cout, "No particle output enabled." ); #endif #endif } @@ -527,8 +527,9 @@ class Particles _aosoa_m.resize( new_local + new_ghost ); } - void output( const int output_step, const double output_time, - const bool use_reference = true ) + void output( [[maybe_unused]] const int output_step, + [[maybe_unused]] const double output_time, + [[maybe_unused]] const bool use_reference = true ) { #ifdef Cabana_ENABLE_HDF5 Cabana::Experimental::HDF5ParticleOutput::writeTimeStep( @@ -548,8 +549,7 @@ class Particles base_type::sliceDamage(), sliceWeightedVolume(), sliceDilatation() ); #else - log( std::cout, "No particle output enabled for ", output_step, "(", - output_time, ")" ); + log( std::cout, "No particle output enabled." ); #endif #endif } From cf0ab2818c32d100fb24fcbfbee83095f06db3ff Mon Sep 17 00:00:00 2001 From: Sam Reeve <6740307+streeve@users.noreply.github.com> Date: Tue, 29 Aug 2023 09:35:42 -0400 Subject: [PATCH 3/4] Add current position option to solver and examples --- examples/crack_branching.cpp | 3 ++- examples/elastic_wave.cpp | 3 ++- examples/kalthoff_winkler.cpp | 3 ++- src/CabanaPD_Input.hpp | 4 +++- src/CabanaPD_Solver.hpp | 11 +++++++---- 5 files changed, 16 insertions(+), 8 deletions(-) diff --git a/examples/crack_branching.cpp b/examples/crack_branching.cpp index 4cbf682b..9f659346 100644 --- a/examples/crack_branching.cpp +++ b/examples/crack_branching.cpp @@ -49,6 +49,7 @@ int main( int argc, char* argv[] ) double t_final = 43e-6; double dt = 5e-8; double output_frequency = 5; + bool output_reference = true; // Material constants double E = 72e+9; // [Pa] @@ -79,7 +80,7 @@ int main( int argc, char* argv[] ) CabanaPD::ForceModel; model_type force_model( delta, K, G0 ); CabanaPD::Inputs<3> inputs( num_cell, low_corner, high_corner, t_final, - dt, output_frequency ); + dt, output_frequency, output_reference ); inputs.read_args( argc, argv ); // Create particles from mesh. diff --git a/examples/elastic_wave.cpp b/examples/elastic_wave.cpp index 4ca4112e..1fb59e24 100644 --- a/examples/elastic_wave.cpp +++ b/examples/elastic_wave.cpp @@ -35,6 +35,7 @@ int main( int argc, char* argv[] ) double t_final = 0.6; double dt = 0.01; int output_frequency = 5; + bool output_reference = true; double K = 1.0; double G = 0.5; double delta = 0.075; @@ -51,7 +52,7 @@ int main( int argc, char* argv[] ) model_type force_model( delta, K, G ); CabanaPD::Inputs<3> inputs( num_cell, low_corner, high_corner, t_final, - dt, output_frequency ); + dt, output_frequency, output_reference ); inputs.read_args( argc, argv ); // Create particles from mesh. diff --git a/examples/kalthoff_winkler.cpp b/examples/kalthoff_winkler.cpp index d7065e5d..2110c55c 100644 --- a/examples/kalthoff_winkler.cpp +++ b/examples/kalthoff_winkler.cpp @@ -46,6 +46,7 @@ int main( int argc, char* argv[] ) double t_final = 70e-6; double dt = 0.133e-6; int output_frequency = 10; + bool output_reference = true; // Material constants double E = 191e+9; // [Pa] @@ -82,7 +83,7 @@ int main( int argc, char* argv[] ) // CabanaPD::ForceModel; // model_type force_model( delta, K, G, G0 ); CabanaPD::Inputs<3> inputs( num_cell, low_corner, high_corner, t_final, - dt, output_frequency ); + dt, output_frequency, output_reference ); inputs.read_args( argc, argv ); // Create particles from mesh. diff --git a/src/CabanaPD_Input.hpp b/src/CabanaPD_Input.hpp index b7be304f..51b28f59 100644 --- a/src/CabanaPD_Input.hpp +++ b/src/CabanaPD_Input.hpp @@ -34,18 +34,20 @@ class Inputs double final_time; double timestep; int output_frequency; + bool output_reference; bool half_neigh = false; Inputs( const std::array nc, std::array lc, std::array hc, const double t_f, const double dt, - const int of ) + const int of, const bool output_ref ) : num_cells( nc ) , low_corner( lc ) , high_corner( hc ) , final_time( t_f ) , timestep( dt ) , output_frequency( of ) + , output_reference( output_ref ) { num_steps = final_time / timestep; } diff --git a/src/CabanaPD_Solver.hpp b/src/CabanaPD_Solver.hpp index ac5a94be..81cf8934 100644 --- a/src/CabanaPD_Solver.hpp +++ b/src/CabanaPD_Solver.hpp @@ -126,6 +126,7 @@ class SolverElastic num_steps = inputs->num_steps; output_frequency = inputs->output_frequency; + output_reference = inputs->output_reference; // Create integrator. integrator = std::make_shared( inputs->timestep ); @@ -188,7 +189,7 @@ class SolverElastic computeForce( *force, *particles, *neighbors, neigh_iter_tag{} ); computeEnergy( *force, *particles, *neighbors, neigh_iter_tag() ); - particles->output( 0, 0.0 ); + particles->output( 0, 0.0, output_reference ); init_time += init_timer.seconds(); } @@ -238,7 +239,7 @@ class SolverElastic step_output( step, W ); particles->output( step / output_frequency, - step * inputs->timestep ); + step * inputs->timestep, output_reference ); } other_time += other_timer.seconds(); } @@ -305,6 +306,7 @@ class SolverElastic int num_steps; int output_frequency; + bool output_reference; protected: std::shared_ptr particles; @@ -391,7 +393,7 @@ class SolverFracture // Add boundary condition. boundary_condition.apply( exec_space(), *particles ); - particles->output( 0, 0.0 ); + particles->output( 0, 0.0, output_reference ); init_time += init_timer.seconds(); } @@ -450,7 +452,7 @@ class SolverFracture this->step_output( step, W ); particles->output( step / output_frequency, - step * inputs->timestep ); + step * inputs->timestep, output_reference ); } other_time += other_timer.seconds(); } @@ -461,6 +463,7 @@ class SolverFracture using base_type::num_steps; using base_type::output_frequency; + using base_type::output_reference; protected: using base_type::comm; From fc617462edffa53ba739f285d34e2573e5eadfbf Mon Sep 17 00:00:00 2001 From: Sam Reeve <6740307+streeve@users.noreply.github.com> Date: Tue, 29 Aug 2023 09:52:03 -0400 Subject: [PATCH 4/4] Calculate x+u automatically inside slice --- src/CabanaPD_Particles.hpp | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/CabanaPD_Particles.hpp b/src/CabanaPD_Particles.hpp index ded0430d..f0c80227 100644 --- a/src/CabanaPD_Particles.hpp +++ b/src/CabanaPD_Particles.hpp @@ -88,6 +88,7 @@ class Particles using self_type = Particles; using device_type = DeviceType; using memory_space = typename device_type::memory_space; + using execution_space = typename memory_space::execution_space; static constexpr int dim = Dimension; // Per particle. @@ -308,10 +309,14 @@ class Particles } auto sliceCurrentPosition() { + // Update before returning data. + updateCurrentPosition(); return Cabana::slice<0>( _aosoa_y, "current_positions" ); } auto sliceCurrentPosition() const { + // Update before returning data. + updateCurrentPosition(); return Cabana::slice<0>( _aosoa_y, "current_positions" ); } auto sliceDisplacement() @@ -373,6 +378,22 @@ class Particles return Cabana::slice<0>( _aosoa_nofail, "no_fail_region" ); } + void updateCurrentPosition() + { + // Not using slice function because this is called inside. + auto y = Cabana::slice<0>( _aosoa_y, "current_positions" ); + auto x = sliceReferencePosition(); + auto u = sliceDisplacement(); + Kokkos::RangePolicy policy( 0, n_local + n_ghost ); + auto sum_x_u = KOKKOS_LAMBDA( const std::size_t pid ) + { + for ( int d = 0; d < 3; d++ ) + y( pid, d ) = x( pid, d ) + u( pid, d ); + }; + Kokkos::parallel_for( "CabanaPD::CalculateCurrentPositions", policy, + sum_x_u ); + } + void resize( int new_local, int new_ghost ) { n_local = new_local;