1 #ifndef ERF_ORB_COS_ZENITH_H
2 #define ERF_ORB_COS_ZENITH_H
7 #include <AMReX_REAL.H>
8 #include <AMReX_GpuQualifiers.H>
32 static constexpr
double dayspy = double(
amrex::Real(365.0));
33 static constexpr
double ve = double(
amrex::Real(80.5));
54 lambm = lambm0 + (calday - ve)*
two*
PI/dayspy;
72 invrho = (
one + eccen*std::cos(lamb - mvelpp)) / (
one - eccen*eccen);
76 delta = std::asin(std::sin(obliqr)*std::sin(lamb));
106 static constexpr
double psecdeg = double(
one)/double(
amrex::Real(3600.0));
297 double obliq_in = obliq;
298 double eccen_in = eccen;
299 double mvelp_in = mvelp;
309 eccen2 = eccen*eccen;
310 eccen3 = eccen2*eccen;
339 yb4_1950AD = double(
amrex::Real(1950.0)) - double(iyear_AD);
340 years = - yb4_1950AD;
354 for (
int i(0); i<poblen; ++i) {
355 obsum = obsum + obamp[i]*psecdeg*std::cos( (obrate[i]*psecdeg*years + obphas[i]) *
degrad );
368 for (
int i(0); i<pecclen; ++i) {
369 cossum = cossum + ecamp[i]*std::cos( (ecrate[i]*psecdeg*years+ecphas[i]) *
degrad );
373 for (
int i(0); i<pecclen; ++i) {
374 sinsum = sinsum + ecamp[i]*std::sin( (ecrate[i]*psecdeg*years+ecphas[i]) *
degrad );
379 eccen2 = cossum*cossum + sinsum*sinsum;
380 eccen = std::sqrt(eccen2);
381 eccen3 = eccen2*eccen;
385 if (sinsum ==
zero) {
387 }
else if (sinsum <
zero) {
389 }
else if (sinsum >
zero) {
392 }
else if (cossum <
zero) {
393 fvelp = std::atan(sinsum/cossum) +
PI;
396 fvelp = std::atan(sinsum/cossum) +
two*
PI;
398 fvelp = std::atan(sinsum/cossum);
413 for (
int i(0); i<pmvelen; ++i) {
414 mvsum = mvsum + mvamp[i]*psecdeg*std::sin( (mvrate[i]*psecdeg*years + mvphas[i]) *
degrad);
422 if (obliq_in >=
zero) { obliq = obliq_in; }
423 if (mvelp_in >=
zero) { mvelp = mvelp_in; }
424 if (eccen_in >=
zero) {
426 eccen2 = eccen*eccen;
427 eccen3 = eccen2*eccen;
434 }
while (mvelp <
zero);
462 beta = std::sqrt(
one - eccen2);
491 const bool leap = (year % 4 == 0) && ((year % 100 != 0) || (year % 400 == 0));
492 double calday =
one + dpy[mon-1] + double(day - 1) + double(sec) / double(
amrex::Real(86400.0));
493 if (leap && mon > 2) { calday +=
one; }
504 AMREX_GPU_HOST_DEVICE
509 return std::sin(lat)*std::sin(declin) - std::cos(lat)*std::cos(declin) *
510 std::cos((jday - std::floor(jday))*
double(
two)*
PI + lon);
527 }
else if (lat == -
PIoTwo) {
537 }
else if (declin == -
PIoTwo) {
546 double cos_h = - std::tan(del) * std::tan(phi);
549 }
else if (cos_h >=
one) {
552 h = std::acos(cos_h);
557 double t1 = (jday - int(jday)) *
two*
PI + lon -
PI;
560 }
else if (t1 < -
PI) {
569 double aa = std::sin(lat) * std::sin(declin);
570 double bb = std::cos(lat) * std::cos(declin);
575 double tt1,tt2,tt3,tt4;
576 if ( (t2 >=
PI) && (t1 <=
PI) && ((
PI - h) <= dt) ) {
578 tt1 = std::min(std::max(t1, -h), h);
579 tt4 = std::min(std::max(t2,
two*
PI - h),
two*
PI + h);
581 }
else if ( (t2 >= -
PI) && (t1 <= -
PI) && ((
PI - h) <= dt) ) {
583 tt1 = std::min(std::max(t1, -
two*
PI - h), -
two*
PI + h);
584 tt4 = std::min(std::max(t2, -h), h);
588 tt2 = std::min(std::max(t2 -
two*
PI, -h), h);
589 }
else if (t2 < -
PI) {
590 tt2 = std::min(std::max(t2 +
two*
PI, -h), h);
592 tt2 = std::min(std::max(t2 , -h), h);
596 tt1 = std::min(std::max(t1 -
two*
PI, -h), h);
597 }
else if (t1 < -
PI) {
598 tt1 = std::min(std::max(t1 +
two*
PI, -h), h);
600 tt1 = std::min(std::max(t1 , -h), h);
608 if ( (tt2 > tt1) || (tt4 > tt3) ) {
609 return (aa * (tt2 - tt1) + bb * (sin(tt2) - sin(tt1))) / dt +
610 (aa * (tt4 - tt3) + bb * (sin(tt4) - sin(tt3))) / dt;
624 double dt_avg = -
one,
625 double uniform_angle = -
one,
626 double constant_zenith_angle_deg = -
one)
629 if ( constant_zenith_angle_deg >=
zero ) {
630 return std::cos( constant_zenith_angle_deg *
PI/
amrex::Real(180.) );
634 if ( uniform_angle >=
zero) {
635 return std::cos(uniform_angle);
639 bool use_dt_avg =
false;
static constexpr int ORB_UNDEF_INT
Definition: ERF_Constants.H:68
amrex::Real beta
Definition: ERF_InitCustomPert_DataAssimilation_ISV.H:10
constexpr amrex::Real three
Definition: ERF_NumericalConstants.H:32
constexpr amrex::Real two
Definition: ERF_NumericalConstants.H:31
constexpr amrex::Real one
Definition: ERF_NumericalConstants.H:30
constexpr amrex::Real fourth
Definition: ERF_NumericalConstants.H:35
constexpr amrex::Real zero
Definition: ERF_NumericalConstants.H:29
constexpr amrex::Real myhalf
Definition: ERF_NumericalConstants.H:34
constexpr amrex::Real PI
Definition: ERF_NumericalConstants.H:39
constexpr amrex::Real PIoTwo
Definition: ERF_NumericalConstants.H:40
AMREX_GPU_HOST AMREX_FORCE_INLINE double orbital_avg_cos_zenith(double &jday, double &lat, double &lon, double &declin, double &dt_avg)
Definition: ERF_OrbCosZenith.H:517
AMREX_GPU_HOST AMREX_FORCE_INLINE double orbital_calday(int year, int mon, int day, int sec)
Definition: ERF_OrbCosZenith.H:485
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE double orbital_cos_zenith_instant(double jday, double lat, double lon, double declin)
Definition: ERF_OrbCosZenith.H:507
AMREX_GPU_HOST AMREX_FORCE_INLINE double orbital_cos_zenith(double &jday, double &lat, double &lon, double &declin, double dt_avg=-one, double uniform_angle=-one, double constant_zenith_angle_deg=-one)
Definition: ERF_OrbCosZenith.H:620
AMREX_GPU_HOST AMREX_FORCE_INLINE void orbital_decl(double &calday, double &eccen, double &mvelpp, double &lambm0, double &obliqr, double &delta, double &eccf)
Definition: ERF_OrbCosZenith.H:18
AMREX_GPU_HOST AMREX_FORCE_INLINE void orbital_params(int &iyear_AD, double &eccen, double &obliq, double &mvelp, double &obliqr, double &lambm0, double &mvelpp)
Definition: ERF_OrbCosZenith.H:84
amrex::Real Real
Definition: ERF_ShocInterface.H:19
real(c_double), parameter degrad
Definition: ERF_module_model_constants.F90:75