15 #include "eckit/config/Resource.h"
16 #include "eckit/filesystem/PathName.h"
17 #include "eckit/log/Log.h"
20 using namespace eckit;
43 std::string rtable_file;
46 sr.setf(std::ios_base::right, std::ios_base::adjustfield);
50 PathName fpath = Resource<PathName>(
"$ODB_RTABLE_PATH",
"~/odb/include");
52 rtable_file = fpath +
"/rtablel_2" + sr.str();
54 Log::info() <<
" gaussian grid table = " << rtable_file << std::endl;
55 std::ifstream input(rtable_file.c_str());
57 NRGRI =
new int[nexp];
62 while (input.getline(line,
sizeof(line) - 1)) {
63 char* lb = strchr(line,
'(');
64 char* rb = lb ? strchr(line,
')') : NULL;
65 char* eq = rb ? strchr(line,
'=') : NULL;
67 if (lb < rb && rb < eq) {
68 char* comma = strchr(line,
',');
71 if (comma && eq < comma)
78 if (
id >= 0 && id < nexp && npts > 0) {
88 Log::info() <<
"read_rtablel_2_file(): Unsupported resolution Txxxx = " << Txxxx
89 <<
" or $ODB_RTABLE_PATH not defined" << std::endl;
118 zbes[0] = 2.4048255577e0;
119 zbes[1] = 5.5200781103e0;
120 zbes[2] = 8.6537279129e0;
121 zbes[3] = 11.7915344391e0;
122 zbes[4] = 14.9309177086e0;
123 zbes[5] = 18.0710639679e0;
124 zbes[6] = 21.2116366299e0;
125 zbes[7] = 24.3524715308e0;
126 zbes[8] = 27.4934791320e0;
127 zbes[9] = 30.6346064684e0;
128 zbes[10] = 33.7758202136e0;
129 zbes[11] = 36.9170983537e0;
130 zbes[12] = 40.0584257646e0;
131 zbes[13] = 43.1997917132e0;
132 zbes[14] = 46.3411883717e0;
133 zbes[15] = 49.4826098974e0;
134 zbes[16] = 52.6240518411e0;
135 zbes[17] = 55.7655107550e0;
136 zbes[18] = 58.9069839261e0;
137 zbes[19] = 62.0484691902e0;
138 zbes[20] = 65.1899648002e0;
139 zbes[21] = 68.3314693299e0;
140 zbes[22] = 71.4729816036e0;
141 zbes[23] = 74.6145006437e0;
142 zbes[24] = 77.7560256304e0;
143 zbes[25] = 80.8975558711e0;
144 zbes[26] = 84.0390907769e0;
145 zbes[27] = 87.1806298436e0;
146 zbes[28] = 90.3221726372e0;
147 zbes[29] = 93.4637187819e0;
148 zbes[30] = 96.6052679510e0;
149 zbes[31] = 99.7468198587e0;
150 zbes[32] = 102.8883742542e0;
151 zbes[33] = 106.0299309165e0;
152 zbes[34] = 109.1714896498e0;
153 zbes[35] = 112.3130502805e0;
154 zbes[36] = 115.4546126537e0;
155 zbes[37] = 118.5961766309e0;
156 zbes[38] = 121.7377420880e0;
157 zbes[39] = 124.8793089132e0;
158 zbes[40] = 128.0208770059e0;
159 zbes[41] = 131.1624462752e0;
160 zbes[42] = 134.3040166383e0;
161 zbes[43] = 137.4455880203e0;
162 zbes[44] = 140.5871603528e0;
163 zbes[45] = 143.7287335737e0;
164 zbes[46] = 146.8703076258e0;
165 zbes[47] = 150.0118824570e0;
166 zbes[48] = 153.1534580192e0;
167 zbes[49] = 156.2950342685e0;
172 zapi = 2.0e0 * asin(1.0e0);
173 inum = std::min(knum, 50);
175 for (
int j = 0; j < inum; j++)
183 for (
int j = 50; j < knum; j++)
184 pbes[j] = pbes[j - 1] + zpi;
192 double zpi, zc, zxz, zkm2, zkm1, zfn, zkmrk, zsp, zvsp;
194 int ifk, ikk, iter, jn, il;
201 zpi = 2.0e0 * asin(1.0e0);
202 zc = (1.0e0 - pow((2.0e0 / zpi), 2)) * 0.25e0;
209 for (
int js = 0; js < ikk; js++) {
210 zxz = cos(pa[js] / sqrt(pow((ifk + 0.5e0), 2) + zc));
228 for (jn = 2; jn <= k; jn++) {
230 zpk = ((2.0e0 * zfn - 1.0e0) * zxz * zkm1 - (zfn - 1.0e0) * zkm2) / zfn;
236 zkmrk = (ifk * (zkm1 - zxz * zpk)) / (1.0e0 - zxz * zxz);
249 pw[js] = (2.0e0 * (1.0e0 - zxz * zxz)) / pow((ifk * zkm1), 2);
254 zpk = 2.0e0 / (ifk * ifk);
255 for (jn = 2; jn <= k; jn += 2) {
257 zpk = zpk * zfn * zfn / pow((zfn - 1.0e0), 2);
262 for (jn = 0; jn < ikk; jn++) {
278 double* latband = NULL;
279 double* midlat = NULL;
280 double* stlon = NULL;
281 double* deltalon = NULL;
284 double* zlatedge = NULL;
286 double zfact2 = ((double)45) / atan((
double)1);
287 int ii, iequator = ndgl / 2;
289 zlmu =
new double[ndgl];
290 zw =
new double[ndgl];
292 gauaw(zlmu, zw, ndgl);
295 for (ii = 0; ii < ndgl; ii++)
296 midlat[ii] = zfact2 * asin(zlmu[ii]);
298 zlatedge =
new double[ndgl + 1];
300 for (ii = 0; ii < ndgl / 2; ii++)
301 zlatedge[ii + 1] = asin(std::max(-1.0, std::min(1.0, sin(zlatedge[ii]) - zw[ii])));
305 zlatedge[iequator] = 0;
307 for (ii = iequator + 1; ii < ndgl + 1; ii++)
308 zlatedge[ii] = -zlatedge[ndgl - ii];
310 latband =
new double[ndgl + 1];
312 for (ii = 0; ii < ndgl + 1; ii++)
313 latband[ii] = zfact * zlatedge[ii];
319 stlon =
new double[ndgl];
320 deltalon =
new double[ndgl];
324 const double three_sixty = 360;
325 for (ii = 0; ii < ndgl; ii++) {
327 double delta = three_sixty / cnt;
328 deltalon[ii] = delta;
329 stlon[ii] = -delta / 2;
void put_cache(const RegionCacheKind &kind, const double &, const int &, double[], double[], double[], double[], int[])
int * read_rtablel_2_file(const int &, int *, int *)
virtual void create_cache(const double &, const int &)
int gauaw(double[], double[], const int &)
gauaw - compute abscissas and weights for gaussian integration
void bsslzr(double[], const int &)
virtual double get_resol(const double &val)
constexpr double recip_pi_over_180