MP-Gadget  5.0.1.dev1-76bc7d4726-dirty
densitykernel.c
Go to the documentation of this file.
1 #include <math.h>
2 #include "densitykernel.h"
3 
4 #include "utils/endrun.h"
5 
24 double wk_cs(DensityKernel * kernel, double q) {
25  if(q < 1.0) {
26  return 0.25 * pow(2 - q, 3) - pow(1 - q, 3);
27  }
28  if(q < 2.0) {
29  return 0.25 * pow(2 - q, 3);
30  }
31  return 0.0;
32 }
33 double dwk_cs(DensityKernel * kernel, double q) {
34  if(q < 1.0) {
35  return - 0.25 * 3 * pow(2 - q, 2) + 3 * pow(1 - q, 2);
36  }
37  if(q < 2.0) {
38  return -0.25 * 3 * pow(2 - q, 2);
39  }
40  return 0.0;
41 }
42 static double wk_qus(DensityKernel * kernel, double q) {
43  if(q < 0.5) {
44  return pow(2.5 - q, 4) - 5 * pow(1.5 - q, 4) + 10 * pow(0.5 - q, 4);
45  }
46  if(q < 1.5) {
47  return pow(2.5 - q, 4) - 5 * pow(1.5 - q, 4);
48  }
49  if(q < 2.5) {
50  return pow(2.5 - q, 4);
51  }
52  return 0.0;
53 }
54 static double dwk_qus(DensityKernel * kernel, double q) {
55  if(q < 0.5) {
56  return -4 * pow(2.5 - q, 3) + 20 * pow(1.5 - q, 3) - 40 * pow(0.5 - q, 3);
57  }
58  if(q < 1.5) {
59  return -4 * pow(2.5 - q, 3) + 20 * pow(1.5 - q, 3);
60  }
61  if(q < 2.5) {
62  return -4 * pow(2.5 - q, 3);
63  }
64  return 0.0;
65 }
66 static double wk_qs(DensityKernel * kernel, double q) {
67  if(q < 1.0) {
68  return pow(3 - q, 5) - 6 * pow(2 - q, 5) + 15 * pow(1 - q, 5);
69  }
70  if(q < 2.0) {
71  return pow(3 - q, 5)- 6 * pow(2 - q, 5);
72  }
73  if(q < 3.0) {
74  return pow(3 - q, 5);
75  }
76  return 0.0;
77 }
78 static double dwk_qs(DensityKernel * kernel, double q) {
79  if(q < 1.0) {
80  return -5 * pow(3 - q, 4) + 30 * pow(2 - q, 4)
81  - 75 * pow (1 - q, 4);
82  }
83  if(q < 2.0) {
84  return -5 * pow(3 - q, 4) + 30 * pow(2 - q, 4);
85  }
86  if(q < 3.0) {
87  return -5 * pow(3 - q, 4);
88  }
89  return 0.0;
90 }
91 
92 static struct {
93  const char * name;
94  double (*wk)(DensityKernel * kernel, double q);
95  double (*dwk)(DensityKernel * kernel, double q);
96  double support; /* H / h, see Price 2011: arxiv 1012.1885*/
97  double sigma[3];
98 } KERNELS[] = {
99  { "CubicSpline", wk_cs, dwk_cs, 2.,
100  {2 / 3., 10 / (7 * M_PI), 1 / M_PI} },
101  { "QuinticSpline", wk_qs, dwk_qs, 3.,
102  {1 / 120., 7 / (478 * M_PI), 1 / (120 * M_PI)} },
103  { "QuarticSpline", wk_qus, dwk_qus, 2.5,
104  {1 / 24., 96 / (1199 * M_PI), 1 / (20 * M_PI)} },
105 };
106 
107 double
109 {
110  double support = KERNELS[kernel->type].support;
111  return kernel->dWknorm *
112  KERNELS[kernel->type].dwk(kernel, u * support);
113 }
114 
115 double
117 {
118  double support = KERNELS[kernel->type].support;
119  return kernel->Wknorm *
120  KERNELS[kernel->type].wk(kernel, u * support);
121 }
122 
123 double
125 {
126  /* this returns the expected number of ngb in for given sph resolution
127  * deseta */
128  /* See Price: arxiv 1012.1885. eq 12 */
129  double support = kernel->support;
130  return NORM_COEFF * pow(support * eta, NUMDIMS);
131 }
132 
133 double
135 {
136  return NORM_COEFF * pow(kernel->H, NUMDIMS);
137 }
138 
139 static void
141 {
142  kernel->H = H;
143  kernel->HH = H * H;
144  kernel->Hinv = 1. / H;
145  kernel->type = type;
146  kernel->name = KERNELS[kernel->type].name;
147  kernel->support = KERNELS[kernel->type].support;
148 
149  double sigma = KERNELS[kernel->type].sigma[NUMDIMS - 1];
150  double hinv = kernel->Hinv * kernel->support;
151 
152  kernel->Wknorm = sigma * pow(hinv, NUMDIMS);
153  kernel->dWknorm = kernel->Wknorm * hinv;
154 }
155 
156 void
158 {
159  int t = -1;
160  if(type == DENSITY_KERNEL_CUBIC_SPLINE) {
161  t = 0;
162  } else
163  if(type == DENSITY_KERNEL_QUINTIC_SPLINE) {
164  t = 1;
165  } else
166  if(type == DENSITY_KERNEL_QUARTIC_SPLINE) {
167  t = 2;
168  } else {
169  endrun(1, "Density Kernel type is unknown\n");
170  }
172 }
double density_kernel_dwk(DensityKernel *kernel, double u)
double support
Definition: densitykernel.c:96
static double dwk_qs(DensityKernel *kernel, double q)
Definition: densitykernel.c:78
static double wk_qs(DensityKernel *kernel, double q)
Definition: densitykernel.c:66
double(* wk)(DensityKernel *kernel, double q)
Definition: densitykernel.c:94
const char * name
Definition: densitykernel.c:93
double(* dwk)(DensityKernel *kernel, double q)
Definition: densitykernel.c:95
static void density_kernel_init_with_type(DensityKernel *kernel, int type, double H)
static struct @3 KERNELS[]
double wk_cs(DensityKernel *kernel, double q)
Definition: densitykernel.c:24
double density_kernel_volume(DensityKernel *kernel)
void density_kernel_init(DensityKernel *kernel, double H, enum DensityKernelType type)
double density_kernel_desnumngb(DensityKernel *kernel, double eta)
double dwk_cs(DensityKernel *kernel, double q)
Definition: densitykernel.c:33
double sigma[3]
Definition: densitykernel.c:97
static double wk_qus(DensityKernel *kernel, double q)
Definition: densitykernel.c:42
static double dwk_qus(DensityKernel *kernel, double q)
Definition: densitykernel.c:54
double density_kernel_wk(DensityKernel *kernel, double u)
DensityKernelType
Definition: densitykernel.h:17
@ DENSITY_KERNEL_CUBIC_SPLINE
Definition: densitykernel.h:18
@ DENSITY_KERNEL_QUINTIC_SPLINE
Definition: densitykernel.h:19
@ DENSITY_KERNEL_QUARTIC_SPLINE
Definition: densitykernel.h:20
#define NORM_COEFF
Definition: densitykernel.h:6
#define NUMDIMS
Definition: densitykernel.h:5
void endrun(int where, const char *fmt,...)
Definition: endrun.c:147
static double kernel(double loga, void *params)
Definition: lightcone.c:59