70 MPI_Comm_rank(MPI_COMM_WORLD, &
ThisTask);
108 double timetree, timewait, timecomm;
123 endrun(2,
"Gravtree called before tree moments computed!\n");
165 walltime_add(
"/Tree/Misc", timeall - (timetree + timewait + timecomm));
178 const double r = sqrt(r2);
180 double fac = mass / (r2 * r);
181 double facpot = -mass / r;
186 const double h3_inv = 1.0 / h / h / h;
187 const double u = r / h;
189 fac = mass * h3_inv * (10.666666666667 + u * u * (32.0 * u - 38.4));
190 wp = -2.8 + u * u * (5.333333333333 + u * u * (6.4 * u - 9.6));
194 mass * h3_inv * (21.333333333333 - 48.0 * u +
195 38.4 * u * u - 10.666666666667 * u * u * u - 0.066666666667 / (u * u * u));
197 -3.2 + 0.066666666667 / u + u * u * (10.666666666667 +
198 u * (-16.0 + u * (9.6 - 2.133333333333 * u)));
200 facpot = mass / h * wp;
205 for(i = 0; i < 3; i++)
206 output->
Acc[i] += dx[i] * fac;
215 shall_we_discard_node(
const double len,
const double r2,
const double center[3],
const double inpos[3],
const double BoxSize,
const double rcut,
const double rcut2)
222 const double eff_dist = rcut + 0.5 * len;
227 if(fabs(
NEAREST(center[i] - inpos[i], BoxSize)) > eff_dist)
237 shall_we_open_node(
const double len,
const double mass,
const double r2,
const double center[3],
const double inpos[3],
const double BoxSize,
const double aold,
const int TreeUseBH,
const double BHOpeningAngle2)
240 if((
TreeUseBH == 0) && (mass * len * len > r2 * r2 * aold))
243 if((
TreeUseBH > 0) && (len * len > r2 * BHOpeningAngle2))
246 const double inside = 0.6 * len;
248 if(fabs(
NEAREST(center[0] - inpos[0], BoxSize)) < inside &&
249 fabs(
NEAREST(center[1] - inpos[1], BoxSize)) < inside &&
250 fabs(
NEAREST(center[2] - inpos[2], BoxSize)) < inside)
272 const double BoxSize = tree->
BoxSize;
277 const double rcut2 = rcut * rcut;
285 const double * inpos = input->
base.
Pos;
291 for(listindex = 0; listindex <
NODELISTLENGTH && (lv->
mode == 1 || listindex < 1); listindex++)
317 for(i = 0; i < 3; i++)
319 const double r2 = dx[0] * dx[0] + dx[1] * dx[1] + dx[2] * dx[2];
342 double h = input->
Soft;
358 int pp = nop->
s.
suns[i];
381 for(i = 0; i < numcand; i++)
385 if(NeutrinoTracer &&
P[pp].Type == FastParticleType)
390 for(j = 0; j < 3; j++)
391 dx[j] =
NEAREST(
P[pp].Pos[j] - inpos[j], BoxSize);
392 const double r2 = dx[0] * dx[0] + dx[1] * dx[1] + dx[2] * dx[2];
void message(int where, const char *fmt,...)
void endrun(int where, const char *fmt,...)
#define PARTICLE_NODE_TYPE
int grav_apply_short_range_window(double r, double *fac, double *pot, const double cellsize)
struct gravshort_tree_params get_gravshort_treepar(void)
void gravshort_set_softenings(double MeanSeparation)
int force_treeev_shortrange(TreeWalkQueryGravShort *input, TreeWalkResultGravShort *output, LocalTreeWalk *lv)
static struct gravshort_tree_params TreeParams
void set_gravshort_treepar(struct gravshort_tree_params tree_params)
static int shall_we_discard_node(const double len, const double r2, const double center[3], const double inpos[3], const double BoxSize, const double rcut, const double rcut2)
double FORCE_SOFTENING(int i, int type)
static void apply_accn_to_output(TreeWalkResultGravShort *output, const double dx[3], const double r2, const double h, const double mass, const double cellsize)
void grav_short_tree(const ActiveParticles *act, PetaPM *pm, ForceTree *tree, double rho0, int NeutrinoTracer, int FastParticleType)
void set_gravshort_tree_params(ParameterSet *ps)
static int shall_we_open_node(const double len, const double mass, const double r2, const double center[3], const double inpos[3], const double BoxSize, const double aold, const int TreeUseBH, const double BHOpeningAngle2)
#define GRAV_GET_PRIV(tw)
static void grav_short_copy(int place, TreeWalkQueryGravShort *input, TreeWalk *tw)
static void grav_short_reduce(int place, TreeWalkResultGravShort *result, enum TreeWalkReduceMode mode, TreeWalk *tw)
static void grav_short_postprocess(int i, TreeWalk *tw)
#define mymalloc_usedbytes()
double param_get_double(ParameterSet *ps, const char *name)
int param_get_int(ParameterSet *ps, const char *name)
#define NEAREST(x, BoxSize)
int64_t NumActiveParticle
int moments_computed_flag
int NodeList[NODELISTLENGTH]
TreeWalkHasWorkFunction haswork
TreeWalkProcessFunction postprocess
TreeWalkReduceResultFunction reduce
TreeWalkVisitFunction visit
size_t result_type_elsize
TreeWalkFillQueryFunction fill
double FractionalGravitySoftening
#define MPIU_Barrier(comm)
void treewalk_run(TreeWalk *tw, int *active_set, size_t size)
int treewalk_export_particle(LocalTreeWalk *lv, int no)
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(* TreeWalkFillQueryFunction)(const int j, TreeWalkQueryBase *query, TreeWalk *tw)
#define walltime_measure(name)
#define walltime_add(name, dt)