/******************************************************************************* * This file is part of SWIFT. * Copyright (C) 2016 James Willis (james.s.willis@durham.ac.uk). * 2018 Peter W. Draper (p.w.draper@durham.ac.uk) * * 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 . * ******************************************************************************/ #include /* Includes. */ #include "swift.h" #define Ntest 3 #define tol 1e-12 #define itol 1000 #define filename "output_list_params.yml" /* Expected values from file */ const double time_values[Ntest] = { 0., 10., 12., }; /* Expected values from file */ const double a_values[Ntest] = { 0.01, 0.1, 0.5, }; void test_no_cosmo(struct engine *e, const char *name, const int with_assert) { message("Testing output time for %s without cosmology", name); struct output_list *list = NULL; double delta_time = 0; double output_time = 0; /* Test Time */ e->time_begin = 0; e->time_end = 14; e->time_base = (e->time_end - e->time_begin) / max_nr_timesteps; e->ti_current = 0; e->policy = 0; /* initialize output_list */ output_list_init(&list, e, name, &delta_time); output_list_print(list); output_time = list->times[0]; for (int i = 0; i < Ntest; i++) { /* Test last value */ if (with_assert) { assert(fabs(output_time - time_values[i]) < tol); } /* Set current time */ e->ti_current = (output_time - e->time_begin) / e->time_base; e->ti_current += itol; /* Read next value */ integertime_t ti_next = 0; output_list_read_next_time(list, e, name, &ti_next); output_time = (double)(ti_next * e->time_base) + e->time_begin; } output_list_clean(&list); }; void test_cosmo(struct engine *e, const char *name, const int with_assert) { message("Testing output time for %s with cosmology", name); struct output_list *list = NULL; double delta_time = 0; double output_time = 0; /* Test Time */ e->time_base = log(e->time_end / e->cosmology->a_begin) / max_nr_timesteps; e->ti_current = 0; e->policy = engine_policy_cosmology; /* initialize output_list */ output_list_init(&list, e, name, &delta_time); output_list_print(list); output_time = list->times[0]; for (int i = 0; i < Ntest; i++) { /* Test last value */ if (with_assert) { assert(fabs(output_time - a_values[i]) < tol); } /* Set current time */ e->ti_current = log(output_time / e->cosmology->a_begin) / e->time_base; e->ti_current += 16; /* Read next value */ integertime_t ti_next = 0; output_list_read_next_time(list, e, name, &ti_next); output_time = (double)exp(ti_next * e->time_base) * e->cosmology->a_begin; } output_list_clean(&list); }; int main(int argc, char *argv[]) { /* Initialize CPU frequency, this also starts time. */ unsigned long long cpufreq = 0; clocks_set_cpufreq(cpufreq); /* Create a structure to read file into. */ struct swift_params params; /* Read the parameter file. */ parser_read_file(filename, ¶ms); /* initialization of unit system */ struct unit_system us; units_init_from_params(&us, ¶ms, "Units"); /* initialization of phys_const */ struct phys_const phys_const; phys_const_init(&us, ¶ms, &phys_const); /* initialization of cosmo */ struct cosmology cosmo; cosmology_init(¶ms, &us, &phys_const, &cosmo); /* Pseudo initialization of engine */ struct engine e; bzero(&e, sizeof(struct engine)); e.cosmology = &cosmo; e.parameter_file = ¶ms; e.physical_constants = &phys_const; e.internal_units = &us; e.verbose = 1; int with_assert = 1; int without_assert = 0; /* Test without cosmo */ test_no_cosmo(&e, "Time", with_assert); /* Test with cosmo */ test_cosmo(&e, "Redshift", with_assert); test_cosmo(&e, "ScaleFactor", with_assert); test_cosmo(&e, "Time", without_assert); cosmology_clean(&cosmo); /* Write message and leave */ message("Test done"); return 0; }