MP-Gadget  5.0.1.dev1-76bc7d4726-dirty
Functions
gravshort-pair.c File Reference
#include <mpi.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <gsl/gsl_math.h>
#include "utils.h"
#include "cooling.h"
#include "densitykernel.h"
#include "treewalk.h"
#include "gravshort.h"
#include "walltime.h"
Include dependency graph for gravshort-pair.c:

Go to the source code of this file.

Functions

static void grav_short_pair_ngbiter (TreeWalkQueryGravShort *I, TreeWalkResultGravShort *O, TreeWalkNgbIterGravShort *iter, LocalTreeWalk *lv)
 
void grav_short_pair (const ActiveParticles *act, PetaPM *pm, ForceTree *tree, double Rcut, double rho0, int NeutrinoTracer, int FastParticleType)
 

Function Documentation

◆ grav_short_pair()

void grav_short_pair ( const ActiveParticles act,
PetaPM pm,
ForceTree tree,
double  Rcut,
double  rho0,
int  NeutrinoTracer,
int  FastParticleType 
)

Definition at line 24 of file gravshort-pair.c.

25 {
26  TreeWalk tw[1] = {{0}};
27 
28  struct GravShortPriv priv;
29  priv.cellsize = tree->BoxSize / pm->Nmesh;
30  priv.Rcut = Rcut * pm->Asmth * priv.cellsize;
31  priv.FastParticleType = FastParticleType;
32  priv.NeutrinoTracer = NeutrinoTracer;
33  priv.G = pm->G;
34  priv.cbrtrho0 = pow(rho0, 1.0 / 3);
35 
36  message(0, "Starting pair-wise short range gravity...\n");
37 
38  tw->ev_label = "GRAV_SHORT";
42 
43  tw->haswork = NULL;
49  tw->tree = tree;
50  tw->priv = &priv;
51 
52  walltime_measure("/Misc");
53 
55 
56  walltime_measure("/Tree/Pairwise");
57 }
void message(int where, const char *fmt,...)
Definition: endrun.c:175
static void grav_short_pair_ngbiter(TreeWalkQueryGravShort *I, TreeWalkResultGravShort *O, TreeWalkNgbIterGravShort *iter, LocalTreeWalk *lv)
static void grav_short_copy(int place, TreeWalkQueryGravShort *input, TreeWalk *tw)
Definition: gravshort.h:74
static void grav_short_reduce(int place, TreeWalkResultGravShort *result, enum TreeWalkReduceMode mode, TreeWalk *tw)
Definition: gravshort.h:89
static void grav_short_postprocess(int i, TreeWalk *tw)
Definition: gravshort.h:58
int * ActiveParticle
Definition: timestep.h:13
int64_t NumActiveParticle
Definition: timestep.h:12
double BoxSize
Definition: forcetree.h:106
int FastParticleType
Definition: gravshort.h:41
int NeutrinoTracer
Definition: gravshort.h:43
double cellsize
Definition: gravshort.h:28
double Rcut
Definition: gravshort.h:31
int Nmesh
Definition: petapm.h:68
double G
Definition: petapm.h:71
double Asmth
Definition: petapm.h:69
void * priv
Definition: treewalk.h:85
TreeWalkHasWorkFunction haswork
Definition: treewalk.h:100
size_t ngbiter_type_elsize
Definition: treewalk.h:97
const ForceTree * tree
Definition: treewalk.h:88
TreeWalkProcessFunction postprocess
Definition: treewalk.h:104
TreeWalkNgbIterFunction ngbiter
Definition: treewalk.h:103
TreeWalkReduceResultFunction reduce
Definition: treewalk.h:102
const char * ev_label
Definition: treewalk.h:91
TreeWalkVisitFunction visit
Definition: treewalk.h:99
size_t result_type_elsize
Definition: treewalk.h:96
TreeWalkFillQueryFunction fill
Definition: treewalk.h:101
size_t query_type_elsize
Definition: treewalk.h:95
int treewalk_visit_ngbiter(TreeWalkQueryBase *I, TreeWalkResultBase *O, LocalTreeWalk *lv)
Definition: treewalk.c:924
void treewalk_run(TreeWalk *tw, int *active_set, size_t size)
Definition: treewalk.c:619
int(* TreeWalkVisitFunction)(TreeWalkQueryBase *input, TreeWalkResultBase *output, LocalTreeWalk *lv)
Definition: treewalk.h:68
void(* TreeWalkReduceResultFunction)(const int j, TreeWalkResultBase *result, const enum TreeWalkReduceMode mode, TreeWalk *tw)
Definition: treewalk.h:76
void(* TreeWalkProcessFunction)(const int i, TreeWalk *tw)
Definition: treewalk.h:73
void(* TreeWalkNgbIterFunction)(TreeWalkQueryBase *input, TreeWalkResultBase *output, TreeWalkNgbIterBase *iter, LocalTreeWalk *lv)
Definition: treewalk.h:70
void(* TreeWalkFillQueryFunction)(const int j, TreeWalkQueryBase *query, TreeWalk *tw)
Definition: treewalk.h:75
#define walltime_measure(name)
Definition: walltime.h:8

References ActiveParticles::ActiveParticle, PetaPM::Asmth, ForceTree::BoxSize, GravShortPriv::cbrtrho0, GravShortPriv::cellsize, TreeWalk::ev_label, GravShortPriv::FastParticleType, TreeWalk::fill, GravShortPriv::G, PetaPM::G, grav_short_copy(), grav_short_pair_ngbiter(), grav_short_postprocess(), grav_short_reduce(), TreeWalk::haswork, message(), GravShortPriv::NeutrinoTracer, TreeWalk::ngbiter, TreeWalk::ngbiter_type_elsize, PetaPM::Nmesh, ActiveParticles::NumActiveParticle, TreeWalk::postprocess, TreeWalk::priv, TreeWalk::query_type_elsize, GravShortPriv::Rcut, TreeWalk::reduce, TreeWalk::result_type_elsize, TreeWalk::tree, treewalk_run(), treewalk_visit_ngbiter(), TreeWalk::visit, and walltime_measure.

Referenced by run(), and run_gravity_test().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ grav_short_pair_ngbiter()

static void grav_short_pair_ngbiter ( TreeWalkQueryGravShort I,
TreeWalkResultGravShort O,
TreeWalkNgbIterGravShort iter,
LocalTreeWalk lv 
)
static

Definition at line 61 of file gravshort-pair.c.

66 {
67  const double cellsize = GRAV_GET_PRIV(lv->tw)->cellsize;
68 
69  if(iter->base.other == -1) {
70  iter->base.Hsml = GRAV_GET_PRIV(lv->tw)->Rcut;
71  iter->base.mask = 0xff; /* all particles */
73  return;
74  }
75 
76  int other = iter->base.other;
77  double r = iter->base.r;
78  double r2 = iter->base.r2;
79  double * dist = iter->base.dist;
80 
81  if(P[other].Mass == 0) {
82  endrun(12, "Encountered zero mass particle during density;"
83  " We haven't implemented tracer particles and this shall not happen\n");
84  }
85 
86  /* Don't include neutrino tracers*/
87  if(GRAV_GET_PRIV(lv->tw)->NeutrinoTracer && P[other].Type == GRAV_GET_PRIV(lv->tw)->FastParticleType)
88  return;
89 
90  double mass = P[other].Mass;
91 
92  double h = I->Soft;
93  double otherh = FORCE_SOFTENING(other, P[other].Type);
94  if (otherh > h) h = otherh;
95 
96  double fac, pot;
97 
98  if(r >= h) {
99  fac = mass / (r2 * r);
100  pot = -mass / r;
101  } else {
102  double h_inv = 1.0 / h;
103  double h3_inv = h_inv * h_inv * h_inv;
104  double u = r * h_inv;
105  double wp;
106  if(u < 0.5)
107  fac = mass * h3_inv * (10.666666666667 + u * u * (32.0 * u - 38.4));
108  else
109  fac =
110  mass * h3_inv * (21.333333333333 - 48.0 * u +
111  38.4 * u * u - 10.666666666667 * u * u * u - 0.066666666667 / (u * u * u));
112  if(u < 0.5)
113  wp = -2.8 + u * u * (5.333333333333 + u * u * (6.4 * u - 9.6));
114  else
115  wp =
116  -3.2 + 0.066666666667 / u + u * u * (10.666666666667 +
117  u * (-16.0 + u * (9.6 - 2.133333333333 * u)));
118 
119  pot = mass * h_inv * wp;
120  }
121 
122  if (grav_apply_short_range_window(r, &fac, &pot, cellsize) == 0) {
123  int d;
124  for(d = 0; d < 3; d ++)
125  O->Acc[d] += - dist[d] * fac;
126 
127  O->Potential += pot;
128  }
129 }
void endrun(int where, const char *fmt,...)
Definition: endrun.c:147
int grav_apply_short_range_window(double r, double *fac, double *pot, const double cellsize)
Definition: gravity.c:55
double FORCE_SOFTENING(int i, int type)
#define GRAV_GET_PRIV(tw)
Definition: gravshort.h:55
#define P
Definition: partmanager.h:88
TreeWalk * tw
Definition: treewalk.h:47
double dist[3]
Definition: treewalk.h:40
enum NgbTreeFindSymmetric symmetric
Definition: treewalk.h:37
TreeWalkNgbIterBase base
Definition: gravshort.h:9
@ NGB_TREEFIND_ASYMMETRIC
Definition: treewalk.h:12

References TreeWalkResultGravShort::Acc, TreeWalkNgbIterGravShort::base, GravShortPriv::cellsize, TreeWalkNgbIterBase::dist, endrun(), FORCE_SOFTENING(), grav_apply_short_range_window(), GRAV_GET_PRIV, TreeWalkNgbIterBase::Hsml, TreeWalkNgbIterBase::mask, NGB_TREEFIND_ASYMMETRIC, TreeWalkNgbIterBase::other, P, TreeWalkResultGravShort::Potential, TreeWalkNgbIterBase::r, TreeWalkNgbIterBase::r2, TreeWalkQueryGravShort::Soft, TreeWalkNgbIterBase::symmetric, and LocalTreeWalk::tw.

Referenced by grav_short_pair().

Here is the call graph for this function:
Here is the caller graph for this function: