8 #include <bigfile-mpi.h>
19 #define GLASS_SEED_HASH(seed) ((seed) * 9999721L)
23 int main(
int argc,
char **argv)
26 MPI_Init_thread(&argc, &argv, MPI_THREAD_FUNNELED, &thread_provided);
27 if(thread_provided != MPI_THREAD_FUNNELED)
28 message(1,
"MPI_Init_thread returned %d != MPI_THREAD_FUNNELED\n", thread_provided);
31 endrun(0,
"Please pass a parameter file.\n");
41 double MaxMemSizePerNode;
57 MPI_Comm_rank(MPI_COMM_WORLD, &
ThisTask);
71 shift_dm = 0.5 * OmegaNu /
CP.
Omega0 * meanspacing;
75 shift_dm += 0.5 * meanspacing;
76 shift_gas += 0.5 * meanspacing;
77 shift_nu += 0.5 * meanspacing;
84 if(0 != big_file_mpi_create(&bf, buf, MPI_COMM_WORLD)) {
85 endrun(0,
"%s\n", big_file_get_error_message());
90 double total_nufrac = 0;
98 message(0,
"F-D velocity scale: %g. Max particle vel: %g. Fraction of mass in particles: %g\n",v_th*sqrt(All2.
TimeIC), All2.
Max_nuvel*sqrt(All2.
TimeIC), total_nufrac);
121 double mass[6] = {0};
131 int NumPartCDM = idgen_cdm->
NumPart;
132 int NumPartGas = idgen_gas->
NumPart;
141 setup_grid(idgen_cdm, shift_dm, mass[1], ICP);
149 setup_grid(idgen_gas, shift_gas, mass[0], ICP+NumPartCDM);
160 for(j=0; j<NumPartCDM+NumPartGas; j++)
172 v_th /= sqrt(All2.
TimeIC);
176 gsl_rng * g_rng = gsl_rng_alloc(gsl_rng_ranlxd1);
178 gsl_rng_set(g_rng, seedtable[0]);
180 for(i = 0; i < NumPartCDM; i++) {
182 if(i % All2.
Ngrid == 0) {
185 gsl_rng_set(g_rng, seedtable[
id / All2.
Ngrid]);
209 int NumPartNu = idgen_nu->
NumPart;
212 NumPartNu =
setup_grid(idgen_nu, shift_nu, mass[2], ICP);
215 for(j=0; j<NumPartNu; j++)
221 gsl_rng * g_rng = gsl_rng_alloc(gsl_rng_ranlxd1);
223 gsl_rng_set(g_rng, seedtable[0]);
224 for(i = 0; i < NumPartNu; i++) {
229 gsl_rng_set(g_rng, seedtable[
id / All2.
NGridNu]);
241 big_file_mpi_close(&bf, MPI_COMM_WORLD);
246 message(0,
"IC's generated.\n");
259 double k, kstart, kend, DDD;
265 fd = fopen(buf,
"w");
267 message(1,
"Failed to create powerspec file at:%s\n", buf);
272 fprintf(fd,
"# %12g %12g\n", 1/All2.
TimeIC-1, DDD);
277 message(1,
"kstart=%lg kend=%lg\n",kstart,kend);
279 for(k = kstart; k < kend; k *= 1.025)
282 fprintf(fd,
"%12g %12g\n", k, po);
double GrowthFactor(Cosmology *CP, double astart, double aend)
void init_cosmology(Cosmology *CP, const double TimeBegin, const struct UnitSystem units)
void message(int where, const char *fmt,...)
void init_endrun(int backtrace)
void endrun(int where, const char *fmt,...)
int main(int argc, char **argv)
static void print_spec(int ThisTask, const int Ngrid, struct genic_config All2, Cosmology *CP)
#define GLASS_SEED_HASH(seed)
int setup_glass(IDGenerator *idgen, PetaPM *pm, double shift, int seed, double mass, struct ic_part_data *ICP, const double UnitLength_in_cm, const char *OutputDir)
void glass_evolve(PetaPM *pm, int nsteps, const char *pkoutname, struct ic_part_data *ICP, const int NumPart, const double UnitLength_in_cm, const char *OutputDir)
void mymalloc_init(double MaxMemSizePerNode)
#define mymalloc(name, size)
double get_omega_nu(const _omega_nu *const omnu, const double a)
void petapm_module_init(int Nthreads)
void petapm_init(PetaPM *pm, double BoxSize, double Asmth, int Nmesh, double G, MPI_Comm comm)
void petapm_destroy(PetaPM *pm)
double DeltaSpec(double k, enum TransferType Type)
int init_powerspectrum(int ThisTask, double InitTime, double UnitLength_in_cm_in, Cosmology *CPin, struct power_params *ppar)
void save_all_transfer_tables(BigFile *bf, int ThisTask)
void compute_mass(double *mass, int64_t TotNumPartCDM, int64_t TotNumPartGas, int64_t TotNuPart, double nufrac, const double BoxSize, Cosmology *CP, const struct genic_config GenicConfig)
void saveheader(BigFile *bf, int64_t TotNumPartCDM, int64_t TotNumPartGas, int64_t TotNuPart, double nufrac, const double BoxSize, Cosmology *CP, const struct genic_config GenicConfig)
void write_particle_data(IDGenerator *idgen, const int Type, BigFile *bf, const uint64_t FirstID, const int SavePrePos, int NumFiles, int NumWriters, struct ic_part_data *curICP)
int setup_grid(IDGenerator *idgen, double shift, double mass, struct ic_part_data *ICP)
void idgen_init(IDGenerator *idgen, PetaPM *pm, int Ngrid, double BoxSize)
void displacement_fields(PetaPM *pm, enum TransferType Type, struct ic_part_data *dispICP, const int NumPart, Cosmology *CP, const struct genic_config GenicConfig)
void read_parameterfile(char *fname, struct genic_config *GenicConfig, int *ShowBacktrace, double *MaxMemSizePerNode, Cosmology *CP)
uint64_t idgen_create_id_from_index(IDGenerator *idgen, int index)
static struct ClockTable Clocks
double UnitVelocity_in_cm_per_s
struct power_params PowerP
int DifferentTransferFunctions
double NU_V0(const double Time, const double kBTNubyMNu, const double UnitVelocity_in_cm_per_s)
double WDM_V0(const double Time, const double WDM_therm_mass, const double Omega_CDM, const double HubbleParam, const double UnitVelocity_in_cm_per_s)
unsigned int * init_rng(int Seed, int Nmesh)
double init_thermalvel(struct thermalvel *thermals, const double v_amp, double max_fd, const double min_fd)
void add_thermal_speeds(struct thermalvel *thermals, gsl_rng *g_rng, float Vel[])
struct UnitSystem get_unitsystem(double UnitLength_in_cm, double UnitMass_in_g, double UnitVelocity_in_cm_per_s)
void walltime_init(struct ClockTable *ct)
void walltime_summary(int root, MPI_Comm comm)
void walltime_report(FILE *fp, int root, MPI_Comm comm)