6 #include <gsl/gsl_math.h>
40 MPI_Comm_rank(MPI_COMM_WORLD, &
ThisTask);
69 return pow(EntVarPred * EOMDensityPred,
GAMMA);
89 #define HYDRA_GET_PRIV(tw) ((struct HydraPriv*) ((tw)->priv))
168 endrun(5,
"Hydro called before hmax computed\n");
176 #pragma omp parallel for
187 #pragma omp parallel for
193 double timeall = 0, timenetwork = 0;
194 double timecomp, timecomm, timewait;
213 #pragma omp parallel for
238 walltime_add(
"/SPH/Hydro/Misc", timeall - (timecomp + timewait + timecomm + timenetwork));
247 input->
Vel[0] = velpred[3 *
P[place].PI];
248 input->
Vel[1] = velpred[3 *
P[place].PI + 1];
249 input->
Vel[2] = velpred[3 *
P[place].PI + 2];
250 input->
Hsml =
P[place].Hsml;
251 input->
Mass =
P[place].Mass;
267 input->
F1 = fabs(
SPHP(place).DivVel) /
268 (fabs(
SPHP(place).DivVel) +
SPHP(place).CurlVel +
277 for(k = 0; k < 3; k++)
297 return Density - DivVel * Density * dtdrift;
337 double rsq = iter->
base.
r2;
339 double r = iter->
base.
r;
341 if(
P[other].Mass == 0) {
342 endrun(12,
"Encountered zero mass particle during hydro;"
343 " We haven't implemented tracer particles and this shall not happen\n");
356 if(rsq <= 0 || !(rsq < iter->kernel_i.HH || rsq < kernel_j.
HH))
362 #pragma omp atomic read
370 if(EntVarPred == 0) {
371 int bin =
P[other].TimeBin;
372 double a3inv = pow(priv->
atime, -3);
379 for(i = 0; i < 3; i++) {
380 #pragma omp atomic write
383 #pragma omp atomic write
388 for(i = 0; i < 3; i++) {
389 #pragma omp atomic read
396 int bin =
P[other].TimeBin;
402 #pragma omp atomic read
404 if(Pressure_j == 0) {
406 #pragma omp atomic write
410 double p_over_rho2_j = Pressure_j / (eomdensity * eomdensity);
411 double soundspeed_j = sqrt(
GAMMA * Pressure_j / eomdensity);
415 for(d = 0; d < 3; d++) {
416 dv[d] = I->
Vel[d] - VelPred[d];
431 const double rho_ij = 0.5 * (I->
Density + density_j);
440 const double f2 = fabs(
SPHP(other).DivVel) / (fabs(
SPHP(other).DivVel) +
450 if(
dloga > 0 && (dwk_i + dwk_j) < 0)
452 if((I->
Mass +
P[other].Mass) > 0) {
454 (0.5 * (I->
Mass +
P[other].Mass) * (dwk_i + dwk_j) * r *
dloga));
458 const double hfc_visc = 0.5 *
P[other].Mass * visc * (dwk_i + dwk_j) / r;
459 double hfc = hfc_visc;
460 double rr1 = 1, rr2 = 1;
466 hfc +=
P[other].Mass *
468 dwk_j*p_over_rho2_j*I->
EntVarPred/EntVarPred) / r;
473 rr2 = eomdensity / density_j;
485 + p_over_rho2_j*
SPHP(other).DhsmlEgyDensityFactor * dwk_j * rr2) / r;
487 for(d = 0; d < 3; d ++)
488 O->
Acc[d] += (-hfc * dist[d]);
490 O->
DtEntropy += (0.5 * hfc_visc * vdotr2);
497 return P[i].Type == 0;
double hubble_function(const Cosmology *CP, double a)
void SPH_VelPred(int i, MyFloat *VelPred, const double FgravkickB, double gravkick, double hydrokick)
MyFloat SPH_EntVarPred(int PI, double MinEgySpec, double a3inv, double dloga)
enum DensityKernelType GetDensityKernelType(void)
double density_kernel_dwk(DensityKernel *kernel, double u)
void density_kernel_init(DensityKernel *kernel, double H, enum DensityKernelType type)
static double dotproduct(const double v1[3], const double v2[3])
void endrun(int where, const char *fmt,...)
static void hydro_reduce(int place, TreeWalkResultHydro *result, enum TreeWalkReduceMode mode, TreeWalk *tw)
static void hydro_copy(int place, TreeWalkQueryHydro *input, TreeWalk *tw)
static MyFloat SPH_EOMDensity(const struct sph_particle_data *const pi)
static void hydro_ngbiter(TreeWalkQueryHydro *I, TreeWalkResultHydro *O, TreeWalkNgbIterHydro *iter, LocalTreeWalk *lv)
static void hydro_postprocess(int i, TreeWalk *tw)
void hydro_force(const ActiveParticles *act, const double atime, struct sph_pred_data *SPH_predicted, double MinEgySpec, const DriftKickTimes times, Cosmology *CP, const ForceTree *const tree)
static double PressurePred(MyFloat EOMDensityPred, double EntVarPred)
double SPH_DensityPred(MyFloat Density, MyFloat DivVel, double dtdrift)
void set_hydro_params(ParameterSet *ps)
int DensityIndependentSphOn(void)
static struct hydro_params HydroParams
#define HYDRA_GET_PRIV(tw)
static int hydro_haswork(int n, TreeWalk *tw)
#define mymalloc(name, size)
double param_get_double(ParameterSet *ps, const char *name)
int param_get_int(ParameterSet *ps, const char *name)
struct slots_manager_type SlotsManager[1]
int64_t NumActiveParticle
inttime_t Ti_lastactivedrift[TIMEBINS+1]
inttime_t Ti_kick[TIMEBINS+1]
double drifts[TIMEBINS+1]
double gravkicks[TIMEBINS+1]
DriftKickTimes const * times
double hydrokicks[TIMEBINS+1]
struct sph_pred_data * SPH_predicted
enum NgbTreeFindSymmetric symmetric
MyFloat SPH_DhsmlDensityFactor
TreeWalkHasWorkFunction haswork
size_t ngbiter_type_elsize
TreeWalkProcessFunction postprocess
TreeWalkNgbIterFunction ngbiter
TreeWalkReduceResultFunction reduce
TreeWalkVisitFunction visit
size_t result_type_elsize
TreeWalkFillQueryFunction fill
int DensityIndependentSphOn
double DensityContrastLimit
double dloga_from_dti(inttime_t dti, const inttime_t Ti_Current)
double get_dloga_for_bin(int timebin, const inttime_t Ti_Current)
double get_exact_hydrokick_factor(Cosmology *CP, inttime_t ti0, inttime_t ti1)
double get_exact_drift_factor(Cosmology *CP, inttime_t ti0, inttime_t ti1)
double get_exact_gravkick_factor(Cosmology *CP, inttime_t ti0, inttime_t ti1)
int is_timebin_active(int i, inttime_t current)
int treewalk_visit_ngbiter(TreeWalkQueryBase *I, TreeWalkResultBase *O, LocalTreeWalk *lv)
void treewalk_run(TreeWalk *tw, int *active_set, size_t size)
int(* TreeWalkVisitFunction)(TreeWalkQueryBase *input, TreeWalkResultBase *output, LocalTreeWalk *lv)
void(* TreeWalkReduceResultFunction)(const int j, TreeWalkResultBase *result, const enum TreeWalkReduceMode mode, TreeWalk *tw)
void(* TreeWalkProcessFunction)(const int i, TreeWalk *tw)
void(* TreeWalkNgbIterFunction)(TreeWalkQueryBase *input, TreeWalkResultBase *output, TreeWalkNgbIterBase *iter, LocalTreeWalk *lv)
void(* TreeWalkFillQueryFunction)(const int j, TreeWalkQueryBase *query, TreeWalk *tw)
#define TREEWALK_REDUCE(A, B)
#define walltime_measure(name)
#define walltime_add(name, dt)
int winds_is_particle_decoupled(int i)
void winds_decoupled_hydro(int i, double atime)