61 #include "models/FGAuxiliary.h"
74 extern double pt[150];
75 extern double pd[9][150];
76 extern double ps[150];
77 extern double pdl[2][25];
78 extern double ptl[4][100];
79 extern double pma[10][100];
80 extern double sam[100];
83 extern double ptm[10];
84 extern double pdm[8][10];
85 extern double pavgm[10];
96 for (
int i=0; i<9; i++) output.d[i] = 0.0;
97 for (
int i=0; i<2; i++) output.t[i] = 0.0;
99 dm04 = dm16 = dm28 = dm32 = dm40 = dm01 = dm14 = dfa = 0.0;
101 for (
int i=0; i<5; i++) meso_tn1[i] = 0.0;
102 for (
int i=0; i<4; i++) meso_tn2[i] = 0.0;
103 for (
int i=0; i<5; i++) meso_tn3[i] = 0.0;
104 for (
int i=0; i<2; i++) meso_tgn1[i] = 0.0;
105 for (
int i=0; i<2; i++) meso_tgn2[i] = 0.0;
106 for (
int i=0; i<2; i++) meso_tgn3[i] = 0.0;
120 bool MSIS::InitModel(
void)
124 flags.switches[0] = 0;
128 flags.switches[i] = 1;
133 for (i=0;i<7;i++) aph.a[i] = 100.0;
155 if (Holding)
return false;
167 SLtemperature = output.t[1] * 1.8;
168 SLdensity = output.d[5] * 1.940321;
169 SLpressure = 1716.488 * SLdensity * SLtemperature;
170 SLsoundspeed = sqrt(2403.0832 * SLtemperature);
192 void MSIS::Calculate(
int day,
double sec,
double alt,
double lat,
double lon)
197 input.alt = alt / 3281;
201 input.lst = (sec/3600) + (lon/15);
202 if (input.lst > 24.0) input.lst -= 24.0;
203 if (input.lst < 0.0) input.lst = 24 - input.lst;
205 gtd7d(&input, &flags, &output);
224 if (flags->switches[i]==1)
228 if (flags->switches[i]>0)
233 flags->sw[i]=flags->switches[i];
234 flags->swc[i]=flags->switches[i];
242 void MSIS::glatf(
double lat,
double *gv,
double *reff)
244 double dgtr = 1.74533E-2;
246 c2 = cos(2.0*dgtr*lat);
247 *gv = 980.616 * (1.0 - 0.0026373 * c2);
248 *reff = 2.0 * (*gv) / (3.085462E-6 + 2.27E-9 * c2) * 1.0E-5;
253 double MSIS::ccor(
double alt,
double r,
double h1,
double zh)
275 double MSIS::ccor2(
double alt,
double r,
double h1,
double zh,
double h2)
287 e1 = (alt - zh) / h1;
288 e2 = (alt - zh) / h2;
289 if ((e1 > 70) || (e2 > 70))
291 if ((e1 < -70) && (e2 < -70))
295 ccor2v = r / (1.0 + 0.5 * (ex1 + ex2));
301 double MSIS::scalh(
double alt,
double xm,
double temp)
305 g = gsurf / (pow((1.0 + alt/re),2.0));
306 g = rgas * temp / (g * xm);
312 double MSIS::dnet (
double dd,
double dm,
double zhm,
double xmm,
double xm)
326 if (!((dm>0) && (dd>0))) {
327 cerr <<
"dnet log error " << dm <<
' ' << dd <<
' ' << xm <<
' ' << endl;
328 if ((dd==0) && (dm==0))
335 ylog = a * log(dm/dd);
340 a = dd*pow((1.0 + exp(ylog)),(1.0/a));
346 void MSIS::splini (
double *xa,
double *ya,
double *y2a,
int n,
double x,
double *y)
358 double xx=0.0, h=0.0, a=0.0, b=0.0, a2=0.0, b2=0.0;
359 while ((x>xa[klo]) && (khi<n)) {
367 h = xa[khi] - xa[klo];
368 a = (xa[khi] - xx)/h;
369 b = (xx - xa[klo])/h;
372 yi += ((1.0 - a2) * ya[klo] / 2.0 + b2 * ya[khi] / 2.0 + ((-(1.0+a2*a2)/4.0 + a2/2.0) * y2a[klo] + (b2*b2/4.0 - b2/2.0) * y2a[khi]) * h * h / 6.0) * h;
381 void MSIS::splint (
double *xa,
double *ya,
double *y2a,
int n,
double x,
double *y)
396 while ((khi-klo)>1) {
403 h = xa[khi] - xa[klo];
405 cerr <<
"bad XA input to splint" << endl;
408 yi = a * ya[klo] + b * ya[khi] + ((a*a*a - a) * y2a[klo] + (b*b*b - b) * y2a[khi]) * h * h/6.0;
414 void MSIS::spline (
double *x,
double *y,
int n,
double yp1,
double ypn,
double *y2)
425 double sig, p, qn, un;
429 cerr <<
"Out Of Memory in spline - ERROR" << endl;
437 u[0]=(3.0/(x[1]-x[0]))*((y[1]-y[0])/(x[1]-x[0])-yp1);
439 for (i=1;i<(n-1);i++) {
440 sig = (x[i]-x[i-1])/(x[i+1] - x[i-1]);
441 p = sig * y2[i-1] + 2.0;
442 y2[i] = (sig - 1.0) / p;
443 u[i] = (6.0 * ((y[i+1] - y[i])/(x[i+1] - x[i]) -(y[i] - y[i-1]) / (x[i] - x[i-1]))/(x[i+1] - x[i-1]) - sig * u[i-1])/p;
450 un = (3.0 / (x[n-1] - x[n-2])) * (ypn - (y[n-1] - y[n-2])/(x[n-1] - x[n-2]));
452 y2[n-1] = (un - qn * u[n-2]) / (qn * y2[n-2] + 1.0);
454 y2[k] = y2[k] * y2[k+1] + u[k];
461 double MSIS::zeta(
double zz,
double zl)
463 return ((zz-zl)*(re+zl)/(re+zz));
468 double MSIS::densm(
double alt,
double d0,
double xm,
double *tz,
int mn3,
469 double *zn3,
double *tn3,
double *tgn3,
int mn2,
double *zn2,
470 double *tn2,
double *tgn2)
473 double xs[10] = {0,0,0,0,0,0,0,0,0,0};
474 double ys[10] = {0,0,0,0,0,0,0,0,0,0};
475 double y2out[10] = {0,0,0,0,0,0,0,0,0,0};
477 double z=0, z1=0, z2=0, t1=0, t2=0, zg=0, zgdif=0;
479 double x=0, y=0, yi=0;
480 double expl=0, gamm=0, glb=0;
503 zgdif = zeta(z2, z1);
507 xs[k]=zeta(zn2[k],z1)/zgdif;
510 yd1=-tgn2[0] / (t1*t1) * zgdif;
511 yd2=-tgn2[1] / (t2*t2) * zgdif * (pow(((re+z2)/(re+z1)),2.0));
514 spline (xs, ys, mn, yd1, yd2, y2out);
516 splint (xs, ys, y2out, mn, x, &y);
522 glb = gsurf / (pow((1.0 + z1/re),2.0));
523 gamm = xm * glb * zgdif / rgas;
526 splini(xs, ys, y2out, mn, x, &yi);
532 densm_tmp = densm_tmp * (t1 / *tz) * exp(-expl);
554 xs[k] = zeta(zn3[k],z1) / zgdif;
555 ys[k] = 1.0 / tn3[k];
557 yd1=-tgn3[0] / (t1*t1) * zgdif;
558 yd2=-tgn3[1] / (t2*t2) * zgdif * (pow(((re+z2)/(re+z1)),2.0));
561 spline (xs, ys, mn, yd1, yd2, y2out);
563 splint (xs, ys, y2out, mn, x, &y);
569 glb = gsurf / (pow((1.0 + z1/re),2.0));
570 gamm = xm * glb * zgdif / rgas;
573 splini(xs, ys, y2out, mn, x, &yi);
579 densm_tmp = densm_tmp * (t1 / *tz) * exp(-expl);
589 double MSIS::densu(
double alt,
double dlb,
double tinf,
double tlb,
double xm,
590 double alpha,
double *tz,
double zlb,
double s2,
int mn1,
591 double *zn1,
double *tn1,
double *tgn1)
596 double yd2=0.0, yd1=0.0, x=0.0, y=0.0;
598 double densu_temp=1.0;
599 double za=0.0, z=0.0, zg2=0.0, tt=0.0, ta=0.0;
600 double dta=0.0, z1=0.0, z2=0.0, t1=0.0, t2=0.0, zg=0.0, zgdif=0.0;
607 double gamma=0.0, gamm=0.0;
608 double xs[5]={0.0,0.0,0.0,0.0,0.0}, ys[5]={0.0,0.0,0.0,0.0,0.0}, y2out[5]={0.0,0.0,0.0,0.0,0.0};
620 tt = tinf - (tinf - tlb) * exp(-s2*zg2);
628 dta = (tinf - ta) * s2 * pow(((re+zlb)/(re+za)),2.0);
642 zgdif = zeta(z2, z1);
645 xs[k] = zeta(zn1[k], z1) / zgdif;
646 ys[k] = 1.0 / tn1[k];
649 yd1 = -tgn1[0] / (t1*t1) * zgdif;
650 yd2 = -tgn1[1] / (t2*t2) * zgdif * pow(((re+z2)/(re+z1)),2.0);
652 spline (xs, ys, mn, yd1, yd2, y2out);
654 splint (xs, ys, y2out, mn, x, &y);
663 glb = gsurf / pow((1.0 + zlb/re),2.0);
664 gamma = xm * glb / (s2 * rgas * tinf);
665 expl = exp(-s2 * gamma * zg2);
672 densa = dlb * pow((tlb/tt),((1.0+alpha+gamma))) * expl;
678 glb = gsurf / pow((1.0 + z1/re),2.0);
679 gamm = xm * glb * zgdif / rgas;
682 splini (xs, ys, y2out, mn, x, &yi);
690 densu_temp = densu_temp * pow ((t1 / *tz),(1.0 + alpha)) * exp(-expl);
698 double MSIS::g0(
double a,
double *p)
700 return (a - 4.0 + (p[25] - 1.0) * (a - 4.0 + (exp(-sqrt(p[24]*p[24]) *
701 (a - 4.0)) - 1.0) / sqrt(p[24]*p[24])));
707 double MSIS::sumex(
double ex)
709 return (1.0 + (1.0 - pow(ex,19.0)) / (1.0 - ex) * pow(ex,0.5));
715 double MSIS::sg0(
double ex,
double *p,
double *ap)
717 return (
g0(ap[1],p) + (
g0(ap[2],p)*ex +
g0(ap[3],p)*ex*ex +
718 g0(ap[4],p)*pow(ex,3.0) + (
g0(ap[5],p)*pow(ex,4.0) +
719 g0(ap[6],p)*pow(ex,12.0))*(1.0-pow(ex,8.0))/(1.0-ex)))/sumex(ex);
724 double MSIS::globe7(
double *p,
struct nrlmsise_input *input,
725 struct nrlmsise_flags *flags)
733 double c, s, c2, c4, s2;
734 double sr = 7.2722E-5;
735 double dgtr = 1.74533E-2;
736 double dr = 1.72142E-2;
738 double cd32, cd18, cd14, cd39;
749 c = sin(input->g_lat * dgtr);
750 s = cos(input->g_lat * dgtr);
756 plg[0][2] = 0.5*(3.0*c2 -1.0);
757 plg[0][3] = 0.5*(5.0*c*c2-3.0*c);
758 plg[0][4] = (35.0*c4 - 30.0*c2 + 3.0)/8.0;
759 plg[0][5] = (63.0*c2*c2*c - 70.0*c2*c + 15.0*c)/8.0;
760 plg[0][6] = (11.0*c*plg[0][5] - 5.0*plg[0][4])/6.0;
764 plg[1][3] = 1.5*(5.0*c2-1.0)*s;
765 plg[1][4] = 2.5*(7.0*c2*c-3.0*c)*s;
766 plg[1][5] = 1.875*(21.0*c4 - 14.0*c2 +1.0)*s;
767 plg[1][6] = (11.0*c*plg[1][5]-6.0*plg[1][4])/5.0;
771 plg[2][3] = 15.0*s2*c;
772 plg[2][4] = 7.5*(7.0*c2 -1.0)*s2;
773 plg[2][5] = 3.0*c*plg[2][4]-2.0*plg[2][3];
774 plg[2][6] =(11.0*c*plg[2][5]-7.0*plg[2][4])/4.0;
775 plg[2][7] =(13.0*c*plg[2][6]-8.0*plg[2][5])/5.0;
776 plg[3][3] = 15.0*s2*s;
777 plg[3][4] = 105.0*s2*s*c;
778 plg[3][5] =(9.0*c*plg[3][4]-7.*plg[3][3])/2.0;
779 plg[3][6] =(11.0*c*plg[3][5]-8.*plg[3][4])/3.0;
781 if (!(((flags->sw[7]==0)&&(flags->sw[8]==0))&&(flags->sw[14]==0))) {
782 stloc = sin(hr*tloc);
783 ctloc = cos(hr*tloc);
784 s2tloc = sin(2.0*hr*tloc);
785 c2tloc = cos(2.0*hr*tloc);
786 s3tloc = sin(3.0*hr*tloc);
787 c3tloc = cos(3.0*hr*tloc);
790 cd32 = cos(dr*(input->doy-p[31]));
791 cd18 = cos(2.0*dr*(input->doy-p[17]));
792 cd14 = cos(dr*(input->doy-p[13]));
793 cd39 = cos(2.0*dr*(input->doy-p[38]));
796 df = input->f107 - input->f107A;
797 dfa = input->f107A - 150.0;
798 t[0] = p[19]*df*(1.0+p[59]*dfa) + p[20]*df*df + p[21]*dfa + p[29]*pow(dfa,2.0);
799 f1 = 1.0 + (p[47]*dfa +p[19]*df+p[20]*df*df)*flags->swc[1];
800 f2 = 1.0 + (p[49]*dfa+p[19]*df+p[20]*df*df)*flags->swc[1];
803 t[1] = (p[1]*plg[0][2]+ p[2]*plg[0][4]+p[22]*plg[0][6]) +
804 (p[14]*plg[0][2])*dfa*flags->swc[1] +p[26]*plg[0][1];
810 t[3] = (p[15]+p[16]*plg[0][2])*cd18;
813 t[4] = f1*(p[9]*plg[0][1]+p[10]*plg[0][3])*cd14;
816 t[5] = p[37]*plg[0][1]*cd39;
821 t71 = (p[11]*plg[1][2])*cd14*flags->swc[5];
822 t72 = (p[12]*plg[1][2])*cd14*flags->swc[5];
823 t[6] = f2*((p[3]*plg[1][1] + p[4]*plg[1][3] + p[27]*plg[1][5] + t71) * \
824 ctloc + (p[6]*plg[1][1] + p[7]*plg[1][3] + p[28]*plg[1][5] \
831 t81 = (p[23]*plg[2][3]+p[35]*plg[2][5])*cd14*flags->swc[5];
832 t82 = (p[33]*plg[2][3]+p[36]*plg[2][5])*cd14*flags->swc[5];
833 t[7] = f2*((p[5]*plg[2][2]+ p[41]*plg[2][4] + t81)*c2tloc +(p[8]*plg[2][2] + p[42]*plg[2][4] + t82)*s2tloc);
838 t[13] = f2 * ((p[39]*plg[3][3]+(p[93]*plg[3][4]+p[46]*plg[3][6])*cd14*flags->swc[5])* s3tloc +(p[40]*plg[3][3]+(p[94]*plg[3][4]+p[48]*plg[3][6])*cd14*flags->swc[5])* c3tloc);
842 if (flags->sw[9]==-1) {
846 exp1 = exp(-10800.0*sqrt(p[51]*p[51])/(1.0+p[138]*(45.0-sqrt(input->g_lat*input->g_lat))));
851 apt[0]=sg0(exp1,p,ap->a);
857 t[8] = apt[0]*(p[50]+p[96]*plg[0][2]+p[54]*plg[0][4]+ \
858 (p[125]*plg[0][1]+p[126]*plg[0][3]+p[127]*plg[0][5])*cd14*flags->swc[5]+ \
859 (p[128]*plg[1][1]+p[129]*plg[1][3]+p[130]*plg[1][5])*flags->swc[7]* \
860 cos(hr*(tloc-p[131])));
870 apdf = apd + (p45-1.0)*(apd + (exp(-p44 * apd) - 1.0)/p44);
872 t[8]=apdf*(p[32]+p[45]*plg[0][2]+p[34]*plg[0][4]+ \
873 (p[100]*plg[0][1]+p[101]*plg[0][3]+p[102]*plg[0][5])*cd14*flags->swc[5]+
874 (p[121]*plg[1][1]+p[122]*plg[1][3]+p[123]*plg[1][5])*flags->swc[7]*
875 cos(hr*(tloc-p[124])));
879 if ((flags->sw[10])&&(input->g_long>-1000.0)) {
883 t[10] = (1.0 + p[80]*dfa*flags->swc[1])* \
884 ((p[64]*plg[1][2]+p[65]*plg[1][4]+p[66]*plg[1][6]\
885 +p[103]*plg[1][1]+p[104]*plg[1][3]+p[105]*plg[1][5]\
886 +flags->swc[5]*(p[109]*plg[1][1]+p[110]*plg[1][3]+p[111]*plg[1][5])*cd14)* \
887 cos(dgtr*input->g_long) \
888 +(p[90]*plg[1][2]+p[91]*plg[1][4]+p[92]*plg[1][6]\
889 +p[106]*plg[1][1]+p[107]*plg[1][3]+p[108]*plg[1][5]\
890 +flags->swc[5]*(p[112]*plg[1][1]+p[113]*plg[1][3]+p[114]*plg[1][5])*cd14)* \
891 sin(dgtr*input->g_long));
896 t[11]=(1.0+p[95]*plg[0][1])*(1.0+p[81]*dfa*flags->swc[1])*\
897 (1.0+p[119]*plg[0][1]*flags->swc[5]*cd14)*\
898 ((p[68]*plg[0][1]+p[69]*plg[0][3]+p[70]*plg[0][5])*\
899 cos(sr*(input->sec-p[71])));
900 t[11]+=flags->swc[11]*\
901 (p[76]*plg[2][3]+p[77]*plg[2][5]+p[78]*plg[2][7])*\
902 cos(sr*(input->sec-p[79])+2.0*dgtr*input->g_long)*(1.0+p[137]*dfa*flags->swc[1]);
907 if (flags->sw[9]==-1) {
909 t[12]=apt[0]*flags->swc[11]*(1.+p[132]*plg[0][1])*\
910 ((p[52]*plg[1][2]+p[98]*plg[1][4]+p[67]*plg[1][6])*\
911 cos(dgtr*(input->g_long-p[97])))\
912 +apt[0]*flags->swc[11]*flags->swc[5]*\
913 (p[133]*plg[1][1]+p[134]*plg[1][3]+p[135]*plg[1][5])*\
914 cd14*cos(dgtr*(input->g_long-p[136])) \
915 +apt[0]*flags->swc[12]* \
916 (p[55]*plg[0][1]+p[56]*plg[0][3]+p[57]*plg[0][5])*\
917 cos(sr*(input->sec-p[58]));
920 t[12] = apdf*flags->swc[11]*(1.0+p[120]*plg[0][1])*\
921 ((p[60]*plg[1][2]+p[61]*plg[1][4]+p[62]*plg[1][6])*\
922 cos(dgtr*(input->g_long-p[63])))\
923 +apdf*flags->swc[11]*flags->swc[5]* \
924 (p[115]*plg[1][1]+p[116]*plg[1][3]+p[117]*plg[1][5])* \
925 cd14*cos(dgtr*(input->g_long-p[118])) \
926 + apdf*flags->swc[12]* \
927 (p[83]*plg[0][1]+p[84]*plg[0][3]+p[85]*plg[0][5])* \
928 cos(sr*(input->sec-p[75]));
936 tinf = tinf + fabs(flags->sw[i+1])*t[i];
942 double MSIS::glob7s(
double *p,
struct nrlmsise_input *input,
943 struct nrlmsise_flags *flags)
948 double t[14] = {0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,};
950 double cd32=0.0, cd18=0.0, cd14=0.0, cd39=0.0;
952 double dr=1.72142E-2;
953 double dgtr=1.74533E-2;
958 cerr <<
"Wrong parameter set for glob7s" << endl;
963 cd32 = cos(dr*(input->doy-p[31]));
964 cd18 = cos(2.0*dr*(input->doy-p[17]));
965 cd14 = cos(dr*(input->doy-p[13]));
966 cd39 = cos(2.0*dr*(input->doy-p[38]));
972 t[1]=p[1]*plg[0][2] + p[2]*plg[0][4] + p[22]*plg[0][6] + p[26]*plg[0][1] + p[14]*plg[0][3] + p[59]*plg[0][5];
975 t[2]=(p[18]+p[47]*plg[0][2]+p[29]*plg[0][4])*cd32;
978 t[3]=(p[15]+p[16]*plg[0][2]+p[30]*plg[0][4])*cd18;
981 t[4]=(p[9]*plg[0][1]+p[10]*plg[0][3]+p[20]*plg[0][5])*cd14;
984 t[5]=(p[37]*plg[0][1])*cd39;
989 t71 = p[11]*plg[1][2]*cd14*flags->swc[5];
990 t72 = p[12]*plg[1][2]*cd14*flags->swc[5];
991 t[6] = ((p[3]*plg[1][1] + p[4]*plg[1][3] + t71) * ctloc + (p[6]*plg[1][1] + p[7]*plg[1][3] + t72) * stloc) ;
997 t81 = (p[23]*plg[2][3]+p[35]*plg[2][5])*cd14*flags->swc[5];
998 t82 = (p[33]*plg[2][3]+p[36]*plg[2][5])*cd14*flags->swc[5];
999 t[7] = ((p[5]*plg[2][2] + p[41]*plg[2][4] + t81) * c2tloc + (p[8]*plg[2][2] + p[42]*plg[2][4] + t82) * s2tloc);
1003 if (flags->sw[14]) {
1004 t[13] = p[39] * plg[3][3] * s3tloc + p[40] * plg[3][3] * c3tloc;
1009 if (flags->sw[9]==1)
1010 t[8] = apdf * (p[32] + p[45] * plg[0][2] * flags->swc[2]);
1011 if (flags->sw[9]==-1)
1012 t[8]=(p[50]*apt[0] + p[96]*plg[0][2] * apt[0]*flags->swc[2]);
1016 if (!((flags->sw[10]==0) || (flags->sw[11]==0) || (input->g_long<=-1000.0))) {
1017 t[10] = (1.0 + plg[0][1]*(p[80]*flags->swc[5]*cos(dr*(input->doy-p[81]))\
1018 +p[85]*flags->swc[6]*cos(2.0*dr*(input->doy-p[86])))\
1019 +p[83]*flags->swc[3]*cos(dr*(input->doy-p[84]))\
1020 +p[87]*flags->swc[4]*cos(2.0*dr*(input->doy-p[88])))\
1021 *((p[64]*plg[1][2]+p[65]*plg[1][4]+p[66]*plg[1][6]\
1022 +p[74]*plg[1][1]+p[75]*plg[1][3]+p[76]*plg[1][5]\
1023 )*cos(dgtr*input->g_long)\
1024 +(p[90]*plg[1][2]+p[91]*plg[1][4]+p[92]*plg[1][6]\
1025 +p[77]*plg[1][1]+p[78]*plg[1][3]+p[79]*plg[1][5]\
1026 )*sin(dgtr*input->g_long));
1030 tt+=fabs(flags->sw[i+1])*t[i];
1036 void MSIS::gtd7(
struct nrlmsise_input *input,
struct nrlmsise_flags *flags,
1037 struct nrlmsise_output *output)
1042 double zn3[5]={32.5,20.0,15.0,10.0,0.0};
1044 double zn2[4]={72.5,55.0,45.0,32.5};
1053 struct nrlmsise_output soutput;
1056 for (
int i=0; i<9; i++) soutput.d[i] = 0.0;
1057 for (
int i=0; i<2; i++) soutput.t[i] = 0.0;
1063 if (flags->sw[2]==0)
1065 glatf(xlat, &gsurf, &re);
1070 if (input->alt>zn2[0])
1077 gts7(input, flags, &soutput);
1084 output->t[0]=soutput.t[0];
1085 output->t[1]=soutput.t[1];
1086 if (input->alt>=zn2[0]) {
1088 output->d[i]=soutput.d[i];
1096 meso_tgn2[0]=meso_tgn1[1];
1097 meso_tn2[0]=meso_tn1[4];
1098 meso_tn2[1]=pma[0][0]*pavgm[0]/(1.0-flags->sw[20]*glob7s(pma[0], input, flags));
1099 meso_tn2[2]=pma[1][0]*pavgm[1]/(1.0-flags->sw[20]*glob7s(pma[1], input, flags));
1100 meso_tn2[3]=pma[2][0]*pavgm[2]/(1.0-flags->sw[20]*flags->sw[22]*glob7s(pma[2], input, flags));
1101 meso_tgn2[1]=pavgm[8]*pma[9][0]*(1.0+flags->sw[20]*flags->sw[22]*glob7s(pma[9], input, flags))*meso_tn2[3]*meso_tn2[3]/(pow((pma[2][0]*pavgm[2]),2.0));
1102 meso_tn3[0]=meso_tn2[3];
1104 if (input->alt<zn3[0]) {
1109 meso_tgn3[0]=meso_tgn2[1];
1110 meso_tn3[1]=pma[3][0]*pavgm[3]/(1.0-flags->sw[22]*glob7s(pma[3], input, flags));
1111 meso_tn3[2]=pma[4][0]*pavgm[4]/(1.0-flags->sw[22]*glob7s(pma[4], input, flags));
1112 meso_tn3[3]=pma[5][0]*pavgm[5]/(1.0-flags->sw[22]*glob7s(pma[5], input, flags));
1113 meso_tn3[4]=pma[6][0]*pavgm[6]/(1.0-flags->sw[22]*glob7s(pma[6], input, flags));
1114 meso_tgn3[1]=pma[7][0]*pavgm[7]*(1.0+flags->sw[22]*glob7s(pma[7], input, flags)) *meso_tn3[4]*meso_tn3[4]/(pow((pma[6][0]*pavgm[6]),2.0));
1120 if (input->alt>zmix)
1121 dmc = 1.0 - (zn2[0]-input->alt)/(zn2[0] - zmix);
1125 dmr=soutput.d[2] / dm28m - 1.0;
1126 output->d[2]=densm(input->alt,dm28m,xmm, &tz, mn3, zn3, meso_tn3, meso_tgn3, mn2, zn2, meso_tn2, meso_tgn2);
1127 output->d[2]=output->d[2] * (1.0 + dmr*dmc);
1130 dmr = soutput.d[0] / (dz28 * pdm[0][1]) - 1.0;
1131 output->d[0] = output->d[2] * pdm[0][1] * (1.0 + dmr*dmc);
1138 dmr = soutput.d[3] / (dz28 * pdm[3][1]) - 1.0;
1139 output->d[3] = output->d[2] * pdm[3][1] * (1.0 + dmr*dmc);
1142 dmr = soutput.d[4] / (dz28 * pdm[4][1]) - 1.0;
1143 output->d[4] = output->d[2] * pdm[4][1] * (1.0 + dmr*dmc);
1152 output->d[5] = 1.66E-24 * (4.0 * output->d[0] + 16.0 * output->d[1] +
1153 28.0 * output->d[2] + 32.0 * output->d[3] + 40.0 * output->d[4]
1154 + output->d[6] + 14.0 * output->d[7]);
1157 output->d[5]=output->d[5]/1000;
1160 dd = densm(input->alt, 1.0, 0, &tz, mn3, zn3, meso_tn3, meso_tgn3,
1161 mn2, zn2, meso_tn2, meso_tgn2);
1168 void MSIS::gtd7d(
struct nrlmsise_input *input,
struct nrlmsise_flags *flags,
1169 struct nrlmsise_output *output)
1171 gtd7(input, flags, output);
1172 output->d[5] = 1.66E-24 * (4.0 * output->d[0] + 16.0 * output->d[1] +
1173 28.0 * output->d[2] + 32.0 * output->d[3] + 40.0 * output->d[4]
1174 + output->d[6] + 14.0 * output->d[7] + 16.0 * output->d[8]);
1176 output->d[5]=output->d[5]/1000;
1181 void MSIS::ghp7(
struct nrlmsise_input *input,
struct nrlmsise_flags *flags,
1182 struct nrlmsise_output *output,
double press)
1184 double bm = 1.3806E-19;
1185 double rgas = 831.4;
1186 double test = 0.00043;
1193 double xn, xm, diff;
1199 zi = 18.06 * (3.00 - pl);
1200 else if ((pl>0.075) && (pl<=2.5))
1201 zi = 14.98 * (3.08 - pl);
1202 else if ((pl>-1) && (pl<=0.075))
1203 zi = 17.80 * (2.72 - pl);
1204 else if ((pl>-2) && (pl<=-1))
1205 zi = 14.28 * (3.64 - pl);
1206 else if ((pl>-4) && (pl<=-2))
1207 zi = 12.72 * (4.32 -pl);
1209 zi = 25.3 * (0.11 - pl);
1210 cl = input->g_lat/90.0;
1213 cd = (1.0 - (double) input->doy) / 91.25;
1215 cd = ((double) input->doy) / 91.25 - 3.0;
1217 if ((pl > -1.11) && (pl<=-0.23))
1220 ca = (2.79 - pl) / (2.79 + 0.23);
1221 if ((pl <= -1.11) && (pl>-3))
1222 ca = (-2.93 - pl)/(-2.93 + 1.11);
1223 z = zi - 4.87 * cl * cd * ca - 1.64 * cl2 * ca + 0.31 * ca * cl;
1225 z = 22.0 * pow((pl + 4.0),2.0) + 110.0;
1232 gtd7(input, flags, output);
1234 xn = output->d[0] + output->d[1] + output->d[2] + output->d[3] + output->d[4] + output->d[6] + output->d[7];
1235 p = bm * xn * output->t[1];
1238 diff = pl - log10(p);
1239 if (sqrt(diff*diff)<test)
1242 cerr <<
"ERROR: ghp7 not converging for press " << press <<
", diff " << diff << endl;
1245 xm = output->d[5] / xn / 1.66E-24;
1248 g = gsurf / (pow((1.0 + z/re),2.0));
1249 sh = rgas * output->t[1] / (xm * g);
1253 z = z - sh * diff * 2.302;
1261 void MSIS::gts7(
struct nrlmsise_input *input,
struct nrlmsise_flags *flags,
1262 struct nrlmsise_output *output)
1271 double zn1[5] = {120.0, 110.0, 100.0, 90.0, 72.5};
1277 double db01=0.0, db04=0.0, db14=0.0, db16=0.0, db28=0.0, db32=0.0, db40=0.0;
1278 double zh28=0.0, zh04=0.0, zh16=0.0, zh32=0.0, zh40=0.0, zh01=0.0, zh14=0.0;
1279 double zhm28=0.0, zhm04=0.0, zhm16=0.0, zhm32=0.0, zhm40=0.0, zhm01=0.0, zhm14=0.0;
1281 double b28=0.0, b04=0.0, b16=0.0, b32=0.0, b40=0.0, b01=0.0, b14=0.0;
1283 double g28=0.0, g4=0.0, g16=0.0, g32=0.0, g40=0.0, g1=0.0, g14=0.0;
1284 double zhf=0.0, xmm=0.0;
1285 double zc04=0.0, zc16=0.0, zc32=0.0, zc40=0.0, zc01=0.0, zc14=0.0;
1286 double hc04=0.0, hc16=0.0, hc32=0.0, hc40=0.0, hc01=0.0, hc14=0.0;
1287 double hcc16=0.0, hcc32=0.0, hcc01=0.0, hcc14=0.0;
1288 double zcc16=0.0, zcc32=0.0, zcc01=0.0, zcc14=0.0;
1289 double rc16=0.0, rc32=0.0, rc01=0.0, rc14=0.0;
1291 double g16h=0.0, db16h=0.0, tho=0.0, zsht=0.0, zmho=0.0, zsho=0.0;
1292 double dgtr=1.74533E-2;
1293 double dr=1.72142E-2;
1294 double alpha[9]={-0.38, 0.0, 0.0, 0.0, 0.17, 0.0, -0.38, 0.0, 0.0};
1295 double altl[8]={200.0, 300.0, 160.0, 250.0, 240.0, 450.0, 320.0, 450.0};
1297 double hc216=0.0, hcc232=0.0;
1304 if (input->alt>zn1[0])
1305 tinf = ptm[0]*pt[0] * \
1306 (1.0+flags->sw[16]*globe7(pt,input,flags));
1308 tinf = ptm[0]*pt[0];
1312 if (input->alt>zn1[4])
1313 g0 = ptm[3]*ps[0] * \
1314 (1.0+flags->sw[19]*globe7(ps,input,flags));
1317 tlb = ptm[1] * (1.0 + flags->sw[17]*globe7(pd[3],input,flags))*pd[3][0];
1318 s =
g0 / (tinf - tlb);
1322 if (input->alt<300.0) {
1323 meso_tn1[1]=ptm[6]*ptl[0][0]/(1.0-flags->sw[18]*glob7s(ptl[0], input, flags));
1324 meso_tn1[2]=ptm[2]*ptl[1][0]/(1.0-flags->sw[18]*glob7s(ptl[1], input, flags));
1325 meso_tn1[3]=ptm[7]*ptl[2][0]/(1.0-flags->sw[18]*glob7s(ptl[2], input, flags));
1326 meso_tn1[4]=ptm[4]*ptl[3][0]/(1.0-flags->sw[18]*flags->sw[20]*glob7s(ptl[3], input, flags));
1327 meso_tgn1[1]=ptm[8]*pma[8][0]*(1.0+flags->sw[18]*flags->sw[20]*glob7s(pma[8], input, flags))*meso_tn1[4]*meso_tn1[4]/(pow((ptm[4]*ptl[3][0]),2.0));
1329 meso_tn1[1]=ptm[6]*ptl[0][0];
1330 meso_tn1[2]=ptm[2]*ptl[1][0];
1331 meso_tn1[3]=ptm[7]*ptl[2][0];
1332 meso_tn1[4]=ptm[4]*ptl[3][0];
1333 meso_tgn1[1]=ptm[8]*pma[8][0]*meso_tn1[4]*meso_tn1[4]/(pow((ptm[4]*ptl[3][0]),2.0));
1337 g28=flags->sw[21]*globe7(pd[2], input, flags);
1340 zhf=pdl[1][24]*(1.0+flags->sw[5]*pdl[0][24]*sin(dgtr*input->g_lat)*cos(dr*(input->doy-pt[13])));
1349 db28 = pdm[2][0]*exp(g28)*pd[2][0];
1351 output->d[2]=densu(z,db28,tinf,tlb,28.0,alpha[2],&output->t[1],ptm[5],s,mn1,zn1,meso_tn1,meso_tgn1);
1355 zhm28=pdm[2][3]*pdl[1][5];
1358 b28=densu(zh28,db28,tinf,tlb,xmd,(alpha[2]-1.0),&tz,ptm[5],s,mn1, zn1,meso_tn1,meso_tgn1);
1359 if ((flags->sw[15])&&(z<=altl[2])) {
1361 dm28=densu(z,b28,tinf,tlb,xmm,alpha[2],&tz,ptm[5],s,mn1,zn1,meso_tn1,meso_tgn1);
1363 output->d[2]=dnet(output->d[2],dm28,zhm28,xmm,28.0);
1370 g4 = flags->sw[21]*globe7(pd[0], input, flags);
1372 db04 = pdm[0][0]*exp(g4)*pd[0][0];
1374 output->d[0]=densu(z,db04,tinf,tlb, 4.,alpha[0],&output->t[1],ptm[5],s,mn1,zn1,meso_tn1,meso_tgn1);
1376 if ((flags->sw[15]) && (z<altl[0])) {
1380 b04=densu(zh04,db04,tinf,tlb,4.-xmm,alpha[0]-1.,&output->t[1],ptm[5],s,mn1,zn1,meso_tn1,meso_tgn1);
1382 dm04=densu(z,b04,tinf,tlb,xmm,0.,&output->t[1],ptm[5],s,mn1,zn1,meso_tn1,meso_tgn1);
1385 output->d[0]=dnet(output->d[0],dm04,zhm04,xmm,4.);
1387 rl=log(b28*pdm[0][1]/b04);
1388 zc04=pdm[0][4]*pdl[1][0];
1389 hc04=pdm[0][5]*pdl[1][1];
1391 output->d[0]=output->d[0]*ccor(z,rl,hc04,zc04);
1398 g16= flags->sw[21]*globe7(pd[1],input,flags);
1400 db16 = pdm[1][0]*exp(g16)*pd[1][0];
1402 output->d[1]=densu(z,db16,tinf,tlb, 16.,alpha[1],&output->t[1],ptm[5],s,mn1, zn1,meso_tn1,meso_tgn1);
1404 if ((flags->sw[15]) && (z<=altl[1])) {
1408 b16=densu(zh16,db16,tinf,tlb,16.0-xmm,(alpha[1]-1.0), &output->t[1],ptm[5],s,mn1,zn1,meso_tn1,meso_tgn1);
1410 dm16=densu(z,b16,tinf,tlb,xmm,0.,&output->t[1],ptm[5],s,mn1,zn1,meso_tn1,meso_tgn1);
1413 output->d[1]=dnet(output->d[1],dm16,zhm16,xmm,16.);
1414 rl=pdm[1][1]*pdl[1][16]*(1.0+flags->sw[1]*pdl[0][23]*(input->f107A-150.0));
1415 hc16=pdm[1][5]*pdl[1][3];
1416 zc16=pdm[1][4]*pdl[1][2];
1417 hc216=pdm[1][5]*pdl[1][4];
1418 output->d[1]=output->d[1]*ccor2(z,rl,hc16,zc16,hc216);
1420 hcc16=pdm[1][7]*pdl[1][13];
1421 zcc16=pdm[1][6]*pdl[1][12];
1422 rc16=pdm[1][3]*pdl[1][14];
1424 output->d[1]=output->d[1]*ccor(z,rc16,hcc16,zcc16);
1431 g32= flags->sw[21]*globe7(pd[4], input, flags);
1433 db32 = pdm[3][0]*exp(g32)*pd[4][0];
1435 output->d[3]=densu(z,db32,tinf,tlb, 32.,alpha[3],&output->t[1],ptm[5],s,mn1, zn1,meso_tn1,meso_tgn1);
1437 if (flags->sw[15]) {
1442 b32=densu(zh32,db32,tinf,tlb,32.-xmm,alpha[3]-1., &output->t[1],ptm[5],s,mn1,zn1,meso_tn1,meso_tgn1);
1444 dm32=densu(z,b32,tinf,tlb,xmm,0.,&output->t[1],ptm[5],s,mn1,zn1,meso_tn1,meso_tgn1);
1447 output->d[3]=dnet(output->d[3],dm32,zhm32,xmm,32.);
1449 rl=log(b28*pdm[3][1]/b32);
1450 hc32=pdm[3][5]*pdl[1][7];
1451 zc32=pdm[3][4]*pdl[1][6];
1452 output->d[3]=output->d[3]*ccor(z,rl,hc32,zc32);
1455 hcc32=pdm[3][7]*pdl[1][22];
1456 hcc232=pdm[3][7]*pdl[0][22];
1457 zcc32=pdm[3][6]*pdl[1][21];
1458 rc32=pdm[3][3]*pdl[1][23]*(1.+flags->sw[1]*pdl[0][23]*(input->f107A-150.));
1460 output->d[3]=output->d[3]*ccor2(z,rc32,hcc32,zcc32,hcc232);
1467 g40= flags->sw[21]*globe7(pd[5],input,flags);
1469 db40 = pdm[4][0]*exp(g40)*pd[5][0];
1471 output->d[4]=densu(z,db40,tinf,tlb, 40.,alpha[4],&output->t[1],ptm[5],s,mn1,zn1,meso_tn1,meso_tgn1);
1473 if ((flags->sw[15]) && (z<=altl[4])) {
1477 b40=densu(zh40,db40,tinf,tlb,40.-xmm,alpha[4]-1.,&output->t[1],ptm[5],s,mn1,zn1,meso_tn1,meso_tgn1);
1479 dm40=densu(z,b40,tinf,tlb,xmm,0.,&output->t[1],ptm[5],s,mn1,zn1,meso_tn1,meso_tgn1);
1482 output->d[4]=dnet(output->d[4],dm40,zhm40,xmm,40.);
1484 rl=log(b28*pdm[4][1]/b40);
1485 hc40=pdm[4][5]*pdl[1][9];
1486 zc40=pdm[4][4]*pdl[1][8];
1488 output->d[4]=output->d[4]*ccor(z,rl,hc40,zc40);
1495 g1 = flags->sw[21]*globe7(pd[6], input, flags);
1497 db01 = pdm[5][0]*exp(g1)*pd[6][0];
1499 output->d[6]=densu(z,db01,tinf,tlb,1.,alpha[6],&output->t[1],ptm[5],s,mn1,zn1,meso_tn1,meso_tgn1);
1501 if ((flags->sw[15]) && (z<=altl[6])) {
1505 b01=densu(zh01,db01,tinf,tlb,1.-xmm,alpha[6]-1., &output->t[1],ptm[5],s,mn1,zn1,meso_tn1,meso_tgn1);
1507 dm01=densu(z,b01,tinf,tlb,xmm,0.,&output->t[1],ptm[5],s,mn1,zn1,meso_tn1,meso_tgn1);
1510 output->d[6]=dnet(output->d[6],dm01,zhm01,xmm,1.);
1512 rl=log(b28*pdm[5][1]*sqrt(pdl[1][17]*pdl[1][17])/b01);
1513 hc01=pdm[5][5]*pdl[1][11];
1514 zc01=pdm[5][4]*pdl[1][10];
1515 output->d[6]=output->d[6]*ccor(z,rl,hc01,zc01);
1517 hcc01=pdm[5][7]*pdl[1][19];
1518 zcc01=pdm[5][6]*pdl[1][18];
1519 rc01=pdm[5][3]*pdl[1][20];
1521 output->d[6]=output->d[6]*ccor(z,rc01,hcc01,zcc01);
1528 g14 = flags->sw[21]*globe7(pd[7],input,flags);
1530 db14 = pdm[6][0]*exp(g14)*pd[7][0];
1532 output->d[7]=densu(z,db14,tinf,tlb,14.,alpha[7],&output->t[1],ptm[5],s,mn1,zn1,meso_tn1,meso_tgn1);
1534 if ((flags->sw[15]) && (z<=altl[7])) {
1538 b14=densu(zh14,db14,tinf,tlb,14.-xmm,alpha[7]-1., &output->t[1],ptm[5],s,mn1,zn1,meso_tn1,meso_tgn1);
1540 dm14=densu(z,b14,tinf,tlb,xmm,0.,&output->t[1],ptm[5],s,mn1,zn1,meso_tn1,meso_tgn1);
1543 output->d[7]=dnet(output->d[7],dm14,zhm14,xmm,14.);
1545 rl=log(b28*pdm[6][1]*sqrt(pdl[0][2]*pdl[0][2])/b14);
1546 hc14=pdm[6][5]*pdl[0][1];
1547 zc14=pdm[6][4]*pdl[0][0];
1548 output->d[7]=output->d[7]*ccor(z,rl,hc14,zc14);
1550 hcc14=pdm[6][7]*pdl[0][4];
1551 zcc14=pdm[6][6]*pdl[0][3];
1552 rc14=pdm[6][3]*pdl[0][5];
1554 output->d[7]=output->d[7]*ccor(z,rc14,hcc14,zcc14);
1560 g16h = flags->sw[21]*globe7(pd[8],input,flags);
1561 db16h = pdm[7][0]*exp(g16h)*pd[8][0];
1562 tho = pdm[7][9]*pdl[0][6];
1563 dd=densu(z,db16h,tho,tho,16.,alpha[8],&output->t[1],ptm[5],s,mn1, zn1,meso_tn1,meso_tgn1);
1566 zsho=scalh(zmho,16.0,tho);
1567 output->d[8]=dd*exp(-zsht/zsho*(exp(-(z-zmho)/zsht)-1.));
1571 output->d[5] = 1.66E-24*(4.0*output->d[0]+16.0*output->d[1]+28.0*output->d[2]+32.0*output->d[3]+40.0*output->d[4]+ output->d[6]+14.0*output->d[7]);
1576 z = sqrt(input->alt*input->alt);
1577 densu(z,1.0, tinf, tlb, 0.0, 0.0, &output->t[1], ptm[5], s, mn1, zn1, meso_tn1, meso_tgn1);
1580 output->d[i]=output->d[i]*1.0E6;
1581 output->d[5]=output->d[5]/1000;
1605 void MSIS::Debug(
int from)
1607 if (debug_lvl <= 0)
return;
1609 if (debug_lvl & 1) {
1613 if (debug_lvl & 2 ) {
1614 if (from == 0) cout <<
"Instantiated: MSIS" << endl;
1615 if (from == 1) cout <<
"Destroyed: MSIS" << endl;
1617 if (debug_lvl & 4 ) {
1619 if (debug_lvl & 8 ) {
1621 if (debug_lvl & 16) {
1623 if (debug_lvl & 32) {
1625 if (debug_lvl & 64) {