File rk2nstorageparameters.h
File List > code_source > cosmolattice > include > CosmoInterface > evolvers > rk2nstorageparameters.h
Go to the documentation of this file
#ifndef COSMOINTERFACE_EVOLVERS_RK2NSTORAGEPARAMETERS_H
#define COSMOINTERFACE_EVOLVERS_RK2NSTORAGEPARAMETERS_H
/* File created by Adrien Florio, 2024 */
/* Released under the MIT license, see LICENSE.md. */
#include "CosmoInterface/evolvers/evolvertype.h"
namespace TempLat {
// References:
// - RK3_3: https://arxiv.org/pdf/2101.05320
// - RK3_4: https://ntrs.nasa.gov/api/citations/19940029698/downloads/19940029698.pdf .
// - RK4_5: https://arxiv.org/pdf/2101.05320 RK4CK
template<typename T>
class RK2NStorageParameters {
public:
/* Put public methods here. These should change very little over time. */
RK2NStorageParameters() = default;
static std::vector<T> getAs(EvolverType eType){
std::vector<T> res;
if (eType == RK2) res = {0, -0.5};
else if(eType == RK3_3) res = {0, -5.0/9.0, -153.0/128.0};
else if(eType == RK3_4) res = {0, -0.7825460361923583, -2.042914325731225, -1.799337253940777};
else if (eType == RK4_5) res = {0, -567301805773.0/1357537059087.0, -2404267990393.0/2016746695238.0, -3550918686646.0/2091501179385.0, -1275806237668.0/842570457699.0};
return res;
}
static std::vector<T> getBs(EvolverType eType){
std::vector<T> res;
if (eType == RK2) res = {0.5, 1.0};
else if(eType == RK3_3) res = {1.0/3.0, 15.0/16.0, 8.0/15.0};
else if(eType == RK3_4) res = {0.06688758201974097, 2.876554598956719, 0.5534657361343982, 0.3912730180961791};
else if (eType == RK4_5) res = {1432997174477.0/9575080441755.0,5161836677717.0/13612068292357.0,1720146321549.0/2090206949498.0,3134564353537.0/4481467310338.0, 2277821191437.0/14882151754819.0};
return res;
}
static std::vector<T> getCs(EvolverType eType){
std::vector<T> res;
if (eType == RK2) res = {0.0, 0.5};
else if(eType == RK3_3) res = {0.0,1.0/3.0,3.0/4.0};
else if(eType == RK3_4) res = {0.0,0.06688758201974097,0.6924057816719806,1.0};
else if (eType == RK4_5) res = {0.0,1432997174477.0/9575080441755.0,0.37040095736420475,0.6222557631344432,0.9582821306746903};
return res;
}
static size_t order(EvolverType eType){
size_t res = 2;
if(eType == RK3_3) res = 3;
if(eType == RK3_4) res = 3;
if(eType == RK4_5) res = 4;
return res;
}
static bool isRK2n(EvolverType ev){
bool res = false;
if(ev == RK2 or ev == RK3_3 or ev == RK3_4 or ev == RK4_5) res = true;
return res;
}
private:
/* Put all member variables and private methods here. These may change arbitrarily. */
};
} /* TempLat */
#endif