11#ifndef PHYSICS_PARTICLES_HPP_
22#define PHYSICS_PARTICLES_HPP_
33
4+ #include < array>
45#include < cstdint>
56#include < map>
67#include < memory>
8+ #include < ranges>
79#include < string>
810
911#include < fmt/format.h>
@@ -136,18 +138,27 @@ class PhysicsParticleDescriptorBase
136138
137139 // ----- Methods that are implemented for some but not all particle types, so they cannot be pure virtual -----
138140
139- virtual auto depositSN (amrex::MultiFab & /* state*/ , int /* lev*/ , amrex::Real /* time*/ , amrex::Real /* dt*/ ) -> amrex::Real { return 0 .0_rt; }
141+ virtual auto depositSN (amrex::MultiFab & /* state*/ , std::array<amrex::MultiFab, AMREX_SPACEDIM> const * /* state_fc*/ , int /* lev*/ , amrex::Real /* time*/ ,
142+ amrex::Real /* dt*/ ) -> amrex::Real
143+ {
144+ return 0 .0_rt;
145+ }
140146
141- virtual void computeSinkAccretion (amrex::MultiFab &state, amrex::MultiFab &state_accretion_rate, int lev, amrex::Real time, amrex::Real dt)
142- { /* Default empty implementation */ }
147+ virtual void computeSinkAccretion (amrex::MultiFab &state, amrex::MultiFab &state_accretion_rate,
148+ std::array<amrex::MultiFab, AMREX_SPACEDIM> const *state_fc, int lev, amrex::Real time, amrex::Real dt)
149+ { /* Default empty implementation */
150+ }
143151
144152 // Create particles from hydro state at the finest level
145153 // Note: particles are not allowed to spawn outside of real cells. If they do, we will need a redistribution immediately after this call in order to
146154 // make particle-mesh interaction work.
147- virtual void createParticlesFromState (amrex::MultiFab &state, amrex::MultiFab &accretion_rate, int lev, amrex::Real current_time, amrex::Real dt)
148- { /* Default empty implementation */ }
155+ virtual void createParticlesFromState (amrex::MultiFab &state, amrex::MultiFab &accretion_rate, int lev, amrex::Real current_time, amrex::Real dt,
156+ std::array<amrex::MultiFab, AMREX_SPACEDIM> const *state_fc)
157+ { /* Default empty implementation */
158+ }
149159
150- virtual void applySinkAccretion (amrex::MultiFab &state, amrex::MultiFab &state_accretion_rate, const amrex::Geometry &geom, int lev, amrex::Real time,
160+ virtual void applySinkAccretion (amrex::MultiFab &state, amrex::MultiFab &state_accretion_rate,
161+ std::array<amrex::MultiFab, AMREX_SPACEDIM> const *state_fc, const amrex::Geometry &geom, int lev, amrex::Real time,
151162 amrex::Real dt)
152163 { /* Default empty implementation */
153164 }
@@ -562,7 +573,8 @@ template <typename ContainerType, typename problem_t, ParticleType particleType>
562573 }
563574
564575 // Implementation of supernova energy and momentum deposition from particles to grid
565- auto depositSN (amrex::MultiFab &state, int lev, amrex::Real time, amrex::Real dt) -> amrex::Real override
576+ auto depositSN (amrex::MultiFab &state, std::array<amrex::MultiFab, AMREX_SPACEDIM> const *state_fc, int lev, amrex::Real time, amrex::Real dt)
577+ -> amrex::Real override
566578 {
567579 amrex::Real max_velocity = 0.0 ;
568580
@@ -573,7 +585,7 @@ template <typename ContainerType, typename problem_t, ParticleType particleType>
573585 " UnitSystem must be CGS for particleMeshInteraction" );
574586
575587 // Deposit supernova energy and momentum from all particles. This also updates the evolution stage of the particles.
576- max_velocity = SNDeposition<ContainerType, problem_t >(this ->container_ , state, lev, time, dt, this ->getMassIndex (),
588+ max_velocity = SNDeposition<ContainerType, problem_t >(this ->container_ , state, state_fc, lev, time, dt, this ->getMassIndex (),
577589 this ->getEvolutionStageIndex (), this ->getBirthTimeIndex ());
578590 } else {
579591 // Only update evolution stage but not deposit energy/momentum
@@ -586,26 +598,28 @@ template <typename ContainerType, typename problem_t, ParticleType particleType>
586598 }
587599
588600 // compute accretion rate
589- void computeSinkAccretion (amrex::MultiFab &state, amrex::MultiFab &state_accretion_rate, int lev, amrex::Real time, amrex::Real dt) override
601+ void computeSinkAccretion (amrex::MultiFab &state, amrex::MultiFab &state_accretion_rate, std::array<amrex::MultiFab, AMREX_SPACEDIM> const *state_fc,
602+ int lev, amrex::Real time, amrex::Real dt) override
590603 {
591- SinkAccretionUtils::computeAccretion<ContainerType, problem_t >(this ->container_ , state, state_accretion_rate, lev, time, dt,
604+ SinkAccretionUtils::computeAccretion<ContainerType, problem_t >(this ->container_ , state, state_accretion_rate, state_fc, lev, time, dt,
592605 this ->getMassIndex ());
593606 }
594607
595608 // apply accretion
596- void applySinkAccretion (amrex::MultiFab &state, amrex::MultiFab &state_accretion_rate, const amrex::Geometry &geom, int lev, amrex::Real time ,
597- amrex::Real dt) override
609+ void applySinkAccretion (amrex::MultiFab &state, amrex::MultiFab &state_accretion_rate, std::array< amrex::MultiFab, AMREX_SPACEDIM> const *state_fc ,
610+ const amrex::Geometry &geom, int lev, amrex::Real time, amrex::Real dt) override
598611 {
599- SinkAccretionUtils::applyAccretion<ContainerType, problem_t >(this ->container_ , state, state_accretion_rate, geom, lev, time, dt,
612+ SinkAccretionUtils::applyAccretion<ContainerType, problem_t >(this ->container_ , state, state_accretion_rate, state_fc, geom, lev, time, dt,
600613 this ->getMassIndex ());
601614 }
602615
603- void createParticlesFromState (amrex::MultiFab &state, amrex::MultiFab &accretion_rate, int lev, amrex::Real current_time, amrex::Real dt) override
616+ void createParticlesFromState (amrex::MultiFab &state, amrex::MultiFab &accretion_rate, int lev, amrex::Real current_time, amrex::Real dt,
617+ std::array<amrex::MultiFab, AMREX_SPACEDIM> const *state_fc) override
604618 {
605619 // Use the traits class to implement the specialized behavior
606620 ParticleCreationTraits<particleType>::template createParticles<problem_t , ContainerType>(
607621 this ->container_ , this ->getMassIndex (), state, accretion_rate, lev, current_time, dt, this ->getEvolutionStageIndex (),
608- this ->getBirthTimeIndex ());
622+ this ->getBirthTimeIndex (), state_fc );
609623 }
610624#endif // AMREX_SPACEDIM == 3
611625};
@@ -756,37 +770,39 @@ template <typename problem_t> class PhysicsParticleRegister
756770 }
757771
758772 // Deposit supernova energy and momentum from all particles
759- auto depositSN (amrex::MultiFab &state, int lev, amrex::Real time, amrex::Real dt) -> amrex::Real
773+ auto depositSN (amrex::MultiFab &state, std::array<amrex::MultiFab, AMREX_SPACEDIM> const *state_fc, int lev, amrex::Real time, amrex::Real dt)
774+ -> amrex::Real
760775 {
761776 const BL_PROFILE (" PhysicsParticleRegister::depositSN()" );
762777 amrex::Real max_velocity = 0.0 ;
763778 // Each particle type handles its own buffer creation and roundoff independently
764779 for (const auto &[type, descriptor] : particleRegistry_) {
765- const amrex::Real max_velocity_ = descriptor->depositSN (state, lev, time, dt);
780+ const amrex::Real max_velocity_ = descriptor->depositSN (state, state_fc, lev, time, dt);
766781 max_velocity = std::max (max_velocity, max_velocity_);
767782 }
768783 return max_velocity;
769784 }
770785
771786 // Implementation of computeSinkAccretion
772- void computeSinkAccretion (amrex::MultiFab &state, amrex::MultiFab &state_accretion_rate, int lev, amrex::Real time, amrex::Real dt)
787+ void computeSinkAccretion (amrex::MultiFab &state, amrex::MultiFab &state_accretion_rate, std::array<amrex::MultiFab, AMREX_SPACEDIM> const *state_fc,
788+ int lev, amrex::Real time, amrex::Real dt)
773789 {
774790 const BL_PROFILE (" PhysicsParticleRegister::computeSinkAccretion()" );
775791 for (const auto &[type, descriptor] : particleRegistry_) {
776792 if (descriptor->getAllowsAccretion ()) {
777- descriptor->computeSinkAccretion (state, state_accretion_rate, lev, time, dt);
793+ descriptor->computeSinkAccretion (state, state_accretion_rate, state_fc, lev, time, dt);
778794 }
779795 }
780796 }
781797
782798 // Implementation of applySinkAccretion
783- void applySinkAccretion (amrex::MultiFab &state, amrex::MultiFab &state_accretion_rate, const amrex::Geometry &geom, int lev, amrex::Real time ,
784- amrex::Real dt)
799+ void applySinkAccretion (amrex::MultiFab &state, amrex::MultiFab &state_accretion_rate, std::array< amrex::MultiFab, AMREX_SPACEDIM> const *state_fc ,
800+ const amrex::Geometry &geom, int lev, amrex::Real time, amrex::Real dt)
785801 {
786802 const BL_PROFILE (" PhysicsParticleRegister::applySinkAccretion()" );
787803 for (const auto &[type, descriptor] : particleRegistry_) {
788804 if (descriptor->getAllowsAccretion ()) {
789- descriptor->applySinkAccretion (state, state_accretion_rate, geom, lev, time, dt);
805+ descriptor->applySinkAccretion (state, state_accretion_rate, state_fc, geom, lev, time, dt);
790806 }
791807 }
792808 }
@@ -830,7 +846,7 @@ template <typename problem_t> class PhysicsParticleRegister
830846 const std::string typeName = getParticleTypeName (type);
831847
832848 // Check if this particle type is in the requested list
833- if (std::find (particleTypeNames. begin (), particleTypeNames. end () , typeName) != particleTypeNames.end ()) {
849+ if (std::ranges:: find (particleTypeNames, typeName) != particleTypeNames.end ()) {
834850 descriptor->writePlotFile (plotfilename, typeName);
835851 descriptor->writeUnitsFile (plotfilename, typeName);
836852 }
@@ -887,14 +903,15 @@ template <typename problem_t> class PhysicsParticleRegister
887903 }
888904
889905 // Create particles based on particle type
890- void createParticlesFromState (amrex::MultiFab &state, amrex::MultiFab &accretion_rate, int lev, amrex::Real current_time, amrex::Real dt)
906+ void createParticlesFromState (amrex::MultiFab &state, amrex::MultiFab &accretion_rate, int lev, amrex::Real current_time, amrex::Real dt,
907+ std::array<amrex::MultiFab, AMREX_SPACEDIM> const *state_fc = nullptr )
891908 {
892909 const BL_PROFILE (" PhysicsParticleRegister::createParticlesFromState()" );
893910 for (const auto &[type, descriptor] : particleRegistry_) {
894911 // Only create particles if the descriptor allows creation
895912 if (descriptor->getAllowsCreation ()) {
896913 // Call the appropriate particle creation method based on the particle type
897- descriptor->createParticlesFromState (state, accretion_rate, lev, current_time, dt);
914+ descriptor->createParticlesFromState (state, accretion_rate, lev, current_time, dt, state_fc );
898915
899916 // redistribute particles
900917 // descriptor->redistribute(lev);
0 commit comments