63 snr_dt_(feedback::DEFAULT_SN_END - feedback::DEFAULT_SN_START),
64 time_sn_start_(feedback::DEFAULT_SN_START),
65 time_sn_end_(feedback::DEFAULT_SN_END)
88 inline __device__ Real Get_SN_Rate(Real t)
const
90 if ((t < time_sn_start_) or (t >= time_sn_end_))
return 0;
91 if (dev_snr_ ==
nullptr)
return feedback::DEFAULT_SNR;
93 int index = (int)((t - time_sn_start_) / snr_dt_);
94 return dev_snr_[index] + (t - index * snr_dt_) * (dev_snr_[index + 1] - dev_snr_[index]) / snr_dt_;
109 static inline __device__
int Get_Number_Of_SNe_In_Cluster(Real ave_num_sn,
int n_step, part_int_t cluster_id)
111 feedback_prng_t state;
114 unsigned long long seed = (cluster_id < 0)
115 ? (
unsigned long long)(FEEDBACK_SEED) - (
unsigned long long)(-1 * cluster_id)
116 : (
unsigned long long)(FEEDBACK_SEED) + (
unsigned long long)(cluster_id);
117 curand_init(seed, 0, 0, &state);
118 skipahead((
unsigned long long)(n_step), &state);
119 return (
int)curand_poisson(&state, ave_num_sn);
122 inline __device__
bool nonzero_sn_probability(Real age)
const
124 return (time_sn_start_ <= age) and (age <= time_sn_end_);
154 __host__ __device__
SWRateCalc(Real *dev_sw_p, Real *dev_sw_e, Real dt, Real t_start, Real t_end)
155 : dev_sw_p_(dev_sw_p), dev_sw_e_(dev_sw_e), sw_dt_(dt), time_sw_start_(t_start), time_sw_end_(t_end)
164 inline __device__ Real Get_Wind_Flux(Real t)
const
166 if ((t < time_sw_start_) or (t >= time_sw_end_))
return 0;
168 int index = (int)((t - time_sw_start_) / sw_dt_);
169 Real log_p_dynes = (dev_sw_p_[index] + (t - index * sw_dt_) * (dev_sw_p_[index + 1] - dev_sw_p_[index]) / sw_dt_);
170 return pow(10, log_p_dynes) / FORCE_UNIT / S_99_TOTAL_MASS;
178 inline __device__ Real Get_Wind_Power(Real t)
const
180 if ((t < time_sw_start_) or (t >= time_sw_end_))
return 0;
182 int index = (int)((t - time_sw_start_) / sw_dt_);
183 Real log_e = (dev_sw_e_[index] + (t - index * sw_dt_) * (dev_sw_e_[index + 1] - dev_sw_e_[index]) / sw_dt_);
184 Real e = pow(10, log_e) / (MASS_UNIT * VELOCITY_UNIT * VELOCITY_UNIT) * TIME_UNIT / S_99_TOTAL_MASS;
194 static __device__ Real Get_Wind_Mass(Real flux, Real power)
196 if ((flux <= 0) or (power <= 0))
return 0;
197 return flux * flux / power / 2;
200 inline __device__
bool is_active(Real age)
const {
return (time_sw_start_ <= age) and (age <= time_sw_end_); }
204 Real *dev_sw_p_ =
nullptr;
206 Real *dev_sw_e_ =
nullptr;
210 Real time_sw_start_ = 0.0;
212 Real time_sw_end_ = 0.0;