/*******************************************************************************
* This file is part of SWIFT.
* Copyright (C) 2015 Matthieu Schaller (schaller@strw.leidenuniv.nl).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published
* by the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see .
*
******************************************************************************/
/* Some standard headers. */
#include
/* Some standard headers. */
#include
/* Includes. */
#include "swift.h"
int main(int argc, char *argv[]) {
size_t Ngas = 0, Ngpart = 0, Ngpart_background = 0, Nspart = 0, Nbpart = 0,
Nsink = 0, Nnupart = 0;
int flag_entropy_ICs = -1;
int i, j, k;
double dim[3];
struct part *parts = NULL;
struct gpart *gparts = NULL;
struct spart *sparts = NULL;
struct bpart *bparts = NULL;
struct sink *sinks = NULL;
struct ic_info ics_metadata;
strcpy(ics_metadata.group_name, "NoSUCH");
/* Default unit system */
struct unit_system us;
units_init_cgs(&us);
/* Properties of the ICs */
const double boxSize = 1.;
const size_t L = 4;
const double rho = 2.;
#ifdef CHEMISTRY_GRACKLE
const float he_density = rho * 0.24;
#endif
/* Read data */
read_ic_single("input.hdf5", &us, dim, &parts, &gparts, &sinks, &sparts,
&bparts, &Ngas, &Ngpart, &Ngpart_background, &Nnupart, &Nsink,
&Nspart, &Nbpart, &flag_entropy_ICs,
/*with_hydro=*/1,
/*with_gravity=*/1,
/*with_sink=*/0,
/*with_stars=*/0,
/*with_black_holes=*/0,
/*with_cosmology=*/0,
/*cleanup_h=*/0,
/*cleanup_sqrt_a=*/0,
/*h=*/1., /*a=*/1., /*n_threads=*/1, /*dry_run=*/0,
/*remap_ids=*/0, &ics_metadata);
/* Check global properties read are correct */
assert(dim[0] == boxSize);
assert(dim[1] == boxSize);
assert(dim[2] == boxSize);
assert(Ngas == L * L * L);
assert(Ngpart == L * L * L);
/* Check particles */
for (size_t n = 0; n < Ngas; ++n) {
/* Check that indices are in a reasonable range */
unsigned long long index = parts[n].id;
assert(index < Ngas);
/* Check masses */
float mass = hydro_get_mass(&parts[n]);
float correct_mass = boxSize * boxSize * boxSize * rho / Ngas;
assert(mass == correct_mass);
/* Check smoothing length */
float h = parts[n].h;
float correct_h = 2.251 * boxSize / L;
assert(h == correct_h);
/* Check velocity */
assert(parts[n].v[0] == 0.);
assert(parts[n].v[1] == 0.);
assert(parts[n].v[2] == 0.);
/* Check positions */
k = index % 4;
j = ((index - k) / 4) % 4;
i = (index - k - 4 * j) / 16;
double correct_x = i * boxSize / L + boxSize / (2 * L);
double correct_y = j * boxSize / L + boxSize / (2 * L);
double correct_z = k * boxSize / L + boxSize / (2 * L);
assert(parts[n].x[0] == correct_x);
assert(parts[n].x[1] == correct_y);
assert(parts[n].x[2] == correct_z);
/* Check accelerations */
assert(parts[n].a_hydro[0] == 0.);
assert(parts[n].a_hydro[1] == 0.);
assert(parts[n].a_hydro[2] == 0.);
#ifdef CHEMISTRY_GRACKLE
assert(parts[n].chemistry_data.he_density == he_density);
#endif
}
/* Clean-up */
free(parts);
free(gparts);
return 0;
}