ATMOS/.ipynb_checkpoints/NRLMSISE-00-checkpoint.ipynb
李春晓 37d04570cf log
2019-11-25 00:19:36 +08:00

1335 lines
69 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{
"cells": [
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# -------------------------------------------------------------------- #\n",
"# -------------------- NRLMSISE-00 MODEL 2001 --------------------- #\n",
"# -------------------------------------------------------------------- #\n",
"\n",
"import numpy as np\n",
"from scipy.interpolate import CubicSpline\n",
"from pyshtools.legendre import PLegendreA,PlmIndex\n",
"from astropy.time import Time\n",
"from datetime import datetime,timedelta\n",
"from os import getenv,path,remove\n",
"from urllib.request import urlretrieve\n",
"\n",
"# ------------------------------------------------------------------- #\n",
"# ------------------------- READ DATA BLOCK ------------------------- #\n",
"# ------------------------------------------------------------------- #\n",
"\n",
"def nrlmsis00_data():\n",
" '''\n",
" 从 nrlmsis00_data.npz 文件中读取 nrlmsis00 所需的数据块 \n",
" Usage: pt,pd,ps,pdl,ptm,pdm,ptl,pma,sam,pavgm = nrlmsis00_data()\n",
" Inputs: \n",
" None\n",
" Outputs: \n",
" pt: [float array] TEMPERATURE \n",
" pd: [2d float array] DENSITY of HE, O, N2, Total mass, O2, AR, H, N, HOT O\n",
" ps: [float array] S PARAM\n",
" pdl: [2d float array] TURBO \n",
" ptm: [float array]\n",
" pdm: [2d float array]\n",
" ptl: [2d float array]\n",
" pma: [2d float array] \n",
" sam: [float array] SEMIANNUAL MULT SAM\n",
" pavgm: [float array] MIDDLE ATMOSPHERE AVERAGES \n",
" ''' \n",
" data = np.load('nrlmsis00_data.npz')\n",
" pt,pd,ps,pdl = data['pt'],data['pd'],data['ps'],data['pdl']\n",
" ptm,pdm,ptl,pma = data['ptm'],data['pdm'],data['ptl'],data['pma']\n",
" sam,pavgm = data['sam'],data['pavgm']\n",
" return pt,pd,ps,pdl,ptm,pdm,ptl,pma,sam,pavgm\n",
"\n",
"# ------------------------------------------------------------------- #\n",
"# ------------------------------ TSELEC ----------------------------- #\n",
"# ------------------------------------------------------------------- #\n",
"\n",
"def tselec(switches):\n",
" # len(switches) is equal to 23\n",
" flags = {'sw':np.zeros(23),'swc':np.zeros(23)}\n",
" for i in range(23):\n",
" if i != 8:\n",
" if switches[i] == 1:\n",
" flags['sw'][i] = 1\n",
" else:\n",
" flags['sw'][i] = 0\n",
" if switches[i] > 0:\n",
" flags['swc'][i] = 1\n",
" else:\n",
" flags['swc'][i] = 0\n",
" else:\n",
" flags['sw'][i] = switches[i]\n",
" flags['swc'][i] = switches[i]\n",
" return flags \n",
"\n",
"# ------------------------------------------------------------------- #\n",
"# ------------------------------ GLATF ------------------------------ #\n",
"# ------------------------------------------------------------------- #\n",
"\n",
"def glatf(lat):\n",
" c2 = np.cos(2*np.deg2rad(lat))\n",
" gv = 980.616*(1 - 0.0026373*c2)\n",
" reff = 2*gv/(3.085462E-6 + 2.27E-9*c2)*1E-5\n",
" return gv,reff\n",
"\n",
"# ------------------------------------------------------------------- #\n",
"# ------------------------------ CCOR ------------------------------- #\n",
"# ------------------------------------------------------------------- #\n",
"\n",
"def ccor(alt,r,h1,zh):\n",
" '''\n",
" CHEMISTRY/DISSOCIATION CORRECTION FOR MSIS MODELS\n",
" ALT - altitude\n",
" R - target ratio\n",
" H1 - transition scale length\n",
" ZH - altitude of 1/2 R\n",
" '''\n",
" e = (alt - zh)/h1\n",
" if e > 70:\n",
" return 1\n",
" elif e < -70:\n",
" return np.exp(r)\n",
" else:\n",
" return np.exp(r/(1 + np.exp(e)))\n",
" \n",
"# ------------------------------------------------------------------- #\n",
"# ------------------------------ CCOR2 ------------------------------ #\n",
"# ------------------------------------------------------------------- #\n",
"\n",
"def ccor2(alt,r,h1,zh,h2):\n",
" '''\n",
" CHEMISTRY/DISSOCIATION CORRECTION FOR MSIS MODELS\n",
" ALT - altitude\n",
" R - target ratio\n",
" H1 - transition scale length 1\n",
" ZH - altitude of 1/2 R\n",
" H2 - transition scale length 2 \n",
" ''' \n",
" e1 = (alt - zh)/h1\n",
" e2 = (alt - zh)/h2\n",
" if e1 > 70 or e2 > 70:\n",
" return 1\n",
" if e1 < -70 and e2 < -70:\n",
" return np.exp(r)\n",
" ex1,ex2 = np.exp([e1,e2])\n",
" ccor2v = r/(1 + 0.5*(ex1 + ex2))\n",
" return np.exp(ccor2v)\n",
"\n",
"# ------------------------------------------------------------------- #\n",
"# ------------------------------- SCALH ----------------------------- #\n",
"# ------------------------------------------------------------------- #\n",
"\n",
"def scalh(alt,xm,temp,gsurf,re):\n",
" rgas = 831.4\n",
" g = rgas*temp/(gsurf/(1 + alt/re)**2*xm)\n",
" return g\n",
"\n",
"# ------------------------------------------------------------------- #\n",
"# -------------------------------- DNET ----------------------------- #\n",
"# ------------------------------------------------------------------- #\n",
"\n",
"def dnet(dd,dm,zhm,xmm,xm):\n",
" '''\n",
" TURBOPAUSE CORRECTION FOR MSIS MODELS\n",
" Root mean density\n",
" DD - diffusive density\n",
" DM - full mixed density\n",
" ZHM - transition scale length\n",
" XMM - full mixed molecular weight\n",
" XM - species molecular weight\n",
" DNET - combined density\n",
" ''' \n",
" a = zhm/(xmm - xm)\n",
" if not (dm > 0 and dd > 0):\n",
" print('dnet log error {0:.1f} {1:.1f} {2:.1f}'.format(dm,dd,xm))\n",
" if dd == 0 and dm == 0: dd = 1\n",
" if dm == 0: return dd\n",
" if dd == 0: return dm\n",
" ylog = a*np.log(dm/dd)\n",
" if ylog < -10: return dd\n",
" if ylog > 10: return dm\n",
" a = dd*(1 + np.exp(ylog))**(1/a)\n",
" return a\n",
"\n",
"# ------------------------------------------------------------------- #\n",
"# -------------------------------- ZETA ----------------------------- #\n",
"# ------------------------------------------------------------------- #\n",
"\n",
"def zeta(zz,zl,re): \n",
" return (zz - zl)*(re + zl)/(re + zz)\n",
"\n",
"# ------------------------------------------------------------------- #\n",
"# ------------------------------- DENSM ----------------------------- #\n",
"# ------------------------------------------------------------------- #\n",
"\n",
"def densm(alt, d0, xm, tz, zn3, tn3, tgn3, zn2, tn2, tgn2,gsurf,re):\n",
" # Calculate Temperature and Density Profiles for lower atmos.\n",
" # call zeta\n",
" rgas = 831.4\n",
" densm_tmp = d0\n",
" tz_tmp = tz\n",
" mn3,mn2 = len(zn3),len(zn2)\n",
"\n",
" if alt > zn2[0]:\n",
" if xm == 0: \n",
" densm_tmp = tz\n",
" return densm_tmp,tz_tmp \n",
" else:\n",
" densm_tmp = d0\n",
" return densm_tmp,tz_tmp \n",
" \n",
" # STRATOSPHERE/MESOSPHERE TEMPERATURE\n",
" if alt > zn2[mn2-1]:\n",
" z = alt\n",
" else:\n",
" z = zn2[mn2-1]\n",
" mn = mn2\n",
" xs,ys = [np.zeros(mn) for i in range(2)]\n",
" z1,z2 = zn2[0],zn2[mn-1]\n",
" t1,t2=tn2[0],tn2[mn-1]\n",
" zg,zgdif = zeta(z,z1,re),zeta(z2,z1,re)\n",
" \n",
" # set up spline nodes\n",
" for k in range(mn):\n",
" xs[k] = zeta(zn2[k],z1,re)/zgdif\n",
" ys[k] = 1/tn2[k]\n",
" yd1 = -tgn2[0]/t1**2*zgdif\n",
" yd2 = -tgn2[1]/t2**2*zgdif*((re + z2)/(re + z1))**2\n",
"\n",
" # calculate spline coefficients\n",
" cs = CubicSpline(xs,ys,bc_type=((1,yd1),(1,yd2))) \n",
" x = zg/zgdif\n",
" y = cs(x)\n",
"\n",
" # temperature at altitude\n",
" tz_tmp = 1/y\n",
" if xm != 0:\n",
" # calaculate stratosphere / mesospehere density\n",
" glb = gsurf/(1 + z1/re)**2\n",
" gamm = xm*glb*zgdif/rgas\n",
" \n",
" # Integrate temperature profile\n",
" yi = cs.integrate(xs[0],x)\n",
" expl = gamm*yi\n",
" if expl > 50:\n",
" expl = 50\n",
" # Density at altitude\n",
" densm_tmp = densm_tmp*(t1/tz_tmp)*np.exp(-expl)\n",
" if alt > zn3[0]:\n",
" if xm == 0:\n",
" densm_tmp = tz_tmp\n",
" return densm_tmp,tz_tmp \n",
" else:\n",
" return densm_tmp,tz_tmp \n",
"\n",
" # troposhere / stratosphere temperature\n",
" z = alt\n",
" mn = mn3\n",
" xs,ys = [np.zeros(mn) for i in range(2)]\n",
" z1,z2 = zn3[0],zn3[mn-1]\n",
" t1,t2 = tn3[0],tn3[mn-1]\n",
" zg,zgdif = zeta(z,z1,re),zeta(z2,z1,re)\n",
"\n",
" # set up spline nodes\n",
" for k in range(mn):\n",
" xs[k] = zeta(zn3[k],z1,re)/zgdif\n",
" ys[k] = 1/tn3[k]\n",
" yd1 = -tgn3[0]/t1**2*zgdif\n",
" yd2 = -tgn3[1]/t2**2*zgdif*((re+z2)/(re+z1))**2\n",
"\n",
" # calculate spline coefficients\n",
" cs = CubicSpline(xs,ys,bc_type=((1,yd1),(1,yd2))) \n",
" x = zg/zgdif\n",
" y = cs(x)\n",
"\n",
" # temperature at altitude\n",
" tz_tmp = 1/y\n",
" if xm != 0:\n",
" # calaculate tropospheric / stratosphere density\n",
" glb = gsurf/(1 + z1/re)**2\n",
" gamm = xm*glb*zgdif/rgas\n",
" \n",
" # Integrate temperature profile\n",
" yi = cs.integrate(xs[0],x)\n",
" expl = gamm*yi\n",
" if expl > 50: expl = 50\n",
" # Density at altitude\n",
" densm_tmp = densm_tmp*(t1/tz_tmp)*np.exp(-expl)\n",
"\n",
" if xm == 0:\n",
" densm_tmp = tz_tmp\n",
" return densm_tmp,tz_tmp\n",
" else:\n",
" return densm_tmp,tz_tmp\n",
" \n",
"# ------------------------------------------------------------------- #\n",
"# ------------------------------- DENSU ----------------------------- #\n",
"# ------------------------------------------------------------------- #\n",
"\n",
"def densu (alt,dlb,tinf,tlb,xm,alpha,tz,zlb,s2,zn1,tn1,tgn1,gsurf,re):\n",
" # Calculate Temperature and Density Profiles for MSIS models\n",
" # New lower thermo polynomial\n",
" # call: zeta, \n",
"\n",
" rgas = 831.4\n",
" densu_tmp = 1\n",
" mn1 = len(zn1)\n",
" # joining altitudes of Bates and spline\n",
" za = zn1[0]\n",
" if alt > za:\n",
" z = alt\n",
" else:\n",
" z = za\n",
" # geopotential altitude difference from ZLB\n",
" zg2 = zeta(z,zlb,re)\n",
"\n",
" # Bates temperature\n",
" tt = tinf - (tinf - tlb)*np.exp(-s2*zg2)\n",
" ta = tz = tt\n",
" densu_tmp = tz_tmp = tz\n",
"\n",
" if alt < za:\n",
" # calculate temperature below ZA\n",
" # temperature gradient at ZA from Bates profile\n",
" dta = (tinf - ta)*s2*((re + zlb)/(re + za))**2\n",
" tgn1[0],tn1[0] = dta,ta\n",
" if alt > zn1[mn1-1]:\n",
" z = alt\n",
" else:\n",
" z = zn1[mn1-1]\n",
" mn = mn1\n",
" xs,ys = [np.zeros(mn) for i in range(2)]\n",
" z1,z2 = zn1[0],zn1[mn-1]\n",
" t1,t2 = tn1[0],tn1[mn-1]\n",
" # geopotental difference from z1\n",
" zg,zgdif = zeta(z,z1,re),zeta(z2,z1,re)\n",
" # set up spline nodes\n",
" for k in range(mn):\n",
" xs[k] = zeta(zn1[k],z1,re)/zgdif\n",
" ys[k] = 1/tn1[k]\n",
" # end node derivatives\n",
" yd1 = -tgn1[0]/t1**2*zgdif\n",
" yd2 = -tgn1[1]/t2**2*zgdif*((re + z2)/(re + z1))**2\n",
" # calculate spline coefficients\n",
" cs = CubicSpline(xs,ys,bc_type=((1,yd1),(1,yd2))) \n",
" x = zg/zgdif\n",
" y = cs(x)\n",
" # temperature at altitude\n",
" tz_tmp = 1/y\n",
" densu_tmp = tz_tmp\n",
" if xm == 0: return densu_tmp,tz_tmp\n",
" \n",
" # calculate density above za\n",
" glb = gsurf/(1 + zlb/re)**2\n",
" gamma = xm*glb/(s2*rgas*tinf)\n",
" expl = np.exp(-s2*gamma*zg2)\n",
" if expl > 50: expl = 50\n",
" if tt <= 0: expl = 50 \n",
"\n",
" # density at altitude\n",
" densa = dlb*(tlb/tt)**(1 + alpha + gamma)*expl\n",
" densu_tmp = densa\n",
" if alt >= za: return densu_tmp,tz_tmp\n",
" \n",
" # calculate density below za\n",
" glb = gsurf/(1 + z1/re)**2\n",
" gamm = xm*glb*zgdif/rgas\n",
"\n",
" # integrate spline temperatures\n",
" yi = cs.integrate(xs[0],x)\n",
" expl = gamm*yi\n",
" if expl > 50: expl = 50\n",
" if tz_tmp <= 0: expl = 50\n",
"\n",
" # density at altitude\n",
" densu_tmp = densu_tmp*(t1/tz_tmp)**(1 + alpha)*np.exp(-expl)\n",
" return densu_tmp,tz_tmp\n",
"\n",
"# ------------------------------------------------------------------- #\n",
"# --------------- 3hr Magnetic activity functions ------------------- #\n",
"# ------------------------------------------------------------------- #\n",
"\n",
"# Eq. A24d\n",
"def g0(a,p):\n",
" return (a - 4 + (p[25] - 1)*(a - 4 + (np.exp(-np.abs(p[24])*(a - 4)) - 1) / np.abs(p[24])))\n",
"\n",
"# Eq. A24c\n",
"def sumex(ex):\n",
" return (1 + (1 - ex**19)/(1 - ex)*ex**0.5)\n",
"\n",
"# Eq. A24a\n",
"def sg0(ex,p,ap):\n",
" # call sumex, g0\n",
" return (g0(ap[1],p) + g0(ap[2],p)*ex + g0(ap[3],p)*ex**2 + \\\n",
" g0(ap[4],p)*ex**3 + (g0(ap[5],p)*ex**4 + \\\n",
" g0(ap[6],p)*ex**12)*(1-ex**8)/(1-ex))/sumex(ex)\n",
"\n",
"# ------------------------------------------------------------------- #\n",
"# ------------------ Associated Legendre polynomials ---------------- #\n",
"# ------------------------------------------------------------------- #\n",
"\n",
"def lengendre(g_lat,lmax = 8):\n",
" # Index of PLegendreA_x can be calculated by PlmIndex(l,m)\n",
" x = np.sin(np.deg2rad(g_lat))\n",
" PLegendreA_x = PLegendreA(lmax,x)\n",
" return PLegendreA_x\n",
"\n",
"# ------------------------------------------------------------------- #\n",
"# ------------------------------- GLOBE7 ---------------------------- #\n",
"# ------------------------------------------------------------------- #\n",
"\n",
"def globe7(p,inputp,flags):\n",
" # CALCULATE G(L) FUNCTION \n",
" # Upper Thermosphere Parameters\n",
" # call: lengendre,sg0\n",
" t = np.zeros(15)\n",
" sr = 7.2722E-5\n",
" dr = 1.72142E-2\n",
" hr = 0.2618\n",
" \n",
" apdf = 0\n",
" apt = np.zeros(4)\n",
" tloc = inputp['lst']\n",
"\n",
" if not (flags['sw'][6]==0 and flags['sw'][7]==0 and flags['sw'][13]==0):\n",
" stloc,ctloc = np.sin(hr*tloc),np.cos(hr*tloc)\n",
" s2tloc,c2tloc = np.sin(2*hr*tloc),np.cos(2*hr*tloc)\n",
" s3tloc,c3tloc = np.sin(3*hr*tloc),np.cos(3*hr*tloc)\n",
" cd32 = np.cos(dr*(inputp['doy'] - p[31]))\n",
" cd18 = np.cos(2*dr*(inputp['doy'] - p[17]))\n",
" cd14 = np.cos(dr*(inputp['doy'] - p[13]))\n",
" cd39 = np.cos(2*dr*(inputp['doy'] - p[38]))\n",
"\n",
" # F10.7 EFFECT \n",
" df = inputp['f107'] - inputp['f107A']\n",
" dfa = inputp['f107A'] - 150\n",
" t[0] = p[19]*df*(1 + p[59]*dfa) + p[20]*df**2 + p[21]*dfa + p[29]*dfa**2\n",
" f1 = 1 + (p[47]*dfa + p[19]*df + p[20]*df**2)*flags['swc'][0]\n",
" f2 = 1 + (p[49]*dfa + p[19]*df + p[20]*df**2)*flags['swc'][0]\n",
" \n",
" plg = lengendre(inputp['g_lat'])\n",
"\n",
" # TIME INDEPENDENT \n",
" t[1] = p[1]*plg[3] + p[2]*plg[10] + p[22]*plg[21] + p[14]*plg[3]*dfa*flags['swc'][0] + p[26]*plg[1]\n",
" \n",
" # SYMMETRICAL ANNUAL \n",
" t[2] = p[18]*cd32\n",
"\n",
" # SYMMETRICAL SEMIANNUAL\n",
" t[3] = (p[15] + p[16]*plg[3])*cd18\n",
"\n",
" # ASYMMETRICAL ANNUAL\n",
" t[4] = f1*(p[9]*plg[1] + p[10]*plg[6])*cd14\n",
"\n",
" # ASYMMETRICAL SEMIANNUAL \n",
" t[5] = p[37]*plg[1]*cd39\n",
" \n",
" # DIURNAL \n",
" if flags['sw'][6]:\n",
" t71 = p[11]*plg[4]*cd14*flags['swc'][4]\n",
" t72 = p[12]*plg[4]*cd14*flags['swc'][4]\n",
" t[6] = f2*((p[3]*plg[2] + p[4]*plg[7] + p[27]*plg[16] + t71) * ctloc + (p[6]*plg[2] + p[7]*plg[7] + p[28]*plg[16] + t72)*stloc)\n",
" \n",
" # SEMIDIURNAL \n",
" if flags['sw'][7]:\n",
" t81 = (p[23]*plg[8] + p[35]*plg[17])*cd14*flags['swc'][4]\n",
" t82 = (p[33]*plg[8] + p[36]*plg[17])*cd14*flags['swc'][4]\n",
" t[7] = f2*((p[5]*plg[5] + p[41]*plg[12] + t81)*c2tloc +(p[8]*plg[5] + p[42]*plg[12] + t82)*s2tloc)\n",
"\n",
" # TERDIURNAL \n",
" if flags['sw'][13]:\n",
" t[13] = f2*((p[39]*plg[9] + (p[93]*plg[13] + p[46]*plg[24])*cd14*flags['swc'][4])*s3tloc + (p[40]*plg[9]+(p[94]*plg[13] + p[48]*plg[24])*cd14*flags['swc'][4])*c3tloc)\n",
" \n",
" # magnetic activity based on daily ap \n",
" if flags['sw'][8] == -1:\n",
" ap = inputp['ap_a']\n",
" if p[51]!= 0:\n",
" exp1 = np.exp(-10800*np.abs(p[51])/(1 + p[138]*(45 - np.abs(inputp['g_lat']))))\n",
" if exp1 > 0.99999: exp1 = 0.99999\n",
" if p[24] < 1E-4: p[24] = 1E-4\n",
" apt[0] = sg0(exp1,p,ap)\n",
" # apt[1] = sg2(exp1,p,ap)\n",
" # apt[2] = sg0(exp2,p,ap)\n",
" # apt[3] = sg2(exp2,p,ap)\n",
"\n",
" if flags['sw'][8]:\n",
" t[8] = apt[0]*(p[50] + p[96]*plg[3] + p[54]*plg[10] + \\\n",
" (p[125]*plg[1] + p[126]*plg[6] + p[127]*plg[15])*cd14*flags['swc'][4] + \\\n",
" (p[128]*plg[2] + p[129]*plg[7] + p[130]*plg[16])*flags['swc'][6]*np.cos(hr*(tloc - p[131])))\n",
" else:\n",
" apd = inputp['ap'] - 4\n",
" p44 = p[43]\n",
" p45 = p[44]\n",
" if p44 < 0: p44 = 1E-5\n",
" apdf = apd + (p45 - 1)*(apd + (np.exp(-p44*apd) - 1)/p44)\n",
" if flags['sw'][8]:\n",
" t[8]=apdf*(p[32] + p[45]*plg[3] + p[34]*plg[10] + \\\n",
" (p[100]*plg[1] + p[101]*plg[6] + p[102]*plg[15])*cd14*flags['swc'][4] +\n",
" (p[121]*plg[2] + p[122]*plg[7] + p[123]*plg[16])*flags['swc'][6]*np.cos(hr*(tloc - p[124])))\n",
"\n",
" if flags['sw'][9] and inputp['g_long'] > -1000:\n",
" # longitudinal\n",
" if flags['sw'][10]:\n",
" t[10] = (1 + p[80]*dfa*flags['swc'][0])*((p[64]*plg[4] + p[65]*plg[11] + p[66]*plg[22]\\\n",
" + p[103]*plg[2] + p[104]*plg[7] + p[105]*plg[16]\\\n",
" + flags['swc'][4]*(p[109]*plg[2] + p[110]*plg[7] + p[111]*plg[16])*cd14)*np.cos(np.deg2rad(inputp['g_long'])) \\\n",
" +(p[90]*plg[4]+p[91]*plg[11]+p[92]*plg[22] + p[106]*plg[2]+p[107]*plg[7]+p[108]*plg[16]\\\n",
" + flags['swc'][4]*(p[112]*plg[2] + p[113]*plg[7] + p[114]*plg[16])*cd14)*np.sin(np.deg2rad(inputp['g_long'])))\n",
"\n",
" # ut and mixed ut, longitude \n",
" if flags['sw'][11]:\n",
" t[11]=(1 + p[95]*plg[1])*(1 + p[81]*dfa*flags['swc'][0])*\\\n",
" (1 + p[119]*plg[1]*flags['swc'][4]*cd14)*\\\n",
" ((p[68]*plg[1] + p[69]*plg[6] + p[70]*plg[15])*np.cos(sr*(inputp['sec'] - p[71])))\n",
" t[11] += flags['swc'][10]*(p[76]*plg[8] + p[77]*plg[17] + p[78]*plg[30])*\\\n",
" np.cos(sr*(inputp['sec'] - p[79]) + 2*np.deg2rad(inputp['g_long']))*(1 + p[137]*dfa*flags['swc'][0])\n",
" \n",
" # ut, longitude magnetic activity \n",
" if flags['sw'][10]:\n",
" if flags['sw'][8] == -1:\n",
" if p[51]:\n",
" t[12] = apt[0]*flags['swc'][10]*(1 + p[132]*plg[1])*\\\n",
" ((p[52]*plg[4] + p[98]*plg[11] + p[67]*plg[22])* np.cos(np.deg2rad(inputp['g_long'] - p[97])))\\\n",
" + apt[0]*flags['swc'][10]*flags['swc'][4]*(p[133]*plg[2] + p[134]*plg[7] + p[135]*plg[16])*\\\n",
" cd14*np.cos(np.deg2rad(inputp['g_long'] - p[136])) + apt[0]*flags['swc'][11]* \\\n",
" (p[55]*plg[1] + p[56]*plg[6] + p[57]*plg[15])*np.cos(sr*(inputp['sec'] - p[58]))\n",
" else:\n",
" t[12] = apdf*flags['swc'][10]*(1 + p[120]*plg[1])*((p[60]*plg[4] + p[61]*plg[11] + p[62]*plg[22])*\\\n",
" np.cos(np.deg2rad(inputp['g_long']-p[63])))+apdf*flags['swc'][10]*flags['swc'][4]* \\\n",
" (p[115]*plg[2] + p[116]*plg[7] + p[117]*plg[16])* \\\n",
" cd14*np.cos(np.deg2rad(inputp['g_long'] - p[118])) \\\n",
" + apdf*flags['swc'][11]*(p[83]*plg[1] + p[84]*plg[6] + p[85]*plg[15])* np.cos(sr*(inputp['sec'] - p[75]))\n",
"\n",
" # parms not used: 82, 89, 99, 139-149 \n",
" tinf = p[30]\n",
" for i in range(14):\n",
" tinf = tinf + np.abs(flags['sw'][i])*t[i] \n",
" return tinf,[dfa,plg,ctloc,stloc,c2tloc,s2tloc,s3tloc,c3tloc,apdf,apt] \n",
"\n",
"# ------------------------------------------------------------------- #\n",
"# ------------------------------- GLOB7S ---------------------------- #\n",
"# ------------------------------------------------------------------- #\n",
"\n",
"def glob7s(p,inputp,flags,varli):\n",
" # VERSION OF GLOBE FOR LOWER ATMOSPHERE 10/26/99 \n",
" # call: lengendre,sg0\n",
" pset = 2\n",
" t = np.zeros(14)\n",
" dr = 1.72142E-2\n",
" [dfa,plg,ctloc,stloc,c2tloc,s2tloc,s3tloc,c3tloc,apdf,apt] = varli\n",
" \n",
" # confirm parameter set\n",
" if p[99] == 0: p[99] = pset\n",
" if p[99] != pset:\n",
" print(\"Wrong parameter set for glob7s\")\n",
" return -1\n",
"\n",
" for j in range(14):\n",
" t[j] = 0\n",
" cd32 = np.cos(dr*(inputp['doy'] - p[31]))\n",
" cd18 = np.cos(2*dr*(inputp['doy'] - p[17]))\n",
" cd14 = np.cos(dr*(inputp['doy'] - p[13]))\n",
" cd39 = np.cos(2*dr*(inputp['doy'] - p[38]))\n",
"\n",
" # F10.7 \n",
" t[0] = p[21]*dfa\n",
"\n",
" # time independent \n",
" t[1] = p[1]*plg[3] + p[2]*plg[10] + p[22]*plg[21] + p[26]*plg[1] + p[14]*plg[6] + p[59]*plg[15]\n",
"\n",
" # SYMMETRICAL ANNUAL \n",
" t[2] = (p[18] + p[47]*plg[3] + p[29]*plg[10])*cd32\n",
"\n",
" # SYMMETRICAL SEMIANNUAL \n",
" t[3] = (p[15] + p[16]*plg[3] + p[30]*plg[10])*cd18\n",
"\n",
" # ASYMMETRICAL ANNUAL \n",
" t[4] = (p[9]*plg[1] + p[10]*plg[6] + p[20]*plg[15])*cd14\n",
"\n",
" # ASYMMETRICAL SEMIANNUAL\n",
" t[5] = p[37]*plg[1]*cd39;\n",
"\n",
" # DIURNAL \n",
" if flags['sw'][6]:\n",
" t71 = p[11]*plg[4]*cd14*flags['swc'][4]\n",
" t72 = p[12]*plg[4]*cd14*flags['swc'][4]\n",
" t[6] = ((p[3]*plg[2] + p[4]*plg[7] + t71)*ctloc + (p[6]*plg[2] + p[7]*plg[7] + t72)*stloc) \n",
"\n",
" # SEMIDIURNAL\n",
" if flags['sw'][7]:\n",
" t81 = (p[23]*plg[8] + p[35]*plg[17])*cd14*flags['swc'][4]\n",
" t82 = (p[33]*plg[8] + p[36]*plg[17])*cd14*flags['swc'][4]\n",
" t[7] = ((p[5]*plg[5] + p[41]*plg[12] + t81)*c2tloc + (p[8]*plg[5] + p[42]*plg[12] + t82)*s2tloc)\n",
"\n",
" # TERDIURNAL \n",
" if flags['sw'][13]:\n",
" t[13] = p[39]*plg[9]*s3tloc + p[40]*plg[9]*c3tloc\n",
"\n",
" # MAGNETIC ACTIVITY\n",
" if flags['sw'][8]:\n",
" if flags['sw'][8]==1:\n",
" t[8] = apdf * (p[32] + p[45]*plg[3]*flags['swc'][1])\n",
" if flags['sw'][8]==-1:\n",
" t[8]=(p[50]*apt[0] + p[96]*plg[3]*apt[0]*flags['swc'][1])\n",
"\n",
" # LONGITUDINAL \n",
" if not (flags['sw'][9]==0 or flags['sw'][10]==0 or inputp['g_long']<=-1000):\n",
" t[10] = (1 + plg[1]*(p[80]*flags['swc'][4]*np.cos(dr*(inputp['doy'] - p[81]))\\\n",
" + p[85]*flags['swc'][5]*np.cos(2*dr*(inputp['doy'] - p[86])))\\\n",
" + p[83]*flags['swc'][2]*np.cos(dr*(inputp['doy'] - p[84]))\\\n",
" + p[87]*flags['swc'][3]*np.cos(2*dr*(inputp['doy'] - p[88])))\\\n",
" *((p[64]*plg[4] + p[65]*plg[11] + p[66]*plg[22]\\\n",
" + p[74]*plg[2] + p[75]*plg[7] + p[76]*plg[16])*np.cos(np.deg2rad(inputp['g_long']))\\\n",
" + (p[90]*plg[4] + p[91]*plg[11] + p[92]*plg[22]\\\n",
" + p[77]*plg[2] + p[78]*plg[7] + p[79]*plg[16])*np.sin(np.deg2rad(inputp['g_long'])))\n",
" \n",
" tt = 0\n",
" for i in range(14):\n",
" tt += np.abs(flags['sw'][i])*t[i]\n",
" return tt\n",
"\n",
"# ------------------------------------------------------------------- #\n",
"# ------------------------------- GTD7 ------------------------------ #\n",
"# ------------------------------------------------------------------- #\n",
" \n",
"def gtd7(inputp,switches):\n",
" tz = 0\n",
" zn3 = np.array([32.5,20.0,15.0,10.0,0.0])\n",
" zn2 = np.array([72.5,55.0,45.0,32.5])\n",
" zmix= 62.5\n",
" \n",
" output = {'d':{'He':0,'O':0,'N2':0,'O2':0,'AR':0,'RHO':0,'H':0,'N':0,'ANM O':0},\\\n",
" 't':{'TINF':0,'TG':0}}\n",
" \n",
" flags = tselec(switches)\n",
" \n",
" # Latitude variation of gravity (none for sw[1]=0) \n",
" xlat = inputp['g_lat']\n",
" if flags['sw'][1]==0: xlat = 45\n",
" gsurf,re = glatf(xlat)\n",
" pt,pd,ps,pdl,ptm,pdm,ptl,pma,sam,pavgm = nrlmsis00_data()\n",
" xmm = pdm[2,4]\n",
" \n",
" # THERMOSPHERE / MESOSPHERE (above zn2[0]) \n",
" if inputp['alt'] > zn2[0]:\n",
" altt = inputp['alt']\n",
" else:\n",
" altt = zn2[0]\n",
"\n",
" tmp = inputp['alt']\n",
" inputp['alt'] = altt\n",
" soutput,dm28,[meso_tn1,meso_tn2,meso_tn3,meso_tgn1,meso_tgn2,meso_tgn3],[dfa,plg,ctloc,stloc,c2tloc,s2tloc,s3tloc,c3tloc,apdf,apt] = gts7(inputp,flags,gsurf,re)\n",
" altt = inputp['alt']\n",
" inputp['alt'] = tmp\n",
" # metric adjustment \n",
" dm28m = dm28*1E6\n",
" output['t']['TINF'] = soutput['t']['TINF']\n",
" output['t']['TG'] = soutput['t']['TG']\n",
" if inputp['alt'] >= zn2[0]:\n",
" output['d'] = soutput['d']\n",
" return output\n",
" # LOWER MESOSPHERE/UPPER STRATOSPHERE (between zn3[0] and zn2[0])\n",
" # Temperature at nodes and gradients at end nodes\n",
" # Inverse temperature a linear function of spherical harmonics\n",
"\n",
" varli = [dfa,plg,ctloc,stloc,c2tloc,s2tloc,s3tloc,c3tloc,apdf,apt]\n",
"\n",
" meso_tgn2[0] = meso_tgn1[1]\n",
" meso_tn2[0] = meso_tn1[4]\n",
" meso_tn2[1] = pma[0,0]*pavgm[0]/(1-flags['sw'][19]*glob7s(pma[0], inputp, flags,varli))\n",
" meso_tn2[2] = pma[1,0]*pavgm[1]/(1-flags['sw'][19]*glob7s(pma[1], inputp, flags,varli))\n",
" meso_tn2[3] = pma[2,0]*pavgm[2]/(1-flags['sw'][19]*flags['sw'][21]*glob7s(pma[2], inputp, flags,varli))\n",
" meso_tgn2[1] = pavgm[8]*pma[9,0]*(1+flags['sw'][19]*flags['sw'][21]*glob7s(pma[9], inputp, flags,varli))*meso_tn2[3]*meso_tn2[3]/(pma[2,0]*pavgm[2])**2\n",
" meso_tn3[0] = meso_tn2[3]\n",
" \n",
" if inputp['alt'] <= zn3[0]:\n",
" # LOWER STRATOSPHERE AND TROPOSPHERE (below zn3[0])\n",
" # Temperature at nodes and gradients at end nodes\n",
" # Inverse temperature a linear function of spherical harmonics\n",
"\n",
" meso_tgn3[0] = meso_tgn2[1]\n",
" meso_tn3[1] = pma[3,0]*pavgm[3]/(1-flags['sw'][21]*glob7s(pma[3], inputp, flags,varli))\n",
" meso_tn3[2] = pma[4,0]*pavgm[4]/(1-flags['sw'][21]*glob7s(pma[4], inputp, flags,varli))\n",
" meso_tn3[3] = pma[5,0]*pavgm[5]/(1-flags['sw'][21]*glob7s(pma[5], inputp, flags,varli))\n",
" meso_tn3[4] = pma[6,0]*pavgm[6]/(1-flags['sw'][21]*glob7s(pma[6], inputp, flags,varli))\n",
" meso_tgn3[1] = pma[7,0]*pavgm[7]*(1+flags['sw'][21]*glob7s(pma[7], inputp, flags,varli)) *meso_tn3[4]*meso_tn3[4]/(pma[6,0]*pavgm[6])**2\n",
" # LINEAR TRANSITION TO FULL MIXING BELOW zn2[0] \n",
"\n",
" dmc = 0\n",
" if inputp['alt'] > zmix:\n",
" dmc = 1 - (zn2[0]-inputp['alt'])/(zn2[0] - zmix)\n",
" dz28 = soutput['d']['N2']\n",
" \n",
" # N2 density\n",
" dmr = soutput['d']['N2'] / dm28m - 1\n",
" output['d']['N2'],tz = densm(inputp['alt'],dm28m,xmm, tz, zn3, meso_tn3, meso_tgn3, zn2, meso_tn2, meso_tgn2,gsurf,re)\n",
" output['d']['N2'] = output['d']['N2'] * (1 + dmr*dmc)\n",
"\n",
" # HE density \n",
" dmr = soutput['d']['He'] / (dz28 * pdm[0,1]) - 1\n",
" output['d']['He'] = output['d']['N2'] * pdm[0,1] * (1 + dmr*dmc)\n",
"\n",
" # O density\n",
" output['d']['O'] = 0\n",
" output['d']['ANM O'] = 0\n",
"\n",
" # O2 density\n",
" dmr = soutput['d']['O2'] / (dz28 * pdm[3,1]) - 1\n",
" output['d']['O2'] = output['d']['N2'] * pdm[3,1] * (1 + dmr*dmc)\n",
"\n",
" # AR density \n",
" dmr = soutput['d']['AR'] / (dz28 * pdm[4,1]) - 1\n",
" output['d']['AR'] = output['d']['N2'] * pdm[4,1] * (1 + dmr*dmc)\n",
"\n",
" # Hydrogen density\n",
" output['d']['H'] = 0\n",
"\n",
" # Atomic nitrogen density \n",
" output['d']['N'] = 0\n",
"\n",
" # Total mass density \n",
" output['d']['RHO'] = 1.66E-24 * (4 * output['d']['He'] + 16 * output['d']['O'] + 28 * output['d']['N2']\\\n",
" + 32 * output['d']['O2'] + 40 * output['d']['AR'] + output['d']['H'] + 14 * output['d']['N'])\n",
"\n",
" output['d']['RHO'] = output['d']['RHO']/1000\n",
"\n",
" # temperature at altitude \n",
" dd,tz = densm(inputp['alt'], 1, 0, tz, zn3, meso_tn3, meso_tgn3, zn2, meso_tn2, meso_tgn2,gsurf,re)\n",
" output['t']['TG'] = tz\n",
" return output\n",
" \n",
"# ------------------------------------------------------------------- #\n",
"# ------------------------------- GTD7D ----------------------------- #\n",
"# ------------------------------------------------------------------- #\n",
"def gtd7d(inputp, flags):\n",
" output = gtd7(inputp, flags)\n",
" output['d']['RHO'] = 1.66E-24 * (4 * output['d']['He'] + 16 * output['d']['O'] + 28 * output['d']['N2']\\\n",
" + 32 * output['d']['O2'] + 40 * output['d']['AR'] + output['d']['H'] + 14 * output['d']['N'] + 16 * output['d']['ANM O'])\n",
"\n",
" output['d']['RHO'] = output['d']['RHO']/1000\n",
" return output\n",
"\n",
"\n",
"# ------------------------------------------------------------------- #\n",
"# ------------------------------- GTS7 ------------------------------ #\n",
"# ------------------------------------------------------------------- #\n",
" \n",
"def gts7(inputp,flags,gsurf,re):\n",
" # Thermospheric portion of NRLMSISE-00\n",
" # See GTD7 for more extensive comments\n",
" # alt > 72.5 km!\n",
" # call: nrlmsis00_data, globe7, densu\n",
" \n",
" output = {'d':{'He':0,'O':0,'N2':0,'O2':0,'AR':0,'RHO':0,'H':0,'N':0,'ANM O':0},\\\n",
" 't':{'TINF':0,'TG':0}}\n",
" tz = 0\n",
" dm28 = 0\n",
" meso_tn1,meso_tn3 = [np.zeros(5) for i in range(2)]\n",
" meso_tn2 = np.zeros(4)\n",
" meso_tgn1,meso_tgn2,meso_tgn3 = [np.zeros(2) for i in range(3)]\n",
" \n",
" zn1 = np.array([120.0, 110.0, 100.0, 90.0, 72.5])\n",
"\n",
" dr = 1.72142E-2\n",
" alpha = np.array([-0.38, 0.0, 0.0, 0.0, 0.17, 0.0, -0.38, 0.0, 0.0])\n",
" altl = np.array([200.0, 300.0, 160.0, 250.0, 240.0, 450.0, 320.0, 450.0])\n",
" pt,pd,ps,pdl,ptm,pdm,ptl,pma,sam,pavgm = nrlmsis00_data()\n",
" za = pdl[1,15]\n",
" zn1[0] = za\n",
" \n",
" # TINF VARIATIONS NOT IMPORTANT BELOW ZA OR ZN1(1)\n",
" if inputp['alt'] > zn1[0]:\n",
" tinf_tmp,varli = globe7(pt,inputp,flags)\n",
" tinf = ptm[0]*pt[0] * (1+flags['sw'][15]*tinf_tmp)\n",
" else:\n",
" tinf = ptm[0]*pt[0]\n",
" output['t']['TINF'] = tinf\n",
" \n",
" # GRADIENT VARIATIONS NOT IMPORTANT BELOW ZN1(5)\n",
" if inputp['alt'] > zn1[4]:\n",
" tinf_tmp,varli = globe7(ps,inputp,flags)\n",
" grad = ptm[3]*ps[0] * (1+flags['sw'][18]*tinf_tmp)\n",
" else:\n",
" grad = ptm[3]*ps[0]\n",
" tinf_tmp,varli = globe7(pd[3],inputp,flags) \n",
" tlb = ptm[1] * (1 + flags['sw'][16]*tinf_tmp)*pd[3,0]\n",
" s = grad/(tinf - tlb)\n",
" \n",
" # Lower thermosphere temp variations not significant for density above 300 km\n",
" if inputp['alt'] < 300:\n",
" meso_tn1[1] = ptm[6]*ptl[0,0]/(1.0-flags['sw'][17]*glob7s(ptl[0], inputp, flags,varli))\n",
" meso_tn1[2] = ptm[2]*ptl[1,0]/(1.0-flags['sw'][17]*glob7s(ptl[1], inputp, flags,varli))\n",
" meso_tn1[3] = ptm[7]*ptl[2,0]/(1.0-flags['sw'][17]*glob7s(ptl[2], inputp, flags,varli))\n",
" meso_tn1[4] = ptm[4]*ptl[3,0]/(1.0-flags['sw'][17]*flags['sw'][19]*glob7s(ptl[3], inputp, flags,varli))\n",
" meso_tgn1[1] = ptm[8]*pma[8,0]*(1.0+flags['sw'][17]*flags['sw'][19]*glob7s(pma[8], inputp, flags,varli))*meso_tn1[4]*meso_tn1[4]/(ptm[4]*ptl[3,0])**2\n",
" else:\n",
" meso_tn1[1]=ptm[6]*ptl[0,0]\n",
" meso_tn1[2]=ptm[2]*ptl[1,0]\n",
" meso_tn1[3]=ptm[7]*ptl[2,0]\n",
" meso_tn1[4]=ptm[4]*ptl[3,0]\n",
" meso_tgn1[1]=ptm[8]*pma[8,0]*meso_tn1[4]*meso_tn1[4]/(ptm[4]*ptl[3,0])**2\n",
" \n",
" # N2 variation factor at Zlb\n",
" tinf_tmp,varli = globe7(pd[2],inputp,flags)\n",
" g28 = flags['sw'][20]*tinf_tmp\n",
"\n",
" # VARIATION OF TURBOPAUSE HEIGHT\n",
" zhf = pdl[1,24]*(1+flags['sw'][4]*pdl[0,24]*np.sin(np.deg2rad(inputp['g_lat']))*np.cos(dr*(inputp['doy']-pt[13])))\n",
" output['t']['TINF'] = tinf\n",
" xmm = pdm[2,4]\n",
" z = inputp['alt']\n",
"\n",
" # N2 DENSITY\n",
" # Diffusive density at Zlb \n",
" db28 = pdm[2,0]*np.exp(g28)*pd[2,0]\n",
" # Diffusive density at Alt \n",
" output['d']['N2'],output['t']['TG'] = densu(z,db28,tinf,tlb,28,alpha[2],output['t']['TG'],ptm[5],s,zn1,meso_tn1,meso_tgn1,gsurf,re)\n",
" dd = output['d']['N2']\n",
" # Turbopause \n",
" zh28 = pdm[2,2]*zhf\n",
" zhm28 = pdm[2,3]*pdl[1,5] \n",
" xmd = 28 - xmm\n",
" # Mixed density at Zlb \n",
" b28,tz = densu(zh28,db28,tinf,tlb,xmd,(alpha[2]-1),tz,ptm[5],s, zn1,meso_tn1,meso_tgn1,gsurf,re)\n",
" if flags['sw'][14] and z <= altl[2]:\n",
" # Mixed density at Alt \n",
" dm28,tz = densu(z,b28,tinf,tlb,xmm,alpha[2],tz,ptm[5],s,zn1,meso_tn1,meso_tgn1,gsurf,re)\n",
" # Net density at Alt\n",
" output['d']['N2'] = dnet(output['d']['N2'],dm28,zhm28,xmm,28)\n",
" \n",
" # HE DENSITY\n",
" # Density variation factor at Zlb\n",
" tinf_tmp,varli = globe7(pd[0],inputp,flags)\n",
" g4 = flags['sw'][20]*tinf_tmp\n",
" # Diffusive density at Zlb \n",
" db04 = pdm[0,0]*np.exp(g4)*pd[0,0]\n",
" # Diffusive density at Alt \n",
" output['d']['He'],output['t']['TG'] = densu(z,db04,tinf,tlb, 4,alpha[0],output['t']['TG'],ptm[5],s,zn1,meso_tn1,meso_tgn1,gsurf,re)\n",
" dd = output['d']['He']\n",
" if flags['sw'][14] and z<altl[0]:\n",
" # Turbopause \n",
" zh04 = pdm[0,2]\n",
" # Mixed density at Zlb\n",
" b04,output['t']['TG'] = densu(zh04,db04,tinf,tlb,4-xmm,alpha[0]-1,output['t']['TG'],ptm[5],s,zn1,meso_tn1,meso_tgn1,gsurf,re)\n",
" # Mixed density at Alt\n",
" dm04,output['t']['TG'] = densu(z,b04,tinf,tlb,xmm,0,output['t']['TG'],ptm[5],s,zn1,meso_tn1,meso_tgn1,gsurf,re)\n",
" zhm04 = zhm28\n",
" # Net density at Alt\n",
" output['d']['He'] = dnet(output['d']['He'],dm04,zhm04,xmm,4)\n",
" # Correction to specified mixing ratio at ground \n",
" rl = np.log(b28*pdm[0,1]/b04)\n",
" zc04 = pdm[0,4]*pdl[1,0]\n",
" hc04 = pdm[0,5]*pdl[1,1]\n",
" # Net density corrected at Alt \n",
" output['d']['He'] = output['d']['He']*ccor(z,rl,hc04,zc04) \n",
" \n",
" # O DENSITY \n",
" # Density variation factor at Zlb \n",
" tinf_tmp,varli = globe7(pd[1],inputp,flags)\n",
" g16 = flags['sw'][20]*tinf_tmp\n",
" # Diffusive density at Zlb \n",
" db16 = pdm[1,0]*np.exp(g16)*pd[1,0]\n",
" # Diffusive density at Alt \n",
" output['d']['O'],output['t']['TG'] = densu(z,db16,tinf,tlb,16,alpha[1],output['t']['TG'],ptm[5],s, zn1,meso_tn1,meso_tgn1,gsurf,re)\n",
" dd = output['d']['O']\n",
" if flags['sw'][14] and z <= altl[1]:\n",
" # Turbopause \n",
" zh16 = pdm[1,2]\n",
" # Mixed density at Zlb \n",
" b16,output['t']['TG'] = densu(zh16,db16,tinf,tlb,16-xmm,alpha[1]-1, output['t']['TG'],ptm[5],s,zn1,meso_tn1,meso_tgn1,gsurf,re)\n",
" # Mixed density at Alt \n",
" dm16,output['t']['TG'] = densu(z,b16,tinf,tlb,xmm,0,output['t']['TG'],ptm[5],s,zn1,meso_tn1,meso_tgn1,gsurf,re)\n",
" zhm16 = zhm28\n",
" # Net density at Alt \n",
" output['d']['O'] = dnet(output['d']['O'],dm16,zhm16,xmm,16)\n",
" rl = pdm[1,1]*pdl[1,16]*(1+flags['sw'][0]*pdl[0,23]*(inputp['f107A']-150))\n",
" hc16 = pdm[1,5]*pdl[1,3]\n",
" zc16 = pdm[1,4]*pdl[1,2]\n",
" hc216 = pdm[1,5]*pdl[1,4]\n",
" output['d']['O'] = output['d']['O']*ccor2(z,rl,hc16,zc16,hc216)\n",
" # Chemistry correction \n",
" hcc16 = pdm[1,7]*pdl[1,13]\n",
" zcc16 = pdm[1,6]*pdl[1,12]\n",
" rc16 = pdm[1,3]*pdl[1,14]\n",
" # Net density corrected at Alt\n",
" output['d']['O'] = output['d']['O']*ccor(z,rc16,hcc16,zcc16)\n",
" \n",
" # O2 DENSITY\n",
" # Density variation factor at Zlb \n",
" tinf_tmp,varli = globe7(pd[4],inputp,flags)\n",
" g32 = flags['sw'][20]*tinf_tmp\n",
" # Diffusive density at Zlb \n",
" db32 = pdm[3,0]*np.exp(g32)*pd[4,0]\n",
" # Diffusive density at Alt \n",
" output['d']['O2'],output['t']['TG'] = densu(z,db32,tinf,tlb, 32,alpha[3],output['t']['TG'],ptm[5],s, zn1,meso_tn1,meso_tgn1,gsurf,re)\n",
" dd = output['d']['O2'];\n",
" if flags['sw'][14]:\n",
" if z <= altl[3]:\n",
" # Turbopause \n",
" zh32 = pdm[3,2]\n",
" # Mixed density at Zlb\n",
" b32,output['t']['TG'] = densu(zh32,db32,tinf,tlb,32-xmm,alpha[3]-1, output['t']['TG'],ptm[5],s,zn1,meso_tn1,meso_tgn1,gsurf,re)\n",
" # Mixed density at Alt \n",
" dm32,output['t']['TG'] = densu(z,b32,tinf,tlb,xmm,0,output['t']['TG'],ptm[5],s,zn1,meso_tn1,meso_tgn1,gsurf,re)\n",
" zhm32 = zhm28\n",
" # Net density at Alt\n",
" output['d']['O2'] = dnet(output['d']['O2'],dm32,zhm32,xmm,32)\n",
" # Correction to specified mixing ratio at ground \n",
" rl = np.log(b28*pdm[3,1]/b32)\n",
" hc32 = pdm[3,5]*pdl[1,7]\n",
" zc32 = pdm[3,4]*pdl[1,6]\n",
" output['d']['O2'] = output['d']['O2']*ccor(z,rl,hc32,zc32)\n",
"\n",
" # Correction for general departure from diffusive equilibrium above Zlb */\n",
" hcc32 = pdm[3,7]*pdl[1,22]\n",
" hcc232 = pdm[3,7]*pdl[0,22]\n",
" zcc32 = pdm[3,6]*pdl[1,21]\n",
" rc32 = pdm[3,3]*pdl[1,23]*(1+flags['sw'][0]*pdl[0,23]*(inputp['f107A']-150))\n",
" # Net density corrected at Alt \n",
" output['d']['O2'] = output['d']['O2']*ccor2(z,rc32,hcc32,zcc32,hcc232)\n",
" # AR DENSITY\n",
" # Density variation factor at Zlb \n",
" tinf_tmp,varli = globe7(pd[5],inputp,flags)\n",
" g40 = flags['sw'][20]*tinf_tmp\n",
" # Diffusive density at Zlb \n",
" db40 = pdm[4,0]*np.exp(g40)*pd[5,0]\n",
" # Diffusive density at Alt\n",
" output['d']['AR'],output['t']['TG'] = densu(z,db40,tinf,tlb, 40,alpha[4],output['t']['TG'],ptm[5],s,zn1,meso_tn1,meso_tgn1,gsurf,re)\n",
" dd = output['d']['AR']\n",
" if flags['sw'][14] and z <= altl[4]:\n",
" # Turbopause\n",
" zh40 = pdm[4,2]\n",
" # Mixed density at Zlb \n",
" b40,output['t']['TG'] = densu(zh40,db40,tinf,tlb,40-xmm,alpha[4]-1,output['t']['TG'],ptm[5],s,zn1,meso_tn1,meso_tgn1,gsurf,re)\n",
" # Mixed density at Alt\n",
" dm40,output['t']['TG'] = densu(z,b40,tinf,tlb,xmm,0,output['t']['TG'],ptm[5],s,zn1,meso_tn1,meso_tgn1,gsurf,re)\n",
" zhm40 = zhm28\n",
" # Net density at Alt \n",
" output['d']['AR'] = dnet(output['d']['AR'],dm40,zhm40,xmm,40)\n",
" # Correction to specified mixing ratio at ground \n",
" rl = np.log(b28*pdm[4,1]/b40)\n",
" hc40 = pdm[4,5]*pdl[1,9]\n",
" zc40 = pdm[4,4]*pdl[1,8]\n",
" # Net density corrected at Alt\n",
" output['d']['AR'] = output['d']['AR']*ccor(z,rl,hc40,zc40)\n",
" \n",
" # HYDROGEN DENSITY \n",
" # Density variation factor at Zlb */\n",
" tinf_tmp,varli = globe7(pd[6], inputp, flags)\n",
" g1 = flags['sw'][20]*tinf_tmp\n",
" # Diffusive density at Zlb \n",
" db01 = pdm[5,0]*np.exp(g1)*pd[6,0]\n",
" # Diffusive density at Alt\n",
" output['d']['H'],output['t']['TG']=densu(z,db01,tinf,tlb,1,alpha[6],output['t']['TG'],ptm[5],s,zn1,meso_tn1,meso_tgn1,gsurf,re)\n",
" dd = output['d']['H']\n",
" if flags['sw'][14] and z <= altl[6]:\n",
" # Turbopause \n",
" zh01 = pdm[5,2]\n",
" # Mixed density at Zlb\n",
" b01,output['t']['TG'] = densu(zh01,db01,tinf,tlb,1-xmm,alpha[6]-1, output['t']['TG'],ptm[5],s,zn1,meso_tn1,meso_tgn1,gsurf,re)\n",
" # Mixed density at Alt \n",
" dm01,output['t']['TG'] = densu(z,b01,tinf,tlb,xmm,0,output['t']['TG'],ptm[5],s,zn1,meso_tn1,meso_tgn1,gsurf,re)\n",
" zhm01 = zhm28\n",
" # Net density at Alt\n",
" output['d']['H'] = dnet(output['d']['H'],dm01,zhm01,xmm,1)\n",
" # Correction to specified mixing ratio at ground \n",
" rl = np.log(b28*pdm[5,1]*np.abs(pdl[1,17])/b01)\n",
" hc01 = pdm[5,5]*pdl[1,11]\n",
" zc01 = pdm[5,4]*pdl[1,10]\n",
" output['d']['H'] = output['d']['H']*ccor(z,rl,hc01,zc01)\n",
" # Chemistry correction \n",
" hcc01 = pdm[5,7]*pdl[1,19]\n",
" zcc01 = pdm[5,6]*pdl[1,18]\n",
" rc01 = pdm[5,3]*pdl[1,20]\n",
" # Net density corrected at Alt\n",
" output['d']['H'] = output['d']['H']*ccor(z,rc01,hcc01,zcc01)\n",
" \n",
" # ATOMIC NITROGEN DENSITY \n",
" # Density variation factor at Zlb */\n",
" tinf_tmp,varli = globe7(pd[7],inputp,flags)\n",
" g14 = flags['sw'][20]*tinf_tmp\n",
" # Diffusive density at Zlb \n",
" db14 = pdm[6,0]*np.exp(g14)*pd[7,0]\n",
" # Diffusive density at Alt \n",
" output['d']['N'],output['t']['TG']=densu(z,db14,tinf,tlb,14,alpha[7],output['t']['TG'],ptm[5],s,zn1,meso_tn1,meso_tgn1,gsurf,re)\n",
" dd = output['d']['N']\n",
" if flags['sw'][14] and z <= altl[7]:\n",
" # Turbopause\n",
" zh14 = pdm[6,2]\n",
" # Mixed density at Zlb\n",
" b14,output['t']['TG'] = densu(zh14,db14,tinf,tlb,14-xmm,alpha[7]-1, output['t']['TG'],ptm[5],s,zn1,meso_tn1,meso_tgn1,gsurf,re)\n",
" # Mixed density at Alt \n",
" dm14,output['t']['TG'] = densu(z,b14,tinf,tlb,xmm,0,output['t']['TG'],ptm[5],s,zn1,meso_tn1,meso_tgn1,gsurf,re)\n",
" zhm14 = zhm28\n",
" # Net density at Alt\n",
" output['d']['N'] = dnet(output['d']['N'],dm14,zhm14,xmm,14)\n",
" # Correction to specified mixing ratio at ground \n",
" rl = np.log(b28*pdm[6,1]*np.abs(pdl[0,2])/b14)\n",
" hc14 = pdm[6,5]*pdl[0,1]\n",
" zc14 = pdm[6,4]*pdl[0,0]\n",
" output['d']['N'] = output['d']['N']*ccor(z,rl,hc14,zc14)\n",
" # Chemistry correction\n",
" hcc14 = pdm[6,7]*pdl[0,4]\n",
" zcc14 = pdm[6,6]*pdl[0,3]\n",
" rc14 = pdm[6,3]*pdl[0,5]\n",
" # Net density corrected at Alt\n",
" output['d']['N'] = output['d']['N']*ccor(z,rc14,hcc14,zcc14)\n",
" \n",
" # Anomalous OXYGEN DENSITY \n",
" tinf_tmp,varli = globe7(pd[8],inputp,flags)\n",
" g16h = flags['sw'][20]*tinf_tmp\n",
" db16h = pdm[7,0]*np.exp(g16h)*pd[8,0]\n",
" tho = pdm[7,9]*pdl[0,6]\n",
" dd,output['t']['TG'] = densu(z,db16h,tho,tho,16,alpha[8],output['t']['TG'],ptm[5],s, zn1,meso_tn1,meso_tgn1,gsurf,re)\n",
" zsht = pdm[7,5]\n",
" zmho = pdm[7,4]\n",
" zsho = scalh(zmho,16,tho,gsurf,re)\n",
" output['d']['ANM O'] = dd*np.exp(-zsht/zsho*(np.exp(-(z-zmho)/zsht)-1))\n",
"\n",
" # total mass density\n",
" output['d']['RHO'] = 1.66E-24*(4*output['d']['He']+16*output['d']['O']+28*output['d']['N2']\\\n",
" +32*output['d']['O2']+40*output['d']['AR']+ output['d']['H']+14*output['d']['N'])\n",
"\n",
"\n",
" # temperature \n",
" z = inputp['alt']\n",
" ddum,output['t']['TG'] = densu(z,1, tinf, tlb, 0, 0, output['t']['TG'], ptm[5], s, zn1, meso_tn1, meso_tgn1,gsurf,re)\n",
"\n",
" # convert to g/cm^3 \n",
" for key in output['d'].keys():\n",
" output['d'][key] = output['d'][key]*1.0E6\n",
" output['d']['RHO'] = output['d']['RHO']/1000 \n",
" return output,dm28,[meso_tn1,meso_tn2,meso_tn3,meso_tgn1,meso_tgn2,meso_tgn3],varli\n",
"\n",
"# ------------------------------------------------------------------- #\n",
"# ----------------- DOWNLOAD AND UPDATE SW DATA -------------------- #\n",
"# ------------------------------------------------------------------- #\n",
"\n",
"def update_sw(direc=None):\n",
" \n",
" if direc is None:\n",
" home = getenv('HOME')\n",
" direc = home + '/src/sw-data/'\n",
" \n",
" swfile = direc + 'SW-All.txt'\n",
" url = 'https://www.celestrak.com/SpaceData/SW-All.txt'\n",
" \n",
" if not path.exists(swfile):\n",
" print('Downloading the latest space weather data')\n",
" urlretrieve(url, swfile)\n",
" else:\n",
" modified_time = datetime.fromtimestamp(path.getmtime(swfile))\n",
" if datetime.now() > modified_time + timedelta(days=1):\n",
" remove(swfile)\n",
" print('Updating the space weather data',end=' ... ')\n",
" urlretrieve(url, swfile)\n",
" print('finished')\n",
" return swfile\n",
"\n",
"# ------------------------------------------------------------------- #\n",
"# ------------------------ READ SW DATA ----------------------------- #\n",
"# ------------------------------------------------------------------- #\n",
"\n",
"def read_sw(swfile):\n",
" # read the SPACE WEATHER DATA\n",
" sw_data = open(swfile,'r').readlines()\n",
" # read the SPACE WEATHER DATA\n",
" SW_OBS,SW_PRE = [],[]\n",
" flag1 = flag2 = 0\n",
" for line in sw_data:\n",
" if line.startswith('BEGIN OBSERVED'): \n",
" flag1 = 1\n",
" continue\n",
" if line.startswith('END OBSERVED'): flag1 = 0 \n",
" if flag1 == 1: \n",
" sw_p = line.split()\n",
" if len(sw_p) == 30:\n",
" del sw_p[24]\n",
" elif len(sw_p) == 31: \n",
" sw_p = np.delete(sw_p,[23,25]) \n",
" else: \n",
" sw_p = np.delete(sw_p,[23,24,25,27])\n",
" SW_OBS.append(sw_p)\n",
" \n",
" if line.startswith('BEGIN DAILY_PREDICTED'): \n",
" flag2 = 1\n",
" continue \n",
" if line.startswith('END DAILY_PREDICTED'): break \n",
" if flag2 == 1: SW_PRE.append(line.split()) \n",
" SW_OBS_PRE = np.vstack((np.array(SW_OBS),np.array(SW_PRE))) \n",
" # inverse sort\n",
" SW_OBS_PRE = np.flip(SW_OBS_PRE,0)\n",
" return SW_OBS_PRE\n",
"#---------------------------------------------------------- \n",
"def get_sw(SW_OBS_PRE,t_ymd,hour):\n",
" j = 0\n",
" for ymd in SW_OBS_PRE[:,:3]:\n",
" if np.array_equal(t_ymd,ymd): break\n",
" j+=1 \n",
" f107A,f107,ap = float(SW_OBS_PRE[j,27]),float(SW_OBS_PRE[j+1,26]),int(SW_OBS_PRE[j,22])\n",
" aph_tmp_b0 = SW_OBS_PRE[j,14:22] \n",
" i = int(np.floor_divide(hour,3))\n",
" ap_c = aph_tmp_b0[i]\n",
" aph_tmp_b1 = SW_OBS_PRE[j+1,14:22]\n",
" aph_tmp_b2 = SW_OBS_PRE[j+2,14:22]\n",
" aph_tmp_b3 = SW_OBS_PRE[j+3,14:22]\n",
" aph_tmp = np.hstack((aph_tmp_b3,aph_tmp_b2,aph_tmp_b1,aph_tmp_b0))[::-1].astype(np.float)\n",
" apc_index = 7-i\n",
" aph_c369 = aph_tmp[apc_index:apc_index+4]\n",
" aph_1233 = np.average(aph_tmp[apc_index+4:apc_index+12])\n",
" aph_3657 = np.average(aph_tmp[apc_index+12:apc_index+20])\n",
" aph = np.hstack((ap,aph_c369,aph_1233,aph_3657))\n",
" return f107A,f107,ap,aph\n",
"\n",
"# ------------------------------------------------------------------- #\n",
"# ------------------------------- OTHER ----------------------------- #\n",
"# ------------------------------------------------------------------- #\n",
"\n",
"def wraplon(lon):\n",
" if lon > 180:\n",
" lonwrap = lon - 360\n",
" else:\n",
" lonwrap = lon\n",
" return lonwrap \n",
"def hms2s(h,m,s):\n",
" return h*3.6E3 + m*60 + s\n",
"def hms2h(h,m,s):\n",
" return h + m/60 + s/3.6E3\n",
"\n",
"# ------------------------------------------------------------------- #\n",
"# ---------------------------- NRLMSISE00 --------------------------- #\n",
"# ------------------------------------------------------------------- #\n",
"\n",
"def nrlmsise00(t,lat,lon,alt,SW_OBS_PRE,o='Oxygen',s='NoAph'):\n",
" lon_wrap = wraplon(lon)\n",
" t_yday = t.yday.split(':')\n",
" t_ymd = t.iso.split()[0].split('-')\n",
" year,doy = int(t_yday[0]),int(t_yday[1])\n",
" sec = hms2s(int(t_yday[2]),int(t_yday[3]),float(t_yday[4]))\n",
" hour = hms2h(int(t_yday[2]),int(t_yday[3]),float(t_yday[4]))\n",
" lst = hour + lon/15\n",
" if alt > 80:\n",
" f107A,f107,ap,aph = get_sw(SW_OBS_PRE,t_ymd,hour)\n",
" else:\n",
" f107A,f107,ap,aph = 150,150,4,np.full(7,4)\n",
" inputp = {'doy':doy,'year':year,'sec':sec,'alt':alt,'g_lat':lat,'g_long':lon_wrap,'lst':lst,\\\n",
" 'f107A':f107A,'f107':f107,'ap':ap,'ap_a':aph}\n",
" \n",
" switches = np.ones(23)\n",
" if s is 'Aph':\n",
" switches[8] = -1 # -1 表示使用 3h 的地磁指数\n",
" \n",
" if o is 'Oxygen':\n",
" output = gtd7d(inputp,switches)\n",
" elif o is 'NoOxygen':\n",
" output = gtd7(inputp,switches)\n",
" else:\n",
" raise Exception(\"'{}' should be either 'Oxygen' or 'NoOxygen'\".format(o))\n",
" inputp['g_long'] = lon \n",
" return inputp,output "
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"The existing space weather data is already up to date\n"
]
}
],
"source": [
"from pyatmos.msise import download_sw,read_sw\n",
"from pyatmos.atmosclasses import Coordinate\n",
"\n",
"# Download or update the space weather file from www.celestrak.com\n",
"swfile = download_sw() \n",
"# Read the space weather data\n",
"sw_obs_pre = read_sw(swfile) "
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"# Set a specific time and location\n",
"t = '2015-10-05 03:00:00' # time(UTC)\n",
"lat,lon = 25,102 # latitude and longitude [degree]\n",
"alt = 70 # altitude [km]\n",
"\n",
"# Initialize a coordinate instance by a space-time point\n",
"st = Coordinate(t,lat,lon,alt)"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"ename": "FileNotFoundError",
"evalue": "[Errno 2] No such file or directory: '../data/nrlmsis00_data.npz'",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mFileNotFoundError\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m<ipython-input-3-89022222782d>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mpara_input\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mpara_output\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mst\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnrlmsise00\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msw_obs_pre\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mpara_input\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mpara_output\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m~/Downloads/ATMOS/pyatmos/atmosclasses/coordinate.py\u001b[0m in \u001b[0;36mnrlmsise00\u001b[0;34m(self, sw_obs_pre, omode, aphmode)\u001b[0m\n\u001b[1;32m 104\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0;34m'd'\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0;34m'He'\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;36m74934329990.0412\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'O'\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;36m71368139.39199762\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'N2'\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;36m104.72048033793158\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'O2'\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;36m0.09392848471935447\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'AR'\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;36m1.3231114543012155e-07\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'RHO'\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;36m8.914971667362366e-16\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'H'\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;36m207405192640.34592\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'N'\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;36m3785341.821909535\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'ANM O'\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;36m1794317839.638502\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m't'\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0;34m'TINF'\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;36m646.8157488121493\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'TG'\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;36m646.8157488108872\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 105\u001b[0m '''\n\u001b[0;32m--> 106\u001b[0;31m \u001b[0mpara_input\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mpara_output\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnrlmsise00\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mTime\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mt\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlat\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlon\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0malt\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0msw_obs_pre\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0momode\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0maphmode\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 107\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mpara_input\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mpara_output\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 108\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m~/Downloads/ATMOS/pyatmos/msise/nrlmsise00.py\u001b[0m in \u001b[0;36mnrlmsise00\u001b[0;34m(t, lat, lon, alt, SW_OBS_PRE, omode, aphmode)\u001b[0m\n\u001b[1;32m 1040\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1041\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0momode\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;34m'Oxygen'\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1042\u001b[0;31m \u001b[0moutput\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mgtd7d\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0minputp\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mswitches\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1043\u001b[0m \u001b[0;32melif\u001b[0m \u001b[0momode\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;34m'NoOxygen'\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1044\u001b[0m \u001b[0moutput\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mgtd7\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0minputp\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mswitches\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m~/Downloads/ATMOS/pyatmos/msise/nrlmsise00.py\u001b[0m in \u001b[0;36mgtd7d\u001b[0;34m(inputp, flags)\u001b[0m\n\u001b[1;32m 722\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 723\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mgtd7d\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0minputp\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mflags\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 724\u001b[0;31m \u001b[0moutput\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mgtd7\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0minputp\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mflags\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 725\u001b[0m output['d']['RHO'] = 1.66E-24 * (4 * output['d']['He'] + 16 * output['d']['O'] + 28 * output['d']['N2']\\\n\u001b[1;32m 726\u001b[0m + 32 * output['d']['O2'] + 40 * output['d']['AR'] + output['d']['H'] + 14 * output['d']['N'] + 16 * output['d']['ANM O'])\n",
"\u001b[0;32m~/Downloads/ATMOS/pyatmos/msise/nrlmsise00.py\u001b[0m in \u001b[0;36mgtd7\u001b[0;34m(inputp, switches)\u001b[0m\n\u001b[1;32m 626\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mflags\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'sw'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m==\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mxlat\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m45\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 627\u001b[0m \u001b[0mgsurf\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mre\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mglatf\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mxlat\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 628\u001b[0;31m \u001b[0mpt\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mpd\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mps\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mpdl\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mptm\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mpdm\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mptl\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mpma\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0msam\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mpavgm\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnrlmsis00_data\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 629\u001b[0m \u001b[0mxmm\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mpdm\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m4\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 630\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m~/Downloads/ATMOS/pyatmos/msise/nrlmsise00.py\u001b[0m in \u001b[0;36mnrlmsis00_data\u001b[0;34m()\u001b[0m\n\u001b[1;32m 79\u001b[0m \u001b[0mpavgm\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mfloat\u001b[0m \u001b[0marray\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0mMIDDLE\u001b[0m \u001b[0mATMOSPHERE\u001b[0m \u001b[0mAVERAGES\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 80\u001b[0m ''' \n\u001b[0;32m---> 81\u001b[0;31m \u001b[0mdata\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mload\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'../data/nrlmsis00_data.npz'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 82\u001b[0m \u001b[0mpt\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mpd\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mps\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mpdl\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'pt'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'pd'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'ps'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'pdl'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 83\u001b[0m \u001b[0mptm\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mpdm\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mptl\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mpma\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'ptm'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'pdm'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'ptl'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'pma'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m~/anaconda3/envs/py37/lib/python3.7/site-packages/numpy/lib/npyio.py\u001b[0m in \u001b[0;36mload\u001b[0;34m(file, mmap_mode, allow_pickle, fix_imports, encoding)\u001b[0m\n\u001b[1;32m 426\u001b[0m \u001b[0mown_fid\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mFalse\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 427\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 428\u001b[0;31m \u001b[0mfid\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mopen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mos_fspath\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfile\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"rb\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 429\u001b[0m \u001b[0mown_fid\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mTrue\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 430\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;31mFileNotFoundError\u001b[0m: [Errno 2] No such file or directory: '../data/nrlmsis00_data.npz'"
]
}
],
"source": [
"para_input,para_output = st.nrlmsise00(sw_obs_pre)\n",
"print(para_input)\n",
"print(para_output)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"t = '2019-08-20 23:10:59' \n",
"lat,lon,alt = 3,5,900 \n",
"st = Coordinate(t,lat,lon,alt)\n",
"para_input,para_output = st.nrlmsise00(sw_obs_pre,aphmode = 'Aph')\n",
"print(para_input)\n",
"print(para_output)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"纬度范围为(-9090经度范围为0360-180180高度单位km输出单位: /m^3,密度单位kg/m^3\n",
"温度单位K; 72.5km 以下O、H 、N、ANMO 均为零;空间天气数据每 12h 更新一次。"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"测试结果\n",
"无aph 2015-10-05 03:00:00 25 102 70 Oxygen\n",
"matlab 1027.318 219.965 8.2335e-05\n",
"matlab(areo): 1027.318 219.965 8.2335e-05\n",
"C: 1027.318 219.965 8.2335e-05\n",
"python: 1027.318 219.965 8.2335e-05\n",
"\n",
"无aph 2004-07-08 10:30:50 -65 -120 100 Oxygen\n",
"matlab: 1027.318 192.587 4.5846e-07\n",
"matlab(aero): 1027.318 192.587 4.5846e-07\n",
"C: 1027.318 192.587 4.5846e-07\n",
"python: 1027.318 192.587 4.5846e-07\n",
"\n",
"有aph 2019-08-20 23:10:59 3 5 900 Oxygen\n",
"matlab: 640.742 640.742 8.7480e-16 \n",
"matlab(aero): 640.741 640.741 8.7482e-16\n",
"C: 640.741 640.741 8.7482e-16\n",
"python: 640.741 640.741 8.7482e-16\n",
"\n",
"有aph 2010-02-15 12:18:37 85 170 500 NoOxygen\n",
"matlab: 774.172 774.171 1.2708e-13\n",
"matlab(areo): 774.168 774.166 1.2707e-13\n",
"C: 774.168 774.166 1.2707e-13\n",
"python: 774.168 774.166 1.2707e-13"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import msise00\n",
"from datetime import datetime\n",
"\n",
"atmos = msise00.run(time=datetime(2018, 5, 17, 21), altkm=300, glat=55, glon=120)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"atmos"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"from numpy.linalg import norm"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"norm?"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"st.nrlmsise00?"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.4"
}
},
"nbformat": 4,
"nbformat_minor": 2
}