Commit a88dbf1ecbd3b8b2dc65d289b176547d31ca1c68

Authored by Hacene SI HADJ MOHAND
1 parent 88605249

9719 ok

Showing 2 changed files with 122 additions and 28 deletions   Show diff stats
src/Parameters/DataTypeMath.hh
... ... @@ -317,7 +317,7 @@ Type1 alfvenVelocity(Type1 density, Type2 mag) {
317 317 if (density <= 0) {
318 318 val << NotANumber();
319 319 } else {
320   - val = 21.83 *mag / std::sqrt(density);
  320 + val = 21.83 * mag / std::sqrt(density);
321 321 }
322 322 return val;
323 323 }
... ... @@ -342,8 +342,8 @@ Type1 fairfield70(Type1 y_sm, Type2 z_sm,Type3 x_ss) {
342 342 * @return delta Z
343 343 */
344 344 template <typename Type1, typename Type2>
345   -Type1 fairfield70(std::vector<Type1> xyz_sm, Type2 x_ss) {
346   - Type1 val = xyz_sm[2]-std::sqrt(121.0 - 0.537778 * pow(xyz_sm[1], 2.0)) * std::sin(x_ss*DEG2RAD);
  345 +Type1 fairfield70(std::vector<Type1> xyz_sm, Type2 x_ss) {
  346 + Type1 val = xyz_sm[2] - std::sqrt(121.0 - 0.537778 * pow(xyz_sm[1], 2.0)) * std::sin(x_ss * DEG2RAD);
347 347 return val;
348 348 }
349 349  
... ... @@ -354,8 +354,8 @@ Type1 fairfield70(std::vector&lt;Type1&gt; xyz_sm, Type2 x_ss) {
354 354 * @return delta Z
355 355 */
356 356 template <typename Type1, typename Type2>
357   -Type1 fairfield80(std::vector<Type1> xyz_sm, Type2 x_ss) {
358   - Type1 val = xyz_sm[2]-10.5*std::sqrt(1.0-pow(xyz_sm[1], 2.0)/289.0)* std::sin(x_ss * DEG2RAD);
  357 +Type1 fairfield80(std::vector<Type1> xyz_sm, Type2 x_ss) {
  358 + Type1 val = xyz_sm[2] - 10.5 * std::sqrt(1.0 - pow(xyz_sm[1], 2.0) / 289.0) * std::sin(x_ss * DEG2RAD);
359 359 return val;
360 360 }
361 361  
... ... @@ -370,8 +370,8 @@ Type1 fairfield80(std::vector&lt;Type1&gt; xyz_sm, Type2 x_ss) {
370 370 * denotes the latitudinal angle of the IMF vector measured from the solar equatorial plane.
371 371 */
372 372 template <typename Type1, typename Type2, typename Type3>
373   -Type1 perreault78(Type1 E_mag, Type2 B_mag,Type3 theta_p) {
374   - Type1 val = E_mag*B_mag/(4*std::atan(1)*4)*std::pow((7*RE*std::pow(sin(theta_p/2),2)),2);
  373 +Type1 perreault78(Type1 E_mag, Type2 B_mag, Type3 theta_p) {
  374 + Type1 val = E_mag * B_mag / (4 * std::atan(1)*4) * std::pow((7 * RE * std::pow(sin(theta_p / 2), 2)), 2);
375 375 return val;
376 376 }
377 377  
... ... @@ -383,11 +383,11 @@ Type1 perreault78(Type1 E_mag, Type2 B_mag,Type3 theta_p) {
383 383 * theta IMF clock angle arctan(By/Bz)
384 384 */
385 385 template <typename Type1, typename Type2>
386   -Type1 newell2007(Type1 mu, std::vector<Type2> Bxyz) {
387   - Type2 B_mag = std::sqrt(Bxyz[0]*Bxyz[0] + Bxyz[1]*Bxyz[1] + Bxyz[2]*Bxyz[2]);
388   - Type2 theta = std::atan2(Bxyz[1]/Bxyz[2]);
389   - Type1 val = std::pow(mu , 4.0/3.0)*std::pow(B_mag , 2.0/3.0)*pow(std::sin(theta/2),8.0/3.0);
390   - return val;
  386 +Type1 newell2007(Type1 mu, std::vector<Type2> Bxyz) {
  387 + Type2 B_mag = std::sqrt(Bxyz[0] * Bxyz[0] + Bxyz[1] * Bxyz[1] + Bxyz[2] * Bxyz[2]);
  388 + Type2 theta = std::atan2(Bxyz[1] / Bxyz[2]);
  389 + Type1 val = std::pow(mu, 4.0 / 3.0) * std::pow(B_mag, 2.0 / 3.0) * pow(std::sin(theta / 2), 8.0 / 3.0);
  390 + return val;
391 391 }
392 392  
393 393 /**
... ... @@ -398,12 +398,81 @@ Type1 newell2007(Type1 mu, std::vector&lt;Type2&gt; Bxyz) {
398 398 * R is the radial distance in RE and DTA is the dipole tilt angle
399 399 */
400 400 template <typename Type1, typename Type2, typename Type3, typename Type4>
401   -Type1 lopez90(Type1 Kp, Type2 phi,Type3 R, Type4 DTA) {
402   - Type1 val = -(0.14*Kp+0.69)*std::pow(phi, 0.3333)*(0.065*R-0.16)*DTA*DEG2RAD;
  401 +Type1 lopez90(Type1 Kp, Type2 phi, Type3 R, Type4 DTA) {
  402 + Type1 val = -(0.14 * Kp + 0.69) * std::pow(phi, 0.3333)*(0.065 * R - 0.16) * DTA*DEG2RAD;
403 403 return val;
404 404 }
405 405  
  406 +template <typename Type1, typename Type2>
  407 +Type1 pv_ionos_te(Type1 alt, Type2 sza) {
  408 +
  409 + Type1 te;
  410 + if (alt > 3000 || alt < 150) {
  411 + te << NotANumber();
  412 + return te;
  413 + } else {
  414 +
  415 + std::vector<double> pb;
  416 + pb.resize(4);
  417 + // 0 was added to fdsmodt in order to keep indexes as in fortran original source
  418 + const std::vector< double> fdsmodt{0,
  419 + 3.567296, 1.3836078e-02, 1.5086544e-02, 6.0729804e-03, 4.0306677e-03,
  420 + -1.3217842e-02, 7.8089219e-03, -2775.023, -123.7310, 8.828382,
  421 + -96.94563, 15.84634, 138.9812, -139.7511, -84.03277,
  422 + 0.2649297, -1.444215, 0.6347786, -2.192531, -0.5396207,
  423 + 0.6054179, 1.0569388e-04, -8.0908003e-06, 1.3877957e-05, -1.2327257e-05,
  424 + -1.1256760e-05, 1.3830228e-05, -1.4350858e-05};
  425 + double s = std::sin(sza);
  426 + double c = std::cos(sza);
  427 + double s2 = std::sin(2 * sza);
  428 + double c2 = std::cos(2 * sza);
  429 + double s3 = std::sin(3 * sza);
  430 + double c3 = std::cos(3 * sza);
  431 + for (int j = 1; j < 5; j++) {
  432 + int k = 7 * j;
  433 + pb[j - 1] = fdsmodt[k - 6] + fdsmodt[k - 5] * s + fdsmodt[k - 4] * c + fdsmodt[k - 3] * s2 + fdsmodt[k - 2] * c2 +
  434 + fdsmodt[k - 1] * s3 + fdsmodt[k] * c3;
  435 + }
  436 + te = (Type1) pb[0] + pb[1] / ((alt + pb[2])*(alt + pb[2])) + pb[3] * alt;
  437 + return te;
  438 + }
  439 +}
  440 +
  441 +template <typename Type1, typename Type2>
  442 +Type1 pv_ionos_dn(Type1 alt, Type2 sza) {
406 443  
  444 + Type1 dn;
  445 + if (alt > 3000 || alt < 150) {
  446 + dn << NotANumber();
  447 + return dn;
  448 + } else {
  449 + std::vector<double> bp;
  450 + bp.resize(4);
  451 + // 0 was added to fdsmodde in order to keep indexes as in fortran original source
  452 + const std::vector<double> fdsmodde{0,
  453 + 5.334022, 252.5587, 120.4444, 9.1163822E-02, -6.195264,
  454 + 37.38898, 3.331818, 245.5529, 0.7587564, 0.1453792,
  455 + -0.9461438, 127.1485, -0.3391595, 2.4936652E-02, 0.1879423,
  456 + -5.3126566E-02, 2.9439656E-02, 1.654282, 415.7859, 2.6281483E-02,
  457 + 145.3951, 2.045347, 0.4421963, 3.036170, 9.1009791E-04,
  458 + 141.5824};
  459 + double s2 = std::sin(sza) * std::sin(sza);
  460 + double szap = sza * (1. - fdsmodde[23] * s2 * std::exp(-fdsmodde[24] * s2 - fdsmodde[25]*(alt - fdsmodde[26])*(alt - fdsmodde[26])));
  461 + double sinz = std::sin(fdsmodde[18] + szap);
  462 + double s = fdsmodde[1] + fdsmodde[2] / (alt - fdsmodde[3])
  463 + + sinz * fdsmodde[13]
  464 + + fdsmodde[19] * std::exp(-fdsmodde[20]*((alt - fdsmodde[21])*(alt - fdsmodde[21])) - fdsmodde[22] * szap * szap);
  465 + double o = fdsmodde[4] + fdsmodde[5] / (alt - fdsmodde[6]) + sinz * fdsmodde[14];
  466 + double c = fdsmodde[7] + fdsmodde[8] / (alt - fdsmodde[9]) + sinz * fdsmodde[15];
  467 + double m = fdsmodde[10] + fdsmodde[11] / (alt - fdsmodde[12]) + sinz * fdsmodde[16];
  468 + double ss = s * cos(fdsmodde[17] + szap);
  469 + double calc = (1.77245 * ss * erfc(-ss) + std::exp(-ss * ss) + o);
  470 + if (calc <= 0)
  471 + calc = 0.00001;
  472 + dn = (Type1) c + m * log(calc);
  473 + return dn;
  474 + }
  475 +}
407 476  
408 477 /**
409 478 * @brief Operator cross product between two vector
... ... @@ -1391,18 +1460,20 @@ std::vector&lt;Type&gt; total(const AMDA::Parameters::Tab2DData&lt;Type&gt;&amp; a, int mode) {
1391 1460 }
1392 1461  
1393 1462 // Reshape a Tab2D to a vector
  1463 +
1394 1464 template <typename Type>
1395 1465 std::vector<Type> reshapeToVector(const AMDA::Parameters::Tab2DData<Type>& a) {
1396 1466 std::vector<Type> v;
1397   - v.resize(a.getDim1Size()*a.getDim2Size());
  1467 + v.resize(a.getDim1Size() * a.getDim2Size());
1398 1468 for (int r = 0; r < a.getDim1Size(); ++r) {
1399 1469 for (int c = 0; c < a.getDim2Size(); ++c) {
1400   - v[r*a.getDim2Size() + c] = a[r][c];
  1470 + v[r * a.getDim2Size() + c] = a[r][c];
1401 1471 }
1402 1472 }
1403 1473  
1404 1474 return v;
1405 1475 }
  1476 +
1406 1477 /*
1407 1478 * Evaluation of SuperMAG auroral electrojet indices as indicators
1408 1479 * of substorms and auroral power
... ... @@ -1410,7 +1481,7 @@ std::vector&lt;Type&gt; reshapeToVector(const AMDA::Parameters::Tab2DData&lt;Type&gt;&amp; a) {
1410 1481 */
1411 1482 template <typename Type>
1412 1483 Type newell2011(Type a) {
1413   - return 0.048*a + 0.241*std::sqrt(a) ;
  1484 + return 0.048 * a + 0.241 * std::sqrt(a);
1414 1485 }
1415 1486  
1416 1487 template <typename Type1, typename Type2>
... ... @@ -1490,15 +1561,14 @@ std::vector&lt;Type1&gt; operator/(AMDA::Parameters::TabRow&lt;Type1&gt; a, std::vector&lt;Type
1490 1561 }
1491 1562  
1492 1563 template<typename Type>
1493   -bool isValid(const std::string& num) {
1494   - bool flag = true;
1495   - try {
1496   - Type tmp = boost::lexical_cast<Type>(num);
1497   - }
1498   - catch (boost::bad_lexical_cast &e) {
1499   - flag = false;
1500   - }
1501   - return flag;
  1564 +bool isValid(const std::string& num) {
  1565 + bool flag = true;
  1566 + try {
  1567 + Type tmp = boost::lexical_cast<Type>(num);
  1568 + } catch (boost::bad_lexical_cast &e) {
  1569 + flag = false;
  1570 + }
  1571 + return flag;
1502 1572 }
1503 1573  
1504 1574 template <typename Type>
... ... @@ -1520,8 +1590,8 @@ std::pair&lt;Type, Type&gt; operator+(std::pair&lt;Type, Type&gt; a, std::pair&lt;Type, Type&gt; b
1520 1590 template <typename Type>
1521 1591 std::pair<Type, Type> operator*(std::pair<Type, Type> a, std::pair<Type, Type> b) {
1522 1592 std::pair<Type, Type> c;
1523   - c.first = a.first* b.firest;
1524   - c.second = a.second* b.second;
  1593 + c.first = a.first * b.firest;
  1594 + c.second = a.second * b.second;
1525 1595 return c;
1526 1596 }
1527 1597  
... ...
test/data/functions.xml
... ... @@ -189,6 +189,30 @@
189 189 </info_brief>
190 190 <new_kernel>lopez90</new_kernel>
191 191 </function>
  192 + <function name="pv_ionos_dn(,)" args="2" kind="model" group="space">
  193 + <prompt_param></prompt_param>
  194 + <default_args>alt(Km), sza(Radians)</default_args>
  195 + <info_brief>
  196 + Electron Density around Venus &lt;br/&gt;
  197 + dn = pv_ionos_dn(alt, sza) &lt;br/&gt;
  198 + alt is the altitude in Km
  199 + sza is the solat zenith angle in radians
  200 + dn is the base 10 log of the model electron density in no/cc
  201 + </info_brief>
  202 + <new_kernel>pv_ionos_dn</new_kernel>
  203 + </function>
  204 + <function name="pv_ionos_te(,)" args="2" kind="model" group="space">
  205 + <prompt_param></prompt_param>
  206 + <default_args>alt(Km), sza(Radians)</default_args>
  207 + <info_brief>
  208 + Electron temperature around Venus &lt;br/&gt;
  209 + te = pv_ionos_dn(alt, sza) &lt;br/&gt;
  210 + alt is the altitude in Km
  211 + sza is the solat zenith angle in radians
  212 + te is in log10 deg K
  213 + </info_brief>
  214 + <new_kernel>pv_ionos_te</new_kernel>
  215 + </function>
192 216 <function name="framesTransformation(,,,)" args="1" kind="frames" group="space">
193 217 <prompts>
194 218 <prompt type="list" subtype="frames" default="GSM">Input frame:</prompt>
... ...