/*+ ARES/HADES/BORG Package -- ./src/common/configuration.hpp Copyright (C) 2014-2020 Guilhem Lavaux Copyright (C) 2009-2020 Jens Jasche Additional contributions from: Guilhem Lavaux (2023) +*/ #ifndef _ARES3_CONFIGURATION_HPP #define _ARES3_CONFIGURATION_HPP #include #include #include #include #include #include #include #include "libLSS/tools/console.hpp" #include "libLSS/samplers/core/main_loop.hpp" #include "libLSS/samplers/core/types_samplers.hpp" #include "libLSS/mcmc/state_sync.hpp" #include #include "libLSS/data/projection.hpp" #include "preparation_types.hpp" #include "preparation_tools.hpp" namespace LibLSS { /** * @brief This function loads the configuration stored in the property tree params and fills up * the MarkovState dictionnary of the MainLoop * * @tparam PTree the property tree type, it will be deduced from parameter * @param comm an MPI communicator * @param loop the main loop to configure * @param params the property tree filled up from a configuration file */ template inline void loadConfigurationFile( MPI_Communication &comm, MainLoop &loop, PTree ¶ms) { using boost::format; using boost::to_lower_copy; using CosmoTool::square; using details::property_accessor; using std::sqrt; long N0, N1, N2, Ndata0, Ndata1, Ndata2; double L0, L1, L2; double K_MAX, K_MIN; Console &cons = Console::instance(); MarkovState &state = loop.get_state(); PTree system_params = params.get_child("system"); PTree cosmo_params = params.get_child("cosmology"); MPI_SyncBundle *syncBundle; ptrdiff_t local_size, local_size1, localn0, startn0, localn1, startn1; try { cons.setVerboseLevel( property_accessor(system_params, "verbose_level")); } catch (const boost::property_tree::ptree_bad_path &e) { cons.print( "Missing option in configuration " + e.path().dump()); } catch (const ErrorParams &) { cons.print( "Error ignored on VERBOSE_LEVEL"); // No parameter equal keep default value } if (auto o = system_params.template get_optional("logfile_verbose_level")) { cons.format("Setting up logfile level to %d", *o); cons.setLogfileVerboseLevel(*o); } // Load reconstruction box parameters N0 = adapt(state, system_params, "N0"); N1 = adapt(state, system_params, "N1"); N2 = adapt(state, system_params, "N2"); Ndata0 = adapt(state, system_params, "Ndata0", N0); Ndata1 = adapt(state, system_params, "Ndata1", N1); Ndata2 = adapt(state, system_params, "Ndata2", N2); cons.print( format("Got base resolution at %d x %d x %d") % N0 % N1 % N2); state.newScalar("N2_HC", N2 / 2 + 1); size_t localNdata[6]; #ifdef ARES_MPI_FFTW local_size = MPI_FCalls::local_size_3d(N0, N1, N2, comm.comm(), &localn0, &startn0); // Local size when first two dims are swapped local_size1 = MPI_FCalls::local_size_3d(N1, N0, N2, comm.comm(), &localn1, &startn1); state.newScalar("N2real", 2 * (N2 / 2 + 1)); { ptrdiff_t data_localn0, data_startn0; MPI_FCalls::local_size_3d( Ndata0, Ndata1, Ndata2, comm.comm(), &data_localn0, &data_startn0); localNdata[0] = data_startn0; localNdata[1] = data_startn0 + data_localn0; localNdata[2] = 0; localNdata[3] = Ndata1; localNdata[4] = 0; localNdata[5] = Ndata2; } #else state.newScalar("N2real", N2); local_size1 = local_size = N0 * N1 * (N2 / 2 + 1); localn0 = N0; startn0 = 0; startn1 = 0; localn1 = N1; state.newScalar("N2real", N2); localNdata[0] = 0; localNdata[1] = Ndata0; localNdata[2] = 0; localNdata[3] = Ndata1; localNdata[4] = 0; localNdata[5] = Ndata2; #endif for (int i = 0; i < 6; i++) state.newScalar(boost::format("localNdata%d") % i, localNdata[i]) ->setDoNotRestore(true); state.newScalar("startN0", startn0); state.newScalar("localN0", localn0); state.newScalar("fourierLocalSize", local_size); state.newScalar("startN1", startn0); state.newScalar("localN1", localn0); state.newScalar("fourierLocalSize1", local_size1); L0 = adapt(state, system_params, "L0"); L1 = adapt(state, system_params, "L1"); L2 = adapt(state, system_params, "L2"); adapt(state, system_params, "corner0"); adapt(state, system_params, "corner1"); adapt(state, system_params, "corner2"); K_MAX = M_PI * sqrt(square(N0 / L0) + square(N1 / L1) + square(N2 / L2)) * 1.1; K_MIN = 0; state.newScalar("K_MAX", K_MAX); state.newScalar("K_MIN", K_MIN); adapt(state, system_params, "NUM_MODES"); adapt(state, system_params, "ares_heat", 1.0); ScalarStateElement *s_cosmo = new ScalarStateElement(); CosmologicalParameters &cosmo = s_cosmo->value; // Load cosmology cosmo.omega_r = property_accessor(cosmo_params, "omega_r"); cosmo.omega_k = property_accessor(cosmo_params, "omega_k"); cosmo.omega_m = property_accessor(cosmo_params, "omega_m"); cosmo.omega_b = property_accessor(cosmo_params, "omega_b"); cosmo.omega_q = property_accessor(cosmo_params, "omega_q"); cosmo.w = property_accessor(cosmo_params, "w"); cosmo.n_s = property_accessor(cosmo_params, "n_s"); cosmo.fnl = property_accessor(cosmo_params, "fnl"); cosmo.wprime = property_accessor(cosmo_params, "wprime"); cosmo.sigma8 = property_accessor(cosmo_params, "sigma8"); cosmo.h = property_accessor(cosmo_params, "h100"); cosmo.beta = property_accessor(cosmo_params, "beta"); cosmo.z0 = property_accessor(cosmo_params, "z0"); cosmo.a0 = 1; state.newElement("cosmology", s_cosmo, true); //true); } } // namespace LibLSS #endif