18 #define MESH2K(i) petapm_mesh_to_k(i)
33 static void gaussian_fill(
int Nmesh,
PetaPMRegion * region, pfft_complex * rho_k,
int UnitaryAmplitude,
int InvertPhase,
const int Seed);
55 for(k = 0; k < 2; k ++) {
56 idgen->
offset[k] = (ThisTask2d[k]) * Ngrid / NTask2d[k];
57 idgen->
size[k] = (ThisTask2d[k] + 1) * Ngrid / NTask2d[k];
62 idgen->
size[2] = Ngrid;
71 int i = index / (idgen->
size[2] * idgen->
size[1]) + idgen->
offset[0];
72 int j = (index % (idgen->
size[1] * idgen->
size[2])) / idgen->
size[2] + idgen->
offset[1];
73 int k = (index % idgen->
size[2]) + idgen->
offset[2];
74 uint64_t
id = ((uint64_t) i) * idgen->
Ngrid * idgen->
Ngrid + ((uint64_t)j) * idgen->
Ngrid + k + 1;
81 int x = index / (idgen->
size[2] * idgen->
size[1]) + idgen->
offset[0];
82 int y = (index % (idgen->
size[1] * idgen->
size[2])) / idgen->
size[2] + idgen->
offset[1];
83 int z = (index % idgen->
size[2]) + idgen->
offset[2];
96 #pragma omp parallel for
97 for(i = 0; i < idgen->
NumPart; i ++) {
99 ICP[i].
Pos[0] += shift;
100 ICP[i].
Pos[1] += shift;
101 ICP[i].
Pos[2] += shift;
122 double max[3] = {0, 0, 0.};
124 for(i = 0; i < NumPart; i ++) {
125 for(k = 0; k < 3; k ++) {
126 if(min[k] > ICP[i].
Pos[k])
127 min[k] = ICP[i].
Pos[k];
128 if(max[k] < ICP[i].
Pos[k])
129 max[k] = ICP[i].
Pos[k];
133 for(k = 0; k < 3; k ++) {
166 #pragma omp parallel for
167 for(i = 0; i < NumPart; i++)
195 double vel_prefac = GenicConfig.
TimeIC * hubble_a;
199 message(0,
"Producing Peculiar Velocity in the output.\n");
201 vel_prefac /= sqrt(GenicConfig.
TimeIC);
231 double maxdisp = 0, maxvel = 0;
233 #pragma omp parallel for reduction(max:maxdisp, maxvel)
238 for(k = 0; k < 3; k++)
255 MPI_Allreduce(MPI_IN_PLACE, &maxdisp, 1, MPI_DOUBLE, MPI_MAX, MPI_COMM_WORLD);
256 message(0,
"Type = %d max disp = %g in units of cell sep %g \n",
ptype, maxdisp, maxdisp / (pm->
BoxSize / pm->
Nmesh) );
258 MPI_Allreduce(MPI_IN_PLACE, &maxvel, 1, MPI_DOUBLE, MPI_MAX, MPI_COMM_WORLD);
259 message(0,
"Max vel=%g km/s, vel_prefac= %g hubble_a=%g fom=%g \n", sqrt(maxvel), vel_prefac, hubble_a,
F_Omega(
CP, GenicConfig.
TimeIC));
279 double r2 = 1.0 / pm->
Nmesh;
281 double fac = exp(- k2 * r2);
283 double kmag = sqrt(k2) * 2 * M_PI / pm->
BoxSize;
293 double fac = 1./ (2 * M_PI) / sqrt(pm->
BoxSize) * kaxis / k2;
303 double kmag = sqrt(k2) * 2 * M_PI / pm->
BoxSize;
309 double tmp = value[0][0];
310 value[0][0] = - value[0][1] * fac;
311 value[0][1] = tmp * fac;
367 for (d = 0; d < 3; d ++) {
368 pm->
Nmesh[d] = Nmesh;
390 FILE * rhokf = fopen(
"rhok",
"w");
391 printf(
"strides %td %td %td\n",
395 printf(
"size %td %td %td\n",
399 printf(
"offset %td %td %td\n",
403 fwrite(rho_k,
sizeof(
double) * region->
totalsize, 1, rhokf);
double hubble_function(const Cosmology *CP, double a)
double F_Omega(Cosmology *CP, double a)
void message(int where, const char *fmt,...)
static PetaPMFunctions functions[]
#define mymalloc2(name, size)
void petapm_force_finish(PetaPM *pm)
int * petapm_get_ntask2d(PetaPM *pm)
void petapm_region_init_strides(PetaPMRegion *region)
void petapm_force_c2r(PetaPM *pm, pfft_complex *rho_k, PetaPMRegion *regions, const int Nregions, PetaPMFunctions *functions)
pfft_complex * petapm_alloc_rhok(PetaPM *pm)
PetaPMRegion * petapm_get_fourier_region(PetaPM *pm)
PetaPMRegion * petapm_force_init(PetaPM *pm, petapm_prepare_func prepare, PetaPMParticleStruct *pstruct, int *Nregions, void *userdata)
int * petapm_get_thistask2d(PetaPM *pm)
static void pmic_fill_gaussian_gadget(PMDesc *pm, double *delta_k, int seed, int setUnitaryAmplitude, int setInvertPhase)
double DeltaSpec(double k, enum TransferType Type)
double dlogGrowth(double kmag, enum TransferType Type)
struct PMDesc::@16 ORegion
struct power_params PowerP
struct ic_part_data * curICP
#define MPIU_Barrier(comm)
#define walltime_measure(name)
static double periodic_wrap(double x, const double BoxSize)
static PetaPMRegion * makeregion(PetaPM *pm, PetaPMParticleStruct *pstruct, void *userdata, int *Nregions)
static void readout_density(PetaPM *pm, int i, double *mesh, double weight)
static void readout_vel_z(PetaPM *pm, int i, double *mesh, double weight)
void idgen_create_pos_from_index(IDGenerator *idgen, int index, double pos[3])
static void readout_disp_y(PetaPM *pm, int i, double *mesh, double weight)
static void gaussian_fill(int Nmesh, PetaPMRegion *region, pfft_complex *rho_k, int UnitaryAmplitude, int InvertPhase, const int Seed)
static void vel_y_transfer(PetaPM *pm, int64_t k2, int kpos[3], pfft_complex *value)
static void readout_vel_y(PetaPM *pm, int i, double *mesh, double weight)
static enum TransferType ptype
int setup_grid(IDGenerator *idgen, double shift, double mass, struct ic_part_data *ICP)
static void readout_vel_x(PetaPM *pm, int i, double *mesh, double weight)
static void disp_x_transfer(PetaPM *pm, int64_t k2, int kpos[3], pfft_complex *value)
static void vel_x_transfer(PetaPM *pm, int64_t k2, int kpos[3], pfft_complex *value)
static void readout_disp_z(PetaPM *pm, int i, double *mesh, double weight)
void idgen_init(IDGenerator *idgen, PetaPM *pm, int Ngrid, double BoxSize)
static void density_transfer(PetaPM *pm, int64_t k2, int kpos[3], pfft_complex *value)
void displacement_fields(PetaPM *pm, enum TransferType Type, struct ic_part_data *dispICP, const int NumPart, Cosmology *CP, const struct genic_config GenicConfig)
static void disp_transfer(PetaPM *pm, int64_t k2, int kaxis, pfft_complex *value, int include_growth)
static void disp_y_transfer(PetaPM *pm, int64_t k2, int kpos[3], pfft_complex *value)
static void vel_z_transfer(PetaPM *pm, int64_t k2, int kpos[3], pfft_complex *value)
static void readout_disp_x(PetaPM *pm, int i, double *mesh, double weight)
static struct ic_part_data * curICP
uint64_t idgen_create_id_from_index(IDGenerator *idgen, int index)
static void disp_z_transfer(PetaPM *pm, int64_t k2, int kpos[3], pfft_complex *value)