cooling.h 4.88 KB
 Stefan Arridge committed Sep 05, 2016 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 /******************************************************************************* * This file is part of SWIFT. * Copyright (c) 2016 Matthieu Schaller (matthieu.schaller@durham.ac.uk) * Richard Bower (r.g.bower@durham.ac.uk) * Stefan Arridge (stefan.arridge@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 . * ******************************************************************************/  Matthieu Schaller committed Sep 05, 2016 21 22 #ifndef SWIFT_COOLING_CONST_DU_H #define SWIFT_COOLING_CONST_DU_H  Stefan Arridge committed Sep 05, 2016 23 24  /**  25  * @file src/cooling/const_du/cooling.h  Stefan Arridge committed Sep 05, 2016 26 27 28  * @brief Routines related to the "constant cooling" cooling function. * * This is the simplest possible cooling function. A constant cooling rate with  29 30  * a minimal energy floor is applied. Should be used as a template for more * realistic functions.  Stefan Arridge committed Sep 05, 2016 31 32 33 34 35 36 37  */ /* Some standard headers. */ #include /* Local includes. */ #include "const.h"  38 #include "cooling_struct.h"  Stefan Arridge committed Sep 05, 2016 39 40 41 42 43 44 45 46 47 48 #include "error.h" #include "hydro.h" #include "parser.h" #include "part.h" #include "physical_constants.h" #include "units.h" /** * @brief Apply the cooling function to a particle. *  49 50 51  * In this simple example we just apply the const cooling rate * and check that we don't go below the given floor. *  Stefan Arridge committed Sep 05, 2016 52 53  * @param phys_const The physical constants in internal units. * @param us The internal system of units.  Matthieu Schaller committed Sep 07, 2016 54  * @param cooling The #cooling_function_data used in the run.  Stefan Arridge committed Sep 05, 2016 55 56 57 58  * @param p Pointer to the particle data. * @param dt The time-step of this particle. */ __attribute__((always_inline)) INLINE static void cooling_cool_part(  59 60  const struct phys_const* restrict phys_const, const struct UnitSystem* restrict us,  Matthieu Schaller committed Sep 07, 2016 61  const struct cooling_function_data* restrict cooling,  Matthieu Schaller committed Sep 07, 2016 62  struct part* restrict p, struct xpart* restrict xp, float dt) {  Stefan Arridge committed Sep 05, 2016 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85  /* Get current internal energy (dt=0) */ const float u_old = hydro_get_internal_energy(p, 0.f); /* Get cooling function properties */ const float du_dt = -cooling->cooling_rate; const float u_floor = cooling->min_energy; /* Constant cooling with a minimal floor */ float u_new; if (u_old - du_dt * dt > u_floor) { u_new = u_old + du_dt * dt; } else { u_new = u_floor; } /* Update the internal energy */ hydro_set_internal_energy(p, u_new); } /** * @brief Computes the cooling time-step. *  86 87 88 89  * In this simple example, we return \f$\alpha \frac{u}{du/dt} \f$. * This is used to compute the time-step of the particle. Cooling functions * that are solved implicitly can simply return FLT_MAX here. *  Matthieu Schaller committed Sep 07, 2016 90  * @param cooling The #cooling_function_data used in the run.  Stefan Arridge committed Sep 05, 2016 91  * @param phys_const The physical constants in internal units.  92  * @param us The internal system of units.  Stefan Arridge committed Sep 05, 2016 93 94  * @param p Pointer to the particle data. */  95 __attribute__((always_inline)) INLINE static float cooling_timestep(  Matthieu Schaller committed Sep 07, 2016 96  const struct cooling_function_data* restrict cooling,  97 98  const struct phys_const* restrict phys_const, const struct UnitSystem* restrict us, const struct part* restrict p) {  Stefan Arridge committed Sep 05, 2016 99 100  const float cooling_rate = cooling->cooling_rate;  101  const float internal_energy = hydro_get_internal_energy(p, 0);  Stefan Arridge committed Sep 05, 2016 102 103 104 105 106 107 108 109 110 111 112  return cooling->cooling_tstep_mult * internal_energy / cooling_rate; } /** * @brief Initialises the cooling properties. * * @param parameter_file The parsed parameter file. * @param us The current internal system of units. * @param phys_const The physical constants in internal units. * @param cooling The cooling properties to initialize */  113 114 static INLINE void cooling_init_backend( const struct swift_params* parameter_file, const struct UnitSystem* us,  Matthieu Schaller committed Sep 07, 2016 115 116  const struct phys_const* phys_const, struct cooling_function_data* cooling) {  Stefan Arridge committed Sep 05, 2016 117   Matthieu Schaller committed Sep 05, 2016 118  cooling->cooling_rate =  119  parser_get_param_double(parameter_file, "ConstCooling:cooling_rate");  Stefan Arridge committed Sep 05, 2016 120  cooling->min_energy =  121 122 123  parser_get_param_double(parameter_file, "ConstCooling:min_energy"); cooling->cooling_tstep_mult = parser_get_param_double( parameter_file, "ConstCooling:cooling_tstep_mult");  Stefan Arridge committed Sep 05, 2016 124 125 126 127 128 129 130 } /** * @brief Prints the properties of the cooling model to stdout. * * @param cooling The properties of the cooling function. */  Matthieu Schaller committed Sep 07, 2016 131 132 static INLINE void cooling_print_backend( const struct cooling_function_data* cooling) {  Stefan Arridge committed Sep 05, 2016 133   134  message("Cooling function is 'Constant cooling' with rate %f and floor %f.",  Stefan Arridge committed Sep 05, 2016 135 136 137  cooling->cooling_rate, cooling->min_energy); }  Matthieu Schaller committed Sep 05, 2016 138 #endif /* SWIFT_COOLING_CONST_DU_H */