#ifndef CUSTOM_DENSITY_PROB_H_ #define CUSTOM_DENSITY_PROB_H_ #include #include #include #include // An example of Custom Density Profile // struct whose getDensity returns density at a given position computed from // a custom function, with runtime input parameters. struct InjectorDensityCustom { InjectorDensityCustom (std::string const& species_name) : p(nullptr) { // Read parameters for custom density profile from file, and // store them in managed memory. amrex::ParmParse pp(species_name); std::vector v; pp.getarr("custom_profile_params", v); p = static_cast (amrex::The_Managed_Arena()->alloc(sizeof(amrex::Real)*v.size())); for (int i = 0; i < static_cast(v.size()); ++i) { p[i] = v[i]; } } // Return density at given position, using user-defined parameters // stored in p. AMREX_GPU_HOST_DEVICE amrex::Real getDensity (amrex::Real, amrex::Real, amrex::Real) const noexcept { return p[0]; } // Note that we are not allowed to have non-trivial destructor. // So we rely on clear() to free memory. void clear () { amrex::The_Managed_Arena()->free(p); } private: amrex::Real* p; }; #endif