9 #include <bigfile-mpi.h>
27 strides[1] = dtype_itemsize(dtype);
30 big_array_init(&array, baseptr, dtype, 2, dims, strides);
32 if(0 != big_file_mpi_create_block(bf, &block,
name, dtype, dims[1], NumFiles,
TotNumPart, comm)) {
33 endrun(0,
"%s:%s\n", big_file_get_error_message(),
name);
36 if(0 != big_block_seek(&block, &ptr, 0)) {
37 endrun(0,
"Failed to seek:%s\n", big_file_get_error_message());
40 if(0 != big_block_mpi_write(&block, &ptr, &array, NumWriters, comm)) {
41 endrun(0,
"Failed to write :%s\n", big_file_get_error_message());
44 if(0 != big_block_mpi_close(&block, comm)) {
45 endrun(0,
"%s:%s\n", big_file_get_error_message(),
name);
49 static void saveblock(BigFile * bf,
void * baseptr,
int ptype,
const char * bname,
const char * dtype,
int items_per_particle,
const int NumPart, ptrdiff_t elsize,
int NumFiles,
int NumWriters) {
52 snprintf(
name, 128,
"%d/%s",
ptype, bname);
55 dims[1] = items_per_particle;
64 const uint64_t FirstID,
66 int NumFiles,
int NumWriters,
76 uint64_t * ids = (uint64_t *)
mymalloc(
"IDs", idgen->
NumPart *
sizeof(uint64_t));
77 memset(ids, 0, idgen->
NumPart *
sizeof(uint64_t));
79 #pragma omp parallel for
80 for(i = 0; i < idgen->
NumPart; i++)
84 saveblock(bf, ids, Type,
"ID",
"u8", 1, idgen->
NumPart,
sizeof(uint64_t), NumFiles, NumWriters);
90 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)
94 const double OmegatoMass = 3 *
CP->
Hubble *
CP->
Hubble / (8 * M_PI * Grav) * pow(BoxSize, 3);
96 mass[0] = mass[2] = mass[3] = mass[4] = mass[5] = 0;
97 if (TotNumPartGas > 0) {
105 mass[2] = nufrac * OmegaNu * OmegatoMass / TotNuPart;
108 mass[1] = OmegaCDM * OmegatoMass / TotNumPartCDM;
112 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) {
114 if(0 != big_file_mpi_create_block(bf, &bheader,
"Header", NULL, 0, 0, 0, MPI_COMM_WORLD)) {
115 endrun(0,
"failed to create block %s:%s\n",
"Header",
116 big_file_get_error_message());
119 int64_t totnumpart[6] = {TotNumPartGas, TotNumPartCDM, TotNuPart, 0, 0, 0};
120 double mass[6] = {0};
121 compute_mass(mass, TotNumPartCDM, TotNumPartGas, TotNuPart, nufrac, BoxSize,
CP, GenicConfig);
123 double redshift = 1.0 / GenicConfig.
TimeIC - 1.;
125 int rt =(0 != big_block_set_attr(&bheader,
"TotNumPart", totnumpart,
"i8", 6)) ||
126 (0 != big_block_set_attr(&bheader,
"MassTable", mass,
"f8", 6)) ||
127 (big_block_set_attr(&bheader,
"Time", &GenicConfig.
TimeIC,
"f8", 1)) ||
128 (big_block_set_attr(&bheader,
"Redshift", &redshift,
"f8", 1)) ||
129 (big_block_set_attr(&bheader,
"BoxSize", &BoxSize,
"f8", 1)) ||
130 (big_block_set_attr(&bheader,
"UsePeculiarVelocity", &GenicConfig.
UsePeculiarVelocity,
"i4", 1)) ||
131 (big_block_set_attr(&bheader,
"Omega0", &
CP->
Omega0,
"f8", 1)) ||
132 (big_block_set_attr(&bheader,
"FractionNuInParticles", &nufrac,
"f8", 1)) ||
133 (big_block_set_attr(&bheader,
"OmegaBaryon", &
CP->
OmegaBaryon,
"f8", 1)) ||
134 (big_block_set_attr(&bheader,
"OmegaLambda", &
CP->
OmegaLambda,
"f8", 1)) ||
136 (big_block_set_attr(&bheader,
"UnitMass_in_g", &GenicConfig.
units.
UnitMass_in_g,
"f8", 1)) ||
138 (big_block_set_attr(&bheader,
"HubbleParam", &
CP->
HubbleParam,
"f8", 1)) ||
139 (big_block_set_attr(&bheader,
"InvertPhase", &GenicConfig.
InvertPhase,
"i4", 1)) ||
140 (big_block_set_attr(&bheader,
"Seed", &GenicConfig.
Seed,
"i8", 1)) ||
141 (big_block_set_attr(&bheader,
"UnitaryAmplitude", &GenicConfig.
UnitaryAmplitude,
"i4", 1));
143 endrun(0,
"failed to create attr %s",
144 big_file_get_error_message());
147 if(0 != big_block_mpi_close(&bheader, MPI_COMM_WORLD)) {
148 endrun(0,
"failed to close block %s:%s",
"Header",
149 big_file_get_error_message());
void endrun(int where, const char *fmt,...)
static struct ic_part_data * curICP
#define mymalloc(name, size)
double get_omega_nu(const _omega_nu *const omnu, const double a)
uint64_t idgen_create_id_from_index(IDGenerator *idgen, int index)
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 _bigfile_utils_create_block_from_c_array(BigFile *bf, void *baseptr, const char *name, const char *dtype, size_t dims[], ptrdiff_t elsize, int NumFiles, int NumWriters, MPI_Comm comm)
static void saveblock(BigFile *bf, void *baseptr, int ptype, const char *bname, const char *dtype, int items_per_particle, const int NumPart, ptrdiff_t elsize, int NumFiles, int NumWriters)
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)
double UnitVelocity_in_cm_per_s
#define walltime_measure(name)
static enum TransferType ptype