12 #include "gadgetconfig.h"
20 #include "../data/allvars.h"
21 #include "../data/dtypes.h"
22 #include "../data/intposconvert.h"
23 #include "../data/mymalloc.h"
24 #include "../logs/logs.h"
25 #include "../logs/timer.h"
26 #include "../main/simulation.h"
27 #include "../mpi_utils/mpi_utils.h"
28 #include "../ngbtree/ngbtree.h"
29 #include "../sort/cxxsort.h"
30 #include "../sph/kernel.h"
31 #include "../sph/sph.h"
32 #include "../system/system.h"
42 inline int sph::sph_density_evaluate_particle_node_opening_criterion(pinfo &pdat,
ngbnode *nop)
56 if(left[0] > pdat.search_range[0] && right[0] > left[0])
63 if(left[1] > pdat.search_range[1] && right[1] > left[1])
70 if(left[2] > pdat.search_range[2] && right[2] > left[2])
79 inline void sph::sph_density_check_particle_particle_interaction(pinfo &pdat,
int p,
int p_type,
unsigned char shmrank)
81 #ifdef PRESERVE_SHMEM_BINARY_INVARIANCE
82 if(skip_actual_force_computation)
100 if(posdiff[0] * posdiff[0] + posdiff[1] * posdiff[1] + posdiff[2] * posdiff[2] > pdat.hsml2)
106 int n = pdat.numngb++;
108 Ngbdensdat[n].IntPos = P->
IntPos;
109 Ngbdensdat[n].VelPred = SphP->
VelPred;
110 Ngbdensdat[n].Mass = P->
getMass();
111 #ifdef PRESSURE_ENTROPY_SPH
112 Ngbdensdat[n].EntropyToInvGammaPred = SphP->EntropyToInvGammaPred;
114 #ifdef TIMEDEP_ART_VISC
115 Ngbdensdat[n].Csnd = SphP->
Csnd;
126 if(posdiff[0] * posdiff[0] + posdiff[1] * posdiff[1] + posdiff[2] * posdiff[2] > pdat.hsml2)
132 int n = pdat.numngb++;
134 Ngbdensdat[n].IntPos = foreignpoint->
IntPos;
136 Ngbdensdat[n].Mass = foreignpoint->
Mass;
137 #ifdef PRESSURE_ENTROPY_SPH
138 Ngbdensdat[n].EntropyToInvGammaPred = foreignpoint->
SphCore.EntropyToInvGammaPred;
140 #ifdef TIMEDEP_ART_VISC
150 inline void sph::sph_density_open_node(pinfo &pdat,
ngbnode *nop,
int mintopleafnode,
int committed)
160 "p=%d < 0 nop->sibling=%d nop->nextnode=%d shmrank=%d nop->sibling_shmrank=%d nop->foreigntask=%d "
161 "first_nontoplevelnode=%d",
165 unsigned char next_shmrank;
172 next_shmrank = shmrank;
205 "should not happen: p=%d MaxPart=%d MaxNodes=%d ImportedNodeOffset=%d EndOfTreePoints=%d EndOfForeignNodes=%d "
206 "shmrank=%d nop->nextnode=%d nop->cannot_be_opened_locally=%d nop->not_empty=%d nop-TopNodes=%d",
211 sph_density_interact(pdat, p, type, shmrank, mintopleafnode, committed);
214 shmrank = next_shmrank;
223 inline void sph::sph_density_interact(pinfo &pdat,
int no,
char no_type,
unsigned char shmrank,
int mintopleafnode,
int committed)
227 sph_density_check_particle_particle_interaction(pdat, no, no_type, shmrank);
240 int openflag = sph_density_evaluate_particle_node_opening_criterion(pdat, nop);
249 Terminate(
"this should not happen any more");
260 int min_buffer_space =
275 void sph::densities_determine(
int ntarget,
int *targetlist)
277 Ngbdensdat = (ngbdata_density *)
Mem.mymalloc(
"Ngbdensdat",
MAX_NGBS *
sizeof(ngbdata_density));
286 for(
int i = 0; i < ntarget; i++)
288 int target = targetlist[i];
290 clear_density_result(&
Tp->
SphP[target]);
299 #ifdef PRESERVE_SHMEM_BINARY_INVARIANCE
300 workstack_data *WorkStackBak = (workstack_data *)
Mem.mymalloc(
"WorkStackBak",
NumOnWorkStack *
sizeof(workstack_data));
309 #ifdef PRESERVE_SHMEM_BINARY_INVARIANCE
310 for(
int rep = 0; rep < 2; rep++)
314 skip_actual_force_computation =
true;
318 skip_actual_force_computation =
false;
337 int min_buffer_space =
339 if(min_buffer_space >= committed)
344 int mintopleaf =
WorkStack[item].MinTopLeafNode;
348 get_pinfo(target, pdat);
362 Terminate(
"item=%d: no=%d now we should be able to open it!", item, no);
365 sph_density_open_node(pdat, nop, mintopleaf, committed);
368 density_evaluate_kernel(pdat);
375 Terminate(
"Can't even process a single particle");
395 #ifdef PRESERVE_SHMEM_BINARY_INVARIANCE
400 #ifdef PRESERVE_SHMEM_BINARY_INVARIANCE
401 Mem.myfree(WorkStackBak);
404 Mem.myfree(Ngbdensdat);
421 #ifdef TIMEDEP_ART_VISC
422 SphP->DivVelOld = SphP->
DivVel;
446 int *targetList = (
int *)
Mem.mymalloc(
"TargetList",
Tp->
NumGas *
sizeof(
int));
450 int ndensities = ntarget;
452 for(
int i = 0; i < ntarget; i++)
454 int target = list[i];
455 targetList[i] = target;
456 Left[target] = Right[target] = 0.0;
489 densities_determine(ndensities, targetList);
494 for(
int i = 0; i < ndensities; i++)
496 int target = targetList[i];
504 if(SphP[target].Density > 0)
506 #ifdef WENDLAND_BIAS_CORRECTION
510 if(SphP[target].DhsmlDensityFactor >
516 #ifndef IMPROVED_VELOCITY_GRADIENTS
517 SphP[target].
CurlVel =
sqrt(SphP[target].Rot[0] * SphP[target].Rot[0] + SphP[target].Rot[1] * SphP[target].Rot[1] +
518 SphP[target].Rot[2] * SphP[target].Rot[2]) /
523 SphP[target].set_velocity_gradients();
525 SphP[target].
DtHsml = (1.0 /
NUMDIMS) * SphP[target].DivVel * SphP[target].Hsml;
528 #ifndef PRESSURE_ENTROPY_SPH
533 #ifdef PRESSURE_ENTROPY_SPH
534 if(SphP[target].EntropyToInvGammaPred > 0 && SphP[target].PressureSphDensity > 0)
536 SphP[target].DhsmlDerivedDensityFactor *=
537 SphP[target].
Hsml / (
NUMDIMS * SphP[target].
Density * SphP[target].EntropyToInvGammaPred);
539 SphP[target].PressureSphDensity /= SphP[target].EntropyToInvGammaPred;
540 #ifdef WENDLAND_BIAS_CORRECTION
541 SphP[target].PressureSphDensity -= get_density_bias(SphP[target].Hsml,
Tp->
P[target].
getMass(),
All.
DesNumNgb);
543 SphP[target].DtPressureSphDensity = -SphP[target].
DivVel * SphP[target].PressureSphDensity;
548 SphP[target].DhsmlDerivedDensityFactor = 0;
549 SphP[target].EntropyToInvGammaPred = 0;
550 SphP[target].PressureSphDensity = 0;
554 #ifdef TIMEDEP_ART_VISC
558 SphP[target].set_viscosity_coefficient(dtime);
560 #ifdef ADAPTIVE_HYDRO_SOFTENING
568 for(
int i = 0; i <
NUMDIMS; i++)
570 hfac *= SphP[target].
Hsml;
574 if(SphP[target].NumNgb < (desnumngb - desnumngbdev) || (SphP[target].
NumNgb > (desnumngb + desnumngbdev)))
576 if(Left[target] > 0 && Right[target] > 0)
577 if((Right[target] - Left[target]) < 1.0e-3 * Left[target])
584 targetList[npleft++] = target;
586 if(SphP[target].NumNgb < (desnumngb - desnumngbdev))
587 Left[target] = std::max<double>(SphP[target].Hsml, Left[target]);
590 if(Right[target] != 0)
592 if(SphP[target].Hsml < Right[target])
593 Right[target] = SphP[target].
Hsml;
596 Right[target] = SphP[target].
Hsml;
604 printf(
"target=%d Hsml=%g task=%d ID=%llu Left=%g Right=%g Ngbs=%g Right-Left=%g\n pos=(%g|%g|%g)\n", target,
605 SphP[target].Hsml,
D->
ThisTask, (
unsigned long long)
Tp->
P[target].
ID.
get(), Left[target], Right[target],
606 SphP[target].
NumNgb, Right[target] - Left[target], pos[0], pos[1], pos[2]);
610 if(Right[target] > 0 && Left[target] > 0)
611 SphP[target].
Hsml =
pow(0.5 * (
pow(Left[target], 3) +
pow(Right[target], 3)), 1.0 / 3);
614 if(Right[target] == 0 && Left[target] == 0)
615 Terminate(
"Right[i] == 0 && Left[i] == 0 SphP[i].Hsml=%g\n", SphP[target].Hsml);
617 if(Right[target] == 0 && Left[target] > 0)
619 if(
Tp->
P[target].
getType() == 0 &&
fabs(SphP[target].NumNgb - desnumngb) < 0.5 * desnumngb)
621 double fac = 1 - (SphP[target].
NumNgb - desnumngb) / (
NUMDIMS * SphP[target].NumNgb) *
625 SphP[target].
Hsml *= fac;
627 SphP[target].
Hsml *= 1.26;
630 SphP[target].
Hsml *= 1.26;
633 if(Right[target] > 0 && Left[target] == 0)
635 if(
Tp->
P[target].
getType() == 0 &&
fabs(SphP[target].NumNgb - desnumngb) < 0.5 * desnumngb && iter < 4)
637 double fac = 1 - (SphP[target].
NumNgb - desnumngb) / (
NUMDIMS * SphP[target].NumNgb) *
641 SphP[target].
Hsml *= fac;
643 SphP[target].
Hsml /= 1.26;
646 SphP[target].
Hsml /= 1.26;
661 D->
mpi_printf(
"SPH-DENSITY: ngb iteration %4d: took %8.3f , need to repeat for %012lld local particles.\n", iter,
665 Terminate(
"failed to converge in neighbour iteration in density()\n");
670 while(ndensities > 0);
674 MPI_Allreduce(MPI_IN_PLACE, &max_ncycles, 1, MPI_INT, MPI_MAX,
D->
Communicator);
687 Mem.myfree(targetList);
695 struct detailed_timings
697 double tree, wait, fetch, all;
700 double fillfacFgnNodes, fillfacFgnPoints;
702 detailed_timings timer, tisum, timax;
707 timer.all = timer.tree + timer.wait + timer.fetch +
TIMER_DIFF(CPU_DENSITY);
714 MPI_Reduce((
double *)&timer, (
double *)&tisum, (
int)(
sizeof(detailed_timings) /
sizeof(
double)), MPI_DOUBLE, MPI_SUM, 0,
716 MPI_Reduce((
double *)&timer, (
double *)&timax, (
int)(
sizeof(detailed_timings) /
sizeof(
double)), MPI_DOUBLE, MPI_MAX, 0,
725 fprintf(
Logs.
FdDensity,
" work-load balance: %g part/sec: raw=%g, effective=%g\n",
729 " maximum number of nodes: %g, filled: %g NumForeignNodes: max=%g avg=%g fill=%g NumForeignPoints: max=%g avg=%g "
730 "fill=%g cycles=%d\n",
731 timax.numnodes, timax.numnodes /
MaxNodes, timax.NumForeignNodes, tisum.NumForeignNodes /
D->
NTask,
732 timax.fillfacFgnNodes, timax.NumForeignPoints, tisum.NumForeignPoints /
D->
NTask, timax.fillfacFgnPoints, max_ncycles);
733 fprintf(
Logs.
FdDensity,
" avg times: <all>=%g <tree>=%g <wait>=%g <fetch>=%g sec\n", tisum.all /
D->
NTask,
741 #ifdef EXPLICIT_VECTORIZATION
747 void sph::density_evaluate_kernel(pinfo &pdat)
752 double shinv, shinv3, shinv4;
753 kernel_hinv(targetSphP->
Hsml, &shinv, &shinv3, &shinv4);
759 Vec4d dwnorm(
NORM * shinv3);
760 Vec4d dwknorm(
NORM * shinv4);
763 for(
int i = 0; i <
NUMDIMS; i++)
765 v_i[i] = targetSphP->
VelPred[i];
768 Vec4d cs_i(targetSphP->
Csnd);
769 const int vector_length = 4;
770 const int array_length = (pdat.numngb + vector_length - 1) & (-vector_length);
772 for(
int n = pdat.numngb; n < array_length; n++)
773 Ngbdensdat[n] = Ngbdensdat[0];
775 Vec4d decayVel_loc(0);
777 for(
int n = 0; n < array_length; n += vector_length)
779 struct ngbdata_density *ngb0 = &Ngbdensdat[n + 0];
780 struct ngbdata_density *ngb1 = &Ngbdensdat[n + 1];
781 struct ngbdata_density *ngb2 = &Ngbdensdat[n + 2];
782 struct ngbdata_density *ngb3 = &Ngbdensdat[n + 3];
785 #if defined(LONG_X_BITS) || defined(LONG_Y_BITS) || defined(LONG_Z_BITS)
786 double posdiff[array_length][3];
787 for(
int i = 0; i < 4; i++)
792 for(
int i = 0; i <
NUMDIMS; i++)
794 dpos[i] = Vec4d(posdiff[0][i], posdiff[1][i], posdiff[2][i], posdiff[3][i]);
797 for(
int i = 0; i <
NUMDIMS; i++)
799 dpos[i] =
Tp->nearest_image_intpos_to_doublepos_vectorial(targetP->
IntPos[i], ngb0->IntPos[i], ngb1->IntPos[i],
800 ngb2->IntPos[i], ngb3->IntPos[i]);
805 for(
int i = 0; i <
NUMDIMS; i++)
807 v_j[i] = Vec4d(ngb0->VelPred[i], ngb1->VelPred[i], ngb2->VelPred[i], ngb3->VelPred[i]);
810 Vec4d mass_j(ngb0->Mass, ngb1->Mass, ngb2->Mass, ngb3->Mass);
813 for(
int i = 0; i <
NUMDIMS; i++)
815 r2 += dpos[i] * dpos[i];
824 kernel_main_vector(u, dwnorm, dwknorm, &wk, &dwk);
826 if(n + vector_length > pdat.numngb)
828 mass_j.cutoff(vector_length - (array_length - pdat.numngb));
829 wk.cutoff(vector_length - (array_length - pdat.numngb));
832 Vec4d mj_wk = mass_j * wk;
834 targetSphP->
Density += horizontal_add(mj_wk);
836 #ifdef PRESSURE_ENTROPY_SPH
837 Vec4d entr_j(ngb0->EntropyToInvGammaPred, ngb1->EntropyToInvGammaPred, ngb2->EntropyToInvGammaPred, ngb3->EntropyToInvGammaPred);
839 targetSphP->PressureSphDensity += horizontal_add(mj_wk * entr_j);
841 targetSphP->DhsmlDerivedDensityFactor += horizontal_add(-mass_j * entr_j * (
NUMDIMS * hinv * wk + u * dwk));
846 Vec4db decision_r_gt_0 = (r > 0);
848 r = select(decision_r_gt_0, r, 1.0);
850 Vec4d mj_dwk_r = mass_j * dwk / r;
853 for(
int i = 0; i <
NUMDIMS; i++)
855 dv[i] = v_i[i] - v_j[i];
858 #ifndef IMPROVED_VELOCITY_GRADIENTS
859 Vec4d dpos_times_dv(0);
860 for(
int i = 0; i <
NUMDIMS; i++)
861 dpos_times_dv += dpos[i] * dv[i];
863 targetSphP->
DivVel += horizontal_add(-mj_dwk_r * dpos_times_dv);
866 targetSphP->
Rot[2] += horizontal_add(mj_dwk_r * (dpos[1] * dv[0] - dpos[0] * dv[1]));
869 targetSphP->
Rot[0] += horizontal_add(mj_dwk_r * (dpos[2] * dv[1] - dpos[1] * dv[2]));
870 targetSphP->
Rot[1] += horizontal_add(mj_dwk_r * (dpos[0] * dv[2] - dpos[2] * dv[0]));
871 targetSphP->
Rot[2] += horizontal_add(mj_dwk_r * (dpos[1] * dv[0] - dpos[0] * dv[1]));
874 for(
int i = 0; i <
NUMDIMS; i++)
876 for(
int j = 0; j <
NUMDIMS; j++)
878 targetSphP->dvel[i][j] -= horizontal_add(mj_dwk_r * dv[i] * dpos[j]);
881 targetSphP->dpos.dx_dx -= horizontal_add(mj_dwk_r * dpos[0] * dpos[0]);
882 targetSphP->dpos.dx_dy -= horizontal_add(mj_dwk_r * dpos[0] * dpos[1]);
883 targetSphP->dpos.dx_dz -= horizontal_add(mj_dwk_r * dpos[0] * dpos[2]);
884 targetSphP->dpos.dy_dy -= horizontal_add(mj_dwk_r * dpos[1] * dpos[1]);
885 targetSphP->dpos.dy_dz -= horizontal_add(mj_dwk_r * dpos[1] * dpos[2]);
886 targetSphP->dpos.dz_dz -= horizontal_add(mj_dwk_r * dpos[2] * dpos[2]);
888 #ifdef TIMEDEP_ART_VISC
890 for(
int i = 0; i <
NUMDIMS; i++)
892 vdotr2 += dpos[i] * dv[i];
900 Vec4d cs_j(ngb0->Csnd, ngb1->Csnd, ngb2->Csnd, ngb3->Csnd);
901 Vec4d cs_sum = cs_i + cs_j;
903 Vec4d decay_vel_2 = cs_sum - mu_ij;
905 Vec4db decision = (vdotr2 > 0);
907 Vec4d decay_vel = select(decision, cs_sum, decay_vel_2);
909 Vec4d fac_decay_vel = select(decision_r_gt_0, 1, 0);
911 decay_vel = decay_vel * fac_decay_vel;
913 decayVel_loc = max(decayVel_loc, decay_vel);
918 #ifdef TIMEDEP_ART_VISC
919 for(
int i = 0; i < vector_length; i++)
921 if(decayVel_loc[i] > targetSphP->decayVel)
922 targetSphP->decayVel = decayVel_loc[i];
933 void sph::density_evaluate_kernel(pinfo &pdat)
942 for(
int n = 0; n < pdat.numngb; n++)
944 struct ngbdata_density *ngb = &Ngbdensdat[n];
951 for(
int i = 0; i <
NUMDIMS; i++)
953 kernel.
dpos[i] = posdiff[i];
958 for(
int i = 0; i <
NUMDIMS; i++)
960 r2 += kernel.
dpos[i] * kernel.
dpos[i];
965 double u = kernel.
r * kernel.
hinv;
969 double mass_j = ngb->Mass;
970 kernel.
mj_wk = (mass_j * kernel.
wk);
974 #ifdef PRESSURE_ENTROPY_SPH
975 targetSphP->PressureSphDensity += kernel.
mj_wk * ngb->EntropyToInvGammaPred;
976 targetSphP->DhsmlDerivedDensityFactor +=
977 (-mass_j * ngb->EntropyToInvGammaPred * (
NUMDIMS * kernel.
hinv * kernel.
wk + u * kernel.
dwk));
987 for(
int i = 0; i <
NUMDIMS; i++)
989 kernel.
dv[i] = targetSphP->
VelPred[i] - ngb->VelPred[i];
992 #ifndef IMPROVED_VELOCITY_GRADIENTS
993 double dpos_times_dv = 0;
994 for(
int i = 0; i <
NUMDIMS; i++)
995 dpos_times_dv += kernel.
dpos[i] * kernel.
dv[i];
1007 for(
int i = 0; i <
NUMDIMS; i++)
1009 for(
int j = 0; j <
NUMDIMS; j++)
1011 targetSphP->dvel[i][j] -= kernel.
mj_dwk_r * kernel.
dv[i] * kernel.
dpos[j];
1015 targetSphP->dpos.dx_dx -= kernel.
mj_dwk_r * kernel.
dpos[0] * kernel.
dpos[0];
1016 targetSphP->dpos.dx_dy -= kernel.
mj_dwk_r * kernel.
dpos[0] * kernel.
dpos[1];
1017 targetSphP->dpos.dx_dz -= kernel.
mj_dwk_r * kernel.
dpos[0] * kernel.
dpos[2];
1018 targetSphP->dpos.dy_dy -= kernel.
mj_dwk_r * kernel.
dpos[1] * kernel.
dpos[1];
1019 targetSphP->dpos.dy_dz -= kernel.
mj_dwk_r * kernel.
dpos[1] * kernel.
dpos[2];
1020 targetSphP->dpos.dz_dz -= kernel.
mj_dwk_r * kernel.
dpos[2] * kernel.
dpos[2];
1023 #ifdef TIMEDEP_ART_VISC
1025 for(
int i = 0; i <
NUMDIMS; i++)
1027 vdotr2 += kernel.
dpos[i] * kernel.
dv[i];
1037 decay_vel = targetSphP->
Csnd + ngb->Csnd - mu_ij;
1039 decay_vel = targetSphP->
Csnd + ngb->Csnd;
1041 if(decay_vel > targetSphP->decayVel)
1042 targetSphP->decayVel = decay_vel;
1058 for(
int k = 0; k < 3; k++)
1061 #ifdef PRESSURE_ENTROPY_SPH
1062 SphP->PressureSphDensity = 0;
1063 SphP->DhsmlDerivedDensityFactor = 0;
1065 #ifdef IMPROVED_VELOCITY_GRADIENTS
1067 for(
int i = 0; i <
NUMDIMS; i++)
1069 for(
int j = 0; j <
NUMDIMS; j++)
1071 SphP->dvel[i][j] = 0;
1075 #ifdef TIMEDEP_ART_VISC
global_data_all_processes All
void nearest_image_intpos_to_pos(const MyIntPosType *const a, const MyIntPosType *const b, T *posdiff)
MyIntPosType nearest_image_intpos_to_intpos_Y(const MyIntPosType a, const MyIntPosType b)
MyIntPosType nearest_image_intpos_to_intpos_Z(const MyIntPosType a, const MyIntPosType b)
void intpos_to_pos(MyIntPosType *intpos, T *posdiff)
MyIntPosType nearest_image_intpos_to_intpos_X(const MyIntPosType a, const MyIntPosType b)
double timediff(double t0, double t1)
double getAllocatedBytesInMB(void)
void mpi_printf(const char *fmt,...)
int * GetNodeIDForSimulCommRank
int drift_particle(particle_data *P, sph_particle_data *SphP, integertime time1, bool ignore_light_cone=false)
This function drifts a particle i to time1.
TimeBinData TimeBinsGravity
TimeBinData TimeBinsHydro
void compute_densities(void)
void density(int *targetlist, int ntarget)
long long sum_NumForeignPoints
workstack_data * WorkStack
void cleanup_shared_memory_access(void)
ngbnode * get_nodep(int no)
int * get_nextnodep(unsigned char shmrank)
domain< simparticles > * D
pdata get_Pp(int n, unsigned char shmrank)
static bool compare_workstack(const workstack_data &a, const workstack_data &b)
long long sum_NumForeignNodes
sph_particle_data * get_SphPp(int n, unsigned char shmrank)
void tree_fetch_foreign_nodes(enum ftype fetch_type)
void prepare_shared_memory_access(void)
foreign_sphpoint_data * Foreign_Points
fetch_data * StackToFetch
int AllocWorkStackBaseHigh
void tree_add_to_fetch_stack(ngbnode *nop, int nodetoopen, unsigned char shmrank)
void tree_add_to_work_stack(int target, int no, unsigned char shmrank, int mintopleafnode)
void tree_initialize_leaf_node_access_info(void)
int AllocWorkStackBaseLow
double mycxxsort(T *begin, T *end, Tcomp comp)
#define LEVEL_ALWAYS_OPEN
#define TREE_MIN_WORKSTACK_SIZE
#define NODE_TYPE_FETCHED_NODE
#define TREE_EXPECTED_CYCLES
#define NODE_TYPE_FETCHED_PARTICLE
#define NODE_TYPE_LOCAL_NODE
#define NODE_TYPE_LOCAL_PARTICLE
#define COMPUTE_WK_AND_DWK
#define TIMER_START(counter)
Starts the timer counter.
#define TIMER_STOP(counter)
Stops the timer counter.
#define TIMER_STORE
Copies the current value of CPU times to a stored variable, such that differences with respect to thi...
#define TIMER_DIFF(counter)
Returns amount elapsed for the timer since last save with TIMER_STORE.
#define TIMER_STOPSTART(stop, start)
Stops the timer 'stop' and starts the timer 'start'.
expr pow(half base, half exp)
long long GlobalNActiveParticles
unsigned char nextnode_shmrank
std::atomic< unsigned char > cannot_be_opened_locally
vector< MyIntPosType > center
unsigned char sibling_shmrank
unsigned char Nextnode_shmrank
sph_particle_data_hydrocore SphCore
double cf_atime2_hubble_a
int ComovingIntegrationOn
double MaxNumNgbDeviation
std::atomic< integertime > Ti_Current
MySignedIntPosType center_offset_max[3]
MySignedIntPosType center_offset_min[3]
void drift_node(integertime time1, simparticles *Sp)
void setSofteningClass(unsigned char softclass)
integertime get_Ti_Current(void)
unsigned char getTimeBinHydro(void)
unsigned char getType(void)
MyFloat DhsmlDensityFactor
void set_thermodynamic_variables(void)
void myflush(FILE *fstream)
#define TREE_NUM_BEFORE_NODESPLIT