diff --git a/.gitignore b/.gitignore index fff6f47..ca9ed71 100644 --- a/.gitignore +++ b/.gitignore @@ -13,13 +13,27 @@ *.grb1 *.grb2 dp-p[0-9]* + bin.block/example_modis_sst/* bin.block/example_reynolds_sst/* +bin.block/mk-blkfiles* +bin.block/CreateSSTblockfiles.sc +bin.block/run_test_sstfiles.sc + bin.dp.grib1/example_data/* +bin.dp.grib1/dgrib* +bin.dp.grib1/rams_wgrib + bin.dp.grib2/example_data/* -bin.revu/example_data/* bin.dp.grib2/wgrib* +bin.dp.grib2/dgrib* + +bin.revu/example_data/* +bin.revu/revu* + bin.rams/dprep.test/* +bin.rams/rams* +bin.rams/cleanup.sc # Ignore external libraries misc/* diff --git a/README.md b/README.md index 685eb7d..ab3a7b2 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,21 @@ # RAMS [![DOI](https://zenodo.org/badge/307815774.svg)](https://zenodo.org/badge/latestdoi/307815774) -RAMS model source code. To see full documentation, go to the [van den Heever group website](https://vandenheever.atmos.colostate.edu/vdhpage/rams/rams_docs.php). \ No newline at end of file +RAMS model source code. To see full documentation, go to the [van den Heever group website](https://vandenheever.atmos.colostate.edu/vdhpage/rams/rams_docs.php). + +In this fork, I have added BUGSRAD radiation as option 4 for ISWRTYP and ILWRTYP. A few notes about this implementation: + +o Only cloud droplets, pristine ice and snow are passed to the BUGSRAD radiation routines. This is ok for now as cloud droplets and ice crystals are the two most important hydrometeors for radiation + +o Cloud droplet mass and number are both passed. Only the sum of pristine ice and snow mass is passed. + +o No aerosol species are coupled to BUGSRAD radiation. + +o BUGSRAD contains separate albedo values for direct and diffuse radiation. I've set these to be equal. (see radiate/driver_read.f90, alndr, alndf, alvdr, alvdf) + +o BUGSRAD contains separate albedo values for shortwave and near IR. I've set these to be equal. (aln* - near IR, alv* - visible) + +o BUGSRAD has its own precision definitions (e.g. dbl_kind). They're still being used and aren't interfaced with the options to compile with double or single precision in the Makefile. + +I've also added RTE+RRTMGP radiation (https://agupubs.onlinelibrary.wiley.com/doi/10.1029/2019MS001621) as option 5 + diff --git a/bin.block/Makefile b/bin.block/Makefile new file mode 100755 index 0000000..97e7c8b --- /dev/null +++ b/bin.block/Makefile @@ -0,0 +1,74 @@ +#Makefile +############################################################################### +# Include definitions +############################################################################### +include ../include.mk +############################################################################### +# Compiler commands +############################################################################### +INCLUDES = $(UTILS_INCS) $(PAR_INCS) $(HDF5_INCS) +F_CD1 = $(F_COMP) -c $(F_OPTS1) $(INCLUDES) +F_CD2 = $(F_COMP) -c $(F_OPTS2) $(INCLUDES) +C_CD = $(C_COMP) -c $(C_OPTS) $(INCLUDES) $(PAR_DEFS) $(HDF5_DEFS) + +C_CM =$(C_CD) -D$(CMACH) $< && $(ARCH) $@ $( this limit, do not use to interpolate + ! + ! - Time extrapolate limit (TEL)- if past/future obs is greater than TIL, + ! but less than TEL, use the obs + + ODA_SFC_TIL=21600., + ODA_SFC_TEL=900., + ODA_UPA_TIL=43200., + ODA_UPA_TEL=21600., +!------------------------------------------------------------------------ + +! History start (if RUNTYPE='HISTORY') + + HFILIN = './output_nosed_norad_noevap_100/a-A-2008-04-26-190000-head.txt', + ! Input state file name + +! Analysis file input for assimilation: 1=yes, 0=no + + IPAST_SFC = 0, ! Initialize LEAF fields from history + +!------------------------------------------------------------------------ + ICLOBBER = 1, ! 0=stop if files exist, 1=overwrite files +!------------------------------------------------------------------------ + +! Analysis file output + + IOUTPUT = 1, ! 0-no files, 1-write files + AFILEPREF = './test.output/a', + ! File prefix for all analysis files + ! state,mean,lite,both + +!------------------------------------------------------------------------ + FRQSTATE = 600.,600.,3600.,1800., ! "state" file write frequency + ! can be different for each grid + ! works best if grids are multiples of each other + FRQST_KEEP = 0., ! If > 0., frequency at which "state" files will be + ! kept. Others will be written, but deleted on + ! the subsequent write. + ! Intended to be a mutiple of and >= FRQSTATE +!----------------------------------------------------------------------- + FRQLITE = 0., ! Frequency for "lite" files + ! = 0 : no lite files + NLITE_VARS=0, + + LITE_VARS= 'GLAT','GLON','TOPT','PATCH_AREA', !Keep these always + 'UP','VP','WP', !This would be useful for hi-frequency trajectories + +!----------------------------------------------------------------------- + AVGTIM = 0., ! Averaging time for analysis variables + ! must be abs(AVGTIM) <= FRQANL + ! > 0 : averaging is centered at FRQANL + ! < 0 : averaging ends at FRQANL + ! = 0 : no averaged files + FRQMEAN = 0., ! Frequency for "averaged" files + FRQBOTH = 0., ! Frequency for Both ("averaged"/"lite") files + +! Input topography variables + + TOPFILES = './test.output/toph', ! Path and prefix for topo files. + SFCFILES = './test.output/sfch', ! Path and prefix for surface files. + SSTFPFX = './test.output/ssth', ! Path and prefix for sst files + NDVIFPFX = './test.output/ndh', ! Path and prefix for ndni files + + ITOPTFLG = 2,0,0,0, ! 2 - Fill data in "leaf3_init" + ISSTFLG = 2,2,0,0, ! 0 - Interpolate from coarser grid + IVEGTFLG = 2,2,0,0, ! 1 - Read from standard Lat/Lon data file + ISOILFLG = 2,2,0,0, ! + NDVIFLG = 2,2,0,0, ! + + IUPDNDVI = 0, ! 0 - No update of NDVI values during run + IUPDSST = 0, ! 0 - No update of SST values during run + ! 1 - Update values during run + ! 2 - Update values during run from 0D FORCINGFILE (see below) + + ! The following only apply for IxxxxFLG=1 + ITOPTFN = '/home/smsaleeb/sfctypehdf5/DEM30s-h5/EL', + '/home/smsaleeb/sfctypehdf5/DEM30s-h5/EL', + '/home/smsaleeb/sfctypehdf5/DEM30s-h5/EL', + '/home/smsaleeb/sfctypehdf5/DEM30s-h5/EL', + ISSTFN = '/home/smsaleeb/sfctypehdf5/sst-h5/S', + '/home/smsaleeb/sfctypehdf5/sst-h5/S', + '/home/smsaleeb/sfctypehdf5/sst-h5/S', + '/home/smsaleeb/sfctypehdf5/sst-h5/S', + IVEGTFN = '/home/smsaleeb/sfctypehdf5/ogedata-h5/GE', + '/home/smsaleeb/sfctypehdf5/ogedata-h5/GE', + '/home/smsaleeb/sfctypehdf5/ogedata-h5/GE', + '/home/smsaleeb/sfctypehdf5/ogedata-h5/GE', + ISOILFN = '/home/smsaleeb/sfctypehdf5/FAOdata-h5/FAO', + '/home/smsaleeb/sfctypehdf5/FAOdata-h5/FAO', + '/home/smsaleeb/sfctypehdf5/FAOdata-h5/FAO', + '/home/smsaleeb/sfctypehdf5/FAOdata-h5/FAO', + NDVIFN = '/home/smsaleeb/sfctypehdf5/ndvi-h5/', + '/home/smsaleeb/sfctypehdf5/ndvi-h5/', + '/home/smsaleeb/sfctypehdf5/ndvi-h5/', + '/home/smsaleeb/sfctypehdf5/ndvi-h5/', + +! Topography scheme + + ITOPSFLG = 3,3,3,3, ! 0 = Average Orography + ! 1 = Silhouette Orography + ! 2 = Envelope Orography + ! 3 = Reflected Envelope Orography + + TOPTENH = 1.,1.,1.,1., ! For ITOPSFLG=1, Weighting of topo + ! silhouette averaging + ! For ITOPSFLG=2 or 3, Reflected Envelope + ! and Envelope Orography enhancement factor + + TOPTWVL = 4.,4.,4.,4., ! Topo wavelength cutoff in filter + +! Surface Roughness scheme + + IZ0FLG = 0,0,0,0, ! 0 = Use veg, bare soil and water surface + ! 1 = Also use subgrid scale topography + Z0MAX = 5.,5.,5.,5., ! Max zo for IZ0FLG=1 + Z0FACT = 0.005, ! Subgrid scale orograhic roughness factor + + $END + + $MODEL_OPTIONS + +! Numerical schemes + + ICORFLG = 0, ! Coriolis flag/2D v-component - 0=off, 1=on + + IUGFORCE = 1, ! Geostrophic wind forcing + ! 0=off + ! 1=on using input sounding winds. + ! 2=on using time-varying winds from FORCINGFILE + ! Turn on only if INITIAL = 1 or restarting from INITIAL = 1 run + ! Highly recommended if ICORFLG = 1 with INITIAL = 1 + FORCINGFILE = '', ! Forcing file for IUGFORCE = 2 and IUPDSST = 2 + ! Could easily modify source code to include other forcing datasets + + DIVLS = 0., ! Large-scale divergence rate for calculating imposed subsidence + + IBND = 2, ! Lateral boundary condition flags + JBND = 2, ! 1-Klemp/Wilhelmson, 2-cyclic + + ISPONGE_PTS = 0,5,5, ! Number of nested grid boundary sponge points + SPONGE_TAU = 0.,30.,30., ! Nested grid sponge zone time scale (seconds) + + CPHAS = 30., ! Phase speed if IBND or JBND = 1 + LSFLG = 0, ! Large-scale gradient flag for variables other than + ! normal velocity: + ! 0 = zero gradient inflow and outflow + ! 1 = zero gradient inflow, radiative b.c. outflow + ! 2 = constant inflow, radiative b.c. outflow + ! 3 = constant inflow and outflow + NFPT = 3, ! Rayleigh friction - number of points from the top + DISTIM = 60., ! - dissipation time scale + +! Radiation parameters + + ISWRTYP = 5, ! Shortwave radiation type + ILWRTYP = 5, ! Longwave radiation type + ! 0-none, 2-Mahrer/Pielke, 1-Chen, 3-Harrington + RADFRQ = 10., ! Freq. of radiation tendency update (s) + LONRAD = 0, ! Longitudinal variation of shortwave + ! (0-no, 1-yes) + +! Cumulus parameterization parameters + + NNQPARM = 0,0,0,0, ! Convective param flag (0-off, 1-Kuo, 2-Kain-Fritsch) + CONFRQ = 1200., ! Frequency of conv param. updates (s) + WCLDBS = .01, ! Vertical motion needed at cloud base for + ! to trigger convection (Kuo) + +! KPP mixed-layer single-column ocean model + + IKPP = 0, ! Ocean model (0-off, 1-on, 2-more diagnostics) + DMAXKPP = 500., ! Maximum ocean depth (meters) + NKPPZ = 48, ! Number of ocean layers (levels = layers+1) + DSCALEKPP = 3., ! Set exponential for stretched grid + FRQKPP = 120., ! Timestep of ocean model (sec) + RELAX_SST = 0., ! Timescale (days) for SST nudging + RELAX_OCNT = 20., ! Timescale (days) for ocean column temp nudging + RELAX_SAL = 20., ! Timescale (days) for ocean column salinity nudging + KPPITERMAX = 20, ! Max number of iterations allowed + KPPRNT = 0, ! Sample output print to screen: 0=no, 1=yes + UBMN_KPP = 3., ! UBMIN for KPP wind stress and LEAF-3 if using KPP + +! Surface layer and soil parameterization + + NPATCH = 2, ! Number of patches per grid cell (min=2) + + NVEGPAT = 1, ! Number of patches per grid cell to be + ! filled from + ! vegetation files + ! (min of 1, max of NPATCH-1) + + ISFCL = 0, ! Surface layer/soil/veg model + ! 0-specified surface layer gradients + ! 1-LEAF3 model, 2-SiB model + ! 3-specified fluxes, albedo, and surf. T + ! - fluxes specified with DTHCON and DRTCON + ! - albedo with ALBEDO, surface T with SEATMP + + IFREESLIP = 0, ! Freeslip BC: 0=NO, 1=YES + + ! Data file for SIB surface characteristics + SIBFILE = '../etc/SiB-Veg-Morphology.txt', + + ! CO2 vertical profile for SiB submodel initialization. [ppm] + CO2_INIT = 360., 360., 360., 355., 355., 355., 350., 350., 340., + + ISOILDAT = 0, ! Soil moisture and temperature initialization + ! 0 = homogeneous default, 1 = varfile ingest + SNUDCENT = 0., ! Soil moisture interior nudging time scale (sec) + ISNOWDAT = 0, ! Snow depth and mass initialization + ! 0 = homogeneous zero default, 1 = varfile ingest + + NVGCON = 2, ! Vegetation type (see below) + + ! 0 Ocean ! 11 Tundra + ! 1 Lakes, rivers, streams ! 12 Evergreen shrub + ! 2 Ice cap/glacier ! 13 Deciduous shrub + ! 3 Desert, bare soil ! 14 Mixed woodland + ! 4 Evergreen needleleaf tree ! 15 Crop/mixed farming, C3 grassland + ! 5 Deciduous needleleaf tree ! 16 Irrigated crop + ! 6 Deciduous broadleaf tree ! 17 Bog or marsh + ! 7 Evergreen broadleaf tree ! 18 Wooded grassland + ! 8 Short grass ! 19 Urban and built up + ! 9 Tall grass ! 20 Wetland evergreen broadleaf tree + ! 10 Semi-desert ! 21 Very urban + + PCTLCON = 1.0, ! Constant land % if for all domain + NSLCON = 11, ! Constant soil type if for all domain + + ! 1 -- sand 2 -- loamy sand 3 -- sandy loam + ! 4 -- silt loam 5 -- loam 6 -- sandy clay loam + ! 7 -- silty clay loam 8 -- clay loam 9 -- sandy clay + ! 10 -- silty clay 11 -- clay 12 -- peat + + ZTROUGH = .00015, ! Constant roughness if for all domain + ZMROUGH = .05, ! Constant momentum roughness if for all domain + ICHARNOCK = 1, ! Use Charnock ocean roughness for patch 1 + + ALBEDO = .5, ! Constant albedo if not running soil model + SEATMP = 267., ! Constant water surface temperature + + DTHCON = 0., ! Constant sfc layer temp grad for no soil + DRTCON = 0., ! Constant sfc layer moist grad for no soil + ! OR constant surface fluxes (W/m2) for ISFCL = 3 + + SLZ = -.3, -.25,-.20,-.16,-.12,-.09,-.06,-.03, + ! Soil grid levels + + SLMSTR = 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, + ! Initial soil moisture + + STGOFF = 5., 5., 3.5, 2., .5, -1.,-1.5,-1.8, + ! Initial soil temperature offset + ! from lowest atmospheric level +!-------------------------------------------------------------------------- + +!--------- Eddy diffusion coefficient parameters ----------------------- + + IDIFFK = 4,2,2,2, ! K flag: + ! 1 - Horiz deform/Vert Mellor-Yamada + ! 2 - Anisotropic deformormation + ! (horiz & vert differ) + ! 3 - Isotropic deformation + ! (horiz and vert same) + ! 4 - Deardorff TKE (horiz ...) + + IDIFFPERTS = 0, ! 0 - Normal scalar diffusion + ! 1 - Diffuse perturbations from base state THP,RTP + ! 2 - Diffuse perturbations from mean state THP,RTP + ! 3 - Diffuse perturbations from varfile state THP,RTP + + IHORGRAD = 1, ! 1 - horiz grad frm decomposed sigma grad + ! 2 - true horizontal gradient. + ! Non-conserving, but allows small DZ + CSX = .2,.2,.2,.2, ! Deformation horiz. K's coefficient + CSZ = .2,.2,.2,.2, ! Deformation vert. K's coefficient + XKHKM = 3.,3.,3.,3., ! Ratio of horiz K_h to K_m for deformation + ZKHKM = 3.,3.,3.,3., ! Ratio of vert K_h to K_m for deformation + AKMIN = 0.1,2.,1.5,1.5, ! Ratio of minimum horizontal eddy + ! viscosity coefficientto typical value + ! from deformation K + + FRACSAT = 0.99, ! Minimum saturation fraction in the presence + ! of cloud water for applying saturation + ! moist BV equation to diffusion stability + ! criteria. Value of 0.0 uses original formula + ! and only cloud water is required. +!------Bubble Simulation-------------------------------------------------- + IBUBBLE = 3, ! Bubble initialization: 0 = off + ! 1=square bubble, 2=gaussian bubble + ! 3=random perturbations (user adjust ruser.f90) + IBUBGRD = 1, ! Grid Number On Which To Initialize Bubble + IBDXIA = 5, ! DX start grid point + IBDXIZ = 13, ! DX end grid point + IBDYJA = 5, ! DY start grid point + IBDYJZ = 13, ! DY end grid point + IBDZK1 = 2, ! Lower k level + IBDZK2 = 16, ! Upper k level + BTHP = 3.0, ! Theta-il perturbation(K) (THP + BTHP) + BRTP = 0.2, ! Mixing ratio perturbation (RTP * (1 + BRTP) + +!------Convergence Forcing ----------------------------------------------- + ICONV = 0, ! Convergence Zone initialization: 0 = off + ! 1=Gaussian in x and y, U and V + ! 2=Gaussian in x and y, U only + ! 3=Gaussian in x and y, V only + ! 4=Gaussian only in x, U only + ! 5=Gaussian only in y, V only + ICONGR = 1, ! Grid for convergence + ICICENT = 100, ! I center grid point + ICJCENT = 100, ! J center grid point + CXRAD = 7000., ! I radius width (meters) + CYRAD = 7000., ! J radius width (meters) + ICVERT = 1, ! Convergence vertical structure + ! 1=Linear decrease w/height and max at sfc + ! 2=Elevated 1/2 vertical wavelength + ICKMAX = 14, ! Max K for ICVERT=1 (ignored for ICVERT=2) + CZRAD = 2000., ! Vertical radius for ICVERT=2 (ignored for ICVERT=1) + ICKCENT = 17, ! K center for ICVERT=2 (ignored for ICVERT=1) + CDIVMAX = -6.1224e-6, ! Divergence amplitude (s^-1) (negative = convergence) + CTAU = 1., ! timescale (s) over which conv. zone strength + ! increases to amplitude CDIVMAX + CTMAX = 3600., ! Max time in seconds for convergence zone + ! If ctmax < 0, abs(ctmax) vertical vel thresh past + ! which to terminate conv zone (m/s) + +!----- Non-standard lateral boundary forcing ----------------------------- + + IAEROLBC = 0,0,0, ! Aerosol profile forcing: 0=no, 1=yes + ICO2LBC = 0,0,0, ! CO2 profile forcing: 0=no, 1=yes + BCTAU = 1.,1.,1., ! (seconds) Inverse time weight + +!----- RCE (Radiative convective equilibrium) simulations Controls ------- + + IRCE = 0, ! NO RCE setup = 0, YES = 1 + RCE_SZEN = 50.5, ! Constant solar zenith angle (0.0 to 90.0 deg) + RCE_SOLC = 650.832, ! Solar constant + RCE_UBMN = 4.0, ! Constant ubmin value (0.1 to 7.0 m/s) + RCE_BUBL = 0.50, ! Max temperature perturbation (Kelvin) (IBUBBLE=3) + +!----- Extra Tracers and Scalars ----------------------------------------- + + ITRACER = 0, ! Integer number of tracers. Initialize in init_tracer + ITRACHIST = 0, ! Initialize tracers on history start and/or restart + +!----- Microphysics ------------------------------------------------------ + + LEVEL = 3, ! Moisture complexity level + ! (0=dry, 1=vapor only, 2=cloud only, + ! 3=full micro, 4=HUCM-SBM bin micro) + + ISCM = 0, ! Single-column output run (0=off,1=on) + ISCMX = 15, ! X grid point for SCM column output (Grid-1 only) + ISCMY = 21, ! Y grid point for SCM column output (Grid-1 only) + SCMTIME = 1800., ! Time for SCM output (seconds) + + ICHECKMIC = 1, ! Check Micro Negative & Nans: 0=Off,1=on + IMBUDGET = 2, ! Micro budgets: 0=Off,1=partial,2=all,3=all+dust + + IRIME = 1, ! Riming: 0-Bulk, 1-HybridBin + IPLAWS = 2, ! FallSpeed: 0-Original4.3 + ! 1-New (R.Carver,Mitchell96) + ! 2-New With Banded Plaws for sedimentation + ISEDIM = 1, ! Sedimentation: 0-RelDisp, 1-True Hybrid-Bin + + ICLOUD = 5, ! Microphysics flags + IDRIZ = 5, !------------------- + IRAIN = 5, ! 1 - diagnostic concen. + IPRIS = 5, ! 2 - specified mean diameter + ISNOW = 5, ! 3 - specified y-intercept + IAGGR = 5, ! 4 - specified concentration + IGRAUP = 5, ! 5 - prognostic concentration + IHAIL = 5, + +! Hydrometeor parameters ! Microphysics parameters + ! ----------------------- + CPARM = 200.e6, ! Characteristic diameter, # concentration + DPARM = .1e6, ! or y-intercept + RPARM = 1e-3, ! + PPARM = 0., ! Specify values for the given + SPARM = 200., ! microphysics flag where appropriate + APARM = 1e-3, ! + GPARM = 1e-3, ! Only used for "microphysics flags" 1-4 + HPARM = 3e-3, ! + +!Gamma shape pararmeters ! cld rain pris snow aggr graup hail driz + GNU = 4.,2.,2.,2.,2.,2.,2.,4., + +!HUCM parameters + !HUCM data file directory for LEVEL=4 microphysics + HUCMFILE = '../etc/HUCM-SBM', + NDTCOLL = 3, !Collision-coalescence called once + !every NDTCOLL time steps + +! Aerosol parameters ! See mic_init.f90 for setting profiles + ! ------------------------------------------ + IAEROSOL = 1, ! CCN,GCCN: 0=off, 1=userset + ISALT = 0, ! Sea Salt: 0=off, 1=userset, 2=saltmodel + IDUST = 0, ! Dust: 0=off, 1=userset 2=dustmodel + IABCARB = 0, ! Absorbing carbon: 0=off, 1=userset + + IDUSTLOFT = 0, ! 0 = idealized lofting + ! 1 = Ginoux(2001) erodible fraction data + + !Dust source file name (used if IDUST=2) + !For IDUSTLOFT=1,read DustErodeFrac-Ginoux2001.txt + DUSTFILE = '../etc/DustErodeFrac-Ginoux2001.txt', + + ICCNLEV = 0, ! Aerosol treatment level + ! 0 = no source or sink + ! 1 = nucleation + deposition sink + ! 2 = same as 1 + evaporation regeneration + + IIFN = 2, ! Ice Nuclei treatment level + ! 0 = no ice nuclei + ! 1 = Meyers formula (CIN_MAX) + ! 2 = DeMott(2010) (CIN_MAX) + ! 3 = DeMott(2010) (aerosols D>0.5 microns) + ! 4 = quasi-constant (CIN_MAX) + + IIFN_FORMULA = 2, ! DeMott IN Formulation if IIFN = 2 or 3 + ! 1 = DeMott(2010) (composite aerosol types) + ! 2 = DeMott(2014) (dust formula) + + IAERORAD = 0, ! Aerosol-Radiation Model: 0 = Off, 1 = On + + IAERODEP = 0, ! Aerosol wet and dry deposition + ! (track scavenged aerosols if iccnlev>=2) + ! 0 = Off, 1 = On + + ! Aerosol initial maximum concentrations + ! userset option. Default vertical profiles: + ! MAXNUMBER*exp(-zt(k)/7000.) + ! ------------------------------------------ + IAEROPRNT = 0, ! Print aerosol init profiles (0=no,1=yes) + IAEROHIST = 0, ! Re-initialize aerosols on hist restart:0,1 + CIN_MAX = .01, ! Ice Nuclei (#/mg) + ! Quasi-constant ice concentration (#/L) for IIFN = 4 + CCN1_MAX = 100., ! CCN-mode-1 (#/mg) + CCN2_MAX = 0., ! CCN-mode-2 (#/mg) + DUST1_MAX = 0., ! Small Dust Mode (#/mg) + DUST2_MAX = 0., ! Large Dust Mode (#/mg) + SALTF_MAX = 000., ! Film Sea Salt (#/mg) + SALTJ_MAX = 0., ! Jet Sea Salt (#/mg) + SALTS_MAX = 0.e-3, ! Spume Sea Salt (#/mg) + ABC1_MAX = 0., ! Absorbing carbon Mode-1 (#/mg) + ABC2_MAX = 0., ! Absorbing carbon Mode-2 (#/mg) + + ! Aerosol 9 categories soluble chemistry type: 1=(NH4)2S04, 2=NaCl + IAERO_CHEM = 1,1,1,1,2,2,2,1,1, + + ! Aerosol 9 categories solubility fraction: (0->1) + AERO_EPSILON = 0.5,0.95,0.05,0.05,1.00,1.00,1.00,0.20,0.20, + + ! Aerosol 9 categories initial median radius (meters) + AERO_MEDRAD = 0.04e-6,1.00e-6, !CCN,GCCN + 0.05e-6,0.50e-6, !Dust1,Dust2 + 0.10e-6,1.00e-6,6.00e-6, !SeaSalt: film,jet,spume + 0.05e-6,0.05e-6, !Absorbing carbon + 0.01e-6,1.00e-6, !Regenerated 1 & 2 default + + ! Aerosol tracking flags: 0=off, 1=on + ITRKEPSILON = 0, ! Tracking aerosol solubility for regeneration + ITRKDUST = 0, ! Tracking dust sub-species within hydrometeors + ITRKDUSTIFN = 0, ! Tracing dust that served as ice nuclei + + $END + + $MODEL_SOUND + +!----------------------------------- +! Sounding specification +!----------------------------------- + +! Flags for how sounding is specified + + IPSFLG = 1, ! Specifies what is in PS array + ! 0-pressure(mb) 1-heights(m) + ! PS(1)=sfc press(mb) + + ITSFLG = 2, ! Specifies what is in TS array + ! 0-temp(C) 1-temp(K) 2-pot. temp(K) + + IRTSFLG = 2, ! Specifies what is in RTS array + ! 0-dew pnt.(C) 1-dew pnt.(K) + ! 2-mix rat(g/kg) + ! 3-relative humidity in %, + ! 4-dew pnt depression(K) + + IUSFLG = 0, ! Specifies what is in US and VS arrays + ! 0-u,v component(m/s) + ! 1-umoms-direction, vmoms-speed + + IO3FLG = 0, ! Optional ozone profile + ! 0-ozone not provided + ! 1-ozone provided in ppb + + SOUND_FILE = 'SOUND_IN', ! Input sounding file name. Only used + ! if PS(1)=0. + + HS = 0., + + PS = 0,10,20,30,40,50,60,70,80, +90,100,110,120,130,140,150,160,170, +180,190,200,210,220,230,240,250,260, +270,280,290,300,310,320,330,340,350, +360,370,380,390,400,410,420,430,440, +450,460,470,480,490,500,510,520,530, +540,550,560,570,580,590,600,610,620, +630,640,650,660,670,680,690,700,710, +720,730,740,750,760,770,780,790,800, +810,820,830,840,850,860,870,880,890, +900,910,920,930,940,950,960,970,980, +990,1000,1010,1020,1030,1040,1050,1060,1070, +1080,1090,1100,1110,1120,1130,1140,1150,1160, +1170,1180,1190,1200,1210,1220,1230,1240,1250, +1260,1270,1280,1290,1300,1310,1320,1330,1340, +1350,1360,1370,1380,1390,1400,1410,1420,1430, +1440,1450,1460,1470,1480,1490,1500,1510,1520, + + TS = 263.4,263.44,263.48,263.52,263.56,263.6,263.64,263.68,263.72, +263.76,263.8,263.84,263.88,263.92,263.96,264,264.04,264.08, +264.12,264.16,264.2,264.24,264.28,264.32,264.36,264.4,264.44, +264.48,264.52,264.56,264.6,264.64,264.68,264.72,264.76,264.8, +264.84,264.88,264.92,264.96,265,265,265,265,265, +265,265,265,265,265,265,265,265,265, +265,265,265,265,265,265,265,265,265, +265,265,265,265,265,265,265,265,265, +265,265,265,265,265,265,265,265,265, +265,265,267.62,268.25,268.63,268.91,269.13,269.33,269.5, +269.65,269.79,269.92,270.04,270.15,270.26,270.36,270.45,270.54, +270.63,270.71,270.79,270.86,270.94,271.01,271.08,271.14,271.21, +271.27,271.33,271.39,271.45,271.51,271.56,271.62,271.67,271.72, +271.77,271.82,271.87,271.92,271.97,272.01,272.06,272.1,272.14, +272.19,272.23,272.27,272.31,272.35,272.39,272.43,272.47,272.51, +272.55,272.58,272.62,272.66,272.69,272.73,272.76,272.8,272.83, +272.87,272.9,272.93,272.96,273,273.03,273.06,273.09,273.12, + + RTS = 1.8,1.7925,1.785,1.7775,1.77,1.7625,1.755,1.7475,1.74, +1.7325,1.725,1.7175,1.71,1.7025,1.695,1.6875,1.68,1.6725, +1.665,1.6575,1.65,1.6425,1.635,1.6275,1.62,1.6125,1.605, +1.5975,1.59,1.5825,1.575,1.5675,1.56,1.5525,1.545,1.5375, +1.53,1.5225,1.515,1.5075,1.5,1.5,1.5,1.5,1.5, +1.5,1.5,1.5,1.5,1.5,1.5,1.5,1.5,1.5, +1.5,1.5,1.5,1.5,1.5,1.5,1.5,1.5,1.5, +1.5,1.5,1.5,1.5,1.5,1.5,1.5,1.5,1.5, +1.5,1.5,1.5,1.5,1.5,1.5,1.5,1.5,1.5, +1.5,1.5,1.2,1.2,1.2,1.2,1.2,1.2,1.2, +1.2,1.2,1.2,1.2,1.2,1.2,1.2,1.2,1.2, +1.2,1.2,1.2,1.2,1.2,1.2,1.2,1.2,1.2, +1.2,1.2,1.2,1.2,1.2,1.2,1.2,1.2,1.2, +1.2,1.2,1.2,1.2,1.2,1.2,1.2,1.2,1.2, +1.2,1.2,1.2,1.2,1.2,1.2,1.2,1.2,1.2, +1.2,1.2,1.2,1.2,1.2,1.2,1.2,1.2,1.2, +1.2,1.2,1.2,1.2,1.2,1.2,1.2,1.2,1.2, + + US = -7,-7,-7,-7,-7,-7,-7,-7,-7, +-7,-7,-7,-7,-7,-7,-7,-7,-7, +-7,-7,-7,-7,-7,-7,-7,-7,-7, +-7,-7,-7,-7,-7,-7,-7,-7,-7, +-7,-7,-7,-7,-7,-7,-7,-7,-7, +-7,-7,-7,-7,-7,-7,-7,-7,-7, +-7,-7,-7,-7,-7,-7,-7,-7,-7, +-7,-7,-7,-7,-7,-7,-7,-7,-7, +-7,-7,-7,-7,-7,-7,-7,-7,-7, +-7,-7,-7,-7,-7,-7,-7,-7,-7, +-7,-7,-7,-7,-7,-7,-7,-7,-7, +-7,-7,-7,-7,-7,-7,-7,-7,-7, +-7,-7,-7,-7,-7,-7,-7,-7,-7, +-7,-7,-7,-7,-7,-7,-7,-7,-7, +-7,-7,-7,-7,-7,-7,-7,-7,-7, +-7,-7,-7,-7,-7,-7,-7,-7,-7, +-7,-7,-7,-7,-7,-7,-7,-7,-7, + + VS = -2,-1.97,-1.94,-1.91,-1.88,-1.85,-1.82,-1.79,-1.76, +-1.73,-1.7,-1.67,-1.64,-1.61,-1.58,-1.55,-1.52,-1.49, +-1.46,-1.43,-1.4,-1.37,-1.34,-1.31,-1.28,-1.25,-1.22, +-1.19,-1.16,-1.13,-1.1,-1.07,-1.04,-1.01,-0.98,-0.95, +-0.92,-0.89,-0.86,-0.83,-0.8,-0.77,-0.74,-0.71,-0.68, +-0.65,-0.62,-0.59,-0.56,-0.53,-0.5,-0.47,-0.44,-0.41, +-0.38,-0.35,-0.32,-0.29,-0.26,-0.23,-0.2,-0.17,-0.14, +-0.11,-0.08,-0.05,-0.02,0.01,0.04,0.07,0.1,0.13, +0.16,0.19,0.22,0.25,0.28,0.31,0.34,0.37,0.4, +0.43,0.46,0.49,0.52,0.55,0.58,0.61,0.64,0.67, +0.7,0.73,0.76,0.79,0.82,0.85,0.88,0.91,0.94, +0.97,1,1.03,1.06,1.09,1.12,1.15,1.18,1.21, +1.24,1.27,1.3,1.33,1.36,1.39,1.42,1.45,1.48, +1.51,1.54,1.57,1.6,1.63,1.66,1.69,1.72,1.75, +1.78,1.81,1.84,1.87,1.9,1.93,1.96,1.99,2.02, +2.05,2.08,2.11,2.14,2.17,2.2,2.23,2.26,2.29, + + $END + + $ISAN_CONTROL + +!----------------------------------- +! Isentropic control +!----------------------------------- + + ISZSTAGE = 1, ! Main switches for isentropic-sigz + IVRSTAGE = 1, ! "varfile" processing + + ISAN_INC = 0600, ! ISAN processing increment (hhmm) + ! range controlled by TIMMAX, + ! IYEAR1,...,ITIME1 + + I1ST_FLG = 2, ! What to do if first guess file (IAPR) + ! should be used but does not exist. + ! 1=I know it may not be there, + ! skip this data time + ! 2=I screwed up, stop the run + + IUPA_FLG = 3, ! UPA-upper air, SFC-surface + ISFC_FLG = 3, ! What to do if other data files should be + ! uesed, but does not exist. + ! 1 = I know it may not be there, + ! skip this data time + ! 2 = I screwed up, stop the run + ! 3 = Try to continue processing anyway + +! Input data file prefixes + IDATAIN = 0, ! 1 = NARR, 0 = All Others for now + IAPR = './dp-p', ! Input press level dataset + IARAWI = ' ', ! Archived rawindsonde file name + IASRFCE = ' ', ! Archived surface obs file name + +! Header file name for history nudging files (only prefix is used) + VAR_HFILE = './a-A-', + +! File names and dispose flags + + VARPFX = './var', ! isan file names prefix + IOFLGISZ = 0, ! Isen-sigz file flag: 0 = no write, 1 = write + IOFLGVAR = 1, ! Var file flag: 0 = no write, 1 = write + + $END + + $ISAN_ISENTROPIC + +!----------------------------------- +! Isentropic and sigma-z processing +!----------------------------------- + +!----------------------------------- +! Specify isentropic levels +!----------------------------------- + + NISN = 43, ! Number of isentropic levels + LEVTH = 280,282,284,286,288,290,292,294,296,298,300,303,306,309,312, + 315,318,321,324,327,330,335,340,345,350,355,360,380,400,420, + 440,460,480,500,520,540,570,600,630,670,700,750,800, + +!----------------------------------- +! Analyzed grid information: +!----------------------------------- + + NIGRIDS = 4, ! Number of RAMS grids to analyze + + TOPSIGZ = 20000., ! Sigma-z coordinates to about this height + + HYBBOT = 4000., ! Bottom (m) of blended sigma-z/isentropic + ! layer in varfiles + HYBTOP = 6000., ! Top (m) of blended sigma-z/isentropic layr + + SFCINF = 1000., ! Vert influence of sfc observation analysis + + SIGZWT = 1., ! Weight for sigma-z data in varfile: + ! 0.= no sigz data, + ! 1.=full weight from surface to HYBBOT + + NFEEDVAR = 1, ! 1=feed back nested grid varfile, 0=don't + +!----------------------------------- +! Observation number limits: +!----------------------------------- + + MAXSTA = 150, ! maximum number of rawindsondes + ! (archived + special) + MAXSFC = 1000, ! maximum number of surface observations + + NOTSTA = 0, ! Number of stations to be excluded + NOTID = 'r76458', ! Station ID's to be excluded + ! Prefix with 'r' for rawindsonde, + ! 's' for surface + + USED_FILE = 'none', ! Filename prefix to output stations actually + ! used in the analysis + + IOBSWIN = 1800, ! Window (seconds) around analysis time. Obs + ! outside this window will not be used. + + STASEP = .1, ! Minimum sfc station separation in degrees. + ! Any surface obs within this distance + ! of another obs will be thrown out + ! unless it has less missing data, + ! in which case the other obs will be + ! thrown out. + + + IGRIDFL = 3, ! Grid flag=0 if no grid point, only obs + ! 1 if all grid point data and obs + ! 2 if partial grid point and obs + ! 3 if only grid data + ! 4 all data... fast + + + GRIDWT = .01,.01,.01,.01, ! Relative weight for the gridded press data + ! compared to the observational data in + ! the objective analysis + + + GOBSEP = 5., ! Grid-observation separation (degrees) + GOBRAD = 5., ! Grid-obs proximity radius (degrees) + + WVLNTH = 900.,900.,900.,900., ! Used in S. Barnes objective analysis. + ! Wavelength in km to be retained to the + ! RESPON % from the data to the upper air + ! grids. + SWVLNTH = 300.,300.,300.,300., ! Wavelength for surface objective analysis + + RESPON = .9,.9,.9,.9, ! Percentage of amplitude to be retained. + + $END + diff --git a/bin.rams/RAMSIN.supercell b/bin.rams/RAMSIN.testrunonly similarity index 89% rename from bin.rams/RAMSIN.supercell rename to bin.rams/RAMSIN.testrunonly index e47fab2..7dfaede 100644 --- a/bin.rams/RAMSIN.supercell +++ b/bin.rams/RAMSIN.testrunonly @@ -32,7 +32,7 @@ NNXP = 25,30, ! Number of x gridpoints NNYP = 35,50, ! Number of y gridpoints - NNZP = 40,40, ! Number of z gridpoints + NNZP = 60,40, ! Number of z gridpoints NZG = 11, ! Number of soil layers NZS = 1, ! Maximum number of snow layers @@ -44,9 +44,10 @@ IHTRAN = 0, ! 0-Cartesian, 1-Polar stereo DELTAX = 2000., ! X-Y grid spacing (meters) - DELTAZ = 100., ! Z grid spacing (set to 0. to use ZZ) - DZRAT = 1.10, ! Vertical grid stretch ratio - DZMAX = 1000., ! Maximum delta Z for vertical stretch + DELTAZ = 30., ! Z grid spacing (set to 0. to use ZZ) + DZRAT = 1.08, ! Vertical grid stretch ratio + ZDELAY = 0., ! Height at which to begin the stretching + DZMAX = 400., ! Maximum delta Z for vertical stretch ZZ = 0.0, ! Vertical levels if DELTAZ = 0 20.0, 46.0, 80.0, 120.0, 165.0, @@ -58,7 +59,7 @@ 10700., 11700., 12700., 13700., 14700., 15700., 16700., 17700., 18700., 19700., - DTLONG = 10., ! Coarse grid long timestep + DTLONG = 1., ! Coarse grid long timestep NACOUST = 5, ! Small timestep ratio ! Nest ratios between this grid and the next coarser grid. @@ -184,7 +185,7 @@ ! History start (if RUNTYPE='HISTORY') - HFILIN = './test.supercell/a-A-1991-04-26-213000-head.txt', + HFILIN = './testrun.output/a-A-1991-04-26-210006-head.txt', ! Input state file name ! Analysis file input for assimilation: 1=yes, 0=no @@ -198,12 +199,12 @@ ! Analysis file output IOUTPUT = 1, ! 0-no files, 1-write files - AFILEPREF = './test.supercell/a', + AFILEPREF = './testrun.output/a', ! File prefix for all analysis files ! state,mean,lite,both !------------------------------------------------------------------------ - FRQSTATE = 600.,600.,3600.,1800., ! "state" file write frequency + FRQSTATE = 60.,600.,3600.,1800., ! "state" file write frequency ! can be different for each grid ! works best if grids are multiples of each other FRQST_KEEP = 0., ! If > 0., frequency at which "state" files will be @@ -229,10 +230,10 @@ ! Input topography variables - TOPFILES = './test.supercell/toph', ! Path and prefix for topo files. - SFCFILES = './test.supercell/sfch', ! Path and prefix for surface files. - SSTFPFX = './test.supercell/ssth', ! Path and prefix for sst files - NDVIFPFX = './test.supercell/ndh', ! Path and prefix for ndni files + TOPFILES = './testrun.output/toph', ! Path and prefix for topo files. + SFCFILES = './testrun.output/sfch', ! Path and prefix for surface files. + SSTFPFX = './testrun.output/ssth', ! Path and prefix for sst files + NDVIFPFX = './testrun.output/ndh', ! Path and prefix for ndni files ITOPTFLG = 2,0,0,0, ! 2 - Fill data in "leaf3_init" ISSTFLG = 2,2,0,0, ! 0 - Interpolate from coarser grid @@ -242,11 +243,12 @@ IUPDNDVI = 0, ! 0 - No update of NDVI values during run IUPDSST = 0, ! 0 - No update of SST values during run - ! 1 - Update values during run + ! 1 - Update values during run from 2D files + ! 2 - Update values during run from 0D FORCINGFILE (see below) ! The following only apply for IxxxxFLG=1 - ITOPTFN = '../../sfctypehdf5/DEM30s-h5/EL', - '../../sfctypehdf5/DEM30s-h5/EL', + ITOPTFN = '../../sfctypehdf5/gmted2010-h5/TM', + '../../sfctypehdf5/gmted2010-h5/TM', ISSTFN = '../../sfctypehdf5/sst-h5/S', '../../sfctypehdf5/sst-h5/S', IVEGTFN = '../../sfctypehdf5/ogedata-h5/GE', @@ -285,9 +287,23 @@ ICORFLG = 1, ! Coriolis flag/2D v-component - 0=off, 1=on + IUGFORCE = 1, ! Geostrophic wind forcing + ! 0=off + ! 1=on using input sounding winds. + ! 2=on using time-varying winds from FORCINGFILE + ! Turn on only if INITIAL = 1 or restarting from INITIAL = 1 run + ! Highly recommended if ICORFLG = 1 with INITIAL = 1 + FORCINGFILE = '', ! Forcing file for IUGFORCE = 2 and IUPDSST = 2 + ! Could easily modify source code to include other forcing datasets + + DIVLS = 0., ! Large-scale divergence rate for calculating imposed subsidence + IBND = 1, ! Lateral boundary condition flags JBND = 1, ! 1-Klemp/Wilhelmson, 2-cyclic + ISPONGE_PTS = 0,5,5, ! Number of nested grid boundary sponge points + SPONGE_TAU = 0.,30.,30., ! Nested grid sponge zone time scale (seconds) + CPHAS = 30., ! Phase speed if IBND or JBND = 1 LSFLG = 1, ! Large-scale gradient flag for variables other than ! normal velocity: @@ -300,10 +316,10 @@ ! Radiation parameters - ISWRTYP = 3, ! Shortwave radiation type - ILWRTYP = 3, ! Longwave radiation type + ISWRTYP = 4, ! Shortwave radiation type + ILWRTYP = 4, ! Longwave radiation type ! 0-none, 2-Mahrer/Pielke, 1-Chen, 3-Harrington - RADFRQ = 600., ! Freq. of radiation tendency update (s) + RADFRQ = 60., ! Freq. of radiation tendency update (s) LONRAD = 1, ! Longitudinal variation of shortwave ! (0-no, 1-yes) @@ -316,7 +332,7 @@ ! KPP mixed-layer single-column ocean model - IKPP = 1, ! Ocean model (0-off, 1-on, 2-more diagnostics) + IKPP = 0, ! Ocean model (0-off, 1-on, 2-more diagnostics) DMAXKPP = 500., ! Maximum ocean depth (meters) NKPPZ = 48, ! Number of ocean layers (levels = layers+1) DSCALEKPP = 3., ! Set exponential for stretched grid @@ -337,9 +353,12 @@ ! vegetation files ! (min of 1, max of NPATCH-1) - ISFCL = 1, ! Surface layer/soil/veg model + ISFCL = 3, ! Surface layer/soil/veg model ! 0-specified surface layer gradients ! 1-LEAF3 model, 2-SiB model + ! 3-specified fluxes, albedo, and surf. T + ! - fluxes specified with DTHCON and DRTCON + ! - albedo with ALBEDO, surface T with SEATMP IFREESLIP = 0, ! Freeslip BC: 0=NO, 1=YES @@ -369,7 +388,7 @@ ! 9 Tall grass ! 20 Wetland evergreen broadleaf tree ! 10 Semi-desert ! 21 Very urban - PCTLCON = 0.7, ! Constant land % if for all domain + PCTLCON = 1.0, ! Constant land % if for all domain NSLCON = 6, ! Constant soil type if for all domain ! 1 -- sand 2 -- loamy sand 3 -- sandy loam @@ -377,12 +396,16 @@ ! 7 -- silty clay loam 8 -- clay loam 9 -- sandy clay ! 10 -- silty clay 11 -- clay 12 -- peat - ZROUGH = .05, ! Constant roughness if for all domain + ZTROUGH = .05, ! Constant scalar roughness if for all domain + ZMROUGH = .05, ! Constant momentum roughness if for all domain + ICHARNOCK = 1, ! Use Charnock ocean roughness for patch 1 + ALBEDO = .2, ! Constant albedo if not running soil model SEATMP = 300., ! Constant water surface temperature - DTHCON = 0., ! Constant sfc layer temp grad for no soil - DRTCON = 0., ! Constant sfc layer moist grad for no soil + DTHCON = 10., ! Constant sfc layer temp grad for no soil + DRTCON = 10., ! Constant sfc layer moist grad for no soil + ! OR constant surface fluxes (W/m2) for ISFCL = 3 SLZ = -.50,-.40,-.30,-.25,-.20,-.16,-.12,-.09,-.06,-.03,-.01, ! Soil grid levels @@ -437,7 +460,7 @@ IBDYJA = 5, ! DY start grid point IBDYJZ = 13, ! DY end grid point IBDZK1 = 2, ! Lower k level - IBDZK2 = 16, ! Upper k level + IBDZK2 = 10, ! Upper k level BTHP = 3.0, ! Theta-il perturbation(K) (THP + BTHP) BRTP = 0.2, ! Mixing ratio perturbation (RTP * (1 + BRTP) @@ -536,10 +559,10 @@ ! Aerosol parameters ! See mic_init.f90 for setting profiles ! ------------------------------------------ - IAEROSOL = 1, ! CCN,GCCN: 0=off, 1=userset + IAEROSOL = 1, ! CCN-1,CCN-2: 0=off, 1=userset ISALT = 1, ! Sea Salt: 0=off, 1=userset, 2=saltmodel IDUST = 1, ! Dust: 0=off, 1=userset 2=dustmodel - IABCARB = 0, ! Absorbing carbon: 0=off, 1=userset + IABCARB = 1, ! Absorbing carbon: 0=off, 1=userset IDUSTLOFT = 0, ! 0 = idealized lofting ! 1 = Ginoux(2001) erodible fraction data @@ -558,14 +581,15 @@ ! 1 = Meyers formula (CIN_MAX) ! 2 = DeMott(2010) (CIN_MAX) ! 3 = DeMott(2010) (aerosols D>0.5 microns) + ! 4 = quasi-constant (CIN_MAX) IIFN_FORMULA = 2, ! DeMott IN Formulation if IIFN = 2 or 3 ! 1 = DeMott(2010) (composite aerosol types) ! 2 = DeMott(2014) (dust formula) - IAERORAD = 1, ! Aerosol-Radiation Model: 0 = Off, 1 = On + IAERORAD = 0, ! Aerosol-Radiation Model: 0 = Off, 1 = On - IAERODEP = 1, ! Aerosol wet and dry deposition + IAERODEP = 0, ! Aerosol wet and dry deposition ! (track scavenged aerosols if iccnlev>=2) ! 0 = Off, 1 = On @@ -575,16 +599,17 @@ ! ------------------------------------------ IAEROPRNT = 1, ! Print aerosol init profiles (0=no,1=yes) IAEROHIST = 0, ! Re-initialize aerosols on hist restart:0,1 - CIN_MAX = 0.01, ! Ice Nuclei (#/mg) - CCN_MAX = 1000., ! CCN (#/mg) - GCCN_MAX = 0.01, ! Giant-CCN (#/mg) + CIN_MAX = 0.01, ! Ice Nuclei (#/mg) for IIFN = 1-3 + ! Quasi-constant ice concentration (#/L) for IIFN = 4 + CCN1_MAX = 1000., ! CCN-mode-1 (#/mg) + CCN2_MAX = 0.01, ! CCN-mode-2 (#/mg) DUST1_MAX = 100., ! Small Dust Mode (#/mg) DUST2_MAX = 10., ! Large Dust Mode (#/mg) SALTF_MAX = 100., ! Film Sea Salt (#/mg) SALTJ_MAX = 0.1, ! Jet Sea Salt (#/mg) SALTS_MAX = 1.e-3, ! Spume Sea Salt (#/mg) - ABC1_MAX = 0., ! Absorbing carbon Mode-1 (#/mg) - ABC2_MAX = 0., ! Absorbing carbon Mode-2 (#/mg) + ABC1_MAX = 10., ! Absorbing carbon Mode-1 (#/mg) + ABC2_MAX = 100., ! Absorbing carbon Mode-2 (#/mg) ! Aerosol 9 categories soluble chemistry type: 1=(NH4)2S04, 2=NaCl IAERO_CHEM = 1,1,1,1,2,2,2,1,1,1,1, @@ -593,7 +618,7 @@ AERO_EPSILON = 0.90,0.90,0.05,0.05,1.00,1.00,1.00,0.05,0.05,0.20,0.20, ! Aerosol 9 categories initial median radius (meters) - AERO_MEDRAD = 0.04e-6,3.00e-6, !CCN,GCCN + AERO_MEDRAD = 0.04e-6,3.00e-6, !CCN-1,CCN-2 0.05e-6,0.50e-6, !Dust1,Dust2 0.10e-6,1.00e-6,6.00e-6, !SeaSalt: film,jet,spume 0.05e-6,0.05e-6, !Absorbing carbon @@ -630,7 +655,13 @@ IUSFLG = 0, ! Specifies what is in US and VS arrays ! 0-u,v component(m/s) ! 1-umoms-direction, vmoms-speed + + IO3FLG = 0, ! Optional ozone profile + ! 0-ozone not provided + ! 1-ozone provided in ppb + SOUND_FILE = 'SOUND_IN', ! Input sounding file name. Only used + ! if PS(1)=0. HS = 0., PS= 990.00,100.00,210.00,331.00,464.10,610.51,771.56,948.72, @@ -662,6 +693,8 @@ 13.72,13.62,13.83,14.26,15.47,16.03,18.87,19.09,18.60,18.91, 19.98,21.18,21.62,21.84,22.34,22.70,22.74,19.84,18.16,16.17, 11.90,8.50,3.47,3.50,3.53, + + O3S= 0., $END diff --git a/bin.rams/REVUIN.supercell b/bin.rams/REVUIN.testrunonly similarity index 100% rename from bin.rams/REVUIN.supercell rename to bin.rams/REVUIN.testrunonly diff --git a/bin.rams/SOUND_IN b/bin.rams/SOUND_IN new file mode 100644 index 0000000..e50f225 --- /dev/null +++ b/bin.rams/SOUND_IN @@ -0,0 +1,16 @@ +1000,273.15,2.73869211544269,0,0,1 +100,273.15,2.73869211544269,0,0,1 +200,273.15,2.73869211544269,0,0,1 +300,273.15,2.73869211544269,0,0,1 +400,273.15,2.73869211544269,0,0,1 +500,273.15,2.73869211544269,0,0,1 +600,273.15,2.73869211544269,0,0,1 +700,273.15,2.48604937131375,0,0,1 +800,279.15,2.720719850115,0,0,1 +900,279.65,2.12286305229357,0,0,1 +1000,280.15,1.75383871942153,0,0,1 +1100,280.65,1.51998055456462,0,0,1 +1200,281.15,1.36587776928743,0,0,1 +1300,281.65,1.25879095566787,0,0,1 +1400,282.15,1.17940430180998,0,0,1 +1500,282.65,1.1163426598243,0,0,1 diff --git a/bin.rams/cleanup.sc b/bin.rams/cleanup.sc new file mode 100755 index 0000000..b3018bf --- /dev/null +++ b/bin.rams/cleanup.sc @@ -0,0 +1,3 @@ +#!/bin/bash +rm -f *.mod rams rams*.a +rm -fr testrun.output diff --git a/bin.rams/machs b/bin.rams/machs new file mode 100644 index 0000000..a762292 --- /dev/null +++ b/bin.rams/machs @@ -0,0 +1 @@ +floyd diff --git a/bin.rams/machs.master b/bin.rams/machs.master index 79e7de4..e237f51 100755 --- a/bin.rams/machs.master +++ b/bin.rams/machs.master @@ -9,28 +9,8 @@ #SINGLE MACHINE #`hostname` -#Using "ccn" cluster with MPICH -#node01:1 -#node02:8 -#node03:8 -#node04:8 -#node05:8 -#node06:8 -#node07:8 -#node08:8 - -#Using "ccn" cluster with openMPI -#node01 slots=1 -#node02 slots=8 -#node03 slots=8 -#node04 slots=8 -#node05 slots=8 -#node06 slots=8 -#node07 slots=8 -#node08 slots=8 - #Using "frost" cluster with MPICH -#frost:1 +#frost:16 #frost1:16 #frost2:16 #frost3:16 @@ -40,12 +20,18 @@ #frost7:16 #frost8:16 -#Using "ice" cluster (infiniband) MPICH -#icehome_ib:8 -#ice1_ib:12 -#ice2_ib:12 -#ice3_ib:12 -#ice4_ib:12 +#Using "ice" cluster +#ice:8 +#ice1:12 +#ice2:12 +#ice3:12 +#ice4:12 + +#Using "snow" cluster +#snow:1 +#snowfall1:64 +#snowfall2:64 +#snowfall3:64 #Ciracluster (head node is cm00, but do not include that in list) #cc00:12 diff --git a/bin.rams/netcdf.inc b/bin.rams/netcdf.inc new file mode 100644 index 0000000..7b0c353 --- /dev/null +++ b/bin.rams/netcdf.inc @@ -0,0 +1,1836 @@ +! NetCDF-3. +! +! netcdf version 3 fortran interface: +! + +! +! external netcdf data types: +! + integer nf_byte + integer nf_int1 + integer nf_char + integer nf_short + integer nf_int2 + integer nf_int + integer nf_float + integer nf_real + integer nf_double + integer nf_ubyte + integer nf_ushort + integer nf_uint + integer nf_int64 + integer nf_uint64 + + parameter (nf_byte = 1) + parameter (nf_int1 = nf_byte) + parameter (nf_char = 2) + parameter (nf_short = 3) + parameter (nf_int2 = nf_short) + parameter (nf_int = 4) + parameter (nf_float = 5) + parameter (nf_real = nf_float) + parameter (nf_double = 6) + parameter (nf_ubyte = 7) + parameter (nf_ushort = 8) + parameter (nf_uint = 9) + parameter (nf_int64 = 10) + parameter (nf_uint64 = 11) + +! +! default fill values: +! + integer nf_fill_byte + integer nf_fill_int1 + integer nf_fill_char + integer nf_fill_short + integer nf_fill_int2 + integer nf_fill_int + real nf_fill_float + real nf_fill_real + doubleprecision nf_fill_double + + parameter (nf_fill_byte = -127) + parameter (nf_fill_int1 = nf_fill_byte) + parameter (nf_fill_char = 0) + parameter (nf_fill_short = -32767) + parameter (nf_fill_int2 = nf_fill_short) + parameter (nf_fill_int = -2147483647) + parameter (nf_fill_float = 9.9692099683868690e+36) + parameter (nf_fill_real = nf_fill_float) + parameter (nf_fill_double = 9.9692099683868690d+36) + +! +! mode flags for opening and creating a netcdf dataset: +! + integer nf_nowrite + integer nf_write + integer nf_clobber + integer nf_noclobber + integer nf_fill + integer nf_nofill + integer nf_lock + integer nf_share + integer nf_64bit_offset + integer nf_64bit_data + integer nf_cdf5 + integer nf_sizehint_default + integer nf_align_chunk + integer nf_format_classic + integer nf_format_64bit + integer nf_format_64bit_offset + integer nf_format_64bit_data + integer nf_format_cdf5 + integer nf_diskless + integer nf_mmap + + parameter (nf_nowrite = 0) + parameter (nf_write = 1) + parameter (nf_clobber = 0) + parameter (nf_noclobber = 4) + parameter (nf_fill = 0) + parameter (nf_nofill = 256) + parameter (nf_lock = 1024) + parameter (nf_share = 2048) + parameter (nf_64bit_offset = 512) + parameter (nf_64bit_data = 32) + parameter (nf_cdf5 = nf_64bit_data) + parameter (nf_sizehint_default = 0) + parameter (nf_align_chunk = -1) + parameter (nf_format_classic = 1) + parameter (nf_format_64bit = 2) + parameter (nf_format_64bit_offset = nf_format_64bit) + parameter (nf_format_64bit_data = 5) + parameter (nf_format_cdf5 = nf_format_64bit_data) + parameter (nf_diskless = 8) + parameter (nf_mmap = 16) + +! +! size argument for defining an unlimited dimension: +! + integer nf_unlimited + parameter (nf_unlimited = 0) + +! +! global attribute id: +! + integer nf_global + parameter (nf_global = 0) + +! +! implementation limits: +! + integer nf_max_dims + integer nf_max_attrs + integer nf_max_vars + integer nf_max_name + integer nf_max_var_dims + + parameter (nf_max_dims = 1024) + parameter (nf_max_attrs = 8192) + parameter (nf_max_vars = 8192) + parameter (nf_max_name = 256) + parameter (nf_max_var_dims = nf_max_dims) + +! +! error codes: +! + integer nf_noerr + integer nf_ebadid + integer nf_eexist + integer nf_einval + integer nf_eperm + integer nf_enotindefine + integer nf_eindefine + integer nf_einvalcoords + integer nf_emaxdims + integer nf_enameinuse + integer nf_enotatt + integer nf_emaxatts + integer nf_ebadtype + integer nf_ebaddim + integer nf_eunlimpos + integer nf_emaxvars + integer nf_enotvar + integer nf_eglobal + integer nf_enotnc + integer nf_ests + integer nf_emaxname + integer nf_eunlimit + integer nf_enorecvars + integer nf_echar + integer nf_eedge + integer nf_estride + integer nf_ebadname + integer nf_erange + integer nf_enomem + integer nf_evarsize + integer nf_edimsize + integer nf_etrunc + + parameter (nf_noerr = 0) + parameter (nf_ebadid = -33) + parameter (nf_eexist = -35) + parameter (nf_einval = -36) + parameter (nf_eperm = -37) + parameter (nf_enotindefine = -38) + parameter (nf_eindefine = -39) + parameter (nf_einvalcoords = -40) + parameter (nf_emaxdims = -41) + parameter (nf_enameinuse = -42) + parameter (nf_enotatt = -43) + parameter (nf_emaxatts = -44) + parameter (nf_ebadtype = -45) + parameter (nf_ebaddim = -46) + parameter (nf_eunlimpos = -47) + parameter (nf_emaxvars = -48) + parameter (nf_enotvar = -49) + parameter (nf_eglobal = -50) + parameter (nf_enotnc = -51) + parameter (nf_ests = -52) + parameter (nf_emaxname = -53) + parameter (nf_eunlimit = -54) + parameter (nf_enorecvars = -55) + parameter (nf_echar = -56) + parameter (nf_eedge = -57) + parameter (nf_estride = -58) + parameter (nf_ebadname = -59) + parameter (nf_erange = -60) + parameter (nf_enomem = -61) + parameter (nf_evarsize = -62) + parameter (nf_edimsize = -63) + parameter (nf_etrunc = -64) +! +! error handling modes: +! + integer nf_fatal + integer nf_verbose + + parameter (nf_fatal = 1) + parameter (nf_verbose = 2) + +! +! miscellaneous routines: +! + character*80 nf_inq_libvers + external nf_inq_libvers + + character*80 nf_strerror +! (integer ncerr) + external nf_strerror + + logical nf_issyserr +! (integer ncerr) + external nf_issyserr + +! +! control routines: +! + integer nf_inq_base_pe +! (integer ncid, +! integer pe) + external nf_inq_base_pe + + integer nf_set_base_pe +! (integer ncid, +! integer pe) + external nf_set_base_pe + + integer nf_create +! (character*(*) path, +! integer cmode, +! integer ncid) + external nf_create + + integer nf__create +! (character*(*) path, +! integer cmode, +! integer initialsz, +! integer chunksizehint, +! integer ncid) + external nf__create + + integer nf__create_mp +! (character*(*) path, +! integer cmode, +! integer initialsz, +! integer basepe, +! integer chunksizehint, +! integer ncid) + external nf__create_mp + + integer nf_open +! (character*(*) path, +! integer mode, +! integer ncid) + external nf_open + + integer nf__open +! (character*(*) path, +! integer mode, +! integer chunksizehint, +! integer ncid) + external nf__open + + integer nf__open_mp +! (character*(*) path, +! integer mode, +! integer basepe, +! integer chunksizehint, +! integer ncid) + external nf__open_mp + + integer nf_set_fill +! (integer ncid, +! integer fillmode, +! integer old_mode) + external nf_set_fill + + integer nf_set_default_format +! (integer format, +! integer old_format) + external nf_set_default_format + + integer nf_redef +! (integer ncid) + external nf_redef + + integer nf_enddef +! (integer ncid) + external nf_enddef + + integer nf__enddef +! (integer ncid, +! integer h_minfree, +! integer v_align, +! integer v_minfree, +! integer r_align) + external nf__enddef + + integer nf_sync +! (integer ncid) + external nf_sync + + integer nf_abort +! (integer ncid) + external nf_abort + + integer nf_close +! (integer ncid) + external nf_close + + integer nf_delete +! (character*(*) ncid) + external nf_delete + +! +! general inquiry routines: +! + + integer nf_inq +! (integer ncid, +! integer ndims, +! integer nvars, +! integer ngatts, +! integer unlimdimid) + external nf_inq + +! new inquire path + + integer nf_inq_path + external nf_inq_path + + integer nf_inq_ndims +! (integer ncid, +! integer ndims) + external nf_inq_ndims + + integer nf_inq_nvars +! (integer ncid, +! integer nvars) + external nf_inq_nvars + + integer nf_inq_natts +! (integer ncid, +! integer ngatts) + external nf_inq_natts + + integer nf_inq_unlimdim +! (integer ncid, +! integer unlimdimid) + external nf_inq_unlimdim + + integer nf_inq_format +! (integer ncid, +! integer format) + external nf_inq_format + +! +! dimension routines: +! + + integer nf_def_dim +! (integer ncid, +! character(*) name, +! integer len, +! integer dimid) + external nf_def_dim + + integer nf_inq_dimid +! (integer ncid, +! character(*) name, +! integer dimid) + external nf_inq_dimid + + integer nf_inq_dim +! (integer ncid, +! integer dimid, +! character(*) name, +! integer len) + external nf_inq_dim + + integer nf_inq_dimname +! (integer ncid, +! integer dimid, +! character(*) name) + external nf_inq_dimname + + integer nf_inq_dimlen +! (integer ncid, +! integer dimid, +! integer len) + external nf_inq_dimlen + + integer nf_rename_dim +! (integer ncid, +! integer dimid, +! character(*) name) + external nf_rename_dim + +! +! general attribute routines: +! + + integer nf_inq_att +! (integer ncid, +! integer varid, +! character(*) name, +! integer xtype, +! integer len) + external nf_inq_att + + integer nf_inq_attid +! (integer ncid, +! integer varid, +! character(*) name, +! integer attnum) + external nf_inq_attid + + integer nf_inq_atttype +! (integer ncid, +! integer varid, +! character(*) name, +! integer xtype) + external nf_inq_atttype + + integer nf_inq_attlen +! (integer ncid, +! integer varid, +! character(*) name, +! integer len) + external nf_inq_attlen + + integer nf_inq_attname +! (integer ncid, +! integer varid, +! integer attnum, +! character(*) name) + external nf_inq_attname + + integer nf_copy_att +! (integer ncid_in, +! integer varid_in, +! character(*) name, +! integer ncid_out, +! integer varid_out) + external nf_copy_att + + integer nf_rename_att +! (integer ncid, +! integer varid, +! character(*) curname, +! character(*) newname) + external nf_rename_att + + integer nf_del_att +! (integer ncid, +! integer varid, +! character(*) name) + external nf_del_att + +! +! attribute put/get routines: +! + + integer nf_put_att_text +! (integer ncid, +! integer varid, +! character(*) name, +! integer len, +! character(*) text) + external nf_put_att_text + + integer nf_get_att_text +! (integer ncid, +! integer varid, +! character(*) name, +! character(*) text) + external nf_get_att_text + + integer nf_put_att_int1 +! (integer ncid, +! integer varid, +! character(*) name, +! integer xtype, +! integer len, +! nf_int1_t i1vals(1)) + external nf_put_att_int1 + + integer nf_get_att_int1 +! (integer ncid, +! integer varid, +! character(*) name, +! nf_int1_t i1vals(1)) + external nf_get_att_int1 + + integer nf_put_att_int2 +! (integer ncid, +! integer varid, +! character(*) name, +! integer xtype, +! integer len, +! nf_int2_t i2vals(1)) + external nf_put_att_int2 + + integer nf_get_att_int2 +! (integer ncid, +! integer varid, +! character(*) name, +! nf_int2_t i2vals(1)) + external nf_get_att_int2 + + integer nf_put_att_int +! (integer ncid, +! integer varid, +! character(*) name, +! integer xtype, +! integer len, +! integer ivals(1)) + external nf_put_att_int + + integer nf_get_att_int +! (integer ncid, +! integer varid, +! character(*) name, +! integer ivals(1)) + external nf_get_att_int + + integer nf_put_att_int64 +! (integer ncid, +! integer varid, +! character(*) name, +! integer xtype, +! integer len, +! nf_int8_t i8vals(1)) + external nf_put_att_int64 + + integer nf_get_att_int64 +! (integer ncid, +! integer varid, +! character(*) name, +! nf_int8_t i8vals(1)) + external nf_get_att_int64 + + integer nf_put_att_real +! (integer ncid, +! integer varid, +! character(*) name, +! integer xtype, +! integer len, +! real rvals(1)) + external nf_put_att_real + + integer nf_get_att_real +! (integer ncid, +! integer varid, +! character(*) name, +! real rvals(1)) + external nf_get_att_real + + integer nf_put_att_double +! (integer ncid, +! integer varid, +! character(*) name, +! integer xtype, +! integer len, +! double dvals(1)) + external nf_put_att_double + + integer nf_get_att_double +! (integer ncid, +! integer varid, +! character(*) name, +! double dvals(1)) + external nf_get_att_double + +! +! general variable routines: +! + + integer nf_def_var +! (integer ncid, +! character(*) name, +! integer datatype, +! integer ndims, +! integer dimids(1), +! integer varid) + external nf_def_var + + integer nf_inq_var +! (integer ncid, +! integer varid, +! character(*) name, +! integer datatype, +! integer ndims, +! integer dimids(1), +! integer natts) + external nf_inq_var + + integer nf_inq_varid +! (integer ncid, +! character(*) name, +! integer varid) + external nf_inq_varid + + integer nf_inq_varname +! (integer ncid, +! integer varid, +! character(*) name) + external nf_inq_varname + + integer nf_inq_vartype +! (integer ncid, +! integer varid, +! integer xtype) + external nf_inq_vartype + + integer nf_inq_varndims +! (integer ncid, +! integer varid, +! integer ndims) + external nf_inq_varndims + + integer nf_inq_vardimid +! (integer ncid, +! integer varid, +! integer dimids(1)) + external nf_inq_vardimid + + integer nf_inq_varnatts +! (integer ncid, +! integer varid, +! integer natts) + external nf_inq_varnatts + + integer nf_rename_var +! (integer ncid, +! integer varid, +! character(*) name) + external nf_rename_var + + integer nf_copy_var +! (integer ncid_in, +! integer varid, +! integer ncid_out) + external nf_copy_var + +! +! entire variable put/get routines: +! + + integer nf_put_var_text +! (integer ncid, +! integer varid, +! character(*) text) + external nf_put_var_text + + integer nf_get_var_text +! (integer ncid, +! integer varid, +! character(*) text) + external nf_get_var_text + + integer nf_put_var_int1 +! (integer ncid, +! integer varid, +! nf_int1_t i1vals(1)) + external nf_put_var_int1 + + integer nf_get_var_int1 +! (integer ncid, +! integer varid, +! nf_int1_t i1vals(1)) + external nf_get_var_int1 + + integer nf_put_var_int2 +! (integer ncid, +! integer varid, +! nf_int2_t i2vals(1)) + external nf_put_var_int2 + + integer nf_get_var_int2 +! (integer ncid, +! integer varid, +! nf_int2_t i2vals(1)) + external nf_get_var_int2 + + integer nf_put_var_int +! (integer ncid, +! integer varid, +! integer ivals(1)) + external nf_put_var_int + + integer nf_get_var_int +! (integer ncid, +! integer varid, +! integer ivals(1)) + external nf_get_var_int + + integer nf_put_var_real +! (integer ncid, +! integer varid, +! real rvals(1)) + external nf_put_var_real + + integer nf_get_var_real +! (integer ncid, +! integer varid, +! real rvals(1)) + external nf_get_var_real + + integer nf_put_var_double +! (integer ncid, +! integer varid, +! doubleprecision dvals(1)) + external nf_put_var_double + + integer nf_get_var_double +! (integer ncid, +! integer varid, +! doubleprecision dvals(1)) + external nf_get_var_double + +! +! single variable put/get routines: +! + + integer nf_put_var1_text +! (integer ncid, +! integer varid, +! integer index(1), +! character*1 text) + external nf_put_var1_text + + integer nf_get_var1_text +! (integer ncid, +! integer varid, +! integer index(1), +! character*1 text) + external nf_get_var1_text + + integer nf_put_var1_int1 +! (integer ncid, +! integer varid, +! integer index(1), +! nf_int1_t i1val) + external nf_put_var1_int1 + + integer nf_get_var1_int1 +! (integer ncid, +! integer varid, +! integer index(1), +! nf_int1_t i1val) + external nf_get_var1_int1 + + integer nf_put_var1_int2 +! (integer ncid, +! integer varid, +! integer index(1), +! nf_int2_t i2val) + external nf_put_var1_int2 + + integer nf_get_var1_int2 +! (integer ncid, +! integer varid, +! integer index(1), +! nf_int2_t i2val) + external nf_get_var1_int2 + + integer nf_put_var1_int +! (integer ncid, +! integer varid, +! integer index(1), +! integer ival) + external nf_put_var1_int + + integer nf_get_var1_int +! (integer ncid, +! integer varid, +! integer index(1), +! integer ival) + external nf_get_var1_int + + integer nf_put_var1_real +! (integer ncid, +! integer varid, +! integer index(1), +! real rval) + external nf_put_var1_real + + integer nf_get_var1_real +! (integer ncid, +! integer varid, +! integer index(1), +! real rval) + external nf_get_var1_real + + integer nf_put_var1_double +! (integer ncid, +! integer varid, +! integer index(1), +! doubleprecision dval) + external nf_put_var1_double + + integer nf_get_var1_double +! (integer ncid, +! integer varid, +! integer index(1), +! doubleprecision dval) + external nf_get_var1_double + +! +! variable array put/get routines: +! + + integer nf_put_vara_text +! (integer ncid, +! integer varid, +! integer start(1), +! integer count(1), +! character(*) text) + external nf_put_vara_text + + integer nf_get_vara_text +! (integer ncid, +! integer varid, +! integer start(1), +! integer count(1), +! character(*) text) + external nf_get_vara_text + + integer nf_put_vara_int1 +! (integer ncid, +! integer varid, +! integer start(1), +! integer count(1), +! nf_int1_t i1vals(1)) + external nf_put_vara_int1 + + integer nf_get_vara_int1 +! (integer ncid, +! integer varid, +! integer start(1), +! integer count(1), +! nf_int1_t i1vals(1)) + external nf_get_vara_int1 + + integer nf_put_vara_int2 +! (integer ncid, +! integer varid, +! integer start(1), +! integer count(1), +! nf_int2_t i2vals(1)) + external nf_put_vara_int2 + + integer nf_get_vara_int2 +! (integer ncid, +! integer varid, +! integer start(1), +! integer count(1), +! nf_int2_t i2vals(1)) + external nf_get_vara_int2 + + integer nf_put_vara_int +! (integer ncid, +! integer varid, +! integer start(1), +! integer count(1), +! integer ivals(1)) + external nf_put_vara_int + + integer nf_get_vara_int +! (integer ncid, +! integer varid, +! integer start(1), +! integer count(1), +! integer ivals(1)) + external nf_get_vara_int + + integer nf_put_vara_real +! (integer ncid, +! integer varid, +! integer start(1), +! integer count(1), +! real rvals(1)) + external nf_put_vara_real + + integer nf_get_vara_real +! (integer ncid, +! integer varid, +! integer start(1), +! integer count(1), +! real rvals(1)) + external nf_get_vara_real + + integer nf_put_vara_double +! (integer ncid, +! integer varid, +! integer start(1), +! integer count(1), +! doubleprecision dvals(1)) + external nf_put_vara_double + + integer nf_get_vara_double +! (integer ncid, +! integer varid, +! integer start(1), +! integer count(1), +! doubleprecision dvals(1)) + external nf_get_vara_double + +! +! strided variable put/get routines: +! + + integer nf_put_vars_text +! (integer ncid, +! integer varid, +! integer start(1), +! integer count(1), +! integer stride(1), +! character(*) text) + external nf_put_vars_text + + integer nf_get_vars_text +! (integer ncid, +! integer varid, +! integer start(1), +! integer count(1), +! integer stride(1), +! character(*) text) + external nf_get_vars_text + + integer nf_put_vars_int1 +! (integer ncid, +! integer varid, +! integer start(1), +! integer count(1), +! integer stride(1), +! nf_int1_t i1vals(1)) + external nf_put_vars_int1 + + integer nf_get_vars_int1 +! (integer ncid, +! integer varid, +! integer start(1), +! integer count(1), +! integer stride(1), +! nf_int1_t i1vals(1)) + external nf_get_vars_int1 + + integer nf_put_vars_int2 +! (integer ncid, +! integer varid, +! integer start(1), +! integer count(1), +! integer stride(1), +! nf_int2_t i2vals(1)) + external nf_put_vars_int2 + + integer nf_get_vars_int2 +! (integer ncid, +! integer varid, +! integer start(1), +! integer count(1), +! integer stride(1), +! nf_int2_t i2vals(1)) + external nf_get_vars_int2 + + integer nf_put_vars_int +! (integer ncid, +! integer varid, +! integer start(1), +! integer count(1), +! integer stride(1), +! integer ivals(1)) + external nf_put_vars_int + + integer nf_get_vars_int +! (integer ncid, +! integer varid, +! integer start(1), +! integer count(1), +! integer stride(1), +! integer ivals(1)) + external nf_get_vars_int + + integer nf_put_vars_real +! (integer ncid, +! integer varid, +! integer start(1), +! integer count(1), +! integer stride(1), +! real rvals(1)) + external nf_put_vars_real + + integer nf_get_vars_real +! (integer ncid, +! integer varid, +! integer start(1), +! integer count(1), +! integer stride(1), +! real rvals(1)) + external nf_get_vars_real + + integer nf_put_vars_double +! (integer ncid, +! integer varid, +! integer start(1), +! integer count(1), +! integer stride(1), +! doubleprecision dvals(1)) + external nf_put_vars_double + + integer nf_get_vars_double +! (integer ncid, +! integer varid, +! integer start(1), +! integer count(1), +! integer stride(1), +! doubleprecision dvals(1)) + external nf_get_vars_double + +! +! mapped variable put/get routines: +! + + integer nf_put_varm_text +! (integer ncid, +! integer varid, +! integer start(1), +! integer count(1), +! integer stride(1), +! integer imap(1), +! character(*) text) + external nf_put_varm_text + + integer nf_get_varm_text +! (integer ncid, +! integer varid, +! integer start(1), +! integer count(1), +! integer stride(1), +! integer imap(1), +! character(*) text) + external nf_get_varm_text + + integer nf_put_varm_int1 +! (integer ncid, +! integer varid, +! integer start(1), +! integer count(1), +! integer stride(1), +! integer imap(1), +! nf_int1_t i1vals(1)) + external nf_put_varm_int1 + + integer nf_get_varm_int1 +! (integer ncid, +! integer varid, +! integer start(1), +! integer count(1), +! integer stride(1), +! integer imap(1), +! nf_int1_t i1vals(1)) + external nf_get_varm_int1 + + integer nf_put_varm_int2 +! (integer ncid, +! integer varid, +! integer start(1), +! integer count(1), +! integer stride(1), +! integer imap(1), +! nf_int2_t i2vals(1)) + external nf_put_varm_int2 + + integer nf_get_varm_int2 +! (integer ncid, +! integer varid, +! integer start(1), +! integer count(1), +! integer stride(1), +! integer imap(1), +! nf_int2_t i2vals(1)) + external nf_get_varm_int2 + + integer nf_put_varm_int +! (integer ncid, +! integer varid, +! integer start(1), +! integer count(1), +! integer stride(1), +! integer imap(1), +! integer ivals(1)) + external nf_put_varm_int + + integer nf_get_varm_int +! (integer ncid, +! integer varid, +! integer start(1), +! integer count(1), +! integer stride(1), +! integer imap(1), +! integer ivals(1)) + external nf_get_varm_int + + integer nf_put_varm_real +! (integer ncid, +! integer varid, +! integer start(1), +! integer count(1), +! integer stride(1), +! integer imap(1), +! real rvals(1)) + external nf_put_varm_real + + integer nf_get_varm_real +! (integer ncid, +! integer varid, +! integer start(1), +! integer count(1), +! integer stride(1), +! integer imap(1), +! real rvals(1)) + external nf_get_varm_real + + integer nf_put_varm_double +! (integer ncid, +! integer varid, +! integer start(1), +! integer count(1), +! integer stride(1), +! integer imap(1), +! doubleprecision dvals(1)) + external nf_put_varm_double + + integer nf_get_varm_double +! (integer ncid, +! integer varid, +! integer start(1), +! integer count(1), +! integer stride(1), +! integer imap(1), +! doubleprecision dvals(1)) + external nf_get_varm_double + +! 64-bit int functions. + integer nf_put_var1_int64 + external nf_put_var1_int64 + integer nf_put_vara_int64 + external nf_put_vara_int64 + integer nf_put_vars_int64 + external nf_put_vars_int64 + integer nf_put_varm_int64 + external nf_put_varm_int64 + integer nf_put_var_int64 + external nf_put_var_int64 + integer nf_get_var1_int64 + external nf_get_var1_int64 + integer nf_get_vara_int64 + external nf_get_vara_int64 + integer nf_get_vars_int64 + external nf_get_vars_int64 + integer nf_get_varm_int64 + external nf_get_varm_int64 + integer nf_get_var_int64 + external nf_get_var_int64 + + +! NetCDF-4. +! This is part of netCDF-4. Copyright 2006, UCAR, See COPYRIGHT +! file for distribution information. + +! Netcdf version 4 fortran interface. + +! $Id: netcdf4.inc,v 1.28 2010/05/25 13:53:02 ed Exp $ + +! New netCDF-4 types. + integer nf_string + integer nf_vlen + integer nf_opaque + integer nf_enum + integer nf_compound + + parameter (nf_string = 12) + parameter (nf_vlen = 13) + parameter (nf_opaque = 14) + parameter (nf_enum = 15) + parameter (nf_compound = 16) + +! New netCDF-4 fill values. + integer nf_fill_ubyte + integer nf_fill_ushort +! real nf_fill_uint +! real nf_fill_int64 +! real nf_fill_uint64 + parameter (nf_fill_ubyte = 255) + parameter (nf_fill_ushort = 65535) + +! New constants. + integer nf_format_netcdf4 + parameter (nf_format_netcdf4 = 3) + + integer nf_format_netcdf4_classic + parameter (nf_format_netcdf4_classic = 4) + + integer nf_netcdf4 + parameter (nf_netcdf4 = 4096) + + integer nf_classic_model + parameter (nf_classic_model = 256) + + integer nf_chunk_seq + parameter (nf_chunk_seq = 0) + integer nf_chunk_sub + parameter (nf_chunk_sub = 1) + integer nf_chunk_sizes + parameter (nf_chunk_sizes = 2) + + integer nf_endian_native + parameter (nf_endian_native = 0) + integer nf_endian_little + parameter (nf_endian_little = 1) + integer nf_endian_big + parameter (nf_endian_big = 2) + +! For NF_DEF_VAR_CHUNKING + integer nf_chunked + parameter (nf_chunked = 0) + integer nf_contiguous + parameter (nf_contiguous = 1) + integer nf_compact + parameter (nf_compact = 2) + +! For NF_DEF_VAR_FLETCHER32 + integer nf_nochecksum + parameter (nf_nochecksum = 0) + integer nf_fletcher32 + parameter (nf_fletcher32 = 1) + +! For NF_DEF_VAR_DEFLATE + integer nf_noshuffle + parameter (nf_noshuffle = 0) + integer nf_shuffle + parameter (nf_shuffle = 1) + +! For NF_DEF_VAR_SZIP + integer nf_szip_ec_option_mask + parameter (nf_szip_ec_option_mask = 4) + integer nf_szip_nn_option_mask + parameter (nf_szip_nn_option_mask = 32) + +! For parallel I/O. + integer nf_mpiio + parameter (nf_mpiio = 8192) + integer nf_mpiposix + parameter (nf_mpiposix = 16384) + integer nf_pnetcdf + parameter (nf_pnetcdf = 32768) + +! For NF_VAR_PAR_ACCESS. + integer nf_independent + parameter (nf_independent = 0) + integer nf_collective + parameter (nf_collective = 1) + +! For NF_DEF_VAR_QUANTIZE. + integer nf_noquantize + parameter (nf_noquantize = 0) + integer nf_quantize_bitgroom + parameter (nf_quantize_bitgroom = 1) + +! New error codes. + integer nf_ehdferr ! Error at HDF5 layer. + parameter (nf_ehdferr = -101) + integer nf_ecantread ! Can't read. + parameter (nf_ecantread = -102) + integer nf_ecantwrite ! Can't write. + parameter (nf_ecantwrite = -103) + integer nf_ecantcreate ! Can't create. + parameter (nf_ecantcreate = -104) + integer nf_efilemeta ! Problem with file metadata. + parameter (nf_efilemeta = -105) + integer nf_edimmeta ! Problem with dimension metadata. + parameter (nf_edimmeta = -106) + integer nf_eattmeta ! Problem with attribute metadata. + parameter (nf_eattmeta = -107) + integer nf_evarmeta ! Problem with variable metadata. + parameter (nf_evarmeta = -108) + integer nf_enocompound ! Not a compound type. + parameter (nf_enocompound = -109) + integer nf_eattexists ! Attribute already exists. + parameter (nf_eattexists = -110) + integer nf_enotnc4 ! Attempting netcdf-4 operation on netcdf-3 file. + parameter (nf_enotnc4 = -111) + integer nf_estrictnc3 ! Attempting netcdf-4 operation on strict nc3 netcdf-4 file. + parameter (nf_estrictnc3 = -112) + integer nf_enotnc3 ! Attempting netcdf-3 operation on netcdf-4 file. + parameter (nf_enotnc3 = -113) + integer nf_enopar ! Parallel operation on file opened for non-parallel access. + parameter (nf_enopar = -114) + integer nf_eparinit ! Error initializing for parallel access. + parameter (nf_eparinit = -115) + integer nf_ebadgrpid ! Bad group ID. + parameter (nf_ebadgrpid = -116) + integer nf_ebadtypid ! Bad type ID. + parameter (nf_ebadtypid = -117) + integer nf_etypdefined ! Type has already been defined and may not be edited. + parameter (nf_etypdefined = -118) + integer nf_ebadfield ! Bad field ID. + parameter (nf_ebadfield = -119) + integer nf_ebadclass ! Bad class. + parameter (nf_ebadclass = -120) + integer nf_emaptype ! Mapped access for atomic types only. + parameter (nf_emaptype = -121) + integer nf_elatefill ! Attempt to define fill value when data already exists. + parameter (nf_elatefill = -122) + integer nf_elatedef ! Attempt to define var properties, like deflate, after enddef. + parameter (nf_elatedef = -123) + integer nf_edimscale ! Probem with HDF5 dimscales. + parameter (nf_edimscale = -124) + integer nf_enogrp ! No group found. + parameter (nf_enogrp = -125) + integer nf_estorage ! Can't specify both contiguous and chunking. + parameter (nf_estorage = -126) + integer nf_ebadchunk ! Bad chunksize. + parameter (nf_ebadchunk = -127) + integer nf_enotbuilt ! NetCDF feature not built. + parameter (nf_enotbuilt = -128) + integer nf_ediskless ! Error in using diskless access. + parameter (nf_ediskless = -129) + integer nf_ecantextend ! Attempt to extend dataset during ind. I/O operation. + parameter (nf_ecantextend = -130) + integer nf_empi ! MPI operation failed. + parameter (nf_empi = -131) + integer nf_efilter ! Filter operation failed. + parameter (nf_efilter = -132) + integer nf_ercfile ! RC file failure + parameter (nf_ercfile = -133) + integer nf_enullpad ! Header Bytes not Null-Byte padded + parameter (nf_enullpad = -134) + integer nf_einmemory ! In-memory file error + parameter (nf_einmemory = -135) + integer nf_enofilter ! Filter not defined on variable. + parameter (nf_enofilter = -136) + integer nf_enczarr ! Error at NCZarr layer. + parameter (nf_enczarr = -137) + integer nf_es3 ! Generic S3 error + parameter (nf_es3 = -138) + integer nf_eempty ! Attempt to read empty NCZarr map key + parameter (nf_eempty = -139) + integer nf_eobject ! Some object exists when it should not + parameter (nf_eobject = -140) + integer nf_enoobject ! Some object not found + parameter (nf_enoobject = -141) + integer nf_eplugin ! Unclassified failure in accessing a dynamically loaded plugin> + parameter (nf_eplugin = -142) + + +! New functions. + +! Parallel I/O. + integer nf_create_par + external nf_create_par + + integer nf_open_par + external nf_open_par + + integer nf_var_par_access + external nf_var_par_access + +! Functions to handle groups. + integer nf_inq_ncid + external nf_inq_ncid + + integer nf_inq_grps + external nf_inq_grps + + integer nf_inq_grpname + external nf_inq_grpname + + integer nf_inq_grpname_full + external nf_inq_grpname_full + + integer nf_inq_grpname_len + external nf_inq_grpname_len + + integer nf_inq_grp_parent + external nf_inq_grp_parent + + integer nf_inq_grp_ncid + external nf_inq_grp_ncid + + integer nf_inq_grp_full_ncid + external nf_inq_grp_full_ncid + + integer nf_inq_varids + external nf_inq_varids + + integer nf_inq_dimids + external nf_inq_dimids + + integer nf_def_grp + external nf_def_grp + +! New rename grp function + + integer nf_rename_grp + external nf_rename_grp + +! New options for netCDF variables. + integer nf_def_var_deflate + external nf_def_var_deflate + + integer nf_inq_var_deflate + external nf_inq_var_deflate + + integer nf_def_var_zstandard + external nf_def_var_zstandard + + integer nf_inq_var_zstandard + external nf_inq_var_zstandard + + integer nf_def_var_szip + external nf_def_var_szip + + integer nf_inq_var_szip + external nf_inq_var_szip + + integer nf_def_var_quantize + external nf_def_var_quantize + + integer nf_inq_var_quantize + external nf_inq_var_quantize + + integer nf_def_var_fletcher32 + external nf_def_var_fletcher32 + + integer nf_inq_var_fletcher32 + external nf_inq_var_fletcher32 + + integer nf_def_var_chunking + external nf_def_var_chunking + + integer nf_inq_var_chunking + external nf_inq_var_chunking + + integer nf_def_var_fill + external nf_def_var_fill + + integer nf_inq_var_fill + external nf_inq_var_fill + + integer nf_def_var_endian + external nf_def_var_endian + + integer nf_inq_var_endian + external nf_inq_var_endian + + integer nf_def_var_filter + external nf_def_var_filter + + integer nf_inq_var_filter + external nf_inq_var_filter + +! User defined types. + integer nf_inq_typeids + external nf_inq_typeids + + integer nf_inq_typeid + external nf_inq_typeid + + integer nf_inq_type + external nf_inq_type + + integer nf_inq_user_type + external nf_inq_user_type + +! User defined types - compound types. + integer nf_def_compound + external nf_def_compound + + integer nf_insert_compound + external nf_insert_compound + + integer nf_insert_array_compound + external nf_insert_array_compound + + integer nf_inq_compound + external nf_inq_compound + + integer nf_inq_compound_name + external nf_inq_compound_name + + integer nf_inq_compound_size + external nf_inq_compound_size + + integer nf_inq_compound_nfields + external nf_inq_compound_nfields + + integer nf_inq_compound_field + external nf_inq_compound_field + + integer nf_inq_compound_fieldname + external nf_inq_compound_fieldname + + integer nf_inq_compound_fieldindex + external nf_inq_compound_fieldindex + + integer nf_inq_compound_fieldoffset + external nf_inq_compound_fieldoffset + + integer nf_inq_compound_fieldtype + external nf_inq_compound_fieldtype + + integer nf_inq_compound_fieldndims + external nf_inq_compound_fieldndims + + integer nf_inq_compound_fielddim_sizes + external nf_inq_compound_fielddim_sizes + +! User defined types - variable length arrays. + integer nf_def_vlen + external nf_def_vlen + + integer nf_inq_vlen + external nf_inq_vlen + + integer nf_free_vlen + external nf_free_vlen + +! User defined types - enums. + integer nf_def_enum + external nf_def_enum + + integer nf_insert_enum + external nf_insert_enum + + integer nf_inq_enum + external nf_inq_enum + + integer nf_inq_enum_member + external nf_inq_enum_member + + integer nf_inq_enum_ident + external nf_inq_enum_ident + +! User defined types - opaque. + integer nf_def_opaque + external nf_def_opaque + + integer nf_inq_opaque + external nf_inq_opaque + +! Write and read attributes of any type, including user defined +! types. + integer nf_put_att + external nf_put_att + integer nf_get_att + external nf_get_att + +! Write and read variables of any type, including user defined +! types. + integer nf_put_var + external nf_put_var + integer nf_put_var1 + external nf_put_var1 + integer nf_put_vara + external nf_put_vara + integer nf_put_vars + external nf_put_vars + integer nf_get_var + external nf_get_var + integer nf_get_var1 + external nf_get_var1 + integer nf_get_vara + external nf_get_vara + integer nf_get_vars + external nf_get_vars + +! For helping F77 users with VLENs. + integer nf_get_vlen_element + external nf_get_vlen_element + integer nf_put_vlen_element + external nf_put_vlen_element + +! For dealing with file level chunk cache. + integer nf_set_chunk_cache + external nf_set_chunk_cache + integer nf_get_chunk_cache + external nf_get_chunk_cache + +! For dealing with per variable chunk cache. + integer nf_set_var_chunk_cache + external nf_set_var_chunk_cache + integer nf_get_var_chunk_cache + external nf_get_var_chunk_cache + +! NetCDF-2. +!ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +! begin netcdf 2.4 backward compatibility: +! + +! +! functions in the fortran interface +! + integer nccre + integer ncopn + integer ncddef + integer ncdid + integer ncvdef + integer ncvid + integer nctlen + integer ncsfil + + external nccre + external ncopn + external ncddef + external ncdid + external ncvdef + external ncvid + external nctlen + external ncsfil + + + integer ncrdwr + integer nccreat + integer ncexcl + integer ncindef + integer ncnsync + integer nchsync + integer ncndirty + integer nchdirty + integer nclink + integer ncnowrit + integer ncwrite + integer ncclob + integer ncnoclob + integer ncglobal + integer ncfill + integer ncnofill + integer maxncop + integer maxncdim + integer maxncatt + integer maxncvar + integer maxncnam + integer maxvdims + integer ncnoerr + integer ncebadid + integer ncenfile + integer nceexist + integer nceinval + integer nceperm + integer ncenotin + integer nceindef + integer ncecoord + integer ncemaxds + integer ncename + integer ncenoatt + integer ncemaxat + integer ncebadty + integer ncebadd + integer ncests + integer nceunlim + integer ncemaxvs + integer ncenotvr + integer nceglob + integer ncenotnc + integer ncfoobar + integer ncsyserr + integer ncfatal + integer ncverbos + integer ncentool + + +! +! netcdf data types: +! + integer ncbyte + integer ncchar + integer ncshort + integer nclong + integer ncfloat + integer ncdouble + + parameter(ncbyte = 1) + parameter(ncchar = 2) + parameter(ncshort = 3) + parameter(nclong = 4) + parameter(ncfloat = 5) + parameter(ncdouble = 6) + +! +! masks for the struct nc flag field; passed in as 'mode' arg to +! nccreate and ncopen. +! + +! read/write, 0 => readonly + parameter(ncrdwr = 1) +! in create phase, cleared by ncendef + parameter(nccreat = 2) +! on create destroy existing file + parameter(ncexcl = 4) +! in define mode, cleared by ncendef + parameter(ncindef = 8) +! synchronise numrecs on change (x'10') + parameter(ncnsync = 16) +! synchronise whole header on change (x'20') + parameter(nchsync = 32) +! numrecs has changed (x'40') + parameter(ncndirty = 64) +! header info has changed (x'80') + parameter(nchdirty = 128) +! prefill vars on endef and increase of record, the default behavior + parameter(ncfill = 0) +! do not fill vars on endef and increase of record (x'100') + parameter(ncnofill = 256) +! isa link (x'8000') + parameter(nclink = 32768) + +! +! 'mode' arguments for nccreate and ncopen +! + parameter(ncnowrit = 0) + parameter(ncwrite = ncrdwr) + parameter(ncclob = nf_clobber) + parameter(ncnoclob = nf_noclobber) + +! +! 'size' argument to ncdimdef for an unlimited dimension +! + integer ncunlim + parameter(ncunlim = 0) + +! +! attribute id to put/get a global attribute +! + parameter(ncglobal = 0) + +! +! advisory maximums: +! + parameter(maxncop = 64) + parameter(maxncdim = 1024) + parameter(maxncatt = 8192) + parameter(maxncvar = 8192) +! not enforced + parameter(maxncnam = 256) + parameter(maxvdims = maxncdim) + +! +! global netcdf error status variable +! initialized in error.c +! + +! no error + parameter(ncnoerr = nf_noerr) +! not a netcdf id + parameter(ncebadid = nf_ebadid) +! too many netcdfs open + parameter(ncenfile = -31) ! nc_syserr +! netcdf file exists && ncnoclob + parameter(nceexist = nf_eexist) +! invalid argument + parameter(nceinval = nf_einval) +! write to read only + parameter(nceperm = nf_eperm) +! operation not allowed in data mode + parameter(ncenotin = nf_enotindefine ) +! operation not allowed in define mode + parameter(nceindef = nf_eindefine) +! coordinates out of domain + parameter(ncecoord = nf_einvalcoords) +! maxncdims exceeded + parameter(ncemaxds = nf_emaxdims) +! string match to name in use + parameter(ncename = nf_enameinuse) +! attribute not found + parameter(ncenoatt = nf_enotatt) +! maxncattrs exceeded + parameter(ncemaxat = nf_emaxatts) +! not a netcdf data type + parameter(ncebadty = nf_ebadtype) +! invalid dimension id + parameter(ncebadd = nf_ebaddim) +! ncunlimited in the wrong index + parameter(nceunlim = nf_eunlimpos) +! maxncvars exceeded + parameter(ncemaxvs = nf_emaxvars) +! variable not found + parameter(ncenotvr = nf_enotvar) +! action prohibited on ncglobal varid + parameter(nceglob = nf_eglobal) +! not a netcdf file + parameter(ncenotnc = nf_enotnc) + parameter(ncests = nf_ests) + parameter (ncentool = nf_emaxname) + parameter(ncfoobar = 32) + parameter(ncsyserr = -31) + +! +! global options variable. used to determine behavior of error handler. +! initialized in lerror.c +! + parameter(ncfatal = 1) + parameter(ncverbos = 2) + +! +! default fill values. these must be the same as in the c interface. +! + integer filbyte + integer filchar + integer filshort + integer fillong + real filfloat + doubleprecision fildoub + + parameter (filbyte = -127) + parameter (filchar = 0) + parameter (filshort = -32767) + parameter (fillong = -2147483647) + parameter (filfloat = 9.9692099683868690e+36) + parameter (fildoub = 9.9692099683868690e+36) + +! This is to turn on netCDF internal logging. + integer nf_set_log_level + external nf_set_log_level diff --git a/bin.rams/rams b/bin.rams/rams new file mode 120000 index 0000000..86b01fc --- /dev/null +++ b/bin.rams/rams @@ -0,0 +1 @@ +rams- \ No newline at end of file diff --git a/bin.rams/run_test_supercell.sc b/bin.rams/run_testrunonly.sc similarity index 83% rename from bin.rams/run_test_supercell.sc rename to bin.rams/run_testrunonly.sc index d7ac8b9..5d45142 100755 --- a/bin.rams/run_test_supercell.sc +++ b/bin.rams/run_testrunonly.sc @@ -8,7 +8,7 @@ # this script in parallel or serial. # # A couple of important items here for this test simulation. -# 1. RAMSIN.supercell - produces a 3D 1-grid supercell simulation with +# 1. RAMSIN.testrunonly - produces a 3D 1-grid supercell simulation with # LEVEL=3 microphysics # 2. This idealized simulation does not require geographical data (sfctypehdf5) # for running since geography does not matter. Also, we do not need gridded @@ -19,25 +19,29 @@ # but NOT on a supercomputer using a PBS QSUB queuing system. Consult their # userguides for running parallel jobs on their systems. Each system is unique. # /home/smsaleeb/software/mpich-3.3.2/bin/mpiexec -machinefile machs -np 8 \ -# ./bin.rams/rams-6.3.01 -f RAMSIN.supercell -# Note: might have to add (-ifrace eth0) to this executable statement or +# ./bin.rams/rams-6.3.01 -f RAMSIN.testrunonly +# Note: might have to add (-iface eth0) to this executable statement or # something similar depending on how your compute nodes communicate. Use # utility (ifconfig) to find out how your nodes communicate (ie. eth0 or eth1). # # Do not blindly use this script for running every simulation. It is simply # included here as a starting point and because I use this frequently on my # desktop Linux workstation for RAMS tests and debugging. If using this script -# please become familiar with its flags, settings, and functionality. It cannot -# be used for every runtime situation. +# and RAMSIN namelist, please become familiar with its flags, settings, and +# functionality. They cannot be used for every runtime situation. Many RAMSIN +# flags in this test example are turned on for testing only and are not +# appropriate for a real simulation to study. ############################################################################### # Set your RAMS root path rd=`pwd`/.. +# RAMSIN name +ramsin="RAMSIN.testrunonly" # RAMS version (ie. 6.1.6) -vs=6.3.02 +vs=6.3.04 # Set flag for type of test (0=sequential, 1=parallel) -runtype=0 +runtype=1 # Set number of nodes for parallel run. -n=10 +n=8 # Set delete flag (0 = do not delete, 1 = delete and start over) del=1 @@ -56,8 +60,8 @@ a3=$rd/bin.rams/rams-$vs a4=$rd/bin.revu/revu-$vs #Check to see that RAMSIN namelist exists -if [ ! -f $rd/bin.rams/RAMSIN.supercell ]; then - echo "Input paths for this file is incorrect: RAMSIN.supercell" +if [ ! -f $rd/bin.rams/$ramsin ]; then + echo "Input paths for this file is incorrect: RAMSIN.testrunonly" exit fi @@ -92,11 +96,10 @@ fi # DONE WITH NECESSARY USER CHANGES ############################################################################### -for dirname in $rd/bin.rams/test.supercell +for dirname in $rd/bin.rams/testrun.output do if [ -d $dirname -a $del -eq 1 ]; then - rm -f $dirname/*.h5 $dirname/*.txt $dirname/*.tag \ - $dirname/r.* $dirname/ct.* $dirname/out + rm -f $dirname/*.h5 $dirname/*.txt else if [ ! -d $dirname ]; then mkdir $dirname; fi; fi @@ -114,9 +117,4 @@ else exit fi -$rc1 $rd/bin.rams/RAMSIN.supercell - -#Try running REVU on test simulation output if REVU is compiled -if [ -f $a4 ]; then - $a4 -f $rd/bin.rams/REVUIN.supercell -fi +$rc1 $rd/bin.rams/$ramsin diff --git a/bin.rams/runmodel b/bin.rams/runmodel new file mode 100644 index 0000000..5308862 --- /dev/null +++ b/bin.rams/runmodel @@ -0,0 +1,13 @@ +#!/bin/bash -l +#SBATCH -J supercell +#SBATCH -o ./out.txt +#SBATCH -e ./out.txt +#SBATCH -p high2 +#SBATCH -t 24:00:00 +#SBATCH -N 1 +#SBATCH -n 12 +#SBATCH --mail-type=END,FAIL +#SBATCH --mail-user=aigel@ucdavis.edu + +mpiexec -np 12 ../bin.rams/rams -f RAMSIN.supercell + diff --git a/bin.rams/stcrRlAE b/bin.rams/stcrRlAE new file mode 100644 index 0000000..e456c85 Binary files /dev/null and b/bin.rams/stcrRlAE differ diff --git a/bin.rams/test.supercell/a-A-1991-04-26-210000-head.txt b/bin.rams/test.supercell/a-A-1991-04-26-210000-head.txt new file mode 100644 index 0000000..06b951b --- /dev/null +++ b/bin.rams/test.supercell/a-A-1991-04-26-210000-head.txt @@ -0,0 +1,3638 @@ + 257 +UP 0 3 1 218750 +VP 0 3 1 218750 +WP 0 3 1 218750 +PP 0 3 1 218750 +UC 0 3 1 218750 +VC 0 3 1 218750 +WC 0 3 1 218750 +PC 0 3 1 218750 +THP 0 3 1 218750 +RTP 0 3 1 218750 +THETA 0 3 1 218750 +RV 0 3 1 218750 +DN0 0 3 1 218750 +WP_BUOY_THETA 0 3 1 218750 +WP_BUOY_COND 0 3 1 218750 +WP_ADVDIF 0 3 1 218750 +SOIL_WATER 0 4 1 19250 +SOIL_ENERGY 0 4 1 19250 +SOIL_TEXT 0 4 1 19250 +SFCWATER_MASS 0 5 1 1750 +SFCWATER_ENERGY 0 5 1 1750 +SFCWATER_DEPTH 0 5 1 1750 +USTAR 0 6 1 1750 +TSTAR 0 6 1 1750 +RSTAR 0 6 1 1750 +VEG_FRACAREA 0 6 1 1750 +VEG_LAI 0 6 1 1750 +VEG_ROUGH 0 6 1 1750 +VEG_HEIGHT 0 6 1 1750 +VEG_ALBEDO 0 6 1 1750 +VEG_TAI 0 6 1 1750 +PATCH_AREA 0 6 1 1750 +PATCH_ROUGH 0 6 1 1750 +LEAF_CLASS 0 6 1 1750 +SOIL_ROUGH 0 6 1 1750 +SFCWATER_NLEV 0 6 1 1750 +STOM_RESIST 0 6 1 1750 +GROUND_RSAT 0 6 1 1750 +GROUND_RVAP 0 6 1 1750 +VEG_WATER 0 6 1 1750 +VEG_TEMP 0 6 1 1750 +CAN_RVAP 0 6 1 1750 +CAN_TEMP 0 6 1 1750 +VEG_NDVIP 0 6 1 1750 +VEG_NDVIC 0 6 1 1750 +VEG_NDVIF 0 6 1 1750 +KPP_OLD 0 2 1 875 +KPP_NEW 0 2 1 875 +KPP_JERLOV 0 2 1 875 +KPP_OCDEPTH 0 2 1 875 +KPP_HMIX 0 2 1 875 +KPP_BOTTOMT 0 2 1 875 +KPP_SREF 0 2 1 875 +KPP_FREEZ_FLAG 0 2 1 875 +KPP_RESET_FLAG 0 2 1 875 +KPP_FLX_UST 0 2 1 875 +KPP_FLX_VST 0 2 1 875 +KPP_FLX_NSW 0 2 1 875 +KPP_FLX_NLW 0 2 1 875 +KPP_FLX_ICE 0 2 1 875 +KPP_FLX_PCP 0 2 1 875 +KPP_SWDK_OPT 0 10 1 42000 +KPP_SWFRAC 0 10 1 42000 +KPP_SAL_CLIM 0 10 1 42000 +KPP_OCNT_CLIM 0 10 1 42000 +KPP_BUOY 0 10 1 42000 +KPP_U 0 10 1 42000 +KPP_V 0 10 1 42000 +KPP_U_init 0 10 1 42000 +KPP_V_init 0 10 1 42000 +KPP_US0 0 10 1 42000 +KPP_US1 0 10 1 42000 +KPP_VS0 0 10 1 42000 +KPP_VS1 0 10 1 42000 +KPP_X_T 0 10 1 42000 +KPP_X_S 0 10 1 42000 +KPP_XS_T0 0 10 1 42000 +KPP_XS_T1 0 10 1 42000 +KPP_XS_S0 0 10 1 42000 +KPP_XS_S1 0 10 1 42000 +RCP 0 3 1 218750 +RDP 0 3 1 218750 +RRP 0 3 1 218750 +RPP 0 3 1 218750 +RSP 0 3 1 218750 +RAP 0 3 1 218750 +RGP 0 3 1 218750 +RHP 0 3 1 218750 +CCP 0 3 1 218750 +CDP 0 3 1 218750 +CRP 0 3 1 218750 +CPP 0 3 1 218750 +CSP 0 3 1 218750 +CAP 0 3 1 218750 +CGP 0 3 1 218750 +CHP 0 3 1 218750 +Q2 0 3 1 218750 +Q6 0 3 1 218750 +Q7 0 3 1 218750 +CCCNP 0 3 1 218750 +GCCNP 0 3 1 218750 +CCCMP 0 3 1 218750 +GCCMP 0 3 1 218750 +MD1NP 0 3 1 218750 +MD2NP 0 3 1 218750 +MD1MP 0 3 1 218750 +MD2MP 0 3 1 218750 +SALT_FILM_NP 0 3 1 218750 +SALT_JET_NP 0 3 1 218750 +SALT_SPUM_NP 0 3 1 218750 +SALT_FILM_MP 0 3 1 218750 +SALT_JET_MP 0 3 1 218750 +SALT_SPUM_MP 0 3 1 218750 +REGEN_AERO1_NP 0 3 1 218750 +REGEN_AERO1_MP 0 3 1 218750 +REGEN_AERO2_NP 0 3 1 218750 +REGEN_AERO2_MP 0 3 1 218750 +IMMERCP 0 3 1 218750 +IMMERDP 0 3 1 218750 +IMMERRP 0 3 1 218750 +IFNNUCP 0 3 1 218750 +CNMCP 0 3 1 218750 +CNMDP 0 3 1 218750 +CNMRP 0 3 1 218750 +CNMPP 0 3 1 218750 +CNMSP 0 3 1 218750 +CNMAP 0 3 1 218750 +CNMGP 0 3 1 218750 +CNMHP 0 3 1 218750 +DNMCP 0 3 1 218750 +DNMDP 0 3 1 218750 +DNMRP 0 3 1 218750 +DNMPP 0 3 1 218750 +DNMSP 0 3 1 218750 +DNMAP 0 3 1 218750 +DNMGP 0 3 1 218750 +DNMHP 0 3 1 218750 +DINCP 0 3 1 218750 +DINDP 0 3 1 218750 +DINRP 0 3 1 218750 +DINPP 0 3 1 218750 +DINSP 0 3 1 218750 +DINAP 0 3 1 218750 +DINGP 0 3 1 218750 +DINHP 0 3 1 218750 +SNMCP 0 3 1 218750 +SNMDP 0 3 1 218750 +SNMRP 0 3 1 218750 +SNMPP 0 3 1 218750 +SNMSP 0 3 1 218750 +SNMAP 0 3 1 218750 +SNMGP 0 3 1 218750 +SNMHP 0 3 1 218750 +RESOL_AERO1_MP 0 3 1 218750 +RESOL_AERO2_MP 0 3 1 218750 +PCPVR 0 3 1 218750 +PCPVP 0 3 1 218750 +PCPVS 0 3 1 218750 +PCPVA 0 3 1 218750 +PCPVG 0 3 1 218750 +PCPVH 0 3 1 218750 +PCPVD 0 3 1 218750 +LATHEATVAP 0 3 1 218750 +LATHEATFRZ 0 3 1 218750 +NUCCLDRT 0 3 1 218750 +CLD2RAINT 0 3 1 218750 +ICE2RAINT 0 3 1 218750 +NUCICERT 0 3 1 218750 +VAPLIQT 0 3 1 218750 +VAPICET 0 3 1 218750 +MELTICET 0 3 1 218750 +RIMECLDT 0 3 1 218750 +RAIN2ICET 0 3 1 218750 +AGGREGATET 0 3 1 218750 +LATHEATVAPT 0 3 1 218750 +LATHEATFRZT 0 3 1 218750 +INUCHOMRT 0 3 1 218750 +INUCCONTRT 0 3 1 218750 +INUCIFNRT 0 3 1 218750 +INUCHAZRT 0 3 1 218750 +VAPCLDT 0 3 1 218750 +VAPRAINT 0 3 1 218750 +VAPPRIST 0 3 1 218750 +VAPSNOWT 0 3 1 218750 +VAPAGGRT 0 3 1 218750 +VAPGRAUT 0 3 1 218750 +VAPHAILT 0 3 1 218750 +VAPDRIZT 0 3 1 218750 +MELTPRIST 0 3 1 218750 +MELTSNOWT 0 3 1 218750 +MELTAGGRT 0 3 1 218750 +MELTGRAUT 0 3 1 218750 +MELTHAILT 0 3 1 218750 +RIMECLDSNOWT 0 3 1 218750 +RIMECLDAGGRT 0 3 1 218750 +RIMECLDGRAUT 0 3 1 218750 +RIMECLDHAILT 0 3 1 218750 +RAIN2PRT 0 3 1 218750 +RAIN2SNT 0 3 1 218750 +RAIN2AGT 0 3 1 218750 +RAIN2GRT 0 3 1 218750 +RAIN2HAT 0 3 1 218750 +AGGRSELFPRIST 0 3 1 218750 +AGGRSELFSNOWT 0 3 1 218750 +AGGRPRISSNOWT 0 3 1 218750 +DUST1CLDRT 0 3 1 218750 +DUST2CLDRT 0 3 1 218750 +DUST1DRZRT 0 3 1 218750 +DUST2DRZRT 0 3 1 218750 +ACCPR 0 2 1 875 +ACCPP 0 2 1 875 +ACCPS 0 2 1 875 +ACCPA 0 2 1 875 +ACCPG 0 2 1 875 +ACCPH 0 2 1 875 +ACCPD 0 2 1 875 +PCPRR 0 2 1 875 +PCPRP 0 2 1 875 +PCPRS 0 2 1 875 +PCPRA 0 2 1 875 +PCPRG 0 2 1 875 +PCPRH 0 2 1 875 +PCPRD 0 2 1 875 +PCPG 0 2 1 875 +QPCPG 0 2 1 875 +DPCPG 0 2 1 875 +ACCPAERO 0 2 1 875 +PCPRAERO 0 2 1 875 +ACCPDUST 0 2 1 875 +PCPRDUST 0 2 1 875 +FTHRD 0 3 1 218750 +BEXT 0 3 1 218750 +SWUP 0 3 1 218750 +SWDN 0 3 1 218750 +LWUP 0 3 1 218750 +LWDN 0 3 1 218750 +RSHORT 0 2 1 875 +RLONG 0 2 1 875 +RLONGUP 0 2 1 875 +ALBEDT 0 2 1 875 +COSZ 0 2 1 875 +AODT 0 2 1 875 +RHKM 0 3 1 218750 +RVKM 0 3 1 218750 +RVKH 0 3 1 218750 +SFLUX_U 0 2 1 875 +SFLUX_V 0 2 1 875 +SFLUX_W 0 2 1 875 +SFLUX_T 0 2 1 875 +SFLUX_R 0 2 1 875 +TOPT 0 2 1 875 +GLAT 0 2 1 875 +GLON 0 2 1 875 +TOPZO 0 2 1 875 +PI 1 3 1 218750 +HKH 1 3 1 218750 +VKH 1 3 1 218750 +__expnme + 1 +RAMS Simulations +__initial + 1 + 1 +__initorig + 1 + 1 +__jdim + 1 + 1 +__iyear1 + 1 + 1991 +__imonth1 + 1 + 4 +__idate1 + 1 + 26 +__itime1 + 1 + 2100 +__time + 1 + 0.000000000000000000E+00 +__nsndg + 1 + 35 +__us + 35 + -0.271000003814697266E+01 + -0.271000003814697266E+01 + -0.353999996185302734E+01 + -0.339000010490417480E+01 + -0.277999997138977051E+01 + -0.174000000953674316E+01 + -0.360000014305114746E+00 + 0.125000000000000000E+01 + 0.294000005722045898E+01 + 0.457999992370605469E+01 + 0.607000017166137695E+01 + 0.730000019073486328E+01 + 0.852999973297119141E+01 + 0.967000007629394531E+01 + 0.108999996185302734E+02 + 0.120900001525878906E+02 + 0.128400001525878906E+02 + 0.151300001144409180E+02 + 0.167000007629394531E+02 + 0.173600006103515625E+02 + 0.174400005340576172E+02 + 0.170400009155273438E+02 + 0.168299999237060547E+02 + 0.170599994659423828E+02 + 0.183799991607666016E+02 + 0.203899993896484375E+02 + 0.233099994659423828E+02 + 0.281800003051757813E+02 + 0.248199996948242188E+02 + 0.211499996185302734E+02 + 0.175100002288818359E+02 + 0.965999984741210938E+01 + 0.200999999046325684E+01 + 0.500000000000000000E+00 + -0.103999996185302734E+01 +__vs + 35 + 0.838000011444091797E+01 + 0.838000011444091797E+01 + 0.106599998474121094E+02 + 0.122500000000000000E+02 + 0.134600000381469727E+02 + 0.142600002288818359E+02 + 0.146400003433227539E+02 + 0.146599998474121094E+02 + 0.144099998474121094E+02 + 0.140299997329711914E+02 + 0.137200002670288086E+02 + 0.136199998855590820E+02 + 0.138299999237060547E+02 + 0.142600002288818359E+02 + 0.154700002670288086E+02 + 0.160300006866455078E+02 + 0.188700008392333984E+02 + 0.190900001525878906E+02 + 0.186000003814697266E+02 + 0.189099998474121094E+02 + 0.199799995422363281E+02 + 0.211800003051757813E+02 + 0.216200008392333984E+02 + 0.218400001525878906E+02 + 0.223400001525878906E+02 + 0.227000007629394531E+02 + 0.227399997711181641E+02 + 0.198400001525878906E+02 + 0.181599998474121094E+02 + 0.161700000762939453E+02 + 0.118999996185302734E+02 + 0.850000000000000000E+01 + 0.347000002861022949E+01 + 0.350000000000000000E+01 + 0.352999997138977051E+01 +__ts + 35 + 0.306079376220703125E+03 + 0.305112518310546875E+03 + 0.303622192382812500E+03 + 0.302135650634765625E+03 + 0.300582458496093750E+03 + 0.298970092773437500E+03 + 0.297265472412109375E+03 + 0.295463653564453125E+03 + 0.293529083251953125E+03 + 0.291434265136718750E+03 + 0.289150360107421875E+03 + 0.286665008544921875E+03 + 0.284018432617187500E+03 + 0.281624572753906250E+03 + 0.279662200927734375E+03 + 0.277406005859375000E+03 + 0.274758117675781250E+03 + 0.271294006347656250E+03 + 0.267552581787109375E+03 + 0.263083618164062500E+03 + 0.258075958251953125E+03 + 0.252843017578125000E+03 + 0.246956115722656250E+03 + 0.240328781127929687E+03 + 0.232743484497070312E+03 + 0.224288635253906250E+03 + 0.215936080932617187E+03 + 0.210840881347656250E+03 + 0.210143768310546875E+03 + 0.208462387084960937E+03 + 0.205940200805664062E+03 + 0.201693786621093750E+03 + 0.198953125000000000E+03 + 0.194737899780273437E+03 + 0.189301940917968750E+03 +__thds + 35 + 0.306959991455078125E+03 + 0.306960021972656250E+03 + 0.306529998779296875E+03 + 0.306209960937500000E+03 + 0.305939971923828125E+03 + 0.305740020751953125E+03 + 0.305589965820312500E+03 + 0.305500000000000000E+03 + 0.305450012207031250E+03 + 0.305429992675781250E+03 + 0.305429992675781250E+03 + 0.305459991455078125E+03 + 0.305589965820312500E+03 + 0.306299987792968750E+03 + 0.307829986572265625E+03 + 0.309429992675781250E+03 + 0.311029968261718750E+03 + 0.312190032958984375E+03 + 0.313570007324218750E+03 + 0.314700012207031250E+03 + 0.315859985351562500E+03 + 0.317509979248046875E+03 + 0.319209991455078125E+03 + 0.320940002441406250E+03 + 0.322510009765625000E+03 + 0.324149963378906250E+03 + 0.327439971923828125E+03 + 0.337469970703125000E+03 + 0.357589996337890625E+03 + 0.379390014648437500E+03 + 0.403859985351562500E+03 + 0.429979980468750000E+03 + 0.465670013427734375E+03 + 0.503269989013671875E+03 + 0.541519958496093750E+03 +__ps + 35 + 0.990000000000000000E+05 + 0.979103046875000000E+05 + 0.967206328125000000E+05 + 0.954221953125000000E+05 + 0.940067812500000000E+05 + 0.924657890625000000E+05 + 0.907903359375000000E+05 + 0.889713671875000000E+05 + 0.869998593750000000E+05 + 0.848665859375000000E+05 + 0.825626484375000000E+05 + 0.800791093750000000E+05 + 0.774072031250000000E+05 + 0.745411562500000000E+05 + 0.714829531250000000E+05 + 0.682369765625000000E+05 + 0.648056328125000000E+05 + 0.611899843750000000E+05 + 0.573959570312500000E+05 + 0.534349296875000000E+05 + 0.493217070312500000E+05 + 0.450816445312500000E+05 + 0.407470156250000000E+05 + 0.363542890625000000E+05 + 0.319460332031250000E+05 + 0.275735761718750000E+05 + 0.233073164062500000E+05 + 0.192918867187500000E+05 + 0.155726064453125000E+05 + 0.123097558593750000E+05 + 0.947972363281250000E+04 + 0.707827929687500000E+04 + 0.510501708984375000E+04 + 0.360986938476562500E+04 + 0.253038891601562500E+04 +__hs + 35 + 0.000000000000000000E+00 + 0.100002868652343750E+03 + 0.210000503540039062E+03 + 0.330998321533203125E+03 + 0.464095123291015625E+03 + 0.610502075195312500E+03 + 0.771550354003906250E+03 + 0.948713012695312500E+03 + 0.114357568359375000E+04 + 0.135793383789062500E+04 + 0.159372290039062500E+04 + 0.185310449218750000E+04 + 0.213841821289062500E+04 + 0.245225878906250000E+04 + 0.279748461914062500E+04 + 0.317723657226562500E+04 + 0.359496240234375000E+04 + 0.405446093750000000E+04 + 0.455991406250000000E+04 + 0.511591503906250000E+04 + 0.572751757812500000E+04 + 0.640028662109375000E+04 + 0.714033789062500000E+04 + 0.795439843750000000E+04 + 0.884990039062500000E+04 + 0.983496484375000000E+04 + 0.109185126953125000E+05 + 0.121001347656250000E+05 + 0.134203779296875000E+05 + 0.148615781250000000E+05 + 0.164467695312500000E+05 + 0.181904414062500000E+05 + 0.201076933593750000E+05 + 0.221054843750000000E+05 + 0.241034882812500000E+05 +__ihtran + 1 + 0 +__ngrids + 1 + 1 +__nzg + 1 + 11 +__nzs + 1 + 1 +__npatch + 1 + 2 +__nvegpat + 1 + 1 +__nkppz + 1 + 48 +__ztop + 1 + 0.200100156250000000E+05 +__polelat + 1 + 0.370000000000000000E+02 +__polelon + 1 + -0.975000000000000000E+02 +__nnxp + 1 + 25 +__nnyp + 1 + 35 +__nnzp + 1 + 250 +__nstratx + 1 + 1 +__nstraty + 1 + 1 +__nxtnest + 1 + 0 +__ninest + 1 + 1 +__njnest + 1 + 1 +__nknest + 1 + 1 +__deltaxn + 1 + 0.200000000000000000E+04 +__deltazn + 1 + 0.100000000000000000E+02 +__nestz + 1 + 0 +__nstratz + 250 + 1 + 1 + 3 + 3 + 3 + 3 + 2 + 2 + 2 + 2 + 1 + 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 + 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 + 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 + 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 + 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 + 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 + 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 + 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 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 +__ngbegun + 1 + 0 +__iref + 1 + 0 +__jref + 1 + 0 +__topref + 1 + 0.000000000000000000E+00 +__xmn01 + 25 + -0.230000000000000000E+05 + -0.210000000000000000E+05 + -0.190000000000000000E+05 + -0.170000000000000000E+05 + -0.150000000000000000E+05 + -0.130000000000000000E+05 + -0.110000000000000000E+05 + -0.900000000000000000E+04 + -0.700000000000000000E+04 + -0.500000000000000000E+04 + -0.300000000000000000E+04 + -0.100000000000000000E+04 + 0.100000000000000000E+04 + 0.300000000000000000E+04 + 0.500000000000000000E+04 + 0.700000000000000000E+04 + 0.900000000000000000E+04 + 0.110000000000000000E+05 + 0.130000000000000000E+05 + 0.150000000000000000E+05 + 0.170000000000000000E+05 + 0.190000000000000000E+05 + 0.210000000000000000E+05 + 0.230000000000000000E+05 + 0.250000000000000000E+05 +__xtn01 + 25 + -0.240000000000000000E+05 + -0.220000000000000000E+05 + -0.200000000000000000E+05 + -0.180000000000000000E+05 + -0.160000000000000000E+05 + -0.140000000000000000E+05 + -0.120000000000000000E+05 + -0.100000000000000000E+05 + -0.800000000000000000E+04 + -0.600000000000000000E+04 + -0.400000000000000000E+04 + -0.200000000000000000E+04 + 0.000000000000000000E+00 + 0.200000000000000000E+04 + 0.400000000000000000E+04 + 0.600000000000000000E+04 + 0.800000000000000000E+04 + 0.100000000000000000E+05 + 0.120000000000000000E+05 + 0.140000000000000000E+05 + 0.160000000000000000E+05 + 0.180000000000000000E+05 + 0.200000000000000000E+05 + 0.220000000000000000E+05 + 0.240000000000000000E+05 +__ymn01 + 35 + -0.330000000000000000E+05 + -0.310000000000000000E+05 + -0.290000000000000000E+05 + -0.270000000000000000E+05 + -0.250000000000000000E+05 + -0.230000000000000000E+05 + -0.210000000000000000E+05 + -0.190000000000000000E+05 + -0.170000000000000000E+05 + -0.150000000000000000E+05 + -0.130000000000000000E+05 + -0.110000000000000000E+05 + -0.900000000000000000E+04 + -0.700000000000000000E+04 + -0.500000000000000000E+04 + -0.300000000000000000E+04 + -0.100000000000000000E+04 + 0.100000000000000000E+04 + 0.300000000000000000E+04 + 0.500000000000000000E+04 + 0.700000000000000000E+04 + 0.900000000000000000E+04 + 0.110000000000000000E+05 + 0.130000000000000000E+05 + 0.150000000000000000E+05 + 0.170000000000000000E+05 + 0.190000000000000000E+05 + 0.210000000000000000E+05 + 0.230000000000000000E+05 + 0.250000000000000000E+05 + 0.270000000000000000E+05 + 0.290000000000000000E+05 + 0.310000000000000000E+05 + 0.330000000000000000E+05 + 0.350000000000000000E+05 +__ytn01 + 35 + -0.340000000000000000E+05 + -0.320000000000000000E+05 + -0.300000000000000000E+05 + -0.280000000000000000E+05 + -0.260000000000000000E+05 + -0.240000000000000000E+05 + -0.220000000000000000E+05 + -0.200000000000000000E+05 + -0.180000000000000000E+05 + -0.160000000000000000E+05 + -0.140000000000000000E+05 + -0.120000000000000000E+05 + -0.100000000000000000E+05 + -0.800000000000000000E+04 + -0.600000000000000000E+04 + -0.400000000000000000E+04 + -0.200000000000000000E+04 + 0.000000000000000000E+00 + 0.200000000000000000E+04 + 0.400000000000000000E+04 + 0.600000000000000000E+04 + 0.800000000000000000E+04 + 0.100000000000000000E+05 + 0.120000000000000000E+05 + 0.140000000000000000E+05 + 0.160000000000000000E+05 + 0.180000000000000000E+05 + 0.200000000000000000E+05 + 0.220000000000000000E+05 + 0.240000000000000000E+05 + 0.260000000000000000E+05 + 0.280000000000000000E+05 + 0.300000000000000000E+05 + 0.320000000000000000E+05 + 0.340000000000000000E+05 +__zmn01 + 250 + 0.000000000000000000E+00 + 0.100000000000000000E+02 + 0.202999992370605469E+02 + 0.309089984893798828E+02 + 0.418362655639648438E+02 + 0.530913505554199219E+02 + 0.646840896606445313E+02 + 0.766246109008789063E+02 + 0.889233474731445313E+02 + 0.101591049194335937E+03 + 0.114638778686523437E+03 + 0.128077941894531250E+03 + 0.141920272827148437E+03 + 0.156177871704101562E+03 + 0.170863204956054687E+03 + 0.185989105224609375E+03 + 0.201568786621093750E+03 + 0.217615859985351562E+03 + 0.234144348144531250E+03 + 0.251168685913085937E+03 + 0.268703765869140625E+03 + 0.286764892578125000E+03 + 0.305367858886718750E+03 + 0.324528900146484375E+03 + 0.344264770507812500E+03 + 0.364592712402343750E+03 + 0.385530487060546875E+03 + 0.407096405029296875E+03 + 0.429309295654296875E+03 + 0.452188568115234375E+03 + 0.475754211425781250E+03 + 0.500026824951171875E+03 + 0.525027587890625000E+03 + 0.550778381347656250E+03 + 0.577301696777343750E+03 + 0.604620727539062500E+03 + 0.632759338378906250E+03 + 0.661742126464843750E+03 + 0.691594421386718750E+03 + 0.722342285156250000E+03 + 0.754012573242187500E+03 + 0.786632995605468750E+03 + 0.820232055664062500E+03 + 0.854839111328125000E+03 + 0.890484375000000000E+03 + 0.927198974609375000E+03 + 0.965015014648437500E+03 + 0.100396551513671875E+04 + 0.104408447265625000E+04 + 0.108540698242187500E+04 + 0.112796911621093750E+04 + 0.117180810546875000E+04 + 0.121696228027343750E+04 + 0.126347106933593750E+04 + 0.131137512207031250E+04 + 0.136071630859375000E+04 + 0.141153771972656250E+04 + 0.146388378906250000E+04 + 0.151780029296875000E+04 + 0.157333422851562500E+04 + 0.163053417968750000E+04 + 0.168945007324218750E+04 + 0.175013342285156250E+04 + 0.181263732910156250E+04 + 0.187701635742187500E+04 + 0.194332678222656250E+04 + 0.201162646484375000E+04 + 0.208197509765625000E+04 + 0.215443408203125000E+04 + 0.222906689453125000E+04 + 0.230593872070312500E+04 + 0.238511669921875000E+04 + 0.246666992187500000E+04 + 0.255066967773437500E+04 + 0.263718945312500000E+04 + 0.272630493164062500E+04 + 0.281809375000000000E+04 + 0.291263623046875000E+04 + 0.301001489257812500E+04 + 0.311001489257812500E+04 + 0.321001489257812500E+04 + 0.331001489257812500E+04 + 0.341001489257812500E+04 + 0.351001489257812500E+04 + 0.361001489257812500E+04 + 0.371001489257812500E+04 + 0.381001489257812500E+04 + 0.391001489257812500E+04 + 0.401001489257812500E+04 + 0.411001464843750000E+04 + 0.421001464843750000E+04 + 0.431001464843750000E+04 + 0.441001464843750000E+04 + 0.451001464843750000E+04 + 0.461001464843750000E+04 + 0.471001464843750000E+04 + 0.481001464843750000E+04 + 0.491001464843750000E+04 + 0.501001464843750000E+04 + 0.511001464843750000E+04 + 0.521001464843750000E+04 + 0.531001464843750000E+04 + 0.541001464843750000E+04 + 0.551001464843750000E+04 + 0.561001464843750000E+04 + 0.571001464843750000E+04 + 0.581001464843750000E+04 + 0.591001464843750000E+04 + 0.601001464843750000E+04 + 0.611001464843750000E+04 + 0.621001464843750000E+04 + 0.631001464843750000E+04 + 0.641001464843750000E+04 + 0.651001464843750000E+04 + 0.661001464843750000E+04 + 0.671001464843750000E+04 + 0.681001464843750000E+04 + 0.691001464843750000E+04 + 0.701001464843750000E+04 + 0.711001464843750000E+04 + 0.721001464843750000E+04 + 0.731001464843750000E+04 + 0.741001464843750000E+04 + 0.751001464843750000E+04 + 0.761001464843750000E+04 + 0.771001464843750000E+04 + 0.781001464843750000E+04 + 0.791001464843750000E+04 + 0.801001464843750000E+04 + 0.811001464843750000E+04 + 0.821001464843750000E+04 + 0.831001464843750000E+04 + 0.841001464843750000E+04 + 0.851001464843750000E+04 + 0.861001464843750000E+04 + 0.871001464843750000E+04 + 0.881001464843750000E+04 + 0.891001464843750000E+04 + 0.901001464843750000E+04 + 0.911001464843750000E+04 + 0.921001464843750000E+04 + 0.931001464843750000E+04 + 0.941001464843750000E+04 + 0.951001464843750000E+04 + 0.961001464843750000E+04 + 0.971001464843750000E+04 + 0.981001464843750000E+04 + 0.991001464843750000E+04 + 0.100100146484375000E+05 + 0.101100146484375000E+05 + 0.102100146484375000E+05 + 0.103100146484375000E+05 + 0.104100146484375000E+05 + 0.105100146484375000E+05 + 0.106100146484375000E+05 + 0.107100146484375000E+05 + 0.108100146484375000E+05 + 0.109100146484375000E+05 + 0.110100146484375000E+05 + 0.111100146484375000E+05 + 0.112100146484375000E+05 + 0.113100146484375000E+05 + 0.114100146484375000E+05 + 0.115100146484375000E+05 + 0.116100146484375000E+05 + 0.117100146484375000E+05 + 0.118100146484375000E+05 + 0.119100146484375000E+05 + 0.120100146484375000E+05 + 0.121100146484375000E+05 + 0.122100146484375000E+05 + 0.123100146484375000E+05 + 0.124100146484375000E+05 + 0.125100146484375000E+05 + 0.126100146484375000E+05 + 0.127100146484375000E+05 + 0.128100146484375000E+05 + 0.129100146484375000E+05 + 0.130100146484375000E+05 + 0.131100146484375000E+05 + 0.132100146484375000E+05 + 0.133100146484375000E+05 + 0.134100146484375000E+05 + 0.135100146484375000E+05 + 0.136100146484375000E+05 + 0.137100146484375000E+05 + 0.138100146484375000E+05 + 0.139100146484375000E+05 + 0.140100146484375000E+05 + 0.141100146484375000E+05 + 0.142100146484375000E+05 + 0.143100146484375000E+05 + 0.144100146484375000E+05 + 0.145100146484375000E+05 + 0.146100146484375000E+05 + 0.147100146484375000E+05 + 0.148100146484375000E+05 + 0.149100146484375000E+05 + 0.150100146484375000E+05 + 0.151100146484375000E+05 + 0.152100146484375000E+05 + 0.153100146484375000E+05 + 0.154100146484375000E+05 + 0.155100146484375000E+05 + 0.156100146484375000E+05 + 0.157100146484375000E+05 + 0.158100146484375000E+05 + 0.159100146484375000E+05 + 0.160100146484375000E+05 + 0.161100146484375000E+05 + 0.162100146484375000E+05 + 0.163100146484375000E+05 + 0.164100156250000000E+05 + 0.165100156250000000E+05 + 0.166100156250000000E+05 + 0.167100156250000000E+05 + 0.168100156250000000E+05 + 0.169100156250000000E+05 + 0.170100156250000000E+05 + 0.171100156250000000E+05 + 0.172100156250000000E+05 + 0.173100156250000000E+05 + 0.174100156250000000E+05 + 0.175100156250000000E+05 + 0.176100156250000000E+05 + 0.177100156250000000E+05 + 0.178100156250000000E+05 + 0.179100156250000000E+05 + 0.180100156250000000E+05 + 0.181100156250000000E+05 + 0.182100156250000000E+05 + 0.183100156250000000E+05 + 0.184100156250000000E+05 + 0.185100156250000000E+05 + 0.186100156250000000E+05 + 0.187100156250000000E+05 + 0.188100156250000000E+05 + 0.189100156250000000E+05 + 0.190100156250000000E+05 + 0.191100156250000000E+05 + 0.192100156250000000E+05 + 0.193100156250000000E+05 + 0.194100156250000000E+05 + 0.195100156250000000E+05 + 0.196100156250000000E+05 + 0.197100156250000000E+05 + 0.198100156250000000E+05 + 0.199100156250000000E+05 + 0.200100156250000000E+05 + 0.201100156250000000E+05 +__ztn01 + 250 + -0.489024114608764648E+01 + 0.496305179595947266E+01 + 0.151119432449340820E+02 + 0.255652999877929688E+02 + 0.363322563171386719E+02 + 0.474222221374511719E+02 + 0.588448867797851563E+02 + 0.706102294921875000E+02 + 0.827285385131835938E+02 + 0.952103958129882813E+02 + 0.108066703796386719E+03 + 0.121308708190917969E+03 + 0.134947967529296875E+03 + 0.148996398925781250E+03 + 0.163466278076171875E+03 + 0.178370269775390625E+03 + 0.193721374511718750E+03 + 0.209533035278320312E+03 + 0.225819030761718750E+03 + 0.242593612670898437E+03 + 0.259871429443359375E+03 + 0.277667602539062500E+03 + 0.295997650146484375E+03 + 0.314877593994140625E+03 + 0.334323913574218750E+03 + 0.354353637695312500E+03 + 0.374984252929687500E+03 + 0.396233764648437500E+03 + 0.418120788574218750E+03 + 0.440664398193359375E+03 + 0.463884307861328125E+03 + 0.487800842285156250E+03 + 0.512434814453125000E+03 + 0.537807861328125000E+03 + 0.563942016601562500E+03 + 0.590860290527343750E+03 + 0.618586059570312500E+03 + 0.647143615722656250E+03 + 0.676557983398437500E+03 + 0.706854736328125000E+03 + 0.738060424804687500E+03 + 0.770202270507812500E+03 + 0.803308410644531250E+03 + 0.837407714843750000E+03 + 0.872530029296875000E+03 + 0.908706054687500000E+03 + 0.945967285156250000E+03 + 0.984346374511718750E+03 + 0.102387677001953125E+04 + 0.106459301757812500E+04 + 0.110653076171875000E+04 + 0.114972668457031250E+04 + 0.119421838378906250E+04 + 0.124004479980468750E+04 + 0.128724609375000000E+04 + 0.133586340332031250E+04 + 0.138593920898437500E+04 + 0.143751733398437500E+04 + 0.149064282226562500E+04 + 0.154536206054687500E+04 + 0.160172290039062500E+04 + 0.165977441406250000E+04 + 0.171956750488281250E+04 + 0.178115441894531250E+04 + 0.184458898925781250E+04 + 0.190992651367187500E+04 + 0.197722424316406250E+04 + 0.204654089355468750E+04 + 0.211793676757812500E+04 + 0.219147460937500000E+04 + 0.226721875000000000E+04 + 0.234523510742187500E+04 + 0.242559204101562500E+04 + 0.250835937500000000E+04 + 0.259360986328125000E+04 + 0.268141796875000000E+04 + 0.277186010742187500E+04 + 0.286501562500000000E+04 + 0.296098388671875000E+04 + 0.305984887695312500E+04 + 0.316001489257812500E+04 + 0.326001489257812500E+04 + 0.336001489257812500E+04 + 0.346001489257812500E+04 + 0.356001489257812500E+04 + 0.366001489257812500E+04 + 0.376001489257812500E+04 + 0.386001489257812500E+04 + 0.396001489257812500E+04 + 0.406001464843750000E+04 + 0.416001464843750000E+04 + 0.426001464843750000E+04 + 0.436001464843750000E+04 + 0.446001464843750000E+04 + 0.456001464843750000E+04 + 0.466001464843750000E+04 + 0.476001464843750000E+04 + 0.486001464843750000E+04 + 0.496001464843750000E+04 + 0.506001464843750000E+04 + 0.516001464843750000E+04 + 0.526001464843750000E+04 + 0.536001464843750000E+04 + 0.546001464843750000E+04 + 0.556001464843750000E+04 + 0.566001464843750000E+04 + 0.576001464843750000E+04 + 0.586001464843750000E+04 + 0.596001464843750000E+04 + 0.606001464843750000E+04 + 0.616001464843750000E+04 + 0.626001464843750000E+04 + 0.636001464843750000E+04 + 0.646001464843750000E+04 + 0.656001464843750000E+04 + 0.666001464843750000E+04 + 0.676001464843750000E+04 + 0.686001464843750000E+04 + 0.696001464843750000E+04 + 0.706001464843750000E+04 + 0.716001464843750000E+04 + 0.726001464843750000E+04 + 0.736001464843750000E+04 + 0.746001464843750000E+04 + 0.756001464843750000E+04 + 0.766001464843750000E+04 + 0.776001464843750000E+04 + 0.786001464843750000E+04 + 0.796001464843750000E+04 + 0.806001464843750000E+04 + 0.816001464843750000E+04 + 0.826001464843750000E+04 + 0.836001464843750000E+04 + 0.846001464843750000E+04 + 0.856001464843750000E+04 + 0.866001464843750000E+04 + 0.876001464843750000E+04 + 0.886001464843750000E+04 + 0.896001464843750000E+04 + 0.906001464843750000E+04 + 0.916001464843750000E+04 + 0.926001464843750000E+04 + 0.936001464843750000E+04 + 0.946001464843750000E+04 + 0.956001464843750000E+04 + 0.966001464843750000E+04 + 0.976001464843750000E+04 + 0.986001464843750000E+04 + 0.996001464843750000E+04 + 0.100600146484375000E+05 + 0.101600146484375000E+05 + 0.102600146484375000E+05 + 0.103600146484375000E+05 + 0.104600146484375000E+05 + 0.105600146484375000E+05 + 0.106600146484375000E+05 + 0.107600146484375000E+05 + 0.108600146484375000E+05 + 0.109600146484375000E+05 + 0.110600146484375000E+05 + 0.111600146484375000E+05 + 0.112600146484375000E+05 + 0.113600146484375000E+05 + 0.114600146484375000E+05 + 0.115600146484375000E+05 + 0.116600146484375000E+05 + 0.117600146484375000E+05 + 0.118600146484375000E+05 + 0.119600146484375000E+05 + 0.120600146484375000E+05 + 0.121600146484375000E+05 + 0.122600146484375000E+05 + 0.123600146484375000E+05 + 0.124600146484375000E+05 + 0.125600146484375000E+05 + 0.126600146484375000E+05 + 0.127600146484375000E+05 + 0.128600146484375000E+05 + 0.129600146484375000E+05 + 0.130600146484375000E+05 + 0.131600146484375000E+05 + 0.132600146484375000E+05 + 0.133600146484375000E+05 + 0.134600146484375000E+05 + 0.135600146484375000E+05 + 0.136600146484375000E+05 + 0.137600146484375000E+05 + 0.138600146484375000E+05 + 0.139600146484375000E+05 + 0.140600146484375000E+05 + 0.141600146484375000E+05 + 0.142600146484375000E+05 + 0.143600146484375000E+05 + 0.144600146484375000E+05 + 0.145600146484375000E+05 + 0.146600146484375000E+05 + 0.147600146484375000E+05 + 0.148600146484375000E+05 + 0.149600146484375000E+05 + 0.150600146484375000E+05 + 0.151600146484375000E+05 + 0.152600146484375000E+05 + 0.153600146484375000E+05 + 0.154600146484375000E+05 + 0.155600146484375000E+05 + 0.156600146484375000E+05 + 0.157600146484375000E+05 + 0.158600146484375000E+05 + 0.159600146484375000E+05 + 0.160600146484375000E+05 + 0.161600146484375000E+05 + 0.162600146484375000E+05 + 0.163600156250000000E+05 + 0.164600156250000000E+05 + 0.165600156250000000E+05 + 0.166600156250000000E+05 + 0.167600156250000000E+05 + 0.168600156250000000E+05 + 0.169600156250000000E+05 + 0.170600156250000000E+05 + 0.171600156250000000E+05 + 0.172600156250000000E+05 + 0.173600156250000000E+05 + 0.174600156250000000E+05 + 0.175600156250000000E+05 + 0.176600156250000000E+05 + 0.177600156250000000E+05 + 0.178600156250000000E+05 + 0.179600156250000000E+05 + 0.180600156250000000E+05 + 0.181600156250000000E+05 + 0.182600156250000000E+05 + 0.183600156250000000E+05 + 0.184600156250000000E+05 + 0.185600156250000000E+05 + 0.186600156250000000E+05 + 0.187600156250000000E+05 + 0.188600156250000000E+05 + 0.189600156250000000E+05 + 0.190600156250000000E+05 + 0.191600156250000000E+05 + 0.192600156250000000E+05 + 0.193600156250000000E+05 + 0.194600156250000000E+05 + 0.195600156250000000E+05 + 0.196600156250000000E+05 + 0.197600156250000000E+05 + 0.198600156250000000E+05 + 0.199600156250000000E+05 + 0.200600156250000000E+05 +__dzmn01 + 250 + 0.101488918066024780E+00 + 0.985329300165176392E-01 + 0.956630483269691467E-01 + 0.928767547011375427E-01 + 0.901716053485870361E-01 + 0.875452458858489990E-01 + 0.849953964352607727E-01 + 0.825197622179985046E-01 + 0.801162794232368469E-01 + 0.777828320860862732E-01 + 0.755172669887542725E-01 + 0.733177661895751953E-01 + 0.711823254823684692E-01 + 0.691090747714042664E-01 + 0.670961216092109680E-01 + 0.651418939232826233E-01 + 0.632444620132446289E-01 + 0.614024475216865540E-01 + 0.596140027046203613E-01 + 0.578776821494102478E-01 + 0.561918579041957855E-01 + 0.545552335679531097E-01 + 0.529662594199180603E-01 + 0.514236129820346832E-01 + 0.499258004128932953E-01 + 0.484716519713401794E-01 + 0.470599047839641571E-01 + 0.456891730427742004E-01 + 0.443584695458412170E-01 + 0.430664904415607452E-01 + 0.418120771646499634E-01 + 0.405943468213081360E-01 + 0.394118987023830414E-01 + 0.382641032338142395E-01 + 0.371494852006435394E-01 + 0.360675305128097534E-01 + 0.350170023739337921E-01 + 0.339969918131828308E-01 + 0.330068357288837433E-01 + 0.320454388856887817E-01 + 0.311120897531509399E-01 + 0.302058774977922440E-01 + 0.293261110782623291E-01 + 0.284719280898571014E-01 + 0.276426170021295547E-01 + 0.268375463783740997E-01 + 0.260558556765317917E-01 + 0.252969898283481598E-01 + 0.245602205395698547E-01 + 0.238448679447174072E-01 + 0.231503322720527649E-01 + 0.224761031568050385E-01 + 0.218214746564626694E-01 + 0.211858600378036499E-01 + 0.205688066780567169E-01 + 0.199697241187095642E-01 + 0.193880647420883179E-01 + 0.188233572989702225E-01 + 0.182751081883907318E-01 + 0.177428163588047028E-01 + 0.172260794788599014E-01 + 0.167243406176567078E-01 + 0.162372160702943802E-01 + 0.157642755657434464E-01 + 0.153051409870386124E-01 + 0.148593420162796974E-01 + 0.144265480339527130E-01 + 0.140064116567373276E-01 + 0.135984411463141441E-01 + 0.132023412734270096E-01 + 0.128178251907229424E-01 + 0.124444765970110893E-01 + 0.120820617303252220E-01 + 0.117301382124423981E-01 + 0.113884704187512398E-01 + 0.110567929223179817E-01 + 0.107347369194030762E-01 + 0.104201119393110275E-01 + 0.101148039102554321E-01 + 0.998342595994472504E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.100000239908695221E-01 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999990198761224747E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 +__dztn01 + 250 + 0.103000000119209290E+00 + 0.100000001490116119E+00 + 0.970873832702636719E-01 + 0.942595973610877991E-01 + 0.915141925215721130E-01 + 0.888487324118614197E-01 + 0.862608924508094788E-01 + 0.837484374642372131E-01 + 0.813091620802879333E-01 + 0.789409205317497253E-01 + 0.766416862607002258E-01 + 0.744093954563140869E-01 + 0.722421705722808838E-01 + 0.701380372047424316E-01 + 0.680951550602912903E-01 + 0.661117658019065857E-01 + 0.641861632466316223E-01 + 0.623166598379611969E-01 + 0.605016015470027924E-01 + 0.587394349277019501E-01 + 0.570285394787788391E-01 + 0.553675331175327301E-01 + 0.537548698484897614E-01 + 0.521892309188842773E-01 + 0.506691597402095795E-01 + 0.491933710873126984E-01 + 0.477605685591697693E-01 + 0.463694632053375244E-01 + 0.450189039111137390E-01 + 0.437076836824417114E-01 + 0.424346588551998138E-01 + 0.411986932158470154E-01 + 0.399987809360027313E-01 + 0.388337559998035431E-01 + 0.377026759088039398E-01 + 0.366045199334621429E-01 + 0.355383567512035370E-01 + 0.345032364130020142E-01 + 0.334982611238956451E-01 + 0.325225852429866791E-01 + 0.315753370523452759E-01 + 0.306556429713964462E-01 + 0.297627374529838562E-01 + 0.288958419114351273E-01 + 0.280542187392711639E-01 + 0.272371210157871246E-01 + 0.264438055455684662E-01 + 0.256736110895872116E-01 + 0.249258726835250854E-01 + 0.241998862475156784E-01 + 0.234950631856918335E-01 + 0.228107441216707230E-01 + 0.221463460475206375E-01 + 0.215013120323419571E-01 + 0.208750609308481216E-01 + 0.202670432627201080E-01 + 0.196767468005418777E-01 + 0.191036313772201538E-01 + 0.185471959412097931E-01 + 0.180070083588361740E-01 + 0.174825321882963181E-01 + 0.169733483344316483E-01 + 0.164789855480194092E-01 + 0.159990005195140839E-01 + 0.155330086126923561E-01 + 0.150805851444602013E-01 + 0.146413566544651985E-01 + 0.142149170860648155E-01 + 0.138009106740355492E-01 + 0.133989322930574417E-01 + 0.130086671561002731E-01 + 0.126297743991017342E-01 + 0.122619308531284332E-01 + 0.119047965854406357E-01 + 0.115580512210726738E-01 + 0.112213948741555214E-01 + 0.108945732936263084E-01 + 0.105772558599710464E-01 + 0.102691901847720146E-01 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.100000239908695221E-01 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999990198761224747E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 +__u01dn01 + 250 + -0.271000003814697266E+01 + -0.271000003814697266E+01 + -0.271000003814697266E+01 + -0.271000003814697266E+01 + -0.271000003814697266E+01 + -0.271000003814697266E+01 + -0.271000003814697266E+01 + -0.271000003814697266E+01 + -0.271000003814697266E+01 + -0.271000003814697266E+01 + -0.277084660530090332E+01 + -0.287076568603515625E+01 + -0.297368240356445313E+01 + -0.307968640327453613E+01 + -0.318887066841125488E+01 + -0.330133032798767090E+01 + -0.341716384887695313E+01 + -0.353647255897521973E+01 + -0.352038979530334473E+01 + -0.349959468841552734E+01 + -0.347817540168762207E+01 + -0.345611381530761719E+01 + -0.343339014053344727E+01 + -0.340998482704162598E+01 + -0.337475848197937012E+01 + -0.328295969963073730E+01 + -0.318840670585632324E+01 + -0.309101748466491699E+01 + -0.299070644378662109E+01 + -0.288738608360290527E+01 + -0.278096628189086914E+01 + -0.261160659790039063E+01 + -0.243661952018737793E+01 + -0.225638246536254883E+01 + -0.207073879241943359E+01 + -0.187952518463134766E+01 + -0.167072951793670654E+01 + -0.142602384090423584E+01 + -0.117397618293762207E+01 + -0.914367675781250000E+00 + -0.646970510482788086E+00 + -0.371551632881164551E+00 + -0.713925063610076904E-01 + 0.238491535186767578E+00 + 0.557672321796417236E+00 + 0.886429071426391602E+00 + 0.122504770755767822E+01 + 0.155904006958007813E+01 + 0.190187835693359375E+01 + 0.225500106811523438E+01 + 0.261871767044067383E+01 + 0.298705983161926270E+01 + 0.332745456695556641E+01 + 0.367806077003479004E+01 + 0.403918600082397461E+01 + 0.441114473342895508E+01 + 0.475697183609008789E+01 + 0.508290481567382813E+01 + 0.541861581802368164E+01 + 0.576439809799194336E+01 + 0.610793638229370117E+01 + 0.638321971893310547E+01 + 0.666676139831542969E+01 + 0.695880937576293945E+01 + 0.725961923599243164E+01 + 0.754496240615844727E+01 + 0.783508586883544922E+01 + 0.813391304016113281E+01 + 0.844170379638671875E+01 + 0.872272300720214844E+01 + 0.899785709381103516E+01 + 0.928124523162841797E+01 + 0.957313537597656250E+01 + 0.986987972259521484E+01 + 0.101736173629760742E+02 + 0.104864673614501953E+02 + 0.108087024688720703E+02 + 0.111116161346435547E+02 + 0.114123449325561523E+02 + 0.117221508026123047E+02 + 0.120360336303710938E+02 + 0.122386236190795898E+02 + 0.124181671142578125E+02 + 0.125977106094360352E+02 + 0.127772541046142578E+02 + 0.131642017364501953E+02 + 0.136625709533691406E+02 + 0.141609401702880859E+02 + 0.146593103408813477E+02 + 0.151472501754760742E+02 + 0.154578628540039063E+02 + 0.157684755325317383E+02 + 0.160790882110595703E+02 + 0.163896999359130859E+02 + 0.167001209259033203E+02 + 0.168188247680664063E+02 + 0.169375305175781250E+02 + 0.170562343597412109E+02 + 0.171749401092529297E+02 + 0.172936439514160156E+02 + 0.173657684326171875E+02 + 0.173788490295410156E+02 + 0.173919296264648438E+02 + 0.174050102233886719E+02 + 0.174180908203125000E+02 + 0.174311714172363281E+02 + 0.174206790924072266E+02 + 0.173612232208251953E+02 + 0.173017673492431641E+02 + 0.172423114776611328E+02 + 0.171828556060791016E+02 + 0.171233997344970703E+02 + 0.170639457702636719E+02 + 0.170230522155761719E+02 + 0.169946746826171875E+02 + 0.169662990570068359E+02 + 0.169379234313964844E+02 + 0.169095458984375000E+02 + 0.168811702728271484E+02 + 0.168527927398681641E+02 + 0.168355598449707031E+02 + 0.168638134002685547E+02 + 0.168920669555664063E+02 + 0.169203186035156250E+02 + 0.169485721588134766E+02 + 0.169768257141113281E+02 + 0.170050792694091797E+02 + 0.170333328247070313E+02 + 0.170682773590087891E+02 + 0.172156810760498047E+02 + 0.173630847930908203E+02 + 0.175104885101318359E+02 + 0.176578903198242188E+02 + 0.178052940368652344E+02 + 0.179526977539062500E+02 + 0.181001014709472656E+02 + 0.182475051879882813E+02 + 0.184006366729736328E+02 + 0.186046848297119141E+02 + 0.188087329864501953E+02 + 0.190127792358398438E+02 + 0.192168273925781250E+02 + 0.194208755493164063E+02 + 0.196249217987060547E+02 + 0.198289699554443359E+02 + 0.200330181121826172E+02 + 0.202370643615722656E+02 + 0.204575042724609375E+02 + 0.207269897460937500E+02 + 0.209964752197265625E+02 + 0.212659606933593750E+02 + 0.215354461669921875E+02 + 0.218049297332763672E+02 + 0.220744152069091797E+02 + 0.223439006805419922E+02 + 0.226133861541748047E+02 + 0.228828697204589844E+02 + 0.231523551940917969E+02 + 0.234810485839843750E+02 + 0.238931922912597656E+02 + 0.243053379058837891E+02 + 0.247174835205078125E+02 + 0.251296291351318359E+02 + 0.255417747497558594E+02 + 0.259539203643798828E+02 + 0.263660659790039063E+02 + 0.267782115936279297E+02 + 0.271903572082519531E+02 + 0.276025009155273438E+02 + 0.280146465301513672E+02 + 0.280276069641113281E+02 + 0.277731075286865234E+02 + 0.275186100006103516E+02 + 0.272641105651855469E+02 + 0.270096130371093750E+02 + 0.267551136016845703E+02 + 0.265006141662597656E+02 + 0.262461166381835938E+02 + 0.259916172027587891E+02 + 0.257371196746826172E+02 + 0.254826202392578125E+02 + 0.252281227111816406E+02 + 0.249736232757568359E+02 + 0.247190647125244141E+02 + 0.244644165039062500E+02 + 0.242097682952880859E+02 + 0.239551181793212891E+02 + 0.237004699707031250E+02 + 0.234458217620849609E+02 + 0.231911716461181641E+02 + 0.229365234375000000E+02 + 0.226818733215332031E+02 + 0.224272251129150391E+02 + 0.221725769042968750E+02 + 0.219179267883300781E+02 + 0.216632785797119141E+02 + 0.214086303710937500E+02 + 0.211539802551269531E+02 + 0.209239654541015625E+02 + 0.206943397521972656E+02 + 0.204647140502929688E+02 + 0.202350883483886719E+02 + 0.200054626464843750E+02 + 0.197758388519287109E+02 + 0.195462131500244141E+02 + 0.193165874481201172E+02 + 0.190869636535644531E+02 + 0.188573379516601563E+02 + 0.186277122497558594E+02 + 0.183980865478515625E+02 + 0.181684608459472656E+02 + 0.179388370513916016E+02 + 0.177092094421386719E+02 + 0.174503669738769531E+02 + 0.170001678466796875E+02 + 0.165499668121337891E+02 + 0.160997676849365234E+02 + 0.156495685577392578E+02 + 0.151993694305419922E+02 + 0.147491703033447266E+02 + 0.142989702224731445E+02 + 0.138487710952758789E+02 + 0.133985719680786133E+02 + 0.129483718872070313E+02 + 0.124981727600097656E+02 + 0.120479736328125000E+02 + 0.115977745056152344E+02 + 0.111475753784179688E+02 + 0.106973752975463867E+02 + 0.102471752166748047E+02 + 0.979697608947753906E+01 + 0.938239288330078125E+01 + 0.898338413238525391E+01 + 0.858437538146972656E+01 + 0.818536758422851563E+01 + 0.778635835647583008E+01 + 0.738735008239746094E+01 + 0.698834133148193359E+01 + 0.658933258056640625E+01 + 0.619032430648803711E+01 + 0.579131603240966797E+01 + 0.539230728149414063E+01 + 0.499329853057861328E+01 + 0.459428977966308594E+01 + 0.419528150558471680E+01 + 0.379627275466918945E+01 + 0.339726400375366211E+01 + 0.299825572967529297E+01 + 0.259924697875976563E+01 + 0.220023870468139648E+01 +__v01dn01 + 250 + 0.838000011444091797E+01 + 0.838000011444091797E+01 + 0.838000011444091797E+01 + 0.838000011444091797E+01 + 0.838000011444091797E+01 + 0.838000011444091797E+01 + 0.838000011444091797E+01 + 0.838000011444091797E+01 + 0.838000011444091797E+01 + 0.838000011444091797E+01 + 0.854714488983154297E+01 + 0.882162189483642578E+01 + 0.910433197021484375E+01 + 0.939552402496337891E+01 + 0.969545173645019531E+01 + 0.100043773651123047E+02 + 0.103225708007812500E+02 + 0.106503105163574219E+02 + 0.108678665161132813E+02 + 0.110882968902587891E+02 + 0.113153400421142578E+02 + 0.115491952896118164E+02 + 0.117900657653808594E+02 + 0.120381622314453125E+02 + 0.122802333831787109E+02 + 0.124623260498046875E+02 + 0.126498813629150391E+02 + 0.128430633544921875E+02 + 0.130420417785644531E+02 + 0.132469882965087891E+02 + 0.134580831527709961E+02 + 0.135895338058471680E+02 + 0.137241392135620117E+02 + 0.138627824783325195E+02 + 0.140055856704711914E+02 + 0.141526727676391602E+02 + 0.142790746688842773E+02 + 0.143464574813842773E+02 + 0.144158620834350586E+02 + 0.144873485565185547E+02 + 0.145609798431396484E+02 + 0.146368198394775391E+02 + 0.146435852050781250E+02 + 0.146474351882934570E+02 + 0.146513996124267578E+02 + 0.146554832458496094E+02 + 0.146596899032592773E+02 + 0.146142835617065430E+02 + 0.145635681152343750E+02 + 0.145113306045532227E+02 + 0.144575271606445313E+02 + 0.143990955352783203E+02 + 0.143202238082885742E+02 + 0.142389860153198242E+02 + 0.141553106307983398E+02 + 0.140691251754760742E+02 + 0.139931802749633789E+02 + 0.139253683090209961E+02 + 0.138555231094360352E+02 + 0.137835817337036133E+02 + 0.137169160842895508E+02 + 0.136945352554321289E+02 + 0.136714830398559570E+02 + 0.136477394104003906E+02 + 0.136232824325561523E+02 + 0.136618223190307617E+02 + 0.137113561630249023E+02 + 0.137623748779296875E+02 + 0.138149251937866211E+02 + 0.139026937484741211E+02 + 0.140064725875854492E+02 + 0.141133642196655273E+02 + 0.142234630584716797E+02 + 0.144566297531127930E+02 + 0.147554292678833008E+02 + 0.150631923675537109E+02 + 0.153801879882812500E+02 + 0.155695848464965820E+02 + 0.157111043930053711E+02 + 0.158568954467773438E+02 + 0.160046043395996094E+02 + 0.165927867889404297E+02 + 0.172726593017578125E+02 + 0.179525299072265625E+02 + 0.186324024200439453E+02 + 0.189011459350585938E+02 + 0.189490242004394531E+02 + 0.189969024658203125E+02 + 0.190447807312011719E+02 + 0.190846157073974609E+02 + 0.189876728057861328E+02 + 0.188907318115234375E+02 + 0.187937889099121094E+02 + 0.186968460083007813E+02 + 0.186000556945800781E+02 + 0.186558113098144531E+02 + 0.187115669250488281E+02 + 0.187673225402832031E+02 + 0.188230781555175781E+02 + 0.188788318634033203E+02 + 0.189871520996093750E+02 + 0.191621017456054688E+02 + 0.193370532989501953E+02 + 0.195120029449462891E+02 + 0.196869525909423828E+02 + 0.198619022369384766E+02 + 0.200379638671875000E+02 + 0.202163314819335938E+02 + 0.203946990966796875E+02 + 0.205730667114257813E+02 + 0.207514343261718750E+02 + 0.209298000335693359E+02 + 0.211081676483154297E+02 + 0.212155113220214844E+02 + 0.212749671936035156E+02 + 0.213344230651855469E+02 + 0.213938789367675781E+02 + 0.214533329010009766E+02 + 0.215127887725830078E+02 + 0.215722446441650391E+02 + 0.216253185272216797E+02 + 0.216523437500000000E+02 + 0.216793689727783203E+02 + 0.217063941955566406E+02 + 0.217334175109863281E+02 + 0.217604427337646484E+02 + 0.217874679565429688E+02 + 0.218144931793212891E+02 + 0.218431358337402344E+02 + 0.218989696502685547E+02 + 0.219548053741455078E+02 + 0.220106391906738281E+02 + 0.220664749145507813E+02 + 0.221223087310791016E+02 + 0.221781444549560547E+02 + 0.222339782714843750E+02 + 0.222898120880126953E+02 + 0.223436965942382813E+02 + 0.223802433013916016E+02 + 0.224167881011962891E+02 + 0.224533348083496094E+02 + 0.224898796081542969E+02 + 0.225264263153076172E+02 + 0.225629711151123047E+02 + 0.225995178222656250E+02 + 0.226360645294189453E+02 + 0.226726093292236328E+02 + 0.227009258270263672E+02 + 0.227046165466308594E+02 + 0.227083091735839844E+02 + 0.227119998931884766E+02 + 0.227156906127929688E+02 + 0.227193832397460938E+02 + 0.227230739593505859E+02 + 0.227267665863037109E+02 + 0.227304573059082031E+02 + 0.227341480255126953E+02 + 0.227378406524658203E+02 + 0.226381435394287109E+02 + 0.223927173614501953E+02 + 0.221472930908203125E+02 + 0.219018669128417969E+02 + 0.216564426422119141E+02 + 0.214110164642333984E+02 + 0.211655921936035156E+02 + 0.209201660156250000E+02 + 0.206747417449951172E+02 + 0.204293155670166016E+02 + 0.201838912963867188E+02 + 0.199384651184082031E+02 + 0.197638034820556641E+02 + 0.196365547180175781E+02 + 0.195093040466308594E+02 + 0.193820552825927734E+02 + 0.192548065185546875E+02 + 0.191275577545166016E+02 + 0.190003070831298828E+02 + 0.188730583190917969E+02 + 0.187458095550537109E+02 + 0.186185588836669922E+02 + 0.184913101196289063E+02 + 0.183640613555908203E+02 + 0.182368125915527344E+02 + 0.181052703857421875E+02 + 0.179671897888183594E+02 + 0.178291110992431641E+02 + 0.176910324096679688E+02 + 0.175529518127441406E+02 + 0.174148731231689453E+02 + 0.172767944335937500E+02 + 0.171387138366699219E+02 + 0.170006351470947266E+02 + 0.168625564575195313E+02 + 0.167244758605957031E+02 + 0.165863971710205078E+02 + 0.164483184814453125E+02 + 0.163102378845214844E+02 + 0.161721591949462891E+02 + 0.159048433303833008E+02 + 0.156354751586914063E+02 + 0.153661069869995117E+02 + 0.150967388153076172E+02 + 0.148273706436157227E+02 + 0.145580024719238281E+02 + 0.142886343002319336E+02 + 0.140192661285400391E+02 + 0.137498989105224609E+02 + 0.134805297851562500E+02 + 0.132111625671386719E+02 + 0.129417934417724609E+02 + 0.126724262237548828E+02 + 0.124030580520629883E+02 + 0.121336870193481445E+02 + 0.118741712570190430E+02 + 0.116791801452636719E+02 + 0.114841890335083008E+02 + 0.112891988754272461E+02 + 0.110942077636718750E+02 + 0.108992166519165039E+02 + 0.107042264938354492E+02 + 0.105092353820800781E+02 + 0.103142442703247070E+02 + 0.101192541122436523E+02 + 0.992426300048828125E+01 + 0.972927188873291016E+01 + 0.953428173065185547E+01 + 0.933929061889648438E+01 + 0.914429950714111328E+01 + 0.894930934906005859E+01 + 0.875431823730468750E+01 + 0.855932712554931641E+01 + 0.831746864318847656E+01 + 0.805511379241943359E+01 + 0.779275941848754883E+01 + 0.753040504455566406E+01 + 0.726805019378662109E+01 + 0.700569534301757813E+01 + 0.674334096908569336E+01 + 0.648098659515380859E+01 + 0.621863174438476563E+01 + 0.595627689361572266E+01 + 0.569392204284667969E+01 + 0.543156766891479492E+01 + 0.516921281814575195E+01 + 0.490685844421386719E+01 + 0.464450359344482422E+01 + 0.438214921951293945E+01 + 0.411979436874389648E+01 + 0.385743951797485352E+01 + 0.359508514404296875E+01 +__pi01dn01 + 250 + 0.100127435302734375E+04 + 0.100096276855468750E+04 + 0.100064184570312500E+04 + 0.100031127929687500E+04 + 0.999970764160156250E+03 + 0.999620056152343750E+03 + 0.999258850097656250E+03 + 0.998886779785156250E+03 + 0.998503540039062500E+03 + 0.998108764648437500E+03 + 0.997702148437500000E+03 + 0.997283264160156250E+03 + 0.996851745605468750E+03 + 0.996407165527343750E+03 + 0.995949157714843750E+03 + 0.995477355957031250E+03 + 0.994991271972656250E+03 + 0.994490539550781250E+03 + 0.993974670410156250E+03 + 0.993443237304687500E+03 + 0.992895751953125000E+03 + 0.992331726074218750E+03 + 0.991750732421875000E+03 + 0.991152160644531250E+03 + 0.990535522460937500E+03 + 0.989900268554687500E+03 + 0.989245849609375000E+03 + 0.988571716308593750E+03 + 0.987877258300781250E+03 + 0.987161804199218750E+03 + 0.986424743652343750E+03 + 0.985665466308593750E+03 + 0.984883300781250000E+03 + 0.984077575683593750E+03 + 0.983247558593750000E+03 + 0.982392517089843750E+03 + 0.981511657714843750E+03 + 0.980604248046875000E+03 + 0.979669494628906250E+03 + 0.978706604003906250E+03 + 0.977714660644531250E+03 + 0.976692871093750000E+03 + 0.975640258789062500E+03 + 0.974555969238281250E+03 + 0.973439025878906250E+03 + 0.972288452148437500E+03 + 0.971103271484375000E+03 + 0.969882385253906250E+03 + 0.968624755859375000E+03 + 0.967329284667968750E+03 + 0.965994873046875000E+03 + 0.964620300292968750E+03 + 0.963204345703125000E+03 + 0.961745849609375000E+03 + 0.960243469238281250E+03 + 0.958695861816406250E+03 + 0.957101684570312500E+03 + 0.955459594726562500E+03 + 0.953768066406250000E+03 + 0.952025695800781250E+03 + 0.950230895996093750E+03 + 0.948382080078125000E+03 + 0.946477539062500000E+03 + 0.944515625000000000E+03 + 0.942494628906250000E+03 + 0.940412597656250000E+03 + 0.938267517089843750E+03 + 0.936057495117187500E+03 + 0.933780517578125000E+03 + 0.931434814453125000E+03 + 0.929018859863281250E+03 + 0.926530639648437500E+03 + 0.923968017578125000E+03 + 0.921329467773437500E+03 + 0.918613830566406250E+03 + 0.915819274902343750E+03 + 0.912943603515625000E+03 + 0.909984741210937500E+03 + 0.906940002441406250E+03 + 0.903807189941406250E+03 + 0.900637023925781250E+03 + 0.897475952148437500E+03 + 0.894318542480468750E+03 + 0.891164794921875000E+03 + 0.888014648437500000E+03 + 0.884867736816406250E+03 + 0.881723388671875000E+03 + 0.878581359863281250E+03 + 0.875441650390625000E+03 + 0.872304260253906250E+03 + 0.869169372558593750E+03 + 0.866037109375000000E+03 + 0.862907470703125000E+03 + 0.859780456542968750E+03 + 0.856656066894531250E+03 + 0.853533996582031250E+03 + 0.850413879394531250E+03 + 0.847295715332031250E+03 + 0.844179565429687500E+03 + 0.841065368652343750E+03 + 0.837953063964843750E+03 + 0.834842590332031250E+03 + 0.831733947753906250E+03 + 0.828627075195312500E+03 + 0.825522033691406250E+03 + 0.822418762207031250E+03 + 0.819317382812500000E+03 + 0.816218139648437500E+03 + 0.813121276855468750E+03 + 0.810026733398437500E+03 + 0.806934509277343750E+03 + 0.803844604492187500E+03 + 0.800757019042968750E+03 + 0.797671752929687500E+03 + 0.794588684082031250E+03 + 0.791507812500000000E+03 + 0.788429077148437500E+03 + 0.785352539062500000E+03 + 0.782278137207031250E+03 + 0.779205932617187500E+03 + 0.776135864257812500E+03 + 0.773067871093750000E+03 + 0.770001892089843750E+03 + 0.766937866210937500E+03 + 0.763875854492187500E+03 + 0.760815856933593750E+03 + 0.757757812500000000E+03 + 0.754701782226562500E+03 + 0.751647705078125000E+03 + 0.748595458984375000E+03 + 0.745544860839843750E+03 + 0.742495910644531250E+03 + 0.739448547363281250E+03 + 0.736402832031250000E+03 + 0.733358764648437500E+03 + 0.730316345214843750E+03 + 0.727275573730468750E+03 + 0.724236389160156250E+03 + 0.721198791503906250E+03 + 0.718162780761718750E+03 + 0.715128295898437500E+03 + 0.712095397949218750E+03 + 0.709064025878906250E+03 + 0.706034179687500000E+03 + 0.703005920410156250E+03 + 0.699979187011718750E+03 + 0.696953979492187500E+03 + 0.693930480957031250E+03 + 0.690909362792968750E+03 + 0.687891052246093750E+03 + 0.684875549316406250E+03 + 0.681862854003906250E+03 + 0.678852966308593750E+03 + 0.675845886230468750E+03 + 0.672841613769531250E+03 + 0.669840148925781250E+03 + 0.666841430664062500E+03 + 0.663845520019531250E+03 + 0.660853393554687500E+03 + 0.657867553710937500E+03 + 0.654889465332031250E+03 + 0.651919006347656250E+03 + 0.648956176757812500E+03 + 0.646000915527343750E+03 + 0.643053222656250000E+03 + 0.640113037109375000E+03 + 0.637180297851562500E+03 + 0.634255004882812500E+03 + 0.631337097167968750E+03 + 0.628426513671875000E+03 + 0.625525024414062500E+03 + 0.622635375976562500E+03 + 0.619758666992187500E+03 + 0.616894775390625000E+03 + 0.614043579101562500E+03 + 0.611204956054687500E+03 + 0.608378845214843750E+03 + 0.605565063476562500E+03 + 0.602763549804687500E+03 + 0.599974182128906250E+03 + 0.597196899414062500E+03 + 0.594431518554687500E+03 + 0.591677978515625000E+03 + 0.588936157226562500E+03 + 0.586205932617187500E+03 + 0.583487182617187500E+03 + 0.580779785156250000E+03 + 0.578083679199218750E+03 + 0.575398742675781250E+03 + 0.572724853515625000E+03 + 0.570061950683593750E+03 + 0.567409973144531250E+03 + 0.564768798828125000E+03 + 0.562138366699218750E+03 + 0.559518554687500000E+03 + 0.556909301757812500E+03 + 0.554310485839843750E+03 + 0.551722045898437500E+03 + 0.549144042968750000E+03 + 0.546576477050781250E+03 + 0.544019226074218750E+03 + 0.541472229003906250E+03 + 0.538935424804687500E+03 + 0.536408691406250000E+03 + 0.533891967773437500E+03 + 0.531385192871093750E+03 + 0.528888305664062500E+03 + 0.526401184082031250E+03 + 0.523923767089843750E+03 + 0.521455993652343750E+03 + 0.518997741699218750E+03 + 0.516549011230468750E+03 + 0.514109680175781250E+03 + 0.511679656982421875E+03 + 0.509258758544921875E+03 + 0.506846771240234375E+03 + 0.504443664550781250E+03 + 0.502049346923828125E+03 + 0.499663757324218750E+03 + 0.497286834716796875E+03 + 0.494918518066406250E+03 + 0.492558746337890625E+03 + 0.490207458496093750E+03 + 0.487864593505859375E+03 + 0.485530090332031250E+03 + 0.483203887939453125E+03 + 0.480885925292968750E+03 + 0.478576141357421875E+03 + 0.476274475097656250E+03 + 0.473980895996093750E+03 + 0.471695312500000000E+03 + 0.469418365478515625E+03 + 0.467150939941406250E+03 + 0.464893218994140625E+03 + 0.462645141601562500E+03 + 0.460406616210937500E+03 + 0.458177581787109375E+03 + 0.455957946777343750E+03 + 0.453747619628906250E+03 + 0.451546539306640625E+03 + 0.449354614257812500E+03 + 0.447171783447265625E+03 + 0.444997985839843750E+03 + 0.442833129882812500E+03 + 0.440677124023437500E+03 + 0.438529907226562500E+03 + 0.436391418457031250E+03 + 0.434261566162109375E+03 + 0.432140319824218750E+03 + 0.430027587890625000E+03 +__th01dn01 + 250 + 0.309907257080078125E+03 + 0.309907257080078125E+03 + 0.309903442382812500E+03 + 0.309899536132812500E+03 + 0.309895507812500000E+03 + 0.309891326904296875E+03 + 0.309887084960937500E+03 + 0.309882690429687500E+03 + 0.309878173828125000E+03 + 0.309873474121093750E+03 + 0.309837249755859375E+03 + 0.309780731201171875E+03 + 0.309722473144531250E+03 + 0.309662506103515625E+03 + 0.309600708007812500E+03 + 0.309537078857421875E+03 + 0.309471557617187500E+03 + 0.309404052734375000E+03 + 0.309354461669921875E+03 + 0.309303985595703125E+03 + 0.309251983642578125E+03 + 0.309198394775390625E+03 + 0.309143280029296875E+03 + 0.309086425781250000E+03 + 0.309029907226562500E+03 + 0.308981628417968750E+03 + 0.308931823730468750E+03 + 0.308880584716796875E+03 + 0.308827789306640625E+03 + 0.308773406982421875E+03 + 0.308717437744140625E+03 + 0.308675170898437500E+03 + 0.308631835937500000E+03 + 0.308587158203125000E+03 + 0.308541168212890625E+03 + 0.308493804931640625E+03 + 0.308448333740234375E+03 + 0.308409912109375000E+03 + 0.308370330810546875E+03 + 0.308329589843750000E+03 + 0.308287597656250000E+03 + 0.308244415283203125E+03 + 0.308213623046875000E+03 + 0.308182525634765625E+03 + 0.308150482177734375E+03 + 0.308117492675781250E+03 + 0.308083526611328125E+03 + 0.308057464599609375E+03 + 0.308031372070312500E+03 + 0.308004486083984375E+03 + 0.307976806640625000E+03 + 0.307949096679687500E+03 + 0.307925598144531250E+03 + 0.307901367187500000E+03 + 0.307876373291015625E+03 + 0.307850708007812500E+03 + 0.307826171875000000E+03 + 0.307802551269531250E+03 + 0.307778198242187500E+03 + 0.307753112792968750E+03 + 0.307726074218750000E+03 + 0.307690704345703125E+03 + 0.307654296875000000E+03 + 0.307616790771484375E+03 + 0.307578186035156250E+03 + 0.307500701904296875E+03 + 0.307415069580078125E+03 + 0.307326873779296875E+03 + 0.307235961914062500E+03 + 0.307229034423828125E+03 + 0.307256225585937500E+03 + 0.307284088134765625E+03 + 0.307312591552734375E+03 + 0.307505554199218750E+03 + 0.307784240722656250E+03 + 0.308070953369140625E+03 + 0.308366088867187500E+03 + 0.308708312988281250E+03 + 0.309075897216796875E+03 + 0.309454406738281250E+03 + 0.309837829589843750E+03 + 0.310200683593750000E+03 + 0.310559356689453125E+03 + 0.310917999267578125E+03 + 0.311276550292968750E+03 + 0.311552001953125000E+03 + 0.311782836914062500E+03 + 0.312013671875000000E+03 + 0.312244445800781250E+03 + 0.312476989746093750E+03 + 0.312740447998046875E+03 + 0.313003845214843750E+03 + 0.313267303466796875E+03 + 0.313530700683593750E+03 + 0.313794006347656250E+03 + 0.313992218017578125E+03 + 0.314190429687500000E+03 + 0.314388671875000000E+03 + 0.314586883544921875E+03 + 0.314785034179687500E+03 + 0.314976348876953125E+03 + 0.315158874511718750E+03 + 0.315341430664062500E+03 + 0.315523956298828125E+03 + 0.315706481933593750E+03 + 0.315888977050781250E+03 + 0.316089813232421875E+03 + 0.316328582763671875E+03 + 0.316567352294921875E+03 + 0.316806091308593750E+03 + 0.317044860839843750E+03 + 0.317283569335937500E+03 + 0.317522308349609375E+03 + 0.317752563476562500E+03 + 0.317977111816406250E+03 + 0.318201660156250000E+03 + 0.318426208496093750E+03 + 0.318650726318359375E+03 + 0.318875274658203125E+03 + 0.319099761962890625E+03 + 0.319321105957031250E+03 + 0.319529602050781250E+03 + 0.319738098144531250E+03 + 0.319946594238281250E+03 + 0.320155059814453125E+03 + 0.320363525390625000E+03 + 0.320571990966796875E+03 + 0.320780426025390625E+03 + 0.320986938476562500E+03 + 0.321159851074218750E+03 + 0.321332794189453125E+03 + 0.321505676269531250E+03 + 0.321678619384765625E+03 + 0.321851531982421875E+03 + 0.322024505615234375E+03 + 0.322197418212890625E+03 + 0.322370330810546875E+03 + 0.322542480468750000E+03 + 0.322707763671875000E+03 + 0.322873046875000000E+03 + 0.323038360595703125E+03 + 0.323203643798828125E+03 + 0.323368896484375000E+03 + 0.323534179687500000E+03 + 0.323699493408203125E+03 + 0.323864776611328125E+03 + 0.324030029296875000E+03 + 0.324229919433593750E+03 + 0.324533386230468750E+03 + 0.324836853027343750E+03 + 0.325140289306640625E+03 + 0.325443725585937500E+03 + 0.325747222900390625E+03 + 0.326050659179687500E+03 + 0.326354095458984375E+03 + 0.326657531738281250E+03 + 0.326960998535156250E+03 + 0.327264465332031250E+03 + 0.327794219970703125E+03 + 0.328642883300781250E+03 + 0.329491577148437500E+03 + 0.330340240478515625E+03 + 0.331188934326171875E+03 + 0.332037597656250000E+03 + 0.332886291503906250E+03 + 0.333734985351562500E+03 + 0.334583648681640625E+03 + 0.335432312011718750E+03 + 0.336281005859375000E+03 + 0.337129699707031250E+03 + 0.338382720947265625E+03 + 0.339906707763671875E+03 + 0.341430664062500000E+03 + 0.342954620361328125E+03 + 0.344478576660156250E+03 + 0.346002563476562500E+03 + 0.347526519775390625E+03 + 0.349050476074218750E+03 + 0.350574432373046875E+03 + 0.352098419189453125E+03 + 0.353622375488281250E+03 + 0.355146331787109375E+03 + 0.356670288085937500E+03 + 0.358189758300781250E+03 + 0.359702392578125000E+03 + 0.361215026855468750E+03 + 0.362727661132812500E+03 + 0.364240295410156250E+03 + 0.365752899169921875E+03 + 0.367265533447265625E+03 + 0.368778167724609375E+03 + 0.370290802001953125E+03 + 0.371803436279296875E+03 + 0.373316070556640625E+03 + 0.374828704833984375E+03 + 0.376341308593750000E+03 + 0.377853942871093750E+03 + 0.379366577148437500E+03 + 0.380909759521484375E+03 + 0.382453399658203125E+03 + 0.383997070312500000E+03 + 0.385540771484375000E+03 + 0.387084411621093750E+03 + 0.388628082275390625E+03 + 0.390171752929687500E+03 + 0.391715393066406250E+03 + 0.393259063720703125E+03 + 0.394802734375000000E+03 + 0.396346374511718750E+03 + 0.397890045166015625E+03 + 0.399433715820312500E+03 + 0.400977355957031250E+03 + 0.402521057128906250E+03 + 0.404058654785156250E+03 + 0.405556640625000000E+03 + 0.407054626464843750E+03 + 0.408552612304687500E+03 + 0.410050598144531250E+03 + 0.411548583984375000E+03 + 0.413046569824218750E+03 + 0.414544555664062500E+03 + 0.416042572021484375E+03 + 0.417540557861328125E+03 + 0.419038543701171875E+03 + 0.420536529541015625E+03 + 0.422034515380859375E+03 + 0.423532501220703125E+03 + 0.425030487060546875E+03 + 0.426528472900390625E+03 + 0.428026458740234375E+03 + 0.429524444580078125E+03 + 0.431275360107421875E+03 + 0.433136871337890625E+03 + 0.434998413085937500E+03 + 0.436859954833984375E+03 + 0.438721466064453125E+03 + 0.440583007812500000E+03 + 0.442444519042968750E+03 + 0.444306030273437500E+03 + 0.446167541503906250E+03 + 0.448029083251953125E+03 + 0.449890594482421875E+03 + 0.451752105712890625E+03 + 0.453613647460937500E+03 + 0.455475158691406250E+03 + 0.457336669921875000E+03 + 0.459198211669921875E+03 + 0.461059722900390625E+03 + 0.462921234130859375E+03 + 0.464782745361328125E+03 +__dn01dn01 + 250 + 0.111670076847076416E+01 + 0.111583304405212402E+01 + 0.111495316028594971E+01 + 0.111404716968536377E+01 + 0.111311447620391846E+01 + 0.111215424537658691E+01 + 0.111116600036621094E+01 + 0.111014842987060547E+01 + 0.110910069942474365E+01 + 0.110802233219146729E+01 + 0.110702455043792725E+01 + 0.110606551170349121E+01 + 0.110507798194885254E+01 + 0.110406100749969482E+01 + 0.110301351547241211E+01 + 0.110193514823913574E+01 + 0.110082459449768066E+01 + 0.109968078136444092E+01 + 0.109843230247497559E+01 + 0.109714496135711670E+01 + 0.109581911563873291E+01 + 0.109445440769195557E+01 + 0.109304881095886230E+01 + 0.109160244464874268E+01 + 0.109010577201843262E+01 + 0.108853006362915039E+01 + 0.108690869808197021E+01 + 0.108523905277252197E+01 + 0.108352053165435791E+01 + 0.108175158500671387E+01 + 0.107993090152740479E+01 + 0.107800281047821045E+01 + 0.107601821422576904E+01 + 0.107397580146789551E+01 + 0.107187390327453613E+01 + 0.106971108913421631E+01 + 0.106747353076934814E+01 + 0.106514251232147217E+01 + 0.106274425983428955E+01 + 0.106027674674987793E+01 + 0.105773806571960449E+01 + 0.105512654781341553E+01 + 0.105239295959472656E+01 + 0.104957938194274902E+01 + 0.104668557643890381E+01 + 0.104370951652526855E+01 + 0.104064846038818359E+01 + 0.103747093677520752E+01 + 0.103420090675354004E+01 + 0.103083884716033936E+01 + 0.102738225460052490E+01 + 0.102382588386535645E+01 + 0.102015328407287598E+01 + 0.101637852191925049E+01 + 0.101249897480010986E+01 + 0.100851118564605713E+01 + 0.100440704822540283E+01 + 0.100018405914306641E+01 + 0.995845079421997070E+00 + 0.991387069225311279E+00 + 0.986811041831970215E+00 + 0.982134342193603516E+00 + 0.977330088615417480E+00 + 0.972395360469818115E+00 + 0.967327058315277100E+00 + 0.962239861488342285E+00 + 0.957032382488250732E+00 + 0.951683580875396729E+00 + 0.946190655231475830E+00 + 0.940284967422485352E+00 + 0.934121131896972656E+00 + 0.927799105644226074E+00 + 0.921316146850585938E+00 + 0.914183199405670166E+00 + 0.906644761562347412E+00 + 0.898932337760925293E+00 + 0.891043782234191895E+00 + 0.882866740226745605E+00 + 0.874464094638824463E+00 + 0.865876972675323486E+00 + 0.857247173786163330E+00 + 0.848756194114685059E+00 + 0.840344369411468506E+00 + 0.831999599933624268E+00 + 0.823721885681152344E+00 + 0.815726816654205322E+00 + 0.807905972003936768E+00 + 0.800140321254730225E+00 + 0.792429745197296143E+00 + 0.784769535064697266E+00 + 0.777087628841400146E+00 + 0.769462049007415771E+00 + 0.761892855167388916E+00 + 0.754379570484161377E+00 + 0.746922433376312256E+00 + 0.739673197269439697E+00 + 0.732474088668823242E+00 + 0.725325345993041992E+00 + 0.718226611614227295E+00 + 0.711177647113800049E+00 + 0.704193413257598877E+00 + 0.697277009487152100E+00 + 0.690408766269683838E+00 + 0.683588266372680664E+00 + 0.676815092563629150E+00 + 0.670089662075042725E+00 + 0.663372635841369629E+00 + 0.656625390052795410E+00 + 0.649928510189056396E+00 + 0.643281519412994385E+00 + 0.636684298515319824E+00 + 0.630136549472808838E+00 + 0.623638093471527100E+00 + 0.617204904556274414E+00 + 0.610830605030059814E+00 + 0.604504227638244629E+00 + 0.598224937915802002E+00 + 0.591992735862731934E+00 + 0.585807383060455322E+00 + 0.579668641090393066E+00 + 0.573581755161285400E+00 + 0.567563652992248535E+00 + 0.561590433120727539E+00 + 0.555661857128143311E+00 + 0.549777865409851074E+00 + 0.543938159942626953E+00 + 0.538142383098602295E+00 + 0.532390475273132324E+00 + 0.526685476303100586E+00 + 0.521077871322631836E+00 + 0.515511572360992432E+00 + 0.509986519813537598E+00 + 0.504501998424530029E+00 + 0.499058365821838379E+00 + 0.493655264377593994E+00 + 0.488292634487152100E+00 + 0.482970029115676880E+00 + 0.477688550949096680E+00 + 0.472456902265548706E+00 + 0.467264503240585327E+00 + 0.462111085653305054E+00 + 0.456996619701385498E+00 + 0.451920777559280396E+00 + 0.446883529424667358E+00 + 0.441884607076644897E+00 + 0.436923891305923462E+00 + 0.432001203298568726E+00 + 0.427071005105972290E+00 + 0.422046124935150146E+00 + 0.417064964771270752E+00 + 0.412127494812011719E+00 + 0.407233268022537231E+00 + 0.402381867170333862E+00 + 0.397573441267013550E+00 + 0.392807364463806152E+00 + 0.388083606958389282E+00 + 0.383401602506637573E+00 + 0.378761231899261475E+00 + 0.373905450105667114E+00 + 0.368744522333145142E+00 + 0.363649308681488037E+00 + 0.358618944883346558E+00 + 0.353652417659759521E+00 + 0.348749011754989624E+00 + 0.343907982110977173E+00 + 0.339128553867340088E+00 + 0.334409743547439575E+00 + 0.329751104116439819E+00 + 0.325151473283767700E+00 + 0.320610284805297852E+00 + 0.315751373767852783E+00 + 0.310720592737197876E+00 + 0.305775552988052368E+00 + 0.300914704799652100E+00 + 0.296136260032653809E+00 + 0.291438698768615723E+00 + 0.286820471286773682E+00 + 0.282280057668685913E+00 + 0.277815908193588257E+00 + 0.273426502943038940E+00 + 0.269110709428787231E+00 + 0.264866828918457031E+00 + 0.260693699121475220E+00 + 0.256593018770217896E+00 + 0.252564996480941772E+00 + 0.248603314161300659E+00 + 0.244706809520721436E+00 + 0.240874215960502625E+00 + 0.237104281783103943E+00 + 0.233396038413047791E+00 + 0.229748144745826721E+00 + 0.226159617304801941E+00 + 0.222629338502883911E+00 + 0.219156369566917419E+00 + 0.215739503502845764E+00 + 0.212377756834030151E+00 + 0.209070175886154175E+00 + 0.205815732479095459E+00 + 0.202597439289093018E+00 + 0.199431061744689941E+00 + 0.196315750479698181E+00 + 0.193250760436058044E+00 + 0.190235123038291931E+00 + 0.187267929315567017E+00 + 0.184348374605178833E+00 + 0.181475609540939331E+00 + 0.178648769855499268E+00 + 0.175867006182670593E+00 + 0.173129573464393616E+00 + 0.170435711741447449E+00 + 0.167784586548805237E+00 + 0.165175482630729675E+00 + 0.162607654929161072E+00 + 0.160082861781120300E+00 + 0.157613083720207214E+00 + 0.155181482434272766E+00 + 0.152787685394287109E+00 + 0.150430813431739807E+00 + 0.148110300302505493E+00 + 0.145825594663619995E+00 + 0.143576085567474365E+00 + 0.141361102461814880E+00 + 0.139180153608322144E+00 + 0.137032672762870789E+00 + 0.134918078780174255E+00 + 0.132835820317268372E+00 + 0.130785390734672546E+00 + 0.128766208887100220E+00 + 0.126777827739715576E+00 + 0.124819725751876831E+00 + 0.122891381382942200E+00 + 0.120921768248081207E+00 + 0.118954420089721680E+00 + 0.117020443081855774E+00 + 0.115119203925132751E+00 + 0.113250114023685455E+00 + 0.111412584781646729E+00 + 0.109605960547924042E+00 + 0.107829689979553223E+00 + 0.106083236634731293E+00 + 0.104365974664688110E+00 + 0.102677382528781891E+00 + 0.101016990840435028E+00 + 0.993841886520385742E-01 + 0.977785140275955200E-01 + 0.961994454264640808E-01 + 0.946464836597442627E-01 + 0.931192040443420410E-01 + 0.916170924901962280E-01 + 0.901397019624710083E-01 +__rt01dn01 + 250 + 0.157400742173194885E-01 + 0.157400742173194885E-01 + 0.157197769731283188E-01 + 0.156988706439733505E-01 + 0.156773384660482407E-01 + 0.156551580876111984E-01 + 0.156323146075010300E-01 + 0.156087838113307953E-01 + 0.155845480039715767E-01 + 0.155595848336815834E-01 + 0.155360717326402664E-01 + 0.155131984502077103E-01 + 0.154896397143602371E-01 + 0.154653731733560562E-01 + 0.154403792694211006E-01 + 0.154146356508135796E-01 + 0.153881199657917023E-01 + 0.153608079999685287E-01 + 0.153312394395470619E-01 + 0.153007395565509796E-01 + 0.152693241834640503E-01 + 0.152369672432541847E-01 + 0.152036398649215698E-01 + 0.151693113148212433E-01 + 0.151335047557950020E-01 + 0.150943771004676819E-01 + 0.150540759786963463E-01 + 0.150125650689005852E-01 + 0.149698099121451378E-01 + 0.149257713928818703E-01 + 0.148804122582077980E-01 + 0.148314256221055984E-01 + 0.147809488698840141E-01 + 0.147289568558335304E-01 + 0.146754058077931404E-01 + 0.146202482283115387E-01 + 0.145624317228794098E-01 + 0.145003683865070343E-01 + 0.144364433363080025E-01 + 0.143706006929278374E-01 + 0.143027827143669128E-01 + 0.142329297959804535E-01 + 0.141618810594081879E-01 + 0.140887415036559105E-01 + 0.140134068205952644E-01 + 0.139358118176460266E-01 + 0.138558903709053993E-01 + 0.137731982395052910E-01 + 0.136879952624440193E-01 + 0.136002376675605774E-01 + 0.135098462924361229E-01 + 0.134156541898846626E-01 + 0.133118750527501106E-01 + 0.132049825042486191E-01 + 0.130948834121227264E-01 + 0.129814818501472473E-01 + 0.128611130639910698E-01 + 0.127342399209737778E-01 + 0.126035604625940323E-01 + 0.124689601361751556E-01 + 0.123188504949212074E-01 + 0.120928045362234116E-01 + 0.118599776178598404E-01 + 0.116201657801866531E-01 + 0.113731585443019867E-01 + 0.108122359961271286E-01 + 0.101871732622385025E-01 + 0.954335834830999374E-02 + 0.888023152947425842E-02 + 0.814564153552055359E-02 + 0.736850779503583908E-02 + 0.656806118786334991E-02 + 0.574360042810440063E-02 + 0.511736655607819557E-02 + 0.458150403574109077E-02 + 0.402956502512097359E-02 + 0.346106919459998608E-02 + 0.315951509401202202E-02 + 0.295987166464328766E-02 + 0.275420234538614750E-02 + 0.254582636989653111E-02 + 0.240100966766476631E-02 + 0.226934440433979034E-02 + 0.213767914101481438E-02 + 0.200601387768983841E-02 + 0.188496639020740986E-02 + 0.176962336990982294E-02 + 0.165428023319691420E-02 + 0.153893709648400545E-02 + 0.142714334651827812E-02 + 0.137570430524647236E-02 + 0.132426526397466660E-02 + 0.127282633911818266E-02 + 0.122138729784637690E-02 + 0.116997293662279844E-02 + 0.114299450069665909E-02 + 0.111601618118584156E-02 + 0.108903786167502403E-02 + 0.106205942574888468E-02 + 0.103508110623806715E-02 + 0.100341590587049723E-02 + 0.965809798799455166E-03 + 0.928203691728413105E-03 + 0.890597584657371044E-03 + 0.852991419378668070E-03 + 0.815385312307626009E-03 + 0.778890273068100214E-03 + 0.744703225791454315E-03 + 0.710516120307147503E-03 + 0.676329073030501604E-03 + 0.642141967546194792E-03 + 0.607954920269548893E-03 + 0.573767814785242081E-03 + 0.543858448509126902E-03 + 0.516833271831274033E-03 + 0.489808095153421164E-03 + 0.462782976683229208E-03 + 0.435757800005376339E-03 + 0.408732681535184383E-03 + 0.381707504857331514E-03 + 0.355890952050685883E-03 + 0.335007964167743921E-03 + 0.314125005388632417E-03 + 0.293242046609520912E-03 + 0.272359058726578951E-03 + 0.251476070843636990E-03 + 0.230593112064525485E-03 + 0.209710153285413980E-03 + 0.189310128916986287E-03 + 0.177026522578671575E-03 + 0.164742901688441634E-03 + 0.152459295350126922E-03 + 0.140175674459896982E-03 + 0.127892068121582270E-03 + 0.115608447231352329E-03 + 0.103324840893037617E-03 + 0.910412200028076768E-04 + 0.793839499237947166E-04 + 0.732929765945300460E-04 + 0.672020032652653754E-04 + 0.611110299360007048E-04 + 0.550200566067360342E-04 + 0.489290869154501706E-04 + 0.428381135861855000E-04 + 0.367471402569208294E-04 + 0.306561669276561588E-04 + 0.245651935983914882E-04 + 0.197688186744926497E-04 + 0.188459234777837992E-04 + 0.179230301000643522E-04 + 0.170001349033555016E-04 + 0.160772415256360546E-04 + 0.151543463289272040E-04 + 0.142314529512077570E-04 + 0.133085586639936082E-04 + 0.123856643767794594E-04 + 0.114627700895653106E-04 + 0.105398758023511618E-04 + 0.968389485933585092E-05 + 0.892223033588379622E-05 + 0.816056490293703973E-05 + 0.739890037948498502E-05 + 0.663723540128557943E-05 + 0.587557042308617383E-05 + 0.511390544488676824E-05 + 0.435224092143471353E-05 + 0.359057594323530793E-05 + 0.282891096503590234E-05 + 0.206724598683649674E-05 + 0.130558146338444203E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 +__kppzm + 48 + -0.170577192306518555E+01 + -0.515288019180297852E+01 + -0.867263221740722656E+01 + -0.122681560516357422E+02 + -0.159427862167358398E+02 + -0.197000827789306641E+02 + -0.235438518524169922E+02 + -0.274781646728515625E+02 + -0.315073947906494141E+02 + -0.356362304687500000E+02 + -0.398697319030761719E+02 + -0.442133331298828125E+02 + -0.486729240417480469E+02 + -0.532548675537109375E+02 + -0.579660606384277344E+02 + -0.628140220642089844E+02 + -0.678069229125976563E+02 + -0.729536972045898438E+02 + -0.782641372680664063E+02 + -0.837490005493164063E+02 + -0.894201202392578125E+02 + -0.952906188964843750E+02 + -0.101375022888183594E+03 + -0.107689506530761719E+03 + -0.114252166748046875E+03 + -0.121083328247070312E+03 + -0.128205902099609375E+03 + -0.135645858764648437E+03 + -0.143432846069335937E+03 + -0.151600814819335937E+03 + -0.160188995361328125E+03 + -0.169243026733398437E+03 + -0.178816345214843750E+03 + -0.188972213745117187E+03 + -0.199786239624023437E+03 + -0.211349731445312500E+03 + -0.223774444580078125E+03 + -0.237199188232421875E+03 + -0.251799423217773437E+03 + -0.267801239013671875E+03 + -0.285503112792968750E+03 + -0.305310638427734375E+03 + -0.327794952392578125E+03 + -0.353797454833984375E+03 + -0.384634338378906250E+03 + -0.422540863037109375E+03 + -0.471808868408203125E+03 + -0.500000000000000000E+03 +__gnu + 8 + 0.400000000000000000E+01 + 0.200000000000000000E+01 + 0.200000000000000000E+01 + 0.200000000000000000E+01 + 0.200000000000000000E+01 + 0.200000000000000000E+01 + 0.200000000000000000E+01 + 0.400000000000000000E+01 +__iaero_chem + 11 + 1 + 1 + 1 + 1 + 2 + 2 + 2 + 1 + 1 + 1 + 1 +__cfmas + 16 + 0.524000000000000000E+03 + 0.524000000000000000E+03 + 0.110800003051757812E+03 + 0.273899990133941174E-02 + 0.495999991893768311E+00 + 0.157000000000000000E+03 + 0.471000000000000000E+03 + 0.885399997234344482E+00 + 0.377000006847083569E-02 + 0.123000005260109901E-02 + 0.100100003182888031E+00 + 0.885399997234344482E+00 + 0.377000006847083569E-02 + 0.123000005260109901E-02 + 0.100100003182888031E+00 + 0.524000000000000000E+03 +__pwmas + 16 + 0.300000000000000000E+01 + 0.300000000000000000E+01 + 0.291000008583068848E+01 + 0.174000000953674316E+01 + 0.240000009536743164E+01 + 0.300000000000000000E+01 + 0.300000000000000000E+01 + 0.250000000000000000E+01 + 0.200000000000000000E+01 + 0.179999995231628418E+01 + 0.225600004196166992E+01 + 0.250000000000000000E+01 + 0.200000000000000000E+01 + 0.179999995231628418E+01 + 0.225600004196166992E+01 + 0.300000000000000000E+01 +__slcpd + 12 + 0.146500000000000000E+07 + 0.140700000000000000E+07 + 0.134400000000000000E+07 + 0.127300000000000000E+07 + 0.121400000000000000E+07 + 0.117700000000000000E+07 + 0.131900000000000000E+07 + 0.122700000000000000E+07 + 0.117700000000000000E+07 + 0.115100000000000000E+07 + 0.108800000000000000E+07 + 0.874000000000000000E+06 +__slmsts + 12 + 0.395000010728836060E+00 + 0.409999996423721313E+00 + 0.435000002384185791E+00 + 0.485000014305114746E+00 + 0.451000005006790161E+00 + 0.419999986886978149E+00 + 0.476999998092651367E+00 + 0.476000010967254639E+00 + 0.425999999046325684E+00 + 0.492000013589859009E+00 + 0.481999993324279785E+00 + 0.862999975681304932E+00 +__slz + 11 + -0.500000000000000000E+00 + -0.400000005960464478E+00 + -0.300000011920928955E+00 + -0.250000000000000000E+00 + -0.200000002980232239E+00 + -0.159999996423721313E+00 + -0.119999997317790985E+00 + -0.900000035762786865E-01 + -0.599999986588954926E-01 + -0.299999993294477463E-01 + -0.999999977648258209E-02 diff --git a/bin.rams/test.supercell/a-A-1991-04-26-210500-head.txt b/bin.rams/test.supercell/a-A-1991-04-26-210500-head.txt new file mode 100644 index 0000000..1d27a91 --- /dev/null +++ b/bin.rams/test.supercell/a-A-1991-04-26-210500-head.txt @@ -0,0 +1,3638 @@ + 257 +UP 0 3 1 218750 +VP 0 3 1 218750 +WP 0 3 1 218750 +PP 0 3 1 218750 +UC 0 3 1 218750 +VC 0 3 1 218750 +WC 0 3 1 218750 +PC 0 3 1 218750 +THP 0 3 1 218750 +RTP 0 3 1 218750 +THETA 0 3 1 218750 +RV 0 3 1 218750 +DN0 0 3 1 218750 +WP_BUOY_THETA 0 3 1 218750 +WP_BUOY_COND 0 3 1 218750 +WP_ADVDIF 0 3 1 218750 +SOIL_WATER 0 4 1 19250 +SOIL_ENERGY 0 4 1 19250 +SOIL_TEXT 0 4 1 19250 +SFCWATER_MASS 0 5 1 1750 +SFCWATER_ENERGY 0 5 1 1750 +SFCWATER_DEPTH 0 5 1 1750 +USTAR 0 6 1 1750 +TSTAR 0 6 1 1750 +RSTAR 0 6 1 1750 +VEG_FRACAREA 0 6 1 1750 +VEG_LAI 0 6 1 1750 +VEG_ROUGH 0 6 1 1750 +VEG_HEIGHT 0 6 1 1750 +VEG_ALBEDO 0 6 1 1750 +VEG_TAI 0 6 1 1750 +PATCH_AREA 0 6 1 1750 +PATCH_ROUGH 0 6 1 1750 +LEAF_CLASS 0 6 1 1750 +SOIL_ROUGH 0 6 1 1750 +SFCWATER_NLEV 0 6 1 1750 +STOM_RESIST 0 6 1 1750 +GROUND_RSAT 0 6 1 1750 +GROUND_RVAP 0 6 1 1750 +VEG_WATER 0 6 1 1750 +VEG_TEMP 0 6 1 1750 +CAN_RVAP 0 6 1 1750 +CAN_TEMP 0 6 1 1750 +VEG_NDVIP 0 6 1 1750 +VEG_NDVIC 0 6 1 1750 +VEG_NDVIF 0 6 1 1750 +KPP_OLD 0 2 1 875 +KPP_NEW 0 2 1 875 +KPP_JERLOV 0 2 1 875 +KPP_OCDEPTH 0 2 1 875 +KPP_HMIX 0 2 1 875 +KPP_BOTTOMT 0 2 1 875 +KPP_SREF 0 2 1 875 +KPP_FREEZ_FLAG 0 2 1 875 +KPP_RESET_FLAG 0 2 1 875 +KPP_FLX_UST 0 2 1 875 +KPP_FLX_VST 0 2 1 875 +KPP_FLX_NSW 0 2 1 875 +KPP_FLX_NLW 0 2 1 875 +KPP_FLX_ICE 0 2 1 875 +KPP_FLX_PCP 0 2 1 875 +KPP_SWDK_OPT 0 10 1 42000 +KPP_SWFRAC 0 10 1 42000 +KPP_SAL_CLIM 0 10 1 42000 +KPP_OCNT_CLIM 0 10 1 42000 +KPP_BUOY 0 10 1 42000 +KPP_U 0 10 1 42000 +KPP_V 0 10 1 42000 +KPP_U_init 0 10 1 42000 +KPP_V_init 0 10 1 42000 +KPP_US0 0 10 1 42000 +KPP_US1 0 10 1 42000 +KPP_VS0 0 10 1 42000 +KPP_VS1 0 10 1 42000 +KPP_X_T 0 10 1 42000 +KPP_X_S 0 10 1 42000 +KPP_XS_T0 0 10 1 42000 +KPP_XS_T1 0 10 1 42000 +KPP_XS_S0 0 10 1 42000 +KPP_XS_S1 0 10 1 42000 +RCP 0 3 1 218750 +RDP 0 3 1 218750 +RRP 0 3 1 218750 +RPP 0 3 1 218750 +RSP 0 3 1 218750 +RAP 0 3 1 218750 +RGP 0 3 1 218750 +RHP 0 3 1 218750 +CCP 0 3 1 218750 +CDP 0 3 1 218750 +CRP 0 3 1 218750 +CPP 0 3 1 218750 +CSP 0 3 1 218750 +CAP 0 3 1 218750 +CGP 0 3 1 218750 +CHP 0 3 1 218750 +Q2 0 3 1 218750 +Q6 0 3 1 218750 +Q7 0 3 1 218750 +CCCNP 0 3 1 218750 +GCCNP 0 3 1 218750 +CCCMP 0 3 1 218750 +GCCMP 0 3 1 218750 +MD1NP 0 3 1 218750 +MD2NP 0 3 1 218750 +MD1MP 0 3 1 218750 +MD2MP 0 3 1 218750 +SALT_FILM_NP 0 3 1 218750 +SALT_JET_NP 0 3 1 218750 +SALT_SPUM_NP 0 3 1 218750 +SALT_FILM_MP 0 3 1 218750 +SALT_JET_MP 0 3 1 218750 +SALT_SPUM_MP 0 3 1 218750 +REGEN_AERO1_NP 0 3 1 218750 +REGEN_AERO1_MP 0 3 1 218750 +REGEN_AERO2_NP 0 3 1 218750 +REGEN_AERO2_MP 0 3 1 218750 +IMMERCP 0 3 1 218750 +IMMERDP 0 3 1 218750 +IMMERRP 0 3 1 218750 +IFNNUCP 0 3 1 218750 +CNMCP 0 3 1 218750 +CNMDP 0 3 1 218750 +CNMRP 0 3 1 218750 +CNMPP 0 3 1 218750 +CNMSP 0 3 1 218750 +CNMAP 0 3 1 218750 +CNMGP 0 3 1 218750 +CNMHP 0 3 1 218750 +DNMCP 0 3 1 218750 +DNMDP 0 3 1 218750 +DNMRP 0 3 1 218750 +DNMPP 0 3 1 218750 +DNMSP 0 3 1 218750 +DNMAP 0 3 1 218750 +DNMGP 0 3 1 218750 +DNMHP 0 3 1 218750 +DINCP 0 3 1 218750 +DINDP 0 3 1 218750 +DINRP 0 3 1 218750 +DINPP 0 3 1 218750 +DINSP 0 3 1 218750 +DINAP 0 3 1 218750 +DINGP 0 3 1 218750 +DINHP 0 3 1 218750 +SNMCP 0 3 1 218750 +SNMDP 0 3 1 218750 +SNMRP 0 3 1 218750 +SNMPP 0 3 1 218750 +SNMSP 0 3 1 218750 +SNMAP 0 3 1 218750 +SNMGP 0 3 1 218750 +SNMHP 0 3 1 218750 +RESOL_AERO1_MP 0 3 1 218750 +RESOL_AERO2_MP 0 3 1 218750 +PCPVR 0 3 1 218750 +PCPVP 0 3 1 218750 +PCPVS 0 3 1 218750 +PCPVA 0 3 1 218750 +PCPVG 0 3 1 218750 +PCPVH 0 3 1 218750 +PCPVD 0 3 1 218750 +LATHEATVAP 0 3 1 218750 +LATHEATFRZ 0 3 1 218750 +NUCCLDRT 0 3 1 218750 +CLD2RAINT 0 3 1 218750 +ICE2RAINT 0 3 1 218750 +NUCICERT 0 3 1 218750 +VAPLIQT 0 3 1 218750 +VAPICET 0 3 1 218750 +MELTICET 0 3 1 218750 +RIMECLDT 0 3 1 218750 +RAIN2ICET 0 3 1 218750 +AGGREGATET 0 3 1 218750 +LATHEATVAPT 0 3 1 218750 +LATHEATFRZT 0 3 1 218750 +INUCHOMRT 0 3 1 218750 +INUCCONTRT 0 3 1 218750 +INUCIFNRT 0 3 1 218750 +INUCHAZRT 0 3 1 218750 +VAPCLDT 0 3 1 218750 +VAPRAINT 0 3 1 218750 +VAPPRIST 0 3 1 218750 +VAPSNOWT 0 3 1 218750 +VAPAGGRT 0 3 1 218750 +VAPGRAUT 0 3 1 218750 +VAPHAILT 0 3 1 218750 +VAPDRIZT 0 3 1 218750 +MELTPRIST 0 3 1 218750 +MELTSNOWT 0 3 1 218750 +MELTAGGRT 0 3 1 218750 +MELTGRAUT 0 3 1 218750 +MELTHAILT 0 3 1 218750 +RIMECLDSNOWT 0 3 1 218750 +RIMECLDAGGRT 0 3 1 218750 +RIMECLDGRAUT 0 3 1 218750 +RIMECLDHAILT 0 3 1 218750 +RAIN2PRT 0 3 1 218750 +RAIN2SNT 0 3 1 218750 +RAIN2AGT 0 3 1 218750 +RAIN2GRT 0 3 1 218750 +RAIN2HAT 0 3 1 218750 +AGGRSELFPRIST 0 3 1 218750 +AGGRSELFSNOWT 0 3 1 218750 +AGGRPRISSNOWT 0 3 1 218750 +DUST1CLDRT 0 3 1 218750 +DUST2CLDRT 0 3 1 218750 +DUST1DRZRT 0 3 1 218750 +DUST2DRZRT 0 3 1 218750 +ACCPR 0 2 1 875 +ACCPP 0 2 1 875 +ACCPS 0 2 1 875 +ACCPA 0 2 1 875 +ACCPG 0 2 1 875 +ACCPH 0 2 1 875 +ACCPD 0 2 1 875 +PCPRR 0 2 1 875 +PCPRP 0 2 1 875 +PCPRS 0 2 1 875 +PCPRA 0 2 1 875 +PCPRG 0 2 1 875 +PCPRH 0 2 1 875 +PCPRD 0 2 1 875 +PCPG 0 2 1 875 +QPCPG 0 2 1 875 +DPCPG 0 2 1 875 +ACCPAERO 0 2 1 875 +PCPRAERO 0 2 1 875 +ACCPDUST 0 2 1 875 +PCPRDUST 0 2 1 875 +FTHRD 0 3 1 218750 +BEXT 0 3 1 218750 +SWUP 0 3 1 218750 +SWDN 0 3 1 218750 +LWUP 0 3 1 218750 +LWDN 0 3 1 218750 +RSHORT 0 2 1 875 +RLONG 0 2 1 875 +RLONGUP 0 2 1 875 +ALBEDT 0 2 1 875 +COSZ 0 2 1 875 +AODT 0 2 1 875 +RHKM 0 3 1 218750 +RVKM 0 3 1 218750 +RVKH 0 3 1 218750 +SFLUX_U 0 2 1 875 +SFLUX_V 0 2 1 875 +SFLUX_W 0 2 1 875 +SFLUX_T 0 2 1 875 +SFLUX_R 0 2 1 875 +TOPT 0 2 1 875 +GLAT 0 2 1 875 +GLON 0 2 1 875 +TOPZO 0 2 1 875 +PI 1 3 1 218750 +HKH 1 3 1 218750 +VKH 1 3 1 218750 +__expnme + 1 +RAMS Simulations +__initial + 1 + 1 +__initorig + 1 + 1 +__jdim + 1 + 1 +__iyear1 + 1 + 1991 +__imonth1 + 1 + 4 +__idate1 + 1 + 26 +__itime1 + 1 + 2100 +__time + 1 + 0.300000000000000000E+03 +__nsndg + 1 + 35 +__us + 35 + -0.271000003814697266E+01 + -0.271000003814697266E+01 + -0.353999996185302734E+01 + -0.339000010490417480E+01 + -0.277999997138977051E+01 + -0.174000000953674316E+01 + -0.360000014305114746E+00 + 0.125000000000000000E+01 + 0.294000005722045898E+01 + 0.457999992370605469E+01 + 0.607000017166137695E+01 + 0.730000019073486328E+01 + 0.852999973297119141E+01 + 0.967000007629394531E+01 + 0.108999996185302734E+02 + 0.120900001525878906E+02 + 0.128400001525878906E+02 + 0.151300001144409180E+02 + 0.167000007629394531E+02 + 0.173600006103515625E+02 + 0.174400005340576172E+02 + 0.170400009155273438E+02 + 0.168299999237060547E+02 + 0.170599994659423828E+02 + 0.183799991607666016E+02 + 0.203899993896484375E+02 + 0.233099994659423828E+02 + 0.281800003051757813E+02 + 0.248199996948242188E+02 + 0.211499996185302734E+02 + 0.175100002288818359E+02 + 0.965999984741210938E+01 + 0.200999999046325684E+01 + 0.500000000000000000E+00 + -0.103999996185302734E+01 +__vs + 35 + 0.838000011444091797E+01 + 0.838000011444091797E+01 + 0.106599998474121094E+02 + 0.122500000000000000E+02 + 0.134600000381469727E+02 + 0.142600002288818359E+02 + 0.146400003433227539E+02 + 0.146599998474121094E+02 + 0.144099998474121094E+02 + 0.140299997329711914E+02 + 0.137200002670288086E+02 + 0.136199998855590820E+02 + 0.138299999237060547E+02 + 0.142600002288818359E+02 + 0.154700002670288086E+02 + 0.160300006866455078E+02 + 0.188700008392333984E+02 + 0.190900001525878906E+02 + 0.186000003814697266E+02 + 0.189099998474121094E+02 + 0.199799995422363281E+02 + 0.211800003051757813E+02 + 0.216200008392333984E+02 + 0.218400001525878906E+02 + 0.223400001525878906E+02 + 0.227000007629394531E+02 + 0.227399997711181641E+02 + 0.198400001525878906E+02 + 0.181599998474121094E+02 + 0.161700000762939453E+02 + 0.118999996185302734E+02 + 0.850000000000000000E+01 + 0.347000002861022949E+01 + 0.350000000000000000E+01 + 0.352999997138977051E+01 +__ts + 35 + 0.306079376220703125E+03 + 0.305112518310546875E+03 + 0.303622192382812500E+03 + 0.302135650634765625E+03 + 0.300582458496093750E+03 + 0.298970092773437500E+03 + 0.297265472412109375E+03 + 0.295463653564453125E+03 + 0.293529083251953125E+03 + 0.291434265136718750E+03 + 0.289150360107421875E+03 + 0.286665008544921875E+03 + 0.284018432617187500E+03 + 0.281624572753906250E+03 + 0.279662200927734375E+03 + 0.277406005859375000E+03 + 0.274758117675781250E+03 + 0.271294006347656250E+03 + 0.267552581787109375E+03 + 0.263083618164062500E+03 + 0.258075958251953125E+03 + 0.252843017578125000E+03 + 0.246956115722656250E+03 + 0.240328781127929687E+03 + 0.232743484497070312E+03 + 0.224288635253906250E+03 + 0.215936080932617187E+03 + 0.210840881347656250E+03 + 0.210143768310546875E+03 + 0.208462387084960937E+03 + 0.205940200805664062E+03 + 0.201693786621093750E+03 + 0.198953125000000000E+03 + 0.194737899780273437E+03 + 0.189301940917968750E+03 +__thds + 35 + 0.306959991455078125E+03 + 0.306960021972656250E+03 + 0.306529998779296875E+03 + 0.306209960937500000E+03 + 0.305939971923828125E+03 + 0.305740020751953125E+03 + 0.305589965820312500E+03 + 0.305500000000000000E+03 + 0.305450012207031250E+03 + 0.305429992675781250E+03 + 0.305429992675781250E+03 + 0.305459991455078125E+03 + 0.305589965820312500E+03 + 0.306299987792968750E+03 + 0.307829986572265625E+03 + 0.309429992675781250E+03 + 0.311029968261718750E+03 + 0.312190032958984375E+03 + 0.313570007324218750E+03 + 0.314700012207031250E+03 + 0.315859985351562500E+03 + 0.317509979248046875E+03 + 0.319209991455078125E+03 + 0.320940002441406250E+03 + 0.322510009765625000E+03 + 0.324149963378906250E+03 + 0.327439971923828125E+03 + 0.337469970703125000E+03 + 0.357589996337890625E+03 + 0.379390014648437500E+03 + 0.403859985351562500E+03 + 0.429979980468750000E+03 + 0.465670013427734375E+03 + 0.503269989013671875E+03 + 0.541519958496093750E+03 +__ps + 35 + 0.990000000000000000E+05 + 0.979103046875000000E+05 + 0.967206328125000000E+05 + 0.954221953125000000E+05 + 0.940067812500000000E+05 + 0.924657890625000000E+05 + 0.907903359375000000E+05 + 0.889713671875000000E+05 + 0.869998593750000000E+05 + 0.848665859375000000E+05 + 0.825626484375000000E+05 + 0.800791093750000000E+05 + 0.774072031250000000E+05 + 0.745411562500000000E+05 + 0.714829531250000000E+05 + 0.682369765625000000E+05 + 0.648056328125000000E+05 + 0.611899843750000000E+05 + 0.573959570312500000E+05 + 0.534349296875000000E+05 + 0.493217070312500000E+05 + 0.450816445312500000E+05 + 0.407470156250000000E+05 + 0.363542890625000000E+05 + 0.319460332031250000E+05 + 0.275735761718750000E+05 + 0.233073164062500000E+05 + 0.192918867187500000E+05 + 0.155726064453125000E+05 + 0.123097558593750000E+05 + 0.947972363281250000E+04 + 0.707827929687500000E+04 + 0.510501708984375000E+04 + 0.360986938476562500E+04 + 0.253038891601562500E+04 +__hs + 35 + 0.000000000000000000E+00 + 0.100002868652343750E+03 + 0.210000503540039062E+03 + 0.330998321533203125E+03 + 0.464095123291015625E+03 + 0.610502075195312500E+03 + 0.771550354003906250E+03 + 0.948713012695312500E+03 + 0.114357568359375000E+04 + 0.135793383789062500E+04 + 0.159372290039062500E+04 + 0.185310449218750000E+04 + 0.213841821289062500E+04 + 0.245225878906250000E+04 + 0.279748461914062500E+04 + 0.317723657226562500E+04 + 0.359496240234375000E+04 + 0.405446093750000000E+04 + 0.455991406250000000E+04 + 0.511591503906250000E+04 + 0.572751757812500000E+04 + 0.640028662109375000E+04 + 0.714033789062500000E+04 + 0.795439843750000000E+04 + 0.884990039062500000E+04 + 0.983496484375000000E+04 + 0.109185126953125000E+05 + 0.121001347656250000E+05 + 0.134203779296875000E+05 + 0.148615781250000000E+05 + 0.164467695312500000E+05 + 0.181904414062500000E+05 + 0.201076933593750000E+05 + 0.221054843750000000E+05 + 0.241034882812500000E+05 +__ihtran + 1 + 0 +__ngrids + 1 + 1 +__nzg + 1 + 11 +__nzs + 1 + 1 +__npatch + 1 + 2 +__nvegpat + 1 + 1 +__nkppz + 1 + 48 +__ztop + 1 + 0.200100156250000000E+05 +__polelat + 1 + 0.370000000000000000E+02 +__polelon + 1 + -0.975000000000000000E+02 +__nnxp + 1 + 25 +__nnyp + 1 + 35 +__nnzp + 1 + 250 +__nstratx + 1 + 1 +__nstraty + 1 + 1 +__nxtnest + 1 + 0 +__ninest + 1 + 1 +__njnest + 1 + 1 +__nknest + 1 + 1 +__deltaxn + 1 + 0.200000000000000000E+04 +__deltazn + 1 + 0.100000000000000000E+02 +__nestz + 1 + 0 +__nstratz + 250 + 1 + 1 + 3 + 3 + 3 + 3 + 2 + 2 + 2 + 2 + 1 + 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 + 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 + 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 + 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 + 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 + 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 + 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 + 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 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 +__ngbegun + 1 + 1 +__iref + 1 + 0 +__jref + 1 + 0 +__topref + 1 + 0.000000000000000000E+00 +__xmn01 + 25 + -0.230000000000000000E+05 + -0.210000000000000000E+05 + -0.190000000000000000E+05 + -0.170000000000000000E+05 + -0.150000000000000000E+05 + -0.130000000000000000E+05 + -0.110000000000000000E+05 + -0.900000000000000000E+04 + -0.700000000000000000E+04 + -0.500000000000000000E+04 + -0.300000000000000000E+04 + -0.100000000000000000E+04 + 0.100000000000000000E+04 + 0.300000000000000000E+04 + 0.500000000000000000E+04 + 0.700000000000000000E+04 + 0.900000000000000000E+04 + 0.110000000000000000E+05 + 0.130000000000000000E+05 + 0.150000000000000000E+05 + 0.170000000000000000E+05 + 0.190000000000000000E+05 + 0.210000000000000000E+05 + 0.230000000000000000E+05 + 0.250000000000000000E+05 +__xtn01 + 25 + -0.240000000000000000E+05 + -0.220000000000000000E+05 + -0.200000000000000000E+05 + -0.180000000000000000E+05 + -0.160000000000000000E+05 + -0.140000000000000000E+05 + -0.120000000000000000E+05 + -0.100000000000000000E+05 + -0.800000000000000000E+04 + -0.600000000000000000E+04 + -0.400000000000000000E+04 + -0.200000000000000000E+04 + 0.000000000000000000E+00 + 0.200000000000000000E+04 + 0.400000000000000000E+04 + 0.600000000000000000E+04 + 0.800000000000000000E+04 + 0.100000000000000000E+05 + 0.120000000000000000E+05 + 0.140000000000000000E+05 + 0.160000000000000000E+05 + 0.180000000000000000E+05 + 0.200000000000000000E+05 + 0.220000000000000000E+05 + 0.240000000000000000E+05 +__ymn01 + 35 + -0.330000000000000000E+05 + -0.310000000000000000E+05 + -0.290000000000000000E+05 + -0.270000000000000000E+05 + -0.250000000000000000E+05 + -0.230000000000000000E+05 + -0.210000000000000000E+05 + -0.190000000000000000E+05 + -0.170000000000000000E+05 + -0.150000000000000000E+05 + -0.130000000000000000E+05 + -0.110000000000000000E+05 + -0.900000000000000000E+04 + -0.700000000000000000E+04 + -0.500000000000000000E+04 + -0.300000000000000000E+04 + -0.100000000000000000E+04 + 0.100000000000000000E+04 + 0.300000000000000000E+04 + 0.500000000000000000E+04 + 0.700000000000000000E+04 + 0.900000000000000000E+04 + 0.110000000000000000E+05 + 0.130000000000000000E+05 + 0.150000000000000000E+05 + 0.170000000000000000E+05 + 0.190000000000000000E+05 + 0.210000000000000000E+05 + 0.230000000000000000E+05 + 0.250000000000000000E+05 + 0.270000000000000000E+05 + 0.290000000000000000E+05 + 0.310000000000000000E+05 + 0.330000000000000000E+05 + 0.350000000000000000E+05 +__ytn01 + 35 + -0.340000000000000000E+05 + -0.320000000000000000E+05 + -0.300000000000000000E+05 + -0.280000000000000000E+05 + -0.260000000000000000E+05 + -0.240000000000000000E+05 + -0.220000000000000000E+05 + -0.200000000000000000E+05 + -0.180000000000000000E+05 + -0.160000000000000000E+05 + -0.140000000000000000E+05 + -0.120000000000000000E+05 + -0.100000000000000000E+05 + -0.800000000000000000E+04 + -0.600000000000000000E+04 + -0.400000000000000000E+04 + -0.200000000000000000E+04 + 0.000000000000000000E+00 + 0.200000000000000000E+04 + 0.400000000000000000E+04 + 0.600000000000000000E+04 + 0.800000000000000000E+04 + 0.100000000000000000E+05 + 0.120000000000000000E+05 + 0.140000000000000000E+05 + 0.160000000000000000E+05 + 0.180000000000000000E+05 + 0.200000000000000000E+05 + 0.220000000000000000E+05 + 0.240000000000000000E+05 + 0.260000000000000000E+05 + 0.280000000000000000E+05 + 0.300000000000000000E+05 + 0.320000000000000000E+05 + 0.340000000000000000E+05 +__zmn01 + 250 + 0.000000000000000000E+00 + 0.100000000000000000E+02 + 0.202999992370605469E+02 + 0.309089984893798828E+02 + 0.418362655639648438E+02 + 0.530913505554199219E+02 + 0.646840896606445313E+02 + 0.766246109008789063E+02 + 0.889233474731445313E+02 + 0.101591049194335937E+03 + 0.114638778686523437E+03 + 0.128077941894531250E+03 + 0.141920272827148437E+03 + 0.156177871704101562E+03 + 0.170863204956054687E+03 + 0.185989105224609375E+03 + 0.201568786621093750E+03 + 0.217615859985351562E+03 + 0.234144348144531250E+03 + 0.251168685913085937E+03 + 0.268703765869140625E+03 + 0.286764892578125000E+03 + 0.305367858886718750E+03 + 0.324528900146484375E+03 + 0.344264770507812500E+03 + 0.364592712402343750E+03 + 0.385530487060546875E+03 + 0.407096405029296875E+03 + 0.429309295654296875E+03 + 0.452188568115234375E+03 + 0.475754211425781250E+03 + 0.500026824951171875E+03 + 0.525027587890625000E+03 + 0.550778381347656250E+03 + 0.577301696777343750E+03 + 0.604620727539062500E+03 + 0.632759338378906250E+03 + 0.661742126464843750E+03 + 0.691594421386718750E+03 + 0.722342285156250000E+03 + 0.754012573242187500E+03 + 0.786632995605468750E+03 + 0.820232055664062500E+03 + 0.854839111328125000E+03 + 0.890484375000000000E+03 + 0.927198974609375000E+03 + 0.965015014648437500E+03 + 0.100396551513671875E+04 + 0.104408447265625000E+04 + 0.108540698242187500E+04 + 0.112796911621093750E+04 + 0.117180810546875000E+04 + 0.121696228027343750E+04 + 0.126347106933593750E+04 + 0.131137512207031250E+04 + 0.136071630859375000E+04 + 0.141153771972656250E+04 + 0.146388378906250000E+04 + 0.151780029296875000E+04 + 0.157333422851562500E+04 + 0.163053417968750000E+04 + 0.168945007324218750E+04 + 0.175013342285156250E+04 + 0.181263732910156250E+04 + 0.187701635742187500E+04 + 0.194332678222656250E+04 + 0.201162646484375000E+04 + 0.208197509765625000E+04 + 0.215443408203125000E+04 + 0.222906689453125000E+04 + 0.230593872070312500E+04 + 0.238511669921875000E+04 + 0.246666992187500000E+04 + 0.255066967773437500E+04 + 0.263718945312500000E+04 + 0.272630493164062500E+04 + 0.281809375000000000E+04 + 0.291263623046875000E+04 + 0.301001489257812500E+04 + 0.311001489257812500E+04 + 0.321001489257812500E+04 + 0.331001489257812500E+04 + 0.341001489257812500E+04 + 0.351001489257812500E+04 + 0.361001489257812500E+04 + 0.371001489257812500E+04 + 0.381001489257812500E+04 + 0.391001489257812500E+04 + 0.401001489257812500E+04 + 0.411001464843750000E+04 + 0.421001464843750000E+04 + 0.431001464843750000E+04 + 0.441001464843750000E+04 + 0.451001464843750000E+04 + 0.461001464843750000E+04 + 0.471001464843750000E+04 + 0.481001464843750000E+04 + 0.491001464843750000E+04 + 0.501001464843750000E+04 + 0.511001464843750000E+04 + 0.521001464843750000E+04 + 0.531001464843750000E+04 + 0.541001464843750000E+04 + 0.551001464843750000E+04 + 0.561001464843750000E+04 + 0.571001464843750000E+04 + 0.581001464843750000E+04 + 0.591001464843750000E+04 + 0.601001464843750000E+04 + 0.611001464843750000E+04 + 0.621001464843750000E+04 + 0.631001464843750000E+04 + 0.641001464843750000E+04 + 0.651001464843750000E+04 + 0.661001464843750000E+04 + 0.671001464843750000E+04 + 0.681001464843750000E+04 + 0.691001464843750000E+04 + 0.701001464843750000E+04 + 0.711001464843750000E+04 + 0.721001464843750000E+04 + 0.731001464843750000E+04 + 0.741001464843750000E+04 + 0.751001464843750000E+04 + 0.761001464843750000E+04 + 0.771001464843750000E+04 + 0.781001464843750000E+04 + 0.791001464843750000E+04 + 0.801001464843750000E+04 + 0.811001464843750000E+04 + 0.821001464843750000E+04 + 0.831001464843750000E+04 + 0.841001464843750000E+04 + 0.851001464843750000E+04 + 0.861001464843750000E+04 + 0.871001464843750000E+04 + 0.881001464843750000E+04 + 0.891001464843750000E+04 + 0.901001464843750000E+04 + 0.911001464843750000E+04 + 0.921001464843750000E+04 + 0.931001464843750000E+04 + 0.941001464843750000E+04 + 0.951001464843750000E+04 + 0.961001464843750000E+04 + 0.971001464843750000E+04 + 0.981001464843750000E+04 + 0.991001464843750000E+04 + 0.100100146484375000E+05 + 0.101100146484375000E+05 + 0.102100146484375000E+05 + 0.103100146484375000E+05 + 0.104100146484375000E+05 + 0.105100146484375000E+05 + 0.106100146484375000E+05 + 0.107100146484375000E+05 + 0.108100146484375000E+05 + 0.109100146484375000E+05 + 0.110100146484375000E+05 + 0.111100146484375000E+05 + 0.112100146484375000E+05 + 0.113100146484375000E+05 + 0.114100146484375000E+05 + 0.115100146484375000E+05 + 0.116100146484375000E+05 + 0.117100146484375000E+05 + 0.118100146484375000E+05 + 0.119100146484375000E+05 + 0.120100146484375000E+05 + 0.121100146484375000E+05 + 0.122100146484375000E+05 + 0.123100146484375000E+05 + 0.124100146484375000E+05 + 0.125100146484375000E+05 + 0.126100146484375000E+05 + 0.127100146484375000E+05 + 0.128100146484375000E+05 + 0.129100146484375000E+05 + 0.130100146484375000E+05 + 0.131100146484375000E+05 + 0.132100146484375000E+05 + 0.133100146484375000E+05 + 0.134100146484375000E+05 + 0.135100146484375000E+05 + 0.136100146484375000E+05 + 0.137100146484375000E+05 + 0.138100146484375000E+05 + 0.139100146484375000E+05 + 0.140100146484375000E+05 + 0.141100146484375000E+05 + 0.142100146484375000E+05 + 0.143100146484375000E+05 + 0.144100146484375000E+05 + 0.145100146484375000E+05 + 0.146100146484375000E+05 + 0.147100146484375000E+05 + 0.148100146484375000E+05 + 0.149100146484375000E+05 + 0.150100146484375000E+05 + 0.151100146484375000E+05 + 0.152100146484375000E+05 + 0.153100146484375000E+05 + 0.154100146484375000E+05 + 0.155100146484375000E+05 + 0.156100146484375000E+05 + 0.157100146484375000E+05 + 0.158100146484375000E+05 + 0.159100146484375000E+05 + 0.160100146484375000E+05 + 0.161100146484375000E+05 + 0.162100146484375000E+05 + 0.163100146484375000E+05 + 0.164100156250000000E+05 + 0.165100156250000000E+05 + 0.166100156250000000E+05 + 0.167100156250000000E+05 + 0.168100156250000000E+05 + 0.169100156250000000E+05 + 0.170100156250000000E+05 + 0.171100156250000000E+05 + 0.172100156250000000E+05 + 0.173100156250000000E+05 + 0.174100156250000000E+05 + 0.175100156250000000E+05 + 0.176100156250000000E+05 + 0.177100156250000000E+05 + 0.178100156250000000E+05 + 0.179100156250000000E+05 + 0.180100156250000000E+05 + 0.181100156250000000E+05 + 0.182100156250000000E+05 + 0.183100156250000000E+05 + 0.184100156250000000E+05 + 0.185100156250000000E+05 + 0.186100156250000000E+05 + 0.187100156250000000E+05 + 0.188100156250000000E+05 + 0.189100156250000000E+05 + 0.190100156250000000E+05 + 0.191100156250000000E+05 + 0.192100156250000000E+05 + 0.193100156250000000E+05 + 0.194100156250000000E+05 + 0.195100156250000000E+05 + 0.196100156250000000E+05 + 0.197100156250000000E+05 + 0.198100156250000000E+05 + 0.199100156250000000E+05 + 0.200100156250000000E+05 + 0.201100156250000000E+05 +__ztn01 + 250 + -0.489024114608764648E+01 + 0.496305179595947266E+01 + 0.151119432449340820E+02 + 0.255652999877929688E+02 + 0.363322563171386719E+02 + 0.474222221374511719E+02 + 0.588448867797851563E+02 + 0.706102294921875000E+02 + 0.827285385131835938E+02 + 0.952103958129882813E+02 + 0.108066703796386719E+03 + 0.121308708190917969E+03 + 0.134947967529296875E+03 + 0.148996398925781250E+03 + 0.163466278076171875E+03 + 0.178370269775390625E+03 + 0.193721374511718750E+03 + 0.209533035278320312E+03 + 0.225819030761718750E+03 + 0.242593612670898437E+03 + 0.259871429443359375E+03 + 0.277667602539062500E+03 + 0.295997650146484375E+03 + 0.314877593994140625E+03 + 0.334323913574218750E+03 + 0.354353637695312500E+03 + 0.374984252929687500E+03 + 0.396233764648437500E+03 + 0.418120788574218750E+03 + 0.440664398193359375E+03 + 0.463884307861328125E+03 + 0.487800842285156250E+03 + 0.512434814453125000E+03 + 0.537807861328125000E+03 + 0.563942016601562500E+03 + 0.590860290527343750E+03 + 0.618586059570312500E+03 + 0.647143615722656250E+03 + 0.676557983398437500E+03 + 0.706854736328125000E+03 + 0.738060424804687500E+03 + 0.770202270507812500E+03 + 0.803308410644531250E+03 + 0.837407714843750000E+03 + 0.872530029296875000E+03 + 0.908706054687500000E+03 + 0.945967285156250000E+03 + 0.984346374511718750E+03 + 0.102387677001953125E+04 + 0.106459301757812500E+04 + 0.110653076171875000E+04 + 0.114972668457031250E+04 + 0.119421838378906250E+04 + 0.124004479980468750E+04 + 0.128724609375000000E+04 + 0.133586340332031250E+04 + 0.138593920898437500E+04 + 0.143751733398437500E+04 + 0.149064282226562500E+04 + 0.154536206054687500E+04 + 0.160172290039062500E+04 + 0.165977441406250000E+04 + 0.171956750488281250E+04 + 0.178115441894531250E+04 + 0.184458898925781250E+04 + 0.190992651367187500E+04 + 0.197722424316406250E+04 + 0.204654089355468750E+04 + 0.211793676757812500E+04 + 0.219147460937500000E+04 + 0.226721875000000000E+04 + 0.234523510742187500E+04 + 0.242559204101562500E+04 + 0.250835937500000000E+04 + 0.259360986328125000E+04 + 0.268141796875000000E+04 + 0.277186010742187500E+04 + 0.286501562500000000E+04 + 0.296098388671875000E+04 + 0.305984887695312500E+04 + 0.316001489257812500E+04 + 0.326001489257812500E+04 + 0.336001489257812500E+04 + 0.346001489257812500E+04 + 0.356001489257812500E+04 + 0.366001489257812500E+04 + 0.376001489257812500E+04 + 0.386001489257812500E+04 + 0.396001489257812500E+04 + 0.406001464843750000E+04 + 0.416001464843750000E+04 + 0.426001464843750000E+04 + 0.436001464843750000E+04 + 0.446001464843750000E+04 + 0.456001464843750000E+04 + 0.466001464843750000E+04 + 0.476001464843750000E+04 + 0.486001464843750000E+04 + 0.496001464843750000E+04 + 0.506001464843750000E+04 + 0.516001464843750000E+04 + 0.526001464843750000E+04 + 0.536001464843750000E+04 + 0.546001464843750000E+04 + 0.556001464843750000E+04 + 0.566001464843750000E+04 + 0.576001464843750000E+04 + 0.586001464843750000E+04 + 0.596001464843750000E+04 + 0.606001464843750000E+04 + 0.616001464843750000E+04 + 0.626001464843750000E+04 + 0.636001464843750000E+04 + 0.646001464843750000E+04 + 0.656001464843750000E+04 + 0.666001464843750000E+04 + 0.676001464843750000E+04 + 0.686001464843750000E+04 + 0.696001464843750000E+04 + 0.706001464843750000E+04 + 0.716001464843750000E+04 + 0.726001464843750000E+04 + 0.736001464843750000E+04 + 0.746001464843750000E+04 + 0.756001464843750000E+04 + 0.766001464843750000E+04 + 0.776001464843750000E+04 + 0.786001464843750000E+04 + 0.796001464843750000E+04 + 0.806001464843750000E+04 + 0.816001464843750000E+04 + 0.826001464843750000E+04 + 0.836001464843750000E+04 + 0.846001464843750000E+04 + 0.856001464843750000E+04 + 0.866001464843750000E+04 + 0.876001464843750000E+04 + 0.886001464843750000E+04 + 0.896001464843750000E+04 + 0.906001464843750000E+04 + 0.916001464843750000E+04 + 0.926001464843750000E+04 + 0.936001464843750000E+04 + 0.946001464843750000E+04 + 0.956001464843750000E+04 + 0.966001464843750000E+04 + 0.976001464843750000E+04 + 0.986001464843750000E+04 + 0.996001464843750000E+04 + 0.100600146484375000E+05 + 0.101600146484375000E+05 + 0.102600146484375000E+05 + 0.103600146484375000E+05 + 0.104600146484375000E+05 + 0.105600146484375000E+05 + 0.106600146484375000E+05 + 0.107600146484375000E+05 + 0.108600146484375000E+05 + 0.109600146484375000E+05 + 0.110600146484375000E+05 + 0.111600146484375000E+05 + 0.112600146484375000E+05 + 0.113600146484375000E+05 + 0.114600146484375000E+05 + 0.115600146484375000E+05 + 0.116600146484375000E+05 + 0.117600146484375000E+05 + 0.118600146484375000E+05 + 0.119600146484375000E+05 + 0.120600146484375000E+05 + 0.121600146484375000E+05 + 0.122600146484375000E+05 + 0.123600146484375000E+05 + 0.124600146484375000E+05 + 0.125600146484375000E+05 + 0.126600146484375000E+05 + 0.127600146484375000E+05 + 0.128600146484375000E+05 + 0.129600146484375000E+05 + 0.130600146484375000E+05 + 0.131600146484375000E+05 + 0.132600146484375000E+05 + 0.133600146484375000E+05 + 0.134600146484375000E+05 + 0.135600146484375000E+05 + 0.136600146484375000E+05 + 0.137600146484375000E+05 + 0.138600146484375000E+05 + 0.139600146484375000E+05 + 0.140600146484375000E+05 + 0.141600146484375000E+05 + 0.142600146484375000E+05 + 0.143600146484375000E+05 + 0.144600146484375000E+05 + 0.145600146484375000E+05 + 0.146600146484375000E+05 + 0.147600146484375000E+05 + 0.148600146484375000E+05 + 0.149600146484375000E+05 + 0.150600146484375000E+05 + 0.151600146484375000E+05 + 0.152600146484375000E+05 + 0.153600146484375000E+05 + 0.154600146484375000E+05 + 0.155600146484375000E+05 + 0.156600146484375000E+05 + 0.157600146484375000E+05 + 0.158600146484375000E+05 + 0.159600146484375000E+05 + 0.160600146484375000E+05 + 0.161600146484375000E+05 + 0.162600146484375000E+05 + 0.163600156250000000E+05 + 0.164600156250000000E+05 + 0.165600156250000000E+05 + 0.166600156250000000E+05 + 0.167600156250000000E+05 + 0.168600156250000000E+05 + 0.169600156250000000E+05 + 0.170600156250000000E+05 + 0.171600156250000000E+05 + 0.172600156250000000E+05 + 0.173600156250000000E+05 + 0.174600156250000000E+05 + 0.175600156250000000E+05 + 0.176600156250000000E+05 + 0.177600156250000000E+05 + 0.178600156250000000E+05 + 0.179600156250000000E+05 + 0.180600156250000000E+05 + 0.181600156250000000E+05 + 0.182600156250000000E+05 + 0.183600156250000000E+05 + 0.184600156250000000E+05 + 0.185600156250000000E+05 + 0.186600156250000000E+05 + 0.187600156250000000E+05 + 0.188600156250000000E+05 + 0.189600156250000000E+05 + 0.190600156250000000E+05 + 0.191600156250000000E+05 + 0.192600156250000000E+05 + 0.193600156250000000E+05 + 0.194600156250000000E+05 + 0.195600156250000000E+05 + 0.196600156250000000E+05 + 0.197600156250000000E+05 + 0.198600156250000000E+05 + 0.199600156250000000E+05 + 0.200600156250000000E+05 +__dzmn01 + 250 + 0.101488918066024780E+00 + 0.985329300165176392E-01 + 0.956630483269691467E-01 + 0.928767547011375427E-01 + 0.901716053485870361E-01 + 0.875452458858489990E-01 + 0.849953964352607727E-01 + 0.825197622179985046E-01 + 0.801162794232368469E-01 + 0.777828320860862732E-01 + 0.755172669887542725E-01 + 0.733177661895751953E-01 + 0.711823254823684692E-01 + 0.691090747714042664E-01 + 0.670961216092109680E-01 + 0.651418939232826233E-01 + 0.632444620132446289E-01 + 0.614024475216865540E-01 + 0.596140027046203613E-01 + 0.578776821494102478E-01 + 0.561918579041957855E-01 + 0.545552335679531097E-01 + 0.529662594199180603E-01 + 0.514236129820346832E-01 + 0.499258004128932953E-01 + 0.484716519713401794E-01 + 0.470599047839641571E-01 + 0.456891730427742004E-01 + 0.443584695458412170E-01 + 0.430664904415607452E-01 + 0.418120771646499634E-01 + 0.405943468213081360E-01 + 0.394118987023830414E-01 + 0.382641032338142395E-01 + 0.371494852006435394E-01 + 0.360675305128097534E-01 + 0.350170023739337921E-01 + 0.339969918131828308E-01 + 0.330068357288837433E-01 + 0.320454388856887817E-01 + 0.311120897531509399E-01 + 0.302058774977922440E-01 + 0.293261110782623291E-01 + 0.284719280898571014E-01 + 0.276426170021295547E-01 + 0.268375463783740997E-01 + 0.260558556765317917E-01 + 0.252969898283481598E-01 + 0.245602205395698547E-01 + 0.238448679447174072E-01 + 0.231503322720527649E-01 + 0.224761031568050385E-01 + 0.218214746564626694E-01 + 0.211858600378036499E-01 + 0.205688066780567169E-01 + 0.199697241187095642E-01 + 0.193880647420883179E-01 + 0.188233572989702225E-01 + 0.182751081883907318E-01 + 0.177428163588047028E-01 + 0.172260794788599014E-01 + 0.167243406176567078E-01 + 0.162372160702943802E-01 + 0.157642755657434464E-01 + 0.153051409870386124E-01 + 0.148593420162796974E-01 + 0.144265480339527130E-01 + 0.140064116567373276E-01 + 0.135984411463141441E-01 + 0.132023412734270096E-01 + 0.128178251907229424E-01 + 0.124444765970110893E-01 + 0.120820617303252220E-01 + 0.117301382124423981E-01 + 0.113884704187512398E-01 + 0.110567929223179817E-01 + 0.107347369194030762E-01 + 0.104201119393110275E-01 + 0.101148039102554321E-01 + 0.998342595994472504E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.100000239908695221E-01 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999990198761224747E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 +__dztn01 + 250 + 0.103000000119209290E+00 + 0.100000001490116119E+00 + 0.970873832702636719E-01 + 0.942595973610877991E-01 + 0.915141925215721130E-01 + 0.888487324118614197E-01 + 0.862608924508094788E-01 + 0.837484374642372131E-01 + 0.813091620802879333E-01 + 0.789409205317497253E-01 + 0.766416862607002258E-01 + 0.744093954563140869E-01 + 0.722421705722808838E-01 + 0.701380372047424316E-01 + 0.680951550602912903E-01 + 0.661117658019065857E-01 + 0.641861632466316223E-01 + 0.623166598379611969E-01 + 0.605016015470027924E-01 + 0.587394349277019501E-01 + 0.570285394787788391E-01 + 0.553675331175327301E-01 + 0.537548698484897614E-01 + 0.521892309188842773E-01 + 0.506691597402095795E-01 + 0.491933710873126984E-01 + 0.477605685591697693E-01 + 0.463694632053375244E-01 + 0.450189039111137390E-01 + 0.437076836824417114E-01 + 0.424346588551998138E-01 + 0.411986932158470154E-01 + 0.399987809360027313E-01 + 0.388337559998035431E-01 + 0.377026759088039398E-01 + 0.366045199334621429E-01 + 0.355383567512035370E-01 + 0.345032364130020142E-01 + 0.334982611238956451E-01 + 0.325225852429866791E-01 + 0.315753370523452759E-01 + 0.306556429713964462E-01 + 0.297627374529838562E-01 + 0.288958419114351273E-01 + 0.280542187392711639E-01 + 0.272371210157871246E-01 + 0.264438055455684662E-01 + 0.256736110895872116E-01 + 0.249258726835250854E-01 + 0.241998862475156784E-01 + 0.234950631856918335E-01 + 0.228107441216707230E-01 + 0.221463460475206375E-01 + 0.215013120323419571E-01 + 0.208750609308481216E-01 + 0.202670432627201080E-01 + 0.196767468005418777E-01 + 0.191036313772201538E-01 + 0.185471959412097931E-01 + 0.180070083588361740E-01 + 0.174825321882963181E-01 + 0.169733483344316483E-01 + 0.164789855480194092E-01 + 0.159990005195140839E-01 + 0.155330086126923561E-01 + 0.150805851444602013E-01 + 0.146413566544651985E-01 + 0.142149170860648155E-01 + 0.138009106740355492E-01 + 0.133989322930574417E-01 + 0.130086671561002731E-01 + 0.126297743991017342E-01 + 0.122619308531284332E-01 + 0.119047965854406357E-01 + 0.115580512210726738E-01 + 0.112213948741555214E-01 + 0.108945732936263084E-01 + 0.105772558599710464E-01 + 0.102691901847720146E-01 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.100000239908695221E-01 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999990198761224747E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 +__u01dn01 + 250 + -0.271000003814697266E+01 + -0.271000003814697266E+01 + -0.271000003814697266E+01 + -0.271000003814697266E+01 + -0.271000003814697266E+01 + -0.271000003814697266E+01 + -0.271000003814697266E+01 + -0.271000003814697266E+01 + -0.271000003814697266E+01 + -0.271000003814697266E+01 + -0.277084660530090332E+01 + -0.287076568603515625E+01 + -0.297368240356445313E+01 + -0.307968640327453613E+01 + -0.318887066841125488E+01 + -0.330133032798767090E+01 + -0.341716384887695313E+01 + -0.353647255897521973E+01 + -0.352038979530334473E+01 + -0.349959468841552734E+01 + -0.347817540168762207E+01 + -0.345611381530761719E+01 + -0.343339014053344727E+01 + -0.340998482704162598E+01 + -0.337475848197937012E+01 + -0.328295969963073730E+01 + -0.318840670585632324E+01 + -0.309101748466491699E+01 + -0.299070644378662109E+01 + -0.288738608360290527E+01 + -0.278096628189086914E+01 + -0.261160659790039063E+01 + -0.243661952018737793E+01 + -0.225638246536254883E+01 + -0.207073879241943359E+01 + -0.187952518463134766E+01 + -0.167072951793670654E+01 + -0.142602384090423584E+01 + -0.117397618293762207E+01 + -0.914367675781250000E+00 + -0.646970510482788086E+00 + -0.371551632881164551E+00 + -0.713925063610076904E-01 + 0.238491535186767578E+00 + 0.557672321796417236E+00 + 0.886429071426391602E+00 + 0.122504770755767822E+01 + 0.155904006958007813E+01 + 0.190187835693359375E+01 + 0.225500106811523438E+01 + 0.261871767044067383E+01 + 0.298705983161926270E+01 + 0.332745456695556641E+01 + 0.367806077003479004E+01 + 0.403918600082397461E+01 + 0.441114473342895508E+01 + 0.475697183609008789E+01 + 0.508290481567382813E+01 + 0.541861581802368164E+01 + 0.576439809799194336E+01 + 0.610793638229370117E+01 + 0.638321971893310547E+01 + 0.666676139831542969E+01 + 0.695880937576293945E+01 + 0.725961923599243164E+01 + 0.754496240615844727E+01 + 0.783508586883544922E+01 + 0.813391304016113281E+01 + 0.844170379638671875E+01 + 0.872272300720214844E+01 + 0.899785709381103516E+01 + 0.928124523162841797E+01 + 0.957313537597656250E+01 + 0.986987972259521484E+01 + 0.101736173629760742E+02 + 0.104864673614501953E+02 + 0.108087024688720703E+02 + 0.111116161346435547E+02 + 0.114123449325561523E+02 + 0.117221508026123047E+02 + 0.120360336303710938E+02 + 0.122386236190795898E+02 + 0.124181671142578125E+02 + 0.125977106094360352E+02 + 0.127772541046142578E+02 + 0.131642017364501953E+02 + 0.136625709533691406E+02 + 0.141609401702880859E+02 + 0.146593103408813477E+02 + 0.151472501754760742E+02 + 0.154578628540039063E+02 + 0.157684755325317383E+02 + 0.160790882110595703E+02 + 0.163896999359130859E+02 + 0.167001209259033203E+02 + 0.168188247680664063E+02 + 0.169375305175781250E+02 + 0.170562343597412109E+02 + 0.171749401092529297E+02 + 0.172936439514160156E+02 + 0.173657684326171875E+02 + 0.173788490295410156E+02 + 0.173919296264648438E+02 + 0.174050102233886719E+02 + 0.174180908203125000E+02 + 0.174311714172363281E+02 + 0.174206790924072266E+02 + 0.173612232208251953E+02 + 0.173017673492431641E+02 + 0.172423114776611328E+02 + 0.171828556060791016E+02 + 0.171233997344970703E+02 + 0.170639457702636719E+02 + 0.170230522155761719E+02 + 0.169946746826171875E+02 + 0.169662990570068359E+02 + 0.169379234313964844E+02 + 0.169095458984375000E+02 + 0.168811702728271484E+02 + 0.168527927398681641E+02 + 0.168355598449707031E+02 + 0.168638134002685547E+02 + 0.168920669555664063E+02 + 0.169203186035156250E+02 + 0.169485721588134766E+02 + 0.169768257141113281E+02 + 0.170050792694091797E+02 + 0.170333328247070313E+02 + 0.170682773590087891E+02 + 0.172156810760498047E+02 + 0.173630847930908203E+02 + 0.175104885101318359E+02 + 0.176578903198242188E+02 + 0.178052940368652344E+02 + 0.179526977539062500E+02 + 0.181001014709472656E+02 + 0.182475051879882813E+02 + 0.184006366729736328E+02 + 0.186046848297119141E+02 + 0.188087329864501953E+02 + 0.190127792358398438E+02 + 0.192168273925781250E+02 + 0.194208755493164063E+02 + 0.196249217987060547E+02 + 0.198289699554443359E+02 + 0.200330181121826172E+02 + 0.202370643615722656E+02 + 0.204575042724609375E+02 + 0.207269897460937500E+02 + 0.209964752197265625E+02 + 0.212659606933593750E+02 + 0.215354461669921875E+02 + 0.218049297332763672E+02 + 0.220744152069091797E+02 + 0.223439006805419922E+02 + 0.226133861541748047E+02 + 0.228828697204589844E+02 + 0.231523551940917969E+02 + 0.234810485839843750E+02 + 0.238931922912597656E+02 + 0.243053379058837891E+02 + 0.247174835205078125E+02 + 0.251296291351318359E+02 + 0.255417747497558594E+02 + 0.259539203643798828E+02 + 0.263660659790039063E+02 + 0.267782115936279297E+02 + 0.271903572082519531E+02 + 0.276025009155273438E+02 + 0.280146465301513672E+02 + 0.280276069641113281E+02 + 0.277731075286865234E+02 + 0.275186100006103516E+02 + 0.272641105651855469E+02 + 0.270096130371093750E+02 + 0.267551136016845703E+02 + 0.265006141662597656E+02 + 0.262461166381835938E+02 + 0.259916172027587891E+02 + 0.257371196746826172E+02 + 0.254826202392578125E+02 + 0.252281227111816406E+02 + 0.249736232757568359E+02 + 0.247190647125244141E+02 + 0.244644165039062500E+02 + 0.242097682952880859E+02 + 0.239551181793212891E+02 + 0.237004699707031250E+02 + 0.234458217620849609E+02 + 0.231911716461181641E+02 + 0.229365234375000000E+02 + 0.226818733215332031E+02 + 0.224272251129150391E+02 + 0.221725769042968750E+02 + 0.219179267883300781E+02 + 0.216632785797119141E+02 + 0.214086303710937500E+02 + 0.211539802551269531E+02 + 0.209239654541015625E+02 + 0.206943397521972656E+02 + 0.204647140502929688E+02 + 0.202350883483886719E+02 + 0.200054626464843750E+02 + 0.197758388519287109E+02 + 0.195462131500244141E+02 + 0.193165874481201172E+02 + 0.190869636535644531E+02 + 0.188573379516601563E+02 + 0.186277122497558594E+02 + 0.183980865478515625E+02 + 0.181684608459472656E+02 + 0.179388370513916016E+02 + 0.177092094421386719E+02 + 0.174503669738769531E+02 + 0.170001678466796875E+02 + 0.165499668121337891E+02 + 0.160997676849365234E+02 + 0.156495685577392578E+02 + 0.151993694305419922E+02 + 0.147491703033447266E+02 + 0.142989702224731445E+02 + 0.138487710952758789E+02 + 0.133985719680786133E+02 + 0.129483718872070313E+02 + 0.124981727600097656E+02 + 0.120479736328125000E+02 + 0.115977745056152344E+02 + 0.111475753784179688E+02 + 0.106973752975463867E+02 + 0.102471752166748047E+02 + 0.979697608947753906E+01 + 0.938239288330078125E+01 + 0.898338413238525391E+01 + 0.858437538146972656E+01 + 0.818536758422851563E+01 + 0.778635835647583008E+01 + 0.738735008239746094E+01 + 0.698834133148193359E+01 + 0.658933258056640625E+01 + 0.619032430648803711E+01 + 0.579131603240966797E+01 + 0.539230728149414063E+01 + 0.499329853057861328E+01 + 0.459428977966308594E+01 + 0.419528150558471680E+01 + 0.379627275466918945E+01 + 0.339726400375366211E+01 + 0.299825572967529297E+01 + 0.259924697875976563E+01 + 0.220023870468139648E+01 +__v01dn01 + 250 + 0.838000011444091797E+01 + 0.838000011444091797E+01 + 0.838000011444091797E+01 + 0.838000011444091797E+01 + 0.838000011444091797E+01 + 0.838000011444091797E+01 + 0.838000011444091797E+01 + 0.838000011444091797E+01 + 0.838000011444091797E+01 + 0.838000011444091797E+01 + 0.854714488983154297E+01 + 0.882162189483642578E+01 + 0.910433197021484375E+01 + 0.939552402496337891E+01 + 0.969545173645019531E+01 + 0.100043773651123047E+02 + 0.103225708007812500E+02 + 0.106503105163574219E+02 + 0.108678665161132813E+02 + 0.110882968902587891E+02 + 0.113153400421142578E+02 + 0.115491952896118164E+02 + 0.117900657653808594E+02 + 0.120381622314453125E+02 + 0.122802333831787109E+02 + 0.124623260498046875E+02 + 0.126498813629150391E+02 + 0.128430633544921875E+02 + 0.130420417785644531E+02 + 0.132469882965087891E+02 + 0.134580831527709961E+02 + 0.135895338058471680E+02 + 0.137241392135620117E+02 + 0.138627824783325195E+02 + 0.140055856704711914E+02 + 0.141526727676391602E+02 + 0.142790746688842773E+02 + 0.143464574813842773E+02 + 0.144158620834350586E+02 + 0.144873485565185547E+02 + 0.145609798431396484E+02 + 0.146368198394775391E+02 + 0.146435852050781250E+02 + 0.146474351882934570E+02 + 0.146513996124267578E+02 + 0.146554832458496094E+02 + 0.146596899032592773E+02 + 0.146142835617065430E+02 + 0.145635681152343750E+02 + 0.145113306045532227E+02 + 0.144575271606445313E+02 + 0.143990955352783203E+02 + 0.143202238082885742E+02 + 0.142389860153198242E+02 + 0.141553106307983398E+02 + 0.140691251754760742E+02 + 0.139931802749633789E+02 + 0.139253683090209961E+02 + 0.138555231094360352E+02 + 0.137835817337036133E+02 + 0.137169160842895508E+02 + 0.136945352554321289E+02 + 0.136714830398559570E+02 + 0.136477394104003906E+02 + 0.136232824325561523E+02 + 0.136618223190307617E+02 + 0.137113561630249023E+02 + 0.137623748779296875E+02 + 0.138149251937866211E+02 + 0.139026937484741211E+02 + 0.140064725875854492E+02 + 0.141133642196655273E+02 + 0.142234630584716797E+02 + 0.144566297531127930E+02 + 0.147554292678833008E+02 + 0.150631923675537109E+02 + 0.153801879882812500E+02 + 0.155695848464965820E+02 + 0.157111043930053711E+02 + 0.158568954467773438E+02 + 0.160046043395996094E+02 + 0.165927867889404297E+02 + 0.172726593017578125E+02 + 0.179525299072265625E+02 + 0.186324024200439453E+02 + 0.189011459350585938E+02 + 0.189490242004394531E+02 + 0.189969024658203125E+02 + 0.190447807312011719E+02 + 0.190846157073974609E+02 + 0.189876728057861328E+02 + 0.188907318115234375E+02 + 0.187937889099121094E+02 + 0.186968460083007813E+02 + 0.186000556945800781E+02 + 0.186558113098144531E+02 + 0.187115669250488281E+02 + 0.187673225402832031E+02 + 0.188230781555175781E+02 + 0.188788318634033203E+02 + 0.189871520996093750E+02 + 0.191621017456054688E+02 + 0.193370532989501953E+02 + 0.195120029449462891E+02 + 0.196869525909423828E+02 + 0.198619022369384766E+02 + 0.200379638671875000E+02 + 0.202163314819335938E+02 + 0.203946990966796875E+02 + 0.205730667114257813E+02 + 0.207514343261718750E+02 + 0.209298000335693359E+02 + 0.211081676483154297E+02 + 0.212155113220214844E+02 + 0.212749671936035156E+02 + 0.213344230651855469E+02 + 0.213938789367675781E+02 + 0.214533329010009766E+02 + 0.215127887725830078E+02 + 0.215722446441650391E+02 + 0.216253185272216797E+02 + 0.216523437500000000E+02 + 0.216793689727783203E+02 + 0.217063941955566406E+02 + 0.217334175109863281E+02 + 0.217604427337646484E+02 + 0.217874679565429688E+02 + 0.218144931793212891E+02 + 0.218431358337402344E+02 + 0.218989696502685547E+02 + 0.219548053741455078E+02 + 0.220106391906738281E+02 + 0.220664749145507813E+02 + 0.221223087310791016E+02 + 0.221781444549560547E+02 + 0.222339782714843750E+02 + 0.222898120880126953E+02 + 0.223436965942382813E+02 + 0.223802433013916016E+02 + 0.224167881011962891E+02 + 0.224533348083496094E+02 + 0.224898796081542969E+02 + 0.225264263153076172E+02 + 0.225629711151123047E+02 + 0.225995178222656250E+02 + 0.226360645294189453E+02 + 0.226726093292236328E+02 + 0.227009258270263672E+02 + 0.227046165466308594E+02 + 0.227083091735839844E+02 + 0.227119998931884766E+02 + 0.227156906127929688E+02 + 0.227193832397460938E+02 + 0.227230739593505859E+02 + 0.227267665863037109E+02 + 0.227304573059082031E+02 + 0.227341480255126953E+02 + 0.227378406524658203E+02 + 0.226381435394287109E+02 + 0.223927173614501953E+02 + 0.221472930908203125E+02 + 0.219018669128417969E+02 + 0.216564426422119141E+02 + 0.214110164642333984E+02 + 0.211655921936035156E+02 + 0.209201660156250000E+02 + 0.206747417449951172E+02 + 0.204293155670166016E+02 + 0.201838912963867188E+02 + 0.199384651184082031E+02 + 0.197638034820556641E+02 + 0.196365547180175781E+02 + 0.195093040466308594E+02 + 0.193820552825927734E+02 + 0.192548065185546875E+02 + 0.191275577545166016E+02 + 0.190003070831298828E+02 + 0.188730583190917969E+02 + 0.187458095550537109E+02 + 0.186185588836669922E+02 + 0.184913101196289063E+02 + 0.183640613555908203E+02 + 0.182368125915527344E+02 + 0.181052703857421875E+02 + 0.179671897888183594E+02 + 0.178291110992431641E+02 + 0.176910324096679688E+02 + 0.175529518127441406E+02 + 0.174148731231689453E+02 + 0.172767944335937500E+02 + 0.171387138366699219E+02 + 0.170006351470947266E+02 + 0.168625564575195313E+02 + 0.167244758605957031E+02 + 0.165863971710205078E+02 + 0.164483184814453125E+02 + 0.163102378845214844E+02 + 0.161721591949462891E+02 + 0.159048433303833008E+02 + 0.156354751586914063E+02 + 0.153661069869995117E+02 + 0.150967388153076172E+02 + 0.148273706436157227E+02 + 0.145580024719238281E+02 + 0.142886343002319336E+02 + 0.140192661285400391E+02 + 0.137498989105224609E+02 + 0.134805297851562500E+02 + 0.132111625671386719E+02 + 0.129417934417724609E+02 + 0.126724262237548828E+02 + 0.124030580520629883E+02 + 0.121336870193481445E+02 + 0.118741712570190430E+02 + 0.116791801452636719E+02 + 0.114841890335083008E+02 + 0.112891988754272461E+02 + 0.110942077636718750E+02 + 0.108992166519165039E+02 + 0.107042264938354492E+02 + 0.105092353820800781E+02 + 0.103142442703247070E+02 + 0.101192541122436523E+02 + 0.992426300048828125E+01 + 0.972927188873291016E+01 + 0.953428173065185547E+01 + 0.933929061889648438E+01 + 0.914429950714111328E+01 + 0.894930934906005859E+01 + 0.875431823730468750E+01 + 0.855932712554931641E+01 + 0.831746864318847656E+01 + 0.805511379241943359E+01 + 0.779275941848754883E+01 + 0.753040504455566406E+01 + 0.726805019378662109E+01 + 0.700569534301757813E+01 + 0.674334096908569336E+01 + 0.648098659515380859E+01 + 0.621863174438476563E+01 + 0.595627689361572266E+01 + 0.569392204284667969E+01 + 0.543156766891479492E+01 + 0.516921281814575195E+01 + 0.490685844421386719E+01 + 0.464450359344482422E+01 + 0.438214921951293945E+01 + 0.411979436874389648E+01 + 0.385743951797485352E+01 + 0.359508514404296875E+01 +__pi01dn01 + 250 + 0.100127435302734375E+04 + 0.100096276855468750E+04 + 0.100064184570312500E+04 + 0.100031127929687500E+04 + 0.999970764160156250E+03 + 0.999620056152343750E+03 + 0.999258850097656250E+03 + 0.998886779785156250E+03 + 0.998503540039062500E+03 + 0.998108764648437500E+03 + 0.997702148437500000E+03 + 0.997283264160156250E+03 + 0.996851745605468750E+03 + 0.996407165527343750E+03 + 0.995949157714843750E+03 + 0.995477355957031250E+03 + 0.994991271972656250E+03 + 0.994490539550781250E+03 + 0.993974670410156250E+03 + 0.993443237304687500E+03 + 0.992895751953125000E+03 + 0.992331726074218750E+03 + 0.991750732421875000E+03 + 0.991152160644531250E+03 + 0.990535522460937500E+03 + 0.989900268554687500E+03 + 0.989245849609375000E+03 + 0.988571716308593750E+03 + 0.987877258300781250E+03 + 0.987161804199218750E+03 + 0.986424743652343750E+03 + 0.985665466308593750E+03 + 0.984883300781250000E+03 + 0.984077575683593750E+03 + 0.983247558593750000E+03 + 0.982392517089843750E+03 + 0.981511657714843750E+03 + 0.980604248046875000E+03 + 0.979669494628906250E+03 + 0.978706604003906250E+03 + 0.977714660644531250E+03 + 0.976692871093750000E+03 + 0.975640258789062500E+03 + 0.974555969238281250E+03 + 0.973439025878906250E+03 + 0.972288452148437500E+03 + 0.971103271484375000E+03 + 0.969882385253906250E+03 + 0.968624755859375000E+03 + 0.967329284667968750E+03 + 0.965994873046875000E+03 + 0.964620300292968750E+03 + 0.963204345703125000E+03 + 0.961745849609375000E+03 + 0.960243469238281250E+03 + 0.958695861816406250E+03 + 0.957101684570312500E+03 + 0.955459594726562500E+03 + 0.953768066406250000E+03 + 0.952025695800781250E+03 + 0.950230895996093750E+03 + 0.948382080078125000E+03 + 0.946477539062500000E+03 + 0.944515625000000000E+03 + 0.942494628906250000E+03 + 0.940412597656250000E+03 + 0.938267517089843750E+03 + 0.936057495117187500E+03 + 0.933780517578125000E+03 + 0.931434814453125000E+03 + 0.929018859863281250E+03 + 0.926530639648437500E+03 + 0.923968017578125000E+03 + 0.921329467773437500E+03 + 0.918613830566406250E+03 + 0.915819274902343750E+03 + 0.912943603515625000E+03 + 0.909984741210937500E+03 + 0.906940002441406250E+03 + 0.903807189941406250E+03 + 0.900637023925781250E+03 + 0.897475952148437500E+03 + 0.894318542480468750E+03 + 0.891164794921875000E+03 + 0.888014648437500000E+03 + 0.884867736816406250E+03 + 0.881723388671875000E+03 + 0.878581359863281250E+03 + 0.875441650390625000E+03 + 0.872304260253906250E+03 + 0.869169372558593750E+03 + 0.866037109375000000E+03 + 0.862907470703125000E+03 + 0.859780456542968750E+03 + 0.856656066894531250E+03 + 0.853533996582031250E+03 + 0.850413879394531250E+03 + 0.847295715332031250E+03 + 0.844179565429687500E+03 + 0.841065368652343750E+03 + 0.837953063964843750E+03 + 0.834842590332031250E+03 + 0.831733947753906250E+03 + 0.828627075195312500E+03 + 0.825522033691406250E+03 + 0.822418762207031250E+03 + 0.819317382812500000E+03 + 0.816218139648437500E+03 + 0.813121276855468750E+03 + 0.810026733398437500E+03 + 0.806934509277343750E+03 + 0.803844604492187500E+03 + 0.800757019042968750E+03 + 0.797671752929687500E+03 + 0.794588684082031250E+03 + 0.791507812500000000E+03 + 0.788429077148437500E+03 + 0.785352539062500000E+03 + 0.782278137207031250E+03 + 0.779205932617187500E+03 + 0.776135864257812500E+03 + 0.773067871093750000E+03 + 0.770001892089843750E+03 + 0.766937866210937500E+03 + 0.763875854492187500E+03 + 0.760815856933593750E+03 + 0.757757812500000000E+03 + 0.754701782226562500E+03 + 0.751647705078125000E+03 + 0.748595458984375000E+03 + 0.745544860839843750E+03 + 0.742495910644531250E+03 + 0.739448547363281250E+03 + 0.736402832031250000E+03 + 0.733358764648437500E+03 + 0.730316345214843750E+03 + 0.727275573730468750E+03 + 0.724236389160156250E+03 + 0.721198791503906250E+03 + 0.718162780761718750E+03 + 0.715128295898437500E+03 + 0.712095397949218750E+03 + 0.709064025878906250E+03 + 0.706034179687500000E+03 + 0.703005920410156250E+03 + 0.699979187011718750E+03 + 0.696953979492187500E+03 + 0.693930480957031250E+03 + 0.690909362792968750E+03 + 0.687891052246093750E+03 + 0.684875549316406250E+03 + 0.681862854003906250E+03 + 0.678852966308593750E+03 + 0.675845886230468750E+03 + 0.672841613769531250E+03 + 0.669840148925781250E+03 + 0.666841430664062500E+03 + 0.663845520019531250E+03 + 0.660853393554687500E+03 + 0.657867553710937500E+03 + 0.654889465332031250E+03 + 0.651919006347656250E+03 + 0.648956176757812500E+03 + 0.646000915527343750E+03 + 0.643053222656250000E+03 + 0.640113037109375000E+03 + 0.637180297851562500E+03 + 0.634255004882812500E+03 + 0.631337097167968750E+03 + 0.628426513671875000E+03 + 0.625525024414062500E+03 + 0.622635375976562500E+03 + 0.619758666992187500E+03 + 0.616894775390625000E+03 + 0.614043579101562500E+03 + 0.611204956054687500E+03 + 0.608378845214843750E+03 + 0.605565063476562500E+03 + 0.602763549804687500E+03 + 0.599974182128906250E+03 + 0.597196899414062500E+03 + 0.594431518554687500E+03 + 0.591677978515625000E+03 + 0.588936157226562500E+03 + 0.586205932617187500E+03 + 0.583487182617187500E+03 + 0.580779785156250000E+03 + 0.578083679199218750E+03 + 0.575398742675781250E+03 + 0.572724853515625000E+03 + 0.570061950683593750E+03 + 0.567409973144531250E+03 + 0.564768798828125000E+03 + 0.562138366699218750E+03 + 0.559518554687500000E+03 + 0.556909301757812500E+03 + 0.554310485839843750E+03 + 0.551722045898437500E+03 + 0.549144042968750000E+03 + 0.546576477050781250E+03 + 0.544019226074218750E+03 + 0.541472229003906250E+03 + 0.538935424804687500E+03 + 0.536408691406250000E+03 + 0.533891967773437500E+03 + 0.531385192871093750E+03 + 0.528888305664062500E+03 + 0.526401184082031250E+03 + 0.523923767089843750E+03 + 0.521455993652343750E+03 + 0.518997741699218750E+03 + 0.516549011230468750E+03 + 0.514109680175781250E+03 + 0.511679656982421875E+03 + 0.509258758544921875E+03 + 0.506846771240234375E+03 + 0.504443664550781250E+03 + 0.502049346923828125E+03 + 0.499663757324218750E+03 + 0.497286834716796875E+03 + 0.494918518066406250E+03 + 0.492558746337890625E+03 + 0.490207458496093750E+03 + 0.487864593505859375E+03 + 0.485530090332031250E+03 + 0.483203887939453125E+03 + 0.480885925292968750E+03 + 0.478576141357421875E+03 + 0.476274475097656250E+03 + 0.473980895996093750E+03 + 0.471695312500000000E+03 + 0.469418365478515625E+03 + 0.467150939941406250E+03 + 0.464893218994140625E+03 + 0.462645141601562500E+03 + 0.460406616210937500E+03 + 0.458177581787109375E+03 + 0.455957946777343750E+03 + 0.453747619628906250E+03 + 0.451546539306640625E+03 + 0.449354614257812500E+03 + 0.447171783447265625E+03 + 0.444997985839843750E+03 + 0.442833129882812500E+03 + 0.440677124023437500E+03 + 0.438529907226562500E+03 + 0.436391418457031250E+03 + 0.434261566162109375E+03 + 0.432140319824218750E+03 + 0.430027587890625000E+03 +__th01dn01 + 250 + 0.309907257080078125E+03 + 0.309907257080078125E+03 + 0.309903442382812500E+03 + 0.309899536132812500E+03 + 0.309895507812500000E+03 + 0.309891326904296875E+03 + 0.309887084960937500E+03 + 0.309882690429687500E+03 + 0.309878173828125000E+03 + 0.309873474121093750E+03 + 0.309837249755859375E+03 + 0.309780731201171875E+03 + 0.309722473144531250E+03 + 0.309662506103515625E+03 + 0.309600708007812500E+03 + 0.309537078857421875E+03 + 0.309471557617187500E+03 + 0.309404052734375000E+03 + 0.309354461669921875E+03 + 0.309303985595703125E+03 + 0.309251983642578125E+03 + 0.309198394775390625E+03 + 0.309143280029296875E+03 + 0.309086425781250000E+03 + 0.309029907226562500E+03 + 0.308981628417968750E+03 + 0.308931823730468750E+03 + 0.308880584716796875E+03 + 0.308827789306640625E+03 + 0.308773406982421875E+03 + 0.308717437744140625E+03 + 0.308675170898437500E+03 + 0.308631835937500000E+03 + 0.308587158203125000E+03 + 0.308541168212890625E+03 + 0.308493804931640625E+03 + 0.308448333740234375E+03 + 0.308409912109375000E+03 + 0.308370330810546875E+03 + 0.308329589843750000E+03 + 0.308287597656250000E+03 + 0.308244415283203125E+03 + 0.308213623046875000E+03 + 0.308182525634765625E+03 + 0.308150482177734375E+03 + 0.308117492675781250E+03 + 0.308083526611328125E+03 + 0.308057464599609375E+03 + 0.308031372070312500E+03 + 0.308004486083984375E+03 + 0.307976806640625000E+03 + 0.307949096679687500E+03 + 0.307925598144531250E+03 + 0.307901367187500000E+03 + 0.307876373291015625E+03 + 0.307850708007812500E+03 + 0.307826171875000000E+03 + 0.307802551269531250E+03 + 0.307778198242187500E+03 + 0.307753112792968750E+03 + 0.307726074218750000E+03 + 0.307690704345703125E+03 + 0.307654296875000000E+03 + 0.307616790771484375E+03 + 0.307578186035156250E+03 + 0.307500701904296875E+03 + 0.307415069580078125E+03 + 0.307326873779296875E+03 + 0.307235961914062500E+03 + 0.307229034423828125E+03 + 0.307256225585937500E+03 + 0.307284088134765625E+03 + 0.307312591552734375E+03 + 0.307505554199218750E+03 + 0.307784240722656250E+03 + 0.308070953369140625E+03 + 0.308366088867187500E+03 + 0.308708312988281250E+03 + 0.309075897216796875E+03 + 0.309454406738281250E+03 + 0.309837829589843750E+03 + 0.310200683593750000E+03 + 0.310559356689453125E+03 + 0.310917999267578125E+03 + 0.311276550292968750E+03 + 0.311552001953125000E+03 + 0.311782836914062500E+03 + 0.312013671875000000E+03 + 0.312244445800781250E+03 + 0.312476989746093750E+03 + 0.312740447998046875E+03 + 0.313003845214843750E+03 + 0.313267303466796875E+03 + 0.313530700683593750E+03 + 0.313794006347656250E+03 + 0.313992218017578125E+03 + 0.314190429687500000E+03 + 0.314388671875000000E+03 + 0.314586883544921875E+03 + 0.314785034179687500E+03 + 0.314976348876953125E+03 + 0.315158874511718750E+03 + 0.315341430664062500E+03 + 0.315523956298828125E+03 + 0.315706481933593750E+03 + 0.315888977050781250E+03 + 0.316089813232421875E+03 + 0.316328582763671875E+03 + 0.316567352294921875E+03 + 0.316806091308593750E+03 + 0.317044860839843750E+03 + 0.317283569335937500E+03 + 0.317522308349609375E+03 + 0.317752563476562500E+03 + 0.317977111816406250E+03 + 0.318201660156250000E+03 + 0.318426208496093750E+03 + 0.318650726318359375E+03 + 0.318875274658203125E+03 + 0.319099761962890625E+03 + 0.319321105957031250E+03 + 0.319529602050781250E+03 + 0.319738098144531250E+03 + 0.319946594238281250E+03 + 0.320155059814453125E+03 + 0.320363525390625000E+03 + 0.320571990966796875E+03 + 0.320780426025390625E+03 + 0.320986938476562500E+03 + 0.321159851074218750E+03 + 0.321332794189453125E+03 + 0.321505676269531250E+03 + 0.321678619384765625E+03 + 0.321851531982421875E+03 + 0.322024505615234375E+03 + 0.322197418212890625E+03 + 0.322370330810546875E+03 + 0.322542480468750000E+03 + 0.322707763671875000E+03 + 0.322873046875000000E+03 + 0.323038360595703125E+03 + 0.323203643798828125E+03 + 0.323368896484375000E+03 + 0.323534179687500000E+03 + 0.323699493408203125E+03 + 0.323864776611328125E+03 + 0.324030029296875000E+03 + 0.324229919433593750E+03 + 0.324533386230468750E+03 + 0.324836853027343750E+03 + 0.325140289306640625E+03 + 0.325443725585937500E+03 + 0.325747222900390625E+03 + 0.326050659179687500E+03 + 0.326354095458984375E+03 + 0.326657531738281250E+03 + 0.326960998535156250E+03 + 0.327264465332031250E+03 + 0.327794219970703125E+03 + 0.328642883300781250E+03 + 0.329491577148437500E+03 + 0.330340240478515625E+03 + 0.331188934326171875E+03 + 0.332037597656250000E+03 + 0.332886291503906250E+03 + 0.333734985351562500E+03 + 0.334583648681640625E+03 + 0.335432312011718750E+03 + 0.336281005859375000E+03 + 0.337129699707031250E+03 + 0.338382720947265625E+03 + 0.339906707763671875E+03 + 0.341430664062500000E+03 + 0.342954620361328125E+03 + 0.344478576660156250E+03 + 0.346002563476562500E+03 + 0.347526519775390625E+03 + 0.349050476074218750E+03 + 0.350574432373046875E+03 + 0.352098419189453125E+03 + 0.353622375488281250E+03 + 0.355146331787109375E+03 + 0.356670288085937500E+03 + 0.358189758300781250E+03 + 0.359702392578125000E+03 + 0.361215026855468750E+03 + 0.362727661132812500E+03 + 0.364240295410156250E+03 + 0.365752899169921875E+03 + 0.367265533447265625E+03 + 0.368778167724609375E+03 + 0.370290802001953125E+03 + 0.371803436279296875E+03 + 0.373316070556640625E+03 + 0.374828704833984375E+03 + 0.376341308593750000E+03 + 0.377853942871093750E+03 + 0.379366577148437500E+03 + 0.380909759521484375E+03 + 0.382453399658203125E+03 + 0.383997070312500000E+03 + 0.385540771484375000E+03 + 0.387084411621093750E+03 + 0.388628082275390625E+03 + 0.390171752929687500E+03 + 0.391715393066406250E+03 + 0.393259063720703125E+03 + 0.394802734375000000E+03 + 0.396346374511718750E+03 + 0.397890045166015625E+03 + 0.399433715820312500E+03 + 0.400977355957031250E+03 + 0.402521057128906250E+03 + 0.404058654785156250E+03 + 0.405556640625000000E+03 + 0.407054626464843750E+03 + 0.408552612304687500E+03 + 0.410050598144531250E+03 + 0.411548583984375000E+03 + 0.413046569824218750E+03 + 0.414544555664062500E+03 + 0.416042572021484375E+03 + 0.417540557861328125E+03 + 0.419038543701171875E+03 + 0.420536529541015625E+03 + 0.422034515380859375E+03 + 0.423532501220703125E+03 + 0.425030487060546875E+03 + 0.426528472900390625E+03 + 0.428026458740234375E+03 + 0.429524444580078125E+03 + 0.431275360107421875E+03 + 0.433136871337890625E+03 + 0.434998413085937500E+03 + 0.436859954833984375E+03 + 0.438721466064453125E+03 + 0.440583007812500000E+03 + 0.442444519042968750E+03 + 0.444306030273437500E+03 + 0.446167541503906250E+03 + 0.448029083251953125E+03 + 0.449890594482421875E+03 + 0.451752105712890625E+03 + 0.453613647460937500E+03 + 0.455475158691406250E+03 + 0.457336669921875000E+03 + 0.459198211669921875E+03 + 0.461059722900390625E+03 + 0.462921234130859375E+03 + 0.464782745361328125E+03 +__dn01dn01 + 250 + 0.111670076847076416E+01 + 0.111583304405212402E+01 + 0.111495316028594971E+01 + 0.111404716968536377E+01 + 0.111311447620391846E+01 + 0.111215424537658691E+01 + 0.111116600036621094E+01 + 0.111014842987060547E+01 + 0.110910069942474365E+01 + 0.110802233219146729E+01 + 0.110702455043792725E+01 + 0.110606551170349121E+01 + 0.110507798194885254E+01 + 0.110406100749969482E+01 + 0.110301351547241211E+01 + 0.110193514823913574E+01 + 0.110082459449768066E+01 + 0.109968078136444092E+01 + 0.109843230247497559E+01 + 0.109714496135711670E+01 + 0.109581911563873291E+01 + 0.109445440769195557E+01 + 0.109304881095886230E+01 + 0.109160244464874268E+01 + 0.109010577201843262E+01 + 0.108853006362915039E+01 + 0.108690869808197021E+01 + 0.108523905277252197E+01 + 0.108352053165435791E+01 + 0.108175158500671387E+01 + 0.107993090152740479E+01 + 0.107800281047821045E+01 + 0.107601821422576904E+01 + 0.107397580146789551E+01 + 0.107187390327453613E+01 + 0.106971108913421631E+01 + 0.106747353076934814E+01 + 0.106514251232147217E+01 + 0.106274425983428955E+01 + 0.106027674674987793E+01 + 0.105773806571960449E+01 + 0.105512654781341553E+01 + 0.105239295959472656E+01 + 0.104957938194274902E+01 + 0.104668557643890381E+01 + 0.104370951652526855E+01 + 0.104064846038818359E+01 + 0.103747093677520752E+01 + 0.103420090675354004E+01 + 0.103083884716033936E+01 + 0.102738225460052490E+01 + 0.102382588386535645E+01 + 0.102015328407287598E+01 + 0.101637852191925049E+01 + 0.101249897480010986E+01 + 0.100851118564605713E+01 + 0.100440704822540283E+01 + 0.100018405914306641E+01 + 0.995845079421997070E+00 + 0.991387069225311279E+00 + 0.986811041831970215E+00 + 0.982134342193603516E+00 + 0.977330088615417480E+00 + 0.972395360469818115E+00 + 0.967327058315277100E+00 + 0.962239861488342285E+00 + 0.957032382488250732E+00 + 0.951683580875396729E+00 + 0.946190655231475830E+00 + 0.940284967422485352E+00 + 0.934121131896972656E+00 + 0.927799105644226074E+00 + 0.921316146850585938E+00 + 0.914183199405670166E+00 + 0.906644761562347412E+00 + 0.898932337760925293E+00 + 0.891043782234191895E+00 + 0.882866740226745605E+00 + 0.874464094638824463E+00 + 0.865876972675323486E+00 + 0.857247173786163330E+00 + 0.848756194114685059E+00 + 0.840344369411468506E+00 + 0.831999599933624268E+00 + 0.823721885681152344E+00 + 0.815726816654205322E+00 + 0.807905972003936768E+00 + 0.800140321254730225E+00 + 0.792429745197296143E+00 + 0.784769535064697266E+00 + 0.777087628841400146E+00 + 0.769462049007415771E+00 + 0.761892855167388916E+00 + 0.754379570484161377E+00 + 0.746922433376312256E+00 + 0.739673197269439697E+00 + 0.732474088668823242E+00 + 0.725325345993041992E+00 + 0.718226611614227295E+00 + 0.711177647113800049E+00 + 0.704193413257598877E+00 + 0.697277009487152100E+00 + 0.690408766269683838E+00 + 0.683588266372680664E+00 + 0.676815092563629150E+00 + 0.670089662075042725E+00 + 0.663372635841369629E+00 + 0.656625390052795410E+00 + 0.649928510189056396E+00 + 0.643281519412994385E+00 + 0.636684298515319824E+00 + 0.630136549472808838E+00 + 0.623638093471527100E+00 + 0.617204904556274414E+00 + 0.610830605030059814E+00 + 0.604504227638244629E+00 + 0.598224937915802002E+00 + 0.591992735862731934E+00 + 0.585807383060455322E+00 + 0.579668641090393066E+00 + 0.573581755161285400E+00 + 0.567563652992248535E+00 + 0.561590433120727539E+00 + 0.555661857128143311E+00 + 0.549777865409851074E+00 + 0.543938159942626953E+00 + 0.538142383098602295E+00 + 0.532390475273132324E+00 + 0.526685476303100586E+00 + 0.521077871322631836E+00 + 0.515511572360992432E+00 + 0.509986519813537598E+00 + 0.504501998424530029E+00 + 0.499058365821838379E+00 + 0.493655264377593994E+00 + 0.488292634487152100E+00 + 0.482970029115676880E+00 + 0.477688550949096680E+00 + 0.472456902265548706E+00 + 0.467264503240585327E+00 + 0.462111085653305054E+00 + 0.456996619701385498E+00 + 0.451920777559280396E+00 + 0.446883529424667358E+00 + 0.441884607076644897E+00 + 0.436923891305923462E+00 + 0.432001203298568726E+00 + 0.427071005105972290E+00 + 0.422046124935150146E+00 + 0.417064964771270752E+00 + 0.412127494812011719E+00 + 0.407233268022537231E+00 + 0.402381867170333862E+00 + 0.397573441267013550E+00 + 0.392807364463806152E+00 + 0.388083606958389282E+00 + 0.383401602506637573E+00 + 0.378761231899261475E+00 + 0.373905450105667114E+00 + 0.368744522333145142E+00 + 0.363649308681488037E+00 + 0.358618944883346558E+00 + 0.353652417659759521E+00 + 0.348749011754989624E+00 + 0.343907982110977173E+00 + 0.339128553867340088E+00 + 0.334409743547439575E+00 + 0.329751104116439819E+00 + 0.325151473283767700E+00 + 0.320610284805297852E+00 + 0.315751373767852783E+00 + 0.310720592737197876E+00 + 0.305775552988052368E+00 + 0.300914704799652100E+00 + 0.296136260032653809E+00 + 0.291438698768615723E+00 + 0.286820471286773682E+00 + 0.282280057668685913E+00 + 0.277815908193588257E+00 + 0.273426502943038940E+00 + 0.269110709428787231E+00 + 0.264866828918457031E+00 + 0.260693699121475220E+00 + 0.256593018770217896E+00 + 0.252564996480941772E+00 + 0.248603314161300659E+00 + 0.244706809520721436E+00 + 0.240874215960502625E+00 + 0.237104281783103943E+00 + 0.233396038413047791E+00 + 0.229748144745826721E+00 + 0.226159617304801941E+00 + 0.222629338502883911E+00 + 0.219156369566917419E+00 + 0.215739503502845764E+00 + 0.212377756834030151E+00 + 0.209070175886154175E+00 + 0.205815732479095459E+00 + 0.202597439289093018E+00 + 0.199431061744689941E+00 + 0.196315750479698181E+00 + 0.193250760436058044E+00 + 0.190235123038291931E+00 + 0.187267929315567017E+00 + 0.184348374605178833E+00 + 0.181475609540939331E+00 + 0.178648769855499268E+00 + 0.175867006182670593E+00 + 0.173129573464393616E+00 + 0.170435711741447449E+00 + 0.167784586548805237E+00 + 0.165175482630729675E+00 + 0.162607654929161072E+00 + 0.160082861781120300E+00 + 0.157613083720207214E+00 + 0.155181482434272766E+00 + 0.152787685394287109E+00 + 0.150430813431739807E+00 + 0.148110300302505493E+00 + 0.145825594663619995E+00 + 0.143576085567474365E+00 + 0.141361102461814880E+00 + 0.139180153608322144E+00 + 0.137032672762870789E+00 + 0.134918078780174255E+00 + 0.132835820317268372E+00 + 0.130785390734672546E+00 + 0.128766208887100220E+00 + 0.126777827739715576E+00 + 0.124819725751876831E+00 + 0.122891381382942200E+00 + 0.120921768248081207E+00 + 0.118954420089721680E+00 + 0.117020443081855774E+00 + 0.115119203925132751E+00 + 0.113250114023685455E+00 + 0.111412584781646729E+00 + 0.109605960547924042E+00 + 0.107829689979553223E+00 + 0.106083236634731293E+00 + 0.104365974664688110E+00 + 0.102677382528781891E+00 + 0.101016990840435028E+00 + 0.993841886520385742E-01 + 0.977785140275955200E-01 + 0.961994454264640808E-01 + 0.946464836597442627E-01 + 0.931192040443420410E-01 + 0.916170924901962280E-01 + 0.901397019624710083E-01 +__rt01dn01 + 250 + 0.157400742173194885E-01 + 0.157400742173194885E-01 + 0.157197769731283188E-01 + 0.156988706439733505E-01 + 0.156773384660482407E-01 + 0.156551580876111984E-01 + 0.156323146075010300E-01 + 0.156087838113307953E-01 + 0.155845480039715767E-01 + 0.155595848336815834E-01 + 0.155360717326402664E-01 + 0.155131984502077103E-01 + 0.154896397143602371E-01 + 0.154653731733560562E-01 + 0.154403792694211006E-01 + 0.154146356508135796E-01 + 0.153881199657917023E-01 + 0.153608079999685287E-01 + 0.153312394395470619E-01 + 0.153007395565509796E-01 + 0.152693241834640503E-01 + 0.152369672432541847E-01 + 0.152036398649215698E-01 + 0.151693113148212433E-01 + 0.151335047557950020E-01 + 0.150943771004676819E-01 + 0.150540759786963463E-01 + 0.150125650689005852E-01 + 0.149698099121451378E-01 + 0.149257713928818703E-01 + 0.148804122582077980E-01 + 0.148314256221055984E-01 + 0.147809488698840141E-01 + 0.147289568558335304E-01 + 0.146754058077931404E-01 + 0.146202482283115387E-01 + 0.145624317228794098E-01 + 0.145003683865070343E-01 + 0.144364433363080025E-01 + 0.143706006929278374E-01 + 0.143027827143669128E-01 + 0.142329297959804535E-01 + 0.141618810594081879E-01 + 0.140887415036559105E-01 + 0.140134068205952644E-01 + 0.139358118176460266E-01 + 0.138558903709053993E-01 + 0.137731982395052910E-01 + 0.136879952624440193E-01 + 0.136002376675605774E-01 + 0.135098462924361229E-01 + 0.134156541898846626E-01 + 0.133118750527501106E-01 + 0.132049825042486191E-01 + 0.130948834121227264E-01 + 0.129814818501472473E-01 + 0.128611130639910698E-01 + 0.127342399209737778E-01 + 0.126035604625940323E-01 + 0.124689601361751556E-01 + 0.123188504949212074E-01 + 0.120928045362234116E-01 + 0.118599776178598404E-01 + 0.116201657801866531E-01 + 0.113731585443019867E-01 + 0.108122359961271286E-01 + 0.101871732622385025E-01 + 0.954335834830999374E-02 + 0.888023152947425842E-02 + 0.814564153552055359E-02 + 0.736850779503583908E-02 + 0.656806118786334991E-02 + 0.574360042810440063E-02 + 0.511736655607819557E-02 + 0.458150403574109077E-02 + 0.402956502512097359E-02 + 0.346106919459998608E-02 + 0.315951509401202202E-02 + 0.295987166464328766E-02 + 0.275420234538614750E-02 + 0.254582636989653111E-02 + 0.240100966766476631E-02 + 0.226934440433979034E-02 + 0.213767914101481438E-02 + 0.200601387768983841E-02 + 0.188496639020740986E-02 + 0.176962336990982294E-02 + 0.165428023319691420E-02 + 0.153893709648400545E-02 + 0.142714334651827812E-02 + 0.137570430524647236E-02 + 0.132426526397466660E-02 + 0.127282633911818266E-02 + 0.122138729784637690E-02 + 0.116997293662279844E-02 + 0.114299450069665909E-02 + 0.111601618118584156E-02 + 0.108903786167502403E-02 + 0.106205942574888468E-02 + 0.103508110623806715E-02 + 0.100341590587049723E-02 + 0.965809798799455166E-03 + 0.928203691728413105E-03 + 0.890597584657371044E-03 + 0.852991419378668070E-03 + 0.815385312307626009E-03 + 0.778890273068100214E-03 + 0.744703225791454315E-03 + 0.710516120307147503E-03 + 0.676329073030501604E-03 + 0.642141967546194792E-03 + 0.607954920269548893E-03 + 0.573767814785242081E-03 + 0.543858448509126902E-03 + 0.516833271831274033E-03 + 0.489808095153421164E-03 + 0.462782976683229208E-03 + 0.435757800005376339E-03 + 0.408732681535184383E-03 + 0.381707504857331514E-03 + 0.355890952050685883E-03 + 0.335007964167743921E-03 + 0.314125005388632417E-03 + 0.293242046609520912E-03 + 0.272359058726578951E-03 + 0.251476070843636990E-03 + 0.230593112064525485E-03 + 0.209710153285413980E-03 + 0.189310128916986287E-03 + 0.177026522578671575E-03 + 0.164742901688441634E-03 + 0.152459295350126922E-03 + 0.140175674459896982E-03 + 0.127892068121582270E-03 + 0.115608447231352329E-03 + 0.103324840893037617E-03 + 0.910412200028076768E-04 + 0.793839499237947166E-04 + 0.732929765945300460E-04 + 0.672020032652653754E-04 + 0.611110299360007048E-04 + 0.550200566067360342E-04 + 0.489290869154501706E-04 + 0.428381135861855000E-04 + 0.367471402569208294E-04 + 0.306561669276561588E-04 + 0.245651935983914882E-04 + 0.197688186744926497E-04 + 0.188459234777837992E-04 + 0.179230301000643522E-04 + 0.170001349033555016E-04 + 0.160772415256360546E-04 + 0.151543463289272040E-04 + 0.142314529512077570E-04 + 0.133085586639936082E-04 + 0.123856643767794594E-04 + 0.114627700895653106E-04 + 0.105398758023511618E-04 + 0.968389485933585092E-05 + 0.892223033588379622E-05 + 0.816056490293703973E-05 + 0.739890037948498502E-05 + 0.663723540128557943E-05 + 0.587557042308617383E-05 + 0.511390544488676824E-05 + 0.435224092143471353E-05 + 0.359057594323530793E-05 + 0.282891096503590234E-05 + 0.206724598683649674E-05 + 0.130558146338444203E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 +__kppzm + 48 + -0.170577192306518555E+01 + -0.515288019180297852E+01 + -0.867263221740722656E+01 + -0.122681560516357422E+02 + -0.159427862167358398E+02 + -0.197000827789306641E+02 + -0.235438518524169922E+02 + -0.274781646728515625E+02 + -0.315073947906494141E+02 + -0.356362304687500000E+02 + -0.398697319030761719E+02 + -0.442133331298828125E+02 + -0.486729240417480469E+02 + -0.532548675537109375E+02 + -0.579660606384277344E+02 + -0.628140220642089844E+02 + -0.678069229125976563E+02 + -0.729536972045898438E+02 + -0.782641372680664063E+02 + -0.837490005493164063E+02 + -0.894201202392578125E+02 + -0.952906188964843750E+02 + -0.101375022888183594E+03 + -0.107689506530761719E+03 + -0.114252166748046875E+03 + -0.121083328247070312E+03 + -0.128205902099609375E+03 + -0.135645858764648437E+03 + -0.143432846069335937E+03 + -0.151600814819335937E+03 + -0.160188995361328125E+03 + -0.169243026733398437E+03 + -0.178816345214843750E+03 + -0.188972213745117187E+03 + -0.199786239624023437E+03 + -0.211349731445312500E+03 + -0.223774444580078125E+03 + -0.237199188232421875E+03 + -0.251799423217773437E+03 + -0.267801239013671875E+03 + -0.285503112792968750E+03 + -0.305310638427734375E+03 + -0.327794952392578125E+03 + -0.353797454833984375E+03 + -0.384634338378906250E+03 + -0.422540863037109375E+03 + -0.471808868408203125E+03 + -0.500000000000000000E+03 +__gnu + 8 + 0.400000000000000000E+01 + 0.200000000000000000E+01 + 0.200000000000000000E+01 + 0.200000000000000000E+01 + 0.200000000000000000E+01 + 0.200000000000000000E+01 + 0.200000000000000000E+01 + 0.400000000000000000E+01 +__iaero_chem + 11 + 1 + 1 + 1 + 1 + 2 + 2 + 2 + 1 + 1 + 1 + 1 +__cfmas + 16 + 0.524000000000000000E+03 + 0.524000000000000000E+03 + 0.110800003051757812E+03 + 0.273899990133941174E-02 + 0.495999991893768311E+00 + 0.157000000000000000E+03 + 0.471000000000000000E+03 + 0.885399997234344482E+00 + 0.377000006847083569E-02 + 0.123000005260109901E-02 + 0.100100003182888031E+00 + 0.885399997234344482E+00 + 0.377000006847083569E-02 + 0.123000005260109901E-02 + 0.100100003182888031E+00 + 0.524000000000000000E+03 +__pwmas + 16 + 0.300000000000000000E+01 + 0.300000000000000000E+01 + 0.291000008583068848E+01 + 0.174000000953674316E+01 + 0.240000009536743164E+01 + 0.300000000000000000E+01 + 0.300000000000000000E+01 + 0.250000000000000000E+01 + 0.200000000000000000E+01 + 0.179999995231628418E+01 + 0.225600004196166992E+01 + 0.250000000000000000E+01 + 0.200000000000000000E+01 + 0.179999995231628418E+01 + 0.225600004196166992E+01 + 0.300000000000000000E+01 +__slcpd + 12 + 0.146500000000000000E+07 + 0.140700000000000000E+07 + 0.134400000000000000E+07 + 0.127300000000000000E+07 + 0.121400000000000000E+07 + 0.117700000000000000E+07 + 0.131900000000000000E+07 + 0.122700000000000000E+07 + 0.117700000000000000E+07 + 0.115100000000000000E+07 + 0.108800000000000000E+07 + 0.874000000000000000E+06 +__slmsts + 12 + 0.395000010728836060E+00 + 0.409999996423721313E+00 + 0.435000002384185791E+00 + 0.485000014305114746E+00 + 0.451000005006790161E+00 + 0.419999986886978149E+00 + 0.476999998092651367E+00 + 0.476000010967254639E+00 + 0.425999999046325684E+00 + 0.492000013589859009E+00 + 0.481999993324279785E+00 + 0.862999975681304932E+00 +__slz + 11 + -0.500000000000000000E+00 + -0.400000005960464478E+00 + -0.300000011920928955E+00 + -0.250000000000000000E+00 + -0.200000002980232239E+00 + -0.159999996423721313E+00 + -0.119999997317790985E+00 + -0.900000035762786865E-01 + -0.599999986588954926E-01 + -0.299999993294477463E-01 + -0.999999977648258209E-02 diff --git a/bin.rams/test.supercell/a-A-1991-04-26-211000-head.txt b/bin.rams/test.supercell/a-A-1991-04-26-211000-head.txt new file mode 100644 index 0000000..90a1986 --- /dev/null +++ b/bin.rams/test.supercell/a-A-1991-04-26-211000-head.txt @@ -0,0 +1,3638 @@ + 257 +UP 0 3 1 218750 +VP 0 3 1 218750 +WP 0 3 1 218750 +PP 0 3 1 218750 +UC 0 3 1 218750 +VC 0 3 1 218750 +WC 0 3 1 218750 +PC 0 3 1 218750 +THP 0 3 1 218750 +RTP 0 3 1 218750 +THETA 0 3 1 218750 +RV 0 3 1 218750 +DN0 0 3 1 218750 +WP_BUOY_THETA 0 3 1 218750 +WP_BUOY_COND 0 3 1 218750 +WP_ADVDIF 0 3 1 218750 +SOIL_WATER 0 4 1 19250 +SOIL_ENERGY 0 4 1 19250 +SOIL_TEXT 0 4 1 19250 +SFCWATER_MASS 0 5 1 1750 +SFCWATER_ENERGY 0 5 1 1750 +SFCWATER_DEPTH 0 5 1 1750 +USTAR 0 6 1 1750 +TSTAR 0 6 1 1750 +RSTAR 0 6 1 1750 +VEG_FRACAREA 0 6 1 1750 +VEG_LAI 0 6 1 1750 +VEG_ROUGH 0 6 1 1750 +VEG_HEIGHT 0 6 1 1750 +VEG_ALBEDO 0 6 1 1750 +VEG_TAI 0 6 1 1750 +PATCH_AREA 0 6 1 1750 +PATCH_ROUGH 0 6 1 1750 +LEAF_CLASS 0 6 1 1750 +SOIL_ROUGH 0 6 1 1750 +SFCWATER_NLEV 0 6 1 1750 +STOM_RESIST 0 6 1 1750 +GROUND_RSAT 0 6 1 1750 +GROUND_RVAP 0 6 1 1750 +VEG_WATER 0 6 1 1750 +VEG_TEMP 0 6 1 1750 +CAN_RVAP 0 6 1 1750 +CAN_TEMP 0 6 1 1750 +VEG_NDVIP 0 6 1 1750 +VEG_NDVIC 0 6 1 1750 +VEG_NDVIF 0 6 1 1750 +KPP_OLD 0 2 1 875 +KPP_NEW 0 2 1 875 +KPP_JERLOV 0 2 1 875 +KPP_OCDEPTH 0 2 1 875 +KPP_HMIX 0 2 1 875 +KPP_BOTTOMT 0 2 1 875 +KPP_SREF 0 2 1 875 +KPP_FREEZ_FLAG 0 2 1 875 +KPP_RESET_FLAG 0 2 1 875 +KPP_FLX_UST 0 2 1 875 +KPP_FLX_VST 0 2 1 875 +KPP_FLX_NSW 0 2 1 875 +KPP_FLX_NLW 0 2 1 875 +KPP_FLX_ICE 0 2 1 875 +KPP_FLX_PCP 0 2 1 875 +KPP_SWDK_OPT 0 10 1 42000 +KPP_SWFRAC 0 10 1 42000 +KPP_SAL_CLIM 0 10 1 42000 +KPP_OCNT_CLIM 0 10 1 42000 +KPP_BUOY 0 10 1 42000 +KPP_U 0 10 1 42000 +KPP_V 0 10 1 42000 +KPP_U_init 0 10 1 42000 +KPP_V_init 0 10 1 42000 +KPP_US0 0 10 1 42000 +KPP_US1 0 10 1 42000 +KPP_VS0 0 10 1 42000 +KPP_VS1 0 10 1 42000 +KPP_X_T 0 10 1 42000 +KPP_X_S 0 10 1 42000 +KPP_XS_T0 0 10 1 42000 +KPP_XS_T1 0 10 1 42000 +KPP_XS_S0 0 10 1 42000 +KPP_XS_S1 0 10 1 42000 +RCP 0 3 1 218750 +RDP 0 3 1 218750 +RRP 0 3 1 218750 +RPP 0 3 1 218750 +RSP 0 3 1 218750 +RAP 0 3 1 218750 +RGP 0 3 1 218750 +RHP 0 3 1 218750 +CCP 0 3 1 218750 +CDP 0 3 1 218750 +CRP 0 3 1 218750 +CPP 0 3 1 218750 +CSP 0 3 1 218750 +CAP 0 3 1 218750 +CGP 0 3 1 218750 +CHP 0 3 1 218750 +Q2 0 3 1 218750 +Q6 0 3 1 218750 +Q7 0 3 1 218750 +CCCNP 0 3 1 218750 +GCCNP 0 3 1 218750 +CCCMP 0 3 1 218750 +GCCMP 0 3 1 218750 +MD1NP 0 3 1 218750 +MD2NP 0 3 1 218750 +MD1MP 0 3 1 218750 +MD2MP 0 3 1 218750 +SALT_FILM_NP 0 3 1 218750 +SALT_JET_NP 0 3 1 218750 +SALT_SPUM_NP 0 3 1 218750 +SALT_FILM_MP 0 3 1 218750 +SALT_JET_MP 0 3 1 218750 +SALT_SPUM_MP 0 3 1 218750 +REGEN_AERO1_NP 0 3 1 218750 +REGEN_AERO1_MP 0 3 1 218750 +REGEN_AERO2_NP 0 3 1 218750 +REGEN_AERO2_MP 0 3 1 218750 +IMMERCP 0 3 1 218750 +IMMERDP 0 3 1 218750 +IMMERRP 0 3 1 218750 +IFNNUCP 0 3 1 218750 +CNMCP 0 3 1 218750 +CNMDP 0 3 1 218750 +CNMRP 0 3 1 218750 +CNMPP 0 3 1 218750 +CNMSP 0 3 1 218750 +CNMAP 0 3 1 218750 +CNMGP 0 3 1 218750 +CNMHP 0 3 1 218750 +DNMCP 0 3 1 218750 +DNMDP 0 3 1 218750 +DNMRP 0 3 1 218750 +DNMPP 0 3 1 218750 +DNMSP 0 3 1 218750 +DNMAP 0 3 1 218750 +DNMGP 0 3 1 218750 +DNMHP 0 3 1 218750 +DINCP 0 3 1 218750 +DINDP 0 3 1 218750 +DINRP 0 3 1 218750 +DINPP 0 3 1 218750 +DINSP 0 3 1 218750 +DINAP 0 3 1 218750 +DINGP 0 3 1 218750 +DINHP 0 3 1 218750 +SNMCP 0 3 1 218750 +SNMDP 0 3 1 218750 +SNMRP 0 3 1 218750 +SNMPP 0 3 1 218750 +SNMSP 0 3 1 218750 +SNMAP 0 3 1 218750 +SNMGP 0 3 1 218750 +SNMHP 0 3 1 218750 +RESOL_AERO1_MP 0 3 1 218750 +RESOL_AERO2_MP 0 3 1 218750 +PCPVR 0 3 1 218750 +PCPVP 0 3 1 218750 +PCPVS 0 3 1 218750 +PCPVA 0 3 1 218750 +PCPVG 0 3 1 218750 +PCPVH 0 3 1 218750 +PCPVD 0 3 1 218750 +LATHEATVAP 0 3 1 218750 +LATHEATFRZ 0 3 1 218750 +NUCCLDRT 0 3 1 218750 +CLD2RAINT 0 3 1 218750 +ICE2RAINT 0 3 1 218750 +NUCICERT 0 3 1 218750 +VAPLIQT 0 3 1 218750 +VAPICET 0 3 1 218750 +MELTICET 0 3 1 218750 +RIMECLDT 0 3 1 218750 +RAIN2ICET 0 3 1 218750 +AGGREGATET 0 3 1 218750 +LATHEATVAPT 0 3 1 218750 +LATHEATFRZT 0 3 1 218750 +INUCHOMRT 0 3 1 218750 +INUCCONTRT 0 3 1 218750 +INUCIFNRT 0 3 1 218750 +INUCHAZRT 0 3 1 218750 +VAPCLDT 0 3 1 218750 +VAPRAINT 0 3 1 218750 +VAPPRIST 0 3 1 218750 +VAPSNOWT 0 3 1 218750 +VAPAGGRT 0 3 1 218750 +VAPGRAUT 0 3 1 218750 +VAPHAILT 0 3 1 218750 +VAPDRIZT 0 3 1 218750 +MELTPRIST 0 3 1 218750 +MELTSNOWT 0 3 1 218750 +MELTAGGRT 0 3 1 218750 +MELTGRAUT 0 3 1 218750 +MELTHAILT 0 3 1 218750 +RIMECLDSNOWT 0 3 1 218750 +RIMECLDAGGRT 0 3 1 218750 +RIMECLDGRAUT 0 3 1 218750 +RIMECLDHAILT 0 3 1 218750 +RAIN2PRT 0 3 1 218750 +RAIN2SNT 0 3 1 218750 +RAIN2AGT 0 3 1 218750 +RAIN2GRT 0 3 1 218750 +RAIN2HAT 0 3 1 218750 +AGGRSELFPRIST 0 3 1 218750 +AGGRSELFSNOWT 0 3 1 218750 +AGGRPRISSNOWT 0 3 1 218750 +DUST1CLDRT 0 3 1 218750 +DUST2CLDRT 0 3 1 218750 +DUST1DRZRT 0 3 1 218750 +DUST2DRZRT 0 3 1 218750 +ACCPR 0 2 1 875 +ACCPP 0 2 1 875 +ACCPS 0 2 1 875 +ACCPA 0 2 1 875 +ACCPG 0 2 1 875 +ACCPH 0 2 1 875 +ACCPD 0 2 1 875 +PCPRR 0 2 1 875 +PCPRP 0 2 1 875 +PCPRS 0 2 1 875 +PCPRA 0 2 1 875 +PCPRG 0 2 1 875 +PCPRH 0 2 1 875 +PCPRD 0 2 1 875 +PCPG 0 2 1 875 +QPCPG 0 2 1 875 +DPCPG 0 2 1 875 +ACCPAERO 0 2 1 875 +PCPRAERO 0 2 1 875 +ACCPDUST 0 2 1 875 +PCPRDUST 0 2 1 875 +FTHRD 0 3 1 218750 +BEXT 0 3 1 218750 +SWUP 0 3 1 218750 +SWDN 0 3 1 218750 +LWUP 0 3 1 218750 +LWDN 0 3 1 218750 +RSHORT 0 2 1 875 +RLONG 0 2 1 875 +RLONGUP 0 2 1 875 +ALBEDT 0 2 1 875 +COSZ 0 2 1 875 +AODT 0 2 1 875 +RHKM 0 3 1 218750 +RVKM 0 3 1 218750 +RVKH 0 3 1 218750 +SFLUX_U 0 2 1 875 +SFLUX_V 0 2 1 875 +SFLUX_W 0 2 1 875 +SFLUX_T 0 2 1 875 +SFLUX_R 0 2 1 875 +TOPT 0 2 1 875 +GLAT 0 2 1 875 +GLON 0 2 1 875 +TOPZO 0 2 1 875 +PI 1 3 1 218750 +HKH 1 3 1 218750 +VKH 1 3 1 218750 +__expnme + 1 +RAMS Simulations +__initial + 1 + 1 +__initorig + 1 + 1 +__jdim + 1 + 1 +__iyear1 + 1 + 1991 +__imonth1 + 1 + 4 +__idate1 + 1 + 26 +__itime1 + 1 + 2100 +__time + 1 + 0.600000000000000000E+03 +__nsndg + 1 + 35 +__us + 35 + -0.271000003814697266E+01 + -0.271000003814697266E+01 + -0.353999996185302734E+01 + -0.339000010490417480E+01 + -0.277999997138977051E+01 + -0.174000000953674316E+01 + -0.360000014305114746E+00 + 0.125000000000000000E+01 + 0.294000005722045898E+01 + 0.457999992370605469E+01 + 0.607000017166137695E+01 + 0.730000019073486328E+01 + 0.852999973297119141E+01 + 0.967000007629394531E+01 + 0.108999996185302734E+02 + 0.120900001525878906E+02 + 0.128400001525878906E+02 + 0.151300001144409180E+02 + 0.167000007629394531E+02 + 0.173600006103515625E+02 + 0.174400005340576172E+02 + 0.170400009155273438E+02 + 0.168299999237060547E+02 + 0.170599994659423828E+02 + 0.183799991607666016E+02 + 0.203899993896484375E+02 + 0.233099994659423828E+02 + 0.281800003051757813E+02 + 0.248199996948242188E+02 + 0.211499996185302734E+02 + 0.175100002288818359E+02 + 0.965999984741210938E+01 + 0.200999999046325684E+01 + 0.500000000000000000E+00 + -0.103999996185302734E+01 +__vs + 35 + 0.838000011444091797E+01 + 0.838000011444091797E+01 + 0.106599998474121094E+02 + 0.122500000000000000E+02 + 0.134600000381469727E+02 + 0.142600002288818359E+02 + 0.146400003433227539E+02 + 0.146599998474121094E+02 + 0.144099998474121094E+02 + 0.140299997329711914E+02 + 0.137200002670288086E+02 + 0.136199998855590820E+02 + 0.138299999237060547E+02 + 0.142600002288818359E+02 + 0.154700002670288086E+02 + 0.160300006866455078E+02 + 0.188700008392333984E+02 + 0.190900001525878906E+02 + 0.186000003814697266E+02 + 0.189099998474121094E+02 + 0.199799995422363281E+02 + 0.211800003051757813E+02 + 0.216200008392333984E+02 + 0.218400001525878906E+02 + 0.223400001525878906E+02 + 0.227000007629394531E+02 + 0.227399997711181641E+02 + 0.198400001525878906E+02 + 0.181599998474121094E+02 + 0.161700000762939453E+02 + 0.118999996185302734E+02 + 0.850000000000000000E+01 + 0.347000002861022949E+01 + 0.350000000000000000E+01 + 0.352999997138977051E+01 +__ts + 35 + 0.306079376220703125E+03 + 0.305112518310546875E+03 + 0.303622192382812500E+03 + 0.302135650634765625E+03 + 0.300582458496093750E+03 + 0.298970092773437500E+03 + 0.297265472412109375E+03 + 0.295463653564453125E+03 + 0.293529083251953125E+03 + 0.291434265136718750E+03 + 0.289150360107421875E+03 + 0.286665008544921875E+03 + 0.284018432617187500E+03 + 0.281624572753906250E+03 + 0.279662200927734375E+03 + 0.277406005859375000E+03 + 0.274758117675781250E+03 + 0.271294006347656250E+03 + 0.267552581787109375E+03 + 0.263083618164062500E+03 + 0.258075958251953125E+03 + 0.252843017578125000E+03 + 0.246956115722656250E+03 + 0.240328781127929687E+03 + 0.232743484497070312E+03 + 0.224288635253906250E+03 + 0.215936080932617187E+03 + 0.210840881347656250E+03 + 0.210143768310546875E+03 + 0.208462387084960937E+03 + 0.205940200805664062E+03 + 0.201693786621093750E+03 + 0.198953125000000000E+03 + 0.194737899780273437E+03 + 0.189301940917968750E+03 +__thds + 35 + 0.306959991455078125E+03 + 0.306960021972656250E+03 + 0.306529998779296875E+03 + 0.306209960937500000E+03 + 0.305939971923828125E+03 + 0.305740020751953125E+03 + 0.305589965820312500E+03 + 0.305500000000000000E+03 + 0.305450012207031250E+03 + 0.305429992675781250E+03 + 0.305429992675781250E+03 + 0.305459991455078125E+03 + 0.305589965820312500E+03 + 0.306299987792968750E+03 + 0.307829986572265625E+03 + 0.309429992675781250E+03 + 0.311029968261718750E+03 + 0.312190032958984375E+03 + 0.313570007324218750E+03 + 0.314700012207031250E+03 + 0.315859985351562500E+03 + 0.317509979248046875E+03 + 0.319209991455078125E+03 + 0.320940002441406250E+03 + 0.322510009765625000E+03 + 0.324149963378906250E+03 + 0.327439971923828125E+03 + 0.337469970703125000E+03 + 0.357589996337890625E+03 + 0.379390014648437500E+03 + 0.403859985351562500E+03 + 0.429979980468750000E+03 + 0.465670013427734375E+03 + 0.503269989013671875E+03 + 0.541519958496093750E+03 +__ps + 35 + 0.990000000000000000E+05 + 0.979103046875000000E+05 + 0.967206328125000000E+05 + 0.954221953125000000E+05 + 0.940067812500000000E+05 + 0.924657890625000000E+05 + 0.907903359375000000E+05 + 0.889713671875000000E+05 + 0.869998593750000000E+05 + 0.848665859375000000E+05 + 0.825626484375000000E+05 + 0.800791093750000000E+05 + 0.774072031250000000E+05 + 0.745411562500000000E+05 + 0.714829531250000000E+05 + 0.682369765625000000E+05 + 0.648056328125000000E+05 + 0.611899843750000000E+05 + 0.573959570312500000E+05 + 0.534349296875000000E+05 + 0.493217070312500000E+05 + 0.450816445312500000E+05 + 0.407470156250000000E+05 + 0.363542890625000000E+05 + 0.319460332031250000E+05 + 0.275735761718750000E+05 + 0.233073164062500000E+05 + 0.192918867187500000E+05 + 0.155726064453125000E+05 + 0.123097558593750000E+05 + 0.947972363281250000E+04 + 0.707827929687500000E+04 + 0.510501708984375000E+04 + 0.360986938476562500E+04 + 0.253038891601562500E+04 +__hs + 35 + 0.000000000000000000E+00 + 0.100002868652343750E+03 + 0.210000503540039062E+03 + 0.330998321533203125E+03 + 0.464095123291015625E+03 + 0.610502075195312500E+03 + 0.771550354003906250E+03 + 0.948713012695312500E+03 + 0.114357568359375000E+04 + 0.135793383789062500E+04 + 0.159372290039062500E+04 + 0.185310449218750000E+04 + 0.213841821289062500E+04 + 0.245225878906250000E+04 + 0.279748461914062500E+04 + 0.317723657226562500E+04 + 0.359496240234375000E+04 + 0.405446093750000000E+04 + 0.455991406250000000E+04 + 0.511591503906250000E+04 + 0.572751757812500000E+04 + 0.640028662109375000E+04 + 0.714033789062500000E+04 + 0.795439843750000000E+04 + 0.884990039062500000E+04 + 0.983496484375000000E+04 + 0.109185126953125000E+05 + 0.121001347656250000E+05 + 0.134203779296875000E+05 + 0.148615781250000000E+05 + 0.164467695312500000E+05 + 0.181904414062500000E+05 + 0.201076933593750000E+05 + 0.221054843750000000E+05 + 0.241034882812500000E+05 +__ihtran + 1 + 0 +__ngrids + 1 + 1 +__nzg + 1 + 11 +__nzs + 1 + 1 +__npatch + 1 + 2 +__nvegpat + 1 + 1 +__nkppz + 1 + 48 +__ztop + 1 + 0.200100156250000000E+05 +__polelat + 1 + 0.370000000000000000E+02 +__polelon + 1 + -0.975000000000000000E+02 +__nnxp + 1 + 25 +__nnyp + 1 + 35 +__nnzp + 1 + 250 +__nstratx + 1 + 1 +__nstraty + 1 + 1 +__nxtnest + 1 + 0 +__ninest + 1 + 1 +__njnest + 1 + 1 +__nknest + 1 + 1 +__deltaxn + 1 + 0.200000000000000000E+04 +__deltazn + 1 + 0.100000000000000000E+02 +__nestz + 1 + 0 +__nstratz + 250 + 1 + 1 + 3 + 3 + 3 + 3 + 2 + 2 + 2 + 2 + 1 + 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 + 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 + 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 + 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 + 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 + 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 + 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 + 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 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 +__ngbegun + 1 + 1 +__iref + 1 + 0 +__jref + 1 + 0 +__topref + 1 + 0.000000000000000000E+00 +__xmn01 + 25 + -0.230000000000000000E+05 + -0.210000000000000000E+05 + -0.190000000000000000E+05 + -0.170000000000000000E+05 + -0.150000000000000000E+05 + -0.130000000000000000E+05 + -0.110000000000000000E+05 + -0.900000000000000000E+04 + -0.700000000000000000E+04 + -0.500000000000000000E+04 + -0.300000000000000000E+04 + -0.100000000000000000E+04 + 0.100000000000000000E+04 + 0.300000000000000000E+04 + 0.500000000000000000E+04 + 0.700000000000000000E+04 + 0.900000000000000000E+04 + 0.110000000000000000E+05 + 0.130000000000000000E+05 + 0.150000000000000000E+05 + 0.170000000000000000E+05 + 0.190000000000000000E+05 + 0.210000000000000000E+05 + 0.230000000000000000E+05 + 0.250000000000000000E+05 +__xtn01 + 25 + -0.240000000000000000E+05 + -0.220000000000000000E+05 + -0.200000000000000000E+05 + -0.180000000000000000E+05 + -0.160000000000000000E+05 + -0.140000000000000000E+05 + -0.120000000000000000E+05 + -0.100000000000000000E+05 + -0.800000000000000000E+04 + -0.600000000000000000E+04 + -0.400000000000000000E+04 + -0.200000000000000000E+04 + 0.000000000000000000E+00 + 0.200000000000000000E+04 + 0.400000000000000000E+04 + 0.600000000000000000E+04 + 0.800000000000000000E+04 + 0.100000000000000000E+05 + 0.120000000000000000E+05 + 0.140000000000000000E+05 + 0.160000000000000000E+05 + 0.180000000000000000E+05 + 0.200000000000000000E+05 + 0.220000000000000000E+05 + 0.240000000000000000E+05 +__ymn01 + 35 + -0.330000000000000000E+05 + -0.310000000000000000E+05 + -0.290000000000000000E+05 + -0.270000000000000000E+05 + -0.250000000000000000E+05 + -0.230000000000000000E+05 + -0.210000000000000000E+05 + -0.190000000000000000E+05 + -0.170000000000000000E+05 + -0.150000000000000000E+05 + -0.130000000000000000E+05 + -0.110000000000000000E+05 + -0.900000000000000000E+04 + -0.700000000000000000E+04 + -0.500000000000000000E+04 + -0.300000000000000000E+04 + -0.100000000000000000E+04 + 0.100000000000000000E+04 + 0.300000000000000000E+04 + 0.500000000000000000E+04 + 0.700000000000000000E+04 + 0.900000000000000000E+04 + 0.110000000000000000E+05 + 0.130000000000000000E+05 + 0.150000000000000000E+05 + 0.170000000000000000E+05 + 0.190000000000000000E+05 + 0.210000000000000000E+05 + 0.230000000000000000E+05 + 0.250000000000000000E+05 + 0.270000000000000000E+05 + 0.290000000000000000E+05 + 0.310000000000000000E+05 + 0.330000000000000000E+05 + 0.350000000000000000E+05 +__ytn01 + 35 + -0.340000000000000000E+05 + -0.320000000000000000E+05 + -0.300000000000000000E+05 + -0.280000000000000000E+05 + -0.260000000000000000E+05 + -0.240000000000000000E+05 + -0.220000000000000000E+05 + -0.200000000000000000E+05 + -0.180000000000000000E+05 + -0.160000000000000000E+05 + -0.140000000000000000E+05 + -0.120000000000000000E+05 + -0.100000000000000000E+05 + -0.800000000000000000E+04 + -0.600000000000000000E+04 + -0.400000000000000000E+04 + -0.200000000000000000E+04 + 0.000000000000000000E+00 + 0.200000000000000000E+04 + 0.400000000000000000E+04 + 0.600000000000000000E+04 + 0.800000000000000000E+04 + 0.100000000000000000E+05 + 0.120000000000000000E+05 + 0.140000000000000000E+05 + 0.160000000000000000E+05 + 0.180000000000000000E+05 + 0.200000000000000000E+05 + 0.220000000000000000E+05 + 0.240000000000000000E+05 + 0.260000000000000000E+05 + 0.280000000000000000E+05 + 0.300000000000000000E+05 + 0.320000000000000000E+05 + 0.340000000000000000E+05 +__zmn01 + 250 + 0.000000000000000000E+00 + 0.100000000000000000E+02 + 0.202999992370605469E+02 + 0.309089984893798828E+02 + 0.418362655639648438E+02 + 0.530913505554199219E+02 + 0.646840896606445313E+02 + 0.766246109008789063E+02 + 0.889233474731445313E+02 + 0.101591049194335937E+03 + 0.114638778686523437E+03 + 0.128077941894531250E+03 + 0.141920272827148437E+03 + 0.156177871704101562E+03 + 0.170863204956054687E+03 + 0.185989105224609375E+03 + 0.201568786621093750E+03 + 0.217615859985351562E+03 + 0.234144348144531250E+03 + 0.251168685913085937E+03 + 0.268703765869140625E+03 + 0.286764892578125000E+03 + 0.305367858886718750E+03 + 0.324528900146484375E+03 + 0.344264770507812500E+03 + 0.364592712402343750E+03 + 0.385530487060546875E+03 + 0.407096405029296875E+03 + 0.429309295654296875E+03 + 0.452188568115234375E+03 + 0.475754211425781250E+03 + 0.500026824951171875E+03 + 0.525027587890625000E+03 + 0.550778381347656250E+03 + 0.577301696777343750E+03 + 0.604620727539062500E+03 + 0.632759338378906250E+03 + 0.661742126464843750E+03 + 0.691594421386718750E+03 + 0.722342285156250000E+03 + 0.754012573242187500E+03 + 0.786632995605468750E+03 + 0.820232055664062500E+03 + 0.854839111328125000E+03 + 0.890484375000000000E+03 + 0.927198974609375000E+03 + 0.965015014648437500E+03 + 0.100396551513671875E+04 + 0.104408447265625000E+04 + 0.108540698242187500E+04 + 0.112796911621093750E+04 + 0.117180810546875000E+04 + 0.121696228027343750E+04 + 0.126347106933593750E+04 + 0.131137512207031250E+04 + 0.136071630859375000E+04 + 0.141153771972656250E+04 + 0.146388378906250000E+04 + 0.151780029296875000E+04 + 0.157333422851562500E+04 + 0.163053417968750000E+04 + 0.168945007324218750E+04 + 0.175013342285156250E+04 + 0.181263732910156250E+04 + 0.187701635742187500E+04 + 0.194332678222656250E+04 + 0.201162646484375000E+04 + 0.208197509765625000E+04 + 0.215443408203125000E+04 + 0.222906689453125000E+04 + 0.230593872070312500E+04 + 0.238511669921875000E+04 + 0.246666992187500000E+04 + 0.255066967773437500E+04 + 0.263718945312500000E+04 + 0.272630493164062500E+04 + 0.281809375000000000E+04 + 0.291263623046875000E+04 + 0.301001489257812500E+04 + 0.311001489257812500E+04 + 0.321001489257812500E+04 + 0.331001489257812500E+04 + 0.341001489257812500E+04 + 0.351001489257812500E+04 + 0.361001489257812500E+04 + 0.371001489257812500E+04 + 0.381001489257812500E+04 + 0.391001489257812500E+04 + 0.401001489257812500E+04 + 0.411001464843750000E+04 + 0.421001464843750000E+04 + 0.431001464843750000E+04 + 0.441001464843750000E+04 + 0.451001464843750000E+04 + 0.461001464843750000E+04 + 0.471001464843750000E+04 + 0.481001464843750000E+04 + 0.491001464843750000E+04 + 0.501001464843750000E+04 + 0.511001464843750000E+04 + 0.521001464843750000E+04 + 0.531001464843750000E+04 + 0.541001464843750000E+04 + 0.551001464843750000E+04 + 0.561001464843750000E+04 + 0.571001464843750000E+04 + 0.581001464843750000E+04 + 0.591001464843750000E+04 + 0.601001464843750000E+04 + 0.611001464843750000E+04 + 0.621001464843750000E+04 + 0.631001464843750000E+04 + 0.641001464843750000E+04 + 0.651001464843750000E+04 + 0.661001464843750000E+04 + 0.671001464843750000E+04 + 0.681001464843750000E+04 + 0.691001464843750000E+04 + 0.701001464843750000E+04 + 0.711001464843750000E+04 + 0.721001464843750000E+04 + 0.731001464843750000E+04 + 0.741001464843750000E+04 + 0.751001464843750000E+04 + 0.761001464843750000E+04 + 0.771001464843750000E+04 + 0.781001464843750000E+04 + 0.791001464843750000E+04 + 0.801001464843750000E+04 + 0.811001464843750000E+04 + 0.821001464843750000E+04 + 0.831001464843750000E+04 + 0.841001464843750000E+04 + 0.851001464843750000E+04 + 0.861001464843750000E+04 + 0.871001464843750000E+04 + 0.881001464843750000E+04 + 0.891001464843750000E+04 + 0.901001464843750000E+04 + 0.911001464843750000E+04 + 0.921001464843750000E+04 + 0.931001464843750000E+04 + 0.941001464843750000E+04 + 0.951001464843750000E+04 + 0.961001464843750000E+04 + 0.971001464843750000E+04 + 0.981001464843750000E+04 + 0.991001464843750000E+04 + 0.100100146484375000E+05 + 0.101100146484375000E+05 + 0.102100146484375000E+05 + 0.103100146484375000E+05 + 0.104100146484375000E+05 + 0.105100146484375000E+05 + 0.106100146484375000E+05 + 0.107100146484375000E+05 + 0.108100146484375000E+05 + 0.109100146484375000E+05 + 0.110100146484375000E+05 + 0.111100146484375000E+05 + 0.112100146484375000E+05 + 0.113100146484375000E+05 + 0.114100146484375000E+05 + 0.115100146484375000E+05 + 0.116100146484375000E+05 + 0.117100146484375000E+05 + 0.118100146484375000E+05 + 0.119100146484375000E+05 + 0.120100146484375000E+05 + 0.121100146484375000E+05 + 0.122100146484375000E+05 + 0.123100146484375000E+05 + 0.124100146484375000E+05 + 0.125100146484375000E+05 + 0.126100146484375000E+05 + 0.127100146484375000E+05 + 0.128100146484375000E+05 + 0.129100146484375000E+05 + 0.130100146484375000E+05 + 0.131100146484375000E+05 + 0.132100146484375000E+05 + 0.133100146484375000E+05 + 0.134100146484375000E+05 + 0.135100146484375000E+05 + 0.136100146484375000E+05 + 0.137100146484375000E+05 + 0.138100146484375000E+05 + 0.139100146484375000E+05 + 0.140100146484375000E+05 + 0.141100146484375000E+05 + 0.142100146484375000E+05 + 0.143100146484375000E+05 + 0.144100146484375000E+05 + 0.145100146484375000E+05 + 0.146100146484375000E+05 + 0.147100146484375000E+05 + 0.148100146484375000E+05 + 0.149100146484375000E+05 + 0.150100146484375000E+05 + 0.151100146484375000E+05 + 0.152100146484375000E+05 + 0.153100146484375000E+05 + 0.154100146484375000E+05 + 0.155100146484375000E+05 + 0.156100146484375000E+05 + 0.157100146484375000E+05 + 0.158100146484375000E+05 + 0.159100146484375000E+05 + 0.160100146484375000E+05 + 0.161100146484375000E+05 + 0.162100146484375000E+05 + 0.163100146484375000E+05 + 0.164100156250000000E+05 + 0.165100156250000000E+05 + 0.166100156250000000E+05 + 0.167100156250000000E+05 + 0.168100156250000000E+05 + 0.169100156250000000E+05 + 0.170100156250000000E+05 + 0.171100156250000000E+05 + 0.172100156250000000E+05 + 0.173100156250000000E+05 + 0.174100156250000000E+05 + 0.175100156250000000E+05 + 0.176100156250000000E+05 + 0.177100156250000000E+05 + 0.178100156250000000E+05 + 0.179100156250000000E+05 + 0.180100156250000000E+05 + 0.181100156250000000E+05 + 0.182100156250000000E+05 + 0.183100156250000000E+05 + 0.184100156250000000E+05 + 0.185100156250000000E+05 + 0.186100156250000000E+05 + 0.187100156250000000E+05 + 0.188100156250000000E+05 + 0.189100156250000000E+05 + 0.190100156250000000E+05 + 0.191100156250000000E+05 + 0.192100156250000000E+05 + 0.193100156250000000E+05 + 0.194100156250000000E+05 + 0.195100156250000000E+05 + 0.196100156250000000E+05 + 0.197100156250000000E+05 + 0.198100156250000000E+05 + 0.199100156250000000E+05 + 0.200100156250000000E+05 + 0.201100156250000000E+05 +__ztn01 + 250 + -0.489024114608764648E+01 + 0.496305179595947266E+01 + 0.151119432449340820E+02 + 0.255652999877929688E+02 + 0.363322563171386719E+02 + 0.474222221374511719E+02 + 0.588448867797851563E+02 + 0.706102294921875000E+02 + 0.827285385131835938E+02 + 0.952103958129882813E+02 + 0.108066703796386719E+03 + 0.121308708190917969E+03 + 0.134947967529296875E+03 + 0.148996398925781250E+03 + 0.163466278076171875E+03 + 0.178370269775390625E+03 + 0.193721374511718750E+03 + 0.209533035278320312E+03 + 0.225819030761718750E+03 + 0.242593612670898437E+03 + 0.259871429443359375E+03 + 0.277667602539062500E+03 + 0.295997650146484375E+03 + 0.314877593994140625E+03 + 0.334323913574218750E+03 + 0.354353637695312500E+03 + 0.374984252929687500E+03 + 0.396233764648437500E+03 + 0.418120788574218750E+03 + 0.440664398193359375E+03 + 0.463884307861328125E+03 + 0.487800842285156250E+03 + 0.512434814453125000E+03 + 0.537807861328125000E+03 + 0.563942016601562500E+03 + 0.590860290527343750E+03 + 0.618586059570312500E+03 + 0.647143615722656250E+03 + 0.676557983398437500E+03 + 0.706854736328125000E+03 + 0.738060424804687500E+03 + 0.770202270507812500E+03 + 0.803308410644531250E+03 + 0.837407714843750000E+03 + 0.872530029296875000E+03 + 0.908706054687500000E+03 + 0.945967285156250000E+03 + 0.984346374511718750E+03 + 0.102387677001953125E+04 + 0.106459301757812500E+04 + 0.110653076171875000E+04 + 0.114972668457031250E+04 + 0.119421838378906250E+04 + 0.124004479980468750E+04 + 0.128724609375000000E+04 + 0.133586340332031250E+04 + 0.138593920898437500E+04 + 0.143751733398437500E+04 + 0.149064282226562500E+04 + 0.154536206054687500E+04 + 0.160172290039062500E+04 + 0.165977441406250000E+04 + 0.171956750488281250E+04 + 0.178115441894531250E+04 + 0.184458898925781250E+04 + 0.190992651367187500E+04 + 0.197722424316406250E+04 + 0.204654089355468750E+04 + 0.211793676757812500E+04 + 0.219147460937500000E+04 + 0.226721875000000000E+04 + 0.234523510742187500E+04 + 0.242559204101562500E+04 + 0.250835937500000000E+04 + 0.259360986328125000E+04 + 0.268141796875000000E+04 + 0.277186010742187500E+04 + 0.286501562500000000E+04 + 0.296098388671875000E+04 + 0.305984887695312500E+04 + 0.316001489257812500E+04 + 0.326001489257812500E+04 + 0.336001489257812500E+04 + 0.346001489257812500E+04 + 0.356001489257812500E+04 + 0.366001489257812500E+04 + 0.376001489257812500E+04 + 0.386001489257812500E+04 + 0.396001489257812500E+04 + 0.406001464843750000E+04 + 0.416001464843750000E+04 + 0.426001464843750000E+04 + 0.436001464843750000E+04 + 0.446001464843750000E+04 + 0.456001464843750000E+04 + 0.466001464843750000E+04 + 0.476001464843750000E+04 + 0.486001464843750000E+04 + 0.496001464843750000E+04 + 0.506001464843750000E+04 + 0.516001464843750000E+04 + 0.526001464843750000E+04 + 0.536001464843750000E+04 + 0.546001464843750000E+04 + 0.556001464843750000E+04 + 0.566001464843750000E+04 + 0.576001464843750000E+04 + 0.586001464843750000E+04 + 0.596001464843750000E+04 + 0.606001464843750000E+04 + 0.616001464843750000E+04 + 0.626001464843750000E+04 + 0.636001464843750000E+04 + 0.646001464843750000E+04 + 0.656001464843750000E+04 + 0.666001464843750000E+04 + 0.676001464843750000E+04 + 0.686001464843750000E+04 + 0.696001464843750000E+04 + 0.706001464843750000E+04 + 0.716001464843750000E+04 + 0.726001464843750000E+04 + 0.736001464843750000E+04 + 0.746001464843750000E+04 + 0.756001464843750000E+04 + 0.766001464843750000E+04 + 0.776001464843750000E+04 + 0.786001464843750000E+04 + 0.796001464843750000E+04 + 0.806001464843750000E+04 + 0.816001464843750000E+04 + 0.826001464843750000E+04 + 0.836001464843750000E+04 + 0.846001464843750000E+04 + 0.856001464843750000E+04 + 0.866001464843750000E+04 + 0.876001464843750000E+04 + 0.886001464843750000E+04 + 0.896001464843750000E+04 + 0.906001464843750000E+04 + 0.916001464843750000E+04 + 0.926001464843750000E+04 + 0.936001464843750000E+04 + 0.946001464843750000E+04 + 0.956001464843750000E+04 + 0.966001464843750000E+04 + 0.976001464843750000E+04 + 0.986001464843750000E+04 + 0.996001464843750000E+04 + 0.100600146484375000E+05 + 0.101600146484375000E+05 + 0.102600146484375000E+05 + 0.103600146484375000E+05 + 0.104600146484375000E+05 + 0.105600146484375000E+05 + 0.106600146484375000E+05 + 0.107600146484375000E+05 + 0.108600146484375000E+05 + 0.109600146484375000E+05 + 0.110600146484375000E+05 + 0.111600146484375000E+05 + 0.112600146484375000E+05 + 0.113600146484375000E+05 + 0.114600146484375000E+05 + 0.115600146484375000E+05 + 0.116600146484375000E+05 + 0.117600146484375000E+05 + 0.118600146484375000E+05 + 0.119600146484375000E+05 + 0.120600146484375000E+05 + 0.121600146484375000E+05 + 0.122600146484375000E+05 + 0.123600146484375000E+05 + 0.124600146484375000E+05 + 0.125600146484375000E+05 + 0.126600146484375000E+05 + 0.127600146484375000E+05 + 0.128600146484375000E+05 + 0.129600146484375000E+05 + 0.130600146484375000E+05 + 0.131600146484375000E+05 + 0.132600146484375000E+05 + 0.133600146484375000E+05 + 0.134600146484375000E+05 + 0.135600146484375000E+05 + 0.136600146484375000E+05 + 0.137600146484375000E+05 + 0.138600146484375000E+05 + 0.139600146484375000E+05 + 0.140600146484375000E+05 + 0.141600146484375000E+05 + 0.142600146484375000E+05 + 0.143600146484375000E+05 + 0.144600146484375000E+05 + 0.145600146484375000E+05 + 0.146600146484375000E+05 + 0.147600146484375000E+05 + 0.148600146484375000E+05 + 0.149600146484375000E+05 + 0.150600146484375000E+05 + 0.151600146484375000E+05 + 0.152600146484375000E+05 + 0.153600146484375000E+05 + 0.154600146484375000E+05 + 0.155600146484375000E+05 + 0.156600146484375000E+05 + 0.157600146484375000E+05 + 0.158600146484375000E+05 + 0.159600146484375000E+05 + 0.160600146484375000E+05 + 0.161600146484375000E+05 + 0.162600146484375000E+05 + 0.163600156250000000E+05 + 0.164600156250000000E+05 + 0.165600156250000000E+05 + 0.166600156250000000E+05 + 0.167600156250000000E+05 + 0.168600156250000000E+05 + 0.169600156250000000E+05 + 0.170600156250000000E+05 + 0.171600156250000000E+05 + 0.172600156250000000E+05 + 0.173600156250000000E+05 + 0.174600156250000000E+05 + 0.175600156250000000E+05 + 0.176600156250000000E+05 + 0.177600156250000000E+05 + 0.178600156250000000E+05 + 0.179600156250000000E+05 + 0.180600156250000000E+05 + 0.181600156250000000E+05 + 0.182600156250000000E+05 + 0.183600156250000000E+05 + 0.184600156250000000E+05 + 0.185600156250000000E+05 + 0.186600156250000000E+05 + 0.187600156250000000E+05 + 0.188600156250000000E+05 + 0.189600156250000000E+05 + 0.190600156250000000E+05 + 0.191600156250000000E+05 + 0.192600156250000000E+05 + 0.193600156250000000E+05 + 0.194600156250000000E+05 + 0.195600156250000000E+05 + 0.196600156250000000E+05 + 0.197600156250000000E+05 + 0.198600156250000000E+05 + 0.199600156250000000E+05 + 0.200600156250000000E+05 +__dzmn01 + 250 + 0.101488918066024780E+00 + 0.985329300165176392E-01 + 0.956630483269691467E-01 + 0.928767547011375427E-01 + 0.901716053485870361E-01 + 0.875452458858489990E-01 + 0.849953964352607727E-01 + 0.825197622179985046E-01 + 0.801162794232368469E-01 + 0.777828320860862732E-01 + 0.755172669887542725E-01 + 0.733177661895751953E-01 + 0.711823254823684692E-01 + 0.691090747714042664E-01 + 0.670961216092109680E-01 + 0.651418939232826233E-01 + 0.632444620132446289E-01 + 0.614024475216865540E-01 + 0.596140027046203613E-01 + 0.578776821494102478E-01 + 0.561918579041957855E-01 + 0.545552335679531097E-01 + 0.529662594199180603E-01 + 0.514236129820346832E-01 + 0.499258004128932953E-01 + 0.484716519713401794E-01 + 0.470599047839641571E-01 + 0.456891730427742004E-01 + 0.443584695458412170E-01 + 0.430664904415607452E-01 + 0.418120771646499634E-01 + 0.405943468213081360E-01 + 0.394118987023830414E-01 + 0.382641032338142395E-01 + 0.371494852006435394E-01 + 0.360675305128097534E-01 + 0.350170023739337921E-01 + 0.339969918131828308E-01 + 0.330068357288837433E-01 + 0.320454388856887817E-01 + 0.311120897531509399E-01 + 0.302058774977922440E-01 + 0.293261110782623291E-01 + 0.284719280898571014E-01 + 0.276426170021295547E-01 + 0.268375463783740997E-01 + 0.260558556765317917E-01 + 0.252969898283481598E-01 + 0.245602205395698547E-01 + 0.238448679447174072E-01 + 0.231503322720527649E-01 + 0.224761031568050385E-01 + 0.218214746564626694E-01 + 0.211858600378036499E-01 + 0.205688066780567169E-01 + 0.199697241187095642E-01 + 0.193880647420883179E-01 + 0.188233572989702225E-01 + 0.182751081883907318E-01 + 0.177428163588047028E-01 + 0.172260794788599014E-01 + 0.167243406176567078E-01 + 0.162372160702943802E-01 + 0.157642755657434464E-01 + 0.153051409870386124E-01 + 0.148593420162796974E-01 + 0.144265480339527130E-01 + 0.140064116567373276E-01 + 0.135984411463141441E-01 + 0.132023412734270096E-01 + 0.128178251907229424E-01 + 0.124444765970110893E-01 + 0.120820617303252220E-01 + 0.117301382124423981E-01 + 0.113884704187512398E-01 + 0.110567929223179817E-01 + 0.107347369194030762E-01 + 0.104201119393110275E-01 + 0.101148039102554321E-01 + 0.998342595994472504E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.100000239908695221E-01 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999990198761224747E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 +__dztn01 + 250 + 0.103000000119209290E+00 + 0.100000001490116119E+00 + 0.970873832702636719E-01 + 0.942595973610877991E-01 + 0.915141925215721130E-01 + 0.888487324118614197E-01 + 0.862608924508094788E-01 + 0.837484374642372131E-01 + 0.813091620802879333E-01 + 0.789409205317497253E-01 + 0.766416862607002258E-01 + 0.744093954563140869E-01 + 0.722421705722808838E-01 + 0.701380372047424316E-01 + 0.680951550602912903E-01 + 0.661117658019065857E-01 + 0.641861632466316223E-01 + 0.623166598379611969E-01 + 0.605016015470027924E-01 + 0.587394349277019501E-01 + 0.570285394787788391E-01 + 0.553675331175327301E-01 + 0.537548698484897614E-01 + 0.521892309188842773E-01 + 0.506691597402095795E-01 + 0.491933710873126984E-01 + 0.477605685591697693E-01 + 0.463694632053375244E-01 + 0.450189039111137390E-01 + 0.437076836824417114E-01 + 0.424346588551998138E-01 + 0.411986932158470154E-01 + 0.399987809360027313E-01 + 0.388337559998035431E-01 + 0.377026759088039398E-01 + 0.366045199334621429E-01 + 0.355383567512035370E-01 + 0.345032364130020142E-01 + 0.334982611238956451E-01 + 0.325225852429866791E-01 + 0.315753370523452759E-01 + 0.306556429713964462E-01 + 0.297627374529838562E-01 + 0.288958419114351273E-01 + 0.280542187392711639E-01 + 0.272371210157871246E-01 + 0.264438055455684662E-01 + 0.256736110895872116E-01 + 0.249258726835250854E-01 + 0.241998862475156784E-01 + 0.234950631856918335E-01 + 0.228107441216707230E-01 + 0.221463460475206375E-01 + 0.215013120323419571E-01 + 0.208750609308481216E-01 + 0.202670432627201080E-01 + 0.196767468005418777E-01 + 0.191036313772201538E-01 + 0.185471959412097931E-01 + 0.180070083588361740E-01 + 0.174825321882963181E-01 + 0.169733483344316483E-01 + 0.164789855480194092E-01 + 0.159990005195140839E-01 + 0.155330086126923561E-01 + 0.150805851444602013E-01 + 0.146413566544651985E-01 + 0.142149170860648155E-01 + 0.138009106740355492E-01 + 0.133989322930574417E-01 + 0.130086671561002731E-01 + 0.126297743991017342E-01 + 0.122619308531284332E-01 + 0.119047965854406357E-01 + 0.115580512210726738E-01 + 0.112213948741555214E-01 + 0.108945732936263084E-01 + 0.105772558599710464E-01 + 0.102691901847720146E-01 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.100000239908695221E-01 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999990198761224747E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 +__u01dn01 + 250 + -0.271000003814697266E+01 + -0.271000003814697266E+01 + -0.271000003814697266E+01 + -0.271000003814697266E+01 + -0.271000003814697266E+01 + -0.271000003814697266E+01 + -0.271000003814697266E+01 + -0.271000003814697266E+01 + -0.271000003814697266E+01 + -0.271000003814697266E+01 + -0.277084660530090332E+01 + -0.287076568603515625E+01 + -0.297368240356445313E+01 + -0.307968640327453613E+01 + -0.318887066841125488E+01 + -0.330133032798767090E+01 + -0.341716384887695313E+01 + -0.353647255897521973E+01 + -0.352038979530334473E+01 + -0.349959468841552734E+01 + -0.347817540168762207E+01 + -0.345611381530761719E+01 + -0.343339014053344727E+01 + -0.340998482704162598E+01 + -0.337475848197937012E+01 + -0.328295969963073730E+01 + -0.318840670585632324E+01 + -0.309101748466491699E+01 + -0.299070644378662109E+01 + -0.288738608360290527E+01 + -0.278096628189086914E+01 + -0.261160659790039063E+01 + -0.243661952018737793E+01 + -0.225638246536254883E+01 + -0.207073879241943359E+01 + -0.187952518463134766E+01 + -0.167072951793670654E+01 + -0.142602384090423584E+01 + -0.117397618293762207E+01 + -0.914367675781250000E+00 + -0.646970510482788086E+00 + -0.371551632881164551E+00 + -0.713925063610076904E-01 + 0.238491535186767578E+00 + 0.557672321796417236E+00 + 0.886429071426391602E+00 + 0.122504770755767822E+01 + 0.155904006958007813E+01 + 0.190187835693359375E+01 + 0.225500106811523438E+01 + 0.261871767044067383E+01 + 0.298705983161926270E+01 + 0.332745456695556641E+01 + 0.367806077003479004E+01 + 0.403918600082397461E+01 + 0.441114473342895508E+01 + 0.475697183609008789E+01 + 0.508290481567382813E+01 + 0.541861581802368164E+01 + 0.576439809799194336E+01 + 0.610793638229370117E+01 + 0.638321971893310547E+01 + 0.666676139831542969E+01 + 0.695880937576293945E+01 + 0.725961923599243164E+01 + 0.754496240615844727E+01 + 0.783508586883544922E+01 + 0.813391304016113281E+01 + 0.844170379638671875E+01 + 0.872272300720214844E+01 + 0.899785709381103516E+01 + 0.928124523162841797E+01 + 0.957313537597656250E+01 + 0.986987972259521484E+01 + 0.101736173629760742E+02 + 0.104864673614501953E+02 + 0.108087024688720703E+02 + 0.111116161346435547E+02 + 0.114123449325561523E+02 + 0.117221508026123047E+02 + 0.120360336303710938E+02 + 0.122386236190795898E+02 + 0.124181671142578125E+02 + 0.125977106094360352E+02 + 0.127772541046142578E+02 + 0.131642017364501953E+02 + 0.136625709533691406E+02 + 0.141609401702880859E+02 + 0.146593103408813477E+02 + 0.151472501754760742E+02 + 0.154578628540039063E+02 + 0.157684755325317383E+02 + 0.160790882110595703E+02 + 0.163896999359130859E+02 + 0.167001209259033203E+02 + 0.168188247680664063E+02 + 0.169375305175781250E+02 + 0.170562343597412109E+02 + 0.171749401092529297E+02 + 0.172936439514160156E+02 + 0.173657684326171875E+02 + 0.173788490295410156E+02 + 0.173919296264648438E+02 + 0.174050102233886719E+02 + 0.174180908203125000E+02 + 0.174311714172363281E+02 + 0.174206790924072266E+02 + 0.173612232208251953E+02 + 0.173017673492431641E+02 + 0.172423114776611328E+02 + 0.171828556060791016E+02 + 0.171233997344970703E+02 + 0.170639457702636719E+02 + 0.170230522155761719E+02 + 0.169946746826171875E+02 + 0.169662990570068359E+02 + 0.169379234313964844E+02 + 0.169095458984375000E+02 + 0.168811702728271484E+02 + 0.168527927398681641E+02 + 0.168355598449707031E+02 + 0.168638134002685547E+02 + 0.168920669555664063E+02 + 0.169203186035156250E+02 + 0.169485721588134766E+02 + 0.169768257141113281E+02 + 0.170050792694091797E+02 + 0.170333328247070313E+02 + 0.170682773590087891E+02 + 0.172156810760498047E+02 + 0.173630847930908203E+02 + 0.175104885101318359E+02 + 0.176578903198242188E+02 + 0.178052940368652344E+02 + 0.179526977539062500E+02 + 0.181001014709472656E+02 + 0.182475051879882813E+02 + 0.184006366729736328E+02 + 0.186046848297119141E+02 + 0.188087329864501953E+02 + 0.190127792358398438E+02 + 0.192168273925781250E+02 + 0.194208755493164063E+02 + 0.196249217987060547E+02 + 0.198289699554443359E+02 + 0.200330181121826172E+02 + 0.202370643615722656E+02 + 0.204575042724609375E+02 + 0.207269897460937500E+02 + 0.209964752197265625E+02 + 0.212659606933593750E+02 + 0.215354461669921875E+02 + 0.218049297332763672E+02 + 0.220744152069091797E+02 + 0.223439006805419922E+02 + 0.226133861541748047E+02 + 0.228828697204589844E+02 + 0.231523551940917969E+02 + 0.234810485839843750E+02 + 0.238931922912597656E+02 + 0.243053379058837891E+02 + 0.247174835205078125E+02 + 0.251296291351318359E+02 + 0.255417747497558594E+02 + 0.259539203643798828E+02 + 0.263660659790039063E+02 + 0.267782115936279297E+02 + 0.271903572082519531E+02 + 0.276025009155273438E+02 + 0.280146465301513672E+02 + 0.280276069641113281E+02 + 0.277731075286865234E+02 + 0.275186100006103516E+02 + 0.272641105651855469E+02 + 0.270096130371093750E+02 + 0.267551136016845703E+02 + 0.265006141662597656E+02 + 0.262461166381835938E+02 + 0.259916172027587891E+02 + 0.257371196746826172E+02 + 0.254826202392578125E+02 + 0.252281227111816406E+02 + 0.249736232757568359E+02 + 0.247190647125244141E+02 + 0.244644165039062500E+02 + 0.242097682952880859E+02 + 0.239551181793212891E+02 + 0.237004699707031250E+02 + 0.234458217620849609E+02 + 0.231911716461181641E+02 + 0.229365234375000000E+02 + 0.226818733215332031E+02 + 0.224272251129150391E+02 + 0.221725769042968750E+02 + 0.219179267883300781E+02 + 0.216632785797119141E+02 + 0.214086303710937500E+02 + 0.211539802551269531E+02 + 0.209239654541015625E+02 + 0.206943397521972656E+02 + 0.204647140502929688E+02 + 0.202350883483886719E+02 + 0.200054626464843750E+02 + 0.197758388519287109E+02 + 0.195462131500244141E+02 + 0.193165874481201172E+02 + 0.190869636535644531E+02 + 0.188573379516601563E+02 + 0.186277122497558594E+02 + 0.183980865478515625E+02 + 0.181684608459472656E+02 + 0.179388370513916016E+02 + 0.177092094421386719E+02 + 0.174503669738769531E+02 + 0.170001678466796875E+02 + 0.165499668121337891E+02 + 0.160997676849365234E+02 + 0.156495685577392578E+02 + 0.151993694305419922E+02 + 0.147491703033447266E+02 + 0.142989702224731445E+02 + 0.138487710952758789E+02 + 0.133985719680786133E+02 + 0.129483718872070313E+02 + 0.124981727600097656E+02 + 0.120479736328125000E+02 + 0.115977745056152344E+02 + 0.111475753784179688E+02 + 0.106973752975463867E+02 + 0.102471752166748047E+02 + 0.979697608947753906E+01 + 0.938239288330078125E+01 + 0.898338413238525391E+01 + 0.858437538146972656E+01 + 0.818536758422851563E+01 + 0.778635835647583008E+01 + 0.738735008239746094E+01 + 0.698834133148193359E+01 + 0.658933258056640625E+01 + 0.619032430648803711E+01 + 0.579131603240966797E+01 + 0.539230728149414063E+01 + 0.499329853057861328E+01 + 0.459428977966308594E+01 + 0.419528150558471680E+01 + 0.379627275466918945E+01 + 0.339726400375366211E+01 + 0.299825572967529297E+01 + 0.259924697875976563E+01 + 0.220023870468139648E+01 +__v01dn01 + 250 + 0.838000011444091797E+01 + 0.838000011444091797E+01 + 0.838000011444091797E+01 + 0.838000011444091797E+01 + 0.838000011444091797E+01 + 0.838000011444091797E+01 + 0.838000011444091797E+01 + 0.838000011444091797E+01 + 0.838000011444091797E+01 + 0.838000011444091797E+01 + 0.854714488983154297E+01 + 0.882162189483642578E+01 + 0.910433197021484375E+01 + 0.939552402496337891E+01 + 0.969545173645019531E+01 + 0.100043773651123047E+02 + 0.103225708007812500E+02 + 0.106503105163574219E+02 + 0.108678665161132813E+02 + 0.110882968902587891E+02 + 0.113153400421142578E+02 + 0.115491952896118164E+02 + 0.117900657653808594E+02 + 0.120381622314453125E+02 + 0.122802333831787109E+02 + 0.124623260498046875E+02 + 0.126498813629150391E+02 + 0.128430633544921875E+02 + 0.130420417785644531E+02 + 0.132469882965087891E+02 + 0.134580831527709961E+02 + 0.135895338058471680E+02 + 0.137241392135620117E+02 + 0.138627824783325195E+02 + 0.140055856704711914E+02 + 0.141526727676391602E+02 + 0.142790746688842773E+02 + 0.143464574813842773E+02 + 0.144158620834350586E+02 + 0.144873485565185547E+02 + 0.145609798431396484E+02 + 0.146368198394775391E+02 + 0.146435852050781250E+02 + 0.146474351882934570E+02 + 0.146513996124267578E+02 + 0.146554832458496094E+02 + 0.146596899032592773E+02 + 0.146142835617065430E+02 + 0.145635681152343750E+02 + 0.145113306045532227E+02 + 0.144575271606445313E+02 + 0.143990955352783203E+02 + 0.143202238082885742E+02 + 0.142389860153198242E+02 + 0.141553106307983398E+02 + 0.140691251754760742E+02 + 0.139931802749633789E+02 + 0.139253683090209961E+02 + 0.138555231094360352E+02 + 0.137835817337036133E+02 + 0.137169160842895508E+02 + 0.136945352554321289E+02 + 0.136714830398559570E+02 + 0.136477394104003906E+02 + 0.136232824325561523E+02 + 0.136618223190307617E+02 + 0.137113561630249023E+02 + 0.137623748779296875E+02 + 0.138149251937866211E+02 + 0.139026937484741211E+02 + 0.140064725875854492E+02 + 0.141133642196655273E+02 + 0.142234630584716797E+02 + 0.144566297531127930E+02 + 0.147554292678833008E+02 + 0.150631923675537109E+02 + 0.153801879882812500E+02 + 0.155695848464965820E+02 + 0.157111043930053711E+02 + 0.158568954467773438E+02 + 0.160046043395996094E+02 + 0.165927867889404297E+02 + 0.172726593017578125E+02 + 0.179525299072265625E+02 + 0.186324024200439453E+02 + 0.189011459350585938E+02 + 0.189490242004394531E+02 + 0.189969024658203125E+02 + 0.190447807312011719E+02 + 0.190846157073974609E+02 + 0.189876728057861328E+02 + 0.188907318115234375E+02 + 0.187937889099121094E+02 + 0.186968460083007813E+02 + 0.186000556945800781E+02 + 0.186558113098144531E+02 + 0.187115669250488281E+02 + 0.187673225402832031E+02 + 0.188230781555175781E+02 + 0.188788318634033203E+02 + 0.189871520996093750E+02 + 0.191621017456054688E+02 + 0.193370532989501953E+02 + 0.195120029449462891E+02 + 0.196869525909423828E+02 + 0.198619022369384766E+02 + 0.200379638671875000E+02 + 0.202163314819335938E+02 + 0.203946990966796875E+02 + 0.205730667114257813E+02 + 0.207514343261718750E+02 + 0.209298000335693359E+02 + 0.211081676483154297E+02 + 0.212155113220214844E+02 + 0.212749671936035156E+02 + 0.213344230651855469E+02 + 0.213938789367675781E+02 + 0.214533329010009766E+02 + 0.215127887725830078E+02 + 0.215722446441650391E+02 + 0.216253185272216797E+02 + 0.216523437500000000E+02 + 0.216793689727783203E+02 + 0.217063941955566406E+02 + 0.217334175109863281E+02 + 0.217604427337646484E+02 + 0.217874679565429688E+02 + 0.218144931793212891E+02 + 0.218431358337402344E+02 + 0.218989696502685547E+02 + 0.219548053741455078E+02 + 0.220106391906738281E+02 + 0.220664749145507813E+02 + 0.221223087310791016E+02 + 0.221781444549560547E+02 + 0.222339782714843750E+02 + 0.222898120880126953E+02 + 0.223436965942382813E+02 + 0.223802433013916016E+02 + 0.224167881011962891E+02 + 0.224533348083496094E+02 + 0.224898796081542969E+02 + 0.225264263153076172E+02 + 0.225629711151123047E+02 + 0.225995178222656250E+02 + 0.226360645294189453E+02 + 0.226726093292236328E+02 + 0.227009258270263672E+02 + 0.227046165466308594E+02 + 0.227083091735839844E+02 + 0.227119998931884766E+02 + 0.227156906127929688E+02 + 0.227193832397460938E+02 + 0.227230739593505859E+02 + 0.227267665863037109E+02 + 0.227304573059082031E+02 + 0.227341480255126953E+02 + 0.227378406524658203E+02 + 0.226381435394287109E+02 + 0.223927173614501953E+02 + 0.221472930908203125E+02 + 0.219018669128417969E+02 + 0.216564426422119141E+02 + 0.214110164642333984E+02 + 0.211655921936035156E+02 + 0.209201660156250000E+02 + 0.206747417449951172E+02 + 0.204293155670166016E+02 + 0.201838912963867188E+02 + 0.199384651184082031E+02 + 0.197638034820556641E+02 + 0.196365547180175781E+02 + 0.195093040466308594E+02 + 0.193820552825927734E+02 + 0.192548065185546875E+02 + 0.191275577545166016E+02 + 0.190003070831298828E+02 + 0.188730583190917969E+02 + 0.187458095550537109E+02 + 0.186185588836669922E+02 + 0.184913101196289063E+02 + 0.183640613555908203E+02 + 0.182368125915527344E+02 + 0.181052703857421875E+02 + 0.179671897888183594E+02 + 0.178291110992431641E+02 + 0.176910324096679688E+02 + 0.175529518127441406E+02 + 0.174148731231689453E+02 + 0.172767944335937500E+02 + 0.171387138366699219E+02 + 0.170006351470947266E+02 + 0.168625564575195313E+02 + 0.167244758605957031E+02 + 0.165863971710205078E+02 + 0.164483184814453125E+02 + 0.163102378845214844E+02 + 0.161721591949462891E+02 + 0.159048433303833008E+02 + 0.156354751586914063E+02 + 0.153661069869995117E+02 + 0.150967388153076172E+02 + 0.148273706436157227E+02 + 0.145580024719238281E+02 + 0.142886343002319336E+02 + 0.140192661285400391E+02 + 0.137498989105224609E+02 + 0.134805297851562500E+02 + 0.132111625671386719E+02 + 0.129417934417724609E+02 + 0.126724262237548828E+02 + 0.124030580520629883E+02 + 0.121336870193481445E+02 + 0.118741712570190430E+02 + 0.116791801452636719E+02 + 0.114841890335083008E+02 + 0.112891988754272461E+02 + 0.110942077636718750E+02 + 0.108992166519165039E+02 + 0.107042264938354492E+02 + 0.105092353820800781E+02 + 0.103142442703247070E+02 + 0.101192541122436523E+02 + 0.992426300048828125E+01 + 0.972927188873291016E+01 + 0.953428173065185547E+01 + 0.933929061889648438E+01 + 0.914429950714111328E+01 + 0.894930934906005859E+01 + 0.875431823730468750E+01 + 0.855932712554931641E+01 + 0.831746864318847656E+01 + 0.805511379241943359E+01 + 0.779275941848754883E+01 + 0.753040504455566406E+01 + 0.726805019378662109E+01 + 0.700569534301757813E+01 + 0.674334096908569336E+01 + 0.648098659515380859E+01 + 0.621863174438476563E+01 + 0.595627689361572266E+01 + 0.569392204284667969E+01 + 0.543156766891479492E+01 + 0.516921281814575195E+01 + 0.490685844421386719E+01 + 0.464450359344482422E+01 + 0.438214921951293945E+01 + 0.411979436874389648E+01 + 0.385743951797485352E+01 + 0.359508514404296875E+01 +__pi01dn01 + 250 + 0.100127435302734375E+04 + 0.100096276855468750E+04 + 0.100064184570312500E+04 + 0.100031127929687500E+04 + 0.999970764160156250E+03 + 0.999620056152343750E+03 + 0.999258850097656250E+03 + 0.998886779785156250E+03 + 0.998503540039062500E+03 + 0.998108764648437500E+03 + 0.997702148437500000E+03 + 0.997283264160156250E+03 + 0.996851745605468750E+03 + 0.996407165527343750E+03 + 0.995949157714843750E+03 + 0.995477355957031250E+03 + 0.994991271972656250E+03 + 0.994490539550781250E+03 + 0.993974670410156250E+03 + 0.993443237304687500E+03 + 0.992895751953125000E+03 + 0.992331726074218750E+03 + 0.991750732421875000E+03 + 0.991152160644531250E+03 + 0.990535522460937500E+03 + 0.989900268554687500E+03 + 0.989245849609375000E+03 + 0.988571716308593750E+03 + 0.987877258300781250E+03 + 0.987161804199218750E+03 + 0.986424743652343750E+03 + 0.985665466308593750E+03 + 0.984883300781250000E+03 + 0.984077575683593750E+03 + 0.983247558593750000E+03 + 0.982392517089843750E+03 + 0.981511657714843750E+03 + 0.980604248046875000E+03 + 0.979669494628906250E+03 + 0.978706604003906250E+03 + 0.977714660644531250E+03 + 0.976692871093750000E+03 + 0.975640258789062500E+03 + 0.974555969238281250E+03 + 0.973439025878906250E+03 + 0.972288452148437500E+03 + 0.971103271484375000E+03 + 0.969882385253906250E+03 + 0.968624755859375000E+03 + 0.967329284667968750E+03 + 0.965994873046875000E+03 + 0.964620300292968750E+03 + 0.963204345703125000E+03 + 0.961745849609375000E+03 + 0.960243469238281250E+03 + 0.958695861816406250E+03 + 0.957101684570312500E+03 + 0.955459594726562500E+03 + 0.953768066406250000E+03 + 0.952025695800781250E+03 + 0.950230895996093750E+03 + 0.948382080078125000E+03 + 0.946477539062500000E+03 + 0.944515625000000000E+03 + 0.942494628906250000E+03 + 0.940412597656250000E+03 + 0.938267517089843750E+03 + 0.936057495117187500E+03 + 0.933780517578125000E+03 + 0.931434814453125000E+03 + 0.929018859863281250E+03 + 0.926530639648437500E+03 + 0.923968017578125000E+03 + 0.921329467773437500E+03 + 0.918613830566406250E+03 + 0.915819274902343750E+03 + 0.912943603515625000E+03 + 0.909984741210937500E+03 + 0.906940002441406250E+03 + 0.903807189941406250E+03 + 0.900637023925781250E+03 + 0.897475952148437500E+03 + 0.894318542480468750E+03 + 0.891164794921875000E+03 + 0.888014648437500000E+03 + 0.884867736816406250E+03 + 0.881723388671875000E+03 + 0.878581359863281250E+03 + 0.875441650390625000E+03 + 0.872304260253906250E+03 + 0.869169372558593750E+03 + 0.866037109375000000E+03 + 0.862907470703125000E+03 + 0.859780456542968750E+03 + 0.856656066894531250E+03 + 0.853533996582031250E+03 + 0.850413879394531250E+03 + 0.847295715332031250E+03 + 0.844179565429687500E+03 + 0.841065368652343750E+03 + 0.837953063964843750E+03 + 0.834842590332031250E+03 + 0.831733947753906250E+03 + 0.828627075195312500E+03 + 0.825522033691406250E+03 + 0.822418762207031250E+03 + 0.819317382812500000E+03 + 0.816218139648437500E+03 + 0.813121276855468750E+03 + 0.810026733398437500E+03 + 0.806934509277343750E+03 + 0.803844604492187500E+03 + 0.800757019042968750E+03 + 0.797671752929687500E+03 + 0.794588684082031250E+03 + 0.791507812500000000E+03 + 0.788429077148437500E+03 + 0.785352539062500000E+03 + 0.782278137207031250E+03 + 0.779205932617187500E+03 + 0.776135864257812500E+03 + 0.773067871093750000E+03 + 0.770001892089843750E+03 + 0.766937866210937500E+03 + 0.763875854492187500E+03 + 0.760815856933593750E+03 + 0.757757812500000000E+03 + 0.754701782226562500E+03 + 0.751647705078125000E+03 + 0.748595458984375000E+03 + 0.745544860839843750E+03 + 0.742495910644531250E+03 + 0.739448547363281250E+03 + 0.736402832031250000E+03 + 0.733358764648437500E+03 + 0.730316345214843750E+03 + 0.727275573730468750E+03 + 0.724236389160156250E+03 + 0.721198791503906250E+03 + 0.718162780761718750E+03 + 0.715128295898437500E+03 + 0.712095397949218750E+03 + 0.709064025878906250E+03 + 0.706034179687500000E+03 + 0.703005920410156250E+03 + 0.699979187011718750E+03 + 0.696953979492187500E+03 + 0.693930480957031250E+03 + 0.690909362792968750E+03 + 0.687891052246093750E+03 + 0.684875549316406250E+03 + 0.681862854003906250E+03 + 0.678852966308593750E+03 + 0.675845886230468750E+03 + 0.672841613769531250E+03 + 0.669840148925781250E+03 + 0.666841430664062500E+03 + 0.663845520019531250E+03 + 0.660853393554687500E+03 + 0.657867553710937500E+03 + 0.654889465332031250E+03 + 0.651919006347656250E+03 + 0.648956176757812500E+03 + 0.646000915527343750E+03 + 0.643053222656250000E+03 + 0.640113037109375000E+03 + 0.637180297851562500E+03 + 0.634255004882812500E+03 + 0.631337097167968750E+03 + 0.628426513671875000E+03 + 0.625525024414062500E+03 + 0.622635375976562500E+03 + 0.619758666992187500E+03 + 0.616894775390625000E+03 + 0.614043579101562500E+03 + 0.611204956054687500E+03 + 0.608378845214843750E+03 + 0.605565063476562500E+03 + 0.602763549804687500E+03 + 0.599974182128906250E+03 + 0.597196899414062500E+03 + 0.594431518554687500E+03 + 0.591677978515625000E+03 + 0.588936157226562500E+03 + 0.586205932617187500E+03 + 0.583487182617187500E+03 + 0.580779785156250000E+03 + 0.578083679199218750E+03 + 0.575398742675781250E+03 + 0.572724853515625000E+03 + 0.570061950683593750E+03 + 0.567409973144531250E+03 + 0.564768798828125000E+03 + 0.562138366699218750E+03 + 0.559518554687500000E+03 + 0.556909301757812500E+03 + 0.554310485839843750E+03 + 0.551722045898437500E+03 + 0.549144042968750000E+03 + 0.546576477050781250E+03 + 0.544019226074218750E+03 + 0.541472229003906250E+03 + 0.538935424804687500E+03 + 0.536408691406250000E+03 + 0.533891967773437500E+03 + 0.531385192871093750E+03 + 0.528888305664062500E+03 + 0.526401184082031250E+03 + 0.523923767089843750E+03 + 0.521455993652343750E+03 + 0.518997741699218750E+03 + 0.516549011230468750E+03 + 0.514109680175781250E+03 + 0.511679656982421875E+03 + 0.509258758544921875E+03 + 0.506846771240234375E+03 + 0.504443664550781250E+03 + 0.502049346923828125E+03 + 0.499663757324218750E+03 + 0.497286834716796875E+03 + 0.494918518066406250E+03 + 0.492558746337890625E+03 + 0.490207458496093750E+03 + 0.487864593505859375E+03 + 0.485530090332031250E+03 + 0.483203887939453125E+03 + 0.480885925292968750E+03 + 0.478576141357421875E+03 + 0.476274475097656250E+03 + 0.473980895996093750E+03 + 0.471695312500000000E+03 + 0.469418365478515625E+03 + 0.467150939941406250E+03 + 0.464893218994140625E+03 + 0.462645141601562500E+03 + 0.460406616210937500E+03 + 0.458177581787109375E+03 + 0.455957946777343750E+03 + 0.453747619628906250E+03 + 0.451546539306640625E+03 + 0.449354614257812500E+03 + 0.447171783447265625E+03 + 0.444997985839843750E+03 + 0.442833129882812500E+03 + 0.440677124023437500E+03 + 0.438529907226562500E+03 + 0.436391418457031250E+03 + 0.434261566162109375E+03 + 0.432140319824218750E+03 + 0.430027587890625000E+03 +__th01dn01 + 250 + 0.309907257080078125E+03 + 0.309907257080078125E+03 + 0.309903442382812500E+03 + 0.309899536132812500E+03 + 0.309895507812500000E+03 + 0.309891326904296875E+03 + 0.309887084960937500E+03 + 0.309882690429687500E+03 + 0.309878173828125000E+03 + 0.309873474121093750E+03 + 0.309837249755859375E+03 + 0.309780731201171875E+03 + 0.309722473144531250E+03 + 0.309662506103515625E+03 + 0.309600708007812500E+03 + 0.309537078857421875E+03 + 0.309471557617187500E+03 + 0.309404052734375000E+03 + 0.309354461669921875E+03 + 0.309303985595703125E+03 + 0.309251983642578125E+03 + 0.309198394775390625E+03 + 0.309143280029296875E+03 + 0.309086425781250000E+03 + 0.309029907226562500E+03 + 0.308981628417968750E+03 + 0.308931823730468750E+03 + 0.308880584716796875E+03 + 0.308827789306640625E+03 + 0.308773406982421875E+03 + 0.308717437744140625E+03 + 0.308675170898437500E+03 + 0.308631835937500000E+03 + 0.308587158203125000E+03 + 0.308541168212890625E+03 + 0.308493804931640625E+03 + 0.308448333740234375E+03 + 0.308409912109375000E+03 + 0.308370330810546875E+03 + 0.308329589843750000E+03 + 0.308287597656250000E+03 + 0.308244415283203125E+03 + 0.308213623046875000E+03 + 0.308182525634765625E+03 + 0.308150482177734375E+03 + 0.308117492675781250E+03 + 0.308083526611328125E+03 + 0.308057464599609375E+03 + 0.308031372070312500E+03 + 0.308004486083984375E+03 + 0.307976806640625000E+03 + 0.307949096679687500E+03 + 0.307925598144531250E+03 + 0.307901367187500000E+03 + 0.307876373291015625E+03 + 0.307850708007812500E+03 + 0.307826171875000000E+03 + 0.307802551269531250E+03 + 0.307778198242187500E+03 + 0.307753112792968750E+03 + 0.307726074218750000E+03 + 0.307690704345703125E+03 + 0.307654296875000000E+03 + 0.307616790771484375E+03 + 0.307578186035156250E+03 + 0.307500701904296875E+03 + 0.307415069580078125E+03 + 0.307326873779296875E+03 + 0.307235961914062500E+03 + 0.307229034423828125E+03 + 0.307256225585937500E+03 + 0.307284088134765625E+03 + 0.307312591552734375E+03 + 0.307505554199218750E+03 + 0.307784240722656250E+03 + 0.308070953369140625E+03 + 0.308366088867187500E+03 + 0.308708312988281250E+03 + 0.309075897216796875E+03 + 0.309454406738281250E+03 + 0.309837829589843750E+03 + 0.310200683593750000E+03 + 0.310559356689453125E+03 + 0.310917999267578125E+03 + 0.311276550292968750E+03 + 0.311552001953125000E+03 + 0.311782836914062500E+03 + 0.312013671875000000E+03 + 0.312244445800781250E+03 + 0.312476989746093750E+03 + 0.312740447998046875E+03 + 0.313003845214843750E+03 + 0.313267303466796875E+03 + 0.313530700683593750E+03 + 0.313794006347656250E+03 + 0.313992218017578125E+03 + 0.314190429687500000E+03 + 0.314388671875000000E+03 + 0.314586883544921875E+03 + 0.314785034179687500E+03 + 0.314976348876953125E+03 + 0.315158874511718750E+03 + 0.315341430664062500E+03 + 0.315523956298828125E+03 + 0.315706481933593750E+03 + 0.315888977050781250E+03 + 0.316089813232421875E+03 + 0.316328582763671875E+03 + 0.316567352294921875E+03 + 0.316806091308593750E+03 + 0.317044860839843750E+03 + 0.317283569335937500E+03 + 0.317522308349609375E+03 + 0.317752563476562500E+03 + 0.317977111816406250E+03 + 0.318201660156250000E+03 + 0.318426208496093750E+03 + 0.318650726318359375E+03 + 0.318875274658203125E+03 + 0.319099761962890625E+03 + 0.319321105957031250E+03 + 0.319529602050781250E+03 + 0.319738098144531250E+03 + 0.319946594238281250E+03 + 0.320155059814453125E+03 + 0.320363525390625000E+03 + 0.320571990966796875E+03 + 0.320780426025390625E+03 + 0.320986938476562500E+03 + 0.321159851074218750E+03 + 0.321332794189453125E+03 + 0.321505676269531250E+03 + 0.321678619384765625E+03 + 0.321851531982421875E+03 + 0.322024505615234375E+03 + 0.322197418212890625E+03 + 0.322370330810546875E+03 + 0.322542480468750000E+03 + 0.322707763671875000E+03 + 0.322873046875000000E+03 + 0.323038360595703125E+03 + 0.323203643798828125E+03 + 0.323368896484375000E+03 + 0.323534179687500000E+03 + 0.323699493408203125E+03 + 0.323864776611328125E+03 + 0.324030029296875000E+03 + 0.324229919433593750E+03 + 0.324533386230468750E+03 + 0.324836853027343750E+03 + 0.325140289306640625E+03 + 0.325443725585937500E+03 + 0.325747222900390625E+03 + 0.326050659179687500E+03 + 0.326354095458984375E+03 + 0.326657531738281250E+03 + 0.326960998535156250E+03 + 0.327264465332031250E+03 + 0.327794219970703125E+03 + 0.328642883300781250E+03 + 0.329491577148437500E+03 + 0.330340240478515625E+03 + 0.331188934326171875E+03 + 0.332037597656250000E+03 + 0.332886291503906250E+03 + 0.333734985351562500E+03 + 0.334583648681640625E+03 + 0.335432312011718750E+03 + 0.336281005859375000E+03 + 0.337129699707031250E+03 + 0.338382720947265625E+03 + 0.339906707763671875E+03 + 0.341430664062500000E+03 + 0.342954620361328125E+03 + 0.344478576660156250E+03 + 0.346002563476562500E+03 + 0.347526519775390625E+03 + 0.349050476074218750E+03 + 0.350574432373046875E+03 + 0.352098419189453125E+03 + 0.353622375488281250E+03 + 0.355146331787109375E+03 + 0.356670288085937500E+03 + 0.358189758300781250E+03 + 0.359702392578125000E+03 + 0.361215026855468750E+03 + 0.362727661132812500E+03 + 0.364240295410156250E+03 + 0.365752899169921875E+03 + 0.367265533447265625E+03 + 0.368778167724609375E+03 + 0.370290802001953125E+03 + 0.371803436279296875E+03 + 0.373316070556640625E+03 + 0.374828704833984375E+03 + 0.376341308593750000E+03 + 0.377853942871093750E+03 + 0.379366577148437500E+03 + 0.380909759521484375E+03 + 0.382453399658203125E+03 + 0.383997070312500000E+03 + 0.385540771484375000E+03 + 0.387084411621093750E+03 + 0.388628082275390625E+03 + 0.390171752929687500E+03 + 0.391715393066406250E+03 + 0.393259063720703125E+03 + 0.394802734375000000E+03 + 0.396346374511718750E+03 + 0.397890045166015625E+03 + 0.399433715820312500E+03 + 0.400977355957031250E+03 + 0.402521057128906250E+03 + 0.404058654785156250E+03 + 0.405556640625000000E+03 + 0.407054626464843750E+03 + 0.408552612304687500E+03 + 0.410050598144531250E+03 + 0.411548583984375000E+03 + 0.413046569824218750E+03 + 0.414544555664062500E+03 + 0.416042572021484375E+03 + 0.417540557861328125E+03 + 0.419038543701171875E+03 + 0.420536529541015625E+03 + 0.422034515380859375E+03 + 0.423532501220703125E+03 + 0.425030487060546875E+03 + 0.426528472900390625E+03 + 0.428026458740234375E+03 + 0.429524444580078125E+03 + 0.431275360107421875E+03 + 0.433136871337890625E+03 + 0.434998413085937500E+03 + 0.436859954833984375E+03 + 0.438721466064453125E+03 + 0.440583007812500000E+03 + 0.442444519042968750E+03 + 0.444306030273437500E+03 + 0.446167541503906250E+03 + 0.448029083251953125E+03 + 0.449890594482421875E+03 + 0.451752105712890625E+03 + 0.453613647460937500E+03 + 0.455475158691406250E+03 + 0.457336669921875000E+03 + 0.459198211669921875E+03 + 0.461059722900390625E+03 + 0.462921234130859375E+03 + 0.464782745361328125E+03 +__dn01dn01 + 250 + 0.111670076847076416E+01 + 0.111583304405212402E+01 + 0.111495316028594971E+01 + 0.111404716968536377E+01 + 0.111311447620391846E+01 + 0.111215424537658691E+01 + 0.111116600036621094E+01 + 0.111014842987060547E+01 + 0.110910069942474365E+01 + 0.110802233219146729E+01 + 0.110702455043792725E+01 + 0.110606551170349121E+01 + 0.110507798194885254E+01 + 0.110406100749969482E+01 + 0.110301351547241211E+01 + 0.110193514823913574E+01 + 0.110082459449768066E+01 + 0.109968078136444092E+01 + 0.109843230247497559E+01 + 0.109714496135711670E+01 + 0.109581911563873291E+01 + 0.109445440769195557E+01 + 0.109304881095886230E+01 + 0.109160244464874268E+01 + 0.109010577201843262E+01 + 0.108853006362915039E+01 + 0.108690869808197021E+01 + 0.108523905277252197E+01 + 0.108352053165435791E+01 + 0.108175158500671387E+01 + 0.107993090152740479E+01 + 0.107800281047821045E+01 + 0.107601821422576904E+01 + 0.107397580146789551E+01 + 0.107187390327453613E+01 + 0.106971108913421631E+01 + 0.106747353076934814E+01 + 0.106514251232147217E+01 + 0.106274425983428955E+01 + 0.106027674674987793E+01 + 0.105773806571960449E+01 + 0.105512654781341553E+01 + 0.105239295959472656E+01 + 0.104957938194274902E+01 + 0.104668557643890381E+01 + 0.104370951652526855E+01 + 0.104064846038818359E+01 + 0.103747093677520752E+01 + 0.103420090675354004E+01 + 0.103083884716033936E+01 + 0.102738225460052490E+01 + 0.102382588386535645E+01 + 0.102015328407287598E+01 + 0.101637852191925049E+01 + 0.101249897480010986E+01 + 0.100851118564605713E+01 + 0.100440704822540283E+01 + 0.100018405914306641E+01 + 0.995845079421997070E+00 + 0.991387069225311279E+00 + 0.986811041831970215E+00 + 0.982134342193603516E+00 + 0.977330088615417480E+00 + 0.972395360469818115E+00 + 0.967327058315277100E+00 + 0.962239861488342285E+00 + 0.957032382488250732E+00 + 0.951683580875396729E+00 + 0.946190655231475830E+00 + 0.940284967422485352E+00 + 0.934121131896972656E+00 + 0.927799105644226074E+00 + 0.921316146850585938E+00 + 0.914183199405670166E+00 + 0.906644761562347412E+00 + 0.898932337760925293E+00 + 0.891043782234191895E+00 + 0.882866740226745605E+00 + 0.874464094638824463E+00 + 0.865876972675323486E+00 + 0.857247173786163330E+00 + 0.848756194114685059E+00 + 0.840344369411468506E+00 + 0.831999599933624268E+00 + 0.823721885681152344E+00 + 0.815726816654205322E+00 + 0.807905972003936768E+00 + 0.800140321254730225E+00 + 0.792429745197296143E+00 + 0.784769535064697266E+00 + 0.777087628841400146E+00 + 0.769462049007415771E+00 + 0.761892855167388916E+00 + 0.754379570484161377E+00 + 0.746922433376312256E+00 + 0.739673197269439697E+00 + 0.732474088668823242E+00 + 0.725325345993041992E+00 + 0.718226611614227295E+00 + 0.711177647113800049E+00 + 0.704193413257598877E+00 + 0.697277009487152100E+00 + 0.690408766269683838E+00 + 0.683588266372680664E+00 + 0.676815092563629150E+00 + 0.670089662075042725E+00 + 0.663372635841369629E+00 + 0.656625390052795410E+00 + 0.649928510189056396E+00 + 0.643281519412994385E+00 + 0.636684298515319824E+00 + 0.630136549472808838E+00 + 0.623638093471527100E+00 + 0.617204904556274414E+00 + 0.610830605030059814E+00 + 0.604504227638244629E+00 + 0.598224937915802002E+00 + 0.591992735862731934E+00 + 0.585807383060455322E+00 + 0.579668641090393066E+00 + 0.573581755161285400E+00 + 0.567563652992248535E+00 + 0.561590433120727539E+00 + 0.555661857128143311E+00 + 0.549777865409851074E+00 + 0.543938159942626953E+00 + 0.538142383098602295E+00 + 0.532390475273132324E+00 + 0.526685476303100586E+00 + 0.521077871322631836E+00 + 0.515511572360992432E+00 + 0.509986519813537598E+00 + 0.504501998424530029E+00 + 0.499058365821838379E+00 + 0.493655264377593994E+00 + 0.488292634487152100E+00 + 0.482970029115676880E+00 + 0.477688550949096680E+00 + 0.472456902265548706E+00 + 0.467264503240585327E+00 + 0.462111085653305054E+00 + 0.456996619701385498E+00 + 0.451920777559280396E+00 + 0.446883529424667358E+00 + 0.441884607076644897E+00 + 0.436923891305923462E+00 + 0.432001203298568726E+00 + 0.427071005105972290E+00 + 0.422046124935150146E+00 + 0.417064964771270752E+00 + 0.412127494812011719E+00 + 0.407233268022537231E+00 + 0.402381867170333862E+00 + 0.397573441267013550E+00 + 0.392807364463806152E+00 + 0.388083606958389282E+00 + 0.383401602506637573E+00 + 0.378761231899261475E+00 + 0.373905450105667114E+00 + 0.368744522333145142E+00 + 0.363649308681488037E+00 + 0.358618944883346558E+00 + 0.353652417659759521E+00 + 0.348749011754989624E+00 + 0.343907982110977173E+00 + 0.339128553867340088E+00 + 0.334409743547439575E+00 + 0.329751104116439819E+00 + 0.325151473283767700E+00 + 0.320610284805297852E+00 + 0.315751373767852783E+00 + 0.310720592737197876E+00 + 0.305775552988052368E+00 + 0.300914704799652100E+00 + 0.296136260032653809E+00 + 0.291438698768615723E+00 + 0.286820471286773682E+00 + 0.282280057668685913E+00 + 0.277815908193588257E+00 + 0.273426502943038940E+00 + 0.269110709428787231E+00 + 0.264866828918457031E+00 + 0.260693699121475220E+00 + 0.256593018770217896E+00 + 0.252564996480941772E+00 + 0.248603314161300659E+00 + 0.244706809520721436E+00 + 0.240874215960502625E+00 + 0.237104281783103943E+00 + 0.233396038413047791E+00 + 0.229748144745826721E+00 + 0.226159617304801941E+00 + 0.222629338502883911E+00 + 0.219156369566917419E+00 + 0.215739503502845764E+00 + 0.212377756834030151E+00 + 0.209070175886154175E+00 + 0.205815732479095459E+00 + 0.202597439289093018E+00 + 0.199431061744689941E+00 + 0.196315750479698181E+00 + 0.193250760436058044E+00 + 0.190235123038291931E+00 + 0.187267929315567017E+00 + 0.184348374605178833E+00 + 0.181475609540939331E+00 + 0.178648769855499268E+00 + 0.175867006182670593E+00 + 0.173129573464393616E+00 + 0.170435711741447449E+00 + 0.167784586548805237E+00 + 0.165175482630729675E+00 + 0.162607654929161072E+00 + 0.160082861781120300E+00 + 0.157613083720207214E+00 + 0.155181482434272766E+00 + 0.152787685394287109E+00 + 0.150430813431739807E+00 + 0.148110300302505493E+00 + 0.145825594663619995E+00 + 0.143576085567474365E+00 + 0.141361102461814880E+00 + 0.139180153608322144E+00 + 0.137032672762870789E+00 + 0.134918078780174255E+00 + 0.132835820317268372E+00 + 0.130785390734672546E+00 + 0.128766208887100220E+00 + 0.126777827739715576E+00 + 0.124819725751876831E+00 + 0.122891381382942200E+00 + 0.120921768248081207E+00 + 0.118954420089721680E+00 + 0.117020443081855774E+00 + 0.115119203925132751E+00 + 0.113250114023685455E+00 + 0.111412584781646729E+00 + 0.109605960547924042E+00 + 0.107829689979553223E+00 + 0.106083236634731293E+00 + 0.104365974664688110E+00 + 0.102677382528781891E+00 + 0.101016990840435028E+00 + 0.993841886520385742E-01 + 0.977785140275955200E-01 + 0.961994454264640808E-01 + 0.946464836597442627E-01 + 0.931192040443420410E-01 + 0.916170924901962280E-01 + 0.901397019624710083E-01 +__rt01dn01 + 250 + 0.157400742173194885E-01 + 0.157400742173194885E-01 + 0.157197769731283188E-01 + 0.156988706439733505E-01 + 0.156773384660482407E-01 + 0.156551580876111984E-01 + 0.156323146075010300E-01 + 0.156087838113307953E-01 + 0.155845480039715767E-01 + 0.155595848336815834E-01 + 0.155360717326402664E-01 + 0.155131984502077103E-01 + 0.154896397143602371E-01 + 0.154653731733560562E-01 + 0.154403792694211006E-01 + 0.154146356508135796E-01 + 0.153881199657917023E-01 + 0.153608079999685287E-01 + 0.153312394395470619E-01 + 0.153007395565509796E-01 + 0.152693241834640503E-01 + 0.152369672432541847E-01 + 0.152036398649215698E-01 + 0.151693113148212433E-01 + 0.151335047557950020E-01 + 0.150943771004676819E-01 + 0.150540759786963463E-01 + 0.150125650689005852E-01 + 0.149698099121451378E-01 + 0.149257713928818703E-01 + 0.148804122582077980E-01 + 0.148314256221055984E-01 + 0.147809488698840141E-01 + 0.147289568558335304E-01 + 0.146754058077931404E-01 + 0.146202482283115387E-01 + 0.145624317228794098E-01 + 0.145003683865070343E-01 + 0.144364433363080025E-01 + 0.143706006929278374E-01 + 0.143027827143669128E-01 + 0.142329297959804535E-01 + 0.141618810594081879E-01 + 0.140887415036559105E-01 + 0.140134068205952644E-01 + 0.139358118176460266E-01 + 0.138558903709053993E-01 + 0.137731982395052910E-01 + 0.136879952624440193E-01 + 0.136002376675605774E-01 + 0.135098462924361229E-01 + 0.134156541898846626E-01 + 0.133118750527501106E-01 + 0.132049825042486191E-01 + 0.130948834121227264E-01 + 0.129814818501472473E-01 + 0.128611130639910698E-01 + 0.127342399209737778E-01 + 0.126035604625940323E-01 + 0.124689601361751556E-01 + 0.123188504949212074E-01 + 0.120928045362234116E-01 + 0.118599776178598404E-01 + 0.116201657801866531E-01 + 0.113731585443019867E-01 + 0.108122359961271286E-01 + 0.101871732622385025E-01 + 0.954335834830999374E-02 + 0.888023152947425842E-02 + 0.814564153552055359E-02 + 0.736850779503583908E-02 + 0.656806118786334991E-02 + 0.574360042810440063E-02 + 0.511736655607819557E-02 + 0.458150403574109077E-02 + 0.402956502512097359E-02 + 0.346106919459998608E-02 + 0.315951509401202202E-02 + 0.295987166464328766E-02 + 0.275420234538614750E-02 + 0.254582636989653111E-02 + 0.240100966766476631E-02 + 0.226934440433979034E-02 + 0.213767914101481438E-02 + 0.200601387768983841E-02 + 0.188496639020740986E-02 + 0.176962336990982294E-02 + 0.165428023319691420E-02 + 0.153893709648400545E-02 + 0.142714334651827812E-02 + 0.137570430524647236E-02 + 0.132426526397466660E-02 + 0.127282633911818266E-02 + 0.122138729784637690E-02 + 0.116997293662279844E-02 + 0.114299450069665909E-02 + 0.111601618118584156E-02 + 0.108903786167502403E-02 + 0.106205942574888468E-02 + 0.103508110623806715E-02 + 0.100341590587049723E-02 + 0.965809798799455166E-03 + 0.928203691728413105E-03 + 0.890597584657371044E-03 + 0.852991419378668070E-03 + 0.815385312307626009E-03 + 0.778890273068100214E-03 + 0.744703225791454315E-03 + 0.710516120307147503E-03 + 0.676329073030501604E-03 + 0.642141967546194792E-03 + 0.607954920269548893E-03 + 0.573767814785242081E-03 + 0.543858448509126902E-03 + 0.516833271831274033E-03 + 0.489808095153421164E-03 + 0.462782976683229208E-03 + 0.435757800005376339E-03 + 0.408732681535184383E-03 + 0.381707504857331514E-03 + 0.355890952050685883E-03 + 0.335007964167743921E-03 + 0.314125005388632417E-03 + 0.293242046609520912E-03 + 0.272359058726578951E-03 + 0.251476070843636990E-03 + 0.230593112064525485E-03 + 0.209710153285413980E-03 + 0.189310128916986287E-03 + 0.177026522578671575E-03 + 0.164742901688441634E-03 + 0.152459295350126922E-03 + 0.140175674459896982E-03 + 0.127892068121582270E-03 + 0.115608447231352329E-03 + 0.103324840893037617E-03 + 0.910412200028076768E-04 + 0.793839499237947166E-04 + 0.732929765945300460E-04 + 0.672020032652653754E-04 + 0.611110299360007048E-04 + 0.550200566067360342E-04 + 0.489290869154501706E-04 + 0.428381135861855000E-04 + 0.367471402569208294E-04 + 0.306561669276561588E-04 + 0.245651935983914882E-04 + 0.197688186744926497E-04 + 0.188459234777837992E-04 + 0.179230301000643522E-04 + 0.170001349033555016E-04 + 0.160772415256360546E-04 + 0.151543463289272040E-04 + 0.142314529512077570E-04 + 0.133085586639936082E-04 + 0.123856643767794594E-04 + 0.114627700895653106E-04 + 0.105398758023511618E-04 + 0.968389485933585092E-05 + 0.892223033588379622E-05 + 0.816056490293703973E-05 + 0.739890037948498502E-05 + 0.663723540128557943E-05 + 0.587557042308617383E-05 + 0.511390544488676824E-05 + 0.435224092143471353E-05 + 0.359057594323530793E-05 + 0.282891096503590234E-05 + 0.206724598683649674E-05 + 0.130558146338444203E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 +__kppzm + 48 + -0.170577192306518555E+01 + -0.515288019180297852E+01 + -0.867263221740722656E+01 + -0.122681560516357422E+02 + -0.159427862167358398E+02 + -0.197000827789306641E+02 + -0.235438518524169922E+02 + -0.274781646728515625E+02 + -0.315073947906494141E+02 + -0.356362304687500000E+02 + -0.398697319030761719E+02 + -0.442133331298828125E+02 + -0.486729240417480469E+02 + -0.532548675537109375E+02 + -0.579660606384277344E+02 + -0.628140220642089844E+02 + -0.678069229125976563E+02 + -0.729536972045898438E+02 + -0.782641372680664063E+02 + -0.837490005493164063E+02 + -0.894201202392578125E+02 + -0.952906188964843750E+02 + -0.101375022888183594E+03 + -0.107689506530761719E+03 + -0.114252166748046875E+03 + -0.121083328247070312E+03 + -0.128205902099609375E+03 + -0.135645858764648437E+03 + -0.143432846069335937E+03 + -0.151600814819335937E+03 + -0.160188995361328125E+03 + -0.169243026733398437E+03 + -0.178816345214843750E+03 + -0.188972213745117187E+03 + -0.199786239624023437E+03 + -0.211349731445312500E+03 + -0.223774444580078125E+03 + -0.237199188232421875E+03 + -0.251799423217773437E+03 + -0.267801239013671875E+03 + -0.285503112792968750E+03 + -0.305310638427734375E+03 + -0.327794952392578125E+03 + -0.353797454833984375E+03 + -0.384634338378906250E+03 + -0.422540863037109375E+03 + -0.471808868408203125E+03 + -0.500000000000000000E+03 +__gnu + 8 + 0.400000000000000000E+01 + 0.200000000000000000E+01 + 0.200000000000000000E+01 + 0.200000000000000000E+01 + 0.200000000000000000E+01 + 0.200000000000000000E+01 + 0.200000000000000000E+01 + 0.400000000000000000E+01 +__iaero_chem + 11 + 1 + 1 + 1 + 1 + 2 + 2 + 2 + 1 + 1 + 1 + 1 +__cfmas + 16 + 0.524000000000000000E+03 + 0.524000000000000000E+03 + 0.110800003051757812E+03 + 0.273899990133941174E-02 + 0.495999991893768311E+00 + 0.157000000000000000E+03 + 0.471000000000000000E+03 + 0.885399997234344482E+00 + 0.377000006847083569E-02 + 0.123000005260109901E-02 + 0.100100003182888031E+00 + 0.885399997234344482E+00 + 0.377000006847083569E-02 + 0.123000005260109901E-02 + 0.100100003182888031E+00 + 0.524000000000000000E+03 +__pwmas + 16 + 0.300000000000000000E+01 + 0.300000000000000000E+01 + 0.291000008583068848E+01 + 0.174000000953674316E+01 + 0.240000009536743164E+01 + 0.300000000000000000E+01 + 0.300000000000000000E+01 + 0.250000000000000000E+01 + 0.200000000000000000E+01 + 0.179999995231628418E+01 + 0.225600004196166992E+01 + 0.250000000000000000E+01 + 0.200000000000000000E+01 + 0.179999995231628418E+01 + 0.225600004196166992E+01 + 0.300000000000000000E+01 +__slcpd + 12 + 0.146500000000000000E+07 + 0.140700000000000000E+07 + 0.134400000000000000E+07 + 0.127300000000000000E+07 + 0.121400000000000000E+07 + 0.117700000000000000E+07 + 0.131900000000000000E+07 + 0.122700000000000000E+07 + 0.117700000000000000E+07 + 0.115100000000000000E+07 + 0.108800000000000000E+07 + 0.874000000000000000E+06 +__slmsts + 12 + 0.395000010728836060E+00 + 0.409999996423721313E+00 + 0.435000002384185791E+00 + 0.485000014305114746E+00 + 0.451000005006790161E+00 + 0.419999986886978149E+00 + 0.476999998092651367E+00 + 0.476000010967254639E+00 + 0.425999999046325684E+00 + 0.492000013589859009E+00 + 0.481999993324279785E+00 + 0.862999975681304932E+00 +__slz + 11 + -0.500000000000000000E+00 + -0.400000005960464478E+00 + -0.300000011920928955E+00 + -0.250000000000000000E+00 + -0.200000002980232239E+00 + -0.159999996423721313E+00 + -0.119999997317790985E+00 + -0.900000035762786865E-01 + -0.599999986588954926E-01 + -0.299999993294477463E-01 + -0.999999977648258209E-02 diff --git a/bin.rams/test.supercell/a-A-1991-04-26-211500-head.txt b/bin.rams/test.supercell/a-A-1991-04-26-211500-head.txt new file mode 100644 index 0000000..61a3745 --- /dev/null +++ b/bin.rams/test.supercell/a-A-1991-04-26-211500-head.txt @@ -0,0 +1,3638 @@ + 257 +UP 0 3 1 218750 +VP 0 3 1 218750 +WP 0 3 1 218750 +PP 0 3 1 218750 +UC 0 3 1 218750 +VC 0 3 1 218750 +WC 0 3 1 218750 +PC 0 3 1 218750 +THP 0 3 1 218750 +RTP 0 3 1 218750 +THETA 0 3 1 218750 +RV 0 3 1 218750 +DN0 0 3 1 218750 +WP_BUOY_THETA 0 3 1 218750 +WP_BUOY_COND 0 3 1 218750 +WP_ADVDIF 0 3 1 218750 +SOIL_WATER 0 4 1 19250 +SOIL_ENERGY 0 4 1 19250 +SOIL_TEXT 0 4 1 19250 +SFCWATER_MASS 0 5 1 1750 +SFCWATER_ENERGY 0 5 1 1750 +SFCWATER_DEPTH 0 5 1 1750 +USTAR 0 6 1 1750 +TSTAR 0 6 1 1750 +RSTAR 0 6 1 1750 +VEG_FRACAREA 0 6 1 1750 +VEG_LAI 0 6 1 1750 +VEG_ROUGH 0 6 1 1750 +VEG_HEIGHT 0 6 1 1750 +VEG_ALBEDO 0 6 1 1750 +VEG_TAI 0 6 1 1750 +PATCH_AREA 0 6 1 1750 +PATCH_ROUGH 0 6 1 1750 +LEAF_CLASS 0 6 1 1750 +SOIL_ROUGH 0 6 1 1750 +SFCWATER_NLEV 0 6 1 1750 +STOM_RESIST 0 6 1 1750 +GROUND_RSAT 0 6 1 1750 +GROUND_RVAP 0 6 1 1750 +VEG_WATER 0 6 1 1750 +VEG_TEMP 0 6 1 1750 +CAN_RVAP 0 6 1 1750 +CAN_TEMP 0 6 1 1750 +VEG_NDVIP 0 6 1 1750 +VEG_NDVIC 0 6 1 1750 +VEG_NDVIF 0 6 1 1750 +KPP_OLD 0 2 1 875 +KPP_NEW 0 2 1 875 +KPP_JERLOV 0 2 1 875 +KPP_OCDEPTH 0 2 1 875 +KPP_HMIX 0 2 1 875 +KPP_BOTTOMT 0 2 1 875 +KPP_SREF 0 2 1 875 +KPP_FREEZ_FLAG 0 2 1 875 +KPP_RESET_FLAG 0 2 1 875 +KPP_FLX_UST 0 2 1 875 +KPP_FLX_VST 0 2 1 875 +KPP_FLX_NSW 0 2 1 875 +KPP_FLX_NLW 0 2 1 875 +KPP_FLX_ICE 0 2 1 875 +KPP_FLX_PCP 0 2 1 875 +KPP_SWDK_OPT 0 10 1 42000 +KPP_SWFRAC 0 10 1 42000 +KPP_SAL_CLIM 0 10 1 42000 +KPP_OCNT_CLIM 0 10 1 42000 +KPP_BUOY 0 10 1 42000 +KPP_U 0 10 1 42000 +KPP_V 0 10 1 42000 +KPP_U_init 0 10 1 42000 +KPP_V_init 0 10 1 42000 +KPP_US0 0 10 1 42000 +KPP_US1 0 10 1 42000 +KPP_VS0 0 10 1 42000 +KPP_VS1 0 10 1 42000 +KPP_X_T 0 10 1 42000 +KPP_X_S 0 10 1 42000 +KPP_XS_T0 0 10 1 42000 +KPP_XS_T1 0 10 1 42000 +KPP_XS_S0 0 10 1 42000 +KPP_XS_S1 0 10 1 42000 +RCP 0 3 1 218750 +RDP 0 3 1 218750 +RRP 0 3 1 218750 +RPP 0 3 1 218750 +RSP 0 3 1 218750 +RAP 0 3 1 218750 +RGP 0 3 1 218750 +RHP 0 3 1 218750 +CCP 0 3 1 218750 +CDP 0 3 1 218750 +CRP 0 3 1 218750 +CPP 0 3 1 218750 +CSP 0 3 1 218750 +CAP 0 3 1 218750 +CGP 0 3 1 218750 +CHP 0 3 1 218750 +Q2 0 3 1 218750 +Q6 0 3 1 218750 +Q7 0 3 1 218750 +CCCNP 0 3 1 218750 +GCCNP 0 3 1 218750 +CCCMP 0 3 1 218750 +GCCMP 0 3 1 218750 +MD1NP 0 3 1 218750 +MD2NP 0 3 1 218750 +MD1MP 0 3 1 218750 +MD2MP 0 3 1 218750 +SALT_FILM_NP 0 3 1 218750 +SALT_JET_NP 0 3 1 218750 +SALT_SPUM_NP 0 3 1 218750 +SALT_FILM_MP 0 3 1 218750 +SALT_JET_MP 0 3 1 218750 +SALT_SPUM_MP 0 3 1 218750 +REGEN_AERO1_NP 0 3 1 218750 +REGEN_AERO1_MP 0 3 1 218750 +REGEN_AERO2_NP 0 3 1 218750 +REGEN_AERO2_MP 0 3 1 218750 +IMMERCP 0 3 1 218750 +IMMERDP 0 3 1 218750 +IMMERRP 0 3 1 218750 +IFNNUCP 0 3 1 218750 +CNMCP 0 3 1 218750 +CNMDP 0 3 1 218750 +CNMRP 0 3 1 218750 +CNMPP 0 3 1 218750 +CNMSP 0 3 1 218750 +CNMAP 0 3 1 218750 +CNMGP 0 3 1 218750 +CNMHP 0 3 1 218750 +DNMCP 0 3 1 218750 +DNMDP 0 3 1 218750 +DNMRP 0 3 1 218750 +DNMPP 0 3 1 218750 +DNMSP 0 3 1 218750 +DNMAP 0 3 1 218750 +DNMGP 0 3 1 218750 +DNMHP 0 3 1 218750 +DINCP 0 3 1 218750 +DINDP 0 3 1 218750 +DINRP 0 3 1 218750 +DINPP 0 3 1 218750 +DINSP 0 3 1 218750 +DINAP 0 3 1 218750 +DINGP 0 3 1 218750 +DINHP 0 3 1 218750 +SNMCP 0 3 1 218750 +SNMDP 0 3 1 218750 +SNMRP 0 3 1 218750 +SNMPP 0 3 1 218750 +SNMSP 0 3 1 218750 +SNMAP 0 3 1 218750 +SNMGP 0 3 1 218750 +SNMHP 0 3 1 218750 +RESOL_AERO1_MP 0 3 1 218750 +RESOL_AERO2_MP 0 3 1 218750 +PCPVR 0 3 1 218750 +PCPVP 0 3 1 218750 +PCPVS 0 3 1 218750 +PCPVA 0 3 1 218750 +PCPVG 0 3 1 218750 +PCPVH 0 3 1 218750 +PCPVD 0 3 1 218750 +LATHEATVAP 0 3 1 218750 +LATHEATFRZ 0 3 1 218750 +NUCCLDRT 0 3 1 218750 +CLD2RAINT 0 3 1 218750 +ICE2RAINT 0 3 1 218750 +NUCICERT 0 3 1 218750 +VAPLIQT 0 3 1 218750 +VAPICET 0 3 1 218750 +MELTICET 0 3 1 218750 +RIMECLDT 0 3 1 218750 +RAIN2ICET 0 3 1 218750 +AGGREGATET 0 3 1 218750 +LATHEATVAPT 0 3 1 218750 +LATHEATFRZT 0 3 1 218750 +INUCHOMRT 0 3 1 218750 +INUCCONTRT 0 3 1 218750 +INUCIFNRT 0 3 1 218750 +INUCHAZRT 0 3 1 218750 +VAPCLDT 0 3 1 218750 +VAPRAINT 0 3 1 218750 +VAPPRIST 0 3 1 218750 +VAPSNOWT 0 3 1 218750 +VAPAGGRT 0 3 1 218750 +VAPGRAUT 0 3 1 218750 +VAPHAILT 0 3 1 218750 +VAPDRIZT 0 3 1 218750 +MELTPRIST 0 3 1 218750 +MELTSNOWT 0 3 1 218750 +MELTAGGRT 0 3 1 218750 +MELTGRAUT 0 3 1 218750 +MELTHAILT 0 3 1 218750 +RIMECLDSNOWT 0 3 1 218750 +RIMECLDAGGRT 0 3 1 218750 +RIMECLDGRAUT 0 3 1 218750 +RIMECLDHAILT 0 3 1 218750 +RAIN2PRT 0 3 1 218750 +RAIN2SNT 0 3 1 218750 +RAIN2AGT 0 3 1 218750 +RAIN2GRT 0 3 1 218750 +RAIN2HAT 0 3 1 218750 +AGGRSELFPRIST 0 3 1 218750 +AGGRSELFSNOWT 0 3 1 218750 +AGGRPRISSNOWT 0 3 1 218750 +DUST1CLDRT 0 3 1 218750 +DUST2CLDRT 0 3 1 218750 +DUST1DRZRT 0 3 1 218750 +DUST2DRZRT 0 3 1 218750 +ACCPR 0 2 1 875 +ACCPP 0 2 1 875 +ACCPS 0 2 1 875 +ACCPA 0 2 1 875 +ACCPG 0 2 1 875 +ACCPH 0 2 1 875 +ACCPD 0 2 1 875 +PCPRR 0 2 1 875 +PCPRP 0 2 1 875 +PCPRS 0 2 1 875 +PCPRA 0 2 1 875 +PCPRG 0 2 1 875 +PCPRH 0 2 1 875 +PCPRD 0 2 1 875 +PCPG 0 2 1 875 +QPCPG 0 2 1 875 +DPCPG 0 2 1 875 +ACCPAERO 0 2 1 875 +PCPRAERO 0 2 1 875 +ACCPDUST 0 2 1 875 +PCPRDUST 0 2 1 875 +FTHRD 0 3 1 218750 +BEXT 0 3 1 218750 +SWUP 0 3 1 218750 +SWDN 0 3 1 218750 +LWUP 0 3 1 218750 +LWDN 0 3 1 218750 +RSHORT 0 2 1 875 +RLONG 0 2 1 875 +RLONGUP 0 2 1 875 +ALBEDT 0 2 1 875 +COSZ 0 2 1 875 +AODT 0 2 1 875 +RHKM 0 3 1 218750 +RVKM 0 3 1 218750 +RVKH 0 3 1 218750 +SFLUX_U 0 2 1 875 +SFLUX_V 0 2 1 875 +SFLUX_W 0 2 1 875 +SFLUX_T 0 2 1 875 +SFLUX_R 0 2 1 875 +TOPT 0 2 1 875 +GLAT 0 2 1 875 +GLON 0 2 1 875 +TOPZO 0 2 1 875 +PI 1 3 1 218750 +HKH 1 3 1 218750 +VKH 1 3 1 218750 +__expnme + 1 +RAMS Simulations +__initial + 1 + 1 +__initorig + 1 + 1 +__jdim + 1 + 1 +__iyear1 + 1 + 1991 +__imonth1 + 1 + 4 +__idate1 + 1 + 26 +__itime1 + 1 + 2100 +__time + 1 + 0.900000000000000000E+03 +__nsndg + 1 + 35 +__us + 35 + -0.271000003814697266E+01 + -0.271000003814697266E+01 + -0.353999996185302734E+01 + -0.339000010490417480E+01 + -0.277999997138977051E+01 + -0.174000000953674316E+01 + -0.360000014305114746E+00 + 0.125000000000000000E+01 + 0.294000005722045898E+01 + 0.457999992370605469E+01 + 0.607000017166137695E+01 + 0.730000019073486328E+01 + 0.852999973297119141E+01 + 0.967000007629394531E+01 + 0.108999996185302734E+02 + 0.120900001525878906E+02 + 0.128400001525878906E+02 + 0.151300001144409180E+02 + 0.167000007629394531E+02 + 0.173600006103515625E+02 + 0.174400005340576172E+02 + 0.170400009155273438E+02 + 0.168299999237060547E+02 + 0.170599994659423828E+02 + 0.183799991607666016E+02 + 0.203899993896484375E+02 + 0.233099994659423828E+02 + 0.281800003051757813E+02 + 0.248199996948242188E+02 + 0.211499996185302734E+02 + 0.175100002288818359E+02 + 0.965999984741210938E+01 + 0.200999999046325684E+01 + 0.500000000000000000E+00 + -0.103999996185302734E+01 +__vs + 35 + 0.838000011444091797E+01 + 0.838000011444091797E+01 + 0.106599998474121094E+02 + 0.122500000000000000E+02 + 0.134600000381469727E+02 + 0.142600002288818359E+02 + 0.146400003433227539E+02 + 0.146599998474121094E+02 + 0.144099998474121094E+02 + 0.140299997329711914E+02 + 0.137200002670288086E+02 + 0.136199998855590820E+02 + 0.138299999237060547E+02 + 0.142600002288818359E+02 + 0.154700002670288086E+02 + 0.160300006866455078E+02 + 0.188700008392333984E+02 + 0.190900001525878906E+02 + 0.186000003814697266E+02 + 0.189099998474121094E+02 + 0.199799995422363281E+02 + 0.211800003051757813E+02 + 0.216200008392333984E+02 + 0.218400001525878906E+02 + 0.223400001525878906E+02 + 0.227000007629394531E+02 + 0.227399997711181641E+02 + 0.198400001525878906E+02 + 0.181599998474121094E+02 + 0.161700000762939453E+02 + 0.118999996185302734E+02 + 0.850000000000000000E+01 + 0.347000002861022949E+01 + 0.350000000000000000E+01 + 0.352999997138977051E+01 +__ts + 35 + 0.306079376220703125E+03 + 0.305112518310546875E+03 + 0.303622192382812500E+03 + 0.302135650634765625E+03 + 0.300582458496093750E+03 + 0.298970092773437500E+03 + 0.297265472412109375E+03 + 0.295463653564453125E+03 + 0.293529083251953125E+03 + 0.291434265136718750E+03 + 0.289150360107421875E+03 + 0.286665008544921875E+03 + 0.284018432617187500E+03 + 0.281624572753906250E+03 + 0.279662200927734375E+03 + 0.277406005859375000E+03 + 0.274758117675781250E+03 + 0.271294006347656250E+03 + 0.267552581787109375E+03 + 0.263083618164062500E+03 + 0.258075958251953125E+03 + 0.252843017578125000E+03 + 0.246956115722656250E+03 + 0.240328781127929687E+03 + 0.232743484497070312E+03 + 0.224288635253906250E+03 + 0.215936080932617187E+03 + 0.210840881347656250E+03 + 0.210143768310546875E+03 + 0.208462387084960937E+03 + 0.205940200805664062E+03 + 0.201693786621093750E+03 + 0.198953125000000000E+03 + 0.194737899780273437E+03 + 0.189301940917968750E+03 +__thds + 35 + 0.306959991455078125E+03 + 0.306960021972656250E+03 + 0.306529998779296875E+03 + 0.306209960937500000E+03 + 0.305939971923828125E+03 + 0.305740020751953125E+03 + 0.305589965820312500E+03 + 0.305500000000000000E+03 + 0.305450012207031250E+03 + 0.305429992675781250E+03 + 0.305429992675781250E+03 + 0.305459991455078125E+03 + 0.305589965820312500E+03 + 0.306299987792968750E+03 + 0.307829986572265625E+03 + 0.309429992675781250E+03 + 0.311029968261718750E+03 + 0.312190032958984375E+03 + 0.313570007324218750E+03 + 0.314700012207031250E+03 + 0.315859985351562500E+03 + 0.317509979248046875E+03 + 0.319209991455078125E+03 + 0.320940002441406250E+03 + 0.322510009765625000E+03 + 0.324149963378906250E+03 + 0.327439971923828125E+03 + 0.337469970703125000E+03 + 0.357589996337890625E+03 + 0.379390014648437500E+03 + 0.403859985351562500E+03 + 0.429979980468750000E+03 + 0.465670013427734375E+03 + 0.503269989013671875E+03 + 0.541519958496093750E+03 +__ps + 35 + 0.990000000000000000E+05 + 0.979103046875000000E+05 + 0.967206328125000000E+05 + 0.954221953125000000E+05 + 0.940067812500000000E+05 + 0.924657890625000000E+05 + 0.907903359375000000E+05 + 0.889713671875000000E+05 + 0.869998593750000000E+05 + 0.848665859375000000E+05 + 0.825626484375000000E+05 + 0.800791093750000000E+05 + 0.774072031250000000E+05 + 0.745411562500000000E+05 + 0.714829531250000000E+05 + 0.682369765625000000E+05 + 0.648056328125000000E+05 + 0.611899843750000000E+05 + 0.573959570312500000E+05 + 0.534349296875000000E+05 + 0.493217070312500000E+05 + 0.450816445312500000E+05 + 0.407470156250000000E+05 + 0.363542890625000000E+05 + 0.319460332031250000E+05 + 0.275735761718750000E+05 + 0.233073164062500000E+05 + 0.192918867187500000E+05 + 0.155726064453125000E+05 + 0.123097558593750000E+05 + 0.947972363281250000E+04 + 0.707827929687500000E+04 + 0.510501708984375000E+04 + 0.360986938476562500E+04 + 0.253038891601562500E+04 +__hs + 35 + 0.000000000000000000E+00 + 0.100002868652343750E+03 + 0.210000503540039062E+03 + 0.330998321533203125E+03 + 0.464095123291015625E+03 + 0.610502075195312500E+03 + 0.771550354003906250E+03 + 0.948713012695312500E+03 + 0.114357568359375000E+04 + 0.135793383789062500E+04 + 0.159372290039062500E+04 + 0.185310449218750000E+04 + 0.213841821289062500E+04 + 0.245225878906250000E+04 + 0.279748461914062500E+04 + 0.317723657226562500E+04 + 0.359496240234375000E+04 + 0.405446093750000000E+04 + 0.455991406250000000E+04 + 0.511591503906250000E+04 + 0.572751757812500000E+04 + 0.640028662109375000E+04 + 0.714033789062500000E+04 + 0.795439843750000000E+04 + 0.884990039062500000E+04 + 0.983496484375000000E+04 + 0.109185126953125000E+05 + 0.121001347656250000E+05 + 0.134203779296875000E+05 + 0.148615781250000000E+05 + 0.164467695312500000E+05 + 0.181904414062500000E+05 + 0.201076933593750000E+05 + 0.221054843750000000E+05 + 0.241034882812500000E+05 +__ihtran + 1 + 0 +__ngrids + 1 + 1 +__nzg + 1 + 11 +__nzs + 1 + 1 +__npatch + 1 + 2 +__nvegpat + 1 + 1 +__nkppz + 1 + 48 +__ztop + 1 + 0.200100156250000000E+05 +__polelat + 1 + 0.370000000000000000E+02 +__polelon + 1 + -0.975000000000000000E+02 +__nnxp + 1 + 25 +__nnyp + 1 + 35 +__nnzp + 1 + 250 +__nstratx + 1 + 1 +__nstraty + 1 + 1 +__nxtnest + 1 + 0 +__ninest + 1 + 1 +__njnest + 1 + 1 +__nknest + 1 + 1 +__deltaxn + 1 + 0.200000000000000000E+04 +__deltazn + 1 + 0.100000000000000000E+02 +__nestz + 1 + 0 +__nstratz + 250 + 1 + 1 + 3 + 3 + 3 + 3 + 2 + 2 + 2 + 2 + 1 + 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 + 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 + 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 + 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 + 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 + 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 + 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 + 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 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 +__ngbegun + 1 + 1 +__iref + 1 + 0 +__jref + 1 + 0 +__topref + 1 + 0.000000000000000000E+00 +__xmn01 + 25 + -0.230000000000000000E+05 + -0.210000000000000000E+05 + -0.190000000000000000E+05 + -0.170000000000000000E+05 + -0.150000000000000000E+05 + -0.130000000000000000E+05 + -0.110000000000000000E+05 + -0.900000000000000000E+04 + -0.700000000000000000E+04 + -0.500000000000000000E+04 + -0.300000000000000000E+04 + -0.100000000000000000E+04 + 0.100000000000000000E+04 + 0.300000000000000000E+04 + 0.500000000000000000E+04 + 0.700000000000000000E+04 + 0.900000000000000000E+04 + 0.110000000000000000E+05 + 0.130000000000000000E+05 + 0.150000000000000000E+05 + 0.170000000000000000E+05 + 0.190000000000000000E+05 + 0.210000000000000000E+05 + 0.230000000000000000E+05 + 0.250000000000000000E+05 +__xtn01 + 25 + -0.240000000000000000E+05 + -0.220000000000000000E+05 + -0.200000000000000000E+05 + -0.180000000000000000E+05 + -0.160000000000000000E+05 + -0.140000000000000000E+05 + -0.120000000000000000E+05 + -0.100000000000000000E+05 + -0.800000000000000000E+04 + -0.600000000000000000E+04 + -0.400000000000000000E+04 + -0.200000000000000000E+04 + 0.000000000000000000E+00 + 0.200000000000000000E+04 + 0.400000000000000000E+04 + 0.600000000000000000E+04 + 0.800000000000000000E+04 + 0.100000000000000000E+05 + 0.120000000000000000E+05 + 0.140000000000000000E+05 + 0.160000000000000000E+05 + 0.180000000000000000E+05 + 0.200000000000000000E+05 + 0.220000000000000000E+05 + 0.240000000000000000E+05 +__ymn01 + 35 + -0.330000000000000000E+05 + -0.310000000000000000E+05 + -0.290000000000000000E+05 + -0.270000000000000000E+05 + -0.250000000000000000E+05 + -0.230000000000000000E+05 + -0.210000000000000000E+05 + -0.190000000000000000E+05 + -0.170000000000000000E+05 + -0.150000000000000000E+05 + -0.130000000000000000E+05 + -0.110000000000000000E+05 + -0.900000000000000000E+04 + -0.700000000000000000E+04 + -0.500000000000000000E+04 + -0.300000000000000000E+04 + -0.100000000000000000E+04 + 0.100000000000000000E+04 + 0.300000000000000000E+04 + 0.500000000000000000E+04 + 0.700000000000000000E+04 + 0.900000000000000000E+04 + 0.110000000000000000E+05 + 0.130000000000000000E+05 + 0.150000000000000000E+05 + 0.170000000000000000E+05 + 0.190000000000000000E+05 + 0.210000000000000000E+05 + 0.230000000000000000E+05 + 0.250000000000000000E+05 + 0.270000000000000000E+05 + 0.290000000000000000E+05 + 0.310000000000000000E+05 + 0.330000000000000000E+05 + 0.350000000000000000E+05 +__ytn01 + 35 + -0.340000000000000000E+05 + -0.320000000000000000E+05 + -0.300000000000000000E+05 + -0.280000000000000000E+05 + -0.260000000000000000E+05 + -0.240000000000000000E+05 + -0.220000000000000000E+05 + -0.200000000000000000E+05 + -0.180000000000000000E+05 + -0.160000000000000000E+05 + -0.140000000000000000E+05 + -0.120000000000000000E+05 + -0.100000000000000000E+05 + -0.800000000000000000E+04 + -0.600000000000000000E+04 + -0.400000000000000000E+04 + -0.200000000000000000E+04 + 0.000000000000000000E+00 + 0.200000000000000000E+04 + 0.400000000000000000E+04 + 0.600000000000000000E+04 + 0.800000000000000000E+04 + 0.100000000000000000E+05 + 0.120000000000000000E+05 + 0.140000000000000000E+05 + 0.160000000000000000E+05 + 0.180000000000000000E+05 + 0.200000000000000000E+05 + 0.220000000000000000E+05 + 0.240000000000000000E+05 + 0.260000000000000000E+05 + 0.280000000000000000E+05 + 0.300000000000000000E+05 + 0.320000000000000000E+05 + 0.340000000000000000E+05 +__zmn01 + 250 + 0.000000000000000000E+00 + 0.100000000000000000E+02 + 0.202999992370605469E+02 + 0.309089984893798828E+02 + 0.418362655639648438E+02 + 0.530913505554199219E+02 + 0.646840896606445313E+02 + 0.766246109008789063E+02 + 0.889233474731445313E+02 + 0.101591049194335937E+03 + 0.114638778686523437E+03 + 0.128077941894531250E+03 + 0.141920272827148437E+03 + 0.156177871704101562E+03 + 0.170863204956054687E+03 + 0.185989105224609375E+03 + 0.201568786621093750E+03 + 0.217615859985351562E+03 + 0.234144348144531250E+03 + 0.251168685913085937E+03 + 0.268703765869140625E+03 + 0.286764892578125000E+03 + 0.305367858886718750E+03 + 0.324528900146484375E+03 + 0.344264770507812500E+03 + 0.364592712402343750E+03 + 0.385530487060546875E+03 + 0.407096405029296875E+03 + 0.429309295654296875E+03 + 0.452188568115234375E+03 + 0.475754211425781250E+03 + 0.500026824951171875E+03 + 0.525027587890625000E+03 + 0.550778381347656250E+03 + 0.577301696777343750E+03 + 0.604620727539062500E+03 + 0.632759338378906250E+03 + 0.661742126464843750E+03 + 0.691594421386718750E+03 + 0.722342285156250000E+03 + 0.754012573242187500E+03 + 0.786632995605468750E+03 + 0.820232055664062500E+03 + 0.854839111328125000E+03 + 0.890484375000000000E+03 + 0.927198974609375000E+03 + 0.965015014648437500E+03 + 0.100396551513671875E+04 + 0.104408447265625000E+04 + 0.108540698242187500E+04 + 0.112796911621093750E+04 + 0.117180810546875000E+04 + 0.121696228027343750E+04 + 0.126347106933593750E+04 + 0.131137512207031250E+04 + 0.136071630859375000E+04 + 0.141153771972656250E+04 + 0.146388378906250000E+04 + 0.151780029296875000E+04 + 0.157333422851562500E+04 + 0.163053417968750000E+04 + 0.168945007324218750E+04 + 0.175013342285156250E+04 + 0.181263732910156250E+04 + 0.187701635742187500E+04 + 0.194332678222656250E+04 + 0.201162646484375000E+04 + 0.208197509765625000E+04 + 0.215443408203125000E+04 + 0.222906689453125000E+04 + 0.230593872070312500E+04 + 0.238511669921875000E+04 + 0.246666992187500000E+04 + 0.255066967773437500E+04 + 0.263718945312500000E+04 + 0.272630493164062500E+04 + 0.281809375000000000E+04 + 0.291263623046875000E+04 + 0.301001489257812500E+04 + 0.311001489257812500E+04 + 0.321001489257812500E+04 + 0.331001489257812500E+04 + 0.341001489257812500E+04 + 0.351001489257812500E+04 + 0.361001489257812500E+04 + 0.371001489257812500E+04 + 0.381001489257812500E+04 + 0.391001489257812500E+04 + 0.401001489257812500E+04 + 0.411001464843750000E+04 + 0.421001464843750000E+04 + 0.431001464843750000E+04 + 0.441001464843750000E+04 + 0.451001464843750000E+04 + 0.461001464843750000E+04 + 0.471001464843750000E+04 + 0.481001464843750000E+04 + 0.491001464843750000E+04 + 0.501001464843750000E+04 + 0.511001464843750000E+04 + 0.521001464843750000E+04 + 0.531001464843750000E+04 + 0.541001464843750000E+04 + 0.551001464843750000E+04 + 0.561001464843750000E+04 + 0.571001464843750000E+04 + 0.581001464843750000E+04 + 0.591001464843750000E+04 + 0.601001464843750000E+04 + 0.611001464843750000E+04 + 0.621001464843750000E+04 + 0.631001464843750000E+04 + 0.641001464843750000E+04 + 0.651001464843750000E+04 + 0.661001464843750000E+04 + 0.671001464843750000E+04 + 0.681001464843750000E+04 + 0.691001464843750000E+04 + 0.701001464843750000E+04 + 0.711001464843750000E+04 + 0.721001464843750000E+04 + 0.731001464843750000E+04 + 0.741001464843750000E+04 + 0.751001464843750000E+04 + 0.761001464843750000E+04 + 0.771001464843750000E+04 + 0.781001464843750000E+04 + 0.791001464843750000E+04 + 0.801001464843750000E+04 + 0.811001464843750000E+04 + 0.821001464843750000E+04 + 0.831001464843750000E+04 + 0.841001464843750000E+04 + 0.851001464843750000E+04 + 0.861001464843750000E+04 + 0.871001464843750000E+04 + 0.881001464843750000E+04 + 0.891001464843750000E+04 + 0.901001464843750000E+04 + 0.911001464843750000E+04 + 0.921001464843750000E+04 + 0.931001464843750000E+04 + 0.941001464843750000E+04 + 0.951001464843750000E+04 + 0.961001464843750000E+04 + 0.971001464843750000E+04 + 0.981001464843750000E+04 + 0.991001464843750000E+04 + 0.100100146484375000E+05 + 0.101100146484375000E+05 + 0.102100146484375000E+05 + 0.103100146484375000E+05 + 0.104100146484375000E+05 + 0.105100146484375000E+05 + 0.106100146484375000E+05 + 0.107100146484375000E+05 + 0.108100146484375000E+05 + 0.109100146484375000E+05 + 0.110100146484375000E+05 + 0.111100146484375000E+05 + 0.112100146484375000E+05 + 0.113100146484375000E+05 + 0.114100146484375000E+05 + 0.115100146484375000E+05 + 0.116100146484375000E+05 + 0.117100146484375000E+05 + 0.118100146484375000E+05 + 0.119100146484375000E+05 + 0.120100146484375000E+05 + 0.121100146484375000E+05 + 0.122100146484375000E+05 + 0.123100146484375000E+05 + 0.124100146484375000E+05 + 0.125100146484375000E+05 + 0.126100146484375000E+05 + 0.127100146484375000E+05 + 0.128100146484375000E+05 + 0.129100146484375000E+05 + 0.130100146484375000E+05 + 0.131100146484375000E+05 + 0.132100146484375000E+05 + 0.133100146484375000E+05 + 0.134100146484375000E+05 + 0.135100146484375000E+05 + 0.136100146484375000E+05 + 0.137100146484375000E+05 + 0.138100146484375000E+05 + 0.139100146484375000E+05 + 0.140100146484375000E+05 + 0.141100146484375000E+05 + 0.142100146484375000E+05 + 0.143100146484375000E+05 + 0.144100146484375000E+05 + 0.145100146484375000E+05 + 0.146100146484375000E+05 + 0.147100146484375000E+05 + 0.148100146484375000E+05 + 0.149100146484375000E+05 + 0.150100146484375000E+05 + 0.151100146484375000E+05 + 0.152100146484375000E+05 + 0.153100146484375000E+05 + 0.154100146484375000E+05 + 0.155100146484375000E+05 + 0.156100146484375000E+05 + 0.157100146484375000E+05 + 0.158100146484375000E+05 + 0.159100146484375000E+05 + 0.160100146484375000E+05 + 0.161100146484375000E+05 + 0.162100146484375000E+05 + 0.163100146484375000E+05 + 0.164100156250000000E+05 + 0.165100156250000000E+05 + 0.166100156250000000E+05 + 0.167100156250000000E+05 + 0.168100156250000000E+05 + 0.169100156250000000E+05 + 0.170100156250000000E+05 + 0.171100156250000000E+05 + 0.172100156250000000E+05 + 0.173100156250000000E+05 + 0.174100156250000000E+05 + 0.175100156250000000E+05 + 0.176100156250000000E+05 + 0.177100156250000000E+05 + 0.178100156250000000E+05 + 0.179100156250000000E+05 + 0.180100156250000000E+05 + 0.181100156250000000E+05 + 0.182100156250000000E+05 + 0.183100156250000000E+05 + 0.184100156250000000E+05 + 0.185100156250000000E+05 + 0.186100156250000000E+05 + 0.187100156250000000E+05 + 0.188100156250000000E+05 + 0.189100156250000000E+05 + 0.190100156250000000E+05 + 0.191100156250000000E+05 + 0.192100156250000000E+05 + 0.193100156250000000E+05 + 0.194100156250000000E+05 + 0.195100156250000000E+05 + 0.196100156250000000E+05 + 0.197100156250000000E+05 + 0.198100156250000000E+05 + 0.199100156250000000E+05 + 0.200100156250000000E+05 + 0.201100156250000000E+05 +__ztn01 + 250 + -0.489024114608764648E+01 + 0.496305179595947266E+01 + 0.151119432449340820E+02 + 0.255652999877929688E+02 + 0.363322563171386719E+02 + 0.474222221374511719E+02 + 0.588448867797851563E+02 + 0.706102294921875000E+02 + 0.827285385131835938E+02 + 0.952103958129882813E+02 + 0.108066703796386719E+03 + 0.121308708190917969E+03 + 0.134947967529296875E+03 + 0.148996398925781250E+03 + 0.163466278076171875E+03 + 0.178370269775390625E+03 + 0.193721374511718750E+03 + 0.209533035278320312E+03 + 0.225819030761718750E+03 + 0.242593612670898437E+03 + 0.259871429443359375E+03 + 0.277667602539062500E+03 + 0.295997650146484375E+03 + 0.314877593994140625E+03 + 0.334323913574218750E+03 + 0.354353637695312500E+03 + 0.374984252929687500E+03 + 0.396233764648437500E+03 + 0.418120788574218750E+03 + 0.440664398193359375E+03 + 0.463884307861328125E+03 + 0.487800842285156250E+03 + 0.512434814453125000E+03 + 0.537807861328125000E+03 + 0.563942016601562500E+03 + 0.590860290527343750E+03 + 0.618586059570312500E+03 + 0.647143615722656250E+03 + 0.676557983398437500E+03 + 0.706854736328125000E+03 + 0.738060424804687500E+03 + 0.770202270507812500E+03 + 0.803308410644531250E+03 + 0.837407714843750000E+03 + 0.872530029296875000E+03 + 0.908706054687500000E+03 + 0.945967285156250000E+03 + 0.984346374511718750E+03 + 0.102387677001953125E+04 + 0.106459301757812500E+04 + 0.110653076171875000E+04 + 0.114972668457031250E+04 + 0.119421838378906250E+04 + 0.124004479980468750E+04 + 0.128724609375000000E+04 + 0.133586340332031250E+04 + 0.138593920898437500E+04 + 0.143751733398437500E+04 + 0.149064282226562500E+04 + 0.154536206054687500E+04 + 0.160172290039062500E+04 + 0.165977441406250000E+04 + 0.171956750488281250E+04 + 0.178115441894531250E+04 + 0.184458898925781250E+04 + 0.190992651367187500E+04 + 0.197722424316406250E+04 + 0.204654089355468750E+04 + 0.211793676757812500E+04 + 0.219147460937500000E+04 + 0.226721875000000000E+04 + 0.234523510742187500E+04 + 0.242559204101562500E+04 + 0.250835937500000000E+04 + 0.259360986328125000E+04 + 0.268141796875000000E+04 + 0.277186010742187500E+04 + 0.286501562500000000E+04 + 0.296098388671875000E+04 + 0.305984887695312500E+04 + 0.316001489257812500E+04 + 0.326001489257812500E+04 + 0.336001489257812500E+04 + 0.346001489257812500E+04 + 0.356001489257812500E+04 + 0.366001489257812500E+04 + 0.376001489257812500E+04 + 0.386001489257812500E+04 + 0.396001489257812500E+04 + 0.406001464843750000E+04 + 0.416001464843750000E+04 + 0.426001464843750000E+04 + 0.436001464843750000E+04 + 0.446001464843750000E+04 + 0.456001464843750000E+04 + 0.466001464843750000E+04 + 0.476001464843750000E+04 + 0.486001464843750000E+04 + 0.496001464843750000E+04 + 0.506001464843750000E+04 + 0.516001464843750000E+04 + 0.526001464843750000E+04 + 0.536001464843750000E+04 + 0.546001464843750000E+04 + 0.556001464843750000E+04 + 0.566001464843750000E+04 + 0.576001464843750000E+04 + 0.586001464843750000E+04 + 0.596001464843750000E+04 + 0.606001464843750000E+04 + 0.616001464843750000E+04 + 0.626001464843750000E+04 + 0.636001464843750000E+04 + 0.646001464843750000E+04 + 0.656001464843750000E+04 + 0.666001464843750000E+04 + 0.676001464843750000E+04 + 0.686001464843750000E+04 + 0.696001464843750000E+04 + 0.706001464843750000E+04 + 0.716001464843750000E+04 + 0.726001464843750000E+04 + 0.736001464843750000E+04 + 0.746001464843750000E+04 + 0.756001464843750000E+04 + 0.766001464843750000E+04 + 0.776001464843750000E+04 + 0.786001464843750000E+04 + 0.796001464843750000E+04 + 0.806001464843750000E+04 + 0.816001464843750000E+04 + 0.826001464843750000E+04 + 0.836001464843750000E+04 + 0.846001464843750000E+04 + 0.856001464843750000E+04 + 0.866001464843750000E+04 + 0.876001464843750000E+04 + 0.886001464843750000E+04 + 0.896001464843750000E+04 + 0.906001464843750000E+04 + 0.916001464843750000E+04 + 0.926001464843750000E+04 + 0.936001464843750000E+04 + 0.946001464843750000E+04 + 0.956001464843750000E+04 + 0.966001464843750000E+04 + 0.976001464843750000E+04 + 0.986001464843750000E+04 + 0.996001464843750000E+04 + 0.100600146484375000E+05 + 0.101600146484375000E+05 + 0.102600146484375000E+05 + 0.103600146484375000E+05 + 0.104600146484375000E+05 + 0.105600146484375000E+05 + 0.106600146484375000E+05 + 0.107600146484375000E+05 + 0.108600146484375000E+05 + 0.109600146484375000E+05 + 0.110600146484375000E+05 + 0.111600146484375000E+05 + 0.112600146484375000E+05 + 0.113600146484375000E+05 + 0.114600146484375000E+05 + 0.115600146484375000E+05 + 0.116600146484375000E+05 + 0.117600146484375000E+05 + 0.118600146484375000E+05 + 0.119600146484375000E+05 + 0.120600146484375000E+05 + 0.121600146484375000E+05 + 0.122600146484375000E+05 + 0.123600146484375000E+05 + 0.124600146484375000E+05 + 0.125600146484375000E+05 + 0.126600146484375000E+05 + 0.127600146484375000E+05 + 0.128600146484375000E+05 + 0.129600146484375000E+05 + 0.130600146484375000E+05 + 0.131600146484375000E+05 + 0.132600146484375000E+05 + 0.133600146484375000E+05 + 0.134600146484375000E+05 + 0.135600146484375000E+05 + 0.136600146484375000E+05 + 0.137600146484375000E+05 + 0.138600146484375000E+05 + 0.139600146484375000E+05 + 0.140600146484375000E+05 + 0.141600146484375000E+05 + 0.142600146484375000E+05 + 0.143600146484375000E+05 + 0.144600146484375000E+05 + 0.145600146484375000E+05 + 0.146600146484375000E+05 + 0.147600146484375000E+05 + 0.148600146484375000E+05 + 0.149600146484375000E+05 + 0.150600146484375000E+05 + 0.151600146484375000E+05 + 0.152600146484375000E+05 + 0.153600146484375000E+05 + 0.154600146484375000E+05 + 0.155600146484375000E+05 + 0.156600146484375000E+05 + 0.157600146484375000E+05 + 0.158600146484375000E+05 + 0.159600146484375000E+05 + 0.160600146484375000E+05 + 0.161600146484375000E+05 + 0.162600146484375000E+05 + 0.163600156250000000E+05 + 0.164600156250000000E+05 + 0.165600156250000000E+05 + 0.166600156250000000E+05 + 0.167600156250000000E+05 + 0.168600156250000000E+05 + 0.169600156250000000E+05 + 0.170600156250000000E+05 + 0.171600156250000000E+05 + 0.172600156250000000E+05 + 0.173600156250000000E+05 + 0.174600156250000000E+05 + 0.175600156250000000E+05 + 0.176600156250000000E+05 + 0.177600156250000000E+05 + 0.178600156250000000E+05 + 0.179600156250000000E+05 + 0.180600156250000000E+05 + 0.181600156250000000E+05 + 0.182600156250000000E+05 + 0.183600156250000000E+05 + 0.184600156250000000E+05 + 0.185600156250000000E+05 + 0.186600156250000000E+05 + 0.187600156250000000E+05 + 0.188600156250000000E+05 + 0.189600156250000000E+05 + 0.190600156250000000E+05 + 0.191600156250000000E+05 + 0.192600156250000000E+05 + 0.193600156250000000E+05 + 0.194600156250000000E+05 + 0.195600156250000000E+05 + 0.196600156250000000E+05 + 0.197600156250000000E+05 + 0.198600156250000000E+05 + 0.199600156250000000E+05 + 0.200600156250000000E+05 +__dzmn01 + 250 + 0.101488918066024780E+00 + 0.985329300165176392E-01 + 0.956630483269691467E-01 + 0.928767547011375427E-01 + 0.901716053485870361E-01 + 0.875452458858489990E-01 + 0.849953964352607727E-01 + 0.825197622179985046E-01 + 0.801162794232368469E-01 + 0.777828320860862732E-01 + 0.755172669887542725E-01 + 0.733177661895751953E-01 + 0.711823254823684692E-01 + 0.691090747714042664E-01 + 0.670961216092109680E-01 + 0.651418939232826233E-01 + 0.632444620132446289E-01 + 0.614024475216865540E-01 + 0.596140027046203613E-01 + 0.578776821494102478E-01 + 0.561918579041957855E-01 + 0.545552335679531097E-01 + 0.529662594199180603E-01 + 0.514236129820346832E-01 + 0.499258004128932953E-01 + 0.484716519713401794E-01 + 0.470599047839641571E-01 + 0.456891730427742004E-01 + 0.443584695458412170E-01 + 0.430664904415607452E-01 + 0.418120771646499634E-01 + 0.405943468213081360E-01 + 0.394118987023830414E-01 + 0.382641032338142395E-01 + 0.371494852006435394E-01 + 0.360675305128097534E-01 + 0.350170023739337921E-01 + 0.339969918131828308E-01 + 0.330068357288837433E-01 + 0.320454388856887817E-01 + 0.311120897531509399E-01 + 0.302058774977922440E-01 + 0.293261110782623291E-01 + 0.284719280898571014E-01 + 0.276426170021295547E-01 + 0.268375463783740997E-01 + 0.260558556765317917E-01 + 0.252969898283481598E-01 + 0.245602205395698547E-01 + 0.238448679447174072E-01 + 0.231503322720527649E-01 + 0.224761031568050385E-01 + 0.218214746564626694E-01 + 0.211858600378036499E-01 + 0.205688066780567169E-01 + 0.199697241187095642E-01 + 0.193880647420883179E-01 + 0.188233572989702225E-01 + 0.182751081883907318E-01 + 0.177428163588047028E-01 + 0.172260794788599014E-01 + 0.167243406176567078E-01 + 0.162372160702943802E-01 + 0.157642755657434464E-01 + 0.153051409870386124E-01 + 0.148593420162796974E-01 + 0.144265480339527130E-01 + 0.140064116567373276E-01 + 0.135984411463141441E-01 + 0.132023412734270096E-01 + 0.128178251907229424E-01 + 0.124444765970110893E-01 + 0.120820617303252220E-01 + 0.117301382124423981E-01 + 0.113884704187512398E-01 + 0.110567929223179817E-01 + 0.107347369194030762E-01 + 0.104201119393110275E-01 + 0.101148039102554321E-01 + 0.998342595994472504E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.100000239908695221E-01 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999990198761224747E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 +__dztn01 + 250 + 0.103000000119209290E+00 + 0.100000001490116119E+00 + 0.970873832702636719E-01 + 0.942595973610877991E-01 + 0.915141925215721130E-01 + 0.888487324118614197E-01 + 0.862608924508094788E-01 + 0.837484374642372131E-01 + 0.813091620802879333E-01 + 0.789409205317497253E-01 + 0.766416862607002258E-01 + 0.744093954563140869E-01 + 0.722421705722808838E-01 + 0.701380372047424316E-01 + 0.680951550602912903E-01 + 0.661117658019065857E-01 + 0.641861632466316223E-01 + 0.623166598379611969E-01 + 0.605016015470027924E-01 + 0.587394349277019501E-01 + 0.570285394787788391E-01 + 0.553675331175327301E-01 + 0.537548698484897614E-01 + 0.521892309188842773E-01 + 0.506691597402095795E-01 + 0.491933710873126984E-01 + 0.477605685591697693E-01 + 0.463694632053375244E-01 + 0.450189039111137390E-01 + 0.437076836824417114E-01 + 0.424346588551998138E-01 + 0.411986932158470154E-01 + 0.399987809360027313E-01 + 0.388337559998035431E-01 + 0.377026759088039398E-01 + 0.366045199334621429E-01 + 0.355383567512035370E-01 + 0.345032364130020142E-01 + 0.334982611238956451E-01 + 0.325225852429866791E-01 + 0.315753370523452759E-01 + 0.306556429713964462E-01 + 0.297627374529838562E-01 + 0.288958419114351273E-01 + 0.280542187392711639E-01 + 0.272371210157871246E-01 + 0.264438055455684662E-01 + 0.256736110895872116E-01 + 0.249258726835250854E-01 + 0.241998862475156784E-01 + 0.234950631856918335E-01 + 0.228107441216707230E-01 + 0.221463460475206375E-01 + 0.215013120323419571E-01 + 0.208750609308481216E-01 + 0.202670432627201080E-01 + 0.196767468005418777E-01 + 0.191036313772201538E-01 + 0.185471959412097931E-01 + 0.180070083588361740E-01 + 0.174825321882963181E-01 + 0.169733483344316483E-01 + 0.164789855480194092E-01 + 0.159990005195140839E-01 + 0.155330086126923561E-01 + 0.150805851444602013E-01 + 0.146413566544651985E-01 + 0.142149170860648155E-01 + 0.138009106740355492E-01 + 0.133989322930574417E-01 + 0.130086671561002731E-01 + 0.126297743991017342E-01 + 0.122619308531284332E-01 + 0.119047965854406357E-01 + 0.115580512210726738E-01 + 0.112213948741555214E-01 + 0.108945732936263084E-01 + 0.105772558599710464E-01 + 0.102691901847720146E-01 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.100000239908695221E-01 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999990198761224747E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 +__u01dn01 + 250 + -0.271000003814697266E+01 + -0.271000003814697266E+01 + -0.271000003814697266E+01 + -0.271000003814697266E+01 + -0.271000003814697266E+01 + -0.271000003814697266E+01 + -0.271000003814697266E+01 + -0.271000003814697266E+01 + -0.271000003814697266E+01 + -0.271000003814697266E+01 + -0.277084660530090332E+01 + -0.287076568603515625E+01 + -0.297368240356445313E+01 + -0.307968640327453613E+01 + -0.318887066841125488E+01 + -0.330133032798767090E+01 + -0.341716384887695313E+01 + -0.353647255897521973E+01 + -0.352038979530334473E+01 + -0.349959468841552734E+01 + -0.347817540168762207E+01 + -0.345611381530761719E+01 + -0.343339014053344727E+01 + -0.340998482704162598E+01 + -0.337475848197937012E+01 + -0.328295969963073730E+01 + -0.318840670585632324E+01 + -0.309101748466491699E+01 + -0.299070644378662109E+01 + -0.288738608360290527E+01 + -0.278096628189086914E+01 + -0.261160659790039063E+01 + -0.243661952018737793E+01 + -0.225638246536254883E+01 + -0.207073879241943359E+01 + -0.187952518463134766E+01 + -0.167072951793670654E+01 + -0.142602384090423584E+01 + -0.117397618293762207E+01 + -0.914367675781250000E+00 + -0.646970510482788086E+00 + -0.371551632881164551E+00 + -0.713925063610076904E-01 + 0.238491535186767578E+00 + 0.557672321796417236E+00 + 0.886429071426391602E+00 + 0.122504770755767822E+01 + 0.155904006958007813E+01 + 0.190187835693359375E+01 + 0.225500106811523438E+01 + 0.261871767044067383E+01 + 0.298705983161926270E+01 + 0.332745456695556641E+01 + 0.367806077003479004E+01 + 0.403918600082397461E+01 + 0.441114473342895508E+01 + 0.475697183609008789E+01 + 0.508290481567382813E+01 + 0.541861581802368164E+01 + 0.576439809799194336E+01 + 0.610793638229370117E+01 + 0.638321971893310547E+01 + 0.666676139831542969E+01 + 0.695880937576293945E+01 + 0.725961923599243164E+01 + 0.754496240615844727E+01 + 0.783508586883544922E+01 + 0.813391304016113281E+01 + 0.844170379638671875E+01 + 0.872272300720214844E+01 + 0.899785709381103516E+01 + 0.928124523162841797E+01 + 0.957313537597656250E+01 + 0.986987972259521484E+01 + 0.101736173629760742E+02 + 0.104864673614501953E+02 + 0.108087024688720703E+02 + 0.111116161346435547E+02 + 0.114123449325561523E+02 + 0.117221508026123047E+02 + 0.120360336303710938E+02 + 0.122386236190795898E+02 + 0.124181671142578125E+02 + 0.125977106094360352E+02 + 0.127772541046142578E+02 + 0.131642017364501953E+02 + 0.136625709533691406E+02 + 0.141609401702880859E+02 + 0.146593103408813477E+02 + 0.151472501754760742E+02 + 0.154578628540039063E+02 + 0.157684755325317383E+02 + 0.160790882110595703E+02 + 0.163896999359130859E+02 + 0.167001209259033203E+02 + 0.168188247680664063E+02 + 0.169375305175781250E+02 + 0.170562343597412109E+02 + 0.171749401092529297E+02 + 0.172936439514160156E+02 + 0.173657684326171875E+02 + 0.173788490295410156E+02 + 0.173919296264648438E+02 + 0.174050102233886719E+02 + 0.174180908203125000E+02 + 0.174311714172363281E+02 + 0.174206790924072266E+02 + 0.173612232208251953E+02 + 0.173017673492431641E+02 + 0.172423114776611328E+02 + 0.171828556060791016E+02 + 0.171233997344970703E+02 + 0.170639457702636719E+02 + 0.170230522155761719E+02 + 0.169946746826171875E+02 + 0.169662990570068359E+02 + 0.169379234313964844E+02 + 0.169095458984375000E+02 + 0.168811702728271484E+02 + 0.168527927398681641E+02 + 0.168355598449707031E+02 + 0.168638134002685547E+02 + 0.168920669555664063E+02 + 0.169203186035156250E+02 + 0.169485721588134766E+02 + 0.169768257141113281E+02 + 0.170050792694091797E+02 + 0.170333328247070313E+02 + 0.170682773590087891E+02 + 0.172156810760498047E+02 + 0.173630847930908203E+02 + 0.175104885101318359E+02 + 0.176578903198242188E+02 + 0.178052940368652344E+02 + 0.179526977539062500E+02 + 0.181001014709472656E+02 + 0.182475051879882813E+02 + 0.184006366729736328E+02 + 0.186046848297119141E+02 + 0.188087329864501953E+02 + 0.190127792358398438E+02 + 0.192168273925781250E+02 + 0.194208755493164063E+02 + 0.196249217987060547E+02 + 0.198289699554443359E+02 + 0.200330181121826172E+02 + 0.202370643615722656E+02 + 0.204575042724609375E+02 + 0.207269897460937500E+02 + 0.209964752197265625E+02 + 0.212659606933593750E+02 + 0.215354461669921875E+02 + 0.218049297332763672E+02 + 0.220744152069091797E+02 + 0.223439006805419922E+02 + 0.226133861541748047E+02 + 0.228828697204589844E+02 + 0.231523551940917969E+02 + 0.234810485839843750E+02 + 0.238931922912597656E+02 + 0.243053379058837891E+02 + 0.247174835205078125E+02 + 0.251296291351318359E+02 + 0.255417747497558594E+02 + 0.259539203643798828E+02 + 0.263660659790039063E+02 + 0.267782115936279297E+02 + 0.271903572082519531E+02 + 0.276025009155273438E+02 + 0.280146465301513672E+02 + 0.280276069641113281E+02 + 0.277731075286865234E+02 + 0.275186100006103516E+02 + 0.272641105651855469E+02 + 0.270096130371093750E+02 + 0.267551136016845703E+02 + 0.265006141662597656E+02 + 0.262461166381835938E+02 + 0.259916172027587891E+02 + 0.257371196746826172E+02 + 0.254826202392578125E+02 + 0.252281227111816406E+02 + 0.249736232757568359E+02 + 0.247190647125244141E+02 + 0.244644165039062500E+02 + 0.242097682952880859E+02 + 0.239551181793212891E+02 + 0.237004699707031250E+02 + 0.234458217620849609E+02 + 0.231911716461181641E+02 + 0.229365234375000000E+02 + 0.226818733215332031E+02 + 0.224272251129150391E+02 + 0.221725769042968750E+02 + 0.219179267883300781E+02 + 0.216632785797119141E+02 + 0.214086303710937500E+02 + 0.211539802551269531E+02 + 0.209239654541015625E+02 + 0.206943397521972656E+02 + 0.204647140502929688E+02 + 0.202350883483886719E+02 + 0.200054626464843750E+02 + 0.197758388519287109E+02 + 0.195462131500244141E+02 + 0.193165874481201172E+02 + 0.190869636535644531E+02 + 0.188573379516601563E+02 + 0.186277122497558594E+02 + 0.183980865478515625E+02 + 0.181684608459472656E+02 + 0.179388370513916016E+02 + 0.177092094421386719E+02 + 0.174503669738769531E+02 + 0.170001678466796875E+02 + 0.165499668121337891E+02 + 0.160997676849365234E+02 + 0.156495685577392578E+02 + 0.151993694305419922E+02 + 0.147491703033447266E+02 + 0.142989702224731445E+02 + 0.138487710952758789E+02 + 0.133985719680786133E+02 + 0.129483718872070313E+02 + 0.124981727600097656E+02 + 0.120479736328125000E+02 + 0.115977745056152344E+02 + 0.111475753784179688E+02 + 0.106973752975463867E+02 + 0.102471752166748047E+02 + 0.979697608947753906E+01 + 0.938239288330078125E+01 + 0.898338413238525391E+01 + 0.858437538146972656E+01 + 0.818536758422851563E+01 + 0.778635835647583008E+01 + 0.738735008239746094E+01 + 0.698834133148193359E+01 + 0.658933258056640625E+01 + 0.619032430648803711E+01 + 0.579131603240966797E+01 + 0.539230728149414063E+01 + 0.499329853057861328E+01 + 0.459428977966308594E+01 + 0.419528150558471680E+01 + 0.379627275466918945E+01 + 0.339726400375366211E+01 + 0.299825572967529297E+01 + 0.259924697875976563E+01 + 0.220023870468139648E+01 +__v01dn01 + 250 + 0.838000011444091797E+01 + 0.838000011444091797E+01 + 0.838000011444091797E+01 + 0.838000011444091797E+01 + 0.838000011444091797E+01 + 0.838000011444091797E+01 + 0.838000011444091797E+01 + 0.838000011444091797E+01 + 0.838000011444091797E+01 + 0.838000011444091797E+01 + 0.854714488983154297E+01 + 0.882162189483642578E+01 + 0.910433197021484375E+01 + 0.939552402496337891E+01 + 0.969545173645019531E+01 + 0.100043773651123047E+02 + 0.103225708007812500E+02 + 0.106503105163574219E+02 + 0.108678665161132813E+02 + 0.110882968902587891E+02 + 0.113153400421142578E+02 + 0.115491952896118164E+02 + 0.117900657653808594E+02 + 0.120381622314453125E+02 + 0.122802333831787109E+02 + 0.124623260498046875E+02 + 0.126498813629150391E+02 + 0.128430633544921875E+02 + 0.130420417785644531E+02 + 0.132469882965087891E+02 + 0.134580831527709961E+02 + 0.135895338058471680E+02 + 0.137241392135620117E+02 + 0.138627824783325195E+02 + 0.140055856704711914E+02 + 0.141526727676391602E+02 + 0.142790746688842773E+02 + 0.143464574813842773E+02 + 0.144158620834350586E+02 + 0.144873485565185547E+02 + 0.145609798431396484E+02 + 0.146368198394775391E+02 + 0.146435852050781250E+02 + 0.146474351882934570E+02 + 0.146513996124267578E+02 + 0.146554832458496094E+02 + 0.146596899032592773E+02 + 0.146142835617065430E+02 + 0.145635681152343750E+02 + 0.145113306045532227E+02 + 0.144575271606445313E+02 + 0.143990955352783203E+02 + 0.143202238082885742E+02 + 0.142389860153198242E+02 + 0.141553106307983398E+02 + 0.140691251754760742E+02 + 0.139931802749633789E+02 + 0.139253683090209961E+02 + 0.138555231094360352E+02 + 0.137835817337036133E+02 + 0.137169160842895508E+02 + 0.136945352554321289E+02 + 0.136714830398559570E+02 + 0.136477394104003906E+02 + 0.136232824325561523E+02 + 0.136618223190307617E+02 + 0.137113561630249023E+02 + 0.137623748779296875E+02 + 0.138149251937866211E+02 + 0.139026937484741211E+02 + 0.140064725875854492E+02 + 0.141133642196655273E+02 + 0.142234630584716797E+02 + 0.144566297531127930E+02 + 0.147554292678833008E+02 + 0.150631923675537109E+02 + 0.153801879882812500E+02 + 0.155695848464965820E+02 + 0.157111043930053711E+02 + 0.158568954467773438E+02 + 0.160046043395996094E+02 + 0.165927867889404297E+02 + 0.172726593017578125E+02 + 0.179525299072265625E+02 + 0.186324024200439453E+02 + 0.189011459350585938E+02 + 0.189490242004394531E+02 + 0.189969024658203125E+02 + 0.190447807312011719E+02 + 0.190846157073974609E+02 + 0.189876728057861328E+02 + 0.188907318115234375E+02 + 0.187937889099121094E+02 + 0.186968460083007813E+02 + 0.186000556945800781E+02 + 0.186558113098144531E+02 + 0.187115669250488281E+02 + 0.187673225402832031E+02 + 0.188230781555175781E+02 + 0.188788318634033203E+02 + 0.189871520996093750E+02 + 0.191621017456054688E+02 + 0.193370532989501953E+02 + 0.195120029449462891E+02 + 0.196869525909423828E+02 + 0.198619022369384766E+02 + 0.200379638671875000E+02 + 0.202163314819335938E+02 + 0.203946990966796875E+02 + 0.205730667114257813E+02 + 0.207514343261718750E+02 + 0.209298000335693359E+02 + 0.211081676483154297E+02 + 0.212155113220214844E+02 + 0.212749671936035156E+02 + 0.213344230651855469E+02 + 0.213938789367675781E+02 + 0.214533329010009766E+02 + 0.215127887725830078E+02 + 0.215722446441650391E+02 + 0.216253185272216797E+02 + 0.216523437500000000E+02 + 0.216793689727783203E+02 + 0.217063941955566406E+02 + 0.217334175109863281E+02 + 0.217604427337646484E+02 + 0.217874679565429688E+02 + 0.218144931793212891E+02 + 0.218431358337402344E+02 + 0.218989696502685547E+02 + 0.219548053741455078E+02 + 0.220106391906738281E+02 + 0.220664749145507813E+02 + 0.221223087310791016E+02 + 0.221781444549560547E+02 + 0.222339782714843750E+02 + 0.222898120880126953E+02 + 0.223436965942382813E+02 + 0.223802433013916016E+02 + 0.224167881011962891E+02 + 0.224533348083496094E+02 + 0.224898796081542969E+02 + 0.225264263153076172E+02 + 0.225629711151123047E+02 + 0.225995178222656250E+02 + 0.226360645294189453E+02 + 0.226726093292236328E+02 + 0.227009258270263672E+02 + 0.227046165466308594E+02 + 0.227083091735839844E+02 + 0.227119998931884766E+02 + 0.227156906127929688E+02 + 0.227193832397460938E+02 + 0.227230739593505859E+02 + 0.227267665863037109E+02 + 0.227304573059082031E+02 + 0.227341480255126953E+02 + 0.227378406524658203E+02 + 0.226381435394287109E+02 + 0.223927173614501953E+02 + 0.221472930908203125E+02 + 0.219018669128417969E+02 + 0.216564426422119141E+02 + 0.214110164642333984E+02 + 0.211655921936035156E+02 + 0.209201660156250000E+02 + 0.206747417449951172E+02 + 0.204293155670166016E+02 + 0.201838912963867188E+02 + 0.199384651184082031E+02 + 0.197638034820556641E+02 + 0.196365547180175781E+02 + 0.195093040466308594E+02 + 0.193820552825927734E+02 + 0.192548065185546875E+02 + 0.191275577545166016E+02 + 0.190003070831298828E+02 + 0.188730583190917969E+02 + 0.187458095550537109E+02 + 0.186185588836669922E+02 + 0.184913101196289063E+02 + 0.183640613555908203E+02 + 0.182368125915527344E+02 + 0.181052703857421875E+02 + 0.179671897888183594E+02 + 0.178291110992431641E+02 + 0.176910324096679688E+02 + 0.175529518127441406E+02 + 0.174148731231689453E+02 + 0.172767944335937500E+02 + 0.171387138366699219E+02 + 0.170006351470947266E+02 + 0.168625564575195313E+02 + 0.167244758605957031E+02 + 0.165863971710205078E+02 + 0.164483184814453125E+02 + 0.163102378845214844E+02 + 0.161721591949462891E+02 + 0.159048433303833008E+02 + 0.156354751586914063E+02 + 0.153661069869995117E+02 + 0.150967388153076172E+02 + 0.148273706436157227E+02 + 0.145580024719238281E+02 + 0.142886343002319336E+02 + 0.140192661285400391E+02 + 0.137498989105224609E+02 + 0.134805297851562500E+02 + 0.132111625671386719E+02 + 0.129417934417724609E+02 + 0.126724262237548828E+02 + 0.124030580520629883E+02 + 0.121336870193481445E+02 + 0.118741712570190430E+02 + 0.116791801452636719E+02 + 0.114841890335083008E+02 + 0.112891988754272461E+02 + 0.110942077636718750E+02 + 0.108992166519165039E+02 + 0.107042264938354492E+02 + 0.105092353820800781E+02 + 0.103142442703247070E+02 + 0.101192541122436523E+02 + 0.992426300048828125E+01 + 0.972927188873291016E+01 + 0.953428173065185547E+01 + 0.933929061889648438E+01 + 0.914429950714111328E+01 + 0.894930934906005859E+01 + 0.875431823730468750E+01 + 0.855932712554931641E+01 + 0.831746864318847656E+01 + 0.805511379241943359E+01 + 0.779275941848754883E+01 + 0.753040504455566406E+01 + 0.726805019378662109E+01 + 0.700569534301757813E+01 + 0.674334096908569336E+01 + 0.648098659515380859E+01 + 0.621863174438476563E+01 + 0.595627689361572266E+01 + 0.569392204284667969E+01 + 0.543156766891479492E+01 + 0.516921281814575195E+01 + 0.490685844421386719E+01 + 0.464450359344482422E+01 + 0.438214921951293945E+01 + 0.411979436874389648E+01 + 0.385743951797485352E+01 + 0.359508514404296875E+01 +__pi01dn01 + 250 + 0.100127435302734375E+04 + 0.100096276855468750E+04 + 0.100064184570312500E+04 + 0.100031127929687500E+04 + 0.999970764160156250E+03 + 0.999620056152343750E+03 + 0.999258850097656250E+03 + 0.998886779785156250E+03 + 0.998503540039062500E+03 + 0.998108764648437500E+03 + 0.997702148437500000E+03 + 0.997283264160156250E+03 + 0.996851745605468750E+03 + 0.996407165527343750E+03 + 0.995949157714843750E+03 + 0.995477355957031250E+03 + 0.994991271972656250E+03 + 0.994490539550781250E+03 + 0.993974670410156250E+03 + 0.993443237304687500E+03 + 0.992895751953125000E+03 + 0.992331726074218750E+03 + 0.991750732421875000E+03 + 0.991152160644531250E+03 + 0.990535522460937500E+03 + 0.989900268554687500E+03 + 0.989245849609375000E+03 + 0.988571716308593750E+03 + 0.987877258300781250E+03 + 0.987161804199218750E+03 + 0.986424743652343750E+03 + 0.985665466308593750E+03 + 0.984883300781250000E+03 + 0.984077575683593750E+03 + 0.983247558593750000E+03 + 0.982392517089843750E+03 + 0.981511657714843750E+03 + 0.980604248046875000E+03 + 0.979669494628906250E+03 + 0.978706604003906250E+03 + 0.977714660644531250E+03 + 0.976692871093750000E+03 + 0.975640258789062500E+03 + 0.974555969238281250E+03 + 0.973439025878906250E+03 + 0.972288452148437500E+03 + 0.971103271484375000E+03 + 0.969882385253906250E+03 + 0.968624755859375000E+03 + 0.967329284667968750E+03 + 0.965994873046875000E+03 + 0.964620300292968750E+03 + 0.963204345703125000E+03 + 0.961745849609375000E+03 + 0.960243469238281250E+03 + 0.958695861816406250E+03 + 0.957101684570312500E+03 + 0.955459594726562500E+03 + 0.953768066406250000E+03 + 0.952025695800781250E+03 + 0.950230895996093750E+03 + 0.948382080078125000E+03 + 0.946477539062500000E+03 + 0.944515625000000000E+03 + 0.942494628906250000E+03 + 0.940412597656250000E+03 + 0.938267517089843750E+03 + 0.936057495117187500E+03 + 0.933780517578125000E+03 + 0.931434814453125000E+03 + 0.929018859863281250E+03 + 0.926530639648437500E+03 + 0.923968017578125000E+03 + 0.921329467773437500E+03 + 0.918613830566406250E+03 + 0.915819274902343750E+03 + 0.912943603515625000E+03 + 0.909984741210937500E+03 + 0.906940002441406250E+03 + 0.903807189941406250E+03 + 0.900637023925781250E+03 + 0.897475952148437500E+03 + 0.894318542480468750E+03 + 0.891164794921875000E+03 + 0.888014648437500000E+03 + 0.884867736816406250E+03 + 0.881723388671875000E+03 + 0.878581359863281250E+03 + 0.875441650390625000E+03 + 0.872304260253906250E+03 + 0.869169372558593750E+03 + 0.866037109375000000E+03 + 0.862907470703125000E+03 + 0.859780456542968750E+03 + 0.856656066894531250E+03 + 0.853533996582031250E+03 + 0.850413879394531250E+03 + 0.847295715332031250E+03 + 0.844179565429687500E+03 + 0.841065368652343750E+03 + 0.837953063964843750E+03 + 0.834842590332031250E+03 + 0.831733947753906250E+03 + 0.828627075195312500E+03 + 0.825522033691406250E+03 + 0.822418762207031250E+03 + 0.819317382812500000E+03 + 0.816218139648437500E+03 + 0.813121276855468750E+03 + 0.810026733398437500E+03 + 0.806934509277343750E+03 + 0.803844604492187500E+03 + 0.800757019042968750E+03 + 0.797671752929687500E+03 + 0.794588684082031250E+03 + 0.791507812500000000E+03 + 0.788429077148437500E+03 + 0.785352539062500000E+03 + 0.782278137207031250E+03 + 0.779205932617187500E+03 + 0.776135864257812500E+03 + 0.773067871093750000E+03 + 0.770001892089843750E+03 + 0.766937866210937500E+03 + 0.763875854492187500E+03 + 0.760815856933593750E+03 + 0.757757812500000000E+03 + 0.754701782226562500E+03 + 0.751647705078125000E+03 + 0.748595458984375000E+03 + 0.745544860839843750E+03 + 0.742495910644531250E+03 + 0.739448547363281250E+03 + 0.736402832031250000E+03 + 0.733358764648437500E+03 + 0.730316345214843750E+03 + 0.727275573730468750E+03 + 0.724236389160156250E+03 + 0.721198791503906250E+03 + 0.718162780761718750E+03 + 0.715128295898437500E+03 + 0.712095397949218750E+03 + 0.709064025878906250E+03 + 0.706034179687500000E+03 + 0.703005920410156250E+03 + 0.699979187011718750E+03 + 0.696953979492187500E+03 + 0.693930480957031250E+03 + 0.690909362792968750E+03 + 0.687891052246093750E+03 + 0.684875549316406250E+03 + 0.681862854003906250E+03 + 0.678852966308593750E+03 + 0.675845886230468750E+03 + 0.672841613769531250E+03 + 0.669840148925781250E+03 + 0.666841430664062500E+03 + 0.663845520019531250E+03 + 0.660853393554687500E+03 + 0.657867553710937500E+03 + 0.654889465332031250E+03 + 0.651919006347656250E+03 + 0.648956176757812500E+03 + 0.646000915527343750E+03 + 0.643053222656250000E+03 + 0.640113037109375000E+03 + 0.637180297851562500E+03 + 0.634255004882812500E+03 + 0.631337097167968750E+03 + 0.628426513671875000E+03 + 0.625525024414062500E+03 + 0.622635375976562500E+03 + 0.619758666992187500E+03 + 0.616894775390625000E+03 + 0.614043579101562500E+03 + 0.611204956054687500E+03 + 0.608378845214843750E+03 + 0.605565063476562500E+03 + 0.602763549804687500E+03 + 0.599974182128906250E+03 + 0.597196899414062500E+03 + 0.594431518554687500E+03 + 0.591677978515625000E+03 + 0.588936157226562500E+03 + 0.586205932617187500E+03 + 0.583487182617187500E+03 + 0.580779785156250000E+03 + 0.578083679199218750E+03 + 0.575398742675781250E+03 + 0.572724853515625000E+03 + 0.570061950683593750E+03 + 0.567409973144531250E+03 + 0.564768798828125000E+03 + 0.562138366699218750E+03 + 0.559518554687500000E+03 + 0.556909301757812500E+03 + 0.554310485839843750E+03 + 0.551722045898437500E+03 + 0.549144042968750000E+03 + 0.546576477050781250E+03 + 0.544019226074218750E+03 + 0.541472229003906250E+03 + 0.538935424804687500E+03 + 0.536408691406250000E+03 + 0.533891967773437500E+03 + 0.531385192871093750E+03 + 0.528888305664062500E+03 + 0.526401184082031250E+03 + 0.523923767089843750E+03 + 0.521455993652343750E+03 + 0.518997741699218750E+03 + 0.516549011230468750E+03 + 0.514109680175781250E+03 + 0.511679656982421875E+03 + 0.509258758544921875E+03 + 0.506846771240234375E+03 + 0.504443664550781250E+03 + 0.502049346923828125E+03 + 0.499663757324218750E+03 + 0.497286834716796875E+03 + 0.494918518066406250E+03 + 0.492558746337890625E+03 + 0.490207458496093750E+03 + 0.487864593505859375E+03 + 0.485530090332031250E+03 + 0.483203887939453125E+03 + 0.480885925292968750E+03 + 0.478576141357421875E+03 + 0.476274475097656250E+03 + 0.473980895996093750E+03 + 0.471695312500000000E+03 + 0.469418365478515625E+03 + 0.467150939941406250E+03 + 0.464893218994140625E+03 + 0.462645141601562500E+03 + 0.460406616210937500E+03 + 0.458177581787109375E+03 + 0.455957946777343750E+03 + 0.453747619628906250E+03 + 0.451546539306640625E+03 + 0.449354614257812500E+03 + 0.447171783447265625E+03 + 0.444997985839843750E+03 + 0.442833129882812500E+03 + 0.440677124023437500E+03 + 0.438529907226562500E+03 + 0.436391418457031250E+03 + 0.434261566162109375E+03 + 0.432140319824218750E+03 + 0.430027587890625000E+03 +__th01dn01 + 250 + 0.309907257080078125E+03 + 0.309907257080078125E+03 + 0.309903442382812500E+03 + 0.309899536132812500E+03 + 0.309895507812500000E+03 + 0.309891326904296875E+03 + 0.309887084960937500E+03 + 0.309882690429687500E+03 + 0.309878173828125000E+03 + 0.309873474121093750E+03 + 0.309837249755859375E+03 + 0.309780731201171875E+03 + 0.309722473144531250E+03 + 0.309662506103515625E+03 + 0.309600708007812500E+03 + 0.309537078857421875E+03 + 0.309471557617187500E+03 + 0.309404052734375000E+03 + 0.309354461669921875E+03 + 0.309303985595703125E+03 + 0.309251983642578125E+03 + 0.309198394775390625E+03 + 0.309143280029296875E+03 + 0.309086425781250000E+03 + 0.309029907226562500E+03 + 0.308981628417968750E+03 + 0.308931823730468750E+03 + 0.308880584716796875E+03 + 0.308827789306640625E+03 + 0.308773406982421875E+03 + 0.308717437744140625E+03 + 0.308675170898437500E+03 + 0.308631835937500000E+03 + 0.308587158203125000E+03 + 0.308541168212890625E+03 + 0.308493804931640625E+03 + 0.308448333740234375E+03 + 0.308409912109375000E+03 + 0.308370330810546875E+03 + 0.308329589843750000E+03 + 0.308287597656250000E+03 + 0.308244415283203125E+03 + 0.308213623046875000E+03 + 0.308182525634765625E+03 + 0.308150482177734375E+03 + 0.308117492675781250E+03 + 0.308083526611328125E+03 + 0.308057464599609375E+03 + 0.308031372070312500E+03 + 0.308004486083984375E+03 + 0.307976806640625000E+03 + 0.307949096679687500E+03 + 0.307925598144531250E+03 + 0.307901367187500000E+03 + 0.307876373291015625E+03 + 0.307850708007812500E+03 + 0.307826171875000000E+03 + 0.307802551269531250E+03 + 0.307778198242187500E+03 + 0.307753112792968750E+03 + 0.307726074218750000E+03 + 0.307690704345703125E+03 + 0.307654296875000000E+03 + 0.307616790771484375E+03 + 0.307578186035156250E+03 + 0.307500701904296875E+03 + 0.307415069580078125E+03 + 0.307326873779296875E+03 + 0.307235961914062500E+03 + 0.307229034423828125E+03 + 0.307256225585937500E+03 + 0.307284088134765625E+03 + 0.307312591552734375E+03 + 0.307505554199218750E+03 + 0.307784240722656250E+03 + 0.308070953369140625E+03 + 0.308366088867187500E+03 + 0.308708312988281250E+03 + 0.309075897216796875E+03 + 0.309454406738281250E+03 + 0.309837829589843750E+03 + 0.310200683593750000E+03 + 0.310559356689453125E+03 + 0.310917999267578125E+03 + 0.311276550292968750E+03 + 0.311552001953125000E+03 + 0.311782836914062500E+03 + 0.312013671875000000E+03 + 0.312244445800781250E+03 + 0.312476989746093750E+03 + 0.312740447998046875E+03 + 0.313003845214843750E+03 + 0.313267303466796875E+03 + 0.313530700683593750E+03 + 0.313794006347656250E+03 + 0.313992218017578125E+03 + 0.314190429687500000E+03 + 0.314388671875000000E+03 + 0.314586883544921875E+03 + 0.314785034179687500E+03 + 0.314976348876953125E+03 + 0.315158874511718750E+03 + 0.315341430664062500E+03 + 0.315523956298828125E+03 + 0.315706481933593750E+03 + 0.315888977050781250E+03 + 0.316089813232421875E+03 + 0.316328582763671875E+03 + 0.316567352294921875E+03 + 0.316806091308593750E+03 + 0.317044860839843750E+03 + 0.317283569335937500E+03 + 0.317522308349609375E+03 + 0.317752563476562500E+03 + 0.317977111816406250E+03 + 0.318201660156250000E+03 + 0.318426208496093750E+03 + 0.318650726318359375E+03 + 0.318875274658203125E+03 + 0.319099761962890625E+03 + 0.319321105957031250E+03 + 0.319529602050781250E+03 + 0.319738098144531250E+03 + 0.319946594238281250E+03 + 0.320155059814453125E+03 + 0.320363525390625000E+03 + 0.320571990966796875E+03 + 0.320780426025390625E+03 + 0.320986938476562500E+03 + 0.321159851074218750E+03 + 0.321332794189453125E+03 + 0.321505676269531250E+03 + 0.321678619384765625E+03 + 0.321851531982421875E+03 + 0.322024505615234375E+03 + 0.322197418212890625E+03 + 0.322370330810546875E+03 + 0.322542480468750000E+03 + 0.322707763671875000E+03 + 0.322873046875000000E+03 + 0.323038360595703125E+03 + 0.323203643798828125E+03 + 0.323368896484375000E+03 + 0.323534179687500000E+03 + 0.323699493408203125E+03 + 0.323864776611328125E+03 + 0.324030029296875000E+03 + 0.324229919433593750E+03 + 0.324533386230468750E+03 + 0.324836853027343750E+03 + 0.325140289306640625E+03 + 0.325443725585937500E+03 + 0.325747222900390625E+03 + 0.326050659179687500E+03 + 0.326354095458984375E+03 + 0.326657531738281250E+03 + 0.326960998535156250E+03 + 0.327264465332031250E+03 + 0.327794219970703125E+03 + 0.328642883300781250E+03 + 0.329491577148437500E+03 + 0.330340240478515625E+03 + 0.331188934326171875E+03 + 0.332037597656250000E+03 + 0.332886291503906250E+03 + 0.333734985351562500E+03 + 0.334583648681640625E+03 + 0.335432312011718750E+03 + 0.336281005859375000E+03 + 0.337129699707031250E+03 + 0.338382720947265625E+03 + 0.339906707763671875E+03 + 0.341430664062500000E+03 + 0.342954620361328125E+03 + 0.344478576660156250E+03 + 0.346002563476562500E+03 + 0.347526519775390625E+03 + 0.349050476074218750E+03 + 0.350574432373046875E+03 + 0.352098419189453125E+03 + 0.353622375488281250E+03 + 0.355146331787109375E+03 + 0.356670288085937500E+03 + 0.358189758300781250E+03 + 0.359702392578125000E+03 + 0.361215026855468750E+03 + 0.362727661132812500E+03 + 0.364240295410156250E+03 + 0.365752899169921875E+03 + 0.367265533447265625E+03 + 0.368778167724609375E+03 + 0.370290802001953125E+03 + 0.371803436279296875E+03 + 0.373316070556640625E+03 + 0.374828704833984375E+03 + 0.376341308593750000E+03 + 0.377853942871093750E+03 + 0.379366577148437500E+03 + 0.380909759521484375E+03 + 0.382453399658203125E+03 + 0.383997070312500000E+03 + 0.385540771484375000E+03 + 0.387084411621093750E+03 + 0.388628082275390625E+03 + 0.390171752929687500E+03 + 0.391715393066406250E+03 + 0.393259063720703125E+03 + 0.394802734375000000E+03 + 0.396346374511718750E+03 + 0.397890045166015625E+03 + 0.399433715820312500E+03 + 0.400977355957031250E+03 + 0.402521057128906250E+03 + 0.404058654785156250E+03 + 0.405556640625000000E+03 + 0.407054626464843750E+03 + 0.408552612304687500E+03 + 0.410050598144531250E+03 + 0.411548583984375000E+03 + 0.413046569824218750E+03 + 0.414544555664062500E+03 + 0.416042572021484375E+03 + 0.417540557861328125E+03 + 0.419038543701171875E+03 + 0.420536529541015625E+03 + 0.422034515380859375E+03 + 0.423532501220703125E+03 + 0.425030487060546875E+03 + 0.426528472900390625E+03 + 0.428026458740234375E+03 + 0.429524444580078125E+03 + 0.431275360107421875E+03 + 0.433136871337890625E+03 + 0.434998413085937500E+03 + 0.436859954833984375E+03 + 0.438721466064453125E+03 + 0.440583007812500000E+03 + 0.442444519042968750E+03 + 0.444306030273437500E+03 + 0.446167541503906250E+03 + 0.448029083251953125E+03 + 0.449890594482421875E+03 + 0.451752105712890625E+03 + 0.453613647460937500E+03 + 0.455475158691406250E+03 + 0.457336669921875000E+03 + 0.459198211669921875E+03 + 0.461059722900390625E+03 + 0.462921234130859375E+03 + 0.464782745361328125E+03 +__dn01dn01 + 250 + 0.111670076847076416E+01 + 0.111583304405212402E+01 + 0.111495316028594971E+01 + 0.111404716968536377E+01 + 0.111311447620391846E+01 + 0.111215424537658691E+01 + 0.111116600036621094E+01 + 0.111014842987060547E+01 + 0.110910069942474365E+01 + 0.110802233219146729E+01 + 0.110702455043792725E+01 + 0.110606551170349121E+01 + 0.110507798194885254E+01 + 0.110406100749969482E+01 + 0.110301351547241211E+01 + 0.110193514823913574E+01 + 0.110082459449768066E+01 + 0.109968078136444092E+01 + 0.109843230247497559E+01 + 0.109714496135711670E+01 + 0.109581911563873291E+01 + 0.109445440769195557E+01 + 0.109304881095886230E+01 + 0.109160244464874268E+01 + 0.109010577201843262E+01 + 0.108853006362915039E+01 + 0.108690869808197021E+01 + 0.108523905277252197E+01 + 0.108352053165435791E+01 + 0.108175158500671387E+01 + 0.107993090152740479E+01 + 0.107800281047821045E+01 + 0.107601821422576904E+01 + 0.107397580146789551E+01 + 0.107187390327453613E+01 + 0.106971108913421631E+01 + 0.106747353076934814E+01 + 0.106514251232147217E+01 + 0.106274425983428955E+01 + 0.106027674674987793E+01 + 0.105773806571960449E+01 + 0.105512654781341553E+01 + 0.105239295959472656E+01 + 0.104957938194274902E+01 + 0.104668557643890381E+01 + 0.104370951652526855E+01 + 0.104064846038818359E+01 + 0.103747093677520752E+01 + 0.103420090675354004E+01 + 0.103083884716033936E+01 + 0.102738225460052490E+01 + 0.102382588386535645E+01 + 0.102015328407287598E+01 + 0.101637852191925049E+01 + 0.101249897480010986E+01 + 0.100851118564605713E+01 + 0.100440704822540283E+01 + 0.100018405914306641E+01 + 0.995845079421997070E+00 + 0.991387069225311279E+00 + 0.986811041831970215E+00 + 0.982134342193603516E+00 + 0.977330088615417480E+00 + 0.972395360469818115E+00 + 0.967327058315277100E+00 + 0.962239861488342285E+00 + 0.957032382488250732E+00 + 0.951683580875396729E+00 + 0.946190655231475830E+00 + 0.940284967422485352E+00 + 0.934121131896972656E+00 + 0.927799105644226074E+00 + 0.921316146850585938E+00 + 0.914183199405670166E+00 + 0.906644761562347412E+00 + 0.898932337760925293E+00 + 0.891043782234191895E+00 + 0.882866740226745605E+00 + 0.874464094638824463E+00 + 0.865876972675323486E+00 + 0.857247173786163330E+00 + 0.848756194114685059E+00 + 0.840344369411468506E+00 + 0.831999599933624268E+00 + 0.823721885681152344E+00 + 0.815726816654205322E+00 + 0.807905972003936768E+00 + 0.800140321254730225E+00 + 0.792429745197296143E+00 + 0.784769535064697266E+00 + 0.777087628841400146E+00 + 0.769462049007415771E+00 + 0.761892855167388916E+00 + 0.754379570484161377E+00 + 0.746922433376312256E+00 + 0.739673197269439697E+00 + 0.732474088668823242E+00 + 0.725325345993041992E+00 + 0.718226611614227295E+00 + 0.711177647113800049E+00 + 0.704193413257598877E+00 + 0.697277009487152100E+00 + 0.690408766269683838E+00 + 0.683588266372680664E+00 + 0.676815092563629150E+00 + 0.670089662075042725E+00 + 0.663372635841369629E+00 + 0.656625390052795410E+00 + 0.649928510189056396E+00 + 0.643281519412994385E+00 + 0.636684298515319824E+00 + 0.630136549472808838E+00 + 0.623638093471527100E+00 + 0.617204904556274414E+00 + 0.610830605030059814E+00 + 0.604504227638244629E+00 + 0.598224937915802002E+00 + 0.591992735862731934E+00 + 0.585807383060455322E+00 + 0.579668641090393066E+00 + 0.573581755161285400E+00 + 0.567563652992248535E+00 + 0.561590433120727539E+00 + 0.555661857128143311E+00 + 0.549777865409851074E+00 + 0.543938159942626953E+00 + 0.538142383098602295E+00 + 0.532390475273132324E+00 + 0.526685476303100586E+00 + 0.521077871322631836E+00 + 0.515511572360992432E+00 + 0.509986519813537598E+00 + 0.504501998424530029E+00 + 0.499058365821838379E+00 + 0.493655264377593994E+00 + 0.488292634487152100E+00 + 0.482970029115676880E+00 + 0.477688550949096680E+00 + 0.472456902265548706E+00 + 0.467264503240585327E+00 + 0.462111085653305054E+00 + 0.456996619701385498E+00 + 0.451920777559280396E+00 + 0.446883529424667358E+00 + 0.441884607076644897E+00 + 0.436923891305923462E+00 + 0.432001203298568726E+00 + 0.427071005105972290E+00 + 0.422046124935150146E+00 + 0.417064964771270752E+00 + 0.412127494812011719E+00 + 0.407233268022537231E+00 + 0.402381867170333862E+00 + 0.397573441267013550E+00 + 0.392807364463806152E+00 + 0.388083606958389282E+00 + 0.383401602506637573E+00 + 0.378761231899261475E+00 + 0.373905450105667114E+00 + 0.368744522333145142E+00 + 0.363649308681488037E+00 + 0.358618944883346558E+00 + 0.353652417659759521E+00 + 0.348749011754989624E+00 + 0.343907982110977173E+00 + 0.339128553867340088E+00 + 0.334409743547439575E+00 + 0.329751104116439819E+00 + 0.325151473283767700E+00 + 0.320610284805297852E+00 + 0.315751373767852783E+00 + 0.310720592737197876E+00 + 0.305775552988052368E+00 + 0.300914704799652100E+00 + 0.296136260032653809E+00 + 0.291438698768615723E+00 + 0.286820471286773682E+00 + 0.282280057668685913E+00 + 0.277815908193588257E+00 + 0.273426502943038940E+00 + 0.269110709428787231E+00 + 0.264866828918457031E+00 + 0.260693699121475220E+00 + 0.256593018770217896E+00 + 0.252564996480941772E+00 + 0.248603314161300659E+00 + 0.244706809520721436E+00 + 0.240874215960502625E+00 + 0.237104281783103943E+00 + 0.233396038413047791E+00 + 0.229748144745826721E+00 + 0.226159617304801941E+00 + 0.222629338502883911E+00 + 0.219156369566917419E+00 + 0.215739503502845764E+00 + 0.212377756834030151E+00 + 0.209070175886154175E+00 + 0.205815732479095459E+00 + 0.202597439289093018E+00 + 0.199431061744689941E+00 + 0.196315750479698181E+00 + 0.193250760436058044E+00 + 0.190235123038291931E+00 + 0.187267929315567017E+00 + 0.184348374605178833E+00 + 0.181475609540939331E+00 + 0.178648769855499268E+00 + 0.175867006182670593E+00 + 0.173129573464393616E+00 + 0.170435711741447449E+00 + 0.167784586548805237E+00 + 0.165175482630729675E+00 + 0.162607654929161072E+00 + 0.160082861781120300E+00 + 0.157613083720207214E+00 + 0.155181482434272766E+00 + 0.152787685394287109E+00 + 0.150430813431739807E+00 + 0.148110300302505493E+00 + 0.145825594663619995E+00 + 0.143576085567474365E+00 + 0.141361102461814880E+00 + 0.139180153608322144E+00 + 0.137032672762870789E+00 + 0.134918078780174255E+00 + 0.132835820317268372E+00 + 0.130785390734672546E+00 + 0.128766208887100220E+00 + 0.126777827739715576E+00 + 0.124819725751876831E+00 + 0.122891381382942200E+00 + 0.120921768248081207E+00 + 0.118954420089721680E+00 + 0.117020443081855774E+00 + 0.115119203925132751E+00 + 0.113250114023685455E+00 + 0.111412584781646729E+00 + 0.109605960547924042E+00 + 0.107829689979553223E+00 + 0.106083236634731293E+00 + 0.104365974664688110E+00 + 0.102677382528781891E+00 + 0.101016990840435028E+00 + 0.993841886520385742E-01 + 0.977785140275955200E-01 + 0.961994454264640808E-01 + 0.946464836597442627E-01 + 0.931192040443420410E-01 + 0.916170924901962280E-01 + 0.901397019624710083E-01 +__rt01dn01 + 250 + 0.157400742173194885E-01 + 0.157400742173194885E-01 + 0.157197769731283188E-01 + 0.156988706439733505E-01 + 0.156773384660482407E-01 + 0.156551580876111984E-01 + 0.156323146075010300E-01 + 0.156087838113307953E-01 + 0.155845480039715767E-01 + 0.155595848336815834E-01 + 0.155360717326402664E-01 + 0.155131984502077103E-01 + 0.154896397143602371E-01 + 0.154653731733560562E-01 + 0.154403792694211006E-01 + 0.154146356508135796E-01 + 0.153881199657917023E-01 + 0.153608079999685287E-01 + 0.153312394395470619E-01 + 0.153007395565509796E-01 + 0.152693241834640503E-01 + 0.152369672432541847E-01 + 0.152036398649215698E-01 + 0.151693113148212433E-01 + 0.151335047557950020E-01 + 0.150943771004676819E-01 + 0.150540759786963463E-01 + 0.150125650689005852E-01 + 0.149698099121451378E-01 + 0.149257713928818703E-01 + 0.148804122582077980E-01 + 0.148314256221055984E-01 + 0.147809488698840141E-01 + 0.147289568558335304E-01 + 0.146754058077931404E-01 + 0.146202482283115387E-01 + 0.145624317228794098E-01 + 0.145003683865070343E-01 + 0.144364433363080025E-01 + 0.143706006929278374E-01 + 0.143027827143669128E-01 + 0.142329297959804535E-01 + 0.141618810594081879E-01 + 0.140887415036559105E-01 + 0.140134068205952644E-01 + 0.139358118176460266E-01 + 0.138558903709053993E-01 + 0.137731982395052910E-01 + 0.136879952624440193E-01 + 0.136002376675605774E-01 + 0.135098462924361229E-01 + 0.134156541898846626E-01 + 0.133118750527501106E-01 + 0.132049825042486191E-01 + 0.130948834121227264E-01 + 0.129814818501472473E-01 + 0.128611130639910698E-01 + 0.127342399209737778E-01 + 0.126035604625940323E-01 + 0.124689601361751556E-01 + 0.123188504949212074E-01 + 0.120928045362234116E-01 + 0.118599776178598404E-01 + 0.116201657801866531E-01 + 0.113731585443019867E-01 + 0.108122359961271286E-01 + 0.101871732622385025E-01 + 0.954335834830999374E-02 + 0.888023152947425842E-02 + 0.814564153552055359E-02 + 0.736850779503583908E-02 + 0.656806118786334991E-02 + 0.574360042810440063E-02 + 0.511736655607819557E-02 + 0.458150403574109077E-02 + 0.402956502512097359E-02 + 0.346106919459998608E-02 + 0.315951509401202202E-02 + 0.295987166464328766E-02 + 0.275420234538614750E-02 + 0.254582636989653111E-02 + 0.240100966766476631E-02 + 0.226934440433979034E-02 + 0.213767914101481438E-02 + 0.200601387768983841E-02 + 0.188496639020740986E-02 + 0.176962336990982294E-02 + 0.165428023319691420E-02 + 0.153893709648400545E-02 + 0.142714334651827812E-02 + 0.137570430524647236E-02 + 0.132426526397466660E-02 + 0.127282633911818266E-02 + 0.122138729784637690E-02 + 0.116997293662279844E-02 + 0.114299450069665909E-02 + 0.111601618118584156E-02 + 0.108903786167502403E-02 + 0.106205942574888468E-02 + 0.103508110623806715E-02 + 0.100341590587049723E-02 + 0.965809798799455166E-03 + 0.928203691728413105E-03 + 0.890597584657371044E-03 + 0.852991419378668070E-03 + 0.815385312307626009E-03 + 0.778890273068100214E-03 + 0.744703225791454315E-03 + 0.710516120307147503E-03 + 0.676329073030501604E-03 + 0.642141967546194792E-03 + 0.607954920269548893E-03 + 0.573767814785242081E-03 + 0.543858448509126902E-03 + 0.516833271831274033E-03 + 0.489808095153421164E-03 + 0.462782976683229208E-03 + 0.435757800005376339E-03 + 0.408732681535184383E-03 + 0.381707504857331514E-03 + 0.355890952050685883E-03 + 0.335007964167743921E-03 + 0.314125005388632417E-03 + 0.293242046609520912E-03 + 0.272359058726578951E-03 + 0.251476070843636990E-03 + 0.230593112064525485E-03 + 0.209710153285413980E-03 + 0.189310128916986287E-03 + 0.177026522578671575E-03 + 0.164742901688441634E-03 + 0.152459295350126922E-03 + 0.140175674459896982E-03 + 0.127892068121582270E-03 + 0.115608447231352329E-03 + 0.103324840893037617E-03 + 0.910412200028076768E-04 + 0.793839499237947166E-04 + 0.732929765945300460E-04 + 0.672020032652653754E-04 + 0.611110299360007048E-04 + 0.550200566067360342E-04 + 0.489290869154501706E-04 + 0.428381135861855000E-04 + 0.367471402569208294E-04 + 0.306561669276561588E-04 + 0.245651935983914882E-04 + 0.197688186744926497E-04 + 0.188459234777837992E-04 + 0.179230301000643522E-04 + 0.170001349033555016E-04 + 0.160772415256360546E-04 + 0.151543463289272040E-04 + 0.142314529512077570E-04 + 0.133085586639936082E-04 + 0.123856643767794594E-04 + 0.114627700895653106E-04 + 0.105398758023511618E-04 + 0.968389485933585092E-05 + 0.892223033588379622E-05 + 0.816056490293703973E-05 + 0.739890037948498502E-05 + 0.663723540128557943E-05 + 0.587557042308617383E-05 + 0.511390544488676824E-05 + 0.435224092143471353E-05 + 0.359057594323530793E-05 + 0.282891096503590234E-05 + 0.206724598683649674E-05 + 0.130558146338444203E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 +__kppzm + 48 + -0.170577192306518555E+01 + -0.515288019180297852E+01 + -0.867263221740722656E+01 + -0.122681560516357422E+02 + -0.159427862167358398E+02 + -0.197000827789306641E+02 + -0.235438518524169922E+02 + -0.274781646728515625E+02 + -0.315073947906494141E+02 + -0.356362304687500000E+02 + -0.398697319030761719E+02 + -0.442133331298828125E+02 + -0.486729240417480469E+02 + -0.532548675537109375E+02 + -0.579660606384277344E+02 + -0.628140220642089844E+02 + -0.678069229125976563E+02 + -0.729536972045898438E+02 + -0.782641372680664063E+02 + -0.837490005493164063E+02 + -0.894201202392578125E+02 + -0.952906188964843750E+02 + -0.101375022888183594E+03 + -0.107689506530761719E+03 + -0.114252166748046875E+03 + -0.121083328247070312E+03 + -0.128205902099609375E+03 + -0.135645858764648437E+03 + -0.143432846069335937E+03 + -0.151600814819335937E+03 + -0.160188995361328125E+03 + -0.169243026733398437E+03 + -0.178816345214843750E+03 + -0.188972213745117187E+03 + -0.199786239624023437E+03 + -0.211349731445312500E+03 + -0.223774444580078125E+03 + -0.237199188232421875E+03 + -0.251799423217773437E+03 + -0.267801239013671875E+03 + -0.285503112792968750E+03 + -0.305310638427734375E+03 + -0.327794952392578125E+03 + -0.353797454833984375E+03 + -0.384634338378906250E+03 + -0.422540863037109375E+03 + -0.471808868408203125E+03 + -0.500000000000000000E+03 +__gnu + 8 + 0.400000000000000000E+01 + 0.200000000000000000E+01 + 0.200000000000000000E+01 + 0.200000000000000000E+01 + 0.200000000000000000E+01 + 0.200000000000000000E+01 + 0.200000000000000000E+01 + 0.400000000000000000E+01 +__iaero_chem + 11 + 1 + 1 + 1 + 1 + 2 + 2 + 2 + 1 + 1 + 1 + 1 +__cfmas + 16 + 0.524000000000000000E+03 + 0.524000000000000000E+03 + 0.110800003051757812E+03 + 0.273899990133941174E-02 + 0.495999991893768311E+00 + 0.157000000000000000E+03 + 0.471000000000000000E+03 + 0.885399997234344482E+00 + 0.377000006847083569E-02 + 0.123000005260109901E-02 + 0.100100003182888031E+00 + 0.885399997234344482E+00 + 0.377000006847083569E-02 + 0.123000005260109901E-02 + 0.100100003182888031E+00 + 0.524000000000000000E+03 +__pwmas + 16 + 0.300000000000000000E+01 + 0.300000000000000000E+01 + 0.291000008583068848E+01 + 0.174000000953674316E+01 + 0.240000009536743164E+01 + 0.300000000000000000E+01 + 0.300000000000000000E+01 + 0.250000000000000000E+01 + 0.200000000000000000E+01 + 0.179999995231628418E+01 + 0.225600004196166992E+01 + 0.250000000000000000E+01 + 0.200000000000000000E+01 + 0.179999995231628418E+01 + 0.225600004196166992E+01 + 0.300000000000000000E+01 +__slcpd + 12 + 0.146500000000000000E+07 + 0.140700000000000000E+07 + 0.134400000000000000E+07 + 0.127300000000000000E+07 + 0.121400000000000000E+07 + 0.117700000000000000E+07 + 0.131900000000000000E+07 + 0.122700000000000000E+07 + 0.117700000000000000E+07 + 0.115100000000000000E+07 + 0.108800000000000000E+07 + 0.874000000000000000E+06 +__slmsts + 12 + 0.395000010728836060E+00 + 0.409999996423721313E+00 + 0.435000002384185791E+00 + 0.485000014305114746E+00 + 0.451000005006790161E+00 + 0.419999986886978149E+00 + 0.476999998092651367E+00 + 0.476000010967254639E+00 + 0.425999999046325684E+00 + 0.492000013589859009E+00 + 0.481999993324279785E+00 + 0.862999975681304932E+00 +__slz + 11 + -0.500000000000000000E+00 + -0.400000005960464478E+00 + -0.300000011920928955E+00 + -0.250000000000000000E+00 + -0.200000002980232239E+00 + -0.159999996423721313E+00 + -0.119999997317790985E+00 + -0.900000035762786865E-01 + -0.599999986588954926E-01 + -0.299999993294477463E-01 + -0.999999977648258209E-02 diff --git a/bin.rams/test.supercell/a-A-1991-04-26-212000-head.txt b/bin.rams/test.supercell/a-A-1991-04-26-212000-head.txt new file mode 100644 index 0000000..1fa15e8 --- /dev/null +++ b/bin.rams/test.supercell/a-A-1991-04-26-212000-head.txt @@ -0,0 +1,3638 @@ + 257 +UP 0 3 1 218750 +VP 0 3 1 218750 +WP 0 3 1 218750 +PP 0 3 1 218750 +UC 0 3 1 218750 +VC 0 3 1 218750 +WC 0 3 1 218750 +PC 0 3 1 218750 +THP 0 3 1 218750 +RTP 0 3 1 218750 +THETA 0 3 1 218750 +RV 0 3 1 218750 +DN0 0 3 1 218750 +WP_BUOY_THETA 0 3 1 218750 +WP_BUOY_COND 0 3 1 218750 +WP_ADVDIF 0 3 1 218750 +SOIL_WATER 0 4 1 19250 +SOIL_ENERGY 0 4 1 19250 +SOIL_TEXT 0 4 1 19250 +SFCWATER_MASS 0 5 1 1750 +SFCWATER_ENERGY 0 5 1 1750 +SFCWATER_DEPTH 0 5 1 1750 +USTAR 0 6 1 1750 +TSTAR 0 6 1 1750 +RSTAR 0 6 1 1750 +VEG_FRACAREA 0 6 1 1750 +VEG_LAI 0 6 1 1750 +VEG_ROUGH 0 6 1 1750 +VEG_HEIGHT 0 6 1 1750 +VEG_ALBEDO 0 6 1 1750 +VEG_TAI 0 6 1 1750 +PATCH_AREA 0 6 1 1750 +PATCH_ROUGH 0 6 1 1750 +LEAF_CLASS 0 6 1 1750 +SOIL_ROUGH 0 6 1 1750 +SFCWATER_NLEV 0 6 1 1750 +STOM_RESIST 0 6 1 1750 +GROUND_RSAT 0 6 1 1750 +GROUND_RVAP 0 6 1 1750 +VEG_WATER 0 6 1 1750 +VEG_TEMP 0 6 1 1750 +CAN_RVAP 0 6 1 1750 +CAN_TEMP 0 6 1 1750 +VEG_NDVIP 0 6 1 1750 +VEG_NDVIC 0 6 1 1750 +VEG_NDVIF 0 6 1 1750 +KPP_OLD 0 2 1 875 +KPP_NEW 0 2 1 875 +KPP_JERLOV 0 2 1 875 +KPP_OCDEPTH 0 2 1 875 +KPP_HMIX 0 2 1 875 +KPP_BOTTOMT 0 2 1 875 +KPP_SREF 0 2 1 875 +KPP_FREEZ_FLAG 0 2 1 875 +KPP_RESET_FLAG 0 2 1 875 +KPP_FLX_UST 0 2 1 875 +KPP_FLX_VST 0 2 1 875 +KPP_FLX_NSW 0 2 1 875 +KPP_FLX_NLW 0 2 1 875 +KPP_FLX_ICE 0 2 1 875 +KPP_FLX_PCP 0 2 1 875 +KPP_SWDK_OPT 0 10 1 42000 +KPP_SWFRAC 0 10 1 42000 +KPP_SAL_CLIM 0 10 1 42000 +KPP_OCNT_CLIM 0 10 1 42000 +KPP_BUOY 0 10 1 42000 +KPP_U 0 10 1 42000 +KPP_V 0 10 1 42000 +KPP_U_init 0 10 1 42000 +KPP_V_init 0 10 1 42000 +KPP_US0 0 10 1 42000 +KPP_US1 0 10 1 42000 +KPP_VS0 0 10 1 42000 +KPP_VS1 0 10 1 42000 +KPP_X_T 0 10 1 42000 +KPP_X_S 0 10 1 42000 +KPP_XS_T0 0 10 1 42000 +KPP_XS_T1 0 10 1 42000 +KPP_XS_S0 0 10 1 42000 +KPP_XS_S1 0 10 1 42000 +RCP 0 3 1 218750 +RDP 0 3 1 218750 +RRP 0 3 1 218750 +RPP 0 3 1 218750 +RSP 0 3 1 218750 +RAP 0 3 1 218750 +RGP 0 3 1 218750 +RHP 0 3 1 218750 +CCP 0 3 1 218750 +CDP 0 3 1 218750 +CRP 0 3 1 218750 +CPP 0 3 1 218750 +CSP 0 3 1 218750 +CAP 0 3 1 218750 +CGP 0 3 1 218750 +CHP 0 3 1 218750 +Q2 0 3 1 218750 +Q6 0 3 1 218750 +Q7 0 3 1 218750 +CCCNP 0 3 1 218750 +GCCNP 0 3 1 218750 +CCCMP 0 3 1 218750 +GCCMP 0 3 1 218750 +MD1NP 0 3 1 218750 +MD2NP 0 3 1 218750 +MD1MP 0 3 1 218750 +MD2MP 0 3 1 218750 +SALT_FILM_NP 0 3 1 218750 +SALT_JET_NP 0 3 1 218750 +SALT_SPUM_NP 0 3 1 218750 +SALT_FILM_MP 0 3 1 218750 +SALT_JET_MP 0 3 1 218750 +SALT_SPUM_MP 0 3 1 218750 +REGEN_AERO1_NP 0 3 1 218750 +REGEN_AERO1_MP 0 3 1 218750 +REGEN_AERO2_NP 0 3 1 218750 +REGEN_AERO2_MP 0 3 1 218750 +IMMERCP 0 3 1 218750 +IMMERDP 0 3 1 218750 +IMMERRP 0 3 1 218750 +IFNNUCP 0 3 1 218750 +CNMCP 0 3 1 218750 +CNMDP 0 3 1 218750 +CNMRP 0 3 1 218750 +CNMPP 0 3 1 218750 +CNMSP 0 3 1 218750 +CNMAP 0 3 1 218750 +CNMGP 0 3 1 218750 +CNMHP 0 3 1 218750 +DNMCP 0 3 1 218750 +DNMDP 0 3 1 218750 +DNMRP 0 3 1 218750 +DNMPP 0 3 1 218750 +DNMSP 0 3 1 218750 +DNMAP 0 3 1 218750 +DNMGP 0 3 1 218750 +DNMHP 0 3 1 218750 +DINCP 0 3 1 218750 +DINDP 0 3 1 218750 +DINRP 0 3 1 218750 +DINPP 0 3 1 218750 +DINSP 0 3 1 218750 +DINAP 0 3 1 218750 +DINGP 0 3 1 218750 +DINHP 0 3 1 218750 +SNMCP 0 3 1 218750 +SNMDP 0 3 1 218750 +SNMRP 0 3 1 218750 +SNMPP 0 3 1 218750 +SNMSP 0 3 1 218750 +SNMAP 0 3 1 218750 +SNMGP 0 3 1 218750 +SNMHP 0 3 1 218750 +RESOL_AERO1_MP 0 3 1 218750 +RESOL_AERO2_MP 0 3 1 218750 +PCPVR 0 3 1 218750 +PCPVP 0 3 1 218750 +PCPVS 0 3 1 218750 +PCPVA 0 3 1 218750 +PCPVG 0 3 1 218750 +PCPVH 0 3 1 218750 +PCPVD 0 3 1 218750 +LATHEATVAP 0 3 1 218750 +LATHEATFRZ 0 3 1 218750 +NUCCLDRT 0 3 1 218750 +CLD2RAINT 0 3 1 218750 +ICE2RAINT 0 3 1 218750 +NUCICERT 0 3 1 218750 +VAPLIQT 0 3 1 218750 +VAPICET 0 3 1 218750 +MELTICET 0 3 1 218750 +RIMECLDT 0 3 1 218750 +RAIN2ICET 0 3 1 218750 +AGGREGATET 0 3 1 218750 +LATHEATVAPT 0 3 1 218750 +LATHEATFRZT 0 3 1 218750 +INUCHOMRT 0 3 1 218750 +INUCCONTRT 0 3 1 218750 +INUCIFNRT 0 3 1 218750 +INUCHAZRT 0 3 1 218750 +VAPCLDT 0 3 1 218750 +VAPRAINT 0 3 1 218750 +VAPPRIST 0 3 1 218750 +VAPSNOWT 0 3 1 218750 +VAPAGGRT 0 3 1 218750 +VAPGRAUT 0 3 1 218750 +VAPHAILT 0 3 1 218750 +VAPDRIZT 0 3 1 218750 +MELTPRIST 0 3 1 218750 +MELTSNOWT 0 3 1 218750 +MELTAGGRT 0 3 1 218750 +MELTGRAUT 0 3 1 218750 +MELTHAILT 0 3 1 218750 +RIMECLDSNOWT 0 3 1 218750 +RIMECLDAGGRT 0 3 1 218750 +RIMECLDGRAUT 0 3 1 218750 +RIMECLDHAILT 0 3 1 218750 +RAIN2PRT 0 3 1 218750 +RAIN2SNT 0 3 1 218750 +RAIN2AGT 0 3 1 218750 +RAIN2GRT 0 3 1 218750 +RAIN2HAT 0 3 1 218750 +AGGRSELFPRIST 0 3 1 218750 +AGGRSELFSNOWT 0 3 1 218750 +AGGRPRISSNOWT 0 3 1 218750 +DUST1CLDRT 0 3 1 218750 +DUST2CLDRT 0 3 1 218750 +DUST1DRZRT 0 3 1 218750 +DUST2DRZRT 0 3 1 218750 +ACCPR 0 2 1 875 +ACCPP 0 2 1 875 +ACCPS 0 2 1 875 +ACCPA 0 2 1 875 +ACCPG 0 2 1 875 +ACCPH 0 2 1 875 +ACCPD 0 2 1 875 +PCPRR 0 2 1 875 +PCPRP 0 2 1 875 +PCPRS 0 2 1 875 +PCPRA 0 2 1 875 +PCPRG 0 2 1 875 +PCPRH 0 2 1 875 +PCPRD 0 2 1 875 +PCPG 0 2 1 875 +QPCPG 0 2 1 875 +DPCPG 0 2 1 875 +ACCPAERO 0 2 1 875 +PCPRAERO 0 2 1 875 +ACCPDUST 0 2 1 875 +PCPRDUST 0 2 1 875 +FTHRD 0 3 1 218750 +BEXT 0 3 1 218750 +SWUP 0 3 1 218750 +SWDN 0 3 1 218750 +LWUP 0 3 1 218750 +LWDN 0 3 1 218750 +RSHORT 0 2 1 875 +RLONG 0 2 1 875 +RLONGUP 0 2 1 875 +ALBEDT 0 2 1 875 +COSZ 0 2 1 875 +AODT 0 2 1 875 +RHKM 0 3 1 218750 +RVKM 0 3 1 218750 +RVKH 0 3 1 218750 +SFLUX_U 0 2 1 875 +SFLUX_V 0 2 1 875 +SFLUX_W 0 2 1 875 +SFLUX_T 0 2 1 875 +SFLUX_R 0 2 1 875 +TOPT 0 2 1 875 +GLAT 0 2 1 875 +GLON 0 2 1 875 +TOPZO 0 2 1 875 +PI 1 3 1 218750 +HKH 1 3 1 218750 +VKH 1 3 1 218750 +__expnme + 1 +RAMS Simulations +__initial + 1 + 1 +__initorig + 1 + 1 +__jdim + 1 + 1 +__iyear1 + 1 + 1991 +__imonth1 + 1 + 4 +__idate1 + 1 + 26 +__itime1 + 1 + 2100 +__time + 1 + 0.120000000000000000E+04 +__nsndg + 1 + 35 +__us + 35 + -0.271000003814697266E+01 + -0.271000003814697266E+01 + -0.353999996185302734E+01 + -0.339000010490417480E+01 + -0.277999997138977051E+01 + -0.174000000953674316E+01 + -0.360000014305114746E+00 + 0.125000000000000000E+01 + 0.294000005722045898E+01 + 0.457999992370605469E+01 + 0.607000017166137695E+01 + 0.730000019073486328E+01 + 0.852999973297119141E+01 + 0.967000007629394531E+01 + 0.108999996185302734E+02 + 0.120900001525878906E+02 + 0.128400001525878906E+02 + 0.151300001144409180E+02 + 0.167000007629394531E+02 + 0.173600006103515625E+02 + 0.174400005340576172E+02 + 0.170400009155273438E+02 + 0.168299999237060547E+02 + 0.170599994659423828E+02 + 0.183799991607666016E+02 + 0.203899993896484375E+02 + 0.233099994659423828E+02 + 0.281800003051757813E+02 + 0.248199996948242188E+02 + 0.211499996185302734E+02 + 0.175100002288818359E+02 + 0.965999984741210938E+01 + 0.200999999046325684E+01 + 0.500000000000000000E+00 + -0.103999996185302734E+01 +__vs + 35 + 0.838000011444091797E+01 + 0.838000011444091797E+01 + 0.106599998474121094E+02 + 0.122500000000000000E+02 + 0.134600000381469727E+02 + 0.142600002288818359E+02 + 0.146400003433227539E+02 + 0.146599998474121094E+02 + 0.144099998474121094E+02 + 0.140299997329711914E+02 + 0.137200002670288086E+02 + 0.136199998855590820E+02 + 0.138299999237060547E+02 + 0.142600002288818359E+02 + 0.154700002670288086E+02 + 0.160300006866455078E+02 + 0.188700008392333984E+02 + 0.190900001525878906E+02 + 0.186000003814697266E+02 + 0.189099998474121094E+02 + 0.199799995422363281E+02 + 0.211800003051757813E+02 + 0.216200008392333984E+02 + 0.218400001525878906E+02 + 0.223400001525878906E+02 + 0.227000007629394531E+02 + 0.227399997711181641E+02 + 0.198400001525878906E+02 + 0.181599998474121094E+02 + 0.161700000762939453E+02 + 0.118999996185302734E+02 + 0.850000000000000000E+01 + 0.347000002861022949E+01 + 0.350000000000000000E+01 + 0.352999997138977051E+01 +__ts + 35 + 0.306079376220703125E+03 + 0.305112518310546875E+03 + 0.303622192382812500E+03 + 0.302135650634765625E+03 + 0.300582458496093750E+03 + 0.298970092773437500E+03 + 0.297265472412109375E+03 + 0.295463653564453125E+03 + 0.293529083251953125E+03 + 0.291434265136718750E+03 + 0.289150360107421875E+03 + 0.286665008544921875E+03 + 0.284018432617187500E+03 + 0.281624572753906250E+03 + 0.279662200927734375E+03 + 0.277406005859375000E+03 + 0.274758117675781250E+03 + 0.271294006347656250E+03 + 0.267552581787109375E+03 + 0.263083618164062500E+03 + 0.258075958251953125E+03 + 0.252843017578125000E+03 + 0.246956115722656250E+03 + 0.240328781127929687E+03 + 0.232743484497070312E+03 + 0.224288635253906250E+03 + 0.215936080932617187E+03 + 0.210840881347656250E+03 + 0.210143768310546875E+03 + 0.208462387084960937E+03 + 0.205940200805664062E+03 + 0.201693786621093750E+03 + 0.198953125000000000E+03 + 0.194737899780273437E+03 + 0.189301940917968750E+03 +__thds + 35 + 0.306959991455078125E+03 + 0.306960021972656250E+03 + 0.306529998779296875E+03 + 0.306209960937500000E+03 + 0.305939971923828125E+03 + 0.305740020751953125E+03 + 0.305589965820312500E+03 + 0.305500000000000000E+03 + 0.305450012207031250E+03 + 0.305429992675781250E+03 + 0.305429992675781250E+03 + 0.305459991455078125E+03 + 0.305589965820312500E+03 + 0.306299987792968750E+03 + 0.307829986572265625E+03 + 0.309429992675781250E+03 + 0.311029968261718750E+03 + 0.312190032958984375E+03 + 0.313570007324218750E+03 + 0.314700012207031250E+03 + 0.315859985351562500E+03 + 0.317509979248046875E+03 + 0.319209991455078125E+03 + 0.320940002441406250E+03 + 0.322510009765625000E+03 + 0.324149963378906250E+03 + 0.327439971923828125E+03 + 0.337469970703125000E+03 + 0.357589996337890625E+03 + 0.379390014648437500E+03 + 0.403859985351562500E+03 + 0.429979980468750000E+03 + 0.465670013427734375E+03 + 0.503269989013671875E+03 + 0.541519958496093750E+03 +__ps + 35 + 0.990000000000000000E+05 + 0.979103046875000000E+05 + 0.967206328125000000E+05 + 0.954221953125000000E+05 + 0.940067812500000000E+05 + 0.924657890625000000E+05 + 0.907903359375000000E+05 + 0.889713671875000000E+05 + 0.869998593750000000E+05 + 0.848665859375000000E+05 + 0.825626484375000000E+05 + 0.800791093750000000E+05 + 0.774072031250000000E+05 + 0.745411562500000000E+05 + 0.714829531250000000E+05 + 0.682369765625000000E+05 + 0.648056328125000000E+05 + 0.611899843750000000E+05 + 0.573959570312500000E+05 + 0.534349296875000000E+05 + 0.493217070312500000E+05 + 0.450816445312500000E+05 + 0.407470156250000000E+05 + 0.363542890625000000E+05 + 0.319460332031250000E+05 + 0.275735761718750000E+05 + 0.233073164062500000E+05 + 0.192918867187500000E+05 + 0.155726064453125000E+05 + 0.123097558593750000E+05 + 0.947972363281250000E+04 + 0.707827929687500000E+04 + 0.510501708984375000E+04 + 0.360986938476562500E+04 + 0.253038891601562500E+04 +__hs + 35 + 0.000000000000000000E+00 + 0.100002868652343750E+03 + 0.210000503540039062E+03 + 0.330998321533203125E+03 + 0.464095123291015625E+03 + 0.610502075195312500E+03 + 0.771550354003906250E+03 + 0.948713012695312500E+03 + 0.114357568359375000E+04 + 0.135793383789062500E+04 + 0.159372290039062500E+04 + 0.185310449218750000E+04 + 0.213841821289062500E+04 + 0.245225878906250000E+04 + 0.279748461914062500E+04 + 0.317723657226562500E+04 + 0.359496240234375000E+04 + 0.405446093750000000E+04 + 0.455991406250000000E+04 + 0.511591503906250000E+04 + 0.572751757812500000E+04 + 0.640028662109375000E+04 + 0.714033789062500000E+04 + 0.795439843750000000E+04 + 0.884990039062500000E+04 + 0.983496484375000000E+04 + 0.109185126953125000E+05 + 0.121001347656250000E+05 + 0.134203779296875000E+05 + 0.148615781250000000E+05 + 0.164467695312500000E+05 + 0.181904414062500000E+05 + 0.201076933593750000E+05 + 0.221054843750000000E+05 + 0.241034882812500000E+05 +__ihtran + 1 + 0 +__ngrids + 1 + 1 +__nzg + 1 + 11 +__nzs + 1 + 1 +__npatch + 1 + 2 +__nvegpat + 1 + 1 +__nkppz + 1 + 48 +__ztop + 1 + 0.200100156250000000E+05 +__polelat + 1 + 0.370000000000000000E+02 +__polelon + 1 + -0.975000000000000000E+02 +__nnxp + 1 + 25 +__nnyp + 1 + 35 +__nnzp + 1 + 250 +__nstratx + 1 + 1 +__nstraty + 1 + 1 +__nxtnest + 1 + 0 +__ninest + 1 + 1 +__njnest + 1 + 1 +__nknest + 1 + 1 +__deltaxn + 1 + 0.200000000000000000E+04 +__deltazn + 1 + 0.100000000000000000E+02 +__nestz + 1 + 0 +__nstratz + 250 + 1 + 1 + 3 + 3 + 3 + 3 + 2 + 2 + 2 + 2 + 1 + 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 + 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 + 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 + 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 + 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 + 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 + 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 + 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 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 +__ngbegun + 1 + 1 +__iref + 1 + 0 +__jref + 1 + 0 +__topref + 1 + 0.000000000000000000E+00 +__xmn01 + 25 + -0.230000000000000000E+05 + -0.210000000000000000E+05 + -0.190000000000000000E+05 + -0.170000000000000000E+05 + -0.150000000000000000E+05 + -0.130000000000000000E+05 + -0.110000000000000000E+05 + -0.900000000000000000E+04 + -0.700000000000000000E+04 + -0.500000000000000000E+04 + -0.300000000000000000E+04 + -0.100000000000000000E+04 + 0.100000000000000000E+04 + 0.300000000000000000E+04 + 0.500000000000000000E+04 + 0.700000000000000000E+04 + 0.900000000000000000E+04 + 0.110000000000000000E+05 + 0.130000000000000000E+05 + 0.150000000000000000E+05 + 0.170000000000000000E+05 + 0.190000000000000000E+05 + 0.210000000000000000E+05 + 0.230000000000000000E+05 + 0.250000000000000000E+05 +__xtn01 + 25 + -0.240000000000000000E+05 + -0.220000000000000000E+05 + -0.200000000000000000E+05 + -0.180000000000000000E+05 + -0.160000000000000000E+05 + -0.140000000000000000E+05 + -0.120000000000000000E+05 + -0.100000000000000000E+05 + -0.800000000000000000E+04 + -0.600000000000000000E+04 + -0.400000000000000000E+04 + -0.200000000000000000E+04 + 0.000000000000000000E+00 + 0.200000000000000000E+04 + 0.400000000000000000E+04 + 0.600000000000000000E+04 + 0.800000000000000000E+04 + 0.100000000000000000E+05 + 0.120000000000000000E+05 + 0.140000000000000000E+05 + 0.160000000000000000E+05 + 0.180000000000000000E+05 + 0.200000000000000000E+05 + 0.220000000000000000E+05 + 0.240000000000000000E+05 +__ymn01 + 35 + -0.330000000000000000E+05 + -0.310000000000000000E+05 + -0.290000000000000000E+05 + -0.270000000000000000E+05 + -0.250000000000000000E+05 + -0.230000000000000000E+05 + -0.210000000000000000E+05 + -0.190000000000000000E+05 + -0.170000000000000000E+05 + -0.150000000000000000E+05 + -0.130000000000000000E+05 + -0.110000000000000000E+05 + -0.900000000000000000E+04 + -0.700000000000000000E+04 + -0.500000000000000000E+04 + -0.300000000000000000E+04 + -0.100000000000000000E+04 + 0.100000000000000000E+04 + 0.300000000000000000E+04 + 0.500000000000000000E+04 + 0.700000000000000000E+04 + 0.900000000000000000E+04 + 0.110000000000000000E+05 + 0.130000000000000000E+05 + 0.150000000000000000E+05 + 0.170000000000000000E+05 + 0.190000000000000000E+05 + 0.210000000000000000E+05 + 0.230000000000000000E+05 + 0.250000000000000000E+05 + 0.270000000000000000E+05 + 0.290000000000000000E+05 + 0.310000000000000000E+05 + 0.330000000000000000E+05 + 0.350000000000000000E+05 +__ytn01 + 35 + -0.340000000000000000E+05 + -0.320000000000000000E+05 + -0.300000000000000000E+05 + -0.280000000000000000E+05 + -0.260000000000000000E+05 + -0.240000000000000000E+05 + -0.220000000000000000E+05 + -0.200000000000000000E+05 + -0.180000000000000000E+05 + -0.160000000000000000E+05 + -0.140000000000000000E+05 + -0.120000000000000000E+05 + -0.100000000000000000E+05 + -0.800000000000000000E+04 + -0.600000000000000000E+04 + -0.400000000000000000E+04 + -0.200000000000000000E+04 + 0.000000000000000000E+00 + 0.200000000000000000E+04 + 0.400000000000000000E+04 + 0.600000000000000000E+04 + 0.800000000000000000E+04 + 0.100000000000000000E+05 + 0.120000000000000000E+05 + 0.140000000000000000E+05 + 0.160000000000000000E+05 + 0.180000000000000000E+05 + 0.200000000000000000E+05 + 0.220000000000000000E+05 + 0.240000000000000000E+05 + 0.260000000000000000E+05 + 0.280000000000000000E+05 + 0.300000000000000000E+05 + 0.320000000000000000E+05 + 0.340000000000000000E+05 +__zmn01 + 250 + 0.000000000000000000E+00 + 0.100000000000000000E+02 + 0.202999992370605469E+02 + 0.309089984893798828E+02 + 0.418362655639648438E+02 + 0.530913505554199219E+02 + 0.646840896606445313E+02 + 0.766246109008789063E+02 + 0.889233474731445313E+02 + 0.101591049194335937E+03 + 0.114638778686523437E+03 + 0.128077941894531250E+03 + 0.141920272827148437E+03 + 0.156177871704101562E+03 + 0.170863204956054687E+03 + 0.185989105224609375E+03 + 0.201568786621093750E+03 + 0.217615859985351562E+03 + 0.234144348144531250E+03 + 0.251168685913085937E+03 + 0.268703765869140625E+03 + 0.286764892578125000E+03 + 0.305367858886718750E+03 + 0.324528900146484375E+03 + 0.344264770507812500E+03 + 0.364592712402343750E+03 + 0.385530487060546875E+03 + 0.407096405029296875E+03 + 0.429309295654296875E+03 + 0.452188568115234375E+03 + 0.475754211425781250E+03 + 0.500026824951171875E+03 + 0.525027587890625000E+03 + 0.550778381347656250E+03 + 0.577301696777343750E+03 + 0.604620727539062500E+03 + 0.632759338378906250E+03 + 0.661742126464843750E+03 + 0.691594421386718750E+03 + 0.722342285156250000E+03 + 0.754012573242187500E+03 + 0.786632995605468750E+03 + 0.820232055664062500E+03 + 0.854839111328125000E+03 + 0.890484375000000000E+03 + 0.927198974609375000E+03 + 0.965015014648437500E+03 + 0.100396551513671875E+04 + 0.104408447265625000E+04 + 0.108540698242187500E+04 + 0.112796911621093750E+04 + 0.117180810546875000E+04 + 0.121696228027343750E+04 + 0.126347106933593750E+04 + 0.131137512207031250E+04 + 0.136071630859375000E+04 + 0.141153771972656250E+04 + 0.146388378906250000E+04 + 0.151780029296875000E+04 + 0.157333422851562500E+04 + 0.163053417968750000E+04 + 0.168945007324218750E+04 + 0.175013342285156250E+04 + 0.181263732910156250E+04 + 0.187701635742187500E+04 + 0.194332678222656250E+04 + 0.201162646484375000E+04 + 0.208197509765625000E+04 + 0.215443408203125000E+04 + 0.222906689453125000E+04 + 0.230593872070312500E+04 + 0.238511669921875000E+04 + 0.246666992187500000E+04 + 0.255066967773437500E+04 + 0.263718945312500000E+04 + 0.272630493164062500E+04 + 0.281809375000000000E+04 + 0.291263623046875000E+04 + 0.301001489257812500E+04 + 0.311001489257812500E+04 + 0.321001489257812500E+04 + 0.331001489257812500E+04 + 0.341001489257812500E+04 + 0.351001489257812500E+04 + 0.361001489257812500E+04 + 0.371001489257812500E+04 + 0.381001489257812500E+04 + 0.391001489257812500E+04 + 0.401001489257812500E+04 + 0.411001464843750000E+04 + 0.421001464843750000E+04 + 0.431001464843750000E+04 + 0.441001464843750000E+04 + 0.451001464843750000E+04 + 0.461001464843750000E+04 + 0.471001464843750000E+04 + 0.481001464843750000E+04 + 0.491001464843750000E+04 + 0.501001464843750000E+04 + 0.511001464843750000E+04 + 0.521001464843750000E+04 + 0.531001464843750000E+04 + 0.541001464843750000E+04 + 0.551001464843750000E+04 + 0.561001464843750000E+04 + 0.571001464843750000E+04 + 0.581001464843750000E+04 + 0.591001464843750000E+04 + 0.601001464843750000E+04 + 0.611001464843750000E+04 + 0.621001464843750000E+04 + 0.631001464843750000E+04 + 0.641001464843750000E+04 + 0.651001464843750000E+04 + 0.661001464843750000E+04 + 0.671001464843750000E+04 + 0.681001464843750000E+04 + 0.691001464843750000E+04 + 0.701001464843750000E+04 + 0.711001464843750000E+04 + 0.721001464843750000E+04 + 0.731001464843750000E+04 + 0.741001464843750000E+04 + 0.751001464843750000E+04 + 0.761001464843750000E+04 + 0.771001464843750000E+04 + 0.781001464843750000E+04 + 0.791001464843750000E+04 + 0.801001464843750000E+04 + 0.811001464843750000E+04 + 0.821001464843750000E+04 + 0.831001464843750000E+04 + 0.841001464843750000E+04 + 0.851001464843750000E+04 + 0.861001464843750000E+04 + 0.871001464843750000E+04 + 0.881001464843750000E+04 + 0.891001464843750000E+04 + 0.901001464843750000E+04 + 0.911001464843750000E+04 + 0.921001464843750000E+04 + 0.931001464843750000E+04 + 0.941001464843750000E+04 + 0.951001464843750000E+04 + 0.961001464843750000E+04 + 0.971001464843750000E+04 + 0.981001464843750000E+04 + 0.991001464843750000E+04 + 0.100100146484375000E+05 + 0.101100146484375000E+05 + 0.102100146484375000E+05 + 0.103100146484375000E+05 + 0.104100146484375000E+05 + 0.105100146484375000E+05 + 0.106100146484375000E+05 + 0.107100146484375000E+05 + 0.108100146484375000E+05 + 0.109100146484375000E+05 + 0.110100146484375000E+05 + 0.111100146484375000E+05 + 0.112100146484375000E+05 + 0.113100146484375000E+05 + 0.114100146484375000E+05 + 0.115100146484375000E+05 + 0.116100146484375000E+05 + 0.117100146484375000E+05 + 0.118100146484375000E+05 + 0.119100146484375000E+05 + 0.120100146484375000E+05 + 0.121100146484375000E+05 + 0.122100146484375000E+05 + 0.123100146484375000E+05 + 0.124100146484375000E+05 + 0.125100146484375000E+05 + 0.126100146484375000E+05 + 0.127100146484375000E+05 + 0.128100146484375000E+05 + 0.129100146484375000E+05 + 0.130100146484375000E+05 + 0.131100146484375000E+05 + 0.132100146484375000E+05 + 0.133100146484375000E+05 + 0.134100146484375000E+05 + 0.135100146484375000E+05 + 0.136100146484375000E+05 + 0.137100146484375000E+05 + 0.138100146484375000E+05 + 0.139100146484375000E+05 + 0.140100146484375000E+05 + 0.141100146484375000E+05 + 0.142100146484375000E+05 + 0.143100146484375000E+05 + 0.144100146484375000E+05 + 0.145100146484375000E+05 + 0.146100146484375000E+05 + 0.147100146484375000E+05 + 0.148100146484375000E+05 + 0.149100146484375000E+05 + 0.150100146484375000E+05 + 0.151100146484375000E+05 + 0.152100146484375000E+05 + 0.153100146484375000E+05 + 0.154100146484375000E+05 + 0.155100146484375000E+05 + 0.156100146484375000E+05 + 0.157100146484375000E+05 + 0.158100146484375000E+05 + 0.159100146484375000E+05 + 0.160100146484375000E+05 + 0.161100146484375000E+05 + 0.162100146484375000E+05 + 0.163100146484375000E+05 + 0.164100156250000000E+05 + 0.165100156250000000E+05 + 0.166100156250000000E+05 + 0.167100156250000000E+05 + 0.168100156250000000E+05 + 0.169100156250000000E+05 + 0.170100156250000000E+05 + 0.171100156250000000E+05 + 0.172100156250000000E+05 + 0.173100156250000000E+05 + 0.174100156250000000E+05 + 0.175100156250000000E+05 + 0.176100156250000000E+05 + 0.177100156250000000E+05 + 0.178100156250000000E+05 + 0.179100156250000000E+05 + 0.180100156250000000E+05 + 0.181100156250000000E+05 + 0.182100156250000000E+05 + 0.183100156250000000E+05 + 0.184100156250000000E+05 + 0.185100156250000000E+05 + 0.186100156250000000E+05 + 0.187100156250000000E+05 + 0.188100156250000000E+05 + 0.189100156250000000E+05 + 0.190100156250000000E+05 + 0.191100156250000000E+05 + 0.192100156250000000E+05 + 0.193100156250000000E+05 + 0.194100156250000000E+05 + 0.195100156250000000E+05 + 0.196100156250000000E+05 + 0.197100156250000000E+05 + 0.198100156250000000E+05 + 0.199100156250000000E+05 + 0.200100156250000000E+05 + 0.201100156250000000E+05 +__ztn01 + 250 + -0.489024114608764648E+01 + 0.496305179595947266E+01 + 0.151119432449340820E+02 + 0.255652999877929688E+02 + 0.363322563171386719E+02 + 0.474222221374511719E+02 + 0.588448867797851563E+02 + 0.706102294921875000E+02 + 0.827285385131835938E+02 + 0.952103958129882813E+02 + 0.108066703796386719E+03 + 0.121308708190917969E+03 + 0.134947967529296875E+03 + 0.148996398925781250E+03 + 0.163466278076171875E+03 + 0.178370269775390625E+03 + 0.193721374511718750E+03 + 0.209533035278320312E+03 + 0.225819030761718750E+03 + 0.242593612670898437E+03 + 0.259871429443359375E+03 + 0.277667602539062500E+03 + 0.295997650146484375E+03 + 0.314877593994140625E+03 + 0.334323913574218750E+03 + 0.354353637695312500E+03 + 0.374984252929687500E+03 + 0.396233764648437500E+03 + 0.418120788574218750E+03 + 0.440664398193359375E+03 + 0.463884307861328125E+03 + 0.487800842285156250E+03 + 0.512434814453125000E+03 + 0.537807861328125000E+03 + 0.563942016601562500E+03 + 0.590860290527343750E+03 + 0.618586059570312500E+03 + 0.647143615722656250E+03 + 0.676557983398437500E+03 + 0.706854736328125000E+03 + 0.738060424804687500E+03 + 0.770202270507812500E+03 + 0.803308410644531250E+03 + 0.837407714843750000E+03 + 0.872530029296875000E+03 + 0.908706054687500000E+03 + 0.945967285156250000E+03 + 0.984346374511718750E+03 + 0.102387677001953125E+04 + 0.106459301757812500E+04 + 0.110653076171875000E+04 + 0.114972668457031250E+04 + 0.119421838378906250E+04 + 0.124004479980468750E+04 + 0.128724609375000000E+04 + 0.133586340332031250E+04 + 0.138593920898437500E+04 + 0.143751733398437500E+04 + 0.149064282226562500E+04 + 0.154536206054687500E+04 + 0.160172290039062500E+04 + 0.165977441406250000E+04 + 0.171956750488281250E+04 + 0.178115441894531250E+04 + 0.184458898925781250E+04 + 0.190992651367187500E+04 + 0.197722424316406250E+04 + 0.204654089355468750E+04 + 0.211793676757812500E+04 + 0.219147460937500000E+04 + 0.226721875000000000E+04 + 0.234523510742187500E+04 + 0.242559204101562500E+04 + 0.250835937500000000E+04 + 0.259360986328125000E+04 + 0.268141796875000000E+04 + 0.277186010742187500E+04 + 0.286501562500000000E+04 + 0.296098388671875000E+04 + 0.305984887695312500E+04 + 0.316001489257812500E+04 + 0.326001489257812500E+04 + 0.336001489257812500E+04 + 0.346001489257812500E+04 + 0.356001489257812500E+04 + 0.366001489257812500E+04 + 0.376001489257812500E+04 + 0.386001489257812500E+04 + 0.396001489257812500E+04 + 0.406001464843750000E+04 + 0.416001464843750000E+04 + 0.426001464843750000E+04 + 0.436001464843750000E+04 + 0.446001464843750000E+04 + 0.456001464843750000E+04 + 0.466001464843750000E+04 + 0.476001464843750000E+04 + 0.486001464843750000E+04 + 0.496001464843750000E+04 + 0.506001464843750000E+04 + 0.516001464843750000E+04 + 0.526001464843750000E+04 + 0.536001464843750000E+04 + 0.546001464843750000E+04 + 0.556001464843750000E+04 + 0.566001464843750000E+04 + 0.576001464843750000E+04 + 0.586001464843750000E+04 + 0.596001464843750000E+04 + 0.606001464843750000E+04 + 0.616001464843750000E+04 + 0.626001464843750000E+04 + 0.636001464843750000E+04 + 0.646001464843750000E+04 + 0.656001464843750000E+04 + 0.666001464843750000E+04 + 0.676001464843750000E+04 + 0.686001464843750000E+04 + 0.696001464843750000E+04 + 0.706001464843750000E+04 + 0.716001464843750000E+04 + 0.726001464843750000E+04 + 0.736001464843750000E+04 + 0.746001464843750000E+04 + 0.756001464843750000E+04 + 0.766001464843750000E+04 + 0.776001464843750000E+04 + 0.786001464843750000E+04 + 0.796001464843750000E+04 + 0.806001464843750000E+04 + 0.816001464843750000E+04 + 0.826001464843750000E+04 + 0.836001464843750000E+04 + 0.846001464843750000E+04 + 0.856001464843750000E+04 + 0.866001464843750000E+04 + 0.876001464843750000E+04 + 0.886001464843750000E+04 + 0.896001464843750000E+04 + 0.906001464843750000E+04 + 0.916001464843750000E+04 + 0.926001464843750000E+04 + 0.936001464843750000E+04 + 0.946001464843750000E+04 + 0.956001464843750000E+04 + 0.966001464843750000E+04 + 0.976001464843750000E+04 + 0.986001464843750000E+04 + 0.996001464843750000E+04 + 0.100600146484375000E+05 + 0.101600146484375000E+05 + 0.102600146484375000E+05 + 0.103600146484375000E+05 + 0.104600146484375000E+05 + 0.105600146484375000E+05 + 0.106600146484375000E+05 + 0.107600146484375000E+05 + 0.108600146484375000E+05 + 0.109600146484375000E+05 + 0.110600146484375000E+05 + 0.111600146484375000E+05 + 0.112600146484375000E+05 + 0.113600146484375000E+05 + 0.114600146484375000E+05 + 0.115600146484375000E+05 + 0.116600146484375000E+05 + 0.117600146484375000E+05 + 0.118600146484375000E+05 + 0.119600146484375000E+05 + 0.120600146484375000E+05 + 0.121600146484375000E+05 + 0.122600146484375000E+05 + 0.123600146484375000E+05 + 0.124600146484375000E+05 + 0.125600146484375000E+05 + 0.126600146484375000E+05 + 0.127600146484375000E+05 + 0.128600146484375000E+05 + 0.129600146484375000E+05 + 0.130600146484375000E+05 + 0.131600146484375000E+05 + 0.132600146484375000E+05 + 0.133600146484375000E+05 + 0.134600146484375000E+05 + 0.135600146484375000E+05 + 0.136600146484375000E+05 + 0.137600146484375000E+05 + 0.138600146484375000E+05 + 0.139600146484375000E+05 + 0.140600146484375000E+05 + 0.141600146484375000E+05 + 0.142600146484375000E+05 + 0.143600146484375000E+05 + 0.144600146484375000E+05 + 0.145600146484375000E+05 + 0.146600146484375000E+05 + 0.147600146484375000E+05 + 0.148600146484375000E+05 + 0.149600146484375000E+05 + 0.150600146484375000E+05 + 0.151600146484375000E+05 + 0.152600146484375000E+05 + 0.153600146484375000E+05 + 0.154600146484375000E+05 + 0.155600146484375000E+05 + 0.156600146484375000E+05 + 0.157600146484375000E+05 + 0.158600146484375000E+05 + 0.159600146484375000E+05 + 0.160600146484375000E+05 + 0.161600146484375000E+05 + 0.162600146484375000E+05 + 0.163600156250000000E+05 + 0.164600156250000000E+05 + 0.165600156250000000E+05 + 0.166600156250000000E+05 + 0.167600156250000000E+05 + 0.168600156250000000E+05 + 0.169600156250000000E+05 + 0.170600156250000000E+05 + 0.171600156250000000E+05 + 0.172600156250000000E+05 + 0.173600156250000000E+05 + 0.174600156250000000E+05 + 0.175600156250000000E+05 + 0.176600156250000000E+05 + 0.177600156250000000E+05 + 0.178600156250000000E+05 + 0.179600156250000000E+05 + 0.180600156250000000E+05 + 0.181600156250000000E+05 + 0.182600156250000000E+05 + 0.183600156250000000E+05 + 0.184600156250000000E+05 + 0.185600156250000000E+05 + 0.186600156250000000E+05 + 0.187600156250000000E+05 + 0.188600156250000000E+05 + 0.189600156250000000E+05 + 0.190600156250000000E+05 + 0.191600156250000000E+05 + 0.192600156250000000E+05 + 0.193600156250000000E+05 + 0.194600156250000000E+05 + 0.195600156250000000E+05 + 0.196600156250000000E+05 + 0.197600156250000000E+05 + 0.198600156250000000E+05 + 0.199600156250000000E+05 + 0.200600156250000000E+05 +__dzmn01 + 250 + 0.101488918066024780E+00 + 0.985329300165176392E-01 + 0.956630483269691467E-01 + 0.928767547011375427E-01 + 0.901716053485870361E-01 + 0.875452458858489990E-01 + 0.849953964352607727E-01 + 0.825197622179985046E-01 + 0.801162794232368469E-01 + 0.777828320860862732E-01 + 0.755172669887542725E-01 + 0.733177661895751953E-01 + 0.711823254823684692E-01 + 0.691090747714042664E-01 + 0.670961216092109680E-01 + 0.651418939232826233E-01 + 0.632444620132446289E-01 + 0.614024475216865540E-01 + 0.596140027046203613E-01 + 0.578776821494102478E-01 + 0.561918579041957855E-01 + 0.545552335679531097E-01 + 0.529662594199180603E-01 + 0.514236129820346832E-01 + 0.499258004128932953E-01 + 0.484716519713401794E-01 + 0.470599047839641571E-01 + 0.456891730427742004E-01 + 0.443584695458412170E-01 + 0.430664904415607452E-01 + 0.418120771646499634E-01 + 0.405943468213081360E-01 + 0.394118987023830414E-01 + 0.382641032338142395E-01 + 0.371494852006435394E-01 + 0.360675305128097534E-01 + 0.350170023739337921E-01 + 0.339969918131828308E-01 + 0.330068357288837433E-01 + 0.320454388856887817E-01 + 0.311120897531509399E-01 + 0.302058774977922440E-01 + 0.293261110782623291E-01 + 0.284719280898571014E-01 + 0.276426170021295547E-01 + 0.268375463783740997E-01 + 0.260558556765317917E-01 + 0.252969898283481598E-01 + 0.245602205395698547E-01 + 0.238448679447174072E-01 + 0.231503322720527649E-01 + 0.224761031568050385E-01 + 0.218214746564626694E-01 + 0.211858600378036499E-01 + 0.205688066780567169E-01 + 0.199697241187095642E-01 + 0.193880647420883179E-01 + 0.188233572989702225E-01 + 0.182751081883907318E-01 + 0.177428163588047028E-01 + 0.172260794788599014E-01 + 0.167243406176567078E-01 + 0.162372160702943802E-01 + 0.157642755657434464E-01 + 0.153051409870386124E-01 + 0.148593420162796974E-01 + 0.144265480339527130E-01 + 0.140064116567373276E-01 + 0.135984411463141441E-01 + 0.132023412734270096E-01 + 0.128178251907229424E-01 + 0.124444765970110893E-01 + 0.120820617303252220E-01 + 0.117301382124423981E-01 + 0.113884704187512398E-01 + 0.110567929223179817E-01 + 0.107347369194030762E-01 + 0.104201119393110275E-01 + 0.101148039102554321E-01 + 0.998342595994472504E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.100000239908695221E-01 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999990198761224747E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 +__dztn01 + 250 + 0.103000000119209290E+00 + 0.100000001490116119E+00 + 0.970873832702636719E-01 + 0.942595973610877991E-01 + 0.915141925215721130E-01 + 0.888487324118614197E-01 + 0.862608924508094788E-01 + 0.837484374642372131E-01 + 0.813091620802879333E-01 + 0.789409205317497253E-01 + 0.766416862607002258E-01 + 0.744093954563140869E-01 + 0.722421705722808838E-01 + 0.701380372047424316E-01 + 0.680951550602912903E-01 + 0.661117658019065857E-01 + 0.641861632466316223E-01 + 0.623166598379611969E-01 + 0.605016015470027924E-01 + 0.587394349277019501E-01 + 0.570285394787788391E-01 + 0.553675331175327301E-01 + 0.537548698484897614E-01 + 0.521892309188842773E-01 + 0.506691597402095795E-01 + 0.491933710873126984E-01 + 0.477605685591697693E-01 + 0.463694632053375244E-01 + 0.450189039111137390E-01 + 0.437076836824417114E-01 + 0.424346588551998138E-01 + 0.411986932158470154E-01 + 0.399987809360027313E-01 + 0.388337559998035431E-01 + 0.377026759088039398E-01 + 0.366045199334621429E-01 + 0.355383567512035370E-01 + 0.345032364130020142E-01 + 0.334982611238956451E-01 + 0.325225852429866791E-01 + 0.315753370523452759E-01 + 0.306556429713964462E-01 + 0.297627374529838562E-01 + 0.288958419114351273E-01 + 0.280542187392711639E-01 + 0.272371210157871246E-01 + 0.264438055455684662E-01 + 0.256736110895872116E-01 + 0.249258726835250854E-01 + 0.241998862475156784E-01 + 0.234950631856918335E-01 + 0.228107441216707230E-01 + 0.221463460475206375E-01 + 0.215013120323419571E-01 + 0.208750609308481216E-01 + 0.202670432627201080E-01 + 0.196767468005418777E-01 + 0.191036313772201538E-01 + 0.185471959412097931E-01 + 0.180070083588361740E-01 + 0.174825321882963181E-01 + 0.169733483344316483E-01 + 0.164789855480194092E-01 + 0.159990005195140839E-01 + 0.155330086126923561E-01 + 0.150805851444602013E-01 + 0.146413566544651985E-01 + 0.142149170860648155E-01 + 0.138009106740355492E-01 + 0.133989322930574417E-01 + 0.130086671561002731E-01 + 0.126297743991017342E-01 + 0.122619308531284332E-01 + 0.119047965854406357E-01 + 0.115580512210726738E-01 + 0.112213948741555214E-01 + 0.108945732936263084E-01 + 0.105772558599710464E-01 + 0.102691901847720146E-01 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.100000239908695221E-01 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999990198761224747E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 +__u01dn01 + 250 + -0.271000003814697266E+01 + -0.271000003814697266E+01 + -0.271000003814697266E+01 + -0.271000003814697266E+01 + -0.271000003814697266E+01 + -0.271000003814697266E+01 + -0.271000003814697266E+01 + -0.271000003814697266E+01 + -0.271000003814697266E+01 + -0.271000003814697266E+01 + -0.277084660530090332E+01 + -0.287076568603515625E+01 + -0.297368240356445313E+01 + -0.307968640327453613E+01 + -0.318887066841125488E+01 + -0.330133032798767090E+01 + -0.341716384887695313E+01 + -0.353647255897521973E+01 + -0.352038979530334473E+01 + -0.349959468841552734E+01 + -0.347817540168762207E+01 + -0.345611381530761719E+01 + -0.343339014053344727E+01 + -0.340998482704162598E+01 + -0.337475848197937012E+01 + -0.328295969963073730E+01 + -0.318840670585632324E+01 + -0.309101748466491699E+01 + -0.299070644378662109E+01 + -0.288738608360290527E+01 + -0.278096628189086914E+01 + -0.261160659790039063E+01 + -0.243661952018737793E+01 + -0.225638246536254883E+01 + -0.207073879241943359E+01 + -0.187952518463134766E+01 + -0.167072951793670654E+01 + -0.142602384090423584E+01 + -0.117397618293762207E+01 + -0.914367675781250000E+00 + -0.646970510482788086E+00 + -0.371551632881164551E+00 + -0.713925063610076904E-01 + 0.238491535186767578E+00 + 0.557672321796417236E+00 + 0.886429071426391602E+00 + 0.122504770755767822E+01 + 0.155904006958007813E+01 + 0.190187835693359375E+01 + 0.225500106811523438E+01 + 0.261871767044067383E+01 + 0.298705983161926270E+01 + 0.332745456695556641E+01 + 0.367806077003479004E+01 + 0.403918600082397461E+01 + 0.441114473342895508E+01 + 0.475697183609008789E+01 + 0.508290481567382813E+01 + 0.541861581802368164E+01 + 0.576439809799194336E+01 + 0.610793638229370117E+01 + 0.638321971893310547E+01 + 0.666676139831542969E+01 + 0.695880937576293945E+01 + 0.725961923599243164E+01 + 0.754496240615844727E+01 + 0.783508586883544922E+01 + 0.813391304016113281E+01 + 0.844170379638671875E+01 + 0.872272300720214844E+01 + 0.899785709381103516E+01 + 0.928124523162841797E+01 + 0.957313537597656250E+01 + 0.986987972259521484E+01 + 0.101736173629760742E+02 + 0.104864673614501953E+02 + 0.108087024688720703E+02 + 0.111116161346435547E+02 + 0.114123449325561523E+02 + 0.117221508026123047E+02 + 0.120360336303710938E+02 + 0.122386236190795898E+02 + 0.124181671142578125E+02 + 0.125977106094360352E+02 + 0.127772541046142578E+02 + 0.131642017364501953E+02 + 0.136625709533691406E+02 + 0.141609401702880859E+02 + 0.146593103408813477E+02 + 0.151472501754760742E+02 + 0.154578628540039063E+02 + 0.157684755325317383E+02 + 0.160790882110595703E+02 + 0.163896999359130859E+02 + 0.167001209259033203E+02 + 0.168188247680664063E+02 + 0.169375305175781250E+02 + 0.170562343597412109E+02 + 0.171749401092529297E+02 + 0.172936439514160156E+02 + 0.173657684326171875E+02 + 0.173788490295410156E+02 + 0.173919296264648438E+02 + 0.174050102233886719E+02 + 0.174180908203125000E+02 + 0.174311714172363281E+02 + 0.174206790924072266E+02 + 0.173612232208251953E+02 + 0.173017673492431641E+02 + 0.172423114776611328E+02 + 0.171828556060791016E+02 + 0.171233997344970703E+02 + 0.170639457702636719E+02 + 0.170230522155761719E+02 + 0.169946746826171875E+02 + 0.169662990570068359E+02 + 0.169379234313964844E+02 + 0.169095458984375000E+02 + 0.168811702728271484E+02 + 0.168527927398681641E+02 + 0.168355598449707031E+02 + 0.168638134002685547E+02 + 0.168920669555664063E+02 + 0.169203186035156250E+02 + 0.169485721588134766E+02 + 0.169768257141113281E+02 + 0.170050792694091797E+02 + 0.170333328247070313E+02 + 0.170682773590087891E+02 + 0.172156810760498047E+02 + 0.173630847930908203E+02 + 0.175104885101318359E+02 + 0.176578903198242188E+02 + 0.178052940368652344E+02 + 0.179526977539062500E+02 + 0.181001014709472656E+02 + 0.182475051879882813E+02 + 0.184006366729736328E+02 + 0.186046848297119141E+02 + 0.188087329864501953E+02 + 0.190127792358398438E+02 + 0.192168273925781250E+02 + 0.194208755493164063E+02 + 0.196249217987060547E+02 + 0.198289699554443359E+02 + 0.200330181121826172E+02 + 0.202370643615722656E+02 + 0.204575042724609375E+02 + 0.207269897460937500E+02 + 0.209964752197265625E+02 + 0.212659606933593750E+02 + 0.215354461669921875E+02 + 0.218049297332763672E+02 + 0.220744152069091797E+02 + 0.223439006805419922E+02 + 0.226133861541748047E+02 + 0.228828697204589844E+02 + 0.231523551940917969E+02 + 0.234810485839843750E+02 + 0.238931922912597656E+02 + 0.243053379058837891E+02 + 0.247174835205078125E+02 + 0.251296291351318359E+02 + 0.255417747497558594E+02 + 0.259539203643798828E+02 + 0.263660659790039063E+02 + 0.267782115936279297E+02 + 0.271903572082519531E+02 + 0.276025009155273438E+02 + 0.280146465301513672E+02 + 0.280276069641113281E+02 + 0.277731075286865234E+02 + 0.275186100006103516E+02 + 0.272641105651855469E+02 + 0.270096130371093750E+02 + 0.267551136016845703E+02 + 0.265006141662597656E+02 + 0.262461166381835938E+02 + 0.259916172027587891E+02 + 0.257371196746826172E+02 + 0.254826202392578125E+02 + 0.252281227111816406E+02 + 0.249736232757568359E+02 + 0.247190647125244141E+02 + 0.244644165039062500E+02 + 0.242097682952880859E+02 + 0.239551181793212891E+02 + 0.237004699707031250E+02 + 0.234458217620849609E+02 + 0.231911716461181641E+02 + 0.229365234375000000E+02 + 0.226818733215332031E+02 + 0.224272251129150391E+02 + 0.221725769042968750E+02 + 0.219179267883300781E+02 + 0.216632785797119141E+02 + 0.214086303710937500E+02 + 0.211539802551269531E+02 + 0.209239654541015625E+02 + 0.206943397521972656E+02 + 0.204647140502929688E+02 + 0.202350883483886719E+02 + 0.200054626464843750E+02 + 0.197758388519287109E+02 + 0.195462131500244141E+02 + 0.193165874481201172E+02 + 0.190869636535644531E+02 + 0.188573379516601563E+02 + 0.186277122497558594E+02 + 0.183980865478515625E+02 + 0.181684608459472656E+02 + 0.179388370513916016E+02 + 0.177092094421386719E+02 + 0.174503669738769531E+02 + 0.170001678466796875E+02 + 0.165499668121337891E+02 + 0.160997676849365234E+02 + 0.156495685577392578E+02 + 0.151993694305419922E+02 + 0.147491703033447266E+02 + 0.142989702224731445E+02 + 0.138487710952758789E+02 + 0.133985719680786133E+02 + 0.129483718872070313E+02 + 0.124981727600097656E+02 + 0.120479736328125000E+02 + 0.115977745056152344E+02 + 0.111475753784179688E+02 + 0.106973752975463867E+02 + 0.102471752166748047E+02 + 0.979697608947753906E+01 + 0.938239288330078125E+01 + 0.898338413238525391E+01 + 0.858437538146972656E+01 + 0.818536758422851563E+01 + 0.778635835647583008E+01 + 0.738735008239746094E+01 + 0.698834133148193359E+01 + 0.658933258056640625E+01 + 0.619032430648803711E+01 + 0.579131603240966797E+01 + 0.539230728149414063E+01 + 0.499329853057861328E+01 + 0.459428977966308594E+01 + 0.419528150558471680E+01 + 0.379627275466918945E+01 + 0.339726400375366211E+01 + 0.299825572967529297E+01 + 0.259924697875976563E+01 + 0.220023870468139648E+01 +__v01dn01 + 250 + 0.838000011444091797E+01 + 0.838000011444091797E+01 + 0.838000011444091797E+01 + 0.838000011444091797E+01 + 0.838000011444091797E+01 + 0.838000011444091797E+01 + 0.838000011444091797E+01 + 0.838000011444091797E+01 + 0.838000011444091797E+01 + 0.838000011444091797E+01 + 0.854714488983154297E+01 + 0.882162189483642578E+01 + 0.910433197021484375E+01 + 0.939552402496337891E+01 + 0.969545173645019531E+01 + 0.100043773651123047E+02 + 0.103225708007812500E+02 + 0.106503105163574219E+02 + 0.108678665161132813E+02 + 0.110882968902587891E+02 + 0.113153400421142578E+02 + 0.115491952896118164E+02 + 0.117900657653808594E+02 + 0.120381622314453125E+02 + 0.122802333831787109E+02 + 0.124623260498046875E+02 + 0.126498813629150391E+02 + 0.128430633544921875E+02 + 0.130420417785644531E+02 + 0.132469882965087891E+02 + 0.134580831527709961E+02 + 0.135895338058471680E+02 + 0.137241392135620117E+02 + 0.138627824783325195E+02 + 0.140055856704711914E+02 + 0.141526727676391602E+02 + 0.142790746688842773E+02 + 0.143464574813842773E+02 + 0.144158620834350586E+02 + 0.144873485565185547E+02 + 0.145609798431396484E+02 + 0.146368198394775391E+02 + 0.146435852050781250E+02 + 0.146474351882934570E+02 + 0.146513996124267578E+02 + 0.146554832458496094E+02 + 0.146596899032592773E+02 + 0.146142835617065430E+02 + 0.145635681152343750E+02 + 0.145113306045532227E+02 + 0.144575271606445313E+02 + 0.143990955352783203E+02 + 0.143202238082885742E+02 + 0.142389860153198242E+02 + 0.141553106307983398E+02 + 0.140691251754760742E+02 + 0.139931802749633789E+02 + 0.139253683090209961E+02 + 0.138555231094360352E+02 + 0.137835817337036133E+02 + 0.137169160842895508E+02 + 0.136945352554321289E+02 + 0.136714830398559570E+02 + 0.136477394104003906E+02 + 0.136232824325561523E+02 + 0.136618223190307617E+02 + 0.137113561630249023E+02 + 0.137623748779296875E+02 + 0.138149251937866211E+02 + 0.139026937484741211E+02 + 0.140064725875854492E+02 + 0.141133642196655273E+02 + 0.142234630584716797E+02 + 0.144566297531127930E+02 + 0.147554292678833008E+02 + 0.150631923675537109E+02 + 0.153801879882812500E+02 + 0.155695848464965820E+02 + 0.157111043930053711E+02 + 0.158568954467773438E+02 + 0.160046043395996094E+02 + 0.165927867889404297E+02 + 0.172726593017578125E+02 + 0.179525299072265625E+02 + 0.186324024200439453E+02 + 0.189011459350585938E+02 + 0.189490242004394531E+02 + 0.189969024658203125E+02 + 0.190447807312011719E+02 + 0.190846157073974609E+02 + 0.189876728057861328E+02 + 0.188907318115234375E+02 + 0.187937889099121094E+02 + 0.186968460083007813E+02 + 0.186000556945800781E+02 + 0.186558113098144531E+02 + 0.187115669250488281E+02 + 0.187673225402832031E+02 + 0.188230781555175781E+02 + 0.188788318634033203E+02 + 0.189871520996093750E+02 + 0.191621017456054688E+02 + 0.193370532989501953E+02 + 0.195120029449462891E+02 + 0.196869525909423828E+02 + 0.198619022369384766E+02 + 0.200379638671875000E+02 + 0.202163314819335938E+02 + 0.203946990966796875E+02 + 0.205730667114257813E+02 + 0.207514343261718750E+02 + 0.209298000335693359E+02 + 0.211081676483154297E+02 + 0.212155113220214844E+02 + 0.212749671936035156E+02 + 0.213344230651855469E+02 + 0.213938789367675781E+02 + 0.214533329010009766E+02 + 0.215127887725830078E+02 + 0.215722446441650391E+02 + 0.216253185272216797E+02 + 0.216523437500000000E+02 + 0.216793689727783203E+02 + 0.217063941955566406E+02 + 0.217334175109863281E+02 + 0.217604427337646484E+02 + 0.217874679565429688E+02 + 0.218144931793212891E+02 + 0.218431358337402344E+02 + 0.218989696502685547E+02 + 0.219548053741455078E+02 + 0.220106391906738281E+02 + 0.220664749145507813E+02 + 0.221223087310791016E+02 + 0.221781444549560547E+02 + 0.222339782714843750E+02 + 0.222898120880126953E+02 + 0.223436965942382813E+02 + 0.223802433013916016E+02 + 0.224167881011962891E+02 + 0.224533348083496094E+02 + 0.224898796081542969E+02 + 0.225264263153076172E+02 + 0.225629711151123047E+02 + 0.225995178222656250E+02 + 0.226360645294189453E+02 + 0.226726093292236328E+02 + 0.227009258270263672E+02 + 0.227046165466308594E+02 + 0.227083091735839844E+02 + 0.227119998931884766E+02 + 0.227156906127929688E+02 + 0.227193832397460938E+02 + 0.227230739593505859E+02 + 0.227267665863037109E+02 + 0.227304573059082031E+02 + 0.227341480255126953E+02 + 0.227378406524658203E+02 + 0.226381435394287109E+02 + 0.223927173614501953E+02 + 0.221472930908203125E+02 + 0.219018669128417969E+02 + 0.216564426422119141E+02 + 0.214110164642333984E+02 + 0.211655921936035156E+02 + 0.209201660156250000E+02 + 0.206747417449951172E+02 + 0.204293155670166016E+02 + 0.201838912963867188E+02 + 0.199384651184082031E+02 + 0.197638034820556641E+02 + 0.196365547180175781E+02 + 0.195093040466308594E+02 + 0.193820552825927734E+02 + 0.192548065185546875E+02 + 0.191275577545166016E+02 + 0.190003070831298828E+02 + 0.188730583190917969E+02 + 0.187458095550537109E+02 + 0.186185588836669922E+02 + 0.184913101196289063E+02 + 0.183640613555908203E+02 + 0.182368125915527344E+02 + 0.181052703857421875E+02 + 0.179671897888183594E+02 + 0.178291110992431641E+02 + 0.176910324096679688E+02 + 0.175529518127441406E+02 + 0.174148731231689453E+02 + 0.172767944335937500E+02 + 0.171387138366699219E+02 + 0.170006351470947266E+02 + 0.168625564575195313E+02 + 0.167244758605957031E+02 + 0.165863971710205078E+02 + 0.164483184814453125E+02 + 0.163102378845214844E+02 + 0.161721591949462891E+02 + 0.159048433303833008E+02 + 0.156354751586914063E+02 + 0.153661069869995117E+02 + 0.150967388153076172E+02 + 0.148273706436157227E+02 + 0.145580024719238281E+02 + 0.142886343002319336E+02 + 0.140192661285400391E+02 + 0.137498989105224609E+02 + 0.134805297851562500E+02 + 0.132111625671386719E+02 + 0.129417934417724609E+02 + 0.126724262237548828E+02 + 0.124030580520629883E+02 + 0.121336870193481445E+02 + 0.118741712570190430E+02 + 0.116791801452636719E+02 + 0.114841890335083008E+02 + 0.112891988754272461E+02 + 0.110942077636718750E+02 + 0.108992166519165039E+02 + 0.107042264938354492E+02 + 0.105092353820800781E+02 + 0.103142442703247070E+02 + 0.101192541122436523E+02 + 0.992426300048828125E+01 + 0.972927188873291016E+01 + 0.953428173065185547E+01 + 0.933929061889648438E+01 + 0.914429950714111328E+01 + 0.894930934906005859E+01 + 0.875431823730468750E+01 + 0.855932712554931641E+01 + 0.831746864318847656E+01 + 0.805511379241943359E+01 + 0.779275941848754883E+01 + 0.753040504455566406E+01 + 0.726805019378662109E+01 + 0.700569534301757813E+01 + 0.674334096908569336E+01 + 0.648098659515380859E+01 + 0.621863174438476563E+01 + 0.595627689361572266E+01 + 0.569392204284667969E+01 + 0.543156766891479492E+01 + 0.516921281814575195E+01 + 0.490685844421386719E+01 + 0.464450359344482422E+01 + 0.438214921951293945E+01 + 0.411979436874389648E+01 + 0.385743951797485352E+01 + 0.359508514404296875E+01 +__pi01dn01 + 250 + 0.100127435302734375E+04 + 0.100096276855468750E+04 + 0.100064184570312500E+04 + 0.100031127929687500E+04 + 0.999970764160156250E+03 + 0.999620056152343750E+03 + 0.999258850097656250E+03 + 0.998886779785156250E+03 + 0.998503540039062500E+03 + 0.998108764648437500E+03 + 0.997702148437500000E+03 + 0.997283264160156250E+03 + 0.996851745605468750E+03 + 0.996407165527343750E+03 + 0.995949157714843750E+03 + 0.995477355957031250E+03 + 0.994991271972656250E+03 + 0.994490539550781250E+03 + 0.993974670410156250E+03 + 0.993443237304687500E+03 + 0.992895751953125000E+03 + 0.992331726074218750E+03 + 0.991750732421875000E+03 + 0.991152160644531250E+03 + 0.990535522460937500E+03 + 0.989900268554687500E+03 + 0.989245849609375000E+03 + 0.988571716308593750E+03 + 0.987877258300781250E+03 + 0.987161804199218750E+03 + 0.986424743652343750E+03 + 0.985665466308593750E+03 + 0.984883300781250000E+03 + 0.984077575683593750E+03 + 0.983247558593750000E+03 + 0.982392517089843750E+03 + 0.981511657714843750E+03 + 0.980604248046875000E+03 + 0.979669494628906250E+03 + 0.978706604003906250E+03 + 0.977714660644531250E+03 + 0.976692871093750000E+03 + 0.975640258789062500E+03 + 0.974555969238281250E+03 + 0.973439025878906250E+03 + 0.972288452148437500E+03 + 0.971103271484375000E+03 + 0.969882385253906250E+03 + 0.968624755859375000E+03 + 0.967329284667968750E+03 + 0.965994873046875000E+03 + 0.964620300292968750E+03 + 0.963204345703125000E+03 + 0.961745849609375000E+03 + 0.960243469238281250E+03 + 0.958695861816406250E+03 + 0.957101684570312500E+03 + 0.955459594726562500E+03 + 0.953768066406250000E+03 + 0.952025695800781250E+03 + 0.950230895996093750E+03 + 0.948382080078125000E+03 + 0.946477539062500000E+03 + 0.944515625000000000E+03 + 0.942494628906250000E+03 + 0.940412597656250000E+03 + 0.938267517089843750E+03 + 0.936057495117187500E+03 + 0.933780517578125000E+03 + 0.931434814453125000E+03 + 0.929018859863281250E+03 + 0.926530639648437500E+03 + 0.923968017578125000E+03 + 0.921329467773437500E+03 + 0.918613830566406250E+03 + 0.915819274902343750E+03 + 0.912943603515625000E+03 + 0.909984741210937500E+03 + 0.906940002441406250E+03 + 0.903807189941406250E+03 + 0.900637023925781250E+03 + 0.897475952148437500E+03 + 0.894318542480468750E+03 + 0.891164794921875000E+03 + 0.888014648437500000E+03 + 0.884867736816406250E+03 + 0.881723388671875000E+03 + 0.878581359863281250E+03 + 0.875441650390625000E+03 + 0.872304260253906250E+03 + 0.869169372558593750E+03 + 0.866037109375000000E+03 + 0.862907470703125000E+03 + 0.859780456542968750E+03 + 0.856656066894531250E+03 + 0.853533996582031250E+03 + 0.850413879394531250E+03 + 0.847295715332031250E+03 + 0.844179565429687500E+03 + 0.841065368652343750E+03 + 0.837953063964843750E+03 + 0.834842590332031250E+03 + 0.831733947753906250E+03 + 0.828627075195312500E+03 + 0.825522033691406250E+03 + 0.822418762207031250E+03 + 0.819317382812500000E+03 + 0.816218139648437500E+03 + 0.813121276855468750E+03 + 0.810026733398437500E+03 + 0.806934509277343750E+03 + 0.803844604492187500E+03 + 0.800757019042968750E+03 + 0.797671752929687500E+03 + 0.794588684082031250E+03 + 0.791507812500000000E+03 + 0.788429077148437500E+03 + 0.785352539062500000E+03 + 0.782278137207031250E+03 + 0.779205932617187500E+03 + 0.776135864257812500E+03 + 0.773067871093750000E+03 + 0.770001892089843750E+03 + 0.766937866210937500E+03 + 0.763875854492187500E+03 + 0.760815856933593750E+03 + 0.757757812500000000E+03 + 0.754701782226562500E+03 + 0.751647705078125000E+03 + 0.748595458984375000E+03 + 0.745544860839843750E+03 + 0.742495910644531250E+03 + 0.739448547363281250E+03 + 0.736402832031250000E+03 + 0.733358764648437500E+03 + 0.730316345214843750E+03 + 0.727275573730468750E+03 + 0.724236389160156250E+03 + 0.721198791503906250E+03 + 0.718162780761718750E+03 + 0.715128295898437500E+03 + 0.712095397949218750E+03 + 0.709064025878906250E+03 + 0.706034179687500000E+03 + 0.703005920410156250E+03 + 0.699979187011718750E+03 + 0.696953979492187500E+03 + 0.693930480957031250E+03 + 0.690909362792968750E+03 + 0.687891052246093750E+03 + 0.684875549316406250E+03 + 0.681862854003906250E+03 + 0.678852966308593750E+03 + 0.675845886230468750E+03 + 0.672841613769531250E+03 + 0.669840148925781250E+03 + 0.666841430664062500E+03 + 0.663845520019531250E+03 + 0.660853393554687500E+03 + 0.657867553710937500E+03 + 0.654889465332031250E+03 + 0.651919006347656250E+03 + 0.648956176757812500E+03 + 0.646000915527343750E+03 + 0.643053222656250000E+03 + 0.640113037109375000E+03 + 0.637180297851562500E+03 + 0.634255004882812500E+03 + 0.631337097167968750E+03 + 0.628426513671875000E+03 + 0.625525024414062500E+03 + 0.622635375976562500E+03 + 0.619758666992187500E+03 + 0.616894775390625000E+03 + 0.614043579101562500E+03 + 0.611204956054687500E+03 + 0.608378845214843750E+03 + 0.605565063476562500E+03 + 0.602763549804687500E+03 + 0.599974182128906250E+03 + 0.597196899414062500E+03 + 0.594431518554687500E+03 + 0.591677978515625000E+03 + 0.588936157226562500E+03 + 0.586205932617187500E+03 + 0.583487182617187500E+03 + 0.580779785156250000E+03 + 0.578083679199218750E+03 + 0.575398742675781250E+03 + 0.572724853515625000E+03 + 0.570061950683593750E+03 + 0.567409973144531250E+03 + 0.564768798828125000E+03 + 0.562138366699218750E+03 + 0.559518554687500000E+03 + 0.556909301757812500E+03 + 0.554310485839843750E+03 + 0.551722045898437500E+03 + 0.549144042968750000E+03 + 0.546576477050781250E+03 + 0.544019226074218750E+03 + 0.541472229003906250E+03 + 0.538935424804687500E+03 + 0.536408691406250000E+03 + 0.533891967773437500E+03 + 0.531385192871093750E+03 + 0.528888305664062500E+03 + 0.526401184082031250E+03 + 0.523923767089843750E+03 + 0.521455993652343750E+03 + 0.518997741699218750E+03 + 0.516549011230468750E+03 + 0.514109680175781250E+03 + 0.511679656982421875E+03 + 0.509258758544921875E+03 + 0.506846771240234375E+03 + 0.504443664550781250E+03 + 0.502049346923828125E+03 + 0.499663757324218750E+03 + 0.497286834716796875E+03 + 0.494918518066406250E+03 + 0.492558746337890625E+03 + 0.490207458496093750E+03 + 0.487864593505859375E+03 + 0.485530090332031250E+03 + 0.483203887939453125E+03 + 0.480885925292968750E+03 + 0.478576141357421875E+03 + 0.476274475097656250E+03 + 0.473980895996093750E+03 + 0.471695312500000000E+03 + 0.469418365478515625E+03 + 0.467150939941406250E+03 + 0.464893218994140625E+03 + 0.462645141601562500E+03 + 0.460406616210937500E+03 + 0.458177581787109375E+03 + 0.455957946777343750E+03 + 0.453747619628906250E+03 + 0.451546539306640625E+03 + 0.449354614257812500E+03 + 0.447171783447265625E+03 + 0.444997985839843750E+03 + 0.442833129882812500E+03 + 0.440677124023437500E+03 + 0.438529907226562500E+03 + 0.436391418457031250E+03 + 0.434261566162109375E+03 + 0.432140319824218750E+03 + 0.430027587890625000E+03 +__th01dn01 + 250 + 0.309907257080078125E+03 + 0.309907257080078125E+03 + 0.309903442382812500E+03 + 0.309899536132812500E+03 + 0.309895507812500000E+03 + 0.309891326904296875E+03 + 0.309887084960937500E+03 + 0.309882690429687500E+03 + 0.309878173828125000E+03 + 0.309873474121093750E+03 + 0.309837249755859375E+03 + 0.309780731201171875E+03 + 0.309722473144531250E+03 + 0.309662506103515625E+03 + 0.309600708007812500E+03 + 0.309537078857421875E+03 + 0.309471557617187500E+03 + 0.309404052734375000E+03 + 0.309354461669921875E+03 + 0.309303985595703125E+03 + 0.309251983642578125E+03 + 0.309198394775390625E+03 + 0.309143280029296875E+03 + 0.309086425781250000E+03 + 0.309029907226562500E+03 + 0.308981628417968750E+03 + 0.308931823730468750E+03 + 0.308880584716796875E+03 + 0.308827789306640625E+03 + 0.308773406982421875E+03 + 0.308717437744140625E+03 + 0.308675170898437500E+03 + 0.308631835937500000E+03 + 0.308587158203125000E+03 + 0.308541168212890625E+03 + 0.308493804931640625E+03 + 0.308448333740234375E+03 + 0.308409912109375000E+03 + 0.308370330810546875E+03 + 0.308329589843750000E+03 + 0.308287597656250000E+03 + 0.308244415283203125E+03 + 0.308213623046875000E+03 + 0.308182525634765625E+03 + 0.308150482177734375E+03 + 0.308117492675781250E+03 + 0.308083526611328125E+03 + 0.308057464599609375E+03 + 0.308031372070312500E+03 + 0.308004486083984375E+03 + 0.307976806640625000E+03 + 0.307949096679687500E+03 + 0.307925598144531250E+03 + 0.307901367187500000E+03 + 0.307876373291015625E+03 + 0.307850708007812500E+03 + 0.307826171875000000E+03 + 0.307802551269531250E+03 + 0.307778198242187500E+03 + 0.307753112792968750E+03 + 0.307726074218750000E+03 + 0.307690704345703125E+03 + 0.307654296875000000E+03 + 0.307616790771484375E+03 + 0.307578186035156250E+03 + 0.307500701904296875E+03 + 0.307415069580078125E+03 + 0.307326873779296875E+03 + 0.307235961914062500E+03 + 0.307229034423828125E+03 + 0.307256225585937500E+03 + 0.307284088134765625E+03 + 0.307312591552734375E+03 + 0.307505554199218750E+03 + 0.307784240722656250E+03 + 0.308070953369140625E+03 + 0.308366088867187500E+03 + 0.308708312988281250E+03 + 0.309075897216796875E+03 + 0.309454406738281250E+03 + 0.309837829589843750E+03 + 0.310200683593750000E+03 + 0.310559356689453125E+03 + 0.310917999267578125E+03 + 0.311276550292968750E+03 + 0.311552001953125000E+03 + 0.311782836914062500E+03 + 0.312013671875000000E+03 + 0.312244445800781250E+03 + 0.312476989746093750E+03 + 0.312740447998046875E+03 + 0.313003845214843750E+03 + 0.313267303466796875E+03 + 0.313530700683593750E+03 + 0.313794006347656250E+03 + 0.313992218017578125E+03 + 0.314190429687500000E+03 + 0.314388671875000000E+03 + 0.314586883544921875E+03 + 0.314785034179687500E+03 + 0.314976348876953125E+03 + 0.315158874511718750E+03 + 0.315341430664062500E+03 + 0.315523956298828125E+03 + 0.315706481933593750E+03 + 0.315888977050781250E+03 + 0.316089813232421875E+03 + 0.316328582763671875E+03 + 0.316567352294921875E+03 + 0.316806091308593750E+03 + 0.317044860839843750E+03 + 0.317283569335937500E+03 + 0.317522308349609375E+03 + 0.317752563476562500E+03 + 0.317977111816406250E+03 + 0.318201660156250000E+03 + 0.318426208496093750E+03 + 0.318650726318359375E+03 + 0.318875274658203125E+03 + 0.319099761962890625E+03 + 0.319321105957031250E+03 + 0.319529602050781250E+03 + 0.319738098144531250E+03 + 0.319946594238281250E+03 + 0.320155059814453125E+03 + 0.320363525390625000E+03 + 0.320571990966796875E+03 + 0.320780426025390625E+03 + 0.320986938476562500E+03 + 0.321159851074218750E+03 + 0.321332794189453125E+03 + 0.321505676269531250E+03 + 0.321678619384765625E+03 + 0.321851531982421875E+03 + 0.322024505615234375E+03 + 0.322197418212890625E+03 + 0.322370330810546875E+03 + 0.322542480468750000E+03 + 0.322707763671875000E+03 + 0.322873046875000000E+03 + 0.323038360595703125E+03 + 0.323203643798828125E+03 + 0.323368896484375000E+03 + 0.323534179687500000E+03 + 0.323699493408203125E+03 + 0.323864776611328125E+03 + 0.324030029296875000E+03 + 0.324229919433593750E+03 + 0.324533386230468750E+03 + 0.324836853027343750E+03 + 0.325140289306640625E+03 + 0.325443725585937500E+03 + 0.325747222900390625E+03 + 0.326050659179687500E+03 + 0.326354095458984375E+03 + 0.326657531738281250E+03 + 0.326960998535156250E+03 + 0.327264465332031250E+03 + 0.327794219970703125E+03 + 0.328642883300781250E+03 + 0.329491577148437500E+03 + 0.330340240478515625E+03 + 0.331188934326171875E+03 + 0.332037597656250000E+03 + 0.332886291503906250E+03 + 0.333734985351562500E+03 + 0.334583648681640625E+03 + 0.335432312011718750E+03 + 0.336281005859375000E+03 + 0.337129699707031250E+03 + 0.338382720947265625E+03 + 0.339906707763671875E+03 + 0.341430664062500000E+03 + 0.342954620361328125E+03 + 0.344478576660156250E+03 + 0.346002563476562500E+03 + 0.347526519775390625E+03 + 0.349050476074218750E+03 + 0.350574432373046875E+03 + 0.352098419189453125E+03 + 0.353622375488281250E+03 + 0.355146331787109375E+03 + 0.356670288085937500E+03 + 0.358189758300781250E+03 + 0.359702392578125000E+03 + 0.361215026855468750E+03 + 0.362727661132812500E+03 + 0.364240295410156250E+03 + 0.365752899169921875E+03 + 0.367265533447265625E+03 + 0.368778167724609375E+03 + 0.370290802001953125E+03 + 0.371803436279296875E+03 + 0.373316070556640625E+03 + 0.374828704833984375E+03 + 0.376341308593750000E+03 + 0.377853942871093750E+03 + 0.379366577148437500E+03 + 0.380909759521484375E+03 + 0.382453399658203125E+03 + 0.383997070312500000E+03 + 0.385540771484375000E+03 + 0.387084411621093750E+03 + 0.388628082275390625E+03 + 0.390171752929687500E+03 + 0.391715393066406250E+03 + 0.393259063720703125E+03 + 0.394802734375000000E+03 + 0.396346374511718750E+03 + 0.397890045166015625E+03 + 0.399433715820312500E+03 + 0.400977355957031250E+03 + 0.402521057128906250E+03 + 0.404058654785156250E+03 + 0.405556640625000000E+03 + 0.407054626464843750E+03 + 0.408552612304687500E+03 + 0.410050598144531250E+03 + 0.411548583984375000E+03 + 0.413046569824218750E+03 + 0.414544555664062500E+03 + 0.416042572021484375E+03 + 0.417540557861328125E+03 + 0.419038543701171875E+03 + 0.420536529541015625E+03 + 0.422034515380859375E+03 + 0.423532501220703125E+03 + 0.425030487060546875E+03 + 0.426528472900390625E+03 + 0.428026458740234375E+03 + 0.429524444580078125E+03 + 0.431275360107421875E+03 + 0.433136871337890625E+03 + 0.434998413085937500E+03 + 0.436859954833984375E+03 + 0.438721466064453125E+03 + 0.440583007812500000E+03 + 0.442444519042968750E+03 + 0.444306030273437500E+03 + 0.446167541503906250E+03 + 0.448029083251953125E+03 + 0.449890594482421875E+03 + 0.451752105712890625E+03 + 0.453613647460937500E+03 + 0.455475158691406250E+03 + 0.457336669921875000E+03 + 0.459198211669921875E+03 + 0.461059722900390625E+03 + 0.462921234130859375E+03 + 0.464782745361328125E+03 +__dn01dn01 + 250 + 0.111670076847076416E+01 + 0.111583304405212402E+01 + 0.111495316028594971E+01 + 0.111404716968536377E+01 + 0.111311447620391846E+01 + 0.111215424537658691E+01 + 0.111116600036621094E+01 + 0.111014842987060547E+01 + 0.110910069942474365E+01 + 0.110802233219146729E+01 + 0.110702455043792725E+01 + 0.110606551170349121E+01 + 0.110507798194885254E+01 + 0.110406100749969482E+01 + 0.110301351547241211E+01 + 0.110193514823913574E+01 + 0.110082459449768066E+01 + 0.109968078136444092E+01 + 0.109843230247497559E+01 + 0.109714496135711670E+01 + 0.109581911563873291E+01 + 0.109445440769195557E+01 + 0.109304881095886230E+01 + 0.109160244464874268E+01 + 0.109010577201843262E+01 + 0.108853006362915039E+01 + 0.108690869808197021E+01 + 0.108523905277252197E+01 + 0.108352053165435791E+01 + 0.108175158500671387E+01 + 0.107993090152740479E+01 + 0.107800281047821045E+01 + 0.107601821422576904E+01 + 0.107397580146789551E+01 + 0.107187390327453613E+01 + 0.106971108913421631E+01 + 0.106747353076934814E+01 + 0.106514251232147217E+01 + 0.106274425983428955E+01 + 0.106027674674987793E+01 + 0.105773806571960449E+01 + 0.105512654781341553E+01 + 0.105239295959472656E+01 + 0.104957938194274902E+01 + 0.104668557643890381E+01 + 0.104370951652526855E+01 + 0.104064846038818359E+01 + 0.103747093677520752E+01 + 0.103420090675354004E+01 + 0.103083884716033936E+01 + 0.102738225460052490E+01 + 0.102382588386535645E+01 + 0.102015328407287598E+01 + 0.101637852191925049E+01 + 0.101249897480010986E+01 + 0.100851118564605713E+01 + 0.100440704822540283E+01 + 0.100018405914306641E+01 + 0.995845079421997070E+00 + 0.991387069225311279E+00 + 0.986811041831970215E+00 + 0.982134342193603516E+00 + 0.977330088615417480E+00 + 0.972395360469818115E+00 + 0.967327058315277100E+00 + 0.962239861488342285E+00 + 0.957032382488250732E+00 + 0.951683580875396729E+00 + 0.946190655231475830E+00 + 0.940284967422485352E+00 + 0.934121131896972656E+00 + 0.927799105644226074E+00 + 0.921316146850585938E+00 + 0.914183199405670166E+00 + 0.906644761562347412E+00 + 0.898932337760925293E+00 + 0.891043782234191895E+00 + 0.882866740226745605E+00 + 0.874464094638824463E+00 + 0.865876972675323486E+00 + 0.857247173786163330E+00 + 0.848756194114685059E+00 + 0.840344369411468506E+00 + 0.831999599933624268E+00 + 0.823721885681152344E+00 + 0.815726816654205322E+00 + 0.807905972003936768E+00 + 0.800140321254730225E+00 + 0.792429745197296143E+00 + 0.784769535064697266E+00 + 0.777087628841400146E+00 + 0.769462049007415771E+00 + 0.761892855167388916E+00 + 0.754379570484161377E+00 + 0.746922433376312256E+00 + 0.739673197269439697E+00 + 0.732474088668823242E+00 + 0.725325345993041992E+00 + 0.718226611614227295E+00 + 0.711177647113800049E+00 + 0.704193413257598877E+00 + 0.697277009487152100E+00 + 0.690408766269683838E+00 + 0.683588266372680664E+00 + 0.676815092563629150E+00 + 0.670089662075042725E+00 + 0.663372635841369629E+00 + 0.656625390052795410E+00 + 0.649928510189056396E+00 + 0.643281519412994385E+00 + 0.636684298515319824E+00 + 0.630136549472808838E+00 + 0.623638093471527100E+00 + 0.617204904556274414E+00 + 0.610830605030059814E+00 + 0.604504227638244629E+00 + 0.598224937915802002E+00 + 0.591992735862731934E+00 + 0.585807383060455322E+00 + 0.579668641090393066E+00 + 0.573581755161285400E+00 + 0.567563652992248535E+00 + 0.561590433120727539E+00 + 0.555661857128143311E+00 + 0.549777865409851074E+00 + 0.543938159942626953E+00 + 0.538142383098602295E+00 + 0.532390475273132324E+00 + 0.526685476303100586E+00 + 0.521077871322631836E+00 + 0.515511572360992432E+00 + 0.509986519813537598E+00 + 0.504501998424530029E+00 + 0.499058365821838379E+00 + 0.493655264377593994E+00 + 0.488292634487152100E+00 + 0.482970029115676880E+00 + 0.477688550949096680E+00 + 0.472456902265548706E+00 + 0.467264503240585327E+00 + 0.462111085653305054E+00 + 0.456996619701385498E+00 + 0.451920777559280396E+00 + 0.446883529424667358E+00 + 0.441884607076644897E+00 + 0.436923891305923462E+00 + 0.432001203298568726E+00 + 0.427071005105972290E+00 + 0.422046124935150146E+00 + 0.417064964771270752E+00 + 0.412127494812011719E+00 + 0.407233268022537231E+00 + 0.402381867170333862E+00 + 0.397573441267013550E+00 + 0.392807364463806152E+00 + 0.388083606958389282E+00 + 0.383401602506637573E+00 + 0.378761231899261475E+00 + 0.373905450105667114E+00 + 0.368744522333145142E+00 + 0.363649308681488037E+00 + 0.358618944883346558E+00 + 0.353652417659759521E+00 + 0.348749011754989624E+00 + 0.343907982110977173E+00 + 0.339128553867340088E+00 + 0.334409743547439575E+00 + 0.329751104116439819E+00 + 0.325151473283767700E+00 + 0.320610284805297852E+00 + 0.315751373767852783E+00 + 0.310720592737197876E+00 + 0.305775552988052368E+00 + 0.300914704799652100E+00 + 0.296136260032653809E+00 + 0.291438698768615723E+00 + 0.286820471286773682E+00 + 0.282280057668685913E+00 + 0.277815908193588257E+00 + 0.273426502943038940E+00 + 0.269110709428787231E+00 + 0.264866828918457031E+00 + 0.260693699121475220E+00 + 0.256593018770217896E+00 + 0.252564996480941772E+00 + 0.248603314161300659E+00 + 0.244706809520721436E+00 + 0.240874215960502625E+00 + 0.237104281783103943E+00 + 0.233396038413047791E+00 + 0.229748144745826721E+00 + 0.226159617304801941E+00 + 0.222629338502883911E+00 + 0.219156369566917419E+00 + 0.215739503502845764E+00 + 0.212377756834030151E+00 + 0.209070175886154175E+00 + 0.205815732479095459E+00 + 0.202597439289093018E+00 + 0.199431061744689941E+00 + 0.196315750479698181E+00 + 0.193250760436058044E+00 + 0.190235123038291931E+00 + 0.187267929315567017E+00 + 0.184348374605178833E+00 + 0.181475609540939331E+00 + 0.178648769855499268E+00 + 0.175867006182670593E+00 + 0.173129573464393616E+00 + 0.170435711741447449E+00 + 0.167784586548805237E+00 + 0.165175482630729675E+00 + 0.162607654929161072E+00 + 0.160082861781120300E+00 + 0.157613083720207214E+00 + 0.155181482434272766E+00 + 0.152787685394287109E+00 + 0.150430813431739807E+00 + 0.148110300302505493E+00 + 0.145825594663619995E+00 + 0.143576085567474365E+00 + 0.141361102461814880E+00 + 0.139180153608322144E+00 + 0.137032672762870789E+00 + 0.134918078780174255E+00 + 0.132835820317268372E+00 + 0.130785390734672546E+00 + 0.128766208887100220E+00 + 0.126777827739715576E+00 + 0.124819725751876831E+00 + 0.122891381382942200E+00 + 0.120921768248081207E+00 + 0.118954420089721680E+00 + 0.117020443081855774E+00 + 0.115119203925132751E+00 + 0.113250114023685455E+00 + 0.111412584781646729E+00 + 0.109605960547924042E+00 + 0.107829689979553223E+00 + 0.106083236634731293E+00 + 0.104365974664688110E+00 + 0.102677382528781891E+00 + 0.101016990840435028E+00 + 0.993841886520385742E-01 + 0.977785140275955200E-01 + 0.961994454264640808E-01 + 0.946464836597442627E-01 + 0.931192040443420410E-01 + 0.916170924901962280E-01 + 0.901397019624710083E-01 +__rt01dn01 + 250 + 0.157400742173194885E-01 + 0.157400742173194885E-01 + 0.157197769731283188E-01 + 0.156988706439733505E-01 + 0.156773384660482407E-01 + 0.156551580876111984E-01 + 0.156323146075010300E-01 + 0.156087838113307953E-01 + 0.155845480039715767E-01 + 0.155595848336815834E-01 + 0.155360717326402664E-01 + 0.155131984502077103E-01 + 0.154896397143602371E-01 + 0.154653731733560562E-01 + 0.154403792694211006E-01 + 0.154146356508135796E-01 + 0.153881199657917023E-01 + 0.153608079999685287E-01 + 0.153312394395470619E-01 + 0.153007395565509796E-01 + 0.152693241834640503E-01 + 0.152369672432541847E-01 + 0.152036398649215698E-01 + 0.151693113148212433E-01 + 0.151335047557950020E-01 + 0.150943771004676819E-01 + 0.150540759786963463E-01 + 0.150125650689005852E-01 + 0.149698099121451378E-01 + 0.149257713928818703E-01 + 0.148804122582077980E-01 + 0.148314256221055984E-01 + 0.147809488698840141E-01 + 0.147289568558335304E-01 + 0.146754058077931404E-01 + 0.146202482283115387E-01 + 0.145624317228794098E-01 + 0.145003683865070343E-01 + 0.144364433363080025E-01 + 0.143706006929278374E-01 + 0.143027827143669128E-01 + 0.142329297959804535E-01 + 0.141618810594081879E-01 + 0.140887415036559105E-01 + 0.140134068205952644E-01 + 0.139358118176460266E-01 + 0.138558903709053993E-01 + 0.137731982395052910E-01 + 0.136879952624440193E-01 + 0.136002376675605774E-01 + 0.135098462924361229E-01 + 0.134156541898846626E-01 + 0.133118750527501106E-01 + 0.132049825042486191E-01 + 0.130948834121227264E-01 + 0.129814818501472473E-01 + 0.128611130639910698E-01 + 0.127342399209737778E-01 + 0.126035604625940323E-01 + 0.124689601361751556E-01 + 0.123188504949212074E-01 + 0.120928045362234116E-01 + 0.118599776178598404E-01 + 0.116201657801866531E-01 + 0.113731585443019867E-01 + 0.108122359961271286E-01 + 0.101871732622385025E-01 + 0.954335834830999374E-02 + 0.888023152947425842E-02 + 0.814564153552055359E-02 + 0.736850779503583908E-02 + 0.656806118786334991E-02 + 0.574360042810440063E-02 + 0.511736655607819557E-02 + 0.458150403574109077E-02 + 0.402956502512097359E-02 + 0.346106919459998608E-02 + 0.315951509401202202E-02 + 0.295987166464328766E-02 + 0.275420234538614750E-02 + 0.254582636989653111E-02 + 0.240100966766476631E-02 + 0.226934440433979034E-02 + 0.213767914101481438E-02 + 0.200601387768983841E-02 + 0.188496639020740986E-02 + 0.176962336990982294E-02 + 0.165428023319691420E-02 + 0.153893709648400545E-02 + 0.142714334651827812E-02 + 0.137570430524647236E-02 + 0.132426526397466660E-02 + 0.127282633911818266E-02 + 0.122138729784637690E-02 + 0.116997293662279844E-02 + 0.114299450069665909E-02 + 0.111601618118584156E-02 + 0.108903786167502403E-02 + 0.106205942574888468E-02 + 0.103508110623806715E-02 + 0.100341590587049723E-02 + 0.965809798799455166E-03 + 0.928203691728413105E-03 + 0.890597584657371044E-03 + 0.852991419378668070E-03 + 0.815385312307626009E-03 + 0.778890273068100214E-03 + 0.744703225791454315E-03 + 0.710516120307147503E-03 + 0.676329073030501604E-03 + 0.642141967546194792E-03 + 0.607954920269548893E-03 + 0.573767814785242081E-03 + 0.543858448509126902E-03 + 0.516833271831274033E-03 + 0.489808095153421164E-03 + 0.462782976683229208E-03 + 0.435757800005376339E-03 + 0.408732681535184383E-03 + 0.381707504857331514E-03 + 0.355890952050685883E-03 + 0.335007964167743921E-03 + 0.314125005388632417E-03 + 0.293242046609520912E-03 + 0.272359058726578951E-03 + 0.251476070843636990E-03 + 0.230593112064525485E-03 + 0.209710153285413980E-03 + 0.189310128916986287E-03 + 0.177026522578671575E-03 + 0.164742901688441634E-03 + 0.152459295350126922E-03 + 0.140175674459896982E-03 + 0.127892068121582270E-03 + 0.115608447231352329E-03 + 0.103324840893037617E-03 + 0.910412200028076768E-04 + 0.793839499237947166E-04 + 0.732929765945300460E-04 + 0.672020032652653754E-04 + 0.611110299360007048E-04 + 0.550200566067360342E-04 + 0.489290869154501706E-04 + 0.428381135861855000E-04 + 0.367471402569208294E-04 + 0.306561669276561588E-04 + 0.245651935983914882E-04 + 0.197688186744926497E-04 + 0.188459234777837992E-04 + 0.179230301000643522E-04 + 0.170001349033555016E-04 + 0.160772415256360546E-04 + 0.151543463289272040E-04 + 0.142314529512077570E-04 + 0.133085586639936082E-04 + 0.123856643767794594E-04 + 0.114627700895653106E-04 + 0.105398758023511618E-04 + 0.968389485933585092E-05 + 0.892223033588379622E-05 + 0.816056490293703973E-05 + 0.739890037948498502E-05 + 0.663723540128557943E-05 + 0.587557042308617383E-05 + 0.511390544488676824E-05 + 0.435224092143471353E-05 + 0.359057594323530793E-05 + 0.282891096503590234E-05 + 0.206724598683649674E-05 + 0.130558146338444203E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 +__kppzm + 48 + -0.170577192306518555E+01 + -0.515288019180297852E+01 + -0.867263221740722656E+01 + -0.122681560516357422E+02 + -0.159427862167358398E+02 + -0.197000827789306641E+02 + -0.235438518524169922E+02 + -0.274781646728515625E+02 + -0.315073947906494141E+02 + -0.356362304687500000E+02 + -0.398697319030761719E+02 + -0.442133331298828125E+02 + -0.486729240417480469E+02 + -0.532548675537109375E+02 + -0.579660606384277344E+02 + -0.628140220642089844E+02 + -0.678069229125976563E+02 + -0.729536972045898438E+02 + -0.782641372680664063E+02 + -0.837490005493164063E+02 + -0.894201202392578125E+02 + -0.952906188964843750E+02 + -0.101375022888183594E+03 + -0.107689506530761719E+03 + -0.114252166748046875E+03 + -0.121083328247070312E+03 + -0.128205902099609375E+03 + -0.135645858764648437E+03 + -0.143432846069335937E+03 + -0.151600814819335937E+03 + -0.160188995361328125E+03 + -0.169243026733398437E+03 + -0.178816345214843750E+03 + -0.188972213745117187E+03 + -0.199786239624023437E+03 + -0.211349731445312500E+03 + -0.223774444580078125E+03 + -0.237199188232421875E+03 + -0.251799423217773437E+03 + -0.267801239013671875E+03 + -0.285503112792968750E+03 + -0.305310638427734375E+03 + -0.327794952392578125E+03 + -0.353797454833984375E+03 + -0.384634338378906250E+03 + -0.422540863037109375E+03 + -0.471808868408203125E+03 + -0.500000000000000000E+03 +__gnu + 8 + 0.400000000000000000E+01 + 0.200000000000000000E+01 + 0.200000000000000000E+01 + 0.200000000000000000E+01 + 0.200000000000000000E+01 + 0.200000000000000000E+01 + 0.200000000000000000E+01 + 0.400000000000000000E+01 +__iaero_chem + 11 + 1 + 1 + 1 + 1 + 2 + 2 + 2 + 1 + 1 + 1 + 1 +__cfmas + 16 + 0.524000000000000000E+03 + 0.524000000000000000E+03 + 0.110800003051757812E+03 + 0.273899990133941174E-02 + 0.495999991893768311E+00 + 0.157000000000000000E+03 + 0.471000000000000000E+03 + 0.885399997234344482E+00 + 0.377000006847083569E-02 + 0.123000005260109901E-02 + 0.100100003182888031E+00 + 0.885399997234344482E+00 + 0.377000006847083569E-02 + 0.123000005260109901E-02 + 0.100100003182888031E+00 + 0.524000000000000000E+03 +__pwmas + 16 + 0.300000000000000000E+01 + 0.300000000000000000E+01 + 0.291000008583068848E+01 + 0.174000000953674316E+01 + 0.240000009536743164E+01 + 0.300000000000000000E+01 + 0.300000000000000000E+01 + 0.250000000000000000E+01 + 0.200000000000000000E+01 + 0.179999995231628418E+01 + 0.225600004196166992E+01 + 0.250000000000000000E+01 + 0.200000000000000000E+01 + 0.179999995231628418E+01 + 0.225600004196166992E+01 + 0.300000000000000000E+01 +__slcpd + 12 + 0.146500000000000000E+07 + 0.140700000000000000E+07 + 0.134400000000000000E+07 + 0.127300000000000000E+07 + 0.121400000000000000E+07 + 0.117700000000000000E+07 + 0.131900000000000000E+07 + 0.122700000000000000E+07 + 0.117700000000000000E+07 + 0.115100000000000000E+07 + 0.108800000000000000E+07 + 0.874000000000000000E+06 +__slmsts + 12 + 0.395000010728836060E+00 + 0.409999996423721313E+00 + 0.435000002384185791E+00 + 0.485000014305114746E+00 + 0.451000005006790161E+00 + 0.419999986886978149E+00 + 0.476999998092651367E+00 + 0.476000010967254639E+00 + 0.425999999046325684E+00 + 0.492000013589859009E+00 + 0.481999993324279785E+00 + 0.862999975681304932E+00 +__slz + 11 + -0.500000000000000000E+00 + -0.400000005960464478E+00 + -0.300000011920928955E+00 + -0.250000000000000000E+00 + -0.200000002980232239E+00 + -0.159999996423721313E+00 + -0.119999997317790985E+00 + -0.900000035762786865E-01 + -0.599999986588954926E-01 + -0.299999993294477463E-01 + -0.999999977648258209E-02 diff --git a/bin.rams/test.supercell/a-A-1991-04-26-212500-head.txt b/bin.rams/test.supercell/a-A-1991-04-26-212500-head.txt new file mode 100644 index 0000000..c5b938f --- /dev/null +++ b/bin.rams/test.supercell/a-A-1991-04-26-212500-head.txt @@ -0,0 +1,3638 @@ + 257 +UP 0 3 1 218750 +VP 0 3 1 218750 +WP 0 3 1 218750 +PP 0 3 1 218750 +UC 0 3 1 218750 +VC 0 3 1 218750 +WC 0 3 1 218750 +PC 0 3 1 218750 +THP 0 3 1 218750 +RTP 0 3 1 218750 +THETA 0 3 1 218750 +RV 0 3 1 218750 +DN0 0 3 1 218750 +WP_BUOY_THETA 0 3 1 218750 +WP_BUOY_COND 0 3 1 218750 +WP_ADVDIF 0 3 1 218750 +SOIL_WATER 0 4 1 19250 +SOIL_ENERGY 0 4 1 19250 +SOIL_TEXT 0 4 1 19250 +SFCWATER_MASS 0 5 1 1750 +SFCWATER_ENERGY 0 5 1 1750 +SFCWATER_DEPTH 0 5 1 1750 +USTAR 0 6 1 1750 +TSTAR 0 6 1 1750 +RSTAR 0 6 1 1750 +VEG_FRACAREA 0 6 1 1750 +VEG_LAI 0 6 1 1750 +VEG_ROUGH 0 6 1 1750 +VEG_HEIGHT 0 6 1 1750 +VEG_ALBEDO 0 6 1 1750 +VEG_TAI 0 6 1 1750 +PATCH_AREA 0 6 1 1750 +PATCH_ROUGH 0 6 1 1750 +LEAF_CLASS 0 6 1 1750 +SOIL_ROUGH 0 6 1 1750 +SFCWATER_NLEV 0 6 1 1750 +STOM_RESIST 0 6 1 1750 +GROUND_RSAT 0 6 1 1750 +GROUND_RVAP 0 6 1 1750 +VEG_WATER 0 6 1 1750 +VEG_TEMP 0 6 1 1750 +CAN_RVAP 0 6 1 1750 +CAN_TEMP 0 6 1 1750 +VEG_NDVIP 0 6 1 1750 +VEG_NDVIC 0 6 1 1750 +VEG_NDVIF 0 6 1 1750 +KPP_OLD 0 2 1 875 +KPP_NEW 0 2 1 875 +KPP_JERLOV 0 2 1 875 +KPP_OCDEPTH 0 2 1 875 +KPP_HMIX 0 2 1 875 +KPP_BOTTOMT 0 2 1 875 +KPP_SREF 0 2 1 875 +KPP_FREEZ_FLAG 0 2 1 875 +KPP_RESET_FLAG 0 2 1 875 +KPP_FLX_UST 0 2 1 875 +KPP_FLX_VST 0 2 1 875 +KPP_FLX_NSW 0 2 1 875 +KPP_FLX_NLW 0 2 1 875 +KPP_FLX_ICE 0 2 1 875 +KPP_FLX_PCP 0 2 1 875 +KPP_SWDK_OPT 0 10 1 42000 +KPP_SWFRAC 0 10 1 42000 +KPP_SAL_CLIM 0 10 1 42000 +KPP_OCNT_CLIM 0 10 1 42000 +KPP_BUOY 0 10 1 42000 +KPP_U 0 10 1 42000 +KPP_V 0 10 1 42000 +KPP_U_init 0 10 1 42000 +KPP_V_init 0 10 1 42000 +KPP_US0 0 10 1 42000 +KPP_US1 0 10 1 42000 +KPP_VS0 0 10 1 42000 +KPP_VS1 0 10 1 42000 +KPP_X_T 0 10 1 42000 +KPP_X_S 0 10 1 42000 +KPP_XS_T0 0 10 1 42000 +KPP_XS_T1 0 10 1 42000 +KPP_XS_S0 0 10 1 42000 +KPP_XS_S1 0 10 1 42000 +RCP 0 3 1 218750 +RDP 0 3 1 218750 +RRP 0 3 1 218750 +RPP 0 3 1 218750 +RSP 0 3 1 218750 +RAP 0 3 1 218750 +RGP 0 3 1 218750 +RHP 0 3 1 218750 +CCP 0 3 1 218750 +CDP 0 3 1 218750 +CRP 0 3 1 218750 +CPP 0 3 1 218750 +CSP 0 3 1 218750 +CAP 0 3 1 218750 +CGP 0 3 1 218750 +CHP 0 3 1 218750 +Q2 0 3 1 218750 +Q6 0 3 1 218750 +Q7 0 3 1 218750 +CCCNP 0 3 1 218750 +GCCNP 0 3 1 218750 +CCCMP 0 3 1 218750 +GCCMP 0 3 1 218750 +MD1NP 0 3 1 218750 +MD2NP 0 3 1 218750 +MD1MP 0 3 1 218750 +MD2MP 0 3 1 218750 +SALT_FILM_NP 0 3 1 218750 +SALT_JET_NP 0 3 1 218750 +SALT_SPUM_NP 0 3 1 218750 +SALT_FILM_MP 0 3 1 218750 +SALT_JET_MP 0 3 1 218750 +SALT_SPUM_MP 0 3 1 218750 +REGEN_AERO1_NP 0 3 1 218750 +REGEN_AERO1_MP 0 3 1 218750 +REGEN_AERO2_NP 0 3 1 218750 +REGEN_AERO2_MP 0 3 1 218750 +IMMERCP 0 3 1 218750 +IMMERDP 0 3 1 218750 +IMMERRP 0 3 1 218750 +IFNNUCP 0 3 1 218750 +CNMCP 0 3 1 218750 +CNMDP 0 3 1 218750 +CNMRP 0 3 1 218750 +CNMPP 0 3 1 218750 +CNMSP 0 3 1 218750 +CNMAP 0 3 1 218750 +CNMGP 0 3 1 218750 +CNMHP 0 3 1 218750 +DNMCP 0 3 1 218750 +DNMDP 0 3 1 218750 +DNMRP 0 3 1 218750 +DNMPP 0 3 1 218750 +DNMSP 0 3 1 218750 +DNMAP 0 3 1 218750 +DNMGP 0 3 1 218750 +DNMHP 0 3 1 218750 +DINCP 0 3 1 218750 +DINDP 0 3 1 218750 +DINRP 0 3 1 218750 +DINPP 0 3 1 218750 +DINSP 0 3 1 218750 +DINAP 0 3 1 218750 +DINGP 0 3 1 218750 +DINHP 0 3 1 218750 +SNMCP 0 3 1 218750 +SNMDP 0 3 1 218750 +SNMRP 0 3 1 218750 +SNMPP 0 3 1 218750 +SNMSP 0 3 1 218750 +SNMAP 0 3 1 218750 +SNMGP 0 3 1 218750 +SNMHP 0 3 1 218750 +RESOL_AERO1_MP 0 3 1 218750 +RESOL_AERO2_MP 0 3 1 218750 +PCPVR 0 3 1 218750 +PCPVP 0 3 1 218750 +PCPVS 0 3 1 218750 +PCPVA 0 3 1 218750 +PCPVG 0 3 1 218750 +PCPVH 0 3 1 218750 +PCPVD 0 3 1 218750 +LATHEATVAP 0 3 1 218750 +LATHEATFRZ 0 3 1 218750 +NUCCLDRT 0 3 1 218750 +CLD2RAINT 0 3 1 218750 +ICE2RAINT 0 3 1 218750 +NUCICERT 0 3 1 218750 +VAPLIQT 0 3 1 218750 +VAPICET 0 3 1 218750 +MELTICET 0 3 1 218750 +RIMECLDT 0 3 1 218750 +RAIN2ICET 0 3 1 218750 +AGGREGATET 0 3 1 218750 +LATHEATVAPT 0 3 1 218750 +LATHEATFRZT 0 3 1 218750 +INUCHOMRT 0 3 1 218750 +INUCCONTRT 0 3 1 218750 +INUCIFNRT 0 3 1 218750 +INUCHAZRT 0 3 1 218750 +VAPCLDT 0 3 1 218750 +VAPRAINT 0 3 1 218750 +VAPPRIST 0 3 1 218750 +VAPSNOWT 0 3 1 218750 +VAPAGGRT 0 3 1 218750 +VAPGRAUT 0 3 1 218750 +VAPHAILT 0 3 1 218750 +VAPDRIZT 0 3 1 218750 +MELTPRIST 0 3 1 218750 +MELTSNOWT 0 3 1 218750 +MELTAGGRT 0 3 1 218750 +MELTGRAUT 0 3 1 218750 +MELTHAILT 0 3 1 218750 +RIMECLDSNOWT 0 3 1 218750 +RIMECLDAGGRT 0 3 1 218750 +RIMECLDGRAUT 0 3 1 218750 +RIMECLDHAILT 0 3 1 218750 +RAIN2PRT 0 3 1 218750 +RAIN2SNT 0 3 1 218750 +RAIN2AGT 0 3 1 218750 +RAIN2GRT 0 3 1 218750 +RAIN2HAT 0 3 1 218750 +AGGRSELFPRIST 0 3 1 218750 +AGGRSELFSNOWT 0 3 1 218750 +AGGRPRISSNOWT 0 3 1 218750 +DUST1CLDRT 0 3 1 218750 +DUST2CLDRT 0 3 1 218750 +DUST1DRZRT 0 3 1 218750 +DUST2DRZRT 0 3 1 218750 +ACCPR 0 2 1 875 +ACCPP 0 2 1 875 +ACCPS 0 2 1 875 +ACCPA 0 2 1 875 +ACCPG 0 2 1 875 +ACCPH 0 2 1 875 +ACCPD 0 2 1 875 +PCPRR 0 2 1 875 +PCPRP 0 2 1 875 +PCPRS 0 2 1 875 +PCPRA 0 2 1 875 +PCPRG 0 2 1 875 +PCPRH 0 2 1 875 +PCPRD 0 2 1 875 +PCPG 0 2 1 875 +QPCPG 0 2 1 875 +DPCPG 0 2 1 875 +ACCPAERO 0 2 1 875 +PCPRAERO 0 2 1 875 +ACCPDUST 0 2 1 875 +PCPRDUST 0 2 1 875 +FTHRD 0 3 1 218750 +BEXT 0 3 1 218750 +SWUP 0 3 1 218750 +SWDN 0 3 1 218750 +LWUP 0 3 1 218750 +LWDN 0 3 1 218750 +RSHORT 0 2 1 875 +RLONG 0 2 1 875 +RLONGUP 0 2 1 875 +ALBEDT 0 2 1 875 +COSZ 0 2 1 875 +AODT 0 2 1 875 +RHKM 0 3 1 218750 +RVKM 0 3 1 218750 +RVKH 0 3 1 218750 +SFLUX_U 0 2 1 875 +SFLUX_V 0 2 1 875 +SFLUX_W 0 2 1 875 +SFLUX_T 0 2 1 875 +SFLUX_R 0 2 1 875 +TOPT 0 2 1 875 +GLAT 0 2 1 875 +GLON 0 2 1 875 +TOPZO 0 2 1 875 +PI 1 3 1 218750 +HKH 1 3 1 218750 +VKH 1 3 1 218750 +__expnme + 1 +RAMS Simulations +__initial + 1 + 1 +__initorig + 1 + 1 +__jdim + 1 + 1 +__iyear1 + 1 + 1991 +__imonth1 + 1 + 4 +__idate1 + 1 + 26 +__itime1 + 1 + 2100 +__time + 1 + 0.150000000000000000E+04 +__nsndg + 1 + 35 +__us + 35 + -0.271000003814697266E+01 + -0.271000003814697266E+01 + -0.353999996185302734E+01 + -0.339000010490417480E+01 + -0.277999997138977051E+01 + -0.174000000953674316E+01 + -0.360000014305114746E+00 + 0.125000000000000000E+01 + 0.294000005722045898E+01 + 0.457999992370605469E+01 + 0.607000017166137695E+01 + 0.730000019073486328E+01 + 0.852999973297119141E+01 + 0.967000007629394531E+01 + 0.108999996185302734E+02 + 0.120900001525878906E+02 + 0.128400001525878906E+02 + 0.151300001144409180E+02 + 0.167000007629394531E+02 + 0.173600006103515625E+02 + 0.174400005340576172E+02 + 0.170400009155273438E+02 + 0.168299999237060547E+02 + 0.170599994659423828E+02 + 0.183799991607666016E+02 + 0.203899993896484375E+02 + 0.233099994659423828E+02 + 0.281800003051757813E+02 + 0.248199996948242188E+02 + 0.211499996185302734E+02 + 0.175100002288818359E+02 + 0.965999984741210938E+01 + 0.200999999046325684E+01 + 0.500000000000000000E+00 + -0.103999996185302734E+01 +__vs + 35 + 0.838000011444091797E+01 + 0.838000011444091797E+01 + 0.106599998474121094E+02 + 0.122500000000000000E+02 + 0.134600000381469727E+02 + 0.142600002288818359E+02 + 0.146400003433227539E+02 + 0.146599998474121094E+02 + 0.144099998474121094E+02 + 0.140299997329711914E+02 + 0.137200002670288086E+02 + 0.136199998855590820E+02 + 0.138299999237060547E+02 + 0.142600002288818359E+02 + 0.154700002670288086E+02 + 0.160300006866455078E+02 + 0.188700008392333984E+02 + 0.190900001525878906E+02 + 0.186000003814697266E+02 + 0.189099998474121094E+02 + 0.199799995422363281E+02 + 0.211800003051757813E+02 + 0.216200008392333984E+02 + 0.218400001525878906E+02 + 0.223400001525878906E+02 + 0.227000007629394531E+02 + 0.227399997711181641E+02 + 0.198400001525878906E+02 + 0.181599998474121094E+02 + 0.161700000762939453E+02 + 0.118999996185302734E+02 + 0.850000000000000000E+01 + 0.347000002861022949E+01 + 0.350000000000000000E+01 + 0.352999997138977051E+01 +__ts + 35 + 0.306079376220703125E+03 + 0.305112518310546875E+03 + 0.303622192382812500E+03 + 0.302135650634765625E+03 + 0.300582458496093750E+03 + 0.298970092773437500E+03 + 0.297265472412109375E+03 + 0.295463653564453125E+03 + 0.293529083251953125E+03 + 0.291434265136718750E+03 + 0.289150360107421875E+03 + 0.286665008544921875E+03 + 0.284018432617187500E+03 + 0.281624572753906250E+03 + 0.279662200927734375E+03 + 0.277406005859375000E+03 + 0.274758117675781250E+03 + 0.271294006347656250E+03 + 0.267552581787109375E+03 + 0.263083618164062500E+03 + 0.258075958251953125E+03 + 0.252843017578125000E+03 + 0.246956115722656250E+03 + 0.240328781127929687E+03 + 0.232743484497070312E+03 + 0.224288635253906250E+03 + 0.215936080932617187E+03 + 0.210840881347656250E+03 + 0.210143768310546875E+03 + 0.208462387084960937E+03 + 0.205940200805664062E+03 + 0.201693786621093750E+03 + 0.198953125000000000E+03 + 0.194737899780273437E+03 + 0.189301940917968750E+03 +__thds + 35 + 0.306959991455078125E+03 + 0.306960021972656250E+03 + 0.306529998779296875E+03 + 0.306209960937500000E+03 + 0.305939971923828125E+03 + 0.305740020751953125E+03 + 0.305589965820312500E+03 + 0.305500000000000000E+03 + 0.305450012207031250E+03 + 0.305429992675781250E+03 + 0.305429992675781250E+03 + 0.305459991455078125E+03 + 0.305589965820312500E+03 + 0.306299987792968750E+03 + 0.307829986572265625E+03 + 0.309429992675781250E+03 + 0.311029968261718750E+03 + 0.312190032958984375E+03 + 0.313570007324218750E+03 + 0.314700012207031250E+03 + 0.315859985351562500E+03 + 0.317509979248046875E+03 + 0.319209991455078125E+03 + 0.320940002441406250E+03 + 0.322510009765625000E+03 + 0.324149963378906250E+03 + 0.327439971923828125E+03 + 0.337469970703125000E+03 + 0.357589996337890625E+03 + 0.379390014648437500E+03 + 0.403859985351562500E+03 + 0.429979980468750000E+03 + 0.465670013427734375E+03 + 0.503269989013671875E+03 + 0.541519958496093750E+03 +__ps + 35 + 0.990000000000000000E+05 + 0.979103046875000000E+05 + 0.967206328125000000E+05 + 0.954221953125000000E+05 + 0.940067812500000000E+05 + 0.924657890625000000E+05 + 0.907903359375000000E+05 + 0.889713671875000000E+05 + 0.869998593750000000E+05 + 0.848665859375000000E+05 + 0.825626484375000000E+05 + 0.800791093750000000E+05 + 0.774072031250000000E+05 + 0.745411562500000000E+05 + 0.714829531250000000E+05 + 0.682369765625000000E+05 + 0.648056328125000000E+05 + 0.611899843750000000E+05 + 0.573959570312500000E+05 + 0.534349296875000000E+05 + 0.493217070312500000E+05 + 0.450816445312500000E+05 + 0.407470156250000000E+05 + 0.363542890625000000E+05 + 0.319460332031250000E+05 + 0.275735761718750000E+05 + 0.233073164062500000E+05 + 0.192918867187500000E+05 + 0.155726064453125000E+05 + 0.123097558593750000E+05 + 0.947972363281250000E+04 + 0.707827929687500000E+04 + 0.510501708984375000E+04 + 0.360986938476562500E+04 + 0.253038891601562500E+04 +__hs + 35 + 0.000000000000000000E+00 + 0.100002868652343750E+03 + 0.210000503540039062E+03 + 0.330998321533203125E+03 + 0.464095123291015625E+03 + 0.610502075195312500E+03 + 0.771550354003906250E+03 + 0.948713012695312500E+03 + 0.114357568359375000E+04 + 0.135793383789062500E+04 + 0.159372290039062500E+04 + 0.185310449218750000E+04 + 0.213841821289062500E+04 + 0.245225878906250000E+04 + 0.279748461914062500E+04 + 0.317723657226562500E+04 + 0.359496240234375000E+04 + 0.405446093750000000E+04 + 0.455991406250000000E+04 + 0.511591503906250000E+04 + 0.572751757812500000E+04 + 0.640028662109375000E+04 + 0.714033789062500000E+04 + 0.795439843750000000E+04 + 0.884990039062500000E+04 + 0.983496484375000000E+04 + 0.109185126953125000E+05 + 0.121001347656250000E+05 + 0.134203779296875000E+05 + 0.148615781250000000E+05 + 0.164467695312500000E+05 + 0.181904414062500000E+05 + 0.201076933593750000E+05 + 0.221054843750000000E+05 + 0.241034882812500000E+05 +__ihtran + 1 + 0 +__ngrids + 1 + 1 +__nzg + 1 + 11 +__nzs + 1 + 1 +__npatch + 1 + 2 +__nvegpat + 1 + 1 +__nkppz + 1 + 48 +__ztop + 1 + 0.200100156250000000E+05 +__polelat + 1 + 0.370000000000000000E+02 +__polelon + 1 + -0.975000000000000000E+02 +__nnxp + 1 + 25 +__nnyp + 1 + 35 +__nnzp + 1 + 250 +__nstratx + 1 + 1 +__nstraty + 1 + 1 +__nxtnest + 1 + 0 +__ninest + 1 + 1 +__njnest + 1 + 1 +__nknest + 1 + 1 +__deltaxn + 1 + 0.200000000000000000E+04 +__deltazn + 1 + 0.100000000000000000E+02 +__nestz + 1 + 0 +__nstratz + 250 + 1 + 1 + 3 + 3 + 3 + 3 + 2 + 2 + 2 + 2 + 1 + 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 + 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 + 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 + 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 + 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 + 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 + 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 + 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 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 +__ngbegun + 1 + 1 +__iref + 1 + 0 +__jref + 1 + 0 +__topref + 1 + 0.000000000000000000E+00 +__xmn01 + 25 + -0.230000000000000000E+05 + -0.210000000000000000E+05 + -0.190000000000000000E+05 + -0.170000000000000000E+05 + -0.150000000000000000E+05 + -0.130000000000000000E+05 + -0.110000000000000000E+05 + -0.900000000000000000E+04 + -0.700000000000000000E+04 + -0.500000000000000000E+04 + -0.300000000000000000E+04 + -0.100000000000000000E+04 + 0.100000000000000000E+04 + 0.300000000000000000E+04 + 0.500000000000000000E+04 + 0.700000000000000000E+04 + 0.900000000000000000E+04 + 0.110000000000000000E+05 + 0.130000000000000000E+05 + 0.150000000000000000E+05 + 0.170000000000000000E+05 + 0.190000000000000000E+05 + 0.210000000000000000E+05 + 0.230000000000000000E+05 + 0.250000000000000000E+05 +__xtn01 + 25 + -0.240000000000000000E+05 + -0.220000000000000000E+05 + -0.200000000000000000E+05 + -0.180000000000000000E+05 + -0.160000000000000000E+05 + -0.140000000000000000E+05 + -0.120000000000000000E+05 + -0.100000000000000000E+05 + -0.800000000000000000E+04 + -0.600000000000000000E+04 + -0.400000000000000000E+04 + -0.200000000000000000E+04 + 0.000000000000000000E+00 + 0.200000000000000000E+04 + 0.400000000000000000E+04 + 0.600000000000000000E+04 + 0.800000000000000000E+04 + 0.100000000000000000E+05 + 0.120000000000000000E+05 + 0.140000000000000000E+05 + 0.160000000000000000E+05 + 0.180000000000000000E+05 + 0.200000000000000000E+05 + 0.220000000000000000E+05 + 0.240000000000000000E+05 +__ymn01 + 35 + -0.330000000000000000E+05 + -0.310000000000000000E+05 + -0.290000000000000000E+05 + -0.270000000000000000E+05 + -0.250000000000000000E+05 + -0.230000000000000000E+05 + -0.210000000000000000E+05 + -0.190000000000000000E+05 + -0.170000000000000000E+05 + -0.150000000000000000E+05 + -0.130000000000000000E+05 + -0.110000000000000000E+05 + -0.900000000000000000E+04 + -0.700000000000000000E+04 + -0.500000000000000000E+04 + -0.300000000000000000E+04 + -0.100000000000000000E+04 + 0.100000000000000000E+04 + 0.300000000000000000E+04 + 0.500000000000000000E+04 + 0.700000000000000000E+04 + 0.900000000000000000E+04 + 0.110000000000000000E+05 + 0.130000000000000000E+05 + 0.150000000000000000E+05 + 0.170000000000000000E+05 + 0.190000000000000000E+05 + 0.210000000000000000E+05 + 0.230000000000000000E+05 + 0.250000000000000000E+05 + 0.270000000000000000E+05 + 0.290000000000000000E+05 + 0.310000000000000000E+05 + 0.330000000000000000E+05 + 0.350000000000000000E+05 +__ytn01 + 35 + -0.340000000000000000E+05 + -0.320000000000000000E+05 + -0.300000000000000000E+05 + -0.280000000000000000E+05 + -0.260000000000000000E+05 + -0.240000000000000000E+05 + -0.220000000000000000E+05 + -0.200000000000000000E+05 + -0.180000000000000000E+05 + -0.160000000000000000E+05 + -0.140000000000000000E+05 + -0.120000000000000000E+05 + -0.100000000000000000E+05 + -0.800000000000000000E+04 + -0.600000000000000000E+04 + -0.400000000000000000E+04 + -0.200000000000000000E+04 + 0.000000000000000000E+00 + 0.200000000000000000E+04 + 0.400000000000000000E+04 + 0.600000000000000000E+04 + 0.800000000000000000E+04 + 0.100000000000000000E+05 + 0.120000000000000000E+05 + 0.140000000000000000E+05 + 0.160000000000000000E+05 + 0.180000000000000000E+05 + 0.200000000000000000E+05 + 0.220000000000000000E+05 + 0.240000000000000000E+05 + 0.260000000000000000E+05 + 0.280000000000000000E+05 + 0.300000000000000000E+05 + 0.320000000000000000E+05 + 0.340000000000000000E+05 +__zmn01 + 250 + 0.000000000000000000E+00 + 0.100000000000000000E+02 + 0.202999992370605469E+02 + 0.309089984893798828E+02 + 0.418362655639648438E+02 + 0.530913505554199219E+02 + 0.646840896606445313E+02 + 0.766246109008789063E+02 + 0.889233474731445313E+02 + 0.101591049194335937E+03 + 0.114638778686523437E+03 + 0.128077941894531250E+03 + 0.141920272827148437E+03 + 0.156177871704101562E+03 + 0.170863204956054687E+03 + 0.185989105224609375E+03 + 0.201568786621093750E+03 + 0.217615859985351562E+03 + 0.234144348144531250E+03 + 0.251168685913085937E+03 + 0.268703765869140625E+03 + 0.286764892578125000E+03 + 0.305367858886718750E+03 + 0.324528900146484375E+03 + 0.344264770507812500E+03 + 0.364592712402343750E+03 + 0.385530487060546875E+03 + 0.407096405029296875E+03 + 0.429309295654296875E+03 + 0.452188568115234375E+03 + 0.475754211425781250E+03 + 0.500026824951171875E+03 + 0.525027587890625000E+03 + 0.550778381347656250E+03 + 0.577301696777343750E+03 + 0.604620727539062500E+03 + 0.632759338378906250E+03 + 0.661742126464843750E+03 + 0.691594421386718750E+03 + 0.722342285156250000E+03 + 0.754012573242187500E+03 + 0.786632995605468750E+03 + 0.820232055664062500E+03 + 0.854839111328125000E+03 + 0.890484375000000000E+03 + 0.927198974609375000E+03 + 0.965015014648437500E+03 + 0.100396551513671875E+04 + 0.104408447265625000E+04 + 0.108540698242187500E+04 + 0.112796911621093750E+04 + 0.117180810546875000E+04 + 0.121696228027343750E+04 + 0.126347106933593750E+04 + 0.131137512207031250E+04 + 0.136071630859375000E+04 + 0.141153771972656250E+04 + 0.146388378906250000E+04 + 0.151780029296875000E+04 + 0.157333422851562500E+04 + 0.163053417968750000E+04 + 0.168945007324218750E+04 + 0.175013342285156250E+04 + 0.181263732910156250E+04 + 0.187701635742187500E+04 + 0.194332678222656250E+04 + 0.201162646484375000E+04 + 0.208197509765625000E+04 + 0.215443408203125000E+04 + 0.222906689453125000E+04 + 0.230593872070312500E+04 + 0.238511669921875000E+04 + 0.246666992187500000E+04 + 0.255066967773437500E+04 + 0.263718945312500000E+04 + 0.272630493164062500E+04 + 0.281809375000000000E+04 + 0.291263623046875000E+04 + 0.301001489257812500E+04 + 0.311001489257812500E+04 + 0.321001489257812500E+04 + 0.331001489257812500E+04 + 0.341001489257812500E+04 + 0.351001489257812500E+04 + 0.361001489257812500E+04 + 0.371001489257812500E+04 + 0.381001489257812500E+04 + 0.391001489257812500E+04 + 0.401001489257812500E+04 + 0.411001464843750000E+04 + 0.421001464843750000E+04 + 0.431001464843750000E+04 + 0.441001464843750000E+04 + 0.451001464843750000E+04 + 0.461001464843750000E+04 + 0.471001464843750000E+04 + 0.481001464843750000E+04 + 0.491001464843750000E+04 + 0.501001464843750000E+04 + 0.511001464843750000E+04 + 0.521001464843750000E+04 + 0.531001464843750000E+04 + 0.541001464843750000E+04 + 0.551001464843750000E+04 + 0.561001464843750000E+04 + 0.571001464843750000E+04 + 0.581001464843750000E+04 + 0.591001464843750000E+04 + 0.601001464843750000E+04 + 0.611001464843750000E+04 + 0.621001464843750000E+04 + 0.631001464843750000E+04 + 0.641001464843750000E+04 + 0.651001464843750000E+04 + 0.661001464843750000E+04 + 0.671001464843750000E+04 + 0.681001464843750000E+04 + 0.691001464843750000E+04 + 0.701001464843750000E+04 + 0.711001464843750000E+04 + 0.721001464843750000E+04 + 0.731001464843750000E+04 + 0.741001464843750000E+04 + 0.751001464843750000E+04 + 0.761001464843750000E+04 + 0.771001464843750000E+04 + 0.781001464843750000E+04 + 0.791001464843750000E+04 + 0.801001464843750000E+04 + 0.811001464843750000E+04 + 0.821001464843750000E+04 + 0.831001464843750000E+04 + 0.841001464843750000E+04 + 0.851001464843750000E+04 + 0.861001464843750000E+04 + 0.871001464843750000E+04 + 0.881001464843750000E+04 + 0.891001464843750000E+04 + 0.901001464843750000E+04 + 0.911001464843750000E+04 + 0.921001464843750000E+04 + 0.931001464843750000E+04 + 0.941001464843750000E+04 + 0.951001464843750000E+04 + 0.961001464843750000E+04 + 0.971001464843750000E+04 + 0.981001464843750000E+04 + 0.991001464843750000E+04 + 0.100100146484375000E+05 + 0.101100146484375000E+05 + 0.102100146484375000E+05 + 0.103100146484375000E+05 + 0.104100146484375000E+05 + 0.105100146484375000E+05 + 0.106100146484375000E+05 + 0.107100146484375000E+05 + 0.108100146484375000E+05 + 0.109100146484375000E+05 + 0.110100146484375000E+05 + 0.111100146484375000E+05 + 0.112100146484375000E+05 + 0.113100146484375000E+05 + 0.114100146484375000E+05 + 0.115100146484375000E+05 + 0.116100146484375000E+05 + 0.117100146484375000E+05 + 0.118100146484375000E+05 + 0.119100146484375000E+05 + 0.120100146484375000E+05 + 0.121100146484375000E+05 + 0.122100146484375000E+05 + 0.123100146484375000E+05 + 0.124100146484375000E+05 + 0.125100146484375000E+05 + 0.126100146484375000E+05 + 0.127100146484375000E+05 + 0.128100146484375000E+05 + 0.129100146484375000E+05 + 0.130100146484375000E+05 + 0.131100146484375000E+05 + 0.132100146484375000E+05 + 0.133100146484375000E+05 + 0.134100146484375000E+05 + 0.135100146484375000E+05 + 0.136100146484375000E+05 + 0.137100146484375000E+05 + 0.138100146484375000E+05 + 0.139100146484375000E+05 + 0.140100146484375000E+05 + 0.141100146484375000E+05 + 0.142100146484375000E+05 + 0.143100146484375000E+05 + 0.144100146484375000E+05 + 0.145100146484375000E+05 + 0.146100146484375000E+05 + 0.147100146484375000E+05 + 0.148100146484375000E+05 + 0.149100146484375000E+05 + 0.150100146484375000E+05 + 0.151100146484375000E+05 + 0.152100146484375000E+05 + 0.153100146484375000E+05 + 0.154100146484375000E+05 + 0.155100146484375000E+05 + 0.156100146484375000E+05 + 0.157100146484375000E+05 + 0.158100146484375000E+05 + 0.159100146484375000E+05 + 0.160100146484375000E+05 + 0.161100146484375000E+05 + 0.162100146484375000E+05 + 0.163100146484375000E+05 + 0.164100156250000000E+05 + 0.165100156250000000E+05 + 0.166100156250000000E+05 + 0.167100156250000000E+05 + 0.168100156250000000E+05 + 0.169100156250000000E+05 + 0.170100156250000000E+05 + 0.171100156250000000E+05 + 0.172100156250000000E+05 + 0.173100156250000000E+05 + 0.174100156250000000E+05 + 0.175100156250000000E+05 + 0.176100156250000000E+05 + 0.177100156250000000E+05 + 0.178100156250000000E+05 + 0.179100156250000000E+05 + 0.180100156250000000E+05 + 0.181100156250000000E+05 + 0.182100156250000000E+05 + 0.183100156250000000E+05 + 0.184100156250000000E+05 + 0.185100156250000000E+05 + 0.186100156250000000E+05 + 0.187100156250000000E+05 + 0.188100156250000000E+05 + 0.189100156250000000E+05 + 0.190100156250000000E+05 + 0.191100156250000000E+05 + 0.192100156250000000E+05 + 0.193100156250000000E+05 + 0.194100156250000000E+05 + 0.195100156250000000E+05 + 0.196100156250000000E+05 + 0.197100156250000000E+05 + 0.198100156250000000E+05 + 0.199100156250000000E+05 + 0.200100156250000000E+05 + 0.201100156250000000E+05 +__ztn01 + 250 + -0.489024114608764648E+01 + 0.496305179595947266E+01 + 0.151119432449340820E+02 + 0.255652999877929688E+02 + 0.363322563171386719E+02 + 0.474222221374511719E+02 + 0.588448867797851563E+02 + 0.706102294921875000E+02 + 0.827285385131835938E+02 + 0.952103958129882813E+02 + 0.108066703796386719E+03 + 0.121308708190917969E+03 + 0.134947967529296875E+03 + 0.148996398925781250E+03 + 0.163466278076171875E+03 + 0.178370269775390625E+03 + 0.193721374511718750E+03 + 0.209533035278320312E+03 + 0.225819030761718750E+03 + 0.242593612670898437E+03 + 0.259871429443359375E+03 + 0.277667602539062500E+03 + 0.295997650146484375E+03 + 0.314877593994140625E+03 + 0.334323913574218750E+03 + 0.354353637695312500E+03 + 0.374984252929687500E+03 + 0.396233764648437500E+03 + 0.418120788574218750E+03 + 0.440664398193359375E+03 + 0.463884307861328125E+03 + 0.487800842285156250E+03 + 0.512434814453125000E+03 + 0.537807861328125000E+03 + 0.563942016601562500E+03 + 0.590860290527343750E+03 + 0.618586059570312500E+03 + 0.647143615722656250E+03 + 0.676557983398437500E+03 + 0.706854736328125000E+03 + 0.738060424804687500E+03 + 0.770202270507812500E+03 + 0.803308410644531250E+03 + 0.837407714843750000E+03 + 0.872530029296875000E+03 + 0.908706054687500000E+03 + 0.945967285156250000E+03 + 0.984346374511718750E+03 + 0.102387677001953125E+04 + 0.106459301757812500E+04 + 0.110653076171875000E+04 + 0.114972668457031250E+04 + 0.119421838378906250E+04 + 0.124004479980468750E+04 + 0.128724609375000000E+04 + 0.133586340332031250E+04 + 0.138593920898437500E+04 + 0.143751733398437500E+04 + 0.149064282226562500E+04 + 0.154536206054687500E+04 + 0.160172290039062500E+04 + 0.165977441406250000E+04 + 0.171956750488281250E+04 + 0.178115441894531250E+04 + 0.184458898925781250E+04 + 0.190992651367187500E+04 + 0.197722424316406250E+04 + 0.204654089355468750E+04 + 0.211793676757812500E+04 + 0.219147460937500000E+04 + 0.226721875000000000E+04 + 0.234523510742187500E+04 + 0.242559204101562500E+04 + 0.250835937500000000E+04 + 0.259360986328125000E+04 + 0.268141796875000000E+04 + 0.277186010742187500E+04 + 0.286501562500000000E+04 + 0.296098388671875000E+04 + 0.305984887695312500E+04 + 0.316001489257812500E+04 + 0.326001489257812500E+04 + 0.336001489257812500E+04 + 0.346001489257812500E+04 + 0.356001489257812500E+04 + 0.366001489257812500E+04 + 0.376001489257812500E+04 + 0.386001489257812500E+04 + 0.396001489257812500E+04 + 0.406001464843750000E+04 + 0.416001464843750000E+04 + 0.426001464843750000E+04 + 0.436001464843750000E+04 + 0.446001464843750000E+04 + 0.456001464843750000E+04 + 0.466001464843750000E+04 + 0.476001464843750000E+04 + 0.486001464843750000E+04 + 0.496001464843750000E+04 + 0.506001464843750000E+04 + 0.516001464843750000E+04 + 0.526001464843750000E+04 + 0.536001464843750000E+04 + 0.546001464843750000E+04 + 0.556001464843750000E+04 + 0.566001464843750000E+04 + 0.576001464843750000E+04 + 0.586001464843750000E+04 + 0.596001464843750000E+04 + 0.606001464843750000E+04 + 0.616001464843750000E+04 + 0.626001464843750000E+04 + 0.636001464843750000E+04 + 0.646001464843750000E+04 + 0.656001464843750000E+04 + 0.666001464843750000E+04 + 0.676001464843750000E+04 + 0.686001464843750000E+04 + 0.696001464843750000E+04 + 0.706001464843750000E+04 + 0.716001464843750000E+04 + 0.726001464843750000E+04 + 0.736001464843750000E+04 + 0.746001464843750000E+04 + 0.756001464843750000E+04 + 0.766001464843750000E+04 + 0.776001464843750000E+04 + 0.786001464843750000E+04 + 0.796001464843750000E+04 + 0.806001464843750000E+04 + 0.816001464843750000E+04 + 0.826001464843750000E+04 + 0.836001464843750000E+04 + 0.846001464843750000E+04 + 0.856001464843750000E+04 + 0.866001464843750000E+04 + 0.876001464843750000E+04 + 0.886001464843750000E+04 + 0.896001464843750000E+04 + 0.906001464843750000E+04 + 0.916001464843750000E+04 + 0.926001464843750000E+04 + 0.936001464843750000E+04 + 0.946001464843750000E+04 + 0.956001464843750000E+04 + 0.966001464843750000E+04 + 0.976001464843750000E+04 + 0.986001464843750000E+04 + 0.996001464843750000E+04 + 0.100600146484375000E+05 + 0.101600146484375000E+05 + 0.102600146484375000E+05 + 0.103600146484375000E+05 + 0.104600146484375000E+05 + 0.105600146484375000E+05 + 0.106600146484375000E+05 + 0.107600146484375000E+05 + 0.108600146484375000E+05 + 0.109600146484375000E+05 + 0.110600146484375000E+05 + 0.111600146484375000E+05 + 0.112600146484375000E+05 + 0.113600146484375000E+05 + 0.114600146484375000E+05 + 0.115600146484375000E+05 + 0.116600146484375000E+05 + 0.117600146484375000E+05 + 0.118600146484375000E+05 + 0.119600146484375000E+05 + 0.120600146484375000E+05 + 0.121600146484375000E+05 + 0.122600146484375000E+05 + 0.123600146484375000E+05 + 0.124600146484375000E+05 + 0.125600146484375000E+05 + 0.126600146484375000E+05 + 0.127600146484375000E+05 + 0.128600146484375000E+05 + 0.129600146484375000E+05 + 0.130600146484375000E+05 + 0.131600146484375000E+05 + 0.132600146484375000E+05 + 0.133600146484375000E+05 + 0.134600146484375000E+05 + 0.135600146484375000E+05 + 0.136600146484375000E+05 + 0.137600146484375000E+05 + 0.138600146484375000E+05 + 0.139600146484375000E+05 + 0.140600146484375000E+05 + 0.141600146484375000E+05 + 0.142600146484375000E+05 + 0.143600146484375000E+05 + 0.144600146484375000E+05 + 0.145600146484375000E+05 + 0.146600146484375000E+05 + 0.147600146484375000E+05 + 0.148600146484375000E+05 + 0.149600146484375000E+05 + 0.150600146484375000E+05 + 0.151600146484375000E+05 + 0.152600146484375000E+05 + 0.153600146484375000E+05 + 0.154600146484375000E+05 + 0.155600146484375000E+05 + 0.156600146484375000E+05 + 0.157600146484375000E+05 + 0.158600146484375000E+05 + 0.159600146484375000E+05 + 0.160600146484375000E+05 + 0.161600146484375000E+05 + 0.162600146484375000E+05 + 0.163600156250000000E+05 + 0.164600156250000000E+05 + 0.165600156250000000E+05 + 0.166600156250000000E+05 + 0.167600156250000000E+05 + 0.168600156250000000E+05 + 0.169600156250000000E+05 + 0.170600156250000000E+05 + 0.171600156250000000E+05 + 0.172600156250000000E+05 + 0.173600156250000000E+05 + 0.174600156250000000E+05 + 0.175600156250000000E+05 + 0.176600156250000000E+05 + 0.177600156250000000E+05 + 0.178600156250000000E+05 + 0.179600156250000000E+05 + 0.180600156250000000E+05 + 0.181600156250000000E+05 + 0.182600156250000000E+05 + 0.183600156250000000E+05 + 0.184600156250000000E+05 + 0.185600156250000000E+05 + 0.186600156250000000E+05 + 0.187600156250000000E+05 + 0.188600156250000000E+05 + 0.189600156250000000E+05 + 0.190600156250000000E+05 + 0.191600156250000000E+05 + 0.192600156250000000E+05 + 0.193600156250000000E+05 + 0.194600156250000000E+05 + 0.195600156250000000E+05 + 0.196600156250000000E+05 + 0.197600156250000000E+05 + 0.198600156250000000E+05 + 0.199600156250000000E+05 + 0.200600156250000000E+05 +__dzmn01 + 250 + 0.101488918066024780E+00 + 0.985329300165176392E-01 + 0.956630483269691467E-01 + 0.928767547011375427E-01 + 0.901716053485870361E-01 + 0.875452458858489990E-01 + 0.849953964352607727E-01 + 0.825197622179985046E-01 + 0.801162794232368469E-01 + 0.777828320860862732E-01 + 0.755172669887542725E-01 + 0.733177661895751953E-01 + 0.711823254823684692E-01 + 0.691090747714042664E-01 + 0.670961216092109680E-01 + 0.651418939232826233E-01 + 0.632444620132446289E-01 + 0.614024475216865540E-01 + 0.596140027046203613E-01 + 0.578776821494102478E-01 + 0.561918579041957855E-01 + 0.545552335679531097E-01 + 0.529662594199180603E-01 + 0.514236129820346832E-01 + 0.499258004128932953E-01 + 0.484716519713401794E-01 + 0.470599047839641571E-01 + 0.456891730427742004E-01 + 0.443584695458412170E-01 + 0.430664904415607452E-01 + 0.418120771646499634E-01 + 0.405943468213081360E-01 + 0.394118987023830414E-01 + 0.382641032338142395E-01 + 0.371494852006435394E-01 + 0.360675305128097534E-01 + 0.350170023739337921E-01 + 0.339969918131828308E-01 + 0.330068357288837433E-01 + 0.320454388856887817E-01 + 0.311120897531509399E-01 + 0.302058774977922440E-01 + 0.293261110782623291E-01 + 0.284719280898571014E-01 + 0.276426170021295547E-01 + 0.268375463783740997E-01 + 0.260558556765317917E-01 + 0.252969898283481598E-01 + 0.245602205395698547E-01 + 0.238448679447174072E-01 + 0.231503322720527649E-01 + 0.224761031568050385E-01 + 0.218214746564626694E-01 + 0.211858600378036499E-01 + 0.205688066780567169E-01 + 0.199697241187095642E-01 + 0.193880647420883179E-01 + 0.188233572989702225E-01 + 0.182751081883907318E-01 + 0.177428163588047028E-01 + 0.172260794788599014E-01 + 0.167243406176567078E-01 + 0.162372160702943802E-01 + 0.157642755657434464E-01 + 0.153051409870386124E-01 + 0.148593420162796974E-01 + 0.144265480339527130E-01 + 0.140064116567373276E-01 + 0.135984411463141441E-01 + 0.132023412734270096E-01 + 0.128178251907229424E-01 + 0.124444765970110893E-01 + 0.120820617303252220E-01 + 0.117301382124423981E-01 + 0.113884704187512398E-01 + 0.110567929223179817E-01 + 0.107347369194030762E-01 + 0.104201119393110275E-01 + 0.101148039102554321E-01 + 0.998342595994472504E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.100000239908695221E-01 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999990198761224747E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 +__dztn01 + 250 + 0.103000000119209290E+00 + 0.100000001490116119E+00 + 0.970873832702636719E-01 + 0.942595973610877991E-01 + 0.915141925215721130E-01 + 0.888487324118614197E-01 + 0.862608924508094788E-01 + 0.837484374642372131E-01 + 0.813091620802879333E-01 + 0.789409205317497253E-01 + 0.766416862607002258E-01 + 0.744093954563140869E-01 + 0.722421705722808838E-01 + 0.701380372047424316E-01 + 0.680951550602912903E-01 + 0.661117658019065857E-01 + 0.641861632466316223E-01 + 0.623166598379611969E-01 + 0.605016015470027924E-01 + 0.587394349277019501E-01 + 0.570285394787788391E-01 + 0.553675331175327301E-01 + 0.537548698484897614E-01 + 0.521892309188842773E-01 + 0.506691597402095795E-01 + 0.491933710873126984E-01 + 0.477605685591697693E-01 + 0.463694632053375244E-01 + 0.450189039111137390E-01 + 0.437076836824417114E-01 + 0.424346588551998138E-01 + 0.411986932158470154E-01 + 0.399987809360027313E-01 + 0.388337559998035431E-01 + 0.377026759088039398E-01 + 0.366045199334621429E-01 + 0.355383567512035370E-01 + 0.345032364130020142E-01 + 0.334982611238956451E-01 + 0.325225852429866791E-01 + 0.315753370523452759E-01 + 0.306556429713964462E-01 + 0.297627374529838562E-01 + 0.288958419114351273E-01 + 0.280542187392711639E-01 + 0.272371210157871246E-01 + 0.264438055455684662E-01 + 0.256736110895872116E-01 + 0.249258726835250854E-01 + 0.241998862475156784E-01 + 0.234950631856918335E-01 + 0.228107441216707230E-01 + 0.221463460475206375E-01 + 0.215013120323419571E-01 + 0.208750609308481216E-01 + 0.202670432627201080E-01 + 0.196767468005418777E-01 + 0.191036313772201538E-01 + 0.185471959412097931E-01 + 0.180070083588361740E-01 + 0.174825321882963181E-01 + 0.169733483344316483E-01 + 0.164789855480194092E-01 + 0.159990005195140839E-01 + 0.155330086126923561E-01 + 0.150805851444602013E-01 + 0.146413566544651985E-01 + 0.142149170860648155E-01 + 0.138009106740355492E-01 + 0.133989322930574417E-01 + 0.130086671561002731E-01 + 0.126297743991017342E-01 + 0.122619308531284332E-01 + 0.119047965854406357E-01 + 0.115580512210726738E-01 + 0.112213948741555214E-01 + 0.108945732936263084E-01 + 0.105772558599710464E-01 + 0.102691901847720146E-01 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.100000239908695221E-01 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999990198761224747E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 +__u01dn01 + 250 + -0.271000003814697266E+01 + -0.271000003814697266E+01 + -0.271000003814697266E+01 + -0.271000003814697266E+01 + -0.271000003814697266E+01 + -0.271000003814697266E+01 + -0.271000003814697266E+01 + -0.271000003814697266E+01 + -0.271000003814697266E+01 + -0.271000003814697266E+01 + -0.277084660530090332E+01 + -0.287076568603515625E+01 + -0.297368240356445313E+01 + -0.307968640327453613E+01 + -0.318887066841125488E+01 + -0.330133032798767090E+01 + -0.341716384887695313E+01 + -0.353647255897521973E+01 + -0.352038979530334473E+01 + -0.349959468841552734E+01 + -0.347817540168762207E+01 + -0.345611381530761719E+01 + -0.343339014053344727E+01 + -0.340998482704162598E+01 + -0.337475848197937012E+01 + -0.328295969963073730E+01 + -0.318840670585632324E+01 + -0.309101748466491699E+01 + -0.299070644378662109E+01 + -0.288738608360290527E+01 + -0.278096628189086914E+01 + -0.261160659790039063E+01 + -0.243661952018737793E+01 + -0.225638246536254883E+01 + -0.207073879241943359E+01 + -0.187952518463134766E+01 + -0.167072951793670654E+01 + -0.142602384090423584E+01 + -0.117397618293762207E+01 + -0.914367675781250000E+00 + -0.646970510482788086E+00 + -0.371551632881164551E+00 + -0.713925063610076904E-01 + 0.238491535186767578E+00 + 0.557672321796417236E+00 + 0.886429071426391602E+00 + 0.122504770755767822E+01 + 0.155904006958007813E+01 + 0.190187835693359375E+01 + 0.225500106811523438E+01 + 0.261871767044067383E+01 + 0.298705983161926270E+01 + 0.332745456695556641E+01 + 0.367806077003479004E+01 + 0.403918600082397461E+01 + 0.441114473342895508E+01 + 0.475697183609008789E+01 + 0.508290481567382813E+01 + 0.541861581802368164E+01 + 0.576439809799194336E+01 + 0.610793638229370117E+01 + 0.638321971893310547E+01 + 0.666676139831542969E+01 + 0.695880937576293945E+01 + 0.725961923599243164E+01 + 0.754496240615844727E+01 + 0.783508586883544922E+01 + 0.813391304016113281E+01 + 0.844170379638671875E+01 + 0.872272300720214844E+01 + 0.899785709381103516E+01 + 0.928124523162841797E+01 + 0.957313537597656250E+01 + 0.986987972259521484E+01 + 0.101736173629760742E+02 + 0.104864673614501953E+02 + 0.108087024688720703E+02 + 0.111116161346435547E+02 + 0.114123449325561523E+02 + 0.117221508026123047E+02 + 0.120360336303710938E+02 + 0.122386236190795898E+02 + 0.124181671142578125E+02 + 0.125977106094360352E+02 + 0.127772541046142578E+02 + 0.131642017364501953E+02 + 0.136625709533691406E+02 + 0.141609401702880859E+02 + 0.146593103408813477E+02 + 0.151472501754760742E+02 + 0.154578628540039063E+02 + 0.157684755325317383E+02 + 0.160790882110595703E+02 + 0.163896999359130859E+02 + 0.167001209259033203E+02 + 0.168188247680664063E+02 + 0.169375305175781250E+02 + 0.170562343597412109E+02 + 0.171749401092529297E+02 + 0.172936439514160156E+02 + 0.173657684326171875E+02 + 0.173788490295410156E+02 + 0.173919296264648438E+02 + 0.174050102233886719E+02 + 0.174180908203125000E+02 + 0.174311714172363281E+02 + 0.174206790924072266E+02 + 0.173612232208251953E+02 + 0.173017673492431641E+02 + 0.172423114776611328E+02 + 0.171828556060791016E+02 + 0.171233997344970703E+02 + 0.170639457702636719E+02 + 0.170230522155761719E+02 + 0.169946746826171875E+02 + 0.169662990570068359E+02 + 0.169379234313964844E+02 + 0.169095458984375000E+02 + 0.168811702728271484E+02 + 0.168527927398681641E+02 + 0.168355598449707031E+02 + 0.168638134002685547E+02 + 0.168920669555664063E+02 + 0.169203186035156250E+02 + 0.169485721588134766E+02 + 0.169768257141113281E+02 + 0.170050792694091797E+02 + 0.170333328247070313E+02 + 0.170682773590087891E+02 + 0.172156810760498047E+02 + 0.173630847930908203E+02 + 0.175104885101318359E+02 + 0.176578903198242188E+02 + 0.178052940368652344E+02 + 0.179526977539062500E+02 + 0.181001014709472656E+02 + 0.182475051879882813E+02 + 0.184006366729736328E+02 + 0.186046848297119141E+02 + 0.188087329864501953E+02 + 0.190127792358398438E+02 + 0.192168273925781250E+02 + 0.194208755493164063E+02 + 0.196249217987060547E+02 + 0.198289699554443359E+02 + 0.200330181121826172E+02 + 0.202370643615722656E+02 + 0.204575042724609375E+02 + 0.207269897460937500E+02 + 0.209964752197265625E+02 + 0.212659606933593750E+02 + 0.215354461669921875E+02 + 0.218049297332763672E+02 + 0.220744152069091797E+02 + 0.223439006805419922E+02 + 0.226133861541748047E+02 + 0.228828697204589844E+02 + 0.231523551940917969E+02 + 0.234810485839843750E+02 + 0.238931922912597656E+02 + 0.243053379058837891E+02 + 0.247174835205078125E+02 + 0.251296291351318359E+02 + 0.255417747497558594E+02 + 0.259539203643798828E+02 + 0.263660659790039063E+02 + 0.267782115936279297E+02 + 0.271903572082519531E+02 + 0.276025009155273438E+02 + 0.280146465301513672E+02 + 0.280276069641113281E+02 + 0.277731075286865234E+02 + 0.275186100006103516E+02 + 0.272641105651855469E+02 + 0.270096130371093750E+02 + 0.267551136016845703E+02 + 0.265006141662597656E+02 + 0.262461166381835938E+02 + 0.259916172027587891E+02 + 0.257371196746826172E+02 + 0.254826202392578125E+02 + 0.252281227111816406E+02 + 0.249736232757568359E+02 + 0.247190647125244141E+02 + 0.244644165039062500E+02 + 0.242097682952880859E+02 + 0.239551181793212891E+02 + 0.237004699707031250E+02 + 0.234458217620849609E+02 + 0.231911716461181641E+02 + 0.229365234375000000E+02 + 0.226818733215332031E+02 + 0.224272251129150391E+02 + 0.221725769042968750E+02 + 0.219179267883300781E+02 + 0.216632785797119141E+02 + 0.214086303710937500E+02 + 0.211539802551269531E+02 + 0.209239654541015625E+02 + 0.206943397521972656E+02 + 0.204647140502929688E+02 + 0.202350883483886719E+02 + 0.200054626464843750E+02 + 0.197758388519287109E+02 + 0.195462131500244141E+02 + 0.193165874481201172E+02 + 0.190869636535644531E+02 + 0.188573379516601563E+02 + 0.186277122497558594E+02 + 0.183980865478515625E+02 + 0.181684608459472656E+02 + 0.179388370513916016E+02 + 0.177092094421386719E+02 + 0.174503669738769531E+02 + 0.170001678466796875E+02 + 0.165499668121337891E+02 + 0.160997676849365234E+02 + 0.156495685577392578E+02 + 0.151993694305419922E+02 + 0.147491703033447266E+02 + 0.142989702224731445E+02 + 0.138487710952758789E+02 + 0.133985719680786133E+02 + 0.129483718872070313E+02 + 0.124981727600097656E+02 + 0.120479736328125000E+02 + 0.115977745056152344E+02 + 0.111475753784179688E+02 + 0.106973752975463867E+02 + 0.102471752166748047E+02 + 0.979697608947753906E+01 + 0.938239288330078125E+01 + 0.898338413238525391E+01 + 0.858437538146972656E+01 + 0.818536758422851563E+01 + 0.778635835647583008E+01 + 0.738735008239746094E+01 + 0.698834133148193359E+01 + 0.658933258056640625E+01 + 0.619032430648803711E+01 + 0.579131603240966797E+01 + 0.539230728149414063E+01 + 0.499329853057861328E+01 + 0.459428977966308594E+01 + 0.419528150558471680E+01 + 0.379627275466918945E+01 + 0.339726400375366211E+01 + 0.299825572967529297E+01 + 0.259924697875976563E+01 + 0.220023870468139648E+01 +__v01dn01 + 250 + 0.838000011444091797E+01 + 0.838000011444091797E+01 + 0.838000011444091797E+01 + 0.838000011444091797E+01 + 0.838000011444091797E+01 + 0.838000011444091797E+01 + 0.838000011444091797E+01 + 0.838000011444091797E+01 + 0.838000011444091797E+01 + 0.838000011444091797E+01 + 0.854714488983154297E+01 + 0.882162189483642578E+01 + 0.910433197021484375E+01 + 0.939552402496337891E+01 + 0.969545173645019531E+01 + 0.100043773651123047E+02 + 0.103225708007812500E+02 + 0.106503105163574219E+02 + 0.108678665161132813E+02 + 0.110882968902587891E+02 + 0.113153400421142578E+02 + 0.115491952896118164E+02 + 0.117900657653808594E+02 + 0.120381622314453125E+02 + 0.122802333831787109E+02 + 0.124623260498046875E+02 + 0.126498813629150391E+02 + 0.128430633544921875E+02 + 0.130420417785644531E+02 + 0.132469882965087891E+02 + 0.134580831527709961E+02 + 0.135895338058471680E+02 + 0.137241392135620117E+02 + 0.138627824783325195E+02 + 0.140055856704711914E+02 + 0.141526727676391602E+02 + 0.142790746688842773E+02 + 0.143464574813842773E+02 + 0.144158620834350586E+02 + 0.144873485565185547E+02 + 0.145609798431396484E+02 + 0.146368198394775391E+02 + 0.146435852050781250E+02 + 0.146474351882934570E+02 + 0.146513996124267578E+02 + 0.146554832458496094E+02 + 0.146596899032592773E+02 + 0.146142835617065430E+02 + 0.145635681152343750E+02 + 0.145113306045532227E+02 + 0.144575271606445313E+02 + 0.143990955352783203E+02 + 0.143202238082885742E+02 + 0.142389860153198242E+02 + 0.141553106307983398E+02 + 0.140691251754760742E+02 + 0.139931802749633789E+02 + 0.139253683090209961E+02 + 0.138555231094360352E+02 + 0.137835817337036133E+02 + 0.137169160842895508E+02 + 0.136945352554321289E+02 + 0.136714830398559570E+02 + 0.136477394104003906E+02 + 0.136232824325561523E+02 + 0.136618223190307617E+02 + 0.137113561630249023E+02 + 0.137623748779296875E+02 + 0.138149251937866211E+02 + 0.139026937484741211E+02 + 0.140064725875854492E+02 + 0.141133642196655273E+02 + 0.142234630584716797E+02 + 0.144566297531127930E+02 + 0.147554292678833008E+02 + 0.150631923675537109E+02 + 0.153801879882812500E+02 + 0.155695848464965820E+02 + 0.157111043930053711E+02 + 0.158568954467773438E+02 + 0.160046043395996094E+02 + 0.165927867889404297E+02 + 0.172726593017578125E+02 + 0.179525299072265625E+02 + 0.186324024200439453E+02 + 0.189011459350585938E+02 + 0.189490242004394531E+02 + 0.189969024658203125E+02 + 0.190447807312011719E+02 + 0.190846157073974609E+02 + 0.189876728057861328E+02 + 0.188907318115234375E+02 + 0.187937889099121094E+02 + 0.186968460083007813E+02 + 0.186000556945800781E+02 + 0.186558113098144531E+02 + 0.187115669250488281E+02 + 0.187673225402832031E+02 + 0.188230781555175781E+02 + 0.188788318634033203E+02 + 0.189871520996093750E+02 + 0.191621017456054688E+02 + 0.193370532989501953E+02 + 0.195120029449462891E+02 + 0.196869525909423828E+02 + 0.198619022369384766E+02 + 0.200379638671875000E+02 + 0.202163314819335938E+02 + 0.203946990966796875E+02 + 0.205730667114257813E+02 + 0.207514343261718750E+02 + 0.209298000335693359E+02 + 0.211081676483154297E+02 + 0.212155113220214844E+02 + 0.212749671936035156E+02 + 0.213344230651855469E+02 + 0.213938789367675781E+02 + 0.214533329010009766E+02 + 0.215127887725830078E+02 + 0.215722446441650391E+02 + 0.216253185272216797E+02 + 0.216523437500000000E+02 + 0.216793689727783203E+02 + 0.217063941955566406E+02 + 0.217334175109863281E+02 + 0.217604427337646484E+02 + 0.217874679565429688E+02 + 0.218144931793212891E+02 + 0.218431358337402344E+02 + 0.218989696502685547E+02 + 0.219548053741455078E+02 + 0.220106391906738281E+02 + 0.220664749145507813E+02 + 0.221223087310791016E+02 + 0.221781444549560547E+02 + 0.222339782714843750E+02 + 0.222898120880126953E+02 + 0.223436965942382813E+02 + 0.223802433013916016E+02 + 0.224167881011962891E+02 + 0.224533348083496094E+02 + 0.224898796081542969E+02 + 0.225264263153076172E+02 + 0.225629711151123047E+02 + 0.225995178222656250E+02 + 0.226360645294189453E+02 + 0.226726093292236328E+02 + 0.227009258270263672E+02 + 0.227046165466308594E+02 + 0.227083091735839844E+02 + 0.227119998931884766E+02 + 0.227156906127929688E+02 + 0.227193832397460938E+02 + 0.227230739593505859E+02 + 0.227267665863037109E+02 + 0.227304573059082031E+02 + 0.227341480255126953E+02 + 0.227378406524658203E+02 + 0.226381435394287109E+02 + 0.223927173614501953E+02 + 0.221472930908203125E+02 + 0.219018669128417969E+02 + 0.216564426422119141E+02 + 0.214110164642333984E+02 + 0.211655921936035156E+02 + 0.209201660156250000E+02 + 0.206747417449951172E+02 + 0.204293155670166016E+02 + 0.201838912963867188E+02 + 0.199384651184082031E+02 + 0.197638034820556641E+02 + 0.196365547180175781E+02 + 0.195093040466308594E+02 + 0.193820552825927734E+02 + 0.192548065185546875E+02 + 0.191275577545166016E+02 + 0.190003070831298828E+02 + 0.188730583190917969E+02 + 0.187458095550537109E+02 + 0.186185588836669922E+02 + 0.184913101196289063E+02 + 0.183640613555908203E+02 + 0.182368125915527344E+02 + 0.181052703857421875E+02 + 0.179671897888183594E+02 + 0.178291110992431641E+02 + 0.176910324096679688E+02 + 0.175529518127441406E+02 + 0.174148731231689453E+02 + 0.172767944335937500E+02 + 0.171387138366699219E+02 + 0.170006351470947266E+02 + 0.168625564575195313E+02 + 0.167244758605957031E+02 + 0.165863971710205078E+02 + 0.164483184814453125E+02 + 0.163102378845214844E+02 + 0.161721591949462891E+02 + 0.159048433303833008E+02 + 0.156354751586914063E+02 + 0.153661069869995117E+02 + 0.150967388153076172E+02 + 0.148273706436157227E+02 + 0.145580024719238281E+02 + 0.142886343002319336E+02 + 0.140192661285400391E+02 + 0.137498989105224609E+02 + 0.134805297851562500E+02 + 0.132111625671386719E+02 + 0.129417934417724609E+02 + 0.126724262237548828E+02 + 0.124030580520629883E+02 + 0.121336870193481445E+02 + 0.118741712570190430E+02 + 0.116791801452636719E+02 + 0.114841890335083008E+02 + 0.112891988754272461E+02 + 0.110942077636718750E+02 + 0.108992166519165039E+02 + 0.107042264938354492E+02 + 0.105092353820800781E+02 + 0.103142442703247070E+02 + 0.101192541122436523E+02 + 0.992426300048828125E+01 + 0.972927188873291016E+01 + 0.953428173065185547E+01 + 0.933929061889648438E+01 + 0.914429950714111328E+01 + 0.894930934906005859E+01 + 0.875431823730468750E+01 + 0.855932712554931641E+01 + 0.831746864318847656E+01 + 0.805511379241943359E+01 + 0.779275941848754883E+01 + 0.753040504455566406E+01 + 0.726805019378662109E+01 + 0.700569534301757813E+01 + 0.674334096908569336E+01 + 0.648098659515380859E+01 + 0.621863174438476563E+01 + 0.595627689361572266E+01 + 0.569392204284667969E+01 + 0.543156766891479492E+01 + 0.516921281814575195E+01 + 0.490685844421386719E+01 + 0.464450359344482422E+01 + 0.438214921951293945E+01 + 0.411979436874389648E+01 + 0.385743951797485352E+01 + 0.359508514404296875E+01 +__pi01dn01 + 250 + 0.100127435302734375E+04 + 0.100096276855468750E+04 + 0.100064184570312500E+04 + 0.100031127929687500E+04 + 0.999970764160156250E+03 + 0.999620056152343750E+03 + 0.999258850097656250E+03 + 0.998886779785156250E+03 + 0.998503540039062500E+03 + 0.998108764648437500E+03 + 0.997702148437500000E+03 + 0.997283264160156250E+03 + 0.996851745605468750E+03 + 0.996407165527343750E+03 + 0.995949157714843750E+03 + 0.995477355957031250E+03 + 0.994991271972656250E+03 + 0.994490539550781250E+03 + 0.993974670410156250E+03 + 0.993443237304687500E+03 + 0.992895751953125000E+03 + 0.992331726074218750E+03 + 0.991750732421875000E+03 + 0.991152160644531250E+03 + 0.990535522460937500E+03 + 0.989900268554687500E+03 + 0.989245849609375000E+03 + 0.988571716308593750E+03 + 0.987877258300781250E+03 + 0.987161804199218750E+03 + 0.986424743652343750E+03 + 0.985665466308593750E+03 + 0.984883300781250000E+03 + 0.984077575683593750E+03 + 0.983247558593750000E+03 + 0.982392517089843750E+03 + 0.981511657714843750E+03 + 0.980604248046875000E+03 + 0.979669494628906250E+03 + 0.978706604003906250E+03 + 0.977714660644531250E+03 + 0.976692871093750000E+03 + 0.975640258789062500E+03 + 0.974555969238281250E+03 + 0.973439025878906250E+03 + 0.972288452148437500E+03 + 0.971103271484375000E+03 + 0.969882385253906250E+03 + 0.968624755859375000E+03 + 0.967329284667968750E+03 + 0.965994873046875000E+03 + 0.964620300292968750E+03 + 0.963204345703125000E+03 + 0.961745849609375000E+03 + 0.960243469238281250E+03 + 0.958695861816406250E+03 + 0.957101684570312500E+03 + 0.955459594726562500E+03 + 0.953768066406250000E+03 + 0.952025695800781250E+03 + 0.950230895996093750E+03 + 0.948382080078125000E+03 + 0.946477539062500000E+03 + 0.944515625000000000E+03 + 0.942494628906250000E+03 + 0.940412597656250000E+03 + 0.938267517089843750E+03 + 0.936057495117187500E+03 + 0.933780517578125000E+03 + 0.931434814453125000E+03 + 0.929018859863281250E+03 + 0.926530639648437500E+03 + 0.923968017578125000E+03 + 0.921329467773437500E+03 + 0.918613830566406250E+03 + 0.915819274902343750E+03 + 0.912943603515625000E+03 + 0.909984741210937500E+03 + 0.906940002441406250E+03 + 0.903807189941406250E+03 + 0.900637023925781250E+03 + 0.897475952148437500E+03 + 0.894318542480468750E+03 + 0.891164794921875000E+03 + 0.888014648437500000E+03 + 0.884867736816406250E+03 + 0.881723388671875000E+03 + 0.878581359863281250E+03 + 0.875441650390625000E+03 + 0.872304260253906250E+03 + 0.869169372558593750E+03 + 0.866037109375000000E+03 + 0.862907470703125000E+03 + 0.859780456542968750E+03 + 0.856656066894531250E+03 + 0.853533996582031250E+03 + 0.850413879394531250E+03 + 0.847295715332031250E+03 + 0.844179565429687500E+03 + 0.841065368652343750E+03 + 0.837953063964843750E+03 + 0.834842590332031250E+03 + 0.831733947753906250E+03 + 0.828627075195312500E+03 + 0.825522033691406250E+03 + 0.822418762207031250E+03 + 0.819317382812500000E+03 + 0.816218139648437500E+03 + 0.813121276855468750E+03 + 0.810026733398437500E+03 + 0.806934509277343750E+03 + 0.803844604492187500E+03 + 0.800757019042968750E+03 + 0.797671752929687500E+03 + 0.794588684082031250E+03 + 0.791507812500000000E+03 + 0.788429077148437500E+03 + 0.785352539062500000E+03 + 0.782278137207031250E+03 + 0.779205932617187500E+03 + 0.776135864257812500E+03 + 0.773067871093750000E+03 + 0.770001892089843750E+03 + 0.766937866210937500E+03 + 0.763875854492187500E+03 + 0.760815856933593750E+03 + 0.757757812500000000E+03 + 0.754701782226562500E+03 + 0.751647705078125000E+03 + 0.748595458984375000E+03 + 0.745544860839843750E+03 + 0.742495910644531250E+03 + 0.739448547363281250E+03 + 0.736402832031250000E+03 + 0.733358764648437500E+03 + 0.730316345214843750E+03 + 0.727275573730468750E+03 + 0.724236389160156250E+03 + 0.721198791503906250E+03 + 0.718162780761718750E+03 + 0.715128295898437500E+03 + 0.712095397949218750E+03 + 0.709064025878906250E+03 + 0.706034179687500000E+03 + 0.703005920410156250E+03 + 0.699979187011718750E+03 + 0.696953979492187500E+03 + 0.693930480957031250E+03 + 0.690909362792968750E+03 + 0.687891052246093750E+03 + 0.684875549316406250E+03 + 0.681862854003906250E+03 + 0.678852966308593750E+03 + 0.675845886230468750E+03 + 0.672841613769531250E+03 + 0.669840148925781250E+03 + 0.666841430664062500E+03 + 0.663845520019531250E+03 + 0.660853393554687500E+03 + 0.657867553710937500E+03 + 0.654889465332031250E+03 + 0.651919006347656250E+03 + 0.648956176757812500E+03 + 0.646000915527343750E+03 + 0.643053222656250000E+03 + 0.640113037109375000E+03 + 0.637180297851562500E+03 + 0.634255004882812500E+03 + 0.631337097167968750E+03 + 0.628426513671875000E+03 + 0.625525024414062500E+03 + 0.622635375976562500E+03 + 0.619758666992187500E+03 + 0.616894775390625000E+03 + 0.614043579101562500E+03 + 0.611204956054687500E+03 + 0.608378845214843750E+03 + 0.605565063476562500E+03 + 0.602763549804687500E+03 + 0.599974182128906250E+03 + 0.597196899414062500E+03 + 0.594431518554687500E+03 + 0.591677978515625000E+03 + 0.588936157226562500E+03 + 0.586205932617187500E+03 + 0.583487182617187500E+03 + 0.580779785156250000E+03 + 0.578083679199218750E+03 + 0.575398742675781250E+03 + 0.572724853515625000E+03 + 0.570061950683593750E+03 + 0.567409973144531250E+03 + 0.564768798828125000E+03 + 0.562138366699218750E+03 + 0.559518554687500000E+03 + 0.556909301757812500E+03 + 0.554310485839843750E+03 + 0.551722045898437500E+03 + 0.549144042968750000E+03 + 0.546576477050781250E+03 + 0.544019226074218750E+03 + 0.541472229003906250E+03 + 0.538935424804687500E+03 + 0.536408691406250000E+03 + 0.533891967773437500E+03 + 0.531385192871093750E+03 + 0.528888305664062500E+03 + 0.526401184082031250E+03 + 0.523923767089843750E+03 + 0.521455993652343750E+03 + 0.518997741699218750E+03 + 0.516549011230468750E+03 + 0.514109680175781250E+03 + 0.511679656982421875E+03 + 0.509258758544921875E+03 + 0.506846771240234375E+03 + 0.504443664550781250E+03 + 0.502049346923828125E+03 + 0.499663757324218750E+03 + 0.497286834716796875E+03 + 0.494918518066406250E+03 + 0.492558746337890625E+03 + 0.490207458496093750E+03 + 0.487864593505859375E+03 + 0.485530090332031250E+03 + 0.483203887939453125E+03 + 0.480885925292968750E+03 + 0.478576141357421875E+03 + 0.476274475097656250E+03 + 0.473980895996093750E+03 + 0.471695312500000000E+03 + 0.469418365478515625E+03 + 0.467150939941406250E+03 + 0.464893218994140625E+03 + 0.462645141601562500E+03 + 0.460406616210937500E+03 + 0.458177581787109375E+03 + 0.455957946777343750E+03 + 0.453747619628906250E+03 + 0.451546539306640625E+03 + 0.449354614257812500E+03 + 0.447171783447265625E+03 + 0.444997985839843750E+03 + 0.442833129882812500E+03 + 0.440677124023437500E+03 + 0.438529907226562500E+03 + 0.436391418457031250E+03 + 0.434261566162109375E+03 + 0.432140319824218750E+03 + 0.430027587890625000E+03 +__th01dn01 + 250 + 0.309907257080078125E+03 + 0.309907257080078125E+03 + 0.309903442382812500E+03 + 0.309899536132812500E+03 + 0.309895507812500000E+03 + 0.309891326904296875E+03 + 0.309887084960937500E+03 + 0.309882690429687500E+03 + 0.309878173828125000E+03 + 0.309873474121093750E+03 + 0.309837249755859375E+03 + 0.309780731201171875E+03 + 0.309722473144531250E+03 + 0.309662506103515625E+03 + 0.309600708007812500E+03 + 0.309537078857421875E+03 + 0.309471557617187500E+03 + 0.309404052734375000E+03 + 0.309354461669921875E+03 + 0.309303985595703125E+03 + 0.309251983642578125E+03 + 0.309198394775390625E+03 + 0.309143280029296875E+03 + 0.309086425781250000E+03 + 0.309029907226562500E+03 + 0.308981628417968750E+03 + 0.308931823730468750E+03 + 0.308880584716796875E+03 + 0.308827789306640625E+03 + 0.308773406982421875E+03 + 0.308717437744140625E+03 + 0.308675170898437500E+03 + 0.308631835937500000E+03 + 0.308587158203125000E+03 + 0.308541168212890625E+03 + 0.308493804931640625E+03 + 0.308448333740234375E+03 + 0.308409912109375000E+03 + 0.308370330810546875E+03 + 0.308329589843750000E+03 + 0.308287597656250000E+03 + 0.308244415283203125E+03 + 0.308213623046875000E+03 + 0.308182525634765625E+03 + 0.308150482177734375E+03 + 0.308117492675781250E+03 + 0.308083526611328125E+03 + 0.308057464599609375E+03 + 0.308031372070312500E+03 + 0.308004486083984375E+03 + 0.307976806640625000E+03 + 0.307949096679687500E+03 + 0.307925598144531250E+03 + 0.307901367187500000E+03 + 0.307876373291015625E+03 + 0.307850708007812500E+03 + 0.307826171875000000E+03 + 0.307802551269531250E+03 + 0.307778198242187500E+03 + 0.307753112792968750E+03 + 0.307726074218750000E+03 + 0.307690704345703125E+03 + 0.307654296875000000E+03 + 0.307616790771484375E+03 + 0.307578186035156250E+03 + 0.307500701904296875E+03 + 0.307415069580078125E+03 + 0.307326873779296875E+03 + 0.307235961914062500E+03 + 0.307229034423828125E+03 + 0.307256225585937500E+03 + 0.307284088134765625E+03 + 0.307312591552734375E+03 + 0.307505554199218750E+03 + 0.307784240722656250E+03 + 0.308070953369140625E+03 + 0.308366088867187500E+03 + 0.308708312988281250E+03 + 0.309075897216796875E+03 + 0.309454406738281250E+03 + 0.309837829589843750E+03 + 0.310200683593750000E+03 + 0.310559356689453125E+03 + 0.310917999267578125E+03 + 0.311276550292968750E+03 + 0.311552001953125000E+03 + 0.311782836914062500E+03 + 0.312013671875000000E+03 + 0.312244445800781250E+03 + 0.312476989746093750E+03 + 0.312740447998046875E+03 + 0.313003845214843750E+03 + 0.313267303466796875E+03 + 0.313530700683593750E+03 + 0.313794006347656250E+03 + 0.313992218017578125E+03 + 0.314190429687500000E+03 + 0.314388671875000000E+03 + 0.314586883544921875E+03 + 0.314785034179687500E+03 + 0.314976348876953125E+03 + 0.315158874511718750E+03 + 0.315341430664062500E+03 + 0.315523956298828125E+03 + 0.315706481933593750E+03 + 0.315888977050781250E+03 + 0.316089813232421875E+03 + 0.316328582763671875E+03 + 0.316567352294921875E+03 + 0.316806091308593750E+03 + 0.317044860839843750E+03 + 0.317283569335937500E+03 + 0.317522308349609375E+03 + 0.317752563476562500E+03 + 0.317977111816406250E+03 + 0.318201660156250000E+03 + 0.318426208496093750E+03 + 0.318650726318359375E+03 + 0.318875274658203125E+03 + 0.319099761962890625E+03 + 0.319321105957031250E+03 + 0.319529602050781250E+03 + 0.319738098144531250E+03 + 0.319946594238281250E+03 + 0.320155059814453125E+03 + 0.320363525390625000E+03 + 0.320571990966796875E+03 + 0.320780426025390625E+03 + 0.320986938476562500E+03 + 0.321159851074218750E+03 + 0.321332794189453125E+03 + 0.321505676269531250E+03 + 0.321678619384765625E+03 + 0.321851531982421875E+03 + 0.322024505615234375E+03 + 0.322197418212890625E+03 + 0.322370330810546875E+03 + 0.322542480468750000E+03 + 0.322707763671875000E+03 + 0.322873046875000000E+03 + 0.323038360595703125E+03 + 0.323203643798828125E+03 + 0.323368896484375000E+03 + 0.323534179687500000E+03 + 0.323699493408203125E+03 + 0.323864776611328125E+03 + 0.324030029296875000E+03 + 0.324229919433593750E+03 + 0.324533386230468750E+03 + 0.324836853027343750E+03 + 0.325140289306640625E+03 + 0.325443725585937500E+03 + 0.325747222900390625E+03 + 0.326050659179687500E+03 + 0.326354095458984375E+03 + 0.326657531738281250E+03 + 0.326960998535156250E+03 + 0.327264465332031250E+03 + 0.327794219970703125E+03 + 0.328642883300781250E+03 + 0.329491577148437500E+03 + 0.330340240478515625E+03 + 0.331188934326171875E+03 + 0.332037597656250000E+03 + 0.332886291503906250E+03 + 0.333734985351562500E+03 + 0.334583648681640625E+03 + 0.335432312011718750E+03 + 0.336281005859375000E+03 + 0.337129699707031250E+03 + 0.338382720947265625E+03 + 0.339906707763671875E+03 + 0.341430664062500000E+03 + 0.342954620361328125E+03 + 0.344478576660156250E+03 + 0.346002563476562500E+03 + 0.347526519775390625E+03 + 0.349050476074218750E+03 + 0.350574432373046875E+03 + 0.352098419189453125E+03 + 0.353622375488281250E+03 + 0.355146331787109375E+03 + 0.356670288085937500E+03 + 0.358189758300781250E+03 + 0.359702392578125000E+03 + 0.361215026855468750E+03 + 0.362727661132812500E+03 + 0.364240295410156250E+03 + 0.365752899169921875E+03 + 0.367265533447265625E+03 + 0.368778167724609375E+03 + 0.370290802001953125E+03 + 0.371803436279296875E+03 + 0.373316070556640625E+03 + 0.374828704833984375E+03 + 0.376341308593750000E+03 + 0.377853942871093750E+03 + 0.379366577148437500E+03 + 0.380909759521484375E+03 + 0.382453399658203125E+03 + 0.383997070312500000E+03 + 0.385540771484375000E+03 + 0.387084411621093750E+03 + 0.388628082275390625E+03 + 0.390171752929687500E+03 + 0.391715393066406250E+03 + 0.393259063720703125E+03 + 0.394802734375000000E+03 + 0.396346374511718750E+03 + 0.397890045166015625E+03 + 0.399433715820312500E+03 + 0.400977355957031250E+03 + 0.402521057128906250E+03 + 0.404058654785156250E+03 + 0.405556640625000000E+03 + 0.407054626464843750E+03 + 0.408552612304687500E+03 + 0.410050598144531250E+03 + 0.411548583984375000E+03 + 0.413046569824218750E+03 + 0.414544555664062500E+03 + 0.416042572021484375E+03 + 0.417540557861328125E+03 + 0.419038543701171875E+03 + 0.420536529541015625E+03 + 0.422034515380859375E+03 + 0.423532501220703125E+03 + 0.425030487060546875E+03 + 0.426528472900390625E+03 + 0.428026458740234375E+03 + 0.429524444580078125E+03 + 0.431275360107421875E+03 + 0.433136871337890625E+03 + 0.434998413085937500E+03 + 0.436859954833984375E+03 + 0.438721466064453125E+03 + 0.440583007812500000E+03 + 0.442444519042968750E+03 + 0.444306030273437500E+03 + 0.446167541503906250E+03 + 0.448029083251953125E+03 + 0.449890594482421875E+03 + 0.451752105712890625E+03 + 0.453613647460937500E+03 + 0.455475158691406250E+03 + 0.457336669921875000E+03 + 0.459198211669921875E+03 + 0.461059722900390625E+03 + 0.462921234130859375E+03 + 0.464782745361328125E+03 +__dn01dn01 + 250 + 0.111670076847076416E+01 + 0.111583304405212402E+01 + 0.111495316028594971E+01 + 0.111404716968536377E+01 + 0.111311447620391846E+01 + 0.111215424537658691E+01 + 0.111116600036621094E+01 + 0.111014842987060547E+01 + 0.110910069942474365E+01 + 0.110802233219146729E+01 + 0.110702455043792725E+01 + 0.110606551170349121E+01 + 0.110507798194885254E+01 + 0.110406100749969482E+01 + 0.110301351547241211E+01 + 0.110193514823913574E+01 + 0.110082459449768066E+01 + 0.109968078136444092E+01 + 0.109843230247497559E+01 + 0.109714496135711670E+01 + 0.109581911563873291E+01 + 0.109445440769195557E+01 + 0.109304881095886230E+01 + 0.109160244464874268E+01 + 0.109010577201843262E+01 + 0.108853006362915039E+01 + 0.108690869808197021E+01 + 0.108523905277252197E+01 + 0.108352053165435791E+01 + 0.108175158500671387E+01 + 0.107993090152740479E+01 + 0.107800281047821045E+01 + 0.107601821422576904E+01 + 0.107397580146789551E+01 + 0.107187390327453613E+01 + 0.106971108913421631E+01 + 0.106747353076934814E+01 + 0.106514251232147217E+01 + 0.106274425983428955E+01 + 0.106027674674987793E+01 + 0.105773806571960449E+01 + 0.105512654781341553E+01 + 0.105239295959472656E+01 + 0.104957938194274902E+01 + 0.104668557643890381E+01 + 0.104370951652526855E+01 + 0.104064846038818359E+01 + 0.103747093677520752E+01 + 0.103420090675354004E+01 + 0.103083884716033936E+01 + 0.102738225460052490E+01 + 0.102382588386535645E+01 + 0.102015328407287598E+01 + 0.101637852191925049E+01 + 0.101249897480010986E+01 + 0.100851118564605713E+01 + 0.100440704822540283E+01 + 0.100018405914306641E+01 + 0.995845079421997070E+00 + 0.991387069225311279E+00 + 0.986811041831970215E+00 + 0.982134342193603516E+00 + 0.977330088615417480E+00 + 0.972395360469818115E+00 + 0.967327058315277100E+00 + 0.962239861488342285E+00 + 0.957032382488250732E+00 + 0.951683580875396729E+00 + 0.946190655231475830E+00 + 0.940284967422485352E+00 + 0.934121131896972656E+00 + 0.927799105644226074E+00 + 0.921316146850585938E+00 + 0.914183199405670166E+00 + 0.906644761562347412E+00 + 0.898932337760925293E+00 + 0.891043782234191895E+00 + 0.882866740226745605E+00 + 0.874464094638824463E+00 + 0.865876972675323486E+00 + 0.857247173786163330E+00 + 0.848756194114685059E+00 + 0.840344369411468506E+00 + 0.831999599933624268E+00 + 0.823721885681152344E+00 + 0.815726816654205322E+00 + 0.807905972003936768E+00 + 0.800140321254730225E+00 + 0.792429745197296143E+00 + 0.784769535064697266E+00 + 0.777087628841400146E+00 + 0.769462049007415771E+00 + 0.761892855167388916E+00 + 0.754379570484161377E+00 + 0.746922433376312256E+00 + 0.739673197269439697E+00 + 0.732474088668823242E+00 + 0.725325345993041992E+00 + 0.718226611614227295E+00 + 0.711177647113800049E+00 + 0.704193413257598877E+00 + 0.697277009487152100E+00 + 0.690408766269683838E+00 + 0.683588266372680664E+00 + 0.676815092563629150E+00 + 0.670089662075042725E+00 + 0.663372635841369629E+00 + 0.656625390052795410E+00 + 0.649928510189056396E+00 + 0.643281519412994385E+00 + 0.636684298515319824E+00 + 0.630136549472808838E+00 + 0.623638093471527100E+00 + 0.617204904556274414E+00 + 0.610830605030059814E+00 + 0.604504227638244629E+00 + 0.598224937915802002E+00 + 0.591992735862731934E+00 + 0.585807383060455322E+00 + 0.579668641090393066E+00 + 0.573581755161285400E+00 + 0.567563652992248535E+00 + 0.561590433120727539E+00 + 0.555661857128143311E+00 + 0.549777865409851074E+00 + 0.543938159942626953E+00 + 0.538142383098602295E+00 + 0.532390475273132324E+00 + 0.526685476303100586E+00 + 0.521077871322631836E+00 + 0.515511572360992432E+00 + 0.509986519813537598E+00 + 0.504501998424530029E+00 + 0.499058365821838379E+00 + 0.493655264377593994E+00 + 0.488292634487152100E+00 + 0.482970029115676880E+00 + 0.477688550949096680E+00 + 0.472456902265548706E+00 + 0.467264503240585327E+00 + 0.462111085653305054E+00 + 0.456996619701385498E+00 + 0.451920777559280396E+00 + 0.446883529424667358E+00 + 0.441884607076644897E+00 + 0.436923891305923462E+00 + 0.432001203298568726E+00 + 0.427071005105972290E+00 + 0.422046124935150146E+00 + 0.417064964771270752E+00 + 0.412127494812011719E+00 + 0.407233268022537231E+00 + 0.402381867170333862E+00 + 0.397573441267013550E+00 + 0.392807364463806152E+00 + 0.388083606958389282E+00 + 0.383401602506637573E+00 + 0.378761231899261475E+00 + 0.373905450105667114E+00 + 0.368744522333145142E+00 + 0.363649308681488037E+00 + 0.358618944883346558E+00 + 0.353652417659759521E+00 + 0.348749011754989624E+00 + 0.343907982110977173E+00 + 0.339128553867340088E+00 + 0.334409743547439575E+00 + 0.329751104116439819E+00 + 0.325151473283767700E+00 + 0.320610284805297852E+00 + 0.315751373767852783E+00 + 0.310720592737197876E+00 + 0.305775552988052368E+00 + 0.300914704799652100E+00 + 0.296136260032653809E+00 + 0.291438698768615723E+00 + 0.286820471286773682E+00 + 0.282280057668685913E+00 + 0.277815908193588257E+00 + 0.273426502943038940E+00 + 0.269110709428787231E+00 + 0.264866828918457031E+00 + 0.260693699121475220E+00 + 0.256593018770217896E+00 + 0.252564996480941772E+00 + 0.248603314161300659E+00 + 0.244706809520721436E+00 + 0.240874215960502625E+00 + 0.237104281783103943E+00 + 0.233396038413047791E+00 + 0.229748144745826721E+00 + 0.226159617304801941E+00 + 0.222629338502883911E+00 + 0.219156369566917419E+00 + 0.215739503502845764E+00 + 0.212377756834030151E+00 + 0.209070175886154175E+00 + 0.205815732479095459E+00 + 0.202597439289093018E+00 + 0.199431061744689941E+00 + 0.196315750479698181E+00 + 0.193250760436058044E+00 + 0.190235123038291931E+00 + 0.187267929315567017E+00 + 0.184348374605178833E+00 + 0.181475609540939331E+00 + 0.178648769855499268E+00 + 0.175867006182670593E+00 + 0.173129573464393616E+00 + 0.170435711741447449E+00 + 0.167784586548805237E+00 + 0.165175482630729675E+00 + 0.162607654929161072E+00 + 0.160082861781120300E+00 + 0.157613083720207214E+00 + 0.155181482434272766E+00 + 0.152787685394287109E+00 + 0.150430813431739807E+00 + 0.148110300302505493E+00 + 0.145825594663619995E+00 + 0.143576085567474365E+00 + 0.141361102461814880E+00 + 0.139180153608322144E+00 + 0.137032672762870789E+00 + 0.134918078780174255E+00 + 0.132835820317268372E+00 + 0.130785390734672546E+00 + 0.128766208887100220E+00 + 0.126777827739715576E+00 + 0.124819725751876831E+00 + 0.122891381382942200E+00 + 0.120921768248081207E+00 + 0.118954420089721680E+00 + 0.117020443081855774E+00 + 0.115119203925132751E+00 + 0.113250114023685455E+00 + 0.111412584781646729E+00 + 0.109605960547924042E+00 + 0.107829689979553223E+00 + 0.106083236634731293E+00 + 0.104365974664688110E+00 + 0.102677382528781891E+00 + 0.101016990840435028E+00 + 0.993841886520385742E-01 + 0.977785140275955200E-01 + 0.961994454264640808E-01 + 0.946464836597442627E-01 + 0.931192040443420410E-01 + 0.916170924901962280E-01 + 0.901397019624710083E-01 +__rt01dn01 + 250 + 0.157400742173194885E-01 + 0.157400742173194885E-01 + 0.157197769731283188E-01 + 0.156988706439733505E-01 + 0.156773384660482407E-01 + 0.156551580876111984E-01 + 0.156323146075010300E-01 + 0.156087838113307953E-01 + 0.155845480039715767E-01 + 0.155595848336815834E-01 + 0.155360717326402664E-01 + 0.155131984502077103E-01 + 0.154896397143602371E-01 + 0.154653731733560562E-01 + 0.154403792694211006E-01 + 0.154146356508135796E-01 + 0.153881199657917023E-01 + 0.153608079999685287E-01 + 0.153312394395470619E-01 + 0.153007395565509796E-01 + 0.152693241834640503E-01 + 0.152369672432541847E-01 + 0.152036398649215698E-01 + 0.151693113148212433E-01 + 0.151335047557950020E-01 + 0.150943771004676819E-01 + 0.150540759786963463E-01 + 0.150125650689005852E-01 + 0.149698099121451378E-01 + 0.149257713928818703E-01 + 0.148804122582077980E-01 + 0.148314256221055984E-01 + 0.147809488698840141E-01 + 0.147289568558335304E-01 + 0.146754058077931404E-01 + 0.146202482283115387E-01 + 0.145624317228794098E-01 + 0.145003683865070343E-01 + 0.144364433363080025E-01 + 0.143706006929278374E-01 + 0.143027827143669128E-01 + 0.142329297959804535E-01 + 0.141618810594081879E-01 + 0.140887415036559105E-01 + 0.140134068205952644E-01 + 0.139358118176460266E-01 + 0.138558903709053993E-01 + 0.137731982395052910E-01 + 0.136879952624440193E-01 + 0.136002376675605774E-01 + 0.135098462924361229E-01 + 0.134156541898846626E-01 + 0.133118750527501106E-01 + 0.132049825042486191E-01 + 0.130948834121227264E-01 + 0.129814818501472473E-01 + 0.128611130639910698E-01 + 0.127342399209737778E-01 + 0.126035604625940323E-01 + 0.124689601361751556E-01 + 0.123188504949212074E-01 + 0.120928045362234116E-01 + 0.118599776178598404E-01 + 0.116201657801866531E-01 + 0.113731585443019867E-01 + 0.108122359961271286E-01 + 0.101871732622385025E-01 + 0.954335834830999374E-02 + 0.888023152947425842E-02 + 0.814564153552055359E-02 + 0.736850779503583908E-02 + 0.656806118786334991E-02 + 0.574360042810440063E-02 + 0.511736655607819557E-02 + 0.458150403574109077E-02 + 0.402956502512097359E-02 + 0.346106919459998608E-02 + 0.315951509401202202E-02 + 0.295987166464328766E-02 + 0.275420234538614750E-02 + 0.254582636989653111E-02 + 0.240100966766476631E-02 + 0.226934440433979034E-02 + 0.213767914101481438E-02 + 0.200601387768983841E-02 + 0.188496639020740986E-02 + 0.176962336990982294E-02 + 0.165428023319691420E-02 + 0.153893709648400545E-02 + 0.142714334651827812E-02 + 0.137570430524647236E-02 + 0.132426526397466660E-02 + 0.127282633911818266E-02 + 0.122138729784637690E-02 + 0.116997293662279844E-02 + 0.114299450069665909E-02 + 0.111601618118584156E-02 + 0.108903786167502403E-02 + 0.106205942574888468E-02 + 0.103508110623806715E-02 + 0.100341590587049723E-02 + 0.965809798799455166E-03 + 0.928203691728413105E-03 + 0.890597584657371044E-03 + 0.852991419378668070E-03 + 0.815385312307626009E-03 + 0.778890273068100214E-03 + 0.744703225791454315E-03 + 0.710516120307147503E-03 + 0.676329073030501604E-03 + 0.642141967546194792E-03 + 0.607954920269548893E-03 + 0.573767814785242081E-03 + 0.543858448509126902E-03 + 0.516833271831274033E-03 + 0.489808095153421164E-03 + 0.462782976683229208E-03 + 0.435757800005376339E-03 + 0.408732681535184383E-03 + 0.381707504857331514E-03 + 0.355890952050685883E-03 + 0.335007964167743921E-03 + 0.314125005388632417E-03 + 0.293242046609520912E-03 + 0.272359058726578951E-03 + 0.251476070843636990E-03 + 0.230593112064525485E-03 + 0.209710153285413980E-03 + 0.189310128916986287E-03 + 0.177026522578671575E-03 + 0.164742901688441634E-03 + 0.152459295350126922E-03 + 0.140175674459896982E-03 + 0.127892068121582270E-03 + 0.115608447231352329E-03 + 0.103324840893037617E-03 + 0.910412200028076768E-04 + 0.793839499237947166E-04 + 0.732929765945300460E-04 + 0.672020032652653754E-04 + 0.611110299360007048E-04 + 0.550200566067360342E-04 + 0.489290869154501706E-04 + 0.428381135861855000E-04 + 0.367471402569208294E-04 + 0.306561669276561588E-04 + 0.245651935983914882E-04 + 0.197688186744926497E-04 + 0.188459234777837992E-04 + 0.179230301000643522E-04 + 0.170001349033555016E-04 + 0.160772415256360546E-04 + 0.151543463289272040E-04 + 0.142314529512077570E-04 + 0.133085586639936082E-04 + 0.123856643767794594E-04 + 0.114627700895653106E-04 + 0.105398758023511618E-04 + 0.968389485933585092E-05 + 0.892223033588379622E-05 + 0.816056490293703973E-05 + 0.739890037948498502E-05 + 0.663723540128557943E-05 + 0.587557042308617383E-05 + 0.511390544488676824E-05 + 0.435224092143471353E-05 + 0.359057594323530793E-05 + 0.282891096503590234E-05 + 0.206724598683649674E-05 + 0.130558146338444203E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 +__kppzm + 48 + -0.170577192306518555E+01 + -0.515288019180297852E+01 + -0.867263221740722656E+01 + -0.122681560516357422E+02 + -0.159427862167358398E+02 + -0.197000827789306641E+02 + -0.235438518524169922E+02 + -0.274781646728515625E+02 + -0.315073947906494141E+02 + -0.356362304687500000E+02 + -0.398697319030761719E+02 + -0.442133331298828125E+02 + -0.486729240417480469E+02 + -0.532548675537109375E+02 + -0.579660606384277344E+02 + -0.628140220642089844E+02 + -0.678069229125976563E+02 + -0.729536972045898438E+02 + -0.782641372680664063E+02 + -0.837490005493164063E+02 + -0.894201202392578125E+02 + -0.952906188964843750E+02 + -0.101375022888183594E+03 + -0.107689506530761719E+03 + -0.114252166748046875E+03 + -0.121083328247070312E+03 + -0.128205902099609375E+03 + -0.135645858764648437E+03 + -0.143432846069335937E+03 + -0.151600814819335937E+03 + -0.160188995361328125E+03 + -0.169243026733398437E+03 + -0.178816345214843750E+03 + -0.188972213745117187E+03 + -0.199786239624023437E+03 + -0.211349731445312500E+03 + -0.223774444580078125E+03 + -0.237199188232421875E+03 + -0.251799423217773437E+03 + -0.267801239013671875E+03 + -0.285503112792968750E+03 + -0.305310638427734375E+03 + -0.327794952392578125E+03 + -0.353797454833984375E+03 + -0.384634338378906250E+03 + -0.422540863037109375E+03 + -0.471808868408203125E+03 + -0.500000000000000000E+03 +__gnu + 8 + 0.400000000000000000E+01 + 0.200000000000000000E+01 + 0.200000000000000000E+01 + 0.200000000000000000E+01 + 0.200000000000000000E+01 + 0.200000000000000000E+01 + 0.200000000000000000E+01 + 0.400000000000000000E+01 +__iaero_chem + 11 + 1 + 1 + 1 + 1 + 2 + 2 + 2 + 1 + 1 + 1 + 1 +__cfmas + 16 + 0.524000000000000000E+03 + 0.524000000000000000E+03 + 0.110800003051757812E+03 + 0.273899990133941174E-02 + 0.495999991893768311E+00 + 0.157000000000000000E+03 + 0.471000000000000000E+03 + 0.885399997234344482E+00 + 0.377000006847083569E-02 + 0.123000005260109901E-02 + 0.100100003182888031E+00 + 0.885399997234344482E+00 + 0.377000006847083569E-02 + 0.123000005260109901E-02 + 0.100100003182888031E+00 + 0.524000000000000000E+03 +__pwmas + 16 + 0.300000000000000000E+01 + 0.300000000000000000E+01 + 0.291000008583068848E+01 + 0.174000000953674316E+01 + 0.240000009536743164E+01 + 0.300000000000000000E+01 + 0.300000000000000000E+01 + 0.250000000000000000E+01 + 0.200000000000000000E+01 + 0.179999995231628418E+01 + 0.225600004196166992E+01 + 0.250000000000000000E+01 + 0.200000000000000000E+01 + 0.179999995231628418E+01 + 0.225600004196166992E+01 + 0.300000000000000000E+01 +__slcpd + 12 + 0.146500000000000000E+07 + 0.140700000000000000E+07 + 0.134400000000000000E+07 + 0.127300000000000000E+07 + 0.121400000000000000E+07 + 0.117700000000000000E+07 + 0.131900000000000000E+07 + 0.122700000000000000E+07 + 0.117700000000000000E+07 + 0.115100000000000000E+07 + 0.108800000000000000E+07 + 0.874000000000000000E+06 +__slmsts + 12 + 0.395000010728836060E+00 + 0.409999996423721313E+00 + 0.435000002384185791E+00 + 0.485000014305114746E+00 + 0.451000005006790161E+00 + 0.419999986886978149E+00 + 0.476999998092651367E+00 + 0.476000010967254639E+00 + 0.425999999046325684E+00 + 0.492000013589859009E+00 + 0.481999993324279785E+00 + 0.862999975681304932E+00 +__slz + 11 + -0.500000000000000000E+00 + -0.400000005960464478E+00 + -0.300000011920928955E+00 + -0.250000000000000000E+00 + -0.200000002980232239E+00 + -0.159999996423721313E+00 + -0.119999997317790985E+00 + -0.900000035762786865E-01 + -0.599999986588954926E-01 + -0.299999993294477463E-01 + -0.999999977648258209E-02 diff --git a/bin.rams/test.supercell/a-A-1991-04-26-213000-head.txt b/bin.rams/test.supercell/a-A-1991-04-26-213000-head.txt new file mode 100644 index 0000000..da091e8 --- /dev/null +++ b/bin.rams/test.supercell/a-A-1991-04-26-213000-head.txt @@ -0,0 +1,3638 @@ + 257 +UP 0 3 1 218750 +VP 0 3 1 218750 +WP 0 3 1 218750 +PP 0 3 1 218750 +UC 0 3 1 218750 +VC 0 3 1 218750 +WC 0 3 1 218750 +PC 0 3 1 218750 +THP 0 3 1 218750 +RTP 0 3 1 218750 +THETA 0 3 1 218750 +RV 0 3 1 218750 +DN0 0 3 1 218750 +WP_BUOY_THETA 0 3 1 218750 +WP_BUOY_COND 0 3 1 218750 +WP_ADVDIF 0 3 1 218750 +SOIL_WATER 0 4 1 19250 +SOIL_ENERGY 0 4 1 19250 +SOIL_TEXT 0 4 1 19250 +SFCWATER_MASS 0 5 1 1750 +SFCWATER_ENERGY 0 5 1 1750 +SFCWATER_DEPTH 0 5 1 1750 +USTAR 0 6 1 1750 +TSTAR 0 6 1 1750 +RSTAR 0 6 1 1750 +VEG_FRACAREA 0 6 1 1750 +VEG_LAI 0 6 1 1750 +VEG_ROUGH 0 6 1 1750 +VEG_HEIGHT 0 6 1 1750 +VEG_ALBEDO 0 6 1 1750 +VEG_TAI 0 6 1 1750 +PATCH_AREA 0 6 1 1750 +PATCH_ROUGH 0 6 1 1750 +LEAF_CLASS 0 6 1 1750 +SOIL_ROUGH 0 6 1 1750 +SFCWATER_NLEV 0 6 1 1750 +STOM_RESIST 0 6 1 1750 +GROUND_RSAT 0 6 1 1750 +GROUND_RVAP 0 6 1 1750 +VEG_WATER 0 6 1 1750 +VEG_TEMP 0 6 1 1750 +CAN_RVAP 0 6 1 1750 +CAN_TEMP 0 6 1 1750 +VEG_NDVIP 0 6 1 1750 +VEG_NDVIC 0 6 1 1750 +VEG_NDVIF 0 6 1 1750 +KPP_OLD 0 2 1 875 +KPP_NEW 0 2 1 875 +KPP_JERLOV 0 2 1 875 +KPP_OCDEPTH 0 2 1 875 +KPP_HMIX 0 2 1 875 +KPP_BOTTOMT 0 2 1 875 +KPP_SREF 0 2 1 875 +KPP_FREEZ_FLAG 0 2 1 875 +KPP_RESET_FLAG 0 2 1 875 +KPP_FLX_UST 0 2 1 875 +KPP_FLX_VST 0 2 1 875 +KPP_FLX_NSW 0 2 1 875 +KPP_FLX_NLW 0 2 1 875 +KPP_FLX_ICE 0 2 1 875 +KPP_FLX_PCP 0 2 1 875 +KPP_SWDK_OPT 0 10 1 42000 +KPP_SWFRAC 0 10 1 42000 +KPP_SAL_CLIM 0 10 1 42000 +KPP_OCNT_CLIM 0 10 1 42000 +KPP_BUOY 0 10 1 42000 +KPP_U 0 10 1 42000 +KPP_V 0 10 1 42000 +KPP_U_init 0 10 1 42000 +KPP_V_init 0 10 1 42000 +KPP_US0 0 10 1 42000 +KPP_US1 0 10 1 42000 +KPP_VS0 0 10 1 42000 +KPP_VS1 0 10 1 42000 +KPP_X_T 0 10 1 42000 +KPP_X_S 0 10 1 42000 +KPP_XS_T0 0 10 1 42000 +KPP_XS_T1 0 10 1 42000 +KPP_XS_S0 0 10 1 42000 +KPP_XS_S1 0 10 1 42000 +RCP 0 3 1 218750 +RDP 0 3 1 218750 +RRP 0 3 1 218750 +RPP 0 3 1 218750 +RSP 0 3 1 218750 +RAP 0 3 1 218750 +RGP 0 3 1 218750 +RHP 0 3 1 218750 +CCP 0 3 1 218750 +CDP 0 3 1 218750 +CRP 0 3 1 218750 +CPP 0 3 1 218750 +CSP 0 3 1 218750 +CAP 0 3 1 218750 +CGP 0 3 1 218750 +CHP 0 3 1 218750 +Q2 0 3 1 218750 +Q6 0 3 1 218750 +Q7 0 3 1 218750 +CCCNP 0 3 1 218750 +GCCNP 0 3 1 218750 +CCCMP 0 3 1 218750 +GCCMP 0 3 1 218750 +MD1NP 0 3 1 218750 +MD2NP 0 3 1 218750 +MD1MP 0 3 1 218750 +MD2MP 0 3 1 218750 +SALT_FILM_NP 0 3 1 218750 +SALT_JET_NP 0 3 1 218750 +SALT_SPUM_NP 0 3 1 218750 +SALT_FILM_MP 0 3 1 218750 +SALT_JET_MP 0 3 1 218750 +SALT_SPUM_MP 0 3 1 218750 +REGEN_AERO1_NP 0 3 1 218750 +REGEN_AERO1_MP 0 3 1 218750 +REGEN_AERO2_NP 0 3 1 218750 +REGEN_AERO2_MP 0 3 1 218750 +IMMERCP 0 3 1 218750 +IMMERDP 0 3 1 218750 +IMMERRP 0 3 1 218750 +IFNNUCP 0 3 1 218750 +CNMCP 0 3 1 218750 +CNMDP 0 3 1 218750 +CNMRP 0 3 1 218750 +CNMPP 0 3 1 218750 +CNMSP 0 3 1 218750 +CNMAP 0 3 1 218750 +CNMGP 0 3 1 218750 +CNMHP 0 3 1 218750 +DNMCP 0 3 1 218750 +DNMDP 0 3 1 218750 +DNMRP 0 3 1 218750 +DNMPP 0 3 1 218750 +DNMSP 0 3 1 218750 +DNMAP 0 3 1 218750 +DNMGP 0 3 1 218750 +DNMHP 0 3 1 218750 +DINCP 0 3 1 218750 +DINDP 0 3 1 218750 +DINRP 0 3 1 218750 +DINPP 0 3 1 218750 +DINSP 0 3 1 218750 +DINAP 0 3 1 218750 +DINGP 0 3 1 218750 +DINHP 0 3 1 218750 +SNMCP 0 3 1 218750 +SNMDP 0 3 1 218750 +SNMRP 0 3 1 218750 +SNMPP 0 3 1 218750 +SNMSP 0 3 1 218750 +SNMAP 0 3 1 218750 +SNMGP 0 3 1 218750 +SNMHP 0 3 1 218750 +RESOL_AERO1_MP 0 3 1 218750 +RESOL_AERO2_MP 0 3 1 218750 +PCPVR 0 3 1 218750 +PCPVP 0 3 1 218750 +PCPVS 0 3 1 218750 +PCPVA 0 3 1 218750 +PCPVG 0 3 1 218750 +PCPVH 0 3 1 218750 +PCPVD 0 3 1 218750 +LATHEATVAP 0 3 1 218750 +LATHEATFRZ 0 3 1 218750 +NUCCLDRT 0 3 1 218750 +CLD2RAINT 0 3 1 218750 +ICE2RAINT 0 3 1 218750 +NUCICERT 0 3 1 218750 +VAPLIQT 0 3 1 218750 +VAPICET 0 3 1 218750 +MELTICET 0 3 1 218750 +RIMECLDT 0 3 1 218750 +RAIN2ICET 0 3 1 218750 +AGGREGATET 0 3 1 218750 +LATHEATVAPT 0 3 1 218750 +LATHEATFRZT 0 3 1 218750 +INUCHOMRT 0 3 1 218750 +INUCCONTRT 0 3 1 218750 +INUCIFNRT 0 3 1 218750 +INUCHAZRT 0 3 1 218750 +VAPCLDT 0 3 1 218750 +VAPRAINT 0 3 1 218750 +VAPPRIST 0 3 1 218750 +VAPSNOWT 0 3 1 218750 +VAPAGGRT 0 3 1 218750 +VAPGRAUT 0 3 1 218750 +VAPHAILT 0 3 1 218750 +VAPDRIZT 0 3 1 218750 +MELTPRIST 0 3 1 218750 +MELTSNOWT 0 3 1 218750 +MELTAGGRT 0 3 1 218750 +MELTGRAUT 0 3 1 218750 +MELTHAILT 0 3 1 218750 +RIMECLDSNOWT 0 3 1 218750 +RIMECLDAGGRT 0 3 1 218750 +RIMECLDGRAUT 0 3 1 218750 +RIMECLDHAILT 0 3 1 218750 +RAIN2PRT 0 3 1 218750 +RAIN2SNT 0 3 1 218750 +RAIN2AGT 0 3 1 218750 +RAIN2GRT 0 3 1 218750 +RAIN2HAT 0 3 1 218750 +AGGRSELFPRIST 0 3 1 218750 +AGGRSELFSNOWT 0 3 1 218750 +AGGRPRISSNOWT 0 3 1 218750 +DUST1CLDRT 0 3 1 218750 +DUST2CLDRT 0 3 1 218750 +DUST1DRZRT 0 3 1 218750 +DUST2DRZRT 0 3 1 218750 +ACCPR 0 2 1 875 +ACCPP 0 2 1 875 +ACCPS 0 2 1 875 +ACCPA 0 2 1 875 +ACCPG 0 2 1 875 +ACCPH 0 2 1 875 +ACCPD 0 2 1 875 +PCPRR 0 2 1 875 +PCPRP 0 2 1 875 +PCPRS 0 2 1 875 +PCPRA 0 2 1 875 +PCPRG 0 2 1 875 +PCPRH 0 2 1 875 +PCPRD 0 2 1 875 +PCPG 0 2 1 875 +QPCPG 0 2 1 875 +DPCPG 0 2 1 875 +ACCPAERO 0 2 1 875 +PCPRAERO 0 2 1 875 +ACCPDUST 0 2 1 875 +PCPRDUST 0 2 1 875 +FTHRD 0 3 1 218750 +BEXT 0 3 1 218750 +SWUP 0 3 1 218750 +SWDN 0 3 1 218750 +LWUP 0 3 1 218750 +LWDN 0 3 1 218750 +RSHORT 0 2 1 875 +RLONG 0 2 1 875 +RLONGUP 0 2 1 875 +ALBEDT 0 2 1 875 +COSZ 0 2 1 875 +AODT 0 2 1 875 +RHKM 0 3 1 218750 +RVKM 0 3 1 218750 +RVKH 0 3 1 218750 +SFLUX_U 0 2 1 875 +SFLUX_V 0 2 1 875 +SFLUX_W 0 2 1 875 +SFLUX_T 0 2 1 875 +SFLUX_R 0 2 1 875 +TOPT 0 2 1 875 +GLAT 0 2 1 875 +GLON 0 2 1 875 +TOPZO 0 2 1 875 +PI 1 3 1 218750 +HKH 1 3 1 218750 +VKH 1 3 1 218750 +__expnme + 1 +RAMS Simulations +__initial + 1 + 1 +__initorig + 1 + 1 +__jdim + 1 + 1 +__iyear1 + 1 + 1991 +__imonth1 + 1 + 4 +__idate1 + 1 + 26 +__itime1 + 1 + 2100 +__time + 1 + 0.180000000000000000E+04 +__nsndg + 1 + 35 +__us + 35 + -0.271000003814697266E+01 + -0.271000003814697266E+01 + -0.353999996185302734E+01 + -0.339000010490417480E+01 + -0.277999997138977051E+01 + -0.174000000953674316E+01 + -0.360000014305114746E+00 + 0.125000000000000000E+01 + 0.294000005722045898E+01 + 0.457999992370605469E+01 + 0.607000017166137695E+01 + 0.730000019073486328E+01 + 0.852999973297119141E+01 + 0.967000007629394531E+01 + 0.108999996185302734E+02 + 0.120900001525878906E+02 + 0.128400001525878906E+02 + 0.151300001144409180E+02 + 0.167000007629394531E+02 + 0.173600006103515625E+02 + 0.174400005340576172E+02 + 0.170400009155273438E+02 + 0.168299999237060547E+02 + 0.170599994659423828E+02 + 0.183799991607666016E+02 + 0.203899993896484375E+02 + 0.233099994659423828E+02 + 0.281800003051757813E+02 + 0.248199996948242188E+02 + 0.211499996185302734E+02 + 0.175100002288818359E+02 + 0.965999984741210938E+01 + 0.200999999046325684E+01 + 0.500000000000000000E+00 + -0.103999996185302734E+01 +__vs + 35 + 0.838000011444091797E+01 + 0.838000011444091797E+01 + 0.106599998474121094E+02 + 0.122500000000000000E+02 + 0.134600000381469727E+02 + 0.142600002288818359E+02 + 0.146400003433227539E+02 + 0.146599998474121094E+02 + 0.144099998474121094E+02 + 0.140299997329711914E+02 + 0.137200002670288086E+02 + 0.136199998855590820E+02 + 0.138299999237060547E+02 + 0.142600002288818359E+02 + 0.154700002670288086E+02 + 0.160300006866455078E+02 + 0.188700008392333984E+02 + 0.190900001525878906E+02 + 0.186000003814697266E+02 + 0.189099998474121094E+02 + 0.199799995422363281E+02 + 0.211800003051757813E+02 + 0.216200008392333984E+02 + 0.218400001525878906E+02 + 0.223400001525878906E+02 + 0.227000007629394531E+02 + 0.227399997711181641E+02 + 0.198400001525878906E+02 + 0.181599998474121094E+02 + 0.161700000762939453E+02 + 0.118999996185302734E+02 + 0.850000000000000000E+01 + 0.347000002861022949E+01 + 0.350000000000000000E+01 + 0.352999997138977051E+01 +__ts + 35 + 0.306079376220703125E+03 + 0.305112518310546875E+03 + 0.303622192382812500E+03 + 0.302135650634765625E+03 + 0.300582458496093750E+03 + 0.298970092773437500E+03 + 0.297265472412109375E+03 + 0.295463653564453125E+03 + 0.293529083251953125E+03 + 0.291434265136718750E+03 + 0.289150360107421875E+03 + 0.286665008544921875E+03 + 0.284018432617187500E+03 + 0.281624572753906250E+03 + 0.279662200927734375E+03 + 0.277406005859375000E+03 + 0.274758117675781250E+03 + 0.271294006347656250E+03 + 0.267552581787109375E+03 + 0.263083618164062500E+03 + 0.258075958251953125E+03 + 0.252843017578125000E+03 + 0.246956115722656250E+03 + 0.240328781127929687E+03 + 0.232743484497070312E+03 + 0.224288635253906250E+03 + 0.215936080932617187E+03 + 0.210840881347656250E+03 + 0.210143768310546875E+03 + 0.208462387084960937E+03 + 0.205940200805664062E+03 + 0.201693786621093750E+03 + 0.198953125000000000E+03 + 0.194737899780273437E+03 + 0.189301940917968750E+03 +__thds + 35 + 0.306959991455078125E+03 + 0.306960021972656250E+03 + 0.306529998779296875E+03 + 0.306209960937500000E+03 + 0.305939971923828125E+03 + 0.305740020751953125E+03 + 0.305589965820312500E+03 + 0.305500000000000000E+03 + 0.305450012207031250E+03 + 0.305429992675781250E+03 + 0.305429992675781250E+03 + 0.305459991455078125E+03 + 0.305589965820312500E+03 + 0.306299987792968750E+03 + 0.307829986572265625E+03 + 0.309429992675781250E+03 + 0.311029968261718750E+03 + 0.312190032958984375E+03 + 0.313570007324218750E+03 + 0.314700012207031250E+03 + 0.315859985351562500E+03 + 0.317509979248046875E+03 + 0.319209991455078125E+03 + 0.320940002441406250E+03 + 0.322510009765625000E+03 + 0.324149963378906250E+03 + 0.327439971923828125E+03 + 0.337469970703125000E+03 + 0.357589996337890625E+03 + 0.379390014648437500E+03 + 0.403859985351562500E+03 + 0.429979980468750000E+03 + 0.465670013427734375E+03 + 0.503269989013671875E+03 + 0.541519958496093750E+03 +__ps + 35 + 0.990000000000000000E+05 + 0.979103046875000000E+05 + 0.967206328125000000E+05 + 0.954221953125000000E+05 + 0.940067812500000000E+05 + 0.924657890625000000E+05 + 0.907903359375000000E+05 + 0.889713671875000000E+05 + 0.869998593750000000E+05 + 0.848665859375000000E+05 + 0.825626484375000000E+05 + 0.800791093750000000E+05 + 0.774072031250000000E+05 + 0.745411562500000000E+05 + 0.714829531250000000E+05 + 0.682369765625000000E+05 + 0.648056328125000000E+05 + 0.611899843750000000E+05 + 0.573959570312500000E+05 + 0.534349296875000000E+05 + 0.493217070312500000E+05 + 0.450816445312500000E+05 + 0.407470156250000000E+05 + 0.363542890625000000E+05 + 0.319460332031250000E+05 + 0.275735761718750000E+05 + 0.233073164062500000E+05 + 0.192918867187500000E+05 + 0.155726064453125000E+05 + 0.123097558593750000E+05 + 0.947972363281250000E+04 + 0.707827929687500000E+04 + 0.510501708984375000E+04 + 0.360986938476562500E+04 + 0.253038891601562500E+04 +__hs + 35 + 0.000000000000000000E+00 + 0.100002868652343750E+03 + 0.210000503540039062E+03 + 0.330998321533203125E+03 + 0.464095123291015625E+03 + 0.610502075195312500E+03 + 0.771550354003906250E+03 + 0.948713012695312500E+03 + 0.114357568359375000E+04 + 0.135793383789062500E+04 + 0.159372290039062500E+04 + 0.185310449218750000E+04 + 0.213841821289062500E+04 + 0.245225878906250000E+04 + 0.279748461914062500E+04 + 0.317723657226562500E+04 + 0.359496240234375000E+04 + 0.405446093750000000E+04 + 0.455991406250000000E+04 + 0.511591503906250000E+04 + 0.572751757812500000E+04 + 0.640028662109375000E+04 + 0.714033789062500000E+04 + 0.795439843750000000E+04 + 0.884990039062500000E+04 + 0.983496484375000000E+04 + 0.109185126953125000E+05 + 0.121001347656250000E+05 + 0.134203779296875000E+05 + 0.148615781250000000E+05 + 0.164467695312500000E+05 + 0.181904414062500000E+05 + 0.201076933593750000E+05 + 0.221054843750000000E+05 + 0.241034882812500000E+05 +__ihtran + 1 + 0 +__ngrids + 1 + 1 +__nzg + 1 + 11 +__nzs + 1 + 1 +__npatch + 1 + 2 +__nvegpat + 1 + 1 +__nkppz + 1 + 48 +__ztop + 1 + 0.200100156250000000E+05 +__polelat + 1 + 0.370000000000000000E+02 +__polelon + 1 + -0.975000000000000000E+02 +__nnxp + 1 + 25 +__nnyp + 1 + 35 +__nnzp + 1 + 250 +__nstratx + 1 + 1 +__nstraty + 1 + 1 +__nxtnest + 1 + 0 +__ninest + 1 + 1 +__njnest + 1 + 1 +__nknest + 1 + 1 +__deltaxn + 1 + 0.200000000000000000E+04 +__deltazn + 1 + 0.100000000000000000E+02 +__nestz + 1 + 0 +__nstratz + 250 + 1 + 1 + 3 + 3 + 3 + 3 + 2 + 2 + 2 + 2 + 1 + 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 + 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 + 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 + 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 + 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 + 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 + 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 + 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 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 +__ngbegun + 1 + 1 +__iref + 1 + 0 +__jref + 1 + 0 +__topref + 1 + 0.000000000000000000E+00 +__xmn01 + 25 + -0.230000000000000000E+05 + -0.210000000000000000E+05 + -0.190000000000000000E+05 + -0.170000000000000000E+05 + -0.150000000000000000E+05 + -0.130000000000000000E+05 + -0.110000000000000000E+05 + -0.900000000000000000E+04 + -0.700000000000000000E+04 + -0.500000000000000000E+04 + -0.300000000000000000E+04 + -0.100000000000000000E+04 + 0.100000000000000000E+04 + 0.300000000000000000E+04 + 0.500000000000000000E+04 + 0.700000000000000000E+04 + 0.900000000000000000E+04 + 0.110000000000000000E+05 + 0.130000000000000000E+05 + 0.150000000000000000E+05 + 0.170000000000000000E+05 + 0.190000000000000000E+05 + 0.210000000000000000E+05 + 0.230000000000000000E+05 + 0.250000000000000000E+05 +__xtn01 + 25 + -0.240000000000000000E+05 + -0.220000000000000000E+05 + -0.200000000000000000E+05 + -0.180000000000000000E+05 + -0.160000000000000000E+05 + -0.140000000000000000E+05 + -0.120000000000000000E+05 + -0.100000000000000000E+05 + -0.800000000000000000E+04 + -0.600000000000000000E+04 + -0.400000000000000000E+04 + -0.200000000000000000E+04 + 0.000000000000000000E+00 + 0.200000000000000000E+04 + 0.400000000000000000E+04 + 0.600000000000000000E+04 + 0.800000000000000000E+04 + 0.100000000000000000E+05 + 0.120000000000000000E+05 + 0.140000000000000000E+05 + 0.160000000000000000E+05 + 0.180000000000000000E+05 + 0.200000000000000000E+05 + 0.220000000000000000E+05 + 0.240000000000000000E+05 +__ymn01 + 35 + -0.330000000000000000E+05 + -0.310000000000000000E+05 + -0.290000000000000000E+05 + -0.270000000000000000E+05 + -0.250000000000000000E+05 + -0.230000000000000000E+05 + -0.210000000000000000E+05 + -0.190000000000000000E+05 + -0.170000000000000000E+05 + -0.150000000000000000E+05 + -0.130000000000000000E+05 + -0.110000000000000000E+05 + -0.900000000000000000E+04 + -0.700000000000000000E+04 + -0.500000000000000000E+04 + -0.300000000000000000E+04 + -0.100000000000000000E+04 + 0.100000000000000000E+04 + 0.300000000000000000E+04 + 0.500000000000000000E+04 + 0.700000000000000000E+04 + 0.900000000000000000E+04 + 0.110000000000000000E+05 + 0.130000000000000000E+05 + 0.150000000000000000E+05 + 0.170000000000000000E+05 + 0.190000000000000000E+05 + 0.210000000000000000E+05 + 0.230000000000000000E+05 + 0.250000000000000000E+05 + 0.270000000000000000E+05 + 0.290000000000000000E+05 + 0.310000000000000000E+05 + 0.330000000000000000E+05 + 0.350000000000000000E+05 +__ytn01 + 35 + -0.340000000000000000E+05 + -0.320000000000000000E+05 + -0.300000000000000000E+05 + -0.280000000000000000E+05 + -0.260000000000000000E+05 + -0.240000000000000000E+05 + -0.220000000000000000E+05 + -0.200000000000000000E+05 + -0.180000000000000000E+05 + -0.160000000000000000E+05 + -0.140000000000000000E+05 + -0.120000000000000000E+05 + -0.100000000000000000E+05 + -0.800000000000000000E+04 + -0.600000000000000000E+04 + -0.400000000000000000E+04 + -0.200000000000000000E+04 + 0.000000000000000000E+00 + 0.200000000000000000E+04 + 0.400000000000000000E+04 + 0.600000000000000000E+04 + 0.800000000000000000E+04 + 0.100000000000000000E+05 + 0.120000000000000000E+05 + 0.140000000000000000E+05 + 0.160000000000000000E+05 + 0.180000000000000000E+05 + 0.200000000000000000E+05 + 0.220000000000000000E+05 + 0.240000000000000000E+05 + 0.260000000000000000E+05 + 0.280000000000000000E+05 + 0.300000000000000000E+05 + 0.320000000000000000E+05 + 0.340000000000000000E+05 +__zmn01 + 250 + 0.000000000000000000E+00 + 0.100000000000000000E+02 + 0.202999992370605469E+02 + 0.309089984893798828E+02 + 0.418362655639648438E+02 + 0.530913505554199219E+02 + 0.646840896606445313E+02 + 0.766246109008789063E+02 + 0.889233474731445313E+02 + 0.101591049194335937E+03 + 0.114638778686523437E+03 + 0.128077941894531250E+03 + 0.141920272827148437E+03 + 0.156177871704101562E+03 + 0.170863204956054687E+03 + 0.185989105224609375E+03 + 0.201568786621093750E+03 + 0.217615859985351562E+03 + 0.234144348144531250E+03 + 0.251168685913085937E+03 + 0.268703765869140625E+03 + 0.286764892578125000E+03 + 0.305367858886718750E+03 + 0.324528900146484375E+03 + 0.344264770507812500E+03 + 0.364592712402343750E+03 + 0.385530487060546875E+03 + 0.407096405029296875E+03 + 0.429309295654296875E+03 + 0.452188568115234375E+03 + 0.475754211425781250E+03 + 0.500026824951171875E+03 + 0.525027587890625000E+03 + 0.550778381347656250E+03 + 0.577301696777343750E+03 + 0.604620727539062500E+03 + 0.632759338378906250E+03 + 0.661742126464843750E+03 + 0.691594421386718750E+03 + 0.722342285156250000E+03 + 0.754012573242187500E+03 + 0.786632995605468750E+03 + 0.820232055664062500E+03 + 0.854839111328125000E+03 + 0.890484375000000000E+03 + 0.927198974609375000E+03 + 0.965015014648437500E+03 + 0.100396551513671875E+04 + 0.104408447265625000E+04 + 0.108540698242187500E+04 + 0.112796911621093750E+04 + 0.117180810546875000E+04 + 0.121696228027343750E+04 + 0.126347106933593750E+04 + 0.131137512207031250E+04 + 0.136071630859375000E+04 + 0.141153771972656250E+04 + 0.146388378906250000E+04 + 0.151780029296875000E+04 + 0.157333422851562500E+04 + 0.163053417968750000E+04 + 0.168945007324218750E+04 + 0.175013342285156250E+04 + 0.181263732910156250E+04 + 0.187701635742187500E+04 + 0.194332678222656250E+04 + 0.201162646484375000E+04 + 0.208197509765625000E+04 + 0.215443408203125000E+04 + 0.222906689453125000E+04 + 0.230593872070312500E+04 + 0.238511669921875000E+04 + 0.246666992187500000E+04 + 0.255066967773437500E+04 + 0.263718945312500000E+04 + 0.272630493164062500E+04 + 0.281809375000000000E+04 + 0.291263623046875000E+04 + 0.301001489257812500E+04 + 0.311001489257812500E+04 + 0.321001489257812500E+04 + 0.331001489257812500E+04 + 0.341001489257812500E+04 + 0.351001489257812500E+04 + 0.361001489257812500E+04 + 0.371001489257812500E+04 + 0.381001489257812500E+04 + 0.391001489257812500E+04 + 0.401001489257812500E+04 + 0.411001464843750000E+04 + 0.421001464843750000E+04 + 0.431001464843750000E+04 + 0.441001464843750000E+04 + 0.451001464843750000E+04 + 0.461001464843750000E+04 + 0.471001464843750000E+04 + 0.481001464843750000E+04 + 0.491001464843750000E+04 + 0.501001464843750000E+04 + 0.511001464843750000E+04 + 0.521001464843750000E+04 + 0.531001464843750000E+04 + 0.541001464843750000E+04 + 0.551001464843750000E+04 + 0.561001464843750000E+04 + 0.571001464843750000E+04 + 0.581001464843750000E+04 + 0.591001464843750000E+04 + 0.601001464843750000E+04 + 0.611001464843750000E+04 + 0.621001464843750000E+04 + 0.631001464843750000E+04 + 0.641001464843750000E+04 + 0.651001464843750000E+04 + 0.661001464843750000E+04 + 0.671001464843750000E+04 + 0.681001464843750000E+04 + 0.691001464843750000E+04 + 0.701001464843750000E+04 + 0.711001464843750000E+04 + 0.721001464843750000E+04 + 0.731001464843750000E+04 + 0.741001464843750000E+04 + 0.751001464843750000E+04 + 0.761001464843750000E+04 + 0.771001464843750000E+04 + 0.781001464843750000E+04 + 0.791001464843750000E+04 + 0.801001464843750000E+04 + 0.811001464843750000E+04 + 0.821001464843750000E+04 + 0.831001464843750000E+04 + 0.841001464843750000E+04 + 0.851001464843750000E+04 + 0.861001464843750000E+04 + 0.871001464843750000E+04 + 0.881001464843750000E+04 + 0.891001464843750000E+04 + 0.901001464843750000E+04 + 0.911001464843750000E+04 + 0.921001464843750000E+04 + 0.931001464843750000E+04 + 0.941001464843750000E+04 + 0.951001464843750000E+04 + 0.961001464843750000E+04 + 0.971001464843750000E+04 + 0.981001464843750000E+04 + 0.991001464843750000E+04 + 0.100100146484375000E+05 + 0.101100146484375000E+05 + 0.102100146484375000E+05 + 0.103100146484375000E+05 + 0.104100146484375000E+05 + 0.105100146484375000E+05 + 0.106100146484375000E+05 + 0.107100146484375000E+05 + 0.108100146484375000E+05 + 0.109100146484375000E+05 + 0.110100146484375000E+05 + 0.111100146484375000E+05 + 0.112100146484375000E+05 + 0.113100146484375000E+05 + 0.114100146484375000E+05 + 0.115100146484375000E+05 + 0.116100146484375000E+05 + 0.117100146484375000E+05 + 0.118100146484375000E+05 + 0.119100146484375000E+05 + 0.120100146484375000E+05 + 0.121100146484375000E+05 + 0.122100146484375000E+05 + 0.123100146484375000E+05 + 0.124100146484375000E+05 + 0.125100146484375000E+05 + 0.126100146484375000E+05 + 0.127100146484375000E+05 + 0.128100146484375000E+05 + 0.129100146484375000E+05 + 0.130100146484375000E+05 + 0.131100146484375000E+05 + 0.132100146484375000E+05 + 0.133100146484375000E+05 + 0.134100146484375000E+05 + 0.135100146484375000E+05 + 0.136100146484375000E+05 + 0.137100146484375000E+05 + 0.138100146484375000E+05 + 0.139100146484375000E+05 + 0.140100146484375000E+05 + 0.141100146484375000E+05 + 0.142100146484375000E+05 + 0.143100146484375000E+05 + 0.144100146484375000E+05 + 0.145100146484375000E+05 + 0.146100146484375000E+05 + 0.147100146484375000E+05 + 0.148100146484375000E+05 + 0.149100146484375000E+05 + 0.150100146484375000E+05 + 0.151100146484375000E+05 + 0.152100146484375000E+05 + 0.153100146484375000E+05 + 0.154100146484375000E+05 + 0.155100146484375000E+05 + 0.156100146484375000E+05 + 0.157100146484375000E+05 + 0.158100146484375000E+05 + 0.159100146484375000E+05 + 0.160100146484375000E+05 + 0.161100146484375000E+05 + 0.162100146484375000E+05 + 0.163100146484375000E+05 + 0.164100156250000000E+05 + 0.165100156250000000E+05 + 0.166100156250000000E+05 + 0.167100156250000000E+05 + 0.168100156250000000E+05 + 0.169100156250000000E+05 + 0.170100156250000000E+05 + 0.171100156250000000E+05 + 0.172100156250000000E+05 + 0.173100156250000000E+05 + 0.174100156250000000E+05 + 0.175100156250000000E+05 + 0.176100156250000000E+05 + 0.177100156250000000E+05 + 0.178100156250000000E+05 + 0.179100156250000000E+05 + 0.180100156250000000E+05 + 0.181100156250000000E+05 + 0.182100156250000000E+05 + 0.183100156250000000E+05 + 0.184100156250000000E+05 + 0.185100156250000000E+05 + 0.186100156250000000E+05 + 0.187100156250000000E+05 + 0.188100156250000000E+05 + 0.189100156250000000E+05 + 0.190100156250000000E+05 + 0.191100156250000000E+05 + 0.192100156250000000E+05 + 0.193100156250000000E+05 + 0.194100156250000000E+05 + 0.195100156250000000E+05 + 0.196100156250000000E+05 + 0.197100156250000000E+05 + 0.198100156250000000E+05 + 0.199100156250000000E+05 + 0.200100156250000000E+05 + 0.201100156250000000E+05 +__ztn01 + 250 + -0.489024114608764648E+01 + 0.496305179595947266E+01 + 0.151119432449340820E+02 + 0.255652999877929688E+02 + 0.363322563171386719E+02 + 0.474222221374511719E+02 + 0.588448867797851563E+02 + 0.706102294921875000E+02 + 0.827285385131835938E+02 + 0.952103958129882813E+02 + 0.108066703796386719E+03 + 0.121308708190917969E+03 + 0.134947967529296875E+03 + 0.148996398925781250E+03 + 0.163466278076171875E+03 + 0.178370269775390625E+03 + 0.193721374511718750E+03 + 0.209533035278320312E+03 + 0.225819030761718750E+03 + 0.242593612670898437E+03 + 0.259871429443359375E+03 + 0.277667602539062500E+03 + 0.295997650146484375E+03 + 0.314877593994140625E+03 + 0.334323913574218750E+03 + 0.354353637695312500E+03 + 0.374984252929687500E+03 + 0.396233764648437500E+03 + 0.418120788574218750E+03 + 0.440664398193359375E+03 + 0.463884307861328125E+03 + 0.487800842285156250E+03 + 0.512434814453125000E+03 + 0.537807861328125000E+03 + 0.563942016601562500E+03 + 0.590860290527343750E+03 + 0.618586059570312500E+03 + 0.647143615722656250E+03 + 0.676557983398437500E+03 + 0.706854736328125000E+03 + 0.738060424804687500E+03 + 0.770202270507812500E+03 + 0.803308410644531250E+03 + 0.837407714843750000E+03 + 0.872530029296875000E+03 + 0.908706054687500000E+03 + 0.945967285156250000E+03 + 0.984346374511718750E+03 + 0.102387677001953125E+04 + 0.106459301757812500E+04 + 0.110653076171875000E+04 + 0.114972668457031250E+04 + 0.119421838378906250E+04 + 0.124004479980468750E+04 + 0.128724609375000000E+04 + 0.133586340332031250E+04 + 0.138593920898437500E+04 + 0.143751733398437500E+04 + 0.149064282226562500E+04 + 0.154536206054687500E+04 + 0.160172290039062500E+04 + 0.165977441406250000E+04 + 0.171956750488281250E+04 + 0.178115441894531250E+04 + 0.184458898925781250E+04 + 0.190992651367187500E+04 + 0.197722424316406250E+04 + 0.204654089355468750E+04 + 0.211793676757812500E+04 + 0.219147460937500000E+04 + 0.226721875000000000E+04 + 0.234523510742187500E+04 + 0.242559204101562500E+04 + 0.250835937500000000E+04 + 0.259360986328125000E+04 + 0.268141796875000000E+04 + 0.277186010742187500E+04 + 0.286501562500000000E+04 + 0.296098388671875000E+04 + 0.305984887695312500E+04 + 0.316001489257812500E+04 + 0.326001489257812500E+04 + 0.336001489257812500E+04 + 0.346001489257812500E+04 + 0.356001489257812500E+04 + 0.366001489257812500E+04 + 0.376001489257812500E+04 + 0.386001489257812500E+04 + 0.396001489257812500E+04 + 0.406001464843750000E+04 + 0.416001464843750000E+04 + 0.426001464843750000E+04 + 0.436001464843750000E+04 + 0.446001464843750000E+04 + 0.456001464843750000E+04 + 0.466001464843750000E+04 + 0.476001464843750000E+04 + 0.486001464843750000E+04 + 0.496001464843750000E+04 + 0.506001464843750000E+04 + 0.516001464843750000E+04 + 0.526001464843750000E+04 + 0.536001464843750000E+04 + 0.546001464843750000E+04 + 0.556001464843750000E+04 + 0.566001464843750000E+04 + 0.576001464843750000E+04 + 0.586001464843750000E+04 + 0.596001464843750000E+04 + 0.606001464843750000E+04 + 0.616001464843750000E+04 + 0.626001464843750000E+04 + 0.636001464843750000E+04 + 0.646001464843750000E+04 + 0.656001464843750000E+04 + 0.666001464843750000E+04 + 0.676001464843750000E+04 + 0.686001464843750000E+04 + 0.696001464843750000E+04 + 0.706001464843750000E+04 + 0.716001464843750000E+04 + 0.726001464843750000E+04 + 0.736001464843750000E+04 + 0.746001464843750000E+04 + 0.756001464843750000E+04 + 0.766001464843750000E+04 + 0.776001464843750000E+04 + 0.786001464843750000E+04 + 0.796001464843750000E+04 + 0.806001464843750000E+04 + 0.816001464843750000E+04 + 0.826001464843750000E+04 + 0.836001464843750000E+04 + 0.846001464843750000E+04 + 0.856001464843750000E+04 + 0.866001464843750000E+04 + 0.876001464843750000E+04 + 0.886001464843750000E+04 + 0.896001464843750000E+04 + 0.906001464843750000E+04 + 0.916001464843750000E+04 + 0.926001464843750000E+04 + 0.936001464843750000E+04 + 0.946001464843750000E+04 + 0.956001464843750000E+04 + 0.966001464843750000E+04 + 0.976001464843750000E+04 + 0.986001464843750000E+04 + 0.996001464843750000E+04 + 0.100600146484375000E+05 + 0.101600146484375000E+05 + 0.102600146484375000E+05 + 0.103600146484375000E+05 + 0.104600146484375000E+05 + 0.105600146484375000E+05 + 0.106600146484375000E+05 + 0.107600146484375000E+05 + 0.108600146484375000E+05 + 0.109600146484375000E+05 + 0.110600146484375000E+05 + 0.111600146484375000E+05 + 0.112600146484375000E+05 + 0.113600146484375000E+05 + 0.114600146484375000E+05 + 0.115600146484375000E+05 + 0.116600146484375000E+05 + 0.117600146484375000E+05 + 0.118600146484375000E+05 + 0.119600146484375000E+05 + 0.120600146484375000E+05 + 0.121600146484375000E+05 + 0.122600146484375000E+05 + 0.123600146484375000E+05 + 0.124600146484375000E+05 + 0.125600146484375000E+05 + 0.126600146484375000E+05 + 0.127600146484375000E+05 + 0.128600146484375000E+05 + 0.129600146484375000E+05 + 0.130600146484375000E+05 + 0.131600146484375000E+05 + 0.132600146484375000E+05 + 0.133600146484375000E+05 + 0.134600146484375000E+05 + 0.135600146484375000E+05 + 0.136600146484375000E+05 + 0.137600146484375000E+05 + 0.138600146484375000E+05 + 0.139600146484375000E+05 + 0.140600146484375000E+05 + 0.141600146484375000E+05 + 0.142600146484375000E+05 + 0.143600146484375000E+05 + 0.144600146484375000E+05 + 0.145600146484375000E+05 + 0.146600146484375000E+05 + 0.147600146484375000E+05 + 0.148600146484375000E+05 + 0.149600146484375000E+05 + 0.150600146484375000E+05 + 0.151600146484375000E+05 + 0.152600146484375000E+05 + 0.153600146484375000E+05 + 0.154600146484375000E+05 + 0.155600146484375000E+05 + 0.156600146484375000E+05 + 0.157600146484375000E+05 + 0.158600146484375000E+05 + 0.159600146484375000E+05 + 0.160600146484375000E+05 + 0.161600146484375000E+05 + 0.162600146484375000E+05 + 0.163600156250000000E+05 + 0.164600156250000000E+05 + 0.165600156250000000E+05 + 0.166600156250000000E+05 + 0.167600156250000000E+05 + 0.168600156250000000E+05 + 0.169600156250000000E+05 + 0.170600156250000000E+05 + 0.171600156250000000E+05 + 0.172600156250000000E+05 + 0.173600156250000000E+05 + 0.174600156250000000E+05 + 0.175600156250000000E+05 + 0.176600156250000000E+05 + 0.177600156250000000E+05 + 0.178600156250000000E+05 + 0.179600156250000000E+05 + 0.180600156250000000E+05 + 0.181600156250000000E+05 + 0.182600156250000000E+05 + 0.183600156250000000E+05 + 0.184600156250000000E+05 + 0.185600156250000000E+05 + 0.186600156250000000E+05 + 0.187600156250000000E+05 + 0.188600156250000000E+05 + 0.189600156250000000E+05 + 0.190600156250000000E+05 + 0.191600156250000000E+05 + 0.192600156250000000E+05 + 0.193600156250000000E+05 + 0.194600156250000000E+05 + 0.195600156250000000E+05 + 0.196600156250000000E+05 + 0.197600156250000000E+05 + 0.198600156250000000E+05 + 0.199600156250000000E+05 + 0.200600156250000000E+05 +__dzmn01 + 250 + 0.101488918066024780E+00 + 0.985329300165176392E-01 + 0.956630483269691467E-01 + 0.928767547011375427E-01 + 0.901716053485870361E-01 + 0.875452458858489990E-01 + 0.849953964352607727E-01 + 0.825197622179985046E-01 + 0.801162794232368469E-01 + 0.777828320860862732E-01 + 0.755172669887542725E-01 + 0.733177661895751953E-01 + 0.711823254823684692E-01 + 0.691090747714042664E-01 + 0.670961216092109680E-01 + 0.651418939232826233E-01 + 0.632444620132446289E-01 + 0.614024475216865540E-01 + 0.596140027046203613E-01 + 0.578776821494102478E-01 + 0.561918579041957855E-01 + 0.545552335679531097E-01 + 0.529662594199180603E-01 + 0.514236129820346832E-01 + 0.499258004128932953E-01 + 0.484716519713401794E-01 + 0.470599047839641571E-01 + 0.456891730427742004E-01 + 0.443584695458412170E-01 + 0.430664904415607452E-01 + 0.418120771646499634E-01 + 0.405943468213081360E-01 + 0.394118987023830414E-01 + 0.382641032338142395E-01 + 0.371494852006435394E-01 + 0.360675305128097534E-01 + 0.350170023739337921E-01 + 0.339969918131828308E-01 + 0.330068357288837433E-01 + 0.320454388856887817E-01 + 0.311120897531509399E-01 + 0.302058774977922440E-01 + 0.293261110782623291E-01 + 0.284719280898571014E-01 + 0.276426170021295547E-01 + 0.268375463783740997E-01 + 0.260558556765317917E-01 + 0.252969898283481598E-01 + 0.245602205395698547E-01 + 0.238448679447174072E-01 + 0.231503322720527649E-01 + 0.224761031568050385E-01 + 0.218214746564626694E-01 + 0.211858600378036499E-01 + 0.205688066780567169E-01 + 0.199697241187095642E-01 + 0.193880647420883179E-01 + 0.188233572989702225E-01 + 0.182751081883907318E-01 + 0.177428163588047028E-01 + 0.172260794788599014E-01 + 0.167243406176567078E-01 + 0.162372160702943802E-01 + 0.157642755657434464E-01 + 0.153051409870386124E-01 + 0.148593420162796974E-01 + 0.144265480339527130E-01 + 0.140064116567373276E-01 + 0.135984411463141441E-01 + 0.132023412734270096E-01 + 0.128178251907229424E-01 + 0.124444765970110893E-01 + 0.120820617303252220E-01 + 0.117301382124423981E-01 + 0.113884704187512398E-01 + 0.110567929223179817E-01 + 0.107347369194030762E-01 + 0.104201119393110275E-01 + 0.101148039102554321E-01 + 0.998342595994472504E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.100000239908695221E-01 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999990198761224747E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 +__dztn01 + 250 + 0.103000000119209290E+00 + 0.100000001490116119E+00 + 0.970873832702636719E-01 + 0.942595973610877991E-01 + 0.915141925215721130E-01 + 0.888487324118614197E-01 + 0.862608924508094788E-01 + 0.837484374642372131E-01 + 0.813091620802879333E-01 + 0.789409205317497253E-01 + 0.766416862607002258E-01 + 0.744093954563140869E-01 + 0.722421705722808838E-01 + 0.701380372047424316E-01 + 0.680951550602912903E-01 + 0.661117658019065857E-01 + 0.641861632466316223E-01 + 0.623166598379611969E-01 + 0.605016015470027924E-01 + 0.587394349277019501E-01 + 0.570285394787788391E-01 + 0.553675331175327301E-01 + 0.537548698484897614E-01 + 0.521892309188842773E-01 + 0.506691597402095795E-01 + 0.491933710873126984E-01 + 0.477605685591697693E-01 + 0.463694632053375244E-01 + 0.450189039111137390E-01 + 0.437076836824417114E-01 + 0.424346588551998138E-01 + 0.411986932158470154E-01 + 0.399987809360027313E-01 + 0.388337559998035431E-01 + 0.377026759088039398E-01 + 0.366045199334621429E-01 + 0.355383567512035370E-01 + 0.345032364130020142E-01 + 0.334982611238956451E-01 + 0.325225852429866791E-01 + 0.315753370523452759E-01 + 0.306556429713964462E-01 + 0.297627374529838562E-01 + 0.288958419114351273E-01 + 0.280542187392711639E-01 + 0.272371210157871246E-01 + 0.264438055455684662E-01 + 0.256736110895872116E-01 + 0.249258726835250854E-01 + 0.241998862475156784E-01 + 0.234950631856918335E-01 + 0.228107441216707230E-01 + 0.221463460475206375E-01 + 0.215013120323419571E-01 + 0.208750609308481216E-01 + 0.202670432627201080E-01 + 0.196767468005418777E-01 + 0.191036313772201538E-01 + 0.185471959412097931E-01 + 0.180070083588361740E-01 + 0.174825321882963181E-01 + 0.169733483344316483E-01 + 0.164789855480194092E-01 + 0.159990005195140839E-01 + 0.155330086126923561E-01 + 0.150805851444602013E-01 + 0.146413566544651985E-01 + 0.142149170860648155E-01 + 0.138009106740355492E-01 + 0.133989322930574417E-01 + 0.130086671561002731E-01 + 0.126297743991017342E-01 + 0.122619308531284332E-01 + 0.119047965854406357E-01 + 0.115580512210726738E-01 + 0.112213948741555214E-01 + 0.108945732936263084E-01 + 0.105772558599710464E-01 + 0.102691901847720146E-01 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.100000239908695221E-01 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999990198761224747E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 +__u01dn01 + 250 + -0.271000003814697266E+01 + -0.271000003814697266E+01 + -0.271000003814697266E+01 + -0.271000003814697266E+01 + -0.271000003814697266E+01 + -0.271000003814697266E+01 + -0.271000003814697266E+01 + -0.271000003814697266E+01 + -0.271000003814697266E+01 + -0.271000003814697266E+01 + -0.277084660530090332E+01 + -0.287076568603515625E+01 + -0.297368240356445313E+01 + -0.307968640327453613E+01 + -0.318887066841125488E+01 + -0.330133032798767090E+01 + -0.341716384887695313E+01 + -0.353647255897521973E+01 + -0.352038979530334473E+01 + -0.349959468841552734E+01 + -0.347817540168762207E+01 + -0.345611381530761719E+01 + -0.343339014053344727E+01 + -0.340998482704162598E+01 + -0.337475848197937012E+01 + -0.328295969963073730E+01 + -0.318840670585632324E+01 + -0.309101748466491699E+01 + -0.299070644378662109E+01 + -0.288738608360290527E+01 + -0.278096628189086914E+01 + -0.261160659790039063E+01 + -0.243661952018737793E+01 + -0.225638246536254883E+01 + -0.207073879241943359E+01 + -0.187952518463134766E+01 + -0.167072951793670654E+01 + -0.142602384090423584E+01 + -0.117397618293762207E+01 + -0.914367675781250000E+00 + -0.646970510482788086E+00 + -0.371551632881164551E+00 + -0.713925063610076904E-01 + 0.238491535186767578E+00 + 0.557672321796417236E+00 + 0.886429071426391602E+00 + 0.122504770755767822E+01 + 0.155904006958007813E+01 + 0.190187835693359375E+01 + 0.225500106811523438E+01 + 0.261871767044067383E+01 + 0.298705983161926270E+01 + 0.332745456695556641E+01 + 0.367806077003479004E+01 + 0.403918600082397461E+01 + 0.441114473342895508E+01 + 0.475697183609008789E+01 + 0.508290481567382813E+01 + 0.541861581802368164E+01 + 0.576439809799194336E+01 + 0.610793638229370117E+01 + 0.638321971893310547E+01 + 0.666676139831542969E+01 + 0.695880937576293945E+01 + 0.725961923599243164E+01 + 0.754496240615844727E+01 + 0.783508586883544922E+01 + 0.813391304016113281E+01 + 0.844170379638671875E+01 + 0.872272300720214844E+01 + 0.899785709381103516E+01 + 0.928124523162841797E+01 + 0.957313537597656250E+01 + 0.986987972259521484E+01 + 0.101736173629760742E+02 + 0.104864673614501953E+02 + 0.108087024688720703E+02 + 0.111116161346435547E+02 + 0.114123449325561523E+02 + 0.117221508026123047E+02 + 0.120360336303710938E+02 + 0.122386236190795898E+02 + 0.124181671142578125E+02 + 0.125977106094360352E+02 + 0.127772541046142578E+02 + 0.131642017364501953E+02 + 0.136625709533691406E+02 + 0.141609401702880859E+02 + 0.146593103408813477E+02 + 0.151472501754760742E+02 + 0.154578628540039063E+02 + 0.157684755325317383E+02 + 0.160790882110595703E+02 + 0.163896999359130859E+02 + 0.167001209259033203E+02 + 0.168188247680664063E+02 + 0.169375305175781250E+02 + 0.170562343597412109E+02 + 0.171749401092529297E+02 + 0.172936439514160156E+02 + 0.173657684326171875E+02 + 0.173788490295410156E+02 + 0.173919296264648438E+02 + 0.174050102233886719E+02 + 0.174180908203125000E+02 + 0.174311714172363281E+02 + 0.174206790924072266E+02 + 0.173612232208251953E+02 + 0.173017673492431641E+02 + 0.172423114776611328E+02 + 0.171828556060791016E+02 + 0.171233997344970703E+02 + 0.170639457702636719E+02 + 0.170230522155761719E+02 + 0.169946746826171875E+02 + 0.169662990570068359E+02 + 0.169379234313964844E+02 + 0.169095458984375000E+02 + 0.168811702728271484E+02 + 0.168527927398681641E+02 + 0.168355598449707031E+02 + 0.168638134002685547E+02 + 0.168920669555664063E+02 + 0.169203186035156250E+02 + 0.169485721588134766E+02 + 0.169768257141113281E+02 + 0.170050792694091797E+02 + 0.170333328247070313E+02 + 0.170682773590087891E+02 + 0.172156810760498047E+02 + 0.173630847930908203E+02 + 0.175104885101318359E+02 + 0.176578903198242188E+02 + 0.178052940368652344E+02 + 0.179526977539062500E+02 + 0.181001014709472656E+02 + 0.182475051879882813E+02 + 0.184006366729736328E+02 + 0.186046848297119141E+02 + 0.188087329864501953E+02 + 0.190127792358398438E+02 + 0.192168273925781250E+02 + 0.194208755493164063E+02 + 0.196249217987060547E+02 + 0.198289699554443359E+02 + 0.200330181121826172E+02 + 0.202370643615722656E+02 + 0.204575042724609375E+02 + 0.207269897460937500E+02 + 0.209964752197265625E+02 + 0.212659606933593750E+02 + 0.215354461669921875E+02 + 0.218049297332763672E+02 + 0.220744152069091797E+02 + 0.223439006805419922E+02 + 0.226133861541748047E+02 + 0.228828697204589844E+02 + 0.231523551940917969E+02 + 0.234810485839843750E+02 + 0.238931922912597656E+02 + 0.243053379058837891E+02 + 0.247174835205078125E+02 + 0.251296291351318359E+02 + 0.255417747497558594E+02 + 0.259539203643798828E+02 + 0.263660659790039063E+02 + 0.267782115936279297E+02 + 0.271903572082519531E+02 + 0.276025009155273438E+02 + 0.280146465301513672E+02 + 0.280276069641113281E+02 + 0.277731075286865234E+02 + 0.275186100006103516E+02 + 0.272641105651855469E+02 + 0.270096130371093750E+02 + 0.267551136016845703E+02 + 0.265006141662597656E+02 + 0.262461166381835938E+02 + 0.259916172027587891E+02 + 0.257371196746826172E+02 + 0.254826202392578125E+02 + 0.252281227111816406E+02 + 0.249736232757568359E+02 + 0.247190647125244141E+02 + 0.244644165039062500E+02 + 0.242097682952880859E+02 + 0.239551181793212891E+02 + 0.237004699707031250E+02 + 0.234458217620849609E+02 + 0.231911716461181641E+02 + 0.229365234375000000E+02 + 0.226818733215332031E+02 + 0.224272251129150391E+02 + 0.221725769042968750E+02 + 0.219179267883300781E+02 + 0.216632785797119141E+02 + 0.214086303710937500E+02 + 0.211539802551269531E+02 + 0.209239654541015625E+02 + 0.206943397521972656E+02 + 0.204647140502929688E+02 + 0.202350883483886719E+02 + 0.200054626464843750E+02 + 0.197758388519287109E+02 + 0.195462131500244141E+02 + 0.193165874481201172E+02 + 0.190869636535644531E+02 + 0.188573379516601563E+02 + 0.186277122497558594E+02 + 0.183980865478515625E+02 + 0.181684608459472656E+02 + 0.179388370513916016E+02 + 0.177092094421386719E+02 + 0.174503669738769531E+02 + 0.170001678466796875E+02 + 0.165499668121337891E+02 + 0.160997676849365234E+02 + 0.156495685577392578E+02 + 0.151993694305419922E+02 + 0.147491703033447266E+02 + 0.142989702224731445E+02 + 0.138487710952758789E+02 + 0.133985719680786133E+02 + 0.129483718872070313E+02 + 0.124981727600097656E+02 + 0.120479736328125000E+02 + 0.115977745056152344E+02 + 0.111475753784179688E+02 + 0.106973752975463867E+02 + 0.102471752166748047E+02 + 0.979697608947753906E+01 + 0.938239288330078125E+01 + 0.898338413238525391E+01 + 0.858437538146972656E+01 + 0.818536758422851563E+01 + 0.778635835647583008E+01 + 0.738735008239746094E+01 + 0.698834133148193359E+01 + 0.658933258056640625E+01 + 0.619032430648803711E+01 + 0.579131603240966797E+01 + 0.539230728149414063E+01 + 0.499329853057861328E+01 + 0.459428977966308594E+01 + 0.419528150558471680E+01 + 0.379627275466918945E+01 + 0.339726400375366211E+01 + 0.299825572967529297E+01 + 0.259924697875976563E+01 + 0.220023870468139648E+01 +__v01dn01 + 250 + 0.838000011444091797E+01 + 0.838000011444091797E+01 + 0.838000011444091797E+01 + 0.838000011444091797E+01 + 0.838000011444091797E+01 + 0.838000011444091797E+01 + 0.838000011444091797E+01 + 0.838000011444091797E+01 + 0.838000011444091797E+01 + 0.838000011444091797E+01 + 0.854714488983154297E+01 + 0.882162189483642578E+01 + 0.910433197021484375E+01 + 0.939552402496337891E+01 + 0.969545173645019531E+01 + 0.100043773651123047E+02 + 0.103225708007812500E+02 + 0.106503105163574219E+02 + 0.108678665161132813E+02 + 0.110882968902587891E+02 + 0.113153400421142578E+02 + 0.115491952896118164E+02 + 0.117900657653808594E+02 + 0.120381622314453125E+02 + 0.122802333831787109E+02 + 0.124623260498046875E+02 + 0.126498813629150391E+02 + 0.128430633544921875E+02 + 0.130420417785644531E+02 + 0.132469882965087891E+02 + 0.134580831527709961E+02 + 0.135895338058471680E+02 + 0.137241392135620117E+02 + 0.138627824783325195E+02 + 0.140055856704711914E+02 + 0.141526727676391602E+02 + 0.142790746688842773E+02 + 0.143464574813842773E+02 + 0.144158620834350586E+02 + 0.144873485565185547E+02 + 0.145609798431396484E+02 + 0.146368198394775391E+02 + 0.146435852050781250E+02 + 0.146474351882934570E+02 + 0.146513996124267578E+02 + 0.146554832458496094E+02 + 0.146596899032592773E+02 + 0.146142835617065430E+02 + 0.145635681152343750E+02 + 0.145113306045532227E+02 + 0.144575271606445313E+02 + 0.143990955352783203E+02 + 0.143202238082885742E+02 + 0.142389860153198242E+02 + 0.141553106307983398E+02 + 0.140691251754760742E+02 + 0.139931802749633789E+02 + 0.139253683090209961E+02 + 0.138555231094360352E+02 + 0.137835817337036133E+02 + 0.137169160842895508E+02 + 0.136945352554321289E+02 + 0.136714830398559570E+02 + 0.136477394104003906E+02 + 0.136232824325561523E+02 + 0.136618223190307617E+02 + 0.137113561630249023E+02 + 0.137623748779296875E+02 + 0.138149251937866211E+02 + 0.139026937484741211E+02 + 0.140064725875854492E+02 + 0.141133642196655273E+02 + 0.142234630584716797E+02 + 0.144566297531127930E+02 + 0.147554292678833008E+02 + 0.150631923675537109E+02 + 0.153801879882812500E+02 + 0.155695848464965820E+02 + 0.157111043930053711E+02 + 0.158568954467773438E+02 + 0.160046043395996094E+02 + 0.165927867889404297E+02 + 0.172726593017578125E+02 + 0.179525299072265625E+02 + 0.186324024200439453E+02 + 0.189011459350585938E+02 + 0.189490242004394531E+02 + 0.189969024658203125E+02 + 0.190447807312011719E+02 + 0.190846157073974609E+02 + 0.189876728057861328E+02 + 0.188907318115234375E+02 + 0.187937889099121094E+02 + 0.186968460083007813E+02 + 0.186000556945800781E+02 + 0.186558113098144531E+02 + 0.187115669250488281E+02 + 0.187673225402832031E+02 + 0.188230781555175781E+02 + 0.188788318634033203E+02 + 0.189871520996093750E+02 + 0.191621017456054688E+02 + 0.193370532989501953E+02 + 0.195120029449462891E+02 + 0.196869525909423828E+02 + 0.198619022369384766E+02 + 0.200379638671875000E+02 + 0.202163314819335938E+02 + 0.203946990966796875E+02 + 0.205730667114257813E+02 + 0.207514343261718750E+02 + 0.209298000335693359E+02 + 0.211081676483154297E+02 + 0.212155113220214844E+02 + 0.212749671936035156E+02 + 0.213344230651855469E+02 + 0.213938789367675781E+02 + 0.214533329010009766E+02 + 0.215127887725830078E+02 + 0.215722446441650391E+02 + 0.216253185272216797E+02 + 0.216523437500000000E+02 + 0.216793689727783203E+02 + 0.217063941955566406E+02 + 0.217334175109863281E+02 + 0.217604427337646484E+02 + 0.217874679565429688E+02 + 0.218144931793212891E+02 + 0.218431358337402344E+02 + 0.218989696502685547E+02 + 0.219548053741455078E+02 + 0.220106391906738281E+02 + 0.220664749145507813E+02 + 0.221223087310791016E+02 + 0.221781444549560547E+02 + 0.222339782714843750E+02 + 0.222898120880126953E+02 + 0.223436965942382813E+02 + 0.223802433013916016E+02 + 0.224167881011962891E+02 + 0.224533348083496094E+02 + 0.224898796081542969E+02 + 0.225264263153076172E+02 + 0.225629711151123047E+02 + 0.225995178222656250E+02 + 0.226360645294189453E+02 + 0.226726093292236328E+02 + 0.227009258270263672E+02 + 0.227046165466308594E+02 + 0.227083091735839844E+02 + 0.227119998931884766E+02 + 0.227156906127929688E+02 + 0.227193832397460938E+02 + 0.227230739593505859E+02 + 0.227267665863037109E+02 + 0.227304573059082031E+02 + 0.227341480255126953E+02 + 0.227378406524658203E+02 + 0.226381435394287109E+02 + 0.223927173614501953E+02 + 0.221472930908203125E+02 + 0.219018669128417969E+02 + 0.216564426422119141E+02 + 0.214110164642333984E+02 + 0.211655921936035156E+02 + 0.209201660156250000E+02 + 0.206747417449951172E+02 + 0.204293155670166016E+02 + 0.201838912963867188E+02 + 0.199384651184082031E+02 + 0.197638034820556641E+02 + 0.196365547180175781E+02 + 0.195093040466308594E+02 + 0.193820552825927734E+02 + 0.192548065185546875E+02 + 0.191275577545166016E+02 + 0.190003070831298828E+02 + 0.188730583190917969E+02 + 0.187458095550537109E+02 + 0.186185588836669922E+02 + 0.184913101196289063E+02 + 0.183640613555908203E+02 + 0.182368125915527344E+02 + 0.181052703857421875E+02 + 0.179671897888183594E+02 + 0.178291110992431641E+02 + 0.176910324096679688E+02 + 0.175529518127441406E+02 + 0.174148731231689453E+02 + 0.172767944335937500E+02 + 0.171387138366699219E+02 + 0.170006351470947266E+02 + 0.168625564575195313E+02 + 0.167244758605957031E+02 + 0.165863971710205078E+02 + 0.164483184814453125E+02 + 0.163102378845214844E+02 + 0.161721591949462891E+02 + 0.159048433303833008E+02 + 0.156354751586914063E+02 + 0.153661069869995117E+02 + 0.150967388153076172E+02 + 0.148273706436157227E+02 + 0.145580024719238281E+02 + 0.142886343002319336E+02 + 0.140192661285400391E+02 + 0.137498989105224609E+02 + 0.134805297851562500E+02 + 0.132111625671386719E+02 + 0.129417934417724609E+02 + 0.126724262237548828E+02 + 0.124030580520629883E+02 + 0.121336870193481445E+02 + 0.118741712570190430E+02 + 0.116791801452636719E+02 + 0.114841890335083008E+02 + 0.112891988754272461E+02 + 0.110942077636718750E+02 + 0.108992166519165039E+02 + 0.107042264938354492E+02 + 0.105092353820800781E+02 + 0.103142442703247070E+02 + 0.101192541122436523E+02 + 0.992426300048828125E+01 + 0.972927188873291016E+01 + 0.953428173065185547E+01 + 0.933929061889648438E+01 + 0.914429950714111328E+01 + 0.894930934906005859E+01 + 0.875431823730468750E+01 + 0.855932712554931641E+01 + 0.831746864318847656E+01 + 0.805511379241943359E+01 + 0.779275941848754883E+01 + 0.753040504455566406E+01 + 0.726805019378662109E+01 + 0.700569534301757813E+01 + 0.674334096908569336E+01 + 0.648098659515380859E+01 + 0.621863174438476563E+01 + 0.595627689361572266E+01 + 0.569392204284667969E+01 + 0.543156766891479492E+01 + 0.516921281814575195E+01 + 0.490685844421386719E+01 + 0.464450359344482422E+01 + 0.438214921951293945E+01 + 0.411979436874389648E+01 + 0.385743951797485352E+01 + 0.359508514404296875E+01 +__pi01dn01 + 250 + 0.100127435302734375E+04 + 0.100096276855468750E+04 + 0.100064184570312500E+04 + 0.100031127929687500E+04 + 0.999970764160156250E+03 + 0.999620056152343750E+03 + 0.999258850097656250E+03 + 0.998886779785156250E+03 + 0.998503540039062500E+03 + 0.998108764648437500E+03 + 0.997702148437500000E+03 + 0.997283264160156250E+03 + 0.996851745605468750E+03 + 0.996407165527343750E+03 + 0.995949157714843750E+03 + 0.995477355957031250E+03 + 0.994991271972656250E+03 + 0.994490539550781250E+03 + 0.993974670410156250E+03 + 0.993443237304687500E+03 + 0.992895751953125000E+03 + 0.992331726074218750E+03 + 0.991750732421875000E+03 + 0.991152160644531250E+03 + 0.990535522460937500E+03 + 0.989900268554687500E+03 + 0.989245849609375000E+03 + 0.988571716308593750E+03 + 0.987877258300781250E+03 + 0.987161804199218750E+03 + 0.986424743652343750E+03 + 0.985665466308593750E+03 + 0.984883300781250000E+03 + 0.984077575683593750E+03 + 0.983247558593750000E+03 + 0.982392517089843750E+03 + 0.981511657714843750E+03 + 0.980604248046875000E+03 + 0.979669494628906250E+03 + 0.978706604003906250E+03 + 0.977714660644531250E+03 + 0.976692871093750000E+03 + 0.975640258789062500E+03 + 0.974555969238281250E+03 + 0.973439025878906250E+03 + 0.972288452148437500E+03 + 0.971103271484375000E+03 + 0.969882385253906250E+03 + 0.968624755859375000E+03 + 0.967329284667968750E+03 + 0.965994873046875000E+03 + 0.964620300292968750E+03 + 0.963204345703125000E+03 + 0.961745849609375000E+03 + 0.960243469238281250E+03 + 0.958695861816406250E+03 + 0.957101684570312500E+03 + 0.955459594726562500E+03 + 0.953768066406250000E+03 + 0.952025695800781250E+03 + 0.950230895996093750E+03 + 0.948382080078125000E+03 + 0.946477539062500000E+03 + 0.944515625000000000E+03 + 0.942494628906250000E+03 + 0.940412597656250000E+03 + 0.938267517089843750E+03 + 0.936057495117187500E+03 + 0.933780517578125000E+03 + 0.931434814453125000E+03 + 0.929018859863281250E+03 + 0.926530639648437500E+03 + 0.923968017578125000E+03 + 0.921329467773437500E+03 + 0.918613830566406250E+03 + 0.915819274902343750E+03 + 0.912943603515625000E+03 + 0.909984741210937500E+03 + 0.906940002441406250E+03 + 0.903807189941406250E+03 + 0.900637023925781250E+03 + 0.897475952148437500E+03 + 0.894318542480468750E+03 + 0.891164794921875000E+03 + 0.888014648437500000E+03 + 0.884867736816406250E+03 + 0.881723388671875000E+03 + 0.878581359863281250E+03 + 0.875441650390625000E+03 + 0.872304260253906250E+03 + 0.869169372558593750E+03 + 0.866037109375000000E+03 + 0.862907470703125000E+03 + 0.859780456542968750E+03 + 0.856656066894531250E+03 + 0.853533996582031250E+03 + 0.850413879394531250E+03 + 0.847295715332031250E+03 + 0.844179565429687500E+03 + 0.841065368652343750E+03 + 0.837953063964843750E+03 + 0.834842590332031250E+03 + 0.831733947753906250E+03 + 0.828627075195312500E+03 + 0.825522033691406250E+03 + 0.822418762207031250E+03 + 0.819317382812500000E+03 + 0.816218139648437500E+03 + 0.813121276855468750E+03 + 0.810026733398437500E+03 + 0.806934509277343750E+03 + 0.803844604492187500E+03 + 0.800757019042968750E+03 + 0.797671752929687500E+03 + 0.794588684082031250E+03 + 0.791507812500000000E+03 + 0.788429077148437500E+03 + 0.785352539062500000E+03 + 0.782278137207031250E+03 + 0.779205932617187500E+03 + 0.776135864257812500E+03 + 0.773067871093750000E+03 + 0.770001892089843750E+03 + 0.766937866210937500E+03 + 0.763875854492187500E+03 + 0.760815856933593750E+03 + 0.757757812500000000E+03 + 0.754701782226562500E+03 + 0.751647705078125000E+03 + 0.748595458984375000E+03 + 0.745544860839843750E+03 + 0.742495910644531250E+03 + 0.739448547363281250E+03 + 0.736402832031250000E+03 + 0.733358764648437500E+03 + 0.730316345214843750E+03 + 0.727275573730468750E+03 + 0.724236389160156250E+03 + 0.721198791503906250E+03 + 0.718162780761718750E+03 + 0.715128295898437500E+03 + 0.712095397949218750E+03 + 0.709064025878906250E+03 + 0.706034179687500000E+03 + 0.703005920410156250E+03 + 0.699979187011718750E+03 + 0.696953979492187500E+03 + 0.693930480957031250E+03 + 0.690909362792968750E+03 + 0.687891052246093750E+03 + 0.684875549316406250E+03 + 0.681862854003906250E+03 + 0.678852966308593750E+03 + 0.675845886230468750E+03 + 0.672841613769531250E+03 + 0.669840148925781250E+03 + 0.666841430664062500E+03 + 0.663845520019531250E+03 + 0.660853393554687500E+03 + 0.657867553710937500E+03 + 0.654889465332031250E+03 + 0.651919006347656250E+03 + 0.648956176757812500E+03 + 0.646000915527343750E+03 + 0.643053222656250000E+03 + 0.640113037109375000E+03 + 0.637180297851562500E+03 + 0.634255004882812500E+03 + 0.631337097167968750E+03 + 0.628426513671875000E+03 + 0.625525024414062500E+03 + 0.622635375976562500E+03 + 0.619758666992187500E+03 + 0.616894775390625000E+03 + 0.614043579101562500E+03 + 0.611204956054687500E+03 + 0.608378845214843750E+03 + 0.605565063476562500E+03 + 0.602763549804687500E+03 + 0.599974182128906250E+03 + 0.597196899414062500E+03 + 0.594431518554687500E+03 + 0.591677978515625000E+03 + 0.588936157226562500E+03 + 0.586205932617187500E+03 + 0.583487182617187500E+03 + 0.580779785156250000E+03 + 0.578083679199218750E+03 + 0.575398742675781250E+03 + 0.572724853515625000E+03 + 0.570061950683593750E+03 + 0.567409973144531250E+03 + 0.564768798828125000E+03 + 0.562138366699218750E+03 + 0.559518554687500000E+03 + 0.556909301757812500E+03 + 0.554310485839843750E+03 + 0.551722045898437500E+03 + 0.549144042968750000E+03 + 0.546576477050781250E+03 + 0.544019226074218750E+03 + 0.541472229003906250E+03 + 0.538935424804687500E+03 + 0.536408691406250000E+03 + 0.533891967773437500E+03 + 0.531385192871093750E+03 + 0.528888305664062500E+03 + 0.526401184082031250E+03 + 0.523923767089843750E+03 + 0.521455993652343750E+03 + 0.518997741699218750E+03 + 0.516549011230468750E+03 + 0.514109680175781250E+03 + 0.511679656982421875E+03 + 0.509258758544921875E+03 + 0.506846771240234375E+03 + 0.504443664550781250E+03 + 0.502049346923828125E+03 + 0.499663757324218750E+03 + 0.497286834716796875E+03 + 0.494918518066406250E+03 + 0.492558746337890625E+03 + 0.490207458496093750E+03 + 0.487864593505859375E+03 + 0.485530090332031250E+03 + 0.483203887939453125E+03 + 0.480885925292968750E+03 + 0.478576141357421875E+03 + 0.476274475097656250E+03 + 0.473980895996093750E+03 + 0.471695312500000000E+03 + 0.469418365478515625E+03 + 0.467150939941406250E+03 + 0.464893218994140625E+03 + 0.462645141601562500E+03 + 0.460406616210937500E+03 + 0.458177581787109375E+03 + 0.455957946777343750E+03 + 0.453747619628906250E+03 + 0.451546539306640625E+03 + 0.449354614257812500E+03 + 0.447171783447265625E+03 + 0.444997985839843750E+03 + 0.442833129882812500E+03 + 0.440677124023437500E+03 + 0.438529907226562500E+03 + 0.436391418457031250E+03 + 0.434261566162109375E+03 + 0.432140319824218750E+03 + 0.430027587890625000E+03 +__th01dn01 + 250 + 0.309907257080078125E+03 + 0.309907257080078125E+03 + 0.309903442382812500E+03 + 0.309899536132812500E+03 + 0.309895507812500000E+03 + 0.309891326904296875E+03 + 0.309887084960937500E+03 + 0.309882690429687500E+03 + 0.309878173828125000E+03 + 0.309873474121093750E+03 + 0.309837249755859375E+03 + 0.309780731201171875E+03 + 0.309722473144531250E+03 + 0.309662506103515625E+03 + 0.309600708007812500E+03 + 0.309537078857421875E+03 + 0.309471557617187500E+03 + 0.309404052734375000E+03 + 0.309354461669921875E+03 + 0.309303985595703125E+03 + 0.309251983642578125E+03 + 0.309198394775390625E+03 + 0.309143280029296875E+03 + 0.309086425781250000E+03 + 0.309029907226562500E+03 + 0.308981628417968750E+03 + 0.308931823730468750E+03 + 0.308880584716796875E+03 + 0.308827789306640625E+03 + 0.308773406982421875E+03 + 0.308717437744140625E+03 + 0.308675170898437500E+03 + 0.308631835937500000E+03 + 0.308587158203125000E+03 + 0.308541168212890625E+03 + 0.308493804931640625E+03 + 0.308448333740234375E+03 + 0.308409912109375000E+03 + 0.308370330810546875E+03 + 0.308329589843750000E+03 + 0.308287597656250000E+03 + 0.308244415283203125E+03 + 0.308213623046875000E+03 + 0.308182525634765625E+03 + 0.308150482177734375E+03 + 0.308117492675781250E+03 + 0.308083526611328125E+03 + 0.308057464599609375E+03 + 0.308031372070312500E+03 + 0.308004486083984375E+03 + 0.307976806640625000E+03 + 0.307949096679687500E+03 + 0.307925598144531250E+03 + 0.307901367187500000E+03 + 0.307876373291015625E+03 + 0.307850708007812500E+03 + 0.307826171875000000E+03 + 0.307802551269531250E+03 + 0.307778198242187500E+03 + 0.307753112792968750E+03 + 0.307726074218750000E+03 + 0.307690704345703125E+03 + 0.307654296875000000E+03 + 0.307616790771484375E+03 + 0.307578186035156250E+03 + 0.307500701904296875E+03 + 0.307415069580078125E+03 + 0.307326873779296875E+03 + 0.307235961914062500E+03 + 0.307229034423828125E+03 + 0.307256225585937500E+03 + 0.307284088134765625E+03 + 0.307312591552734375E+03 + 0.307505554199218750E+03 + 0.307784240722656250E+03 + 0.308070953369140625E+03 + 0.308366088867187500E+03 + 0.308708312988281250E+03 + 0.309075897216796875E+03 + 0.309454406738281250E+03 + 0.309837829589843750E+03 + 0.310200683593750000E+03 + 0.310559356689453125E+03 + 0.310917999267578125E+03 + 0.311276550292968750E+03 + 0.311552001953125000E+03 + 0.311782836914062500E+03 + 0.312013671875000000E+03 + 0.312244445800781250E+03 + 0.312476989746093750E+03 + 0.312740447998046875E+03 + 0.313003845214843750E+03 + 0.313267303466796875E+03 + 0.313530700683593750E+03 + 0.313794006347656250E+03 + 0.313992218017578125E+03 + 0.314190429687500000E+03 + 0.314388671875000000E+03 + 0.314586883544921875E+03 + 0.314785034179687500E+03 + 0.314976348876953125E+03 + 0.315158874511718750E+03 + 0.315341430664062500E+03 + 0.315523956298828125E+03 + 0.315706481933593750E+03 + 0.315888977050781250E+03 + 0.316089813232421875E+03 + 0.316328582763671875E+03 + 0.316567352294921875E+03 + 0.316806091308593750E+03 + 0.317044860839843750E+03 + 0.317283569335937500E+03 + 0.317522308349609375E+03 + 0.317752563476562500E+03 + 0.317977111816406250E+03 + 0.318201660156250000E+03 + 0.318426208496093750E+03 + 0.318650726318359375E+03 + 0.318875274658203125E+03 + 0.319099761962890625E+03 + 0.319321105957031250E+03 + 0.319529602050781250E+03 + 0.319738098144531250E+03 + 0.319946594238281250E+03 + 0.320155059814453125E+03 + 0.320363525390625000E+03 + 0.320571990966796875E+03 + 0.320780426025390625E+03 + 0.320986938476562500E+03 + 0.321159851074218750E+03 + 0.321332794189453125E+03 + 0.321505676269531250E+03 + 0.321678619384765625E+03 + 0.321851531982421875E+03 + 0.322024505615234375E+03 + 0.322197418212890625E+03 + 0.322370330810546875E+03 + 0.322542480468750000E+03 + 0.322707763671875000E+03 + 0.322873046875000000E+03 + 0.323038360595703125E+03 + 0.323203643798828125E+03 + 0.323368896484375000E+03 + 0.323534179687500000E+03 + 0.323699493408203125E+03 + 0.323864776611328125E+03 + 0.324030029296875000E+03 + 0.324229919433593750E+03 + 0.324533386230468750E+03 + 0.324836853027343750E+03 + 0.325140289306640625E+03 + 0.325443725585937500E+03 + 0.325747222900390625E+03 + 0.326050659179687500E+03 + 0.326354095458984375E+03 + 0.326657531738281250E+03 + 0.326960998535156250E+03 + 0.327264465332031250E+03 + 0.327794219970703125E+03 + 0.328642883300781250E+03 + 0.329491577148437500E+03 + 0.330340240478515625E+03 + 0.331188934326171875E+03 + 0.332037597656250000E+03 + 0.332886291503906250E+03 + 0.333734985351562500E+03 + 0.334583648681640625E+03 + 0.335432312011718750E+03 + 0.336281005859375000E+03 + 0.337129699707031250E+03 + 0.338382720947265625E+03 + 0.339906707763671875E+03 + 0.341430664062500000E+03 + 0.342954620361328125E+03 + 0.344478576660156250E+03 + 0.346002563476562500E+03 + 0.347526519775390625E+03 + 0.349050476074218750E+03 + 0.350574432373046875E+03 + 0.352098419189453125E+03 + 0.353622375488281250E+03 + 0.355146331787109375E+03 + 0.356670288085937500E+03 + 0.358189758300781250E+03 + 0.359702392578125000E+03 + 0.361215026855468750E+03 + 0.362727661132812500E+03 + 0.364240295410156250E+03 + 0.365752899169921875E+03 + 0.367265533447265625E+03 + 0.368778167724609375E+03 + 0.370290802001953125E+03 + 0.371803436279296875E+03 + 0.373316070556640625E+03 + 0.374828704833984375E+03 + 0.376341308593750000E+03 + 0.377853942871093750E+03 + 0.379366577148437500E+03 + 0.380909759521484375E+03 + 0.382453399658203125E+03 + 0.383997070312500000E+03 + 0.385540771484375000E+03 + 0.387084411621093750E+03 + 0.388628082275390625E+03 + 0.390171752929687500E+03 + 0.391715393066406250E+03 + 0.393259063720703125E+03 + 0.394802734375000000E+03 + 0.396346374511718750E+03 + 0.397890045166015625E+03 + 0.399433715820312500E+03 + 0.400977355957031250E+03 + 0.402521057128906250E+03 + 0.404058654785156250E+03 + 0.405556640625000000E+03 + 0.407054626464843750E+03 + 0.408552612304687500E+03 + 0.410050598144531250E+03 + 0.411548583984375000E+03 + 0.413046569824218750E+03 + 0.414544555664062500E+03 + 0.416042572021484375E+03 + 0.417540557861328125E+03 + 0.419038543701171875E+03 + 0.420536529541015625E+03 + 0.422034515380859375E+03 + 0.423532501220703125E+03 + 0.425030487060546875E+03 + 0.426528472900390625E+03 + 0.428026458740234375E+03 + 0.429524444580078125E+03 + 0.431275360107421875E+03 + 0.433136871337890625E+03 + 0.434998413085937500E+03 + 0.436859954833984375E+03 + 0.438721466064453125E+03 + 0.440583007812500000E+03 + 0.442444519042968750E+03 + 0.444306030273437500E+03 + 0.446167541503906250E+03 + 0.448029083251953125E+03 + 0.449890594482421875E+03 + 0.451752105712890625E+03 + 0.453613647460937500E+03 + 0.455475158691406250E+03 + 0.457336669921875000E+03 + 0.459198211669921875E+03 + 0.461059722900390625E+03 + 0.462921234130859375E+03 + 0.464782745361328125E+03 +__dn01dn01 + 250 + 0.111670076847076416E+01 + 0.111583304405212402E+01 + 0.111495316028594971E+01 + 0.111404716968536377E+01 + 0.111311447620391846E+01 + 0.111215424537658691E+01 + 0.111116600036621094E+01 + 0.111014842987060547E+01 + 0.110910069942474365E+01 + 0.110802233219146729E+01 + 0.110702455043792725E+01 + 0.110606551170349121E+01 + 0.110507798194885254E+01 + 0.110406100749969482E+01 + 0.110301351547241211E+01 + 0.110193514823913574E+01 + 0.110082459449768066E+01 + 0.109968078136444092E+01 + 0.109843230247497559E+01 + 0.109714496135711670E+01 + 0.109581911563873291E+01 + 0.109445440769195557E+01 + 0.109304881095886230E+01 + 0.109160244464874268E+01 + 0.109010577201843262E+01 + 0.108853006362915039E+01 + 0.108690869808197021E+01 + 0.108523905277252197E+01 + 0.108352053165435791E+01 + 0.108175158500671387E+01 + 0.107993090152740479E+01 + 0.107800281047821045E+01 + 0.107601821422576904E+01 + 0.107397580146789551E+01 + 0.107187390327453613E+01 + 0.106971108913421631E+01 + 0.106747353076934814E+01 + 0.106514251232147217E+01 + 0.106274425983428955E+01 + 0.106027674674987793E+01 + 0.105773806571960449E+01 + 0.105512654781341553E+01 + 0.105239295959472656E+01 + 0.104957938194274902E+01 + 0.104668557643890381E+01 + 0.104370951652526855E+01 + 0.104064846038818359E+01 + 0.103747093677520752E+01 + 0.103420090675354004E+01 + 0.103083884716033936E+01 + 0.102738225460052490E+01 + 0.102382588386535645E+01 + 0.102015328407287598E+01 + 0.101637852191925049E+01 + 0.101249897480010986E+01 + 0.100851118564605713E+01 + 0.100440704822540283E+01 + 0.100018405914306641E+01 + 0.995845079421997070E+00 + 0.991387069225311279E+00 + 0.986811041831970215E+00 + 0.982134342193603516E+00 + 0.977330088615417480E+00 + 0.972395360469818115E+00 + 0.967327058315277100E+00 + 0.962239861488342285E+00 + 0.957032382488250732E+00 + 0.951683580875396729E+00 + 0.946190655231475830E+00 + 0.940284967422485352E+00 + 0.934121131896972656E+00 + 0.927799105644226074E+00 + 0.921316146850585938E+00 + 0.914183199405670166E+00 + 0.906644761562347412E+00 + 0.898932337760925293E+00 + 0.891043782234191895E+00 + 0.882866740226745605E+00 + 0.874464094638824463E+00 + 0.865876972675323486E+00 + 0.857247173786163330E+00 + 0.848756194114685059E+00 + 0.840344369411468506E+00 + 0.831999599933624268E+00 + 0.823721885681152344E+00 + 0.815726816654205322E+00 + 0.807905972003936768E+00 + 0.800140321254730225E+00 + 0.792429745197296143E+00 + 0.784769535064697266E+00 + 0.777087628841400146E+00 + 0.769462049007415771E+00 + 0.761892855167388916E+00 + 0.754379570484161377E+00 + 0.746922433376312256E+00 + 0.739673197269439697E+00 + 0.732474088668823242E+00 + 0.725325345993041992E+00 + 0.718226611614227295E+00 + 0.711177647113800049E+00 + 0.704193413257598877E+00 + 0.697277009487152100E+00 + 0.690408766269683838E+00 + 0.683588266372680664E+00 + 0.676815092563629150E+00 + 0.670089662075042725E+00 + 0.663372635841369629E+00 + 0.656625390052795410E+00 + 0.649928510189056396E+00 + 0.643281519412994385E+00 + 0.636684298515319824E+00 + 0.630136549472808838E+00 + 0.623638093471527100E+00 + 0.617204904556274414E+00 + 0.610830605030059814E+00 + 0.604504227638244629E+00 + 0.598224937915802002E+00 + 0.591992735862731934E+00 + 0.585807383060455322E+00 + 0.579668641090393066E+00 + 0.573581755161285400E+00 + 0.567563652992248535E+00 + 0.561590433120727539E+00 + 0.555661857128143311E+00 + 0.549777865409851074E+00 + 0.543938159942626953E+00 + 0.538142383098602295E+00 + 0.532390475273132324E+00 + 0.526685476303100586E+00 + 0.521077871322631836E+00 + 0.515511572360992432E+00 + 0.509986519813537598E+00 + 0.504501998424530029E+00 + 0.499058365821838379E+00 + 0.493655264377593994E+00 + 0.488292634487152100E+00 + 0.482970029115676880E+00 + 0.477688550949096680E+00 + 0.472456902265548706E+00 + 0.467264503240585327E+00 + 0.462111085653305054E+00 + 0.456996619701385498E+00 + 0.451920777559280396E+00 + 0.446883529424667358E+00 + 0.441884607076644897E+00 + 0.436923891305923462E+00 + 0.432001203298568726E+00 + 0.427071005105972290E+00 + 0.422046124935150146E+00 + 0.417064964771270752E+00 + 0.412127494812011719E+00 + 0.407233268022537231E+00 + 0.402381867170333862E+00 + 0.397573441267013550E+00 + 0.392807364463806152E+00 + 0.388083606958389282E+00 + 0.383401602506637573E+00 + 0.378761231899261475E+00 + 0.373905450105667114E+00 + 0.368744522333145142E+00 + 0.363649308681488037E+00 + 0.358618944883346558E+00 + 0.353652417659759521E+00 + 0.348749011754989624E+00 + 0.343907982110977173E+00 + 0.339128553867340088E+00 + 0.334409743547439575E+00 + 0.329751104116439819E+00 + 0.325151473283767700E+00 + 0.320610284805297852E+00 + 0.315751373767852783E+00 + 0.310720592737197876E+00 + 0.305775552988052368E+00 + 0.300914704799652100E+00 + 0.296136260032653809E+00 + 0.291438698768615723E+00 + 0.286820471286773682E+00 + 0.282280057668685913E+00 + 0.277815908193588257E+00 + 0.273426502943038940E+00 + 0.269110709428787231E+00 + 0.264866828918457031E+00 + 0.260693699121475220E+00 + 0.256593018770217896E+00 + 0.252564996480941772E+00 + 0.248603314161300659E+00 + 0.244706809520721436E+00 + 0.240874215960502625E+00 + 0.237104281783103943E+00 + 0.233396038413047791E+00 + 0.229748144745826721E+00 + 0.226159617304801941E+00 + 0.222629338502883911E+00 + 0.219156369566917419E+00 + 0.215739503502845764E+00 + 0.212377756834030151E+00 + 0.209070175886154175E+00 + 0.205815732479095459E+00 + 0.202597439289093018E+00 + 0.199431061744689941E+00 + 0.196315750479698181E+00 + 0.193250760436058044E+00 + 0.190235123038291931E+00 + 0.187267929315567017E+00 + 0.184348374605178833E+00 + 0.181475609540939331E+00 + 0.178648769855499268E+00 + 0.175867006182670593E+00 + 0.173129573464393616E+00 + 0.170435711741447449E+00 + 0.167784586548805237E+00 + 0.165175482630729675E+00 + 0.162607654929161072E+00 + 0.160082861781120300E+00 + 0.157613083720207214E+00 + 0.155181482434272766E+00 + 0.152787685394287109E+00 + 0.150430813431739807E+00 + 0.148110300302505493E+00 + 0.145825594663619995E+00 + 0.143576085567474365E+00 + 0.141361102461814880E+00 + 0.139180153608322144E+00 + 0.137032672762870789E+00 + 0.134918078780174255E+00 + 0.132835820317268372E+00 + 0.130785390734672546E+00 + 0.128766208887100220E+00 + 0.126777827739715576E+00 + 0.124819725751876831E+00 + 0.122891381382942200E+00 + 0.120921768248081207E+00 + 0.118954420089721680E+00 + 0.117020443081855774E+00 + 0.115119203925132751E+00 + 0.113250114023685455E+00 + 0.111412584781646729E+00 + 0.109605960547924042E+00 + 0.107829689979553223E+00 + 0.106083236634731293E+00 + 0.104365974664688110E+00 + 0.102677382528781891E+00 + 0.101016990840435028E+00 + 0.993841886520385742E-01 + 0.977785140275955200E-01 + 0.961994454264640808E-01 + 0.946464836597442627E-01 + 0.931192040443420410E-01 + 0.916170924901962280E-01 + 0.901397019624710083E-01 +__rt01dn01 + 250 + 0.157400742173194885E-01 + 0.157400742173194885E-01 + 0.157197769731283188E-01 + 0.156988706439733505E-01 + 0.156773384660482407E-01 + 0.156551580876111984E-01 + 0.156323146075010300E-01 + 0.156087838113307953E-01 + 0.155845480039715767E-01 + 0.155595848336815834E-01 + 0.155360717326402664E-01 + 0.155131984502077103E-01 + 0.154896397143602371E-01 + 0.154653731733560562E-01 + 0.154403792694211006E-01 + 0.154146356508135796E-01 + 0.153881199657917023E-01 + 0.153608079999685287E-01 + 0.153312394395470619E-01 + 0.153007395565509796E-01 + 0.152693241834640503E-01 + 0.152369672432541847E-01 + 0.152036398649215698E-01 + 0.151693113148212433E-01 + 0.151335047557950020E-01 + 0.150943771004676819E-01 + 0.150540759786963463E-01 + 0.150125650689005852E-01 + 0.149698099121451378E-01 + 0.149257713928818703E-01 + 0.148804122582077980E-01 + 0.148314256221055984E-01 + 0.147809488698840141E-01 + 0.147289568558335304E-01 + 0.146754058077931404E-01 + 0.146202482283115387E-01 + 0.145624317228794098E-01 + 0.145003683865070343E-01 + 0.144364433363080025E-01 + 0.143706006929278374E-01 + 0.143027827143669128E-01 + 0.142329297959804535E-01 + 0.141618810594081879E-01 + 0.140887415036559105E-01 + 0.140134068205952644E-01 + 0.139358118176460266E-01 + 0.138558903709053993E-01 + 0.137731982395052910E-01 + 0.136879952624440193E-01 + 0.136002376675605774E-01 + 0.135098462924361229E-01 + 0.134156541898846626E-01 + 0.133118750527501106E-01 + 0.132049825042486191E-01 + 0.130948834121227264E-01 + 0.129814818501472473E-01 + 0.128611130639910698E-01 + 0.127342399209737778E-01 + 0.126035604625940323E-01 + 0.124689601361751556E-01 + 0.123188504949212074E-01 + 0.120928045362234116E-01 + 0.118599776178598404E-01 + 0.116201657801866531E-01 + 0.113731585443019867E-01 + 0.108122359961271286E-01 + 0.101871732622385025E-01 + 0.954335834830999374E-02 + 0.888023152947425842E-02 + 0.814564153552055359E-02 + 0.736850779503583908E-02 + 0.656806118786334991E-02 + 0.574360042810440063E-02 + 0.511736655607819557E-02 + 0.458150403574109077E-02 + 0.402956502512097359E-02 + 0.346106919459998608E-02 + 0.315951509401202202E-02 + 0.295987166464328766E-02 + 0.275420234538614750E-02 + 0.254582636989653111E-02 + 0.240100966766476631E-02 + 0.226934440433979034E-02 + 0.213767914101481438E-02 + 0.200601387768983841E-02 + 0.188496639020740986E-02 + 0.176962336990982294E-02 + 0.165428023319691420E-02 + 0.153893709648400545E-02 + 0.142714334651827812E-02 + 0.137570430524647236E-02 + 0.132426526397466660E-02 + 0.127282633911818266E-02 + 0.122138729784637690E-02 + 0.116997293662279844E-02 + 0.114299450069665909E-02 + 0.111601618118584156E-02 + 0.108903786167502403E-02 + 0.106205942574888468E-02 + 0.103508110623806715E-02 + 0.100341590587049723E-02 + 0.965809798799455166E-03 + 0.928203691728413105E-03 + 0.890597584657371044E-03 + 0.852991419378668070E-03 + 0.815385312307626009E-03 + 0.778890273068100214E-03 + 0.744703225791454315E-03 + 0.710516120307147503E-03 + 0.676329073030501604E-03 + 0.642141967546194792E-03 + 0.607954920269548893E-03 + 0.573767814785242081E-03 + 0.543858448509126902E-03 + 0.516833271831274033E-03 + 0.489808095153421164E-03 + 0.462782976683229208E-03 + 0.435757800005376339E-03 + 0.408732681535184383E-03 + 0.381707504857331514E-03 + 0.355890952050685883E-03 + 0.335007964167743921E-03 + 0.314125005388632417E-03 + 0.293242046609520912E-03 + 0.272359058726578951E-03 + 0.251476070843636990E-03 + 0.230593112064525485E-03 + 0.209710153285413980E-03 + 0.189310128916986287E-03 + 0.177026522578671575E-03 + 0.164742901688441634E-03 + 0.152459295350126922E-03 + 0.140175674459896982E-03 + 0.127892068121582270E-03 + 0.115608447231352329E-03 + 0.103324840893037617E-03 + 0.910412200028076768E-04 + 0.793839499237947166E-04 + 0.732929765945300460E-04 + 0.672020032652653754E-04 + 0.611110299360007048E-04 + 0.550200566067360342E-04 + 0.489290869154501706E-04 + 0.428381135861855000E-04 + 0.367471402569208294E-04 + 0.306561669276561588E-04 + 0.245651935983914882E-04 + 0.197688186744926497E-04 + 0.188459234777837992E-04 + 0.179230301000643522E-04 + 0.170001349033555016E-04 + 0.160772415256360546E-04 + 0.151543463289272040E-04 + 0.142314529512077570E-04 + 0.133085586639936082E-04 + 0.123856643767794594E-04 + 0.114627700895653106E-04 + 0.105398758023511618E-04 + 0.968389485933585092E-05 + 0.892223033588379622E-05 + 0.816056490293703973E-05 + 0.739890037948498502E-05 + 0.663723540128557943E-05 + 0.587557042308617383E-05 + 0.511390544488676824E-05 + 0.435224092143471353E-05 + 0.359057594323530793E-05 + 0.282891096503590234E-05 + 0.206724598683649674E-05 + 0.130558146338444203E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 +__kppzm + 48 + -0.170577192306518555E+01 + -0.515288019180297852E+01 + -0.867263221740722656E+01 + -0.122681560516357422E+02 + -0.159427862167358398E+02 + -0.197000827789306641E+02 + -0.235438518524169922E+02 + -0.274781646728515625E+02 + -0.315073947906494141E+02 + -0.356362304687500000E+02 + -0.398697319030761719E+02 + -0.442133331298828125E+02 + -0.486729240417480469E+02 + -0.532548675537109375E+02 + -0.579660606384277344E+02 + -0.628140220642089844E+02 + -0.678069229125976563E+02 + -0.729536972045898438E+02 + -0.782641372680664063E+02 + -0.837490005493164063E+02 + -0.894201202392578125E+02 + -0.952906188964843750E+02 + -0.101375022888183594E+03 + -0.107689506530761719E+03 + -0.114252166748046875E+03 + -0.121083328247070312E+03 + -0.128205902099609375E+03 + -0.135645858764648437E+03 + -0.143432846069335937E+03 + -0.151600814819335937E+03 + -0.160188995361328125E+03 + -0.169243026733398437E+03 + -0.178816345214843750E+03 + -0.188972213745117187E+03 + -0.199786239624023437E+03 + -0.211349731445312500E+03 + -0.223774444580078125E+03 + -0.237199188232421875E+03 + -0.251799423217773437E+03 + -0.267801239013671875E+03 + -0.285503112792968750E+03 + -0.305310638427734375E+03 + -0.327794952392578125E+03 + -0.353797454833984375E+03 + -0.384634338378906250E+03 + -0.422540863037109375E+03 + -0.471808868408203125E+03 + -0.500000000000000000E+03 +__gnu + 8 + 0.400000000000000000E+01 + 0.200000000000000000E+01 + 0.200000000000000000E+01 + 0.200000000000000000E+01 + 0.200000000000000000E+01 + 0.200000000000000000E+01 + 0.200000000000000000E+01 + 0.400000000000000000E+01 +__iaero_chem + 11 + 1 + 1 + 1 + 1 + 2 + 2 + 2 + 1 + 1 + 1 + 1 +__cfmas + 16 + 0.524000000000000000E+03 + 0.524000000000000000E+03 + 0.110800003051757812E+03 + 0.273899990133941174E-02 + 0.495999991893768311E+00 + 0.157000000000000000E+03 + 0.471000000000000000E+03 + 0.885399997234344482E+00 + 0.377000006847083569E-02 + 0.123000005260109901E-02 + 0.100100003182888031E+00 + 0.885399997234344482E+00 + 0.377000006847083569E-02 + 0.123000005260109901E-02 + 0.100100003182888031E+00 + 0.524000000000000000E+03 +__pwmas + 16 + 0.300000000000000000E+01 + 0.300000000000000000E+01 + 0.291000008583068848E+01 + 0.174000000953674316E+01 + 0.240000009536743164E+01 + 0.300000000000000000E+01 + 0.300000000000000000E+01 + 0.250000000000000000E+01 + 0.200000000000000000E+01 + 0.179999995231628418E+01 + 0.225600004196166992E+01 + 0.250000000000000000E+01 + 0.200000000000000000E+01 + 0.179999995231628418E+01 + 0.225600004196166992E+01 + 0.300000000000000000E+01 +__slcpd + 12 + 0.146500000000000000E+07 + 0.140700000000000000E+07 + 0.134400000000000000E+07 + 0.127300000000000000E+07 + 0.121400000000000000E+07 + 0.117700000000000000E+07 + 0.131900000000000000E+07 + 0.122700000000000000E+07 + 0.117700000000000000E+07 + 0.115100000000000000E+07 + 0.108800000000000000E+07 + 0.874000000000000000E+06 +__slmsts + 12 + 0.395000010728836060E+00 + 0.409999996423721313E+00 + 0.435000002384185791E+00 + 0.485000014305114746E+00 + 0.451000005006790161E+00 + 0.419999986886978149E+00 + 0.476999998092651367E+00 + 0.476000010967254639E+00 + 0.425999999046325684E+00 + 0.492000013589859009E+00 + 0.481999993324279785E+00 + 0.862999975681304932E+00 +__slz + 11 + -0.500000000000000000E+00 + -0.400000005960464478E+00 + -0.300000011920928955E+00 + -0.250000000000000000E+00 + -0.200000002980232239E+00 + -0.159999996423721313E+00 + -0.119999997317790985E+00 + -0.900000035762786865E-01 + -0.599999986588954926E-01 + -0.299999993294477463E-01 + -0.999999977648258209E-02 diff --git a/bin.rams/test.supercell/a-A-1991-04-26-213500-head.txt b/bin.rams/test.supercell/a-A-1991-04-26-213500-head.txt new file mode 100644 index 0000000..47347fe --- /dev/null +++ b/bin.rams/test.supercell/a-A-1991-04-26-213500-head.txt @@ -0,0 +1,3638 @@ + 257 +UP 0 3 1 218750 +VP 0 3 1 218750 +WP 0 3 1 218750 +PP 0 3 1 218750 +UC 0 3 1 218750 +VC 0 3 1 218750 +WC 0 3 1 218750 +PC 0 3 1 218750 +THP 0 3 1 218750 +RTP 0 3 1 218750 +THETA 0 3 1 218750 +RV 0 3 1 218750 +DN0 0 3 1 218750 +WP_BUOY_THETA 0 3 1 218750 +WP_BUOY_COND 0 3 1 218750 +WP_ADVDIF 0 3 1 218750 +SOIL_WATER 0 4 1 19250 +SOIL_ENERGY 0 4 1 19250 +SOIL_TEXT 0 4 1 19250 +SFCWATER_MASS 0 5 1 1750 +SFCWATER_ENERGY 0 5 1 1750 +SFCWATER_DEPTH 0 5 1 1750 +USTAR 0 6 1 1750 +TSTAR 0 6 1 1750 +RSTAR 0 6 1 1750 +VEG_FRACAREA 0 6 1 1750 +VEG_LAI 0 6 1 1750 +VEG_ROUGH 0 6 1 1750 +VEG_HEIGHT 0 6 1 1750 +VEG_ALBEDO 0 6 1 1750 +VEG_TAI 0 6 1 1750 +PATCH_AREA 0 6 1 1750 +PATCH_ROUGH 0 6 1 1750 +LEAF_CLASS 0 6 1 1750 +SOIL_ROUGH 0 6 1 1750 +SFCWATER_NLEV 0 6 1 1750 +STOM_RESIST 0 6 1 1750 +GROUND_RSAT 0 6 1 1750 +GROUND_RVAP 0 6 1 1750 +VEG_WATER 0 6 1 1750 +VEG_TEMP 0 6 1 1750 +CAN_RVAP 0 6 1 1750 +CAN_TEMP 0 6 1 1750 +VEG_NDVIP 0 6 1 1750 +VEG_NDVIC 0 6 1 1750 +VEG_NDVIF 0 6 1 1750 +KPP_OLD 0 2 1 875 +KPP_NEW 0 2 1 875 +KPP_JERLOV 0 2 1 875 +KPP_OCDEPTH 0 2 1 875 +KPP_HMIX 0 2 1 875 +KPP_BOTTOMT 0 2 1 875 +KPP_SREF 0 2 1 875 +KPP_FREEZ_FLAG 0 2 1 875 +KPP_RESET_FLAG 0 2 1 875 +KPP_FLX_UST 0 2 1 875 +KPP_FLX_VST 0 2 1 875 +KPP_FLX_NSW 0 2 1 875 +KPP_FLX_NLW 0 2 1 875 +KPP_FLX_ICE 0 2 1 875 +KPP_FLX_PCP 0 2 1 875 +KPP_SWDK_OPT 0 10 1 42000 +KPP_SWFRAC 0 10 1 42000 +KPP_SAL_CLIM 0 10 1 42000 +KPP_OCNT_CLIM 0 10 1 42000 +KPP_BUOY 0 10 1 42000 +KPP_U 0 10 1 42000 +KPP_V 0 10 1 42000 +KPP_U_init 0 10 1 42000 +KPP_V_init 0 10 1 42000 +KPP_US0 0 10 1 42000 +KPP_US1 0 10 1 42000 +KPP_VS0 0 10 1 42000 +KPP_VS1 0 10 1 42000 +KPP_X_T 0 10 1 42000 +KPP_X_S 0 10 1 42000 +KPP_XS_T0 0 10 1 42000 +KPP_XS_T1 0 10 1 42000 +KPP_XS_S0 0 10 1 42000 +KPP_XS_S1 0 10 1 42000 +RCP 0 3 1 218750 +RDP 0 3 1 218750 +RRP 0 3 1 218750 +RPP 0 3 1 218750 +RSP 0 3 1 218750 +RAP 0 3 1 218750 +RGP 0 3 1 218750 +RHP 0 3 1 218750 +CCP 0 3 1 218750 +CDP 0 3 1 218750 +CRP 0 3 1 218750 +CPP 0 3 1 218750 +CSP 0 3 1 218750 +CAP 0 3 1 218750 +CGP 0 3 1 218750 +CHP 0 3 1 218750 +Q2 0 3 1 218750 +Q6 0 3 1 218750 +Q7 0 3 1 218750 +CCCNP 0 3 1 218750 +GCCNP 0 3 1 218750 +CCCMP 0 3 1 218750 +GCCMP 0 3 1 218750 +MD1NP 0 3 1 218750 +MD2NP 0 3 1 218750 +MD1MP 0 3 1 218750 +MD2MP 0 3 1 218750 +SALT_FILM_NP 0 3 1 218750 +SALT_JET_NP 0 3 1 218750 +SALT_SPUM_NP 0 3 1 218750 +SALT_FILM_MP 0 3 1 218750 +SALT_JET_MP 0 3 1 218750 +SALT_SPUM_MP 0 3 1 218750 +REGEN_AERO1_NP 0 3 1 218750 +REGEN_AERO1_MP 0 3 1 218750 +REGEN_AERO2_NP 0 3 1 218750 +REGEN_AERO2_MP 0 3 1 218750 +IMMERCP 0 3 1 218750 +IMMERDP 0 3 1 218750 +IMMERRP 0 3 1 218750 +IFNNUCP 0 3 1 218750 +CNMCP 0 3 1 218750 +CNMDP 0 3 1 218750 +CNMRP 0 3 1 218750 +CNMPP 0 3 1 218750 +CNMSP 0 3 1 218750 +CNMAP 0 3 1 218750 +CNMGP 0 3 1 218750 +CNMHP 0 3 1 218750 +DNMCP 0 3 1 218750 +DNMDP 0 3 1 218750 +DNMRP 0 3 1 218750 +DNMPP 0 3 1 218750 +DNMSP 0 3 1 218750 +DNMAP 0 3 1 218750 +DNMGP 0 3 1 218750 +DNMHP 0 3 1 218750 +DINCP 0 3 1 218750 +DINDP 0 3 1 218750 +DINRP 0 3 1 218750 +DINPP 0 3 1 218750 +DINSP 0 3 1 218750 +DINAP 0 3 1 218750 +DINGP 0 3 1 218750 +DINHP 0 3 1 218750 +SNMCP 0 3 1 218750 +SNMDP 0 3 1 218750 +SNMRP 0 3 1 218750 +SNMPP 0 3 1 218750 +SNMSP 0 3 1 218750 +SNMAP 0 3 1 218750 +SNMGP 0 3 1 218750 +SNMHP 0 3 1 218750 +RESOL_AERO1_MP 0 3 1 218750 +RESOL_AERO2_MP 0 3 1 218750 +PCPVR 0 3 1 218750 +PCPVP 0 3 1 218750 +PCPVS 0 3 1 218750 +PCPVA 0 3 1 218750 +PCPVG 0 3 1 218750 +PCPVH 0 3 1 218750 +PCPVD 0 3 1 218750 +LATHEATVAP 0 3 1 218750 +LATHEATFRZ 0 3 1 218750 +NUCCLDRT 0 3 1 218750 +CLD2RAINT 0 3 1 218750 +ICE2RAINT 0 3 1 218750 +NUCICERT 0 3 1 218750 +VAPLIQT 0 3 1 218750 +VAPICET 0 3 1 218750 +MELTICET 0 3 1 218750 +RIMECLDT 0 3 1 218750 +RAIN2ICET 0 3 1 218750 +AGGREGATET 0 3 1 218750 +LATHEATVAPT 0 3 1 218750 +LATHEATFRZT 0 3 1 218750 +INUCHOMRT 0 3 1 218750 +INUCCONTRT 0 3 1 218750 +INUCIFNRT 0 3 1 218750 +INUCHAZRT 0 3 1 218750 +VAPCLDT 0 3 1 218750 +VAPRAINT 0 3 1 218750 +VAPPRIST 0 3 1 218750 +VAPSNOWT 0 3 1 218750 +VAPAGGRT 0 3 1 218750 +VAPGRAUT 0 3 1 218750 +VAPHAILT 0 3 1 218750 +VAPDRIZT 0 3 1 218750 +MELTPRIST 0 3 1 218750 +MELTSNOWT 0 3 1 218750 +MELTAGGRT 0 3 1 218750 +MELTGRAUT 0 3 1 218750 +MELTHAILT 0 3 1 218750 +RIMECLDSNOWT 0 3 1 218750 +RIMECLDAGGRT 0 3 1 218750 +RIMECLDGRAUT 0 3 1 218750 +RIMECLDHAILT 0 3 1 218750 +RAIN2PRT 0 3 1 218750 +RAIN2SNT 0 3 1 218750 +RAIN2AGT 0 3 1 218750 +RAIN2GRT 0 3 1 218750 +RAIN2HAT 0 3 1 218750 +AGGRSELFPRIST 0 3 1 218750 +AGGRSELFSNOWT 0 3 1 218750 +AGGRPRISSNOWT 0 3 1 218750 +DUST1CLDRT 0 3 1 218750 +DUST2CLDRT 0 3 1 218750 +DUST1DRZRT 0 3 1 218750 +DUST2DRZRT 0 3 1 218750 +ACCPR 0 2 1 875 +ACCPP 0 2 1 875 +ACCPS 0 2 1 875 +ACCPA 0 2 1 875 +ACCPG 0 2 1 875 +ACCPH 0 2 1 875 +ACCPD 0 2 1 875 +PCPRR 0 2 1 875 +PCPRP 0 2 1 875 +PCPRS 0 2 1 875 +PCPRA 0 2 1 875 +PCPRG 0 2 1 875 +PCPRH 0 2 1 875 +PCPRD 0 2 1 875 +PCPG 0 2 1 875 +QPCPG 0 2 1 875 +DPCPG 0 2 1 875 +ACCPAERO 0 2 1 875 +PCPRAERO 0 2 1 875 +ACCPDUST 0 2 1 875 +PCPRDUST 0 2 1 875 +FTHRD 0 3 1 218750 +BEXT 0 3 1 218750 +SWUP 0 3 1 218750 +SWDN 0 3 1 218750 +LWUP 0 3 1 218750 +LWDN 0 3 1 218750 +RSHORT 0 2 1 875 +RLONG 0 2 1 875 +RLONGUP 0 2 1 875 +ALBEDT 0 2 1 875 +COSZ 0 2 1 875 +AODT 0 2 1 875 +RHKM 0 3 1 218750 +RVKM 0 3 1 218750 +RVKH 0 3 1 218750 +SFLUX_U 0 2 1 875 +SFLUX_V 0 2 1 875 +SFLUX_W 0 2 1 875 +SFLUX_T 0 2 1 875 +SFLUX_R 0 2 1 875 +TOPT 0 2 1 875 +GLAT 0 2 1 875 +GLON 0 2 1 875 +TOPZO 0 2 1 875 +PI 1 3 1 218750 +HKH 1 3 1 218750 +VKH 1 3 1 218750 +__expnme + 1 +RAMS Simulations +__initial + 1 + 1 +__initorig + 1 + 1 +__jdim + 1 + 1 +__iyear1 + 1 + 1991 +__imonth1 + 1 + 4 +__idate1 + 1 + 26 +__itime1 + 1 + 2100 +__time + 1 + 0.210000000000000000E+04 +__nsndg + 1 + 35 +__us + 35 + -0.271000003814697266E+01 + -0.271000003814697266E+01 + -0.353999996185302734E+01 + -0.339000010490417480E+01 + -0.277999997138977051E+01 + -0.174000000953674316E+01 + -0.360000014305114746E+00 + 0.125000000000000000E+01 + 0.294000005722045898E+01 + 0.457999992370605469E+01 + 0.607000017166137695E+01 + 0.730000019073486328E+01 + 0.852999973297119141E+01 + 0.967000007629394531E+01 + 0.108999996185302734E+02 + 0.120900001525878906E+02 + 0.128400001525878906E+02 + 0.151300001144409180E+02 + 0.167000007629394531E+02 + 0.173600006103515625E+02 + 0.174400005340576172E+02 + 0.170400009155273438E+02 + 0.168299999237060547E+02 + 0.170599994659423828E+02 + 0.183799991607666016E+02 + 0.203899993896484375E+02 + 0.233099994659423828E+02 + 0.281800003051757813E+02 + 0.248199996948242188E+02 + 0.211499996185302734E+02 + 0.175100002288818359E+02 + 0.965999984741210938E+01 + 0.200999999046325684E+01 + 0.500000000000000000E+00 + -0.103999996185302734E+01 +__vs + 35 + 0.838000011444091797E+01 + 0.838000011444091797E+01 + 0.106599998474121094E+02 + 0.122500000000000000E+02 + 0.134600000381469727E+02 + 0.142600002288818359E+02 + 0.146400003433227539E+02 + 0.146599998474121094E+02 + 0.144099998474121094E+02 + 0.140299997329711914E+02 + 0.137200002670288086E+02 + 0.136199998855590820E+02 + 0.138299999237060547E+02 + 0.142600002288818359E+02 + 0.154700002670288086E+02 + 0.160300006866455078E+02 + 0.188700008392333984E+02 + 0.190900001525878906E+02 + 0.186000003814697266E+02 + 0.189099998474121094E+02 + 0.199799995422363281E+02 + 0.211800003051757813E+02 + 0.216200008392333984E+02 + 0.218400001525878906E+02 + 0.223400001525878906E+02 + 0.227000007629394531E+02 + 0.227399997711181641E+02 + 0.198400001525878906E+02 + 0.181599998474121094E+02 + 0.161700000762939453E+02 + 0.118999996185302734E+02 + 0.850000000000000000E+01 + 0.347000002861022949E+01 + 0.350000000000000000E+01 + 0.352999997138977051E+01 +__ts + 35 + 0.306079376220703125E+03 + 0.305112518310546875E+03 + 0.303622192382812500E+03 + 0.302135650634765625E+03 + 0.300582458496093750E+03 + 0.298970092773437500E+03 + 0.297265472412109375E+03 + 0.295463653564453125E+03 + 0.293529083251953125E+03 + 0.291434265136718750E+03 + 0.289150360107421875E+03 + 0.286665008544921875E+03 + 0.284018432617187500E+03 + 0.281624572753906250E+03 + 0.279662200927734375E+03 + 0.277406005859375000E+03 + 0.274758117675781250E+03 + 0.271294006347656250E+03 + 0.267552581787109375E+03 + 0.263083618164062500E+03 + 0.258075958251953125E+03 + 0.252843017578125000E+03 + 0.246956115722656250E+03 + 0.240328781127929687E+03 + 0.232743484497070312E+03 + 0.224288635253906250E+03 + 0.215936080932617187E+03 + 0.210840881347656250E+03 + 0.210143768310546875E+03 + 0.208462387084960937E+03 + 0.205940200805664062E+03 + 0.201693786621093750E+03 + 0.198953125000000000E+03 + 0.194737899780273437E+03 + 0.189301940917968750E+03 +__thds + 35 + 0.306959991455078125E+03 + 0.306960021972656250E+03 + 0.306529998779296875E+03 + 0.306209960937500000E+03 + 0.305939971923828125E+03 + 0.305740020751953125E+03 + 0.305589965820312500E+03 + 0.305500000000000000E+03 + 0.305450012207031250E+03 + 0.305429992675781250E+03 + 0.305429992675781250E+03 + 0.305459991455078125E+03 + 0.305589965820312500E+03 + 0.306299987792968750E+03 + 0.307829986572265625E+03 + 0.309429992675781250E+03 + 0.311029968261718750E+03 + 0.312190032958984375E+03 + 0.313570007324218750E+03 + 0.314700012207031250E+03 + 0.315859985351562500E+03 + 0.317509979248046875E+03 + 0.319209991455078125E+03 + 0.320940002441406250E+03 + 0.322510009765625000E+03 + 0.324149963378906250E+03 + 0.327439971923828125E+03 + 0.337469970703125000E+03 + 0.357589996337890625E+03 + 0.379390014648437500E+03 + 0.403859985351562500E+03 + 0.429979980468750000E+03 + 0.465670013427734375E+03 + 0.503269989013671875E+03 + 0.541519958496093750E+03 +__ps + 35 + 0.990000000000000000E+05 + 0.979103046875000000E+05 + 0.967206328125000000E+05 + 0.954221953125000000E+05 + 0.940067812500000000E+05 + 0.924657890625000000E+05 + 0.907903359375000000E+05 + 0.889713671875000000E+05 + 0.869998593750000000E+05 + 0.848665859375000000E+05 + 0.825626484375000000E+05 + 0.800791093750000000E+05 + 0.774072031250000000E+05 + 0.745411562500000000E+05 + 0.714829531250000000E+05 + 0.682369765625000000E+05 + 0.648056328125000000E+05 + 0.611899843750000000E+05 + 0.573959570312500000E+05 + 0.534349296875000000E+05 + 0.493217070312500000E+05 + 0.450816445312500000E+05 + 0.407470156250000000E+05 + 0.363542890625000000E+05 + 0.319460332031250000E+05 + 0.275735761718750000E+05 + 0.233073164062500000E+05 + 0.192918867187500000E+05 + 0.155726064453125000E+05 + 0.123097558593750000E+05 + 0.947972363281250000E+04 + 0.707827929687500000E+04 + 0.510501708984375000E+04 + 0.360986938476562500E+04 + 0.253038891601562500E+04 +__hs + 35 + 0.000000000000000000E+00 + 0.100002868652343750E+03 + 0.210000503540039062E+03 + 0.330998321533203125E+03 + 0.464095123291015625E+03 + 0.610502075195312500E+03 + 0.771550354003906250E+03 + 0.948713012695312500E+03 + 0.114357568359375000E+04 + 0.135793383789062500E+04 + 0.159372290039062500E+04 + 0.185310449218750000E+04 + 0.213841821289062500E+04 + 0.245225878906250000E+04 + 0.279748461914062500E+04 + 0.317723657226562500E+04 + 0.359496240234375000E+04 + 0.405446093750000000E+04 + 0.455991406250000000E+04 + 0.511591503906250000E+04 + 0.572751757812500000E+04 + 0.640028662109375000E+04 + 0.714033789062500000E+04 + 0.795439843750000000E+04 + 0.884990039062500000E+04 + 0.983496484375000000E+04 + 0.109185126953125000E+05 + 0.121001347656250000E+05 + 0.134203779296875000E+05 + 0.148615781250000000E+05 + 0.164467695312500000E+05 + 0.181904414062500000E+05 + 0.201076933593750000E+05 + 0.221054843750000000E+05 + 0.241034882812500000E+05 +__ihtran + 1 + 0 +__ngrids + 1 + 1 +__nzg + 1 + 11 +__nzs + 1 + 1 +__npatch + 1 + 2 +__nvegpat + 1 + 1 +__nkppz + 1 + 48 +__ztop + 1 + 0.200100156250000000E+05 +__polelat + 1 + 0.370000000000000000E+02 +__polelon + 1 + -0.975000000000000000E+02 +__nnxp + 1 + 25 +__nnyp + 1 + 35 +__nnzp + 1 + 250 +__nstratx + 1 + 1 +__nstraty + 1 + 1 +__nxtnest + 1 + 0 +__ninest + 1 + 1 +__njnest + 1 + 1 +__nknest + 1 + 1 +__deltaxn + 1 + 0.200000000000000000E+04 +__deltazn + 1 + 0.100000000000000000E+02 +__nestz + 1 + 0 +__nstratz + 250 + 1 + 1 + 3 + 3 + 3 + 3 + 2 + 2 + 2 + 2 + 1 + 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 + 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 + 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 + 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 + 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 + 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 + 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 + 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 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 +__ngbegun + 1 + 1 +__iref + 1 + 0 +__jref + 1 + 0 +__topref + 1 + 0.000000000000000000E+00 +__xmn01 + 25 + -0.230000000000000000E+05 + -0.210000000000000000E+05 + -0.190000000000000000E+05 + -0.170000000000000000E+05 + -0.150000000000000000E+05 + -0.130000000000000000E+05 + -0.110000000000000000E+05 + -0.900000000000000000E+04 + -0.700000000000000000E+04 + -0.500000000000000000E+04 + -0.300000000000000000E+04 + -0.100000000000000000E+04 + 0.100000000000000000E+04 + 0.300000000000000000E+04 + 0.500000000000000000E+04 + 0.700000000000000000E+04 + 0.900000000000000000E+04 + 0.110000000000000000E+05 + 0.130000000000000000E+05 + 0.150000000000000000E+05 + 0.170000000000000000E+05 + 0.190000000000000000E+05 + 0.210000000000000000E+05 + 0.230000000000000000E+05 + 0.250000000000000000E+05 +__xtn01 + 25 + -0.240000000000000000E+05 + -0.220000000000000000E+05 + -0.200000000000000000E+05 + -0.180000000000000000E+05 + -0.160000000000000000E+05 + -0.140000000000000000E+05 + -0.120000000000000000E+05 + -0.100000000000000000E+05 + -0.800000000000000000E+04 + -0.600000000000000000E+04 + -0.400000000000000000E+04 + -0.200000000000000000E+04 + 0.000000000000000000E+00 + 0.200000000000000000E+04 + 0.400000000000000000E+04 + 0.600000000000000000E+04 + 0.800000000000000000E+04 + 0.100000000000000000E+05 + 0.120000000000000000E+05 + 0.140000000000000000E+05 + 0.160000000000000000E+05 + 0.180000000000000000E+05 + 0.200000000000000000E+05 + 0.220000000000000000E+05 + 0.240000000000000000E+05 +__ymn01 + 35 + -0.330000000000000000E+05 + -0.310000000000000000E+05 + -0.290000000000000000E+05 + -0.270000000000000000E+05 + -0.250000000000000000E+05 + -0.230000000000000000E+05 + -0.210000000000000000E+05 + -0.190000000000000000E+05 + -0.170000000000000000E+05 + -0.150000000000000000E+05 + -0.130000000000000000E+05 + -0.110000000000000000E+05 + -0.900000000000000000E+04 + -0.700000000000000000E+04 + -0.500000000000000000E+04 + -0.300000000000000000E+04 + -0.100000000000000000E+04 + 0.100000000000000000E+04 + 0.300000000000000000E+04 + 0.500000000000000000E+04 + 0.700000000000000000E+04 + 0.900000000000000000E+04 + 0.110000000000000000E+05 + 0.130000000000000000E+05 + 0.150000000000000000E+05 + 0.170000000000000000E+05 + 0.190000000000000000E+05 + 0.210000000000000000E+05 + 0.230000000000000000E+05 + 0.250000000000000000E+05 + 0.270000000000000000E+05 + 0.290000000000000000E+05 + 0.310000000000000000E+05 + 0.330000000000000000E+05 + 0.350000000000000000E+05 +__ytn01 + 35 + -0.340000000000000000E+05 + -0.320000000000000000E+05 + -0.300000000000000000E+05 + -0.280000000000000000E+05 + -0.260000000000000000E+05 + -0.240000000000000000E+05 + -0.220000000000000000E+05 + -0.200000000000000000E+05 + -0.180000000000000000E+05 + -0.160000000000000000E+05 + -0.140000000000000000E+05 + -0.120000000000000000E+05 + -0.100000000000000000E+05 + -0.800000000000000000E+04 + -0.600000000000000000E+04 + -0.400000000000000000E+04 + -0.200000000000000000E+04 + 0.000000000000000000E+00 + 0.200000000000000000E+04 + 0.400000000000000000E+04 + 0.600000000000000000E+04 + 0.800000000000000000E+04 + 0.100000000000000000E+05 + 0.120000000000000000E+05 + 0.140000000000000000E+05 + 0.160000000000000000E+05 + 0.180000000000000000E+05 + 0.200000000000000000E+05 + 0.220000000000000000E+05 + 0.240000000000000000E+05 + 0.260000000000000000E+05 + 0.280000000000000000E+05 + 0.300000000000000000E+05 + 0.320000000000000000E+05 + 0.340000000000000000E+05 +__zmn01 + 250 + 0.000000000000000000E+00 + 0.100000000000000000E+02 + 0.202999992370605469E+02 + 0.309089984893798828E+02 + 0.418362655639648438E+02 + 0.530913505554199219E+02 + 0.646840896606445313E+02 + 0.766246109008789063E+02 + 0.889233474731445313E+02 + 0.101591049194335937E+03 + 0.114638778686523437E+03 + 0.128077941894531250E+03 + 0.141920272827148437E+03 + 0.156177871704101562E+03 + 0.170863204956054687E+03 + 0.185989105224609375E+03 + 0.201568786621093750E+03 + 0.217615859985351562E+03 + 0.234144348144531250E+03 + 0.251168685913085937E+03 + 0.268703765869140625E+03 + 0.286764892578125000E+03 + 0.305367858886718750E+03 + 0.324528900146484375E+03 + 0.344264770507812500E+03 + 0.364592712402343750E+03 + 0.385530487060546875E+03 + 0.407096405029296875E+03 + 0.429309295654296875E+03 + 0.452188568115234375E+03 + 0.475754211425781250E+03 + 0.500026824951171875E+03 + 0.525027587890625000E+03 + 0.550778381347656250E+03 + 0.577301696777343750E+03 + 0.604620727539062500E+03 + 0.632759338378906250E+03 + 0.661742126464843750E+03 + 0.691594421386718750E+03 + 0.722342285156250000E+03 + 0.754012573242187500E+03 + 0.786632995605468750E+03 + 0.820232055664062500E+03 + 0.854839111328125000E+03 + 0.890484375000000000E+03 + 0.927198974609375000E+03 + 0.965015014648437500E+03 + 0.100396551513671875E+04 + 0.104408447265625000E+04 + 0.108540698242187500E+04 + 0.112796911621093750E+04 + 0.117180810546875000E+04 + 0.121696228027343750E+04 + 0.126347106933593750E+04 + 0.131137512207031250E+04 + 0.136071630859375000E+04 + 0.141153771972656250E+04 + 0.146388378906250000E+04 + 0.151780029296875000E+04 + 0.157333422851562500E+04 + 0.163053417968750000E+04 + 0.168945007324218750E+04 + 0.175013342285156250E+04 + 0.181263732910156250E+04 + 0.187701635742187500E+04 + 0.194332678222656250E+04 + 0.201162646484375000E+04 + 0.208197509765625000E+04 + 0.215443408203125000E+04 + 0.222906689453125000E+04 + 0.230593872070312500E+04 + 0.238511669921875000E+04 + 0.246666992187500000E+04 + 0.255066967773437500E+04 + 0.263718945312500000E+04 + 0.272630493164062500E+04 + 0.281809375000000000E+04 + 0.291263623046875000E+04 + 0.301001489257812500E+04 + 0.311001489257812500E+04 + 0.321001489257812500E+04 + 0.331001489257812500E+04 + 0.341001489257812500E+04 + 0.351001489257812500E+04 + 0.361001489257812500E+04 + 0.371001489257812500E+04 + 0.381001489257812500E+04 + 0.391001489257812500E+04 + 0.401001489257812500E+04 + 0.411001464843750000E+04 + 0.421001464843750000E+04 + 0.431001464843750000E+04 + 0.441001464843750000E+04 + 0.451001464843750000E+04 + 0.461001464843750000E+04 + 0.471001464843750000E+04 + 0.481001464843750000E+04 + 0.491001464843750000E+04 + 0.501001464843750000E+04 + 0.511001464843750000E+04 + 0.521001464843750000E+04 + 0.531001464843750000E+04 + 0.541001464843750000E+04 + 0.551001464843750000E+04 + 0.561001464843750000E+04 + 0.571001464843750000E+04 + 0.581001464843750000E+04 + 0.591001464843750000E+04 + 0.601001464843750000E+04 + 0.611001464843750000E+04 + 0.621001464843750000E+04 + 0.631001464843750000E+04 + 0.641001464843750000E+04 + 0.651001464843750000E+04 + 0.661001464843750000E+04 + 0.671001464843750000E+04 + 0.681001464843750000E+04 + 0.691001464843750000E+04 + 0.701001464843750000E+04 + 0.711001464843750000E+04 + 0.721001464843750000E+04 + 0.731001464843750000E+04 + 0.741001464843750000E+04 + 0.751001464843750000E+04 + 0.761001464843750000E+04 + 0.771001464843750000E+04 + 0.781001464843750000E+04 + 0.791001464843750000E+04 + 0.801001464843750000E+04 + 0.811001464843750000E+04 + 0.821001464843750000E+04 + 0.831001464843750000E+04 + 0.841001464843750000E+04 + 0.851001464843750000E+04 + 0.861001464843750000E+04 + 0.871001464843750000E+04 + 0.881001464843750000E+04 + 0.891001464843750000E+04 + 0.901001464843750000E+04 + 0.911001464843750000E+04 + 0.921001464843750000E+04 + 0.931001464843750000E+04 + 0.941001464843750000E+04 + 0.951001464843750000E+04 + 0.961001464843750000E+04 + 0.971001464843750000E+04 + 0.981001464843750000E+04 + 0.991001464843750000E+04 + 0.100100146484375000E+05 + 0.101100146484375000E+05 + 0.102100146484375000E+05 + 0.103100146484375000E+05 + 0.104100146484375000E+05 + 0.105100146484375000E+05 + 0.106100146484375000E+05 + 0.107100146484375000E+05 + 0.108100146484375000E+05 + 0.109100146484375000E+05 + 0.110100146484375000E+05 + 0.111100146484375000E+05 + 0.112100146484375000E+05 + 0.113100146484375000E+05 + 0.114100146484375000E+05 + 0.115100146484375000E+05 + 0.116100146484375000E+05 + 0.117100146484375000E+05 + 0.118100146484375000E+05 + 0.119100146484375000E+05 + 0.120100146484375000E+05 + 0.121100146484375000E+05 + 0.122100146484375000E+05 + 0.123100146484375000E+05 + 0.124100146484375000E+05 + 0.125100146484375000E+05 + 0.126100146484375000E+05 + 0.127100146484375000E+05 + 0.128100146484375000E+05 + 0.129100146484375000E+05 + 0.130100146484375000E+05 + 0.131100146484375000E+05 + 0.132100146484375000E+05 + 0.133100146484375000E+05 + 0.134100146484375000E+05 + 0.135100146484375000E+05 + 0.136100146484375000E+05 + 0.137100146484375000E+05 + 0.138100146484375000E+05 + 0.139100146484375000E+05 + 0.140100146484375000E+05 + 0.141100146484375000E+05 + 0.142100146484375000E+05 + 0.143100146484375000E+05 + 0.144100146484375000E+05 + 0.145100146484375000E+05 + 0.146100146484375000E+05 + 0.147100146484375000E+05 + 0.148100146484375000E+05 + 0.149100146484375000E+05 + 0.150100146484375000E+05 + 0.151100146484375000E+05 + 0.152100146484375000E+05 + 0.153100146484375000E+05 + 0.154100146484375000E+05 + 0.155100146484375000E+05 + 0.156100146484375000E+05 + 0.157100146484375000E+05 + 0.158100146484375000E+05 + 0.159100146484375000E+05 + 0.160100146484375000E+05 + 0.161100146484375000E+05 + 0.162100146484375000E+05 + 0.163100146484375000E+05 + 0.164100156250000000E+05 + 0.165100156250000000E+05 + 0.166100156250000000E+05 + 0.167100156250000000E+05 + 0.168100156250000000E+05 + 0.169100156250000000E+05 + 0.170100156250000000E+05 + 0.171100156250000000E+05 + 0.172100156250000000E+05 + 0.173100156250000000E+05 + 0.174100156250000000E+05 + 0.175100156250000000E+05 + 0.176100156250000000E+05 + 0.177100156250000000E+05 + 0.178100156250000000E+05 + 0.179100156250000000E+05 + 0.180100156250000000E+05 + 0.181100156250000000E+05 + 0.182100156250000000E+05 + 0.183100156250000000E+05 + 0.184100156250000000E+05 + 0.185100156250000000E+05 + 0.186100156250000000E+05 + 0.187100156250000000E+05 + 0.188100156250000000E+05 + 0.189100156250000000E+05 + 0.190100156250000000E+05 + 0.191100156250000000E+05 + 0.192100156250000000E+05 + 0.193100156250000000E+05 + 0.194100156250000000E+05 + 0.195100156250000000E+05 + 0.196100156250000000E+05 + 0.197100156250000000E+05 + 0.198100156250000000E+05 + 0.199100156250000000E+05 + 0.200100156250000000E+05 + 0.201100156250000000E+05 +__ztn01 + 250 + -0.489024114608764648E+01 + 0.496305179595947266E+01 + 0.151119432449340820E+02 + 0.255652999877929688E+02 + 0.363322563171386719E+02 + 0.474222221374511719E+02 + 0.588448867797851563E+02 + 0.706102294921875000E+02 + 0.827285385131835938E+02 + 0.952103958129882813E+02 + 0.108066703796386719E+03 + 0.121308708190917969E+03 + 0.134947967529296875E+03 + 0.148996398925781250E+03 + 0.163466278076171875E+03 + 0.178370269775390625E+03 + 0.193721374511718750E+03 + 0.209533035278320312E+03 + 0.225819030761718750E+03 + 0.242593612670898437E+03 + 0.259871429443359375E+03 + 0.277667602539062500E+03 + 0.295997650146484375E+03 + 0.314877593994140625E+03 + 0.334323913574218750E+03 + 0.354353637695312500E+03 + 0.374984252929687500E+03 + 0.396233764648437500E+03 + 0.418120788574218750E+03 + 0.440664398193359375E+03 + 0.463884307861328125E+03 + 0.487800842285156250E+03 + 0.512434814453125000E+03 + 0.537807861328125000E+03 + 0.563942016601562500E+03 + 0.590860290527343750E+03 + 0.618586059570312500E+03 + 0.647143615722656250E+03 + 0.676557983398437500E+03 + 0.706854736328125000E+03 + 0.738060424804687500E+03 + 0.770202270507812500E+03 + 0.803308410644531250E+03 + 0.837407714843750000E+03 + 0.872530029296875000E+03 + 0.908706054687500000E+03 + 0.945967285156250000E+03 + 0.984346374511718750E+03 + 0.102387677001953125E+04 + 0.106459301757812500E+04 + 0.110653076171875000E+04 + 0.114972668457031250E+04 + 0.119421838378906250E+04 + 0.124004479980468750E+04 + 0.128724609375000000E+04 + 0.133586340332031250E+04 + 0.138593920898437500E+04 + 0.143751733398437500E+04 + 0.149064282226562500E+04 + 0.154536206054687500E+04 + 0.160172290039062500E+04 + 0.165977441406250000E+04 + 0.171956750488281250E+04 + 0.178115441894531250E+04 + 0.184458898925781250E+04 + 0.190992651367187500E+04 + 0.197722424316406250E+04 + 0.204654089355468750E+04 + 0.211793676757812500E+04 + 0.219147460937500000E+04 + 0.226721875000000000E+04 + 0.234523510742187500E+04 + 0.242559204101562500E+04 + 0.250835937500000000E+04 + 0.259360986328125000E+04 + 0.268141796875000000E+04 + 0.277186010742187500E+04 + 0.286501562500000000E+04 + 0.296098388671875000E+04 + 0.305984887695312500E+04 + 0.316001489257812500E+04 + 0.326001489257812500E+04 + 0.336001489257812500E+04 + 0.346001489257812500E+04 + 0.356001489257812500E+04 + 0.366001489257812500E+04 + 0.376001489257812500E+04 + 0.386001489257812500E+04 + 0.396001489257812500E+04 + 0.406001464843750000E+04 + 0.416001464843750000E+04 + 0.426001464843750000E+04 + 0.436001464843750000E+04 + 0.446001464843750000E+04 + 0.456001464843750000E+04 + 0.466001464843750000E+04 + 0.476001464843750000E+04 + 0.486001464843750000E+04 + 0.496001464843750000E+04 + 0.506001464843750000E+04 + 0.516001464843750000E+04 + 0.526001464843750000E+04 + 0.536001464843750000E+04 + 0.546001464843750000E+04 + 0.556001464843750000E+04 + 0.566001464843750000E+04 + 0.576001464843750000E+04 + 0.586001464843750000E+04 + 0.596001464843750000E+04 + 0.606001464843750000E+04 + 0.616001464843750000E+04 + 0.626001464843750000E+04 + 0.636001464843750000E+04 + 0.646001464843750000E+04 + 0.656001464843750000E+04 + 0.666001464843750000E+04 + 0.676001464843750000E+04 + 0.686001464843750000E+04 + 0.696001464843750000E+04 + 0.706001464843750000E+04 + 0.716001464843750000E+04 + 0.726001464843750000E+04 + 0.736001464843750000E+04 + 0.746001464843750000E+04 + 0.756001464843750000E+04 + 0.766001464843750000E+04 + 0.776001464843750000E+04 + 0.786001464843750000E+04 + 0.796001464843750000E+04 + 0.806001464843750000E+04 + 0.816001464843750000E+04 + 0.826001464843750000E+04 + 0.836001464843750000E+04 + 0.846001464843750000E+04 + 0.856001464843750000E+04 + 0.866001464843750000E+04 + 0.876001464843750000E+04 + 0.886001464843750000E+04 + 0.896001464843750000E+04 + 0.906001464843750000E+04 + 0.916001464843750000E+04 + 0.926001464843750000E+04 + 0.936001464843750000E+04 + 0.946001464843750000E+04 + 0.956001464843750000E+04 + 0.966001464843750000E+04 + 0.976001464843750000E+04 + 0.986001464843750000E+04 + 0.996001464843750000E+04 + 0.100600146484375000E+05 + 0.101600146484375000E+05 + 0.102600146484375000E+05 + 0.103600146484375000E+05 + 0.104600146484375000E+05 + 0.105600146484375000E+05 + 0.106600146484375000E+05 + 0.107600146484375000E+05 + 0.108600146484375000E+05 + 0.109600146484375000E+05 + 0.110600146484375000E+05 + 0.111600146484375000E+05 + 0.112600146484375000E+05 + 0.113600146484375000E+05 + 0.114600146484375000E+05 + 0.115600146484375000E+05 + 0.116600146484375000E+05 + 0.117600146484375000E+05 + 0.118600146484375000E+05 + 0.119600146484375000E+05 + 0.120600146484375000E+05 + 0.121600146484375000E+05 + 0.122600146484375000E+05 + 0.123600146484375000E+05 + 0.124600146484375000E+05 + 0.125600146484375000E+05 + 0.126600146484375000E+05 + 0.127600146484375000E+05 + 0.128600146484375000E+05 + 0.129600146484375000E+05 + 0.130600146484375000E+05 + 0.131600146484375000E+05 + 0.132600146484375000E+05 + 0.133600146484375000E+05 + 0.134600146484375000E+05 + 0.135600146484375000E+05 + 0.136600146484375000E+05 + 0.137600146484375000E+05 + 0.138600146484375000E+05 + 0.139600146484375000E+05 + 0.140600146484375000E+05 + 0.141600146484375000E+05 + 0.142600146484375000E+05 + 0.143600146484375000E+05 + 0.144600146484375000E+05 + 0.145600146484375000E+05 + 0.146600146484375000E+05 + 0.147600146484375000E+05 + 0.148600146484375000E+05 + 0.149600146484375000E+05 + 0.150600146484375000E+05 + 0.151600146484375000E+05 + 0.152600146484375000E+05 + 0.153600146484375000E+05 + 0.154600146484375000E+05 + 0.155600146484375000E+05 + 0.156600146484375000E+05 + 0.157600146484375000E+05 + 0.158600146484375000E+05 + 0.159600146484375000E+05 + 0.160600146484375000E+05 + 0.161600146484375000E+05 + 0.162600146484375000E+05 + 0.163600156250000000E+05 + 0.164600156250000000E+05 + 0.165600156250000000E+05 + 0.166600156250000000E+05 + 0.167600156250000000E+05 + 0.168600156250000000E+05 + 0.169600156250000000E+05 + 0.170600156250000000E+05 + 0.171600156250000000E+05 + 0.172600156250000000E+05 + 0.173600156250000000E+05 + 0.174600156250000000E+05 + 0.175600156250000000E+05 + 0.176600156250000000E+05 + 0.177600156250000000E+05 + 0.178600156250000000E+05 + 0.179600156250000000E+05 + 0.180600156250000000E+05 + 0.181600156250000000E+05 + 0.182600156250000000E+05 + 0.183600156250000000E+05 + 0.184600156250000000E+05 + 0.185600156250000000E+05 + 0.186600156250000000E+05 + 0.187600156250000000E+05 + 0.188600156250000000E+05 + 0.189600156250000000E+05 + 0.190600156250000000E+05 + 0.191600156250000000E+05 + 0.192600156250000000E+05 + 0.193600156250000000E+05 + 0.194600156250000000E+05 + 0.195600156250000000E+05 + 0.196600156250000000E+05 + 0.197600156250000000E+05 + 0.198600156250000000E+05 + 0.199600156250000000E+05 + 0.200600156250000000E+05 +__dzmn01 + 250 + 0.101488918066024780E+00 + 0.985329300165176392E-01 + 0.956630483269691467E-01 + 0.928767547011375427E-01 + 0.901716053485870361E-01 + 0.875452458858489990E-01 + 0.849953964352607727E-01 + 0.825197622179985046E-01 + 0.801162794232368469E-01 + 0.777828320860862732E-01 + 0.755172669887542725E-01 + 0.733177661895751953E-01 + 0.711823254823684692E-01 + 0.691090747714042664E-01 + 0.670961216092109680E-01 + 0.651418939232826233E-01 + 0.632444620132446289E-01 + 0.614024475216865540E-01 + 0.596140027046203613E-01 + 0.578776821494102478E-01 + 0.561918579041957855E-01 + 0.545552335679531097E-01 + 0.529662594199180603E-01 + 0.514236129820346832E-01 + 0.499258004128932953E-01 + 0.484716519713401794E-01 + 0.470599047839641571E-01 + 0.456891730427742004E-01 + 0.443584695458412170E-01 + 0.430664904415607452E-01 + 0.418120771646499634E-01 + 0.405943468213081360E-01 + 0.394118987023830414E-01 + 0.382641032338142395E-01 + 0.371494852006435394E-01 + 0.360675305128097534E-01 + 0.350170023739337921E-01 + 0.339969918131828308E-01 + 0.330068357288837433E-01 + 0.320454388856887817E-01 + 0.311120897531509399E-01 + 0.302058774977922440E-01 + 0.293261110782623291E-01 + 0.284719280898571014E-01 + 0.276426170021295547E-01 + 0.268375463783740997E-01 + 0.260558556765317917E-01 + 0.252969898283481598E-01 + 0.245602205395698547E-01 + 0.238448679447174072E-01 + 0.231503322720527649E-01 + 0.224761031568050385E-01 + 0.218214746564626694E-01 + 0.211858600378036499E-01 + 0.205688066780567169E-01 + 0.199697241187095642E-01 + 0.193880647420883179E-01 + 0.188233572989702225E-01 + 0.182751081883907318E-01 + 0.177428163588047028E-01 + 0.172260794788599014E-01 + 0.167243406176567078E-01 + 0.162372160702943802E-01 + 0.157642755657434464E-01 + 0.153051409870386124E-01 + 0.148593420162796974E-01 + 0.144265480339527130E-01 + 0.140064116567373276E-01 + 0.135984411463141441E-01 + 0.132023412734270096E-01 + 0.128178251907229424E-01 + 0.124444765970110893E-01 + 0.120820617303252220E-01 + 0.117301382124423981E-01 + 0.113884704187512398E-01 + 0.110567929223179817E-01 + 0.107347369194030762E-01 + 0.104201119393110275E-01 + 0.101148039102554321E-01 + 0.998342595994472504E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.100000239908695221E-01 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999990198761224747E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 +__dztn01 + 250 + 0.103000000119209290E+00 + 0.100000001490116119E+00 + 0.970873832702636719E-01 + 0.942595973610877991E-01 + 0.915141925215721130E-01 + 0.888487324118614197E-01 + 0.862608924508094788E-01 + 0.837484374642372131E-01 + 0.813091620802879333E-01 + 0.789409205317497253E-01 + 0.766416862607002258E-01 + 0.744093954563140869E-01 + 0.722421705722808838E-01 + 0.701380372047424316E-01 + 0.680951550602912903E-01 + 0.661117658019065857E-01 + 0.641861632466316223E-01 + 0.623166598379611969E-01 + 0.605016015470027924E-01 + 0.587394349277019501E-01 + 0.570285394787788391E-01 + 0.553675331175327301E-01 + 0.537548698484897614E-01 + 0.521892309188842773E-01 + 0.506691597402095795E-01 + 0.491933710873126984E-01 + 0.477605685591697693E-01 + 0.463694632053375244E-01 + 0.450189039111137390E-01 + 0.437076836824417114E-01 + 0.424346588551998138E-01 + 0.411986932158470154E-01 + 0.399987809360027313E-01 + 0.388337559998035431E-01 + 0.377026759088039398E-01 + 0.366045199334621429E-01 + 0.355383567512035370E-01 + 0.345032364130020142E-01 + 0.334982611238956451E-01 + 0.325225852429866791E-01 + 0.315753370523452759E-01 + 0.306556429713964462E-01 + 0.297627374529838562E-01 + 0.288958419114351273E-01 + 0.280542187392711639E-01 + 0.272371210157871246E-01 + 0.264438055455684662E-01 + 0.256736110895872116E-01 + 0.249258726835250854E-01 + 0.241998862475156784E-01 + 0.234950631856918335E-01 + 0.228107441216707230E-01 + 0.221463460475206375E-01 + 0.215013120323419571E-01 + 0.208750609308481216E-01 + 0.202670432627201080E-01 + 0.196767468005418777E-01 + 0.191036313772201538E-01 + 0.185471959412097931E-01 + 0.180070083588361740E-01 + 0.174825321882963181E-01 + 0.169733483344316483E-01 + 0.164789855480194092E-01 + 0.159990005195140839E-01 + 0.155330086126923561E-01 + 0.150805851444602013E-01 + 0.146413566544651985E-01 + 0.142149170860648155E-01 + 0.138009106740355492E-01 + 0.133989322930574417E-01 + 0.130086671561002731E-01 + 0.126297743991017342E-01 + 0.122619308531284332E-01 + 0.119047965854406357E-01 + 0.115580512210726738E-01 + 0.112213948741555214E-01 + 0.108945732936263084E-01 + 0.105772558599710464E-01 + 0.102691901847720146E-01 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.100000239908695221E-01 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999990198761224747E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 +__u01dn01 + 250 + -0.271000003814697266E+01 + -0.271000003814697266E+01 + -0.271000003814697266E+01 + -0.271000003814697266E+01 + -0.271000003814697266E+01 + -0.271000003814697266E+01 + -0.271000003814697266E+01 + -0.271000003814697266E+01 + -0.271000003814697266E+01 + -0.271000003814697266E+01 + -0.277084660530090332E+01 + -0.287076568603515625E+01 + -0.297368240356445313E+01 + -0.307968640327453613E+01 + -0.318887066841125488E+01 + -0.330133032798767090E+01 + -0.341716384887695313E+01 + -0.353647255897521973E+01 + -0.352038979530334473E+01 + -0.349959468841552734E+01 + -0.347817540168762207E+01 + -0.345611381530761719E+01 + -0.343339014053344727E+01 + -0.340998482704162598E+01 + -0.337475848197937012E+01 + -0.328295969963073730E+01 + -0.318840670585632324E+01 + -0.309101748466491699E+01 + -0.299070644378662109E+01 + -0.288738608360290527E+01 + -0.278096628189086914E+01 + -0.261160659790039063E+01 + -0.243661952018737793E+01 + -0.225638246536254883E+01 + -0.207073879241943359E+01 + -0.187952518463134766E+01 + -0.167072951793670654E+01 + -0.142602384090423584E+01 + -0.117397618293762207E+01 + -0.914367675781250000E+00 + -0.646970510482788086E+00 + -0.371551632881164551E+00 + -0.713925063610076904E-01 + 0.238491535186767578E+00 + 0.557672321796417236E+00 + 0.886429071426391602E+00 + 0.122504770755767822E+01 + 0.155904006958007813E+01 + 0.190187835693359375E+01 + 0.225500106811523438E+01 + 0.261871767044067383E+01 + 0.298705983161926270E+01 + 0.332745456695556641E+01 + 0.367806077003479004E+01 + 0.403918600082397461E+01 + 0.441114473342895508E+01 + 0.475697183609008789E+01 + 0.508290481567382813E+01 + 0.541861581802368164E+01 + 0.576439809799194336E+01 + 0.610793638229370117E+01 + 0.638321971893310547E+01 + 0.666676139831542969E+01 + 0.695880937576293945E+01 + 0.725961923599243164E+01 + 0.754496240615844727E+01 + 0.783508586883544922E+01 + 0.813391304016113281E+01 + 0.844170379638671875E+01 + 0.872272300720214844E+01 + 0.899785709381103516E+01 + 0.928124523162841797E+01 + 0.957313537597656250E+01 + 0.986987972259521484E+01 + 0.101736173629760742E+02 + 0.104864673614501953E+02 + 0.108087024688720703E+02 + 0.111116161346435547E+02 + 0.114123449325561523E+02 + 0.117221508026123047E+02 + 0.120360336303710938E+02 + 0.122386236190795898E+02 + 0.124181671142578125E+02 + 0.125977106094360352E+02 + 0.127772541046142578E+02 + 0.131642017364501953E+02 + 0.136625709533691406E+02 + 0.141609401702880859E+02 + 0.146593103408813477E+02 + 0.151472501754760742E+02 + 0.154578628540039063E+02 + 0.157684755325317383E+02 + 0.160790882110595703E+02 + 0.163896999359130859E+02 + 0.167001209259033203E+02 + 0.168188247680664063E+02 + 0.169375305175781250E+02 + 0.170562343597412109E+02 + 0.171749401092529297E+02 + 0.172936439514160156E+02 + 0.173657684326171875E+02 + 0.173788490295410156E+02 + 0.173919296264648438E+02 + 0.174050102233886719E+02 + 0.174180908203125000E+02 + 0.174311714172363281E+02 + 0.174206790924072266E+02 + 0.173612232208251953E+02 + 0.173017673492431641E+02 + 0.172423114776611328E+02 + 0.171828556060791016E+02 + 0.171233997344970703E+02 + 0.170639457702636719E+02 + 0.170230522155761719E+02 + 0.169946746826171875E+02 + 0.169662990570068359E+02 + 0.169379234313964844E+02 + 0.169095458984375000E+02 + 0.168811702728271484E+02 + 0.168527927398681641E+02 + 0.168355598449707031E+02 + 0.168638134002685547E+02 + 0.168920669555664063E+02 + 0.169203186035156250E+02 + 0.169485721588134766E+02 + 0.169768257141113281E+02 + 0.170050792694091797E+02 + 0.170333328247070313E+02 + 0.170682773590087891E+02 + 0.172156810760498047E+02 + 0.173630847930908203E+02 + 0.175104885101318359E+02 + 0.176578903198242188E+02 + 0.178052940368652344E+02 + 0.179526977539062500E+02 + 0.181001014709472656E+02 + 0.182475051879882813E+02 + 0.184006366729736328E+02 + 0.186046848297119141E+02 + 0.188087329864501953E+02 + 0.190127792358398438E+02 + 0.192168273925781250E+02 + 0.194208755493164063E+02 + 0.196249217987060547E+02 + 0.198289699554443359E+02 + 0.200330181121826172E+02 + 0.202370643615722656E+02 + 0.204575042724609375E+02 + 0.207269897460937500E+02 + 0.209964752197265625E+02 + 0.212659606933593750E+02 + 0.215354461669921875E+02 + 0.218049297332763672E+02 + 0.220744152069091797E+02 + 0.223439006805419922E+02 + 0.226133861541748047E+02 + 0.228828697204589844E+02 + 0.231523551940917969E+02 + 0.234810485839843750E+02 + 0.238931922912597656E+02 + 0.243053379058837891E+02 + 0.247174835205078125E+02 + 0.251296291351318359E+02 + 0.255417747497558594E+02 + 0.259539203643798828E+02 + 0.263660659790039063E+02 + 0.267782115936279297E+02 + 0.271903572082519531E+02 + 0.276025009155273438E+02 + 0.280146465301513672E+02 + 0.280276069641113281E+02 + 0.277731075286865234E+02 + 0.275186100006103516E+02 + 0.272641105651855469E+02 + 0.270096130371093750E+02 + 0.267551136016845703E+02 + 0.265006141662597656E+02 + 0.262461166381835938E+02 + 0.259916172027587891E+02 + 0.257371196746826172E+02 + 0.254826202392578125E+02 + 0.252281227111816406E+02 + 0.249736232757568359E+02 + 0.247190647125244141E+02 + 0.244644165039062500E+02 + 0.242097682952880859E+02 + 0.239551181793212891E+02 + 0.237004699707031250E+02 + 0.234458217620849609E+02 + 0.231911716461181641E+02 + 0.229365234375000000E+02 + 0.226818733215332031E+02 + 0.224272251129150391E+02 + 0.221725769042968750E+02 + 0.219179267883300781E+02 + 0.216632785797119141E+02 + 0.214086303710937500E+02 + 0.211539802551269531E+02 + 0.209239654541015625E+02 + 0.206943397521972656E+02 + 0.204647140502929688E+02 + 0.202350883483886719E+02 + 0.200054626464843750E+02 + 0.197758388519287109E+02 + 0.195462131500244141E+02 + 0.193165874481201172E+02 + 0.190869636535644531E+02 + 0.188573379516601563E+02 + 0.186277122497558594E+02 + 0.183980865478515625E+02 + 0.181684608459472656E+02 + 0.179388370513916016E+02 + 0.177092094421386719E+02 + 0.174503669738769531E+02 + 0.170001678466796875E+02 + 0.165499668121337891E+02 + 0.160997676849365234E+02 + 0.156495685577392578E+02 + 0.151993694305419922E+02 + 0.147491703033447266E+02 + 0.142989702224731445E+02 + 0.138487710952758789E+02 + 0.133985719680786133E+02 + 0.129483718872070313E+02 + 0.124981727600097656E+02 + 0.120479736328125000E+02 + 0.115977745056152344E+02 + 0.111475753784179688E+02 + 0.106973752975463867E+02 + 0.102471752166748047E+02 + 0.979697608947753906E+01 + 0.938239288330078125E+01 + 0.898338413238525391E+01 + 0.858437538146972656E+01 + 0.818536758422851563E+01 + 0.778635835647583008E+01 + 0.738735008239746094E+01 + 0.698834133148193359E+01 + 0.658933258056640625E+01 + 0.619032430648803711E+01 + 0.579131603240966797E+01 + 0.539230728149414063E+01 + 0.499329853057861328E+01 + 0.459428977966308594E+01 + 0.419528150558471680E+01 + 0.379627275466918945E+01 + 0.339726400375366211E+01 + 0.299825572967529297E+01 + 0.259924697875976563E+01 + 0.220023870468139648E+01 +__v01dn01 + 250 + 0.838000011444091797E+01 + 0.838000011444091797E+01 + 0.838000011444091797E+01 + 0.838000011444091797E+01 + 0.838000011444091797E+01 + 0.838000011444091797E+01 + 0.838000011444091797E+01 + 0.838000011444091797E+01 + 0.838000011444091797E+01 + 0.838000011444091797E+01 + 0.854714488983154297E+01 + 0.882162189483642578E+01 + 0.910433197021484375E+01 + 0.939552402496337891E+01 + 0.969545173645019531E+01 + 0.100043773651123047E+02 + 0.103225708007812500E+02 + 0.106503105163574219E+02 + 0.108678665161132813E+02 + 0.110882968902587891E+02 + 0.113153400421142578E+02 + 0.115491952896118164E+02 + 0.117900657653808594E+02 + 0.120381622314453125E+02 + 0.122802333831787109E+02 + 0.124623260498046875E+02 + 0.126498813629150391E+02 + 0.128430633544921875E+02 + 0.130420417785644531E+02 + 0.132469882965087891E+02 + 0.134580831527709961E+02 + 0.135895338058471680E+02 + 0.137241392135620117E+02 + 0.138627824783325195E+02 + 0.140055856704711914E+02 + 0.141526727676391602E+02 + 0.142790746688842773E+02 + 0.143464574813842773E+02 + 0.144158620834350586E+02 + 0.144873485565185547E+02 + 0.145609798431396484E+02 + 0.146368198394775391E+02 + 0.146435852050781250E+02 + 0.146474351882934570E+02 + 0.146513996124267578E+02 + 0.146554832458496094E+02 + 0.146596899032592773E+02 + 0.146142835617065430E+02 + 0.145635681152343750E+02 + 0.145113306045532227E+02 + 0.144575271606445313E+02 + 0.143990955352783203E+02 + 0.143202238082885742E+02 + 0.142389860153198242E+02 + 0.141553106307983398E+02 + 0.140691251754760742E+02 + 0.139931802749633789E+02 + 0.139253683090209961E+02 + 0.138555231094360352E+02 + 0.137835817337036133E+02 + 0.137169160842895508E+02 + 0.136945352554321289E+02 + 0.136714830398559570E+02 + 0.136477394104003906E+02 + 0.136232824325561523E+02 + 0.136618223190307617E+02 + 0.137113561630249023E+02 + 0.137623748779296875E+02 + 0.138149251937866211E+02 + 0.139026937484741211E+02 + 0.140064725875854492E+02 + 0.141133642196655273E+02 + 0.142234630584716797E+02 + 0.144566297531127930E+02 + 0.147554292678833008E+02 + 0.150631923675537109E+02 + 0.153801879882812500E+02 + 0.155695848464965820E+02 + 0.157111043930053711E+02 + 0.158568954467773438E+02 + 0.160046043395996094E+02 + 0.165927867889404297E+02 + 0.172726593017578125E+02 + 0.179525299072265625E+02 + 0.186324024200439453E+02 + 0.189011459350585938E+02 + 0.189490242004394531E+02 + 0.189969024658203125E+02 + 0.190447807312011719E+02 + 0.190846157073974609E+02 + 0.189876728057861328E+02 + 0.188907318115234375E+02 + 0.187937889099121094E+02 + 0.186968460083007813E+02 + 0.186000556945800781E+02 + 0.186558113098144531E+02 + 0.187115669250488281E+02 + 0.187673225402832031E+02 + 0.188230781555175781E+02 + 0.188788318634033203E+02 + 0.189871520996093750E+02 + 0.191621017456054688E+02 + 0.193370532989501953E+02 + 0.195120029449462891E+02 + 0.196869525909423828E+02 + 0.198619022369384766E+02 + 0.200379638671875000E+02 + 0.202163314819335938E+02 + 0.203946990966796875E+02 + 0.205730667114257813E+02 + 0.207514343261718750E+02 + 0.209298000335693359E+02 + 0.211081676483154297E+02 + 0.212155113220214844E+02 + 0.212749671936035156E+02 + 0.213344230651855469E+02 + 0.213938789367675781E+02 + 0.214533329010009766E+02 + 0.215127887725830078E+02 + 0.215722446441650391E+02 + 0.216253185272216797E+02 + 0.216523437500000000E+02 + 0.216793689727783203E+02 + 0.217063941955566406E+02 + 0.217334175109863281E+02 + 0.217604427337646484E+02 + 0.217874679565429688E+02 + 0.218144931793212891E+02 + 0.218431358337402344E+02 + 0.218989696502685547E+02 + 0.219548053741455078E+02 + 0.220106391906738281E+02 + 0.220664749145507813E+02 + 0.221223087310791016E+02 + 0.221781444549560547E+02 + 0.222339782714843750E+02 + 0.222898120880126953E+02 + 0.223436965942382813E+02 + 0.223802433013916016E+02 + 0.224167881011962891E+02 + 0.224533348083496094E+02 + 0.224898796081542969E+02 + 0.225264263153076172E+02 + 0.225629711151123047E+02 + 0.225995178222656250E+02 + 0.226360645294189453E+02 + 0.226726093292236328E+02 + 0.227009258270263672E+02 + 0.227046165466308594E+02 + 0.227083091735839844E+02 + 0.227119998931884766E+02 + 0.227156906127929688E+02 + 0.227193832397460938E+02 + 0.227230739593505859E+02 + 0.227267665863037109E+02 + 0.227304573059082031E+02 + 0.227341480255126953E+02 + 0.227378406524658203E+02 + 0.226381435394287109E+02 + 0.223927173614501953E+02 + 0.221472930908203125E+02 + 0.219018669128417969E+02 + 0.216564426422119141E+02 + 0.214110164642333984E+02 + 0.211655921936035156E+02 + 0.209201660156250000E+02 + 0.206747417449951172E+02 + 0.204293155670166016E+02 + 0.201838912963867188E+02 + 0.199384651184082031E+02 + 0.197638034820556641E+02 + 0.196365547180175781E+02 + 0.195093040466308594E+02 + 0.193820552825927734E+02 + 0.192548065185546875E+02 + 0.191275577545166016E+02 + 0.190003070831298828E+02 + 0.188730583190917969E+02 + 0.187458095550537109E+02 + 0.186185588836669922E+02 + 0.184913101196289063E+02 + 0.183640613555908203E+02 + 0.182368125915527344E+02 + 0.181052703857421875E+02 + 0.179671897888183594E+02 + 0.178291110992431641E+02 + 0.176910324096679688E+02 + 0.175529518127441406E+02 + 0.174148731231689453E+02 + 0.172767944335937500E+02 + 0.171387138366699219E+02 + 0.170006351470947266E+02 + 0.168625564575195313E+02 + 0.167244758605957031E+02 + 0.165863971710205078E+02 + 0.164483184814453125E+02 + 0.163102378845214844E+02 + 0.161721591949462891E+02 + 0.159048433303833008E+02 + 0.156354751586914063E+02 + 0.153661069869995117E+02 + 0.150967388153076172E+02 + 0.148273706436157227E+02 + 0.145580024719238281E+02 + 0.142886343002319336E+02 + 0.140192661285400391E+02 + 0.137498989105224609E+02 + 0.134805297851562500E+02 + 0.132111625671386719E+02 + 0.129417934417724609E+02 + 0.126724262237548828E+02 + 0.124030580520629883E+02 + 0.121336870193481445E+02 + 0.118741712570190430E+02 + 0.116791801452636719E+02 + 0.114841890335083008E+02 + 0.112891988754272461E+02 + 0.110942077636718750E+02 + 0.108992166519165039E+02 + 0.107042264938354492E+02 + 0.105092353820800781E+02 + 0.103142442703247070E+02 + 0.101192541122436523E+02 + 0.992426300048828125E+01 + 0.972927188873291016E+01 + 0.953428173065185547E+01 + 0.933929061889648438E+01 + 0.914429950714111328E+01 + 0.894930934906005859E+01 + 0.875431823730468750E+01 + 0.855932712554931641E+01 + 0.831746864318847656E+01 + 0.805511379241943359E+01 + 0.779275941848754883E+01 + 0.753040504455566406E+01 + 0.726805019378662109E+01 + 0.700569534301757813E+01 + 0.674334096908569336E+01 + 0.648098659515380859E+01 + 0.621863174438476563E+01 + 0.595627689361572266E+01 + 0.569392204284667969E+01 + 0.543156766891479492E+01 + 0.516921281814575195E+01 + 0.490685844421386719E+01 + 0.464450359344482422E+01 + 0.438214921951293945E+01 + 0.411979436874389648E+01 + 0.385743951797485352E+01 + 0.359508514404296875E+01 +__pi01dn01 + 250 + 0.100127435302734375E+04 + 0.100096276855468750E+04 + 0.100064184570312500E+04 + 0.100031127929687500E+04 + 0.999970764160156250E+03 + 0.999620056152343750E+03 + 0.999258850097656250E+03 + 0.998886779785156250E+03 + 0.998503540039062500E+03 + 0.998108764648437500E+03 + 0.997702148437500000E+03 + 0.997283264160156250E+03 + 0.996851745605468750E+03 + 0.996407165527343750E+03 + 0.995949157714843750E+03 + 0.995477355957031250E+03 + 0.994991271972656250E+03 + 0.994490539550781250E+03 + 0.993974670410156250E+03 + 0.993443237304687500E+03 + 0.992895751953125000E+03 + 0.992331726074218750E+03 + 0.991750732421875000E+03 + 0.991152160644531250E+03 + 0.990535522460937500E+03 + 0.989900268554687500E+03 + 0.989245849609375000E+03 + 0.988571716308593750E+03 + 0.987877258300781250E+03 + 0.987161804199218750E+03 + 0.986424743652343750E+03 + 0.985665466308593750E+03 + 0.984883300781250000E+03 + 0.984077575683593750E+03 + 0.983247558593750000E+03 + 0.982392517089843750E+03 + 0.981511657714843750E+03 + 0.980604248046875000E+03 + 0.979669494628906250E+03 + 0.978706604003906250E+03 + 0.977714660644531250E+03 + 0.976692871093750000E+03 + 0.975640258789062500E+03 + 0.974555969238281250E+03 + 0.973439025878906250E+03 + 0.972288452148437500E+03 + 0.971103271484375000E+03 + 0.969882385253906250E+03 + 0.968624755859375000E+03 + 0.967329284667968750E+03 + 0.965994873046875000E+03 + 0.964620300292968750E+03 + 0.963204345703125000E+03 + 0.961745849609375000E+03 + 0.960243469238281250E+03 + 0.958695861816406250E+03 + 0.957101684570312500E+03 + 0.955459594726562500E+03 + 0.953768066406250000E+03 + 0.952025695800781250E+03 + 0.950230895996093750E+03 + 0.948382080078125000E+03 + 0.946477539062500000E+03 + 0.944515625000000000E+03 + 0.942494628906250000E+03 + 0.940412597656250000E+03 + 0.938267517089843750E+03 + 0.936057495117187500E+03 + 0.933780517578125000E+03 + 0.931434814453125000E+03 + 0.929018859863281250E+03 + 0.926530639648437500E+03 + 0.923968017578125000E+03 + 0.921329467773437500E+03 + 0.918613830566406250E+03 + 0.915819274902343750E+03 + 0.912943603515625000E+03 + 0.909984741210937500E+03 + 0.906940002441406250E+03 + 0.903807189941406250E+03 + 0.900637023925781250E+03 + 0.897475952148437500E+03 + 0.894318542480468750E+03 + 0.891164794921875000E+03 + 0.888014648437500000E+03 + 0.884867736816406250E+03 + 0.881723388671875000E+03 + 0.878581359863281250E+03 + 0.875441650390625000E+03 + 0.872304260253906250E+03 + 0.869169372558593750E+03 + 0.866037109375000000E+03 + 0.862907470703125000E+03 + 0.859780456542968750E+03 + 0.856656066894531250E+03 + 0.853533996582031250E+03 + 0.850413879394531250E+03 + 0.847295715332031250E+03 + 0.844179565429687500E+03 + 0.841065368652343750E+03 + 0.837953063964843750E+03 + 0.834842590332031250E+03 + 0.831733947753906250E+03 + 0.828627075195312500E+03 + 0.825522033691406250E+03 + 0.822418762207031250E+03 + 0.819317382812500000E+03 + 0.816218139648437500E+03 + 0.813121276855468750E+03 + 0.810026733398437500E+03 + 0.806934509277343750E+03 + 0.803844604492187500E+03 + 0.800757019042968750E+03 + 0.797671752929687500E+03 + 0.794588684082031250E+03 + 0.791507812500000000E+03 + 0.788429077148437500E+03 + 0.785352539062500000E+03 + 0.782278137207031250E+03 + 0.779205932617187500E+03 + 0.776135864257812500E+03 + 0.773067871093750000E+03 + 0.770001892089843750E+03 + 0.766937866210937500E+03 + 0.763875854492187500E+03 + 0.760815856933593750E+03 + 0.757757812500000000E+03 + 0.754701782226562500E+03 + 0.751647705078125000E+03 + 0.748595458984375000E+03 + 0.745544860839843750E+03 + 0.742495910644531250E+03 + 0.739448547363281250E+03 + 0.736402832031250000E+03 + 0.733358764648437500E+03 + 0.730316345214843750E+03 + 0.727275573730468750E+03 + 0.724236389160156250E+03 + 0.721198791503906250E+03 + 0.718162780761718750E+03 + 0.715128295898437500E+03 + 0.712095397949218750E+03 + 0.709064025878906250E+03 + 0.706034179687500000E+03 + 0.703005920410156250E+03 + 0.699979187011718750E+03 + 0.696953979492187500E+03 + 0.693930480957031250E+03 + 0.690909362792968750E+03 + 0.687891052246093750E+03 + 0.684875549316406250E+03 + 0.681862854003906250E+03 + 0.678852966308593750E+03 + 0.675845886230468750E+03 + 0.672841613769531250E+03 + 0.669840148925781250E+03 + 0.666841430664062500E+03 + 0.663845520019531250E+03 + 0.660853393554687500E+03 + 0.657867553710937500E+03 + 0.654889465332031250E+03 + 0.651919006347656250E+03 + 0.648956176757812500E+03 + 0.646000915527343750E+03 + 0.643053222656250000E+03 + 0.640113037109375000E+03 + 0.637180297851562500E+03 + 0.634255004882812500E+03 + 0.631337097167968750E+03 + 0.628426513671875000E+03 + 0.625525024414062500E+03 + 0.622635375976562500E+03 + 0.619758666992187500E+03 + 0.616894775390625000E+03 + 0.614043579101562500E+03 + 0.611204956054687500E+03 + 0.608378845214843750E+03 + 0.605565063476562500E+03 + 0.602763549804687500E+03 + 0.599974182128906250E+03 + 0.597196899414062500E+03 + 0.594431518554687500E+03 + 0.591677978515625000E+03 + 0.588936157226562500E+03 + 0.586205932617187500E+03 + 0.583487182617187500E+03 + 0.580779785156250000E+03 + 0.578083679199218750E+03 + 0.575398742675781250E+03 + 0.572724853515625000E+03 + 0.570061950683593750E+03 + 0.567409973144531250E+03 + 0.564768798828125000E+03 + 0.562138366699218750E+03 + 0.559518554687500000E+03 + 0.556909301757812500E+03 + 0.554310485839843750E+03 + 0.551722045898437500E+03 + 0.549144042968750000E+03 + 0.546576477050781250E+03 + 0.544019226074218750E+03 + 0.541472229003906250E+03 + 0.538935424804687500E+03 + 0.536408691406250000E+03 + 0.533891967773437500E+03 + 0.531385192871093750E+03 + 0.528888305664062500E+03 + 0.526401184082031250E+03 + 0.523923767089843750E+03 + 0.521455993652343750E+03 + 0.518997741699218750E+03 + 0.516549011230468750E+03 + 0.514109680175781250E+03 + 0.511679656982421875E+03 + 0.509258758544921875E+03 + 0.506846771240234375E+03 + 0.504443664550781250E+03 + 0.502049346923828125E+03 + 0.499663757324218750E+03 + 0.497286834716796875E+03 + 0.494918518066406250E+03 + 0.492558746337890625E+03 + 0.490207458496093750E+03 + 0.487864593505859375E+03 + 0.485530090332031250E+03 + 0.483203887939453125E+03 + 0.480885925292968750E+03 + 0.478576141357421875E+03 + 0.476274475097656250E+03 + 0.473980895996093750E+03 + 0.471695312500000000E+03 + 0.469418365478515625E+03 + 0.467150939941406250E+03 + 0.464893218994140625E+03 + 0.462645141601562500E+03 + 0.460406616210937500E+03 + 0.458177581787109375E+03 + 0.455957946777343750E+03 + 0.453747619628906250E+03 + 0.451546539306640625E+03 + 0.449354614257812500E+03 + 0.447171783447265625E+03 + 0.444997985839843750E+03 + 0.442833129882812500E+03 + 0.440677124023437500E+03 + 0.438529907226562500E+03 + 0.436391418457031250E+03 + 0.434261566162109375E+03 + 0.432140319824218750E+03 + 0.430027587890625000E+03 +__th01dn01 + 250 + 0.309907257080078125E+03 + 0.309907257080078125E+03 + 0.309903442382812500E+03 + 0.309899536132812500E+03 + 0.309895507812500000E+03 + 0.309891326904296875E+03 + 0.309887084960937500E+03 + 0.309882690429687500E+03 + 0.309878173828125000E+03 + 0.309873474121093750E+03 + 0.309837249755859375E+03 + 0.309780731201171875E+03 + 0.309722473144531250E+03 + 0.309662506103515625E+03 + 0.309600708007812500E+03 + 0.309537078857421875E+03 + 0.309471557617187500E+03 + 0.309404052734375000E+03 + 0.309354461669921875E+03 + 0.309303985595703125E+03 + 0.309251983642578125E+03 + 0.309198394775390625E+03 + 0.309143280029296875E+03 + 0.309086425781250000E+03 + 0.309029907226562500E+03 + 0.308981628417968750E+03 + 0.308931823730468750E+03 + 0.308880584716796875E+03 + 0.308827789306640625E+03 + 0.308773406982421875E+03 + 0.308717437744140625E+03 + 0.308675170898437500E+03 + 0.308631835937500000E+03 + 0.308587158203125000E+03 + 0.308541168212890625E+03 + 0.308493804931640625E+03 + 0.308448333740234375E+03 + 0.308409912109375000E+03 + 0.308370330810546875E+03 + 0.308329589843750000E+03 + 0.308287597656250000E+03 + 0.308244415283203125E+03 + 0.308213623046875000E+03 + 0.308182525634765625E+03 + 0.308150482177734375E+03 + 0.308117492675781250E+03 + 0.308083526611328125E+03 + 0.308057464599609375E+03 + 0.308031372070312500E+03 + 0.308004486083984375E+03 + 0.307976806640625000E+03 + 0.307949096679687500E+03 + 0.307925598144531250E+03 + 0.307901367187500000E+03 + 0.307876373291015625E+03 + 0.307850708007812500E+03 + 0.307826171875000000E+03 + 0.307802551269531250E+03 + 0.307778198242187500E+03 + 0.307753112792968750E+03 + 0.307726074218750000E+03 + 0.307690704345703125E+03 + 0.307654296875000000E+03 + 0.307616790771484375E+03 + 0.307578186035156250E+03 + 0.307500701904296875E+03 + 0.307415069580078125E+03 + 0.307326873779296875E+03 + 0.307235961914062500E+03 + 0.307229034423828125E+03 + 0.307256225585937500E+03 + 0.307284088134765625E+03 + 0.307312591552734375E+03 + 0.307505554199218750E+03 + 0.307784240722656250E+03 + 0.308070953369140625E+03 + 0.308366088867187500E+03 + 0.308708312988281250E+03 + 0.309075897216796875E+03 + 0.309454406738281250E+03 + 0.309837829589843750E+03 + 0.310200683593750000E+03 + 0.310559356689453125E+03 + 0.310917999267578125E+03 + 0.311276550292968750E+03 + 0.311552001953125000E+03 + 0.311782836914062500E+03 + 0.312013671875000000E+03 + 0.312244445800781250E+03 + 0.312476989746093750E+03 + 0.312740447998046875E+03 + 0.313003845214843750E+03 + 0.313267303466796875E+03 + 0.313530700683593750E+03 + 0.313794006347656250E+03 + 0.313992218017578125E+03 + 0.314190429687500000E+03 + 0.314388671875000000E+03 + 0.314586883544921875E+03 + 0.314785034179687500E+03 + 0.314976348876953125E+03 + 0.315158874511718750E+03 + 0.315341430664062500E+03 + 0.315523956298828125E+03 + 0.315706481933593750E+03 + 0.315888977050781250E+03 + 0.316089813232421875E+03 + 0.316328582763671875E+03 + 0.316567352294921875E+03 + 0.316806091308593750E+03 + 0.317044860839843750E+03 + 0.317283569335937500E+03 + 0.317522308349609375E+03 + 0.317752563476562500E+03 + 0.317977111816406250E+03 + 0.318201660156250000E+03 + 0.318426208496093750E+03 + 0.318650726318359375E+03 + 0.318875274658203125E+03 + 0.319099761962890625E+03 + 0.319321105957031250E+03 + 0.319529602050781250E+03 + 0.319738098144531250E+03 + 0.319946594238281250E+03 + 0.320155059814453125E+03 + 0.320363525390625000E+03 + 0.320571990966796875E+03 + 0.320780426025390625E+03 + 0.320986938476562500E+03 + 0.321159851074218750E+03 + 0.321332794189453125E+03 + 0.321505676269531250E+03 + 0.321678619384765625E+03 + 0.321851531982421875E+03 + 0.322024505615234375E+03 + 0.322197418212890625E+03 + 0.322370330810546875E+03 + 0.322542480468750000E+03 + 0.322707763671875000E+03 + 0.322873046875000000E+03 + 0.323038360595703125E+03 + 0.323203643798828125E+03 + 0.323368896484375000E+03 + 0.323534179687500000E+03 + 0.323699493408203125E+03 + 0.323864776611328125E+03 + 0.324030029296875000E+03 + 0.324229919433593750E+03 + 0.324533386230468750E+03 + 0.324836853027343750E+03 + 0.325140289306640625E+03 + 0.325443725585937500E+03 + 0.325747222900390625E+03 + 0.326050659179687500E+03 + 0.326354095458984375E+03 + 0.326657531738281250E+03 + 0.326960998535156250E+03 + 0.327264465332031250E+03 + 0.327794219970703125E+03 + 0.328642883300781250E+03 + 0.329491577148437500E+03 + 0.330340240478515625E+03 + 0.331188934326171875E+03 + 0.332037597656250000E+03 + 0.332886291503906250E+03 + 0.333734985351562500E+03 + 0.334583648681640625E+03 + 0.335432312011718750E+03 + 0.336281005859375000E+03 + 0.337129699707031250E+03 + 0.338382720947265625E+03 + 0.339906707763671875E+03 + 0.341430664062500000E+03 + 0.342954620361328125E+03 + 0.344478576660156250E+03 + 0.346002563476562500E+03 + 0.347526519775390625E+03 + 0.349050476074218750E+03 + 0.350574432373046875E+03 + 0.352098419189453125E+03 + 0.353622375488281250E+03 + 0.355146331787109375E+03 + 0.356670288085937500E+03 + 0.358189758300781250E+03 + 0.359702392578125000E+03 + 0.361215026855468750E+03 + 0.362727661132812500E+03 + 0.364240295410156250E+03 + 0.365752899169921875E+03 + 0.367265533447265625E+03 + 0.368778167724609375E+03 + 0.370290802001953125E+03 + 0.371803436279296875E+03 + 0.373316070556640625E+03 + 0.374828704833984375E+03 + 0.376341308593750000E+03 + 0.377853942871093750E+03 + 0.379366577148437500E+03 + 0.380909759521484375E+03 + 0.382453399658203125E+03 + 0.383997070312500000E+03 + 0.385540771484375000E+03 + 0.387084411621093750E+03 + 0.388628082275390625E+03 + 0.390171752929687500E+03 + 0.391715393066406250E+03 + 0.393259063720703125E+03 + 0.394802734375000000E+03 + 0.396346374511718750E+03 + 0.397890045166015625E+03 + 0.399433715820312500E+03 + 0.400977355957031250E+03 + 0.402521057128906250E+03 + 0.404058654785156250E+03 + 0.405556640625000000E+03 + 0.407054626464843750E+03 + 0.408552612304687500E+03 + 0.410050598144531250E+03 + 0.411548583984375000E+03 + 0.413046569824218750E+03 + 0.414544555664062500E+03 + 0.416042572021484375E+03 + 0.417540557861328125E+03 + 0.419038543701171875E+03 + 0.420536529541015625E+03 + 0.422034515380859375E+03 + 0.423532501220703125E+03 + 0.425030487060546875E+03 + 0.426528472900390625E+03 + 0.428026458740234375E+03 + 0.429524444580078125E+03 + 0.431275360107421875E+03 + 0.433136871337890625E+03 + 0.434998413085937500E+03 + 0.436859954833984375E+03 + 0.438721466064453125E+03 + 0.440583007812500000E+03 + 0.442444519042968750E+03 + 0.444306030273437500E+03 + 0.446167541503906250E+03 + 0.448029083251953125E+03 + 0.449890594482421875E+03 + 0.451752105712890625E+03 + 0.453613647460937500E+03 + 0.455475158691406250E+03 + 0.457336669921875000E+03 + 0.459198211669921875E+03 + 0.461059722900390625E+03 + 0.462921234130859375E+03 + 0.464782745361328125E+03 +__dn01dn01 + 250 + 0.111670076847076416E+01 + 0.111583304405212402E+01 + 0.111495316028594971E+01 + 0.111404716968536377E+01 + 0.111311447620391846E+01 + 0.111215424537658691E+01 + 0.111116600036621094E+01 + 0.111014842987060547E+01 + 0.110910069942474365E+01 + 0.110802233219146729E+01 + 0.110702455043792725E+01 + 0.110606551170349121E+01 + 0.110507798194885254E+01 + 0.110406100749969482E+01 + 0.110301351547241211E+01 + 0.110193514823913574E+01 + 0.110082459449768066E+01 + 0.109968078136444092E+01 + 0.109843230247497559E+01 + 0.109714496135711670E+01 + 0.109581911563873291E+01 + 0.109445440769195557E+01 + 0.109304881095886230E+01 + 0.109160244464874268E+01 + 0.109010577201843262E+01 + 0.108853006362915039E+01 + 0.108690869808197021E+01 + 0.108523905277252197E+01 + 0.108352053165435791E+01 + 0.108175158500671387E+01 + 0.107993090152740479E+01 + 0.107800281047821045E+01 + 0.107601821422576904E+01 + 0.107397580146789551E+01 + 0.107187390327453613E+01 + 0.106971108913421631E+01 + 0.106747353076934814E+01 + 0.106514251232147217E+01 + 0.106274425983428955E+01 + 0.106027674674987793E+01 + 0.105773806571960449E+01 + 0.105512654781341553E+01 + 0.105239295959472656E+01 + 0.104957938194274902E+01 + 0.104668557643890381E+01 + 0.104370951652526855E+01 + 0.104064846038818359E+01 + 0.103747093677520752E+01 + 0.103420090675354004E+01 + 0.103083884716033936E+01 + 0.102738225460052490E+01 + 0.102382588386535645E+01 + 0.102015328407287598E+01 + 0.101637852191925049E+01 + 0.101249897480010986E+01 + 0.100851118564605713E+01 + 0.100440704822540283E+01 + 0.100018405914306641E+01 + 0.995845079421997070E+00 + 0.991387069225311279E+00 + 0.986811041831970215E+00 + 0.982134342193603516E+00 + 0.977330088615417480E+00 + 0.972395360469818115E+00 + 0.967327058315277100E+00 + 0.962239861488342285E+00 + 0.957032382488250732E+00 + 0.951683580875396729E+00 + 0.946190655231475830E+00 + 0.940284967422485352E+00 + 0.934121131896972656E+00 + 0.927799105644226074E+00 + 0.921316146850585938E+00 + 0.914183199405670166E+00 + 0.906644761562347412E+00 + 0.898932337760925293E+00 + 0.891043782234191895E+00 + 0.882866740226745605E+00 + 0.874464094638824463E+00 + 0.865876972675323486E+00 + 0.857247173786163330E+00 + 0.848756194114685059E+00 + 0.840344369411468506E+00 + 0.831999599933624268E+00 + 0.823721885681152344E+00 + 0.815726816654205322E+00 + 0.807905972003936768E+00 + 0.800140321254730225E+00 + 0.792429745197296143E+00 + 0.784769535064697266E+00 + 0.777087628841400146E+00 + 0.769462049007415771E+00 + 0.761892855167388916E+00 + 0.754379570484161377E+00 + 0.746922433376312256E+00 + 0.739673197269439697E+00 + 0.732474088668823242E+00 + 0.725325345993041992E+00 + 0.718226611614227295E+00 + 0.711177647113800049E+00 + 0.704193413257598877E+00 + 0.697277009487152100E+00 + 0.690408766269683838E+00 + 0.683588266372680664E+00 + 0.676815092563629150E+00 + 0.670089662075042725E+00 + 0.663372635841369629E+00 + 0.656625390052795410E+00 + 0.649928510189056396E+00 + 0.643281519412994385E+00 + 0.636684298515319824E+00 + 0.630136549472808838E+00 + 0.623638093471527100E+00 + 0.617204904556274414E+00 + 0.610830605030059814E+00 + 0.604504227638244629E+00 + 0.598224937915802002E+00 + 0.591992735862731934E+00 + 0.585807383060455322E+00 + 0.579668641090393066E+00 + 0.573581755161285400E+00 + 0.567563652992248535E+00 + 0.561590433120727539E+00 + 0.555661857128143311E+00 + 0.549777865409851074E+00 + 0.543938159942626953E+00 + 0.538142383098602295E+00 + 0.532390475273132324E+00 + 0.526685476303100586E+00 + 0.521077871322631836E+00 + 0.515511572360992432E+00 + 0.509986519813537598E+00 + 0.504501998424530029E+00 + 0.499058365821838379E+00 + 0.493655264377593994E+00 + 0.488292634487152100E+00 + 0.482970029115676880E+00 + 0.477688550949096680E+00 + 0.472456902265548706E+00 + 0.467264503240585327E+00 + 0.462111085653305054E+00 + 0.456996619701385498E+00 + 0.451920777559280396E+00 + 0.446883529424667358E+00 + 0.441884607076644897E+00 + 0.436923891305923462E+00 + 0.432001203298568726E+00 + 0.427071005105972290E+00 + 0.422046124935150146E+00 + 0.417064964771270752E+00 + 0.412127494812011719E+00 + 0.407233268022537231E+00 + 0.402381867170333862E+00 + 0.397573441267013550E+00 + 0.392807364463806152E+00 + 0.388083606958389282E+00 + 0.383401602506637573E+00 + 0.378761231899261475E+00 + 0.373905450105667114E+00 + 0.368744522333145142E+00 + 0.363649308681488037E+00 + 0.358618944883346558E+00 + 0.353652417659759521E+00 + 0.348749011754989624E+00 + 0.343907982110977173E+00 + 0.339128553867340088E+00 + 0.334409743547439575E+00 + 0.329751104116439819E+00 + 0.325151473283767700E+00 + 0.320610284805297852E+00 + 0.315751373767852783E+00 + 0.310720592737197876E+00 + 0.305775552988052368E+00 + 0.300914704799652100E+00 + 0.296136260032653809E+00 + 0.291438698768615723E+00 + 0.286820471286773682E+00 + 0.282280057668685913E+00 + 0.277815908193588257E+00 + 0.273426502943038940E+00 + 0.269110709428787231E+00 + 0.264866828918457031E+00 + 0.260693699121475220E+00 + 0.256593018770217896E+00 + 0.252564996480941772E+00 + 0.248603314161300659E+00 + 0.244706809520721436E+00 + 0.240874215960502625E+00 + 0.237104281783103943E+00 + 0.233396038413047791E+00 + 0.229748144745826721E+00 + 0.226159617304801941E+00 + 0.222629338502883911E+00 + 0.219156369566917419E+00 + 0.215739503502845764E+00 + 0.212377756834030151E+00 + 0.209070175886154175E+00 + 0.205815732479095459E+00 + 0.202597439289093018E+00 + 0.199431061744689941E+00 + 0.196315750479698181E+00 + 0.193250760436058044E+00 + 0.190235123038291931E+00 + 0.187267929315567017E+00 + 0.184348374605178833E+00 + 0.181475609540939331E+00 + 0.178648769855499268E+00 + 0.175867006182670593E+00 + 0.173129573464393616E+00 + 0.170435711741447449E+00 + 0.167784586548805237E+00 + 0.165175482630729675E+00 + 0.162607654929161072E+00 + 0.160082861781120300E+00 + 0.157613083720207214E+00 + 0.155181482434272766E+00 + 0.152787685394287109E+00 + 0.150430813431739807E+00 + 0.148110300302505493E+00 + 0.145825594663619995E+00 + 0.143576085567474365E+00 + 0.141361102461814880E+00 + 0.139180153608322144E+00 + 0.137032672762870789E+00 + 0.134918078780174255E+00 + 0.132835820317268372E+00 + 0.130785390734672546E+00 + 0.128766208887100220E+00 + 0.126777827739715576E+00 + 0.124819725751876831E+00 + 0.122891381382942200E+00 + 0.120921768248081207E+00 + 0.118954420089721680E+00 + 0.117020443081855774E+00 + 0.115119203925132751E+00 + 0.113250114023685455E+00 + 0.111412584781646729E+00 + 0.109605960547924042E+00 + 0.107829689979553223E+00 + 0.106083236634731293E+00 + 0.104365974664688110E+00 + 0.102677382528781891E+00 + 0.101016990840435028E+00 + 0.993841886520385742E-01 + 0.977785140275955200E-01 + 0.961994454264640808E-01 + 0.946464836597442627E-01 + 0.931192040443420410E-01 + 0.916170924901962280E-01 + 0.901397019624710083E-01 +__rt01dn01 + 250 + 0.157400742173194885E-01 + 0.157400742173194885E-01 + 0.157197769731283188E-01 + 0.156988706439733505E-01 + 0.156773384660482407E-01 + 0.156551580876111984E-01 + 0.156323146075010300E-01 + 0.156087838113307953E-01 + 0.155845480039715767E-01 + 0.155595848336815834E-01 + 0.155360717326402664E-01 + 0.155131984502077103E-01 + 0.154896397143602371E-01 + 0.154653731733560562E-01 + 0.154403792694211006E-01 + 0.154146356508135796E-01 + 0.153881199657917023E-01 + 0.153608079999685287E-01 + 0.153312394395470619E-01 + 0.153007395565509796E-01 + 0.152693241834640503E-01 + 0.152369672432541847E-01 + 0.152036398649215698E-01 + 0.151693113148212433E-01 + 0.151335047557950020E-01 + 0.150943771004676819E-01 + 0.150540759786963463E-01 + 0.150125650689005852E-01 + 0.149698099121451378E-01 + 0.149257713928818703E-01 + 0.148804122582077980E-01 + 0.148314256221055984E-01 + 0.147809488698840141E-01 + 0.147289568558335304E-01 + 0.146754058077931404E-01 + 0.146202482283115387E-01 + 0.145624317228794098E-01 + 0.145003683865070343E-01 + 0.144364433363080025E-01 + 0.143706006929278374E-01 + 0.143027827143669128E-01 + 0.142329297959804535E-01 + 0.141618810594081879E-01 + 0.140887415036559105E-01 + 0.140134068205952644E-01 + 0.139358118176460266E-01 + 0.138558903709053993E-01 + 0.137731982395052910E-01 + 0.136879952624440193E-01 + 0.136002376675605774E-01 + 0.135098462924361229E-01 + 0.134156541898846626E-01 + 0.133118750527501106E-01 + 0.132049825042486191E-01 + 0.130948834121227264E-01 + 0.129814818501472473E-01 + 0.128611130639910698E-01 + 0.127342399209737778E-01 + 0.126035604625940323E-01 + 0.124689601361751556E-01 + 0.123188504949212074E-01 + 0.120928045362234116E-01 + 0.118599776178598404E-01 + 0.116201657801866531E-01 + 0.113731585443019867E-01 + 0.108122359961271286E-01 + 0.101871732622385025E-01 + 0.954335834830999374E-02 + 0.888023152947425842E-02 + 0.814564153552055359E-02 + 0.736850779503583908E-02 + 0.656806118786334991E-02 + 0.574360042810440063E-02 + 0.511736655607819557E-02 + 0.458150403574109077E-02 + 0.402956502512097359E-02 + 0.346106919459998608E-02 + 0.315951509401202202E-02 + 0.295987166464328766E-02 + 0.275420234538614750E-02 + 0.254582636989653111E-02 + 0.240100966766476631E-02 + 0.226934440433979034E-02 + 0.213767914101481438E-02 + 0.200601387768983841E-02 + 0.188496639020740986E-02 + 0.176962336990982294E-02 + 0.165428023319691420E-02 + 0.153893709648400545E-02 + 0.142714334651827812E-02 + 0.137570430524647236E-02 + 0.132426526397466660E-02 + 0.127282633911818266E-02 + 0.122138729784637690E-02 + 0.116997293662279844E-02 + 0.114299450069665909E-02 + 0.111601618118584156E-02 + 0.108903786167502403E-02 + 0.106205942574888468E-02 + 0.103508110623806715E-02 + 0.100341590587049723E-02 + 0.965809798799455166E-03 + 0.928203691728413105E-03 + 0.890597584657371044E-03 + 0.852991419378668070E-03 + 0.815385312307626009E-03 + 0.778890273068100214E-03 + 0.744703225791454315E-03 + 0.710516120307147503E-03 + 0.676329073030501604E-03 + 0.642141967546194792E-03 + 0.607954920269548893E-03 + 0.573767814785242081E-03 + 0.543858448509126902E-03 + 0.516833271831274033E-03 + 0.489808095153421164E-03 + 0.462782976683229208E-03 + 0.435757800005376339E-03 + 0.408732681535184383E-03 + 0.381707504857331514E-03 + 0.355890952050685883E-03 + 0.335007964167743921E-03 + 0.314125005388632417E-03 + 0.293242046609520912E-03 + 0.272359058726578951E-03 + 0.251476070843636990E-03 + 0.230593112064525485E-03 + 0.209710153285413980E-03 + 0.189310128916986287E-03 + 0.177026522578671575E-03 + 0.164742901688441634E-03 + 0.152459295350126922E-03 + 0.140175674459896982E-03 + 0.127892068121582270E-03 + 0.115608447231352329E-03 + 0.103324840893037617E-03 + 0.910412200028076768E-04 + 0.793839499237947166E-04 + 0.732929765945300460E-04 + 0.672020032652653754E-04 + 0.611110299360007048E-04 + 0.550200566067360342E-04 + 0.489290869154501706E-04 + 0.428381135861855000E-04 + 0.367471402569208294E-04 + 0.306561669276561588E-04 + 0.245651935983914882E-04 + 0.197688186744926497E-04 + 0.188459234777837992E-04 + 0.179230301000643522E-04 + 0.170001349033555016E-04 + 0.160772415256360546E-04 + 0.151543463289272040E-04 + 0.142314529512077570E-04 + 0.133085586639936082E-04 + 0.123856643767794594E-04 + 0.114627700895653106E-04 + 0.105398758023511618E-04 + 0.968389485933585092E-05 + 0.892223033588379622E-05 + 0.816056490293703973E-05 + 0.739890037948498502E-05 + 0.663723540128557943E-05 + 0.587557042308617383E-05 + 0.511390544488676824E-05 + 0.435224092143471353E-05 + 0.359057594323530793E-05 + 0.282891096503590234E-05 + 0.206724598683649674E-05 + 0.130558146338444203E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 +__kppzm + 48 + -0.170577192306518555E+01 + -0.515288019180297852E+01 + -0.867263221740722656E+01 + -0.122681560516357422E+02 + -0.159427862167358398E+02 + -0.197000827789306641E+02 + -0.235438518524169922E+02 + -0.274781646728515625E+02 + -0.315073947906494141E+02 + -0.356362304687500000E+02 + -0.398697319030761719E+02 + -0.442133331298828125E+02 + -0.486729240417480469E+02 + -0.532548675537109375E+02 + -0.579660606384277344E+02 + -0.628140220642089844E+02 + -0.678069229125976563E+02 + -0.729536972045898438E+02 + -0.782641372680664063E+02 + -0.837490005493164063E+02 + -0.894201202392578125E+02 + -0.952906188964843750E+02 + -0.101375022888183594E+03 + -0.107689506530761719E+03 + -0.114252166748046875E+03 + -0.121083328247070312E+03 + -0.128205902099609375E+03 + -0.135645858764648437E+03 + -0.143432846069335937E+03 + -0.151600814819335937E+03 + -0.160188995361328125E+03 + -0.169243026733398437E+03 + -0.178816345214843750E+03 + -0.188972213745117187E+03 + -0.199786239624023437E+03 + -0.211349731445312500E+03 + -0.223774444580078125E+03 + -0.237199188232421875E+03 + -0.251799423217773437E+03 + -0.267801239013671875E+03 + -0.285503112792968750E+03 + -0.305310638427734375E+03 + -0.327794952392578125E+03 + -0.353797454833984375E+03 + -0.384634338378906250E+03 + -0.422540863037109375E+03 + -0.471808868408203125E+03 + -0.500000000000000000E+03 +__gnu + 8 + 0.400000000000000000E+01 + 0.200000000000000000E+01 + 0.200000000000000000E+01 + 0.200000000000000000E+01 + 0.200000000000000000E+01 + 0.200000000000000000E+01 + 0.200000000000000000E+01 + 0.400000000000000000E+01 +__iaero_chem + 11 + 1 + 1 + 1 + 1 + 2 + 2 + 2 + 1 + 1 + 1 + 1 +__cfmas + 16 + 0.524000000000000000E+03 + 0.524000000000000000E+03 + 0.110800003051757812E+03 + 0.273899990133941174E-02 + 0.495999991893768311E+00 + 0.157000000000000000E+03 + 0.471000000000000000E+03 + 0.885399997234344482E+00 + 0.377000006847083569E-02 + 0.123000005260109901E-02 + 0.100100003182888031E+00 + 0.885399997234344482E+00 + 0.377000006847083569E-02 + 0.123000005260109901E-02 + 0.100100003182888031E+00 + 0.524000000000000000E+03 +__pwmas + 16 + 0.300000000000000000E+01 + 0.300000000000000000E+01 + 0.291000008583068848E+01 + 0.174000000953674316E+01 + 0.240000009536743164E+01 + 0.300000000000000000E+01 + 0.300000000000000000E+01 + 0.250000000000000000E+01 + 0.200000000000000000E+01 + 0.179999995231628418E+01 + 0.225600004196166992E+01 + 0.250000000000000000E+01 + 0.200000000000000000E+01 + 0.179999995231628418E+01 + 0.225600004196166992E+01 + 0.300000000000000000E+01 +__slcpd + 12 + 0.146500000000000000E+07 + 0.140700000000000000E+07 + 0.134400000000000000E+07 + 0.127300000000000000E+07 + 0.121400000000000000E+07 + 0.117700000000000000E+07 + 0.131900000000000000E+07 + 0.122700000000000000E+07 + 0.117700000000000000E+07 + 0.115100000000000000E+07 + 0.108800000000000000E+07 + 0.874000000000000000E+06 +__slmsts + 12 + 0.395000010728836060E+00 + 0.409999996423721313E+00 + 0.435000002384185791E+00 + 0.485000014305114746E+00 + 0.451000005006790161E+00 + 0.419999986886978149E+00 + 0.476999998092651367E+00 + 0.476000010967254639E+00 + 0.425999999046325684E+00 + 0.492000013589859009E+00 + 0.481999993324279785E+00 + 0.862999975681304932E+00 +__slz + 11 + -0.500000000000000000E+00 + -0.400000005960464478E+00 + -0.300000011920928955E+00 + -0.250000000000000000E+00 + -0.200000002980232239E+00 + -0.159999996423721313E+00 + -0.119999997317790985E+00 + -0.900000035762786865E-01 + -0.599999986588954926E-01 + -0.299999993294477463E-01 + -0.999999977648258209E-02 diff --git a/bin.rams/test.supercell/a-A-1991-04-26-214000-head.txt b/bin.rams/test.supercell/a-A-1991-04-26-214000-head.txt new file mode 100644 index 0000000..ea178ec --- /dev/null +++ b/bin.rams/test.supercell/a-A-1991-04-26-214000-head.txt @@ -0,0 +1,3638 @@ + 257 +UP 0 3 1 218750 +VP 0 3 1 218750 +WP 0 3 1 218750 +PP 0 3 1 218750 +UC 0 3 1 218750 +VC 0 3 1 218750 +WC 0 3 1 218750 +PC 0 3 1 218750 +THP 0 3 1 218750 +RTP 0 3 1 218750 +THETA 0 3 1 218750 +RV 0 3 1 218750 +DN0 0 3 1 218750 +WP_BUOY_THETA 0 3 1 218750 +WP_BUOY_COND 0 3 1 218750 +WP_ADVDIF 0 3 1 218750 +SOIL_WATER 0 4 1 19250 +SOIL_ENERGY 0 4 1 19250 +SOIL_TEXT 0 4 1 19250 +SFCWATER_MASS 0 5 1 1750 +SFCWATER_ENERGY 0 5 1 1750 +SFCWATER_DEPTH 0 5 1 1750 +USTAR 0 6 1 1750 +TSTAR 0 6 1 1750 +RSTAR 0 6 1 1750 +VEG_FRACAREA 0 6 1 1750 +VEG_LAI 0 6 1 1750 +VEG_ROUGH 0 6 1 1750 +VEG_HEIGHT 0 6 1 1750 +VEG_ALBEDO 0 6 1 1750 +VEG_TAI 0 6 1 1750 +PATCH_AREA 0 6 1 1750 +PATCH_ROUGH 0 6 1 1750 +LEAF_CLASS 0 6 1 1750 +SOIL_ROUGH 0 6 1 1750 +SFCWATER_NLEV 0 6 1 1750 +STOM_RESIST 0 6 1 1750 +GROUND_RSAT 0 6 1 1750 +GROUND_RVAP 0 6 1 1750 +VEG_WATER 0 6 1 1750 +VEG_TEMP 0 6 1 1750 +CAN_RVAP 0 6 1 1750 +CAN_TEMP 0 6 1 1750 +VEG_NDVIP 0 6 1 1750 +VEG_NDVIC 0 6 1 1750 +VEG_NDVIF 0 6 1 1750 +KPP_OLD 0 2 1 875 +KPP_NEW 0 2 1 875 +KPP_JERLOV 0 2 1 875 +KPP_OCDEPTH 0 2 1 875 +KPP_HMIX 0 2 1 875 +KPP_BOTTOMT 0 2 1 875 +KPP_SREF 0 2 1 875 +KPP_FREEZ_FLAG 0 2 1 875 +KPP_RESET_FLAG 0 2 1 875 +KPP_FLX_UST 0 2 1 875 +KPP_FLX_VST 0 2 1 875 +KPP_FLX_NSW 0 2 1 875 +KPP_FLX_NLW 0 2 1 875 +KPP_FLX_ICE 0 2 1 875 +KPP_FLX_PCP 0 2 1 875 +KPP_SWDK_OPT 0 10 1 42000 +KPP_SWFRAC 0 10 1 42000 +KPP_SAL_CLIM 0 10 1 42000 +KPP_OCNT_CLIM 0 10 1 42000 +KPP_BUOY 0 10 1 42000 +KPP_U 0 10 1 42000 +KPP_V 0 10 1 42000 +KPP_U_init 0 10 1 42000 +KPP_V_init 0 10 1 42000 +KPP_US0 0 10 1 42000 +KPP_US1 0 10 1 42000 +KPP_VS0 0 10 1 42000 +KPP_VS1 0 10 1 42000 +KPP_X_T 0 10 1 42000 +KPP_X_S 0 10 1 42000 +KPP_XS_T0 0 10 1 42000 +KPP_XS_T1 0 10 1 42000 +KPP_XS_S0 0 10 1 42000 +KPP_XS_S1 0 10 1 42000 +RCP 0 3 1 218750 +RDP 0 3 1 218750 +RRP 0 3 1 218750 +RPP 0 3 1 218750 +RSP 0 3 1 218750 +RAP 0 3 1 218750 +RGP 0 3 1 218750 +RHP 0 3 1 218750 +CCP 0 3 1 218750 +CDP 0 3 1 218750 +CRP 0 3 1 218750 +CPP 0 3 1 218750 +CSP 0 3 1 218750 +CAP 0 3 1 218750 +CGP 0 3 1 218750 +CHP 0 3 1 218750 +Q2 0 3 1 218750 +Q6 0 3 1 218750 +Q7 0 3 1 218750 +CCCNP 0 3 1 218750 +GCCNP 0 3 1 218750 +CCCMP 0 3 1 218750 +GCCMP 0 3 1 218750 +MD1NP 0 3 1 218750 +MD2NP 0 3 1 218750 +MD1MP 0 3 1 218750 +MD2MP 0 3 1 218750 +SALT_FILM_NP 0 3 1 218750 +SALT_JET_NP 0 3 1 218750 +SALT_SPUM_NP 0 3 1 218750 +SALT_FILM_MP 0 3 1 218750 +SALT_JET_MP 0 3 1 218750 +SALT_SPUM_MP 0 3 1 218750 +REGEN_AERO1_NP 0 3 1 218750 +REGEN_AERO1_MP 0 3 1 218750 +REGEN_AERO2_NP 0 3 1 218750 +REGEN_AERO2_MP 0 3 1 218750 +IMMERCP 0 3 1 218750 +IMMERDP 0 3 1 218750 +IMMERRP 0 3 1 218750 +IFNNUCP 0 3 1 218750 +CNMCP 0 3 1 218750 +CNMDP 0 3 1 218750 +CNMRP 0 3 1 218750 +CNMPP 0 3 1 218750 +CNMSP 0 3 1 218750 +CNMAP 0 3 1 218750 +CNMGP 0 3 1 218750 +CNMHP 0 3 1 218750 +DNMCP 0 3 1 218750 +DNMDP 0 3 1 218750 +DNMRP 0 3 1 218750 +DNMPP 0 3 1 218750 +DNMSP 0 3 1 218750 +DNMAP 0 3 1 218750 +DNMGP 0 3 1 218750 +DNMHP 0 3 1 218750 +DINCP 0 3 1 218750 +DINDP 0 3 1 218750 +DINRP 0 3 1 218750 +DINPP 0 3 1 218750 +DINSP 0 3 1 218750 +DINAP 0 3 1 218750 +DINGP 0 3 1 218750 +DINHP 0 3 1 218750 +SNMCP 0 3 1 218750 +SNMDP 0 3 1 218750 +SNMRP 0 3 1 218750 +SNMPP 0 3 1 218750 +SNMSP 0 3 1 218750 +SNMAP 0 3 1 218750 +SNMGP 0 3 1 218750 +SNMHP 0 3 1 218750 +RESOL_AERO1_MP 0 3 1 218750 +RESOL_AERO2_MP 0 3 1 218750 +PCPVR 0 3 1 218750 +PCPVP 0 3 1 218750 +PCPVS 0 3 1 218750 +PCPVA 0 3 1 218750 +PCPVG 0 3 1 218750 +PCPVH 0 3 1 218750 +PCPVD 0 3 1 218750 +LATHEATVAP 0 3 1 218750 +LATHEATFRZ 0 3 1 218750 +NUCCLDRT 0 3 1 218750 +CLD2RAINT 0 3 1 218750 +ICE2RAINT 0 3 1 218750 +NUCICERT 0 3 1 218750 +VAPLIQT 0 3 1 218750 +VAPICET 0 3 1 218750 +MELTICET 0 3 1 218750 +RIMECLDT 0 3 1 218750 +RAIN2ICET 0 3 1 218750 +AGGREGATET 0 3 1 218750 +LATHEATVAPT 0 3 1 218750 +LATHEATFRZT 0 3 1 218750 +INUCHOMRT 0 3 1 218750 +INUCCONTRT 0 3 1 218750 +INUCIFNRT 0 3 1 218750 +INUCHAZRT 0 3 1 218750 +VAPCLDT 0 3 1 218750 +VAPRAINT 0 3 1 218750 +VAPPRIST 0 3 1 218750 +VAPSNOWT 0 3 1 218750 +VAPAGGRT 0 3 1 218750 +VAPGRAUT 0 3 1 218750 +VAPHAILT 0 3 1 218750 +VAPDRIZT 0 3 1 218750 +MELTPRIST 0 3 1 218750 +MELTSNOWT 0 3 1 218750 +MELTAGGRT 0 3 1 218750 +MELTGRAUT 0 3 1 218750 +MELTHAILT 0 3 1 218750 +RIMECLDSNOWT 0 3 1 218750 +RIMECLDAGGRT 0 3 1 218750 +RIMECLDGRAUT 0 3 1 218750 +RIMECLDHAILT 0 3 1 218750 +RAIN2PRT 0 3 1 218750 +RAIN2SNT 0 3 1 218750 +RAIN2AGT 0 3 1 218750 +RAIN2GRT 0 3 1 218750 +RAIN2HAT 0 3 1 218750 +AGGRSELFPRIST 0 3 1 218750 +AGGRSELFSNOWT 0 3 1 218750 +AGGRPRISSNOWT 0 3 1 218750 +DUST1CLDRT 0 3 1 218750 +DUST2CLDRT 0 3 1 218750 +DUST1DRZRT 0 3 1 218750 +DUST2DRZRT 0 3 1 218750 +ACCPR 0 2 1 875 +ACCPP 0 2 1 875 +ACCPS 0 2 1 875 +ACCPA 0 2 1 875 +ACCPG 0 2 1 875 +ACCPH 0 2 1 875 +ACCPD 0 2 1 875 +PCPRR 0 2 1 875 +PCPRP 0 2 1 875 +PCPRS 0 2 1 875 +PCPRA 0 2 1 875 +PCPRG 0 2 1 875 +PCPRH 0 2 1 875 +PCPRD 0 2 1 875 +PCPG 0 2 1 875 +QPCPG 0 2 1 875 +DPCPG 0 2 1 875 +ACCPAERO 0 2 1 875 +PCPRAERO 0 2 1 875 +ACCPDUST 0 2 1 875 +PCPRDUST 0 2 1 875 +FTHRD 0 3 1 218750 +BEXT 0 3 1 218750 +SWUP 0 3 1 218750 +SWDN 0 3 1 218750 +LWUP 0 3 1 218750 +LWDN 0 3 1 218750 +RSHORT 0 2 1 875 +RLONG 0 2 1 875 +RLONGUP 0 2 1 875 +ALBEDT 0 2 1 875 +COSZ 0 2 1 875 +AODT 0 2 1 875 +RHKM 0 3 1 218750 +RVKM 0 3 1 218750 +RVKH 0 3 1 218750 +SFLUX_U 0 2 1 875 +SFLUX_V 0 2 1 875 +SFLUX_W 0 2 1 875 +SFLUX_T 0 2 1 875 +SFLUX_R 0 2 1 875 +TOPT 0 2 1 875 +GLAT 0 2 1 875 +GLON 0 2 1 875 +TOPZO 0 2 1 875 +PI 1 3 1 218750 +HKH 1 3 1 218750 +VKH 1 3 1 218750 +__expnme + 1 +RAMS Simulations +__initial + 1 + 1 +__initorig + 1 + 1 +__jdim + 1 + 1 +__iyear1 + 1 + 1991 +__imonth1 + 1 + 4 +__idate1 + 1 + 26 +__itime1 + 1 + 2100 +__time + 1 + 0.240000000000000000E+04 +__nsndg + 1 + 35 +__us + 35 + -0.271000003814697266E+01 + -0.271000003814697266E+01 + -0.353999996185302734E+01 + -0.339000010490417480E+01 + -0.277999997138977051E+01 + -0.174000000953674316E+01 + -0.360000014305114746E+00 + 0.125000000000000000E+01 + 0.294000005722045898E+01 + 0.457999992370605469E+01 + 0.607000017166137695E+01 + 0.730000019073486328E+01 + 0.852999973297119141E+01 + 0.967000007629394531E+01 + 0.108999996185302734E+02 + 0.120900001525878906E+02 + 0.128400001525878906E+02 + 0.151300001144409180E+02 + 0.167000007629394531E+02 + 0.173600006103515625E+02 + 0.174400005340576172E+02 + 0.170400009155273438E+02 + 0.168299999237060547E+02 + 0.170599994659423828E+02 + 0.183799991607666016E+02 + 0.203899993896484375E+02 + 0.233099994659423828E+02 + 0.281800003051757813E+02 + 0.248199996948242188E+02 + 0.211499996185302734E+02 + 0.175100002288818359E+02 + 0.965999984741210938E+01 + 0.200999999046325684E+01 + 0.500000000000000000E+00 + -0.103999996185302734E+01 +__vs + 35 + 0.838000011444091797E+01 + 0.838000011444091797E+01 + 0.106599998474121094E+02 + 0.122500000000000000E+02 + 0.134600000381469727E+02 + 0.142600002288818359E+02 + 0.146400003433227539E+02 + 0.146599998474121094E+02 + 0.144099998474121094E+02 + 0.140299997329711914E+02 + 0.137200002670288086E+02 + 0.136199998855590820E+02 + 0.138299999237060547E+02 + 0.142600002288818359E+02 + 0.154700002670288086E+02 + 0.160300006866455078E+02 + 0.188700008392333984E+02 + 0.190900001525878906E+02 + 0.186000003814697266E+02 + 0.189099998474121094E+02 + 0.199799995422363281E+02 + 0.211800003051757813E+02 + 0.216200008392333984E+02 + 0.218400001525878906E+02 + 0.223400001525878906E+02 + 0.227000007629394531E+02 + 0.227399997711181641E+02 + 0.198400001525878906E+02 + 0.181599998474121094E+02 + 0.161700000762939453E+02 + 0.118999996185302734E+02 + 0.850000000000000000E+01 + 0.347000002861022949E+01 + 0.350000000000000000E+01 + 0.352999997138977051E+01 +__ts + 35 + 0.306079376220703125E+03 + 0.305112518310546875E+03 + 0.303622192382812500E+03 + 0.302135650634765625E+03 + 0.300582458496093750E+03 + 0.298970092773437500E+03 + 0.297265472412109375E+03 + 0.295463653564453125E+03 + 0.293529083251953125E+03 + 0.291434265136718750E+03 + 0.289150360107421875E+03 + 0.286665008544921875E+03 + 0.284018432617187500E+03 + 0.281624572753906250E+03 + 0.279662200927734375E+03 + 0.277406005859375000E+03 + 0.274758117675781250E+03 + 0.271294006347656250E+03 + 0.267552581787109375E+03 + 0.263083618164062500E+03 + 0.258075958251953125E+03 + 0.252843017578125000E+03 + 0.246956115722656250E+03 + 0.240328781127929687E+03 + 0.232743484497070312E+03 + 0.224288635253906250E+03 + 0.215936080932617187E+03 + 0.210840881347656250E+03 + 0.210143768310546875E+03 + 0.208462387084960937E+03 + 0.205940200805664062E+03 + 0.201693786621093750E+03 + 0.198953125000000000E+03 + 0.194737899780273437E+03 + 0.189301940917968750E+03 +__thds + 35 + 0.306959991455078125E+03 + 0.306960021972656250E+03 + 0.306529998779296875E+03 + 0.306209960937500000E+03 + 0.305939971923828125E+03 + 0.305740020751953125E+03 + 0.305589965820312500E+03 + 0.305500000000000000E+03 + 0.305450012207031250E+03 + 0.305429992675781250E+03 + 0.305429992675781250E+03 + 0.305459991455078125E+03 + 0.305589965820312500E+03 + 0.306299987792968750E+03 + 0.307829986572265625E+03 + 0.309429992675781250E+03 + 0.311029968261718750E+03 + 0.312190032958984375E+03 + 0.313570007324218750E+03 + 0.314700012207031250E+03 + 0.315859985351562500E+03 + 0.317509979248046875E+03 + 0.319209991455078125E+03 + 0.320940002441406250E+03 + 0.322510009765625000E+03 + 0.324149963378906250E+03 + 0.327439971923828125E+03 + 0.337469970703125000E+03 + 0.357589996337890625E+03 + 0.379390014648437500E+03 + 0.403859985351562500E+03 + 0.429979980468750000E+03 + 0.465670013427734375E+03 + 0.503269989013671875E+03 + 0.541519958496093750E+03 +__ps + 35 + 0.990000000000000000E+05 + 0.979103046875000000E+05 + 0.967206328125000000E+05 + 0.954221953125000000E+05 + 0.940067812500000000E+05 + 0.924657890625000000E+05 + 0.907903359375000000E+05 + 0.889713671875000000E+05 + 0.869998593750000000E+05 + 0.848665859375000000E+05 + 0.825626484375000000E+05 + 0.800791093750000000E+05 + 0.774072031250000000E+05 + 0.745411562500000000E+05 + 0.714829531250000000E+05 + 0.682369765625000000E+05 + 0.648056328125000000E+05 + 0.611899843750000000E+05 + 0.573959570312500000E+05 + 0.534349296875000000E+05 + 0.493217070312500000E+05 + 0.450816445312500000E+05 + 0.407470156250000000E+05 + 0.363542890625000000E+05 + 0.319460332031250000E+05 + 0.275735761718750000E+05 + 0.233073164062500000E+05 + 0.192918867187500000E+05 + 0.155726064453125000E+05 + 0.123097558593750000E+05 + 0.947972363281250000E+04 + 0.707827929687500000E+04 + 0.510501708984375000E+04 + 0.360986938476562500E+04 + 0.253038891601562500E+04 +__hs + 35 + 0.000000000000000000E+00 + 0.100002868652343750E+03 + 0.210000503540039062E+03 + 0.330998321533203125E+03 + 0.464095123291015625E+03 + 0.610502075195312500E+03 + 0.771550354003906250E+03 + 0.948713012695312500E+03 + 0.114357568359375000E+04 + 0.135793383789062500E+04 + 0.159372290039062500E+04 + 0.185310449218750000E+04 + 0.213841821289062500E+04 + 0.245225878906250000E+04 + 0.279748461914062500E+04 + 0.317723657226562500E+04 + 0.359496240234375000E+04 + 0.405446093750000000E+04 + 0.455991406250000000E+04 + 0.511591503906250000E+04 + 0.572751757812500000E+04 + 0.640028662109375000E+04 + 0.714033789062500000E+04 + 0.795439843750000000E+04 + 0.884990039062500000E+04 + 0.983496484375000000E+04 + 0.109185126953125000E+05 + 0.121001347656250000E+05 + 0.134203779296875000E+05 + 0.148615781250000000E+05 + 0.164467695312500000E+05 + 0.181904414062500000E+05 + 0.201076933593750000E+05 + 0.221054843750000000E+05 + 0.241034882812500000E+05 +__ihtran + 1 + 0 +__ngrids + 1 + 1 +__nzg + 1 + 11 +__nzs + 1 + 1 +__npatch + 1 + 2 +__nvegpat + 1 + 1 +__nkppz + 1 + 48 +__ztop + 1 + 0.200100156250000000E+05 +__polelat + 1 + 0.370000000000000000E+02 +__polelon + 1 + -0.975000000000000000E+02 +__nnxp + 1 + 25 +__nnyp + 1 + 35 +__nnzp + 1 + 250 +__nstratx + 1 + 1 +__nstraty + 1 + 1 +__nxtnest + 1 + 0 +__ninest + 1 + 1 +__njnest + 1 + 1 +__nknest + 1 + 1 +__deltaxn + 1 + 0.200000000000000000E+04 +__deltazn + 1 + 0.100000000000000000E+02 +__nestz + 1 + 0 +__nstratz + 250 + 1 + 1 + 3 + 3 + 3 + 3 + 2 + 2 + 2 + 2 + 1 + 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 + 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 + 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 + 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 + 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 + 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 + 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 + 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 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 +__ngbegun + 1 + 1 +__iref + 1 + 0 +__jref + 1 + 0 +__topref + 1 + 0.000000000000000000E+00 +__xmn01 + 25 + -0.230000000000000000E+05 + -0.210000000000000000E+05 + -0.190000000000000000E+05 + -0.170000000000000000E+05 + -0.150000000000000000E+05 + -0.130000000000000000E+05 + -0.110000000000000000E+05 + -0.900000000000000000E+04 + -0.700000000000000000E+04 + -0.500000000000000000E+04 + -0.300000000000000000E+04 + -0.100000000000000000E+04 + 0.100000000000000000E+04 + 0.300000000000000000E+04 + 0.500000000000000000E+04 + 0.700000000000000000E+04 + 0.900000000000000000E+04 + 0.110000000000000000E+05 + 0.130000000000000000E+05 + 0.150000000000000000E+05 + 0.170000000000000000E+05 + 0.190000000000000000E+05 + 0.210000000000000000E+05 + 0.230000000000000000E+05 + 0.250000000000000000E+05 +__xtn01 + 25 + -0.240000000000000000E+05 + -0.220000000000000000E+05 + -0.200000000000000000E+05 + -0.180000000000000000E+05 + -0.160000000000000000E+05 + -0.140000000000000000E+05 + -0.120000000000000000E+05 + -0.100000000000000000E+05 + -0.800000000000000000E+04 + -0.600000000000000000E+04 + -0.400000000000000000E+04 + -0.200000000000000000E+04 + 0.000000000000000000E+00 + 0.200000000000000000E+04 + 0.400000000000000000E+04 + 0.600000000000000000E+04 + 0.800000000000000000E+04 + 0.100000000000000000E+05 + 0.120000000000000000E+05 + 0.140000000000000000E+05 + 0.160000000000000000E+05 + 0.180000000000000000E+05 + 0.200000000000000000E+05 + 0.220000000000000000E+05 + 0.240000000000000000E+05 +__ymn01 + 35 + -0.330000000000000000E+05 + -0.310000000000000000E+05 + -0.290000000000000000E+05 + -0.270000000000000000E+05 + -0.250000000000000000E+05 + -0.230000000000000000E+05 + -0.210000000000000000E+05 + -0.190000000000000000E+05 + -0.170000000000000000E+05 + -0.150000000000000000E+05 + -0.130000000000000000E+05 + -0.110000000000000000E+05 + -0.900000000000000000E+04 + -0.700000000000000000E+04 + -0.500000000000000000E+04 + -0.300000000000000000E+04 + -0.100000000000000000E+04 + 0.100000000000000000E+04 + 0.300000000000000000E+04 + 0.500000000000000000E+04 + 0.700000000000000000E+04 + 0.900000000000000000E+04 + 0.110000000000000000E+05 + 0.130000000000000000E+05 + 0.150000000000000000E+05 + 0.170000000000000000E+05 + 0.190000000000000000E+05 + 0.210000000000000000E+05 + 0.230000000000000000E+05 + 0.250000000000000000E+05 + 0.270000000000000000E+05 + 0.290000000000000000E+05 + 0.310000000000000000E+05 + 0.330000000000000000E+05 + 0.350000000000000000E+05 +__ytn01 + 35 + -0.340000000000000000E+05 + -0.320000000000000000E+05 + -0.300000000000000000E+05 + -0.280000000000000000E+05 + -0.260000000000000000E+05 + -0.240000000000000000E+05 + -0.220000000000000000E+05 + -0.200000000000000000E+05 + -0.180000000000000000E+05 + -0.160000000000000000E+05 + -0.140000000000000000E+05 + -0.120000000000000000E+05 + -0.100000000000000000E+05 + -0.800000000000000000E+04 + -0.600000000000000000E+04 + -0.400000000000000000E+04 + -0.200000000000000000E+04 + 0.000000000000000000E+00 + 0.200000000000000000E+04 + 0.400000000000000000E+04 + 0.600000000000000000E+04 + 0.800000000000000000E+04 + 0.100000000000000000E+05 + 0.120000000000000000E+05 + 0.140000000000000000E+05 + 0.160000000000000000E+05 + 0.180000000000000000E+05 + 0.200000000000000000E+05 + 0.220000000000000000E+05 + 0.240000000000000000E+05 + 0.260000000000000000E+05 + 0.280000000000000000E+05 + 0.300000000000000000E+05 + 0.320000000000000000E+05 + 0.340000000000000000E+05 +__zmn01 + 250 + 0.000000000000000000E+00 + 0.100000000000000000E+02 + 0.202999992370605469E+02 + 0.309089984893798828E+02 + 0.418362655639648438E+02 + 0.530913505554199219E+02 + 0.646840896606445313E+02 + 0.766246109008789063E+02 + 0.889233474731445313E+02 + 0.101591049194335937E+03 + 0.114638778686523437E+03 + 0.128077941894531250E+03 + 0.141920272827148437E+03 + 0.156177871704101562E+03 + 0.170863204956054687E+03 + 0.185989105224609375E+03 + 0.201568786621093750E+03 + 0.217615859985351562E+03 + 0.234144348144531250E+03 + 0.251168685913085937E+03 + 0.268703765869140625E+03 + 0.286764892578125000E+03 + 0.305367858886718750E+03 + 0.324528900146484375E+03 + 0.344264770507812500E+03 + 0.364592712402343750E+03 + 0.385530487060546875E+03 + 0.407096405029296875E+03 + 0.429309295654296875E+03 + 0.452188568115234375E+03 + 0.475754211425781250E+03 + 0.500026824951171875E+03 + 0.525027587890625000E+03 + 0.550778381347656250E+03 + 0.577301696777343750E+03 + 0.604620727539062500E+03 + 0.632759338378906250E+03 + 0.661742126464843750E+03 + 0.691594421386718750E+03 + 0.722342285156250000E+03 + 0.754012573242187500E+03 + 0.786632995605468750E+03 + 0.820232055664062500E+03 + 0.854839111328125000E+03 + 0.890484375000000000E+03 + 0.927198974609375000E+03 + 0.965015014648437500E+03 + 0.100396551513671875E+04 + 0.104408447265625000E+04 + 0.108540698242187500E+04 + 0.112796911621093750E+04 + 0.117180810546875000E+04 + 0.121696228027343750E+04 + 0.126347106933593750E+04 + 0.131137512207031250E+04 + 0.136071630859375000E+04 + 0.141153771972656250E+04 + 0.146388378906250000E+04 + 0.151780029296875000E+04 + 0.157333422851562500E+04 + 0.163053417968750000E+04 + 0.168945007324218750E+04 + 0.175013342285156250E+04 + 0.181263732910156250E+04 + 0.187701635742187500E+04 + 0.194332678222656250E+04 + 0.201162646484375000E+04 + 0.208197509765625000E+04 + 0.215443408203125000E+04 + 0.222906689453125000E+04 + 0.230593872070312500E+04 + 0.238511669921875000E+04 + 0.246666992187500000E+04 + 0.255066967773437500E+04 + 0.263718945312500000E+04 + 0.272630493164062500E+04 + 0.281809375000000000E+04 + 0.291263623046875000E+04 + 0.301001489257812500E+04 + 0.311001489257812500E+04 + 0.321001489257812500E+04 + 0.331001489257812500E+04 + 0.341001489257812500E+04 + 0.351001489257812500E+04 + 0.361001489257812500E+04 + 0.371001489257812500E+04 + 0.381001489257812500E+04 + 0.391001489257812500E+04 + 0.401001489257812500E+04 + 0.411001464843750000E+04 + 0.421001464843750000E+04 + 0.431001464843750000E+04 + 0.441001464843750000E+04 + 0.451001464843750000E+04 + 0.461001464843750000E+04 + 0.471001464843750000E+04 + 0.481001464843750000E+04 + 0.491001464843750000E+04 + 0.501001464843750000E+04 + 0.511001464843750000E+04 + 0.521001464843750000E+04 + 0.531001464843750000E+04 + 0.541001464843750000E+04 + 0.551001464843750000E+04 + 0.561001464843750000E+04 + 0.571001464843750000E+04 + 0.581001464843750000E+04 + 0.591001464843750000E+04 + 0.601001464843750000E+04 + 0.611001464843750000E+04 + 0.621001464843750000E+04 + 0.631001464843750000E+04 + 0.641001464843750000E+04 + 0.651001464843750000E+04 + 0.661001464843750000E+04 + 0.671001464843750000E+04 + 0.681001464843750000E+04 + 0.691001464843750000E+04 + 0.701001464843750000E+04 + 0.711001464843750000E+04 + 0.721001464843750000E+04 + 0.731001464843750000E+04 + 0.741001464843750000E+04 + 0.751001464843750000E+04 + 0.761001464843750000E+04 + 0.771001464843750000E+04 + 0.781001464843750000E+04 + 0.791001464843750000E+04 + 0.801001464843750000E+04 + 0.811001464843750000E+04 + 0.821001464843750000E+04 + 0.831001464843750000E+04 + 0.841001464843750000E+04 + 0.851001464843750000E+04 + 0.861001464843750000E+04 + 0.871001464843750000E+04 + 0.881001464843750000E+04 + 0.891001464843750000E+04 + 0.901001464843750000E+04 + 0.911001464843750000E+04 + 0.921001464843750000E+04 + 0.931001464843750000E+04 + 0.941001464843750000E+04 + 0.951001464843750000E+04 + 0.961001464843750000E+04 + 0.971001464843750000E+04 + 0.981001464843750000E+04 + 0.991001464843750000E+04 + 0.100100146484375000E+05 + 0.101100146484375000E+05 + 0.102100146484375000E+05 + 0.103100146484375000E+05 + 0.104100146484375000E+05 + 0.105100146484375000E+05 + 0.106100146484375000E+05 + 0.107100146484375000E+05 + 0.108100146484375000E+05 + 0.109100146484375000E+05 + 0.110100146484375000E+05 + 0.111100146484375000E+05 + 0.112100146484375000E+05 + 0.113100146484375000E+05 + 0.114100146484375000E+05 + 0.115100146484375000E+05 + 0.116100146484375000E+05 + 0.117100146484375000E+05 + 0.118100146484375000E+05 + 0.119100146484375000E+05 + 0.120100146484375000E+05 + 0.121100146484375000E+05 + 0.122100146484375000E+05 + 0.123100146484375000E+05 + 0.124100146484375000E+05 + 0.125100146484375000E+05 + 0.126100146484375000E+05 + 0.127100146484375000E+05 + 0.128100146484375000E+05 + 0.129100146484375000E+05 + 0.130100146484375000E+05 + 0.131100146484375000E+05 + 0.132100146484375000E+05 + 0.133100146484375000E+05 + 0.134100146484375000E+05 + 0.135100146484375000E+05 + 0.136100146484375000E+05 + 0.137100146484375000E+05 + 0.138100146484375000E+05 + 0.139100146484375000E+05 + 0.140100146484375000E+05 + 0.141100146484375000E+05 + 0.142100146484375000E+05 + 0.143100146484375000E+05 + 0.144100146484375000E+05 + 0.145100146484375000E+05 + 0.146100146484375000E+05 + 0.147100146484375000E+05 + 0.148100146484375000E+05 + 0.149100146484375000E+05 + 0.150100146484375000E+05 + 0.151100146484375000E+05 + 0.152100146484375000E+05 + 0.153100146484375000E+05 + 0.154100146484375000E+05 + 0.155100146484375000E+05 + 0.156100146484375000E+05 + 0.157100146484375000E+05 + 0.158100146484375000E+05 + 0.159100146484375000E+05 + 0.160100146484375000E+05 + 0.161100146484375000E+05 + 0.162100146484375000E+05 + 0.163100146484375000E+05 + 0.164100156250000000E+05 + 0.165100156250000000E+05 + 0.166100156250000000E+05 + 0.167100156250000000E+05 + 0.168100156250000000E+05 + 0.169100156250000000E+05 + 0.170100156250000000E+05 + 0.171100156250000000E+05 + 0.172100156250000000E+05 + 0.173100156250000000E+05 + 0.174100156250000000E+05 + 0.175100156250000000E+05 + 0.176100156250000000E+05 + 0.177100156250000000E+05 + 0.178100156250000000E+05 + 0.179100156250000000E+05 + 0.180100156250000000E+05 + 0.181100156250000000E+05 + 0.182100156250000000E+05 + 0.183100156250000000E+05 + 0.184100156250000000E+05 + 0.185100156250000000E+05 + 0.186100156250000000E+05 + 0.187100156250000000E+05 + 0.188100156250000000E+05 + 0.189100156250000000E+05 + 0.190100156250000000E+05 + 0.191100156250000000E+05 + 0.192100156250000000E+05 + 0.193100156250000000E+05 + 0.194100156250000000E+05 + 0.195100156250000000E+05 + 0.196100156250000000E+05 + 0.197100156250000000E+05 + 0.198100156250000000E+05 + 0.199100156250000000E+05 + 0.200100156250000000E+05 + 0.201100156250000000E+05 +__ztn01 + 250 + -0.489024114608764648E+01 + 0.496305179595947266E+01 + 0.151119432449340820E+02 + 0.255652999877929688E+02 + 0.363322563171386719E+02 + 0.474222221374511719E+02 + 0.588448867797851563E+02 + 0.706102294921875000E+02 + 0.827285385131835938E+02 + 0.952103958129882813E+02 + 0.108066703796386719E+03 + 0.121308708190917969E+03 + 0.134947967529296875E+03 + 0.148996398925781250E+03 + 0.163466278076171875E+03 + 0.178370269775390625E+03 + 0.193721374511718750E+03 + 0.209533035278320312E+03 + 0.225819030761718750E+03 + 0.242593612670898437E+03 + 0.259871429443359375E+03 + 0.277667602539062500E+03 + 0.295997650146484375E+03 + 0.314877593994140625E+03 + 0.334323913574218750E+03 + 0.354353637695312500E+03 + 0.374984252929687500E+03 + 0.396233764648437500E+03 + 0.418120788574218750E+03 + 0.440664398193359375E+03 + 0.463884307861328125E+03 + 0.487800842285156250E+03 + 0.512434814453125000E+03 + 0.537807861328125000E+03 + 0.563942016601562500E+03 + 0.590860290527343750E+03 + 0.618586059570312500E+03 + 0.647143615722656250E+03 + 0.676557983398437500E+03 + 0.706854736328125000E+03 + 0.738060424804687500E+03 + 0.770202270507812500E+03 + 0.803308410644531250E+03 + 0.837407714843750000E+03 + 0.872530029296875000E+03 + 0.908706054687500000E+03 + 0.945967285156250000E+03 + 0.984346374511718750E+03 + 0.102387677001953125E+04 + 0.106459301757812500E+04 + 0.110653076171875000E+04 + 0.114972668457031250E+04 + 0.119421838378906250E+04 + 0.124004479980468750E+04 + 0.128724609375000000E+04 + 0.133586340332031250E+04 + 0.138593920898437500E+04 + 0.143751733398437500E+04 + 0.149064282226562500E+04 + 0.154536206054687500E+04 + 0.160172290039062500E+04 + 0.165977441406250000E+04 + 0.171956750488281250E+04 + 0.178115441894531250E+04 + 0.184458898925781250E+04 + 0.190992651367187500E+04 + 0.197722424316406250E+04 + 0.204654089355468750E+04 + 0.211793676757812500E+04 + 0.219147460937500000E+04 + 0.226721875000000000E+04 + 0.234523510742187500E+04 + 0.242559204101562500E+04 + 0.250835937500000000E+04 + 0.259360986328125000E+04 + 0.268141796875000000E+04 + 0.277186010742187500E+04 + 0.286501562500000000E+04 + 0.296098388671875000E+04 + 0.305984887695312500E+04 + 0.316001489257812500E+04 + 0.326001489257812500E+04 + 0.336001489257812500E+04 + 0.346001489257812500E+04 + 0.356001489257812500E+04 + 0.366001489257812500E+04 + 0.376001489257812500E+04 + 0.386001489257812500E+04 + 0.396001489257812500E+04 + 0.406001464843750000E+04 + 0.416001464843750000E+04 + 0.426001464843750000E+04 + 0.436001464843750000E+04 + 0.446001464843750000E+04 + 0.456001464843750000E+04 + 0.466001464843750000E+04 + 0.476001464843750000E+04 + 0.486001464843750000E+04 + 0.496001464843750000E+04 + 0.506001464843750000E+04 + 0.516001464843750000E+04 + 0.526001464843750000E+04 + 0.536001464843750000E+04 + 0.546001464843750000E+04 + 0.556001464843750000E+04 + 0.566001464843750000E+04 + 0.576001464843750000E+04 + 0.586001464843750000E+04 + 0.596001464843750000E+04 + 0.606001464843750000E+04 + 0.616001464843750000E+04 + 0.626001464843750000E+04 + 0.636001464843750000E+04 + 0.646001464843750000E+04 + 0.656001464843750000E+04 + 0.666001464843750000E+04 + 0.676001464843750000E+04 + 0.686001464843750000E+04 + 0.696001464843750000E+04 + 0.706001464843750000E+04 + 0.716001464843750000E+04 + 0.726001464843750000E+04 + 0.736001464843750000E+04 + 0.746001464843750000E+04 + 0.756001464843750000E+04 + 0.766001464843750000E+04 + 0.776001464843750000E+04 + 0.786001464843750000E+04 + 0.796001464843750000E+04 + 0.806001464843750000E+04 + 0.816001464843750000E+04 + 0.826001464843750000E+04 + 0.836001464843750000E+04 + 0.846001464843750000E+04 + 0.856001464843750000E+04 + 0.866001464843750000E+04 + 0.876001464843750000E+04 + 0.886001464843750000E+04 + 0.896001464843750000E+04 + 0.906001464843750000E+04 + 0.916001464843750000E+04 + 0.926001464843750000E+04 + 0.936001464843750000E+04 + 0.946001464843750000E+04 + 0.956001464843750000E+04 + 0.966001464843750000E+04 + 0.976001464843750000E+04 + 0.986001464843750000E+04 + 0.996001464843750000E+04 + 0.100600146484375000E+05 + 0.101600146484375000E+05 + 0.102600146484375000E+05 + 0.103600146484375000E+05 + 0.104600146484375000E+05 + 0.105600146484375000E+05 + 0.106600146484375000E+05 + 0.107600146484375000E+05 + 0.108600146484375000E+05 + 0.109600146484375000E+05 + 0.110600146484375000E+05 + 0.111600146484375000E+05 + 0.112600146484375000E+05 + 0.113600146484375000E+05 + 0.114600146484375000E+05 + 0.115600146484375000E+05 + 0.116600146484375000E+05 + 0.117600146484375000E+05 + 0.118600146484375000E+05 + 0.119600146484375000E+05 + 0.120600146484375000E+05 + 0.121600146484375000E+05 + 0.122600146484375000E+05 + 0.123600146484375000E+05 + 0.124600146484375000E+05 + 0.125600146484375000E+05 + 0.126600146484375000E+05 + 0.127600146484375000E+05 + 0.128600146484375000E+05 + 0.129600146484375000E+05 + 0.130600146484375000E+05 + 0.131600146484375000E+05 + 0.132600146484375000E+05 + 0.133600146484375000E+05 + 0.134600146484375000E+05 + 0.135600146484375000E+05 + 0.136600146484375000E+05 + 0.137600146484375000E+05 + 0.138600146484375000E+05 + 0.139600146484375000E+05 + 0.140600146484375000E+05 + 0.141600146484375000E+05 + 0.142600146484375000E+05 + 0.143600146484375000E+05 + 0.144600146484375000E+05 + 0.145600146484375000E+05 + 0.146600146484375000E+05 + 0.147600146484375000E+05 + 0.148600146484375000E+05 + 0.149600146484375000E+05 + 0.150600146484375000E+05 + 0.151600146484375000E+05 + 0.152600146484375000E+05 + 0.153600146484375000E+05 + 0.154600146484375000E+05 + 0.155600146484375000E+05 + 0.156600146484375000E+05 + 0.157600146484375000E+05 + 0.158600146484375000E+05 + 0.159600146484375000E+05 + 0.160600146484375000E+05 + 0.161600146484375000E+05 + 0.162600146484375000E+05 + 0.163600156250000000E+05 + 0.164600156250000000E+05 + 0.165600156250000000E+05 + 0.166600156250000000E+05 + 0.167600156250000000E+05 + 0.168600156250000000E+05 + 0.169600156250000000E+05 + 0.170600156250000000E+05 + 0.171600156250000000E+05 + 0.172600156250000000E+05 + 0.173600156250000000E+05 + 0.174600156250000000E+05 + 0.175600156250000000E+05 + 0.176600156250000000E+05 + 0.177600156250000000E+05 + 0.178600156250000000E+05 + 0.179600156250000000E+05 + 0.180600156250000000E+05 + 0.181600156250000000E+05 + 0.182600156250000000E+05 + 0.183600156250000000E+05 + 0.184600156250000000E+05 + 0.185600156250000000E+05 + 0.186600156250000000E+05 + 0.187600156250000000E+05 + 0.188600156250000000E+05 + 0.189600156250000000E+05 + 0.190600156250000000E+05 + 0.191600156250000000E+05 + 0.192600156250000000E+05 + 0.193600156250000000E+05 + 0.194600156250000000E+05 + 0.195600156250000000E+05 + 0.196600156250000000E+05 + 0.197600156250000000E+05 + 0.198600156250000000E+05 + 0.199600156250000000E+05 + 0.200600156250000000E+05 +__dzmn01 + 250 + 0.101488918066024780E+00 + 0.985329300165176392E-01 + 0.956630483269691467E-01 + 0.928767547011375427E-01 + 0.901716053485870361E-01 + 0.875452458858489990E-01 + 0.849953964352607727E-01 + 0.825197622179985046E-01 + 0.801162794232368469E-01 + 0.777828320860862732E-01 + 0.755172669887542725E-01 + 0.733177661895751953E-01 + 0.711823254823684692E-01 + 0.691090747714042664E-01 + 0.670961216092109680E-01 + 0.651418939232826233E-01 + 0.632444620132446289E-01 + 0.614024475216865540E-01 + 0.596140027046203613E-01 + 0.578776821494102478E-01 + 0.561918579041957855E-01 + 0.545552335679531097E-01 + 0.529662594199180603E-01 + 0.514236129820346832E-01 + 0.499258004128932953E-01 + 0.484716519713401794E-01 + 0.470599047839641571E-01 + 0.456891730427742004E-01 + 0.443584695458412170E-01 + 0.430664904415607452E-01 + 0.418120771646499634E-01 + 0.405943468213081360E-01 + 0.394118987023830414E-01 + 0.382641032338142395E-01 + 0.371494852006435394E-01 + 0.360675305128097534E-01 + 0.350170023739337921E-01 + 0.339969918131828308E-01 + 0.330068357288837433E-01 + 0.320454388856887817E-01 + 0.311120897531509399E-01 + 0.302058774977922440E-01 + 0.293261110782623291E-01 + 0.284719280898571014E-01 + 0.276426170021295547E-01 + 0.268375463783740997E-01 + 0.260558556765317917E-01 + 0.252969898283481598E-01 + 0.245602205395698547E-01 + 0.238448679447174072E-01 + 0.231503322720527649E-01 + 0.224761031568050385E-01 + 0.218214746564626694E-01 + 0.211858600378036499E-01 + 0.205688066780567169E-01 + 0.199697241187095642E-01 + 0.193880647420883179E-01 + 0.188233572989702225E-01 + 0.182751081883907318E-01 + 0.177428163588047028E-01 + 0.172260794788599014E-01 + 0.167243406176567078E-01 + 0.162372160702943802E-01 + 0.157642755657434464E-01 + 0.153051409870386124E-01 + 0.148593420162796974E-01 + 0.144265480339527130E-01 + 0.140064116567373276E-01 + 0.135984411463141441E-01 + 0.132023412734270096E-01 + 0.128178251907229424E-01 + 0.124444765970110893E-01 + 0.120820617303252220E-01 + 0.117301382124423981E-01 + 0.113884704187512398E-01 + 0.110567929223179817E-01 + 0.107347369194030762E-01 + 0.104201119393110275E-01 + 0.101148039102554321E-01 + 0.998342595994472504E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.100000239908695221E-01 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999990198761224747E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 +__dztn01 + 250 + 0.103000000119209290E+00 + 0.100000001490116119E+00 + 0.970873832702636719E-01 + 0.942595973610877991E-01 + 0.915141925215721130E-01 + 0.888487324118614197E-01 + 0.862608924508094788E-01 + 0.837484374642372131E-01 + 0.813091620802879333E-01 + 0.789409205317497253E-01 + 0.766416862607002258E-01 + 0.744093954563140869E-01 + 0.722421705722808838E-01 + 0.701380372047424316E-01 + 0.680951550602912903E-01 + 0.661117658019065857E-01 + 0.641861632466316223E-01 + 0.623166598379611969E-01 + 0.605016015470027924E-01 + 0.587394349277019501E-01 + 0.570285394787788391E-01 + 0.553675331175327301E-01 + 0.537548698484897614E-01 + 0.521892309188842773E-01 + 0.506691597402095795E-01 + 0.491933710873126984E-01 + 0.477605685591697693E-01 + 0.463694632053375244E-01 + 0.450189039111137390E-01 + 0.437076836824417114E-01 + 0.424346588551998138E-01 + 0.411986932158470154E-01 + 0.399987809360027313E-01 + 0.388337559998035431E-01 + 0.377026759088039398E-01 + 0.366045199334621429E-01 + 0.355383567512035370E-01 + 0.345032364130020142E-01 + 0.334982611238956451E-01 + 0.325225852429866791E-01 + 0.315753370523452759E-01 + 0.306556429713964462E-01 + 0.297627374529838562E-01 + 0.288958419114351273E-01 + 0.280542187392711639E-01 + 0.272371210157871246E-01 + 0.264438055455684662E-01 + 0.256736110895872116E-01 + 0.249258726835250854E-01 + 0.241998862475156784E-01 + 0.234950631856918335E-01 + 0.228107441216707230E-01 + 0.221463460475206375E-01 + 0.215013120323419571E-01 + 0.208750609308481216E-01 + 0.202670432627201080E-01 + 0.196767468005418777E-01 + 0.191036313772201538E-01 + 0.185471959412097931E-01 + 0.180070083588361740E-01 + 0.174825321882963181E-01 + 0.169733483344316483E-01 + 0.164789855480194092E-01 + 0.159990005195140839E-01 + 0.155330086126923561E-01 + 0.150805851444602013E-01 + 0.146413566544651985E-01 + 0.142149170860648155E-01 + 0.138009106740355492E-01 + 0.133989322930574417E-01 + 0.130086671561002731E-01 + 0.126297743991017342E-01 + 0.122619308531284332E-01 + 0.119047965854406357E-01 + 0.115580512210726738E-01 + 0.112213948741555214E-01 + 0.108945732936263084E-01 + 0.105772558599710464E-01 + 0.102691901847720146E-01 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.100000239908695221E-01 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999990198761224747E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 + 0.999999977648258209E-02 +__u01dn01 + 250 + -0.271000003814697266E+01 + -0.271000003814697266E+01 + -0.271000003814697266E+01 + -0.271000003814697266E+01 + -0.271000003814697266E+01 + -0.271000003814697266E+01 + -0.271000003814697266E+01 + -0.271000003814697266E+01 + -0.271000003814697266E+01 + -0.271000003814697266E+01 + -0.277084660530090332E+01 + -0.287076568603515625E+01 + -0.297368240356445313E+01 + -0.307968640327453613E+01 + -0.318887066841125488E+01 + -0.330133032798767090E+01 + -0.341716384887695313E+01 + -0.353647255897521973E+01 + -0.352038979530334473E+01 + -0.349959468841552734E+01 + -0.347817540168762207E+01 + -0.345611381530761719E+01 + -0.343339014053344727E+01 + -0.340998482704162598E+01 + -0.337475848197937012E+01 + -0.328295969963073730E+01 + -0.318840670585632324E+01 + -0.309101748466491699E+01 + -0.299070644378662109E+01 + -0.288738608360290527E+01 + -0.278096628189086914E+01 + -0.261160659790039063E+01 + -0.243661952018737793E+01 + -0.225638246536254883E+01 + -0.207073879241943359E+01 + -0.187952518463134766E+01 + -0.167072951793670654E+01 + -0.142602384090423584E+01 + -0.117397618293762207E+01 + -0.914367675781250000E+00 + -0.646970510482788086E+00 + -0.371551632881164551E+00 + -0.713925063610076904E-01 + 0.238491535186767578E+00 + 0.557672321796417236E+00 + 0.886429071426391602E+00 + 0.122504770755767822E+01 + 0.155904006958007813E+01 + 0.190187835693359375E+01 + 0.225500106811523438E+01 + 0.261871767044067383E+01 + 0.298705983161926270E+01 + 0.332745456695556641E+01 + 0.367806077003479004E+01 + 0.403918600082397461E+01 + 0.441114473342895508E+01 + 0.475697183609008789E+01 + 0.508290481567382813E+01 + 0.541861581802368164E+01 + 0.576439809799194336E+01 + 0.610793638229370117E+01 + 0.638321971893310547E+01 + 0.666676139831542969E+01 + 0.695880937576293945E+01 + 0.725961923599243164E+01 + 0.754496240615844727E+01 + 0.783508586883544922E+01 + 0.813391304016113281E+01 + 0.844170379638671875E+01 + 0.872272300720214844E+01 + 0.899785709381103516E+01 + 0.928124523162841797E+01 + 0.957313537597656250E+01 + 0.986987972259521484E+01 + 0.101736173629760742E+02 + 0.104864673614501953E+02 + 0.108087024688720703E+02 + 0.111116161346435547E+02 + 0.114123449325561523E+02 + 0.117221508026123047E+02 + 0.120360336303710938E+02 + 0.122386236190795898E+02 + 0.124181671142578125E+02 + 0.125977106094360352E+02 + 0.127772541046142578E+02 + 0.131642017364501953E+02 + 0.136625709533691406E+02 + 0.141609401702880859E+02 + 0.146593103408813477E+02 + 0.151472501754760742E+02 + 0.154578628540039063E+02 + 0.157684755325317383E+02 + 0.160790882110595703E+02 + 0.163896999359130859E+02 + 0.167001209259033203E+02 + 0.168188247680664063E+02 + 0.169375305175781250E+02 + 0.170562343597412109E+02 + 0.171749401092529297E+02 + 0.172936439514160156E+02 + 0.173657684326171875E+02 + 0.173788490295410156E+02 + 0.173919296264648438E+02 + 0.174050102233886719E+02 + 0.174180908203125000E+02 + 0.174311714172363281E+02 + 0.174206790924072266E+02 + 0.173612232208251953E+02 + 0.173017673492431641E+02 + 0.172423114776611328E+02 + 0.171828556060791016E+02 + 0.171233997344970703E+02 + 0.170639457702636719E+02 + 0.170230522155761719E+02 + 0.169946746826171875E+02 + 0.169662990570068359E+02 + 0.169379234313964844E+02 + 0.169095458984375000E+02 + 0.168811702728271484E+02 + 0.168527927398681641E+02 + 0.168355598449707031E+02 + 0.168638134002685547E+02 + 0.168920669555664063E+02 + 0.169203186035156250E+02 + 0.169485721588134766E+02 + 0.169768257141113281E+02 + 0.170050792694091797E+02 + 0.170333328247070313E+02 + 0.170682773590087891E+02 + 0.172156810760498047E+02 + 0.173630847930908203E+02 + 0.175104885101318359E+02 + 0.176578903198242188E+02 + 0.178052940368652344E+02 + 0.179526977539062500E+02 + 0.181001014709472656E+02 + 0.182475051879882813E+02 + 0.184006366729736328E+02 + 0.186046848297119141E+02 + 0.188087329864501953E+02 + 0.190127792358398438E+02 + 0.192168273925781250E+02 + 0.194208755493164063E+02 + 0.196249217987060547E+02 + 0.198289699554443359E+02 + 0.200330181121826172E+02 + 0.202370643615722656E+02 + 0.204575042724609375E+02 + 0.207269897460937500E+02 + 0.209964752197265625E+02 + 0.212659606933593750E+02 + 0.215354461669921875E+02 + 0.218049297332763672E+02 + 0.220744152069091797E+02 + 0.223439006805419922E+02 + 0.226133861541748047E+02 + 0.228828697204589844E+02 + 0.231523551940917969E+02 + 0.234810485839843750E+02 + 0.238931922912597656E+02 + 0.243053379058837891E+02 + 0.247174835205078125E+02 + 0.251296291351318359E+02 + 0.255417747497558594E+02 + 0.259539203643798828E+02 + 0.263660659790039063E+02 + 0.267782115936279297E+02 + 0.271903572082519531E+02 + 0.276025009155273438E+02 + 0.280146465301513672E+02 + 0.280276069641113281E+02 + 0.277731075286865234E+02 + 0.275186100006103516E+02 + 0.272641105651855469E+02 + 0.270096130371093750E+02 + 0.267551136016845703E+02 + 0.265006141662597656E+02 + 0.262461166381835938E+02 + 0.259916172027587891E+02 + 0.257371196746826172E+02 + 0.254826202392578125E+02 + 0.252281227111816406E+02 + 0.249736232757568359E+02 + 0.247190647125244141E+02 + 0.244644165039062500E+02 + 0.242097682952880859E+02 + 0.239551181793212891E+02 + 0.237004699707031250E+02 + 0.234458217620849609E+02 + 0.231911716461181641E+02 + 0.229365234375000000E+02 + 0.226818733215332031E+02 + 0.224272251129150391E+02 + 0.221725769042968750E+02 + 0.219179267883300781E+02 + 0.216632785797119141E+02 + 0.214086303710937500E+02 + 0.211539802551269531E+02 + 0.209239654541015625E+02 + 0.206943397521972656E+02 + 0.204647140502929688E+02 + 0.202350883483886719E+02 + 0.200054626464843750E+02 + 0.197758388519287109E+02 + 0.195462131500244141E+02 + 0.193165874481201172E+02 + 0.190869636535644531E+02 + 0.188573379516601563E+02 + 0.186277122497558594E+02 + 0.183980865478515625E+02 + 0.181684608459472656E+02 + 0.179388370513916016E+02 + 0.177092094421386719E+02 + 0.174503669738769531E+02 + 0.170001678466796875E+02 + 0.165499668121337891E+02 + 0.160997676849365234E+02 + 0.156495685577392578E+02 + 0.151993694305419922E+02 + 0.147491703033447266E+02 + 0.142989702224731445E+02 + 0.138487710952758789E+02 + 0.133985719680786133E+02 + 0.129483718872070313E+02 + 0.124981727600097656E+02 + 0.120479736328125000E+02 + 0.115977745056152344E+02 + 0.111475753784179688E+02 + 0.106973752975463867E+02 + 0.102471752166748047E+02 + 0.979697608947753906E+01 + 0.938239288330078125E+01 + 0.898338413238525391E+01 + 0.858437538146972656E+01 + 0.818536758422851563E+01 + 0.778635835647583008E+01 + 0.738735008239746094E+01 + 0.698834133148193359E+01 + 0.658933258056640625E+01 + 0.619032430648803711E+01 + 0.579131603240966797E+01 + 0.539230728149414063E+01 + 0.499329853057861328E+01 + 0.459428977966308594E+01 + 0.419528150558471680E+01 + 0.379627275466918945E+01 + 0.339726400375366211E+01 + 0.299825572967529297E+01 + 0.259924697875976563E+01 + 0.220023870468139648E+01 +__v01dn01 + 250 + 0.838000011444091797E+01 + 0.838000011444091797E+01 + 0.838000011444091797E+01 + 0.838000011444091797E+01 + 0.838000011444091797E+01 + 0.838000011444091797E+01 + 0.838000011444091797E+01 + 0.838000011444091797E+01 + 0.838000011444091797E+01 + 0.838000011444091797E+01 + 0.854714488983154297E+01 + 0.882162189483642578E+01 + 0.910433197021484375E+01 + 0.939552402496337891E+01 + 0.969545173645019531E+01 + 0.100043773651123047E+02 + 0.103225708007812500E+02 + 0.106503105163574219E+02 + 0.108678665161132813E+02 + 0.110882968902587891E+02 + 0.113153400421142578E+02 + 0.115491952896118164E+02 + 0.117900657653808594E+02 + 0.120381622314453125E+02 + 0.122802333831787109E+02 + 0.124623260498046875E+02 + 0.126498813629150391E+02 + 0.128430633544921875E+02 + 0.130420417785644531E+02 + 0.132469882965087891E+02 + 0.134580831527709961E+02 + 0.135895338058471680E+02 + 0.137241392135620117E+02 + 0.138627824783325195E+02 + 0.140055856704711914E+02 + 0.141526727676391602E+02 + 0.142790746688842773E+02 + 0.143464574813842773E+02 + 0.144158620834350586E+02 + 0.144873485565185547E+02 + 0.145609798431396484E+02 + 0.146368198394775391E+02 + 0.146435852050781250E+02 + 0.146474351882934570E+02 + 0.146513996124267578E+02 + 0.146554832458496094E+02 + 0.146596899032592773E+02 + 0.146142835617065430E+02 + 0.145635681152343750E+02 + 0.145113306045532227E+02 + 0.144575271606445313E+02 + 0.143990955352783203E+02 + 0.143202238082885742E+02 + 0.142389860153198242E+02 + 0.141553106307983398E+02 + 0.140691251754760742E+02 + 0.139931802749633789E+02 + 0.139253683090209961E+02 + 0.138555231094360352E+02 + 0.137835817337036133E+02 + 0.137169160842895508E+02 + 0.136945352554321289E+02 + 0.136714830398559570E+02 + 0.136477394104003906E+02 + 0.136232824325561523E+02 + 0.136618223190307617E+02 + 0.137113561630249023E+02 + 0.137623748779296875E+02 + 0.138149251937866211E+02 + 0.139026937484741211E+02 + 0.140064725875854492E+02 + 0.141133642196655273E+02 + 0.142234630584716797E+02 + 0.144566297531127930E+02 + 0.147554292678833008E+02 + 0.150631923675537109E+02 + 0.153801879882812500E+02 + 0.155695848464965820E+02 + 0.157111043930053711E+02 + 0.158568954467773438E+02 + 0.160046043395996094E+02 + 0.165927867889404297E+02 + 0.172726593017578125E+02 + 0.179525299072265625E+02 + 0.186324024200439453E+02 + 0.189011459350585938E+02 + 0.189490242004394531E+02 + 0.189969024658203125E+02 + 0.190447807312011719E+02 + 0.190846157073974609E+02 + 0.189876728057861328E+02 + 0.188907318115234375E+02 + 0.187937889099121094E+02 + 0.186968460083007813E+02 + 0.186000556945800781E+02 + 0.186558113098144531E+02 + 0.187115669250488281E+02 + 0.187673225402832031E+02 + 0.188230781555175781E+02 + 0.188788318634033203E+02 + 0.189871520996093750E+02 + 0.191621017456054688E+02 + 0.193370532989501953E+02 + 0.195120029449462891E+02 + 0.196869525909423828E+02 + 0.198619022369384766E+02 + 0.200379638671875000E+02 + 0.202163314819335938E+02 + 0.203946990966796875E+02 + 0.205730667114257813E+02 + 0.207514343261718750E+02 + 0.209298000335693359E+02 + 0.211081676483154297E+02 + 0.212155113220214844E+02 + 0.212749671936035156E+02 + 0.213344230651855469E+02 + 0.213938789367675781E+02 + 0.214533329010009766E+02 + 0.215127887725830078E+02 + 0.215722446441650391E+02 + 0.216253185272216797E+02 + 0.216523437500000000E+02 + 0.216793689727783203E+02 + 0.217063941955566406E+02 + 0.217334175109863281E+02 + 0.217604427337646484E+02 + 0.217874679565429688E+02 + 0.218144931793212891E+02 + 0.218431358337402344E+02 + 0.218989696502685547E+02 + 0.219548053741455078E+02 + 0.220106391906738281E+02 + 0.220664749145507813E+02 + 0.221223087310791016E+02 + 0.221781444549560547E+02 + 0.222339782714843750E+02 + 0.222898120880126953E+02 + 0.223436965942382813E+02 + 0.223802433013916016E+02 + 0.224167881011962891E+02 + 0.224533348083496094E+02 + 0.224898796081542969E+02 + 0.225264263153076172E+02 + 0.225629711151123047E+02 + 0.225995178222656250E+02 + 0.226360645294189453E+02 + 0.226726093292236328E+02 + 0.227009258270263672E+02 + 0.227046165466308594E+02 + 0.227083091735839844E+02 + 0.227119998931884766E+02 + 0.227156906127929688E+02 + 0.227193832397460938E+02 + 0.227230739593505859E+02 + 0.227267665863037109E+02 + 0.227304573059082031E+02 + 0.227341480255126953E+02 + 0.227378406524658203E+02 + 0.226381435394287109E+02 + 0.223927173614501953E+02 + 0.221472930908203125E+02 + 0.219018669128417969E+02 + 0.216564426422119141E+02 + 0.214110164642333984E+02 + 0.211655921936035156E+02 + 0.209201660156250000E+02 + 0.206747417449951172E+02 + 0.204293155670166016E+02 + 0.201838912963867188E+02 + 0.199384651184082031E+02 + 0.197638034820556641E+02 + 0.196365547180175781E+02 + 0.195093040466308594E+02 + 0.193820552825927734E+02 + 0.192548065185546875E+02 + 0.191275577545166016E+02 + 0.190003070831298828E+02 + 0.188730583190917969E+02 + 0.187458095550537109E+02 + 0.186185588836669922E+02 + 0.184913101196289063E+02 + 0.183640613555908203E+02 + 0.182368125915527344E+02 + 0.181052703857421875E+02 + 0.179671897888183594E+02 + 0.178291110992431641E+02 + 0.176910324096679688E+02 + 0.175529518127441406E+02 + 0.174148731231689453E+02 + 0.172767944335937500E+02 + 0.171387138366699219E+02 + 0.170006351470947266E+02 + 0.168625564575195313E+02 + 0.167244758605957031E+02 + 0.165863971710205078E+02 + 0.164483184814453125E+02 + 0.163102378845214844E+02 + 0.161721591949462891E+02 + 0.159048433303833008E+02 + 0.156354751586914063E+02 + 0.153661069869995117E+02 + 0.150967388153076172E+02 + 0.148273706436157227E+02 + 0.145580024719238281E+02 + 0.142886343002319336E+02 + 0.140192661285400391E+02 + 0.137498989105224609E+02 + 0.134805297851562500E+02 + 0.132111625671386719E+02 + 0.129417934417724609E+02 + 0.126724262237548828E+02 + 0.124030580520629883E+02 + 0.121336870193481445E+02 + 0.118741712570190430E+02 + 0.116791801452636719E+02 + 0.114841890335083008E+02 + 0.112891988754272461E+02 + 0.110942077636718750E+02 + 0.108992166519165039E+02 + 0.107042264938354492E+02 + 0.105092353820800781E+02 + 0.103142442703247070E+02 + 0.101192541122436523E+02 + 0.992426300048828125E+01 + 0.972927188873291016E+01 + 0.953428173065185547E+01 + 0.933929061889648438E+01 + 0.914429950714111328E+01 + 0.894930934906005859E+01 + 0.875431823730468750E+01 + 0.855932712554931641E+01 + 0.831746864318847656E+01 + 0.805511379241943359E+01 + 0.779275941848754883E+01 + 0.753040504455566406E+01 + 0.726805019378662109E+01 + 0.700569534301757813E+01 + 0.674334096908569336E+01 + 0.648098659515380859E+01 + 0.621863174438476563E+01 + 0.595627689361572266E+01 + 0.569392204284667969E+01 + 0.543156766891479492E+01 + 0.516921281814575195E+01 + 0.490685844421386719E+01 + 0.464450359344482422E+01 + 0.438214921951293945E+01 + 0.411979436874389648E+01 + 0.385743951797485352E+01 + 0.359508514404296875E+01 +__pi01dn01 + 250 + 0.100127435302734375E+04 + 0.100096276855468750E+04 + 0.100064184570312500E+04 + 0.100031127929687500E+04 + 0.999970764160156250E+03 + 0.999620056152343750E+03 + 0.999258850097656250E+03 + 0.998886779785156250E+03 + 0.998503540039062500E+03 + 0.998108764648437500E+03 + 0.997702148437500000E+03 + 0.997283264160156250E+03 + 0.996851745605468750E+03 + 0.996407165527343750E+03 + 0.995949157714843750E+03 + 0.995477355957031250E+03 + 0.994991271972656250E+03 + 0.994490539550781250E+03 + 0.993974670410156250E+03 + 0.993443237304687500E+03 + 0.992895751953125000E+03 + 0.992331726074218750E+03 + 0.991750732421875000E+03 + 0.991152160644531250E+03 + 0.990535522460937500E+03 + 0.989900268554687500E+03 + 0.989245849609375000E+03 + 0.988571716308593750E+03 + 0.987877258300781250E+03 + 0.987161804199218750E+03 + 0.986424743652343750E+03 + 0.985665466308593750E+03 + 0.984883300781250000E+03 + 0.984077575683593750E+03 + 0.983247558593750000E+03 + 0.982392517089843750E+03 + 0.981511657714843750E+03 + 0.980604248046875000E+03 + 0.979669494628906250E+03 + 0.978706604003906250E+03 + 0.977714660644531250E+03 + 0.976692871093750000E+03 + 0.975640258789062500E+03 + 0.974555969238281250E+03 + 0.973439025878906250E+03 + 0.972288452148437500E+03 + 0.971103271484375000E+03 + 0.969882385253906250E+03 + 0.968624755859375000E+03 + 0.967329284667968750E+03 + 0.965994873046875000E+03 + 0.964620300292968750E+03 + 0.963204345703125000E+03 + 0.961745849609375000E+03 + 0.960243469238281250E+03 + 0.958695861816406250E+03 + 0.957101684570312500E+03 + 0.955459594726562500E+03 + 0.953768066406250000E+03 + 0.952025695800781250E+03 + 0.950230895996093750E+03 + 0.948382080078125000E+03 + 0.946477539062500000E+03 + 0.944515625000000000E+03 + 0.942494628906250000E+03 + 0.940412597656250000E+03 + 0.938267517089843750E+03 + 0.936057495117187500E+03 + 0.933780517578125000E+03 + 0.931434814453125000E+03 + 0.929018859863281250E+03 + 0.926530639648437500E+03 + 0.923968017578125000E+03 + 0.921329467773437500E+03 + 0.918613830566406250E+03 + 0.915819274902343750E+03 + 0.912943603515625000E+03 + 0.909984741210937500E+03 + 0.906940002441406250E+03 + 0.903807189941406250E+03 + 0.900637023925781250E+03 + 0.897475952148437500E+03 + 0.894318542480468750E+03 + 0.891164794921875000E+03 + 0.888014648437500000E+03 + 0.884867736816406250E+03 + 0.881723388671875000E+03 + 0.878581359863281250E+03 + 0.875441650390625000E+03 + 0.872304260253906250E+03 + 0.869169372558593750E+03 + 0.866037109375000000E+03 + 0.862907470703125000E+03 + 0.859780456542968750E+03 + 0.856656066894531250E+03 + 0.853533996582031250E+03 + 0.850413879394531250E+03 + 0.847295715332031250E+03 + 0.844179565429687500E+03 + 0.841065368652343750E+03 + 0.837953063964843750E+03 + 0.834842590332031250E+03 + 0.831733947753906250E+03 + 0.828627075195312500E+03 + 0.825522033691406250E+03 + 0.822418762207031250E+03 + 0.819317382812500000E+03 + 0.816218139648437500E+03 + 0.813121276855468750E+03 + 0.810026733398437500E+03 + 0.806934509277343750E+03 + 0.803844604492187500E+03 + 0.800757019042968750E+03 + 0.797671752929687500E+03 + 0.794588684082031250E+03 + 0.791507812500000000E+03 + 0.788429077148437500E+03 + 0.785352539062500000E+03 + 0.782278137207031250E+03 + 0.779205932617187500E+03 + 0.776135864257812500E+03 + 0.773067871093750000E+03 + 0.770001892089843750E+03 + 0.766937866210937500E+03 + 0.763875854492187500E+03 + 0.760815856933593750E+03 + 0.757757812500000000E+03 + 0.754701782226562500E+03 + 0.751647705078125000E+03 + 0.748595458984375000E+03 + 0.745544860839843750E+03 + 0.742495910644531250E+03 + 0.739448547363281250E+03 + 0.736402832031250000E+03 + 0.733358764648437500E+03 + 0.730316345214843750E+03 + 0.727275573730468750E+03 + 0.724236389160156250E+03 + 0.721198791503906250E+03 + 0.718162780761718750E+03 + 0.715128295898437500E+03 + 0.712095397949218750E+03 + 0.709064025878906250E+03 + 0.706034179687500000E+03 + 0.703005920410156250E+03 + 0.699979187011718750E+03 + 0.696953979492187500E+03 + 0.693930480957031250E+03 + 0.690909362792968750E+03 + 0.687891052246093750E+03 + 0.684875549316406250E+03 + 0.681862854003906250E+03 + 0.678852966308593750E+03 + 0.675845886230468750E+03 + 0.672841613769531250E+03 + 0.669840148925781250E+03 + 0.666841430664062500E+03 + 0.663845520019531250E+03 + 0.660853393554687500E+03 + 0.657867553710937500E+03 + 0.654889465332031250E+03 + 0.651919006347656250E+03 + 0.648956176757812500E+03 + 0.646000915527343750E+03 + 0.643053222656250000E+03 + 0.640113037109375000E+03 + 0.637180297851562500E+03 + 0.634255004882812500E+03 + 0.631337097167968750E+03 + 0.628426513671875000E+03 + 0.625525024414062500E+03 + 0.622635375976562500E+03 + 0.619758666992187500E+03 + 0.616894775390625000E+03 + 0.614043579101562500E+03 + 0.611204956054687500E+03 + 0.608378845214843750E+03 + 0.605565063476562500E+03 + 0.602763549804687500E+03 + 0.599974182128906250E+03 + 0.597196899414062500E+03 + 0.594431518554687500E+03 + 0.591677978515625000E+03 + 0.588936157226562500E+03 + 0.586205932617187500E+03 + 0.583487182617187500E+03 + 0.580779785156250000E+03 + 0.578083679199218750E+03 + 0.575398742675781250E+03 + 0.572724853515625000E+03 + 0.570061950683593750E+03 + 0.567409973144531250E+03 + 0.564768798828125000E+03 + 0.562138366699218750E+03 + 0.559518554687500000E+03 + 0.556909301757812500E+03 + 0.554310485839843750E+03 + 0.551722045898437500E+03 + 0.549144042968750000E+03 + 0.546576477050781250E+03 + 0.544019226074218750E+03 + 0.541472229003906250E+03 + 0.538935424804687500E+03 + 0.536408691406250000E+03 + 0.533891967773437500E+03 + 0.531385192871093750E+03 + 0.528888305664062500E+03 + 0.526401184082031250E+03 + 0.523923767089843750E+03 + 0.521455993652343750E+03 + 0.518997741699218750E+03 + 0.516549011230468750E+03 + 0.514109680175781250E+03 + 0.511679656982421875E+03 + 0.509258758544921875E+03 + 0.506846771240234375E+03 + 0.504443664550781250E+03 + 0.502049346923828125E+03 + 0.499663757324218750E+03 + 0.497286834716796875E+03 + 0.494918518066406250E+03 + 0.492558746337890625E+03 + 0.490207458496093750E+03 + 0.487864593505859375E+03 + 0.485530090332031250E+03 + 0.483203887939453125E+03 + 0.480885925292968750E+03 + 0.478576141357421875E+03 + 0.476274475097656250E+03 + 0.473980895996093750E+03 + 0.471695312500000000E+03 + 0.469418365478515625E+03 + 0.467150939941406250E+03 + 0.464893218994140625E+03 + 0.462645141601562500E+03 + 0.460406616210937500E+03 + 0.458177581787109375E+03 + 0.455957946777343750E+03 + 0.453747619628906250E+03 + 0.451546539306640625E+03 + 0.449354614257812500E+03 + 0.447171783447265625E+03 + 0.444997985839843750E+03 + 0.442833129882812500E+03 + 0.440677124023437500E+03 + 0.438529907226562500E+03 + 0.436391418457031250E+03 + 0.434261566162109375E+03 + 0.432140319824218750E+03 + 0.430027587890625000E+03 +__th01dn01 + 250 + 0.309907257080078125E+03 + 0.309907257080078125E+03 + 0.309903442382812500E+03 + 0.309899536132812500E+03 + 0.309895507812500000E+03 + 0.309891326904296875E+03 + 0.309887084960937500E+03 + 0.309882690429687500E+03 + 0.309878173828125000E+03 + 0.309873474121093750E+03 + 0.309837249755859375E+03 + 0.309780731201171875E+03 + 0.309722473144531250E+03 + 0.309662506103515625E+03 + 0.309600708007812500E+03 + 0.309537078857421875E+03 + 0.309471557617187500E+03 + 0.309404052734375000E+03 + 0.309354461669921875E+03 + 0.309303985595703125E+03 + 0.309251983642578125E+03 + 0.309198394775390625E+03 + 0.309143280029296875E+03 + 0.309086425781250000E+03 + 0.309029907226562500E+03 + 0.308981628417968750E+03 + 0.308931823730468750E+03 + 0.308880584716796875E+03 + 0.308827789306640625E+03 + 0.308773406982421875E+03 + 0.308717437744140625E+03 + 0.308675170898437500E+03 + 0.308631835937500000E+03 + 0.308587158203125000E+03 + 0.308541168212890625E+03 + 0.308493804931640625E+03 + 0.308448333740234375E+03 + 0.308409912109375000E+03 + 0.308370330810546875E+03 + 0.308329589843750000E+03 + 0.308287597656250000E+03 + 0.308244415283203125E+03 + 0.308213623046875000E+03 + 0.308182525634765625E+03 + 0.308150482177734375E+03 + 0.308117492675781250E+03 + 0.308083526611328125E+03 + 0.308057464599609375E+03 + 0.308031372070312500E+03 + 0.308004486083984375E+03 + 0.307976806640625000E+03 + 0.307949096679687500E+03 + 0.307925598144531250E+03 + 0.307901367187500000E+03 + 0.307876373291015625E+03 + 0.307850708007812500E+03 + 0.307826171875000000E+03 + 0.307802551269531250E+03 + 0.307778198242187500E+03 + 0.307753112792968750E+03 + 0.307726074218750000E+03 + 0.307690704345703125E+03 + 0.307654296875000000E+03 + 0.307616790771484375E+03 + 0.307578186035156250E+03 + 0.307500701904296875E+03 + 0.307415069580078125E+03 + 0.307326873779296875E+03 + 0.307235961914062500E+03 + 0.307229034423828125E+03 + 0.307256225585937500E+03 + 0.307284088134765625E+03 + 0.307312591552734375E+03 + 0.307505554199218750E+03 + 0.307784240722656250E+03 + 0.308070953369140625E+03 + 0.308366088867187500E+03 + 0.308708312988281250E+03 + 0.309075897216796875E+03 + 0.309454406738281250E+03 + 0.309837829589843750E+03 + 0.310200683593750000E+03 + 0.310559356689453125E+03 + 0.310917999267578125E+03 + 0.311276550292968750E+03 + 0.311552001953125000E+03 + 0.311782836914062500E+03 + 0.312013671875000000E+03 + 0.312244445800781250E+03 + 0.312476989746093750E+03 + 0.312740447998046875E+03 + 0.313003845214843750E+03 + 0.313267303466796875E+03 + 0.313530700683593750E+03 + 0.313794006347656250E+03 + 0.313992218017578125E+03 + 0.314190429687500000E+03 + 0.314388671875000000E+03 + 0.314586883544921875E+03 + 0.314785034179687500E+03 + 0.314976348876953125E+03 + 0.315158874511718750E+03 + 0.315341430664062500E+03 + 0.315523956298828125E+03 + 0.315706481933593750E+03 + 0.315888977050781250E+03 + 0.316089813232421875E+03 + 0.316328582763671875E+03 + 0.316567352294921875E+03 + 0.316806091308593750E+03 + 0.317044860839843750E+03 + 0.317283569335937500E+03 + 0.317522308349609375E+03 + 0.317752563476562500E+03 + 0.317977111816406250E+03 + 0.318201660156250000E+03 + 0.318426208496093750E+03 + 0.318650726318359375E+03 + 0.318875274658203125E+03 + 0.319099761962890625E+03 + 0.319321105957031250E+03 + 0.319529602050781250E+03 + 0.319738098144531250E+03 + 0.319946594238281250E+03 + 0.320155059814453125E+03 + 0.320363525390625000E+03 + 0.320571990966796875E+03 + 0.320780426025390625E+03 + 0.320986938476562500E+03 + 0.321159851074218750E+03 + 0.321332794189453125E+03 + 0.321505676269531250E+03 + 0.321678619384765625E+03 + 0.321851531982421875E+03 + 0.322024505615234375E+03 + 0.322197418212890625E+03 + 0.322370330810546875E+03 + 0.322542480468750000E+03 + 0.322707763671875000E+03 + 0.322873046875000000E+03 + 0.323038360595703125E+03 + 0.323203643798828125E+03 + 0.323368896484375000E+03 + 0.323534179687500000E+03 + 0.323699493408203125E+03 + 0.323864776611328125E+03 + 0.324030029296875000E+03 + 0.324229919433593750E+03 + 0.324533386230468750E+03 + 0.324836853027343750E+03 + 0.325140289306640625E+03 + 0.325443725585937500E+03 + 0.325747222900390625E+03 + 0.326050659179687500E+03 + 0.326354095458984375E+03 + 0.326657531738281250E+03 + 0.326960998535156250E+03 + 0.327264465332031250E+03 + 0.327794219970703125E+03 + 0.328642883300781250E+03 + 0.329491577148437500E+03 + 0.330340240478515625E+03 + 0.331188934326171875E+03 + 0.332037597656250000E+03 + 0.332886291503906250E+03 + 0.333734985351562500E+03 + 0.334583648681640625E+03 + 0.335432312011718750E+03 + 0.336281005859375000E+03 + 0.337129699707031250E+03 + 0.338382720947265625E+03 + 0.339906707763671875E+03 + 0.341430664062500000E+03 + 0.342954620361328125E+03 + 0.344478576660156250E+03 + 0.346002563476562500E+03 + 0.347526519775390625E+03 + 0.349050476074218750E+03 + 0.350574432373046875E+03 + 0.352098419189453125E+03 + 0.353622375488281250E+03 + 0.355146331787109375E+03 + 0.356670288085937500E+03 + 0.358189758300781250E+03 + 0.359702392578125000E+03 + 0.361215026855468750E+03 + 0.362727661132812500E+03 + 0.364240295410156250E+03 + 0.365752899169921875E+03 + 0.367265533447265625E+03 + 0.368778167724609375E+03 + 0.370290802001953125E+03 + 0.371803436279296875E+03 + 0.373316070556640625E+03 + 0.374828704833984375E+03 + 0.376341308593750000E+03 + 0.377853942871093750E+03 + 0.379366577148437500E+03 + 0.380909759521484375E+03 + 0.382453399658203125E+03 + 0.383997070312500000E+03 + 0.385540771484375000E+03 + 0.387084411621093750E+03 + 0.388628082275390625E+03 + 0.390171752929687500E+03 + 0.391715393066406250E+03 + 0.393259063720703125E+03 + 0.394802734375000000E+03 + 0.396346374511718750E+03 + 0.397890045166015625E+03 + 0.399433715820312500E+03 + 0.400977355957031250E+03 + 0.402521057128906250E+03 + 0.404058654785156250E+03 + 0.405556640625000000E+03 + 0.407054626464843750E+03 + 0.408552612304687500E+03 + 0.410050598144531250E+03 + 0.411548583984375000E+03 + 0.413046569824218750E+03 + 0.414544555664062500E+03 + 0.416042572021484375E+03 + 0.417540557861328125E+03 + 0.419038543701171875E+03 + 0.420536529541015625E+03 + 0.422034515380859375E+03 + 0.423532501220703125E+03 + 0.425030487060546875E+03 + 0.426528472900390625E+03 + 0.428026458740234375E+03 + 0.429524444580078125E+03 + 0.431275360107421875E+03 + 0.433136871337890625E+03 + 0.434998413085937500E+03 + 0.436859954833984375E+03 + 0.438721466064453125E+03 + 0.440583007812500000E+03 + 0.442444519042968750E+03 + 0.444306030273437500E+03 + 0.446167541503906250E+03 + 0.448029083251953125E+03 + 0.449890594482421875E+03 + 0.451752105712890625E+03 + 0.453613647460937500E+03 + 0.455475158691406250E+03 + 0.457336669921875000E+03 + 0.459198211669921875E+03 + 0.461059722900390625E+03 + 0.462921234130859375E+03 + 0.464782745361328125E+03 +__dn01dn01 + 250 + 0.111670076847076416E+01 + 0.111583304405212402E+01 + 0.111495316028594971E+01 + 0.111404716968536377E+01 + 0.111311447620391846E+01 + 0.111215424537658691E+01 + 0.111116600036621094E+01 + 0.111014842987060547E+01 + 0.110910069942474365E+01 + 0.110802233219146729E+01 + 0.110702455043792725E+01 + 0.110606551170349121E+01 + 0.110507798194885254E+01 + 0.110406100749969482E+01 + 0.110301351547241211E+01 + 0.110193514823913574E+01 + 0.110082459449768066E+01 + 0.109968078136444092E+01 + 0.109843230247497559E+01 + 0.109714496135711670E+01 + 0.109581911563873291E+01 + 0.109445440769195557E+01 + 0.109304881095886230E+01 + 0.109160244464874268E+01 + 0.109010577201843262E+01 + 0.108853006362915039E+01 + 0.108690869808197021E+01 + 0.108523905277252197E+01 + 0.108352053165435791E+01 + 0.108175158500671387E+01 + 0.107993090152740479E+01 + 0.107800281047821045E+01 + 0.107601821422576904E+01 + 0.107397580146789551E+01 + 0.107187390327453613E+01 + 0.106971108913421631E+01 + 0.106747353076934814E+01 + 0.106514251232147217E+01 + 0.106274425983428955E+01 + 0.106027674674987793E+01 + 0.105773806571960449E+01 + 0.105512654781341553E+01 + 0.105239295959472656E+01 + 0.104957938194274902E+01 + 0.104668557643890381E+01 + 0.104370951652526855E+01 + 0.104064846038818359E+01 + 0.103747093677520752E+01 + 0.103420090675354004E+01 + 0.103083884716033936E+01 + 0.102738225460052490E+01 + 0.102382588386535645E+01 + 0.102015328407287598E+01 + 0.101637852191925049E+01 + 0.101249897480010986E+01 + 0.100851118564605713E+01 + 0.100440704822540283E+01 + 0.100018405914306641E+01 + 0.995845079421997070E+00 + 0.991387069225311279E+00 + 0.986811041831970215E+00 + 0.982134342193603516E+00 + 0.977330088615417480E+00 + 0.972395360469818115E+00 + 0.967327058315277100E+00 + 0.962239861488342285E+00 + 0.957032382488250732E+00 + 0.951683580875396729E+00 + 0.946190655231475830E+00 + 0.940284967422485352E+00 + 0.934121131896972656E+00 + 0.927799105644226074E+00 + 0.921316146850585938E+00 + 0.914183199405670166E+00 + 0.906644761562347412E+00 + 0.898932337760925293E+00 + 0.891043782234191895E+00 + 0.882866740226745605E+00 + 0.874464094638824463E+00 + 0.865876972675323486E+00 + 0.857247173786163330E+00 + 0.848756194114685059E+00 + 0.840344369411468506E+00 + 0.831999599933624268E+00 + 0.823721885681152344E+00 + 0.815726816654205322E+00 + 0.807905972003936768E+00 + 0.800140321254730225E+00 + 0.792429745197296143E+00 + 0.784769535064697266E+00 + 0.777087628841400146E+00 + 0.769462049007415771E+00 + 0.761892855167388916E+00 + 0.754379570484161377E+00 + 0.746922433376312256E+00 + 0.739673197269439697E+00 + 0.732474088668823242E+00 + 0.725325345993041992E+00 + 0.718226611614227295E+00 + 0.711177647113800049E+00 + 0.704193413257598877E+00 + 0.697277009487152100E+00 + 0.690408766269683838E+00 + 0.683588266372680664E+00 + 0.676815092563629150E+00 + 0.670089662075042725E+00 + 0.663372635841369629E+00 + 0.656625390052795410E+00 + 0.649928510189056396E+00 + 0.643281519412994385E+00 + 0.636684298515319824E+00 + 0.630136549472808838E+00 + 0.623638093471527100E+00 + 0.617204904556274414E+00 + 0.610830605030059814E+00 + 0.604504227638244629E+00 + 0.598224937915802002E+00 + 0.591992735862731934E+00 + 0.585807383060455322E+00 + 0.579668641090393066E+00 + 0.573581755161285400E+00 + 0.567563652992248535E+00 + 0.561590433120727539E+00 + 0.555661857128143311E+00 + 0.549777865409851074E+00 + 0.543938159942626953E+00 + 0.538142383098602295E+00 + 0.532390475273132324E+00 + 0.526685476303100586E+00 + 0.521077871322631836E+00 + 0.515511572360992432E+00 + 0.509986519813537598E+00 + 0.504501998424530029E+00 + 0.499058365821838379E+00 + 0.493655264377593994E+00 + 0.488292634487152100E+00 + 0.482970029115676880E+00 + 0.477688550949096680E+00 + 0.472456902265548706E+00 + 0.467264503240585327E+00 + 0.462111085653305054E+00 + 0.456996619701385498E+00 + 0.451920777559280396E+00 + 0.446883529424667358E+00 + 0.441884607076644897E+00 + 0.436923891305923462E+00 + 0.432001203298568726E+00 + 0.427071005105972290E+00 + 0.422046124935150146E+00 + 0.417064964771270752E+00 + 0.412127494812011719E+00 + 0.407233268022537231E+00 + 0.402381867170333862E+00 + 0.397573441267013550E+00 + 0.392807364463806152E+00 + 0.388083606958389282E+00 + 0.383401602506637573E+00 + 0.378761231899261475E+00 + 0.373905450105667114E+00 + 0.368744522333145142E+00 + 0.363649308681488037E+00 + 0.358618944883346558E+00 + 0.353652417659759521E+00 + 0.348749011754989624E+00 + 0.343907982110977173E+00 + 0.339128553867340088E+00 + 0.334409743547439575E+00 + 0.329751104116439819E+00 + 0.325151473283767700E+00 + 0.320610284805297852E+00 + 0.315751373767852783E+00 + 0.310720592737197876E+00 + 0.305775552988052368E+00 + 0.300914704799652100E+00 + 0.296136260032653809E+00 + 0.291438698768615723E+00 + 0.286820471286773682E+00 + 0.282280057668685913E+00 + 0.277815908193588257E+00 + 0.273426502943038940E+00 + 0.269110709428787231E+00 + 0.264866828918457031E+00 + 0.260693699121475220E+00 + 0.256593018770217896E+00 + 0.252564996480941772E+00 + 0.248603314161300659E+00 + 0.244706809520721436E+00 + 0.240874215960502625E+00 + 0.237104281783103943E+00 + 0.233396038413047791E+00 + 0.229748144745826721E+00 + 0.226159617304801941E+00 + 0.222629338502883911E+00 + 0.219156369566917419E+00 + 0.215739503502845764E+00 + 0.212377756834030151E+00 + 0.209070175886154175E+00 + 0.205815732479095459E+00 + 0.202597439289093018E+00 + 0.199431061744689941E+00 + 0.196315750479698181E+00 + 0.193250760436058044E+00 + 0.190235123038291931E+00 + 0.187267929315567017E+00 + 0.184348374605178833E+00 + 0.181475609540939331E+00 + 0.178648769855499268E+00 + 0.175867006182670593E+00 + 0.173129573464393616E+00 + 0.170435711741447449E+00 + 0.167784586548805237E+00 + 0.165175482630729675E+00 + 0.162607654929161072E+00 + 0.160082861781120300E+00 + 0.157613083720207214E+00 + 0.155181482434272766E+00 + 0.152787685394287109E+00 + 0.150430813431739807E+00 + 0.148110300302505493E+00 + 0.145825594663619995E+00 + 0.143576085567474365E+00 + 0.141361102461814880E+00 + 0.139180153608322144E+00 + 0.137032672762870789E+00 + 0.134918078780174255E+00 + 0.132835820317268372E+00 + 0.130785390734672546E+00 + 0.128766208887100220E+00 + 0.126777827739715576E+00 + 0.124819725751876831E+00 + 0.122891381382942200E+00 + 0.120921768248081207E+00 + 0.118954420089721680E+00 + 0.117020443081855774E+00 + 0.115119203925132751E+00 + 0.113250114023685455E+00 + 0.111412584781646729E+00 + 0.109605960547924042E+00 + 0.107829689979553223E+00 + 0.106083236634731293E+00 + 0.104365974664688110E+00 + 0.102677382528781891E+00 + 0.101016990840435028E+00 + 0.993841886520385742E-01 + 0.977785140275955200E-01 + 0.961994454264640808E-01 + 0.946464836597442627E-01 + 0.931192040443420410E-01 + 0.916170924901962280E-01 + 0.901397019624710083E-01 +__rt01dn01 + 250 + 0.157400742173194885E-01 + 0.157400742173194885E-01 + 0.157197769731283188E-01 + 0.156988706439733505E-01 + 0.156773384660482407E-01 + 0.156551580876111984E-01 + 0.156323146075010300E-01 + 0.156087838113307953E-01 + 0.155845480039715767E-01 + 0.155595848336815834E-01 + 0.155360717326402664E-01 + 0.155131984502077103E-01 + 0.154896397143602371E-01 + 0.154653731733560562E-01 + 0.154403792694211006E-01 + 0.154146356508135796E-01 + 0.153881199657917023E-01 + 0.153608079999685287E-01 + 0.153312394395470619E-01 + 0.153007395565509796E-01 + 0.152693241834640503E-01 + 0.152369672432541847E-01 + 0.152036398649215698E-01 + 0.151693113148212433E-01 + 0.151335047557950020E-01 + 0.150943771004676819E-01 + 0.150540759786963463E-01 + 0.150125650689005852E-01 + 0.149698099121451378E-01 + 0.149257713928818703E-01 + 0.148804122582077980E-01 + 0.148314256221055984E-01 + 0.147809488698840141E-01 + 0.147289568558335304E-01 + 0.146754058077931404E-01 + 0.146202482283115387E-01 + 0.145624317228794098E-01 + 0.145003683865070343E-01 + 0.144364433363080025E-01 + 0.143706006929278374E-01 + 0.143027827143669128E-01 + 0.142329297959804535E-01 + 0.141618810594081879E-01 + 0.140887415036559105E-01 + 0.140134068205952644E-01 + 0.139358118176460266E-01 + 0.138558903709053993E-01 + 0.137731982395052910E-01 + 0.136879952624440193E-01 + 0.136002376675605774E-01 + 0.135098462924361229E-01 + 0.134156541898846626E-01 + 0.133118750527501106E-01 + 0.132049825042486191E-01 + 0.130948834121227264E-01 + 0.129814818501472473E-01 + 0.128611130639910698E-01 + 0.127342399209737778E-01 + 0.126035604625940323E-01 + 0.124689601361751556E-01 + 0.123188504949212074E-01 + 0.120928045362234116E-01 + 0.118599776178598404E-01 + 0.116201657801866531E-01 + 0.113731585443019867E-01 + 0.108122359961271286E-01 + 0.101871732622385025E-01 + 0.954335834830999374E-02 + 0.888023152947425842E-02 + 0.814564153552055359E-02 + 0.736850779503583908E-02 + 0.656806118786334991E-02 + 0.574360042810440063E-02 + 0.511736655607819557E-02 + 0.458150403574109077E-02 + 0.402956502512097359E-02 + 0.346106919459998608E-02 + 0.315951509401202202E-02 + 0.295987166464328766E-02 + 0.275420234538614750E-02 + 0.254582636989653111E-02 + 0.240100966766476631E-02 + 0.226934440433979034E-02 + 0.213767914101481438E-02 + 0.200601387768983841E-02 + 0.188496639020740986E-02 + 0.176962336990982294E-02 + 0.165428023319691420E-02 + 0.153893709648400545E-02 + 0.142714334651827812E-02 + 0.137570430524647236E-02 + 0.132426526397466660E-02 + 0.127282633911818266E-02 + 0.122138729784637690E-02 + 0.116997293662279844E-02 + 0.114299450069665909E-02 + 0.111601618118584156E-02 + 0.108903786167502403E-02 + 0.106205942574888468E-02 + 0.103508110623806715E-02 + 0.100341590587049723E-02 + 0.965809798799455166E-03 + 0.928203691728413105E-03 + 0.890597584657371044E-03 + 0.852991419378668070E-03 + 0.815385312307626009E-03 + 0.778890273068100214E-03 + 0.744703225791454315E-03 + 0.710516120307147503E-03 + 0.676329073030501604E-03 + 0.642141967546194792E-03 + 0.607954920269548893E-03 + 0.573767814785242081E-03 + 0.543858448509126902E-03 + 0.516833271831274033E-03 + 0.489808095153421164E-03 + 0.462782976683229208E-03 + 0.435757800005376339E-03 + 0.408732681535184383E-03 + 0.381707504857331514E-03 + 0.355890952050685883E-03 + 0.335007964167743921E-03 + 0.314125005388632417E-03 + 0.293242046609520912E-03 + 0.272359058726578951E-03 + 0.251476070843636990E-03 + 0.230593112064525485E-03 + 0.209710153285413980E-03 + 0.189310128916986287E-03 + 0.177026522578671575E-03 + 0.164742901688441634E-03 + 0.152459295350126922E-03 + 0.140175674459896982E-03 + 0.127892068121582270E-03 + 0.115608447231352329E-03 + 0.103324840893037617E-03 + 0.910412200028076768E-04 + 0.793839499237947166E-04 + 0.732929765945300460E-04 + 0.672020032652653754E-04 + 0.611110299360007048E-04 + 0.550200566067360342E-04 + 0.489290869154501706E-04 + 0.428381135861855000E-04 + 0.367471402569208294E-04 + 0.306561669276561588E-04 + 0.245651935983914882E-04 + 0.197688186744926497E-04 + 0.188459234777837992E-04 + 0.179230301000643522E-04 + 0.170001349033555016E-04 + 0.160772415256360546E-04 + 0.151543463289272040E-04 + 0.142314529512077570E-04 + 0.133085586639936082E-04 + 0.123856643767794594E-04 + 0.114627700895653106E-04 + 0.105398758023511618E-04 + 0.968389485933585092E-05 + 0.892223033588379622E-05 + 0.816056490293703973E-05 + 0.739890037948498502E-05 + 0.663723540128557943E-05 + 0.587557042308617383E-05 + 0.511390544488676824E-05 + 0.435224092143471353E-05 + 0.359057594323530793E-05 + 0.282891096503590234E-05 + 0.206724598683649674E-05 + 0.130558146338444203E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 + 0.100000011116208043E-05 +__kppzm + 48 + -0.170577192306518555E+01 + -0.515288019180297852E+01 + -0.867263221740722656E+01 + -0.122681560516357422E+02 + -0.159427862167358398E+02 + -0.197000827789306641E+02 + -0.235438518524169922E+02 + -0.274781646728515625E+02 + -0.315073947906494141E+02 + -0.356362304687500000E+02 + -0.398697319030761719E+02 + -0.442133331298828125E+02 + -0.486729240417480469E+02 + -0.532548675537109375E+02 + -0.579660606384277344E+02 + -0.628140220642089844E+02 + -0.678069229125976563E+02 + -0.729536972045898438E+02 + -0.782641372680664063E+02 + -0.837490005493164063E+02 + -0.894201202392578125E+02 + -0.952906188964843750E+02 + -0.101375022888183594E+03 + -0.107689506530761719E+03 + -0.114252166748046875E+03 + -0.121083328247070312E+03 + -0.128205902099609375E+03 + -0.135645858764648437E+03 + -0.143432846069335937E+03 + -0.151600814819335937E+03 + -0.160188995361328125E+03 + -0.169243026733398437E+03 + -0.178816345214843750E+03 + -0.188972213745117187E+03 + -0.199786239624023437E+03 + -0.211349731445312500E+03 + -0.223774444580078125E+03 + -0.237199188232421875E+03 + -0.251799423217773437E+03 + -0.267801239013671875E+03 + -0.285503112792968750E+03 + -0.305310638427734375E+03 + -0.327794952392578125E+03 + -0.353797454833984375E+03 + -0.384634338378906250E+03 + -0.422540863037109375E+03 + -0.471808868408203125E+03 + -0.500000000000000000E+03 +__gnu + 8 + 0.400000000000000000E+01 + 0.200000000000000000E+01 + 0.200000000000000000E+01 + 0.200000000000000000E+01 + 0.200000000000000000E+01 + 0.200000000000000000E+01 + 0.200000000000000000E+01 + 0.400000000000000000E+01 +__iaero_chem + 11 + 1 + 1 + 1 + 1 + 2 + 2 + 2 + 1 + 1 + 1 + 1 +__cfmas + 16 + 0.524000000000000000E+03 + 0.524000000000000000E+03 + 0.110800003051757812E+03 + 0.273899990133941174E-02 + 0.495999991893768311E+00 + 0.157000000000000000E+03 + 0.471000000000000000E+03 + 0.885399997234344482E+00 + 0.377000006847083569E-02 + 0.123000005260109901E-02 + 0.100100003182888031E+00 + 0.885399997234344482E+00 + 0.377000006847083569E-02 + 0.123000005260109901E-02 + 0.100100003182888031E+00 + 0.524000000000000000E+03 +__pwmas + 16 + 0.300000000000000000E+01 + 0.300000000000000000E+01 + 0.291000008583068848E+01 + 0.174000000953674316E+01 + 0.240000009536743164E+01 + 0.300000000000000000E+01 + 0.300000000000000000E+01 + 0.250000000000000000E+01 + 0.200000000000000000E+01 + 0.179999995231628418E+01 + 0.225600004196166992E+01 + 0.250000000000000000E+01 + 0.200000000000000000E+01 + 0.179999995231628418E+01 + 0.225600004196166992E+01 + 0.300000000000000000E+01 +__slcpd + 12 + 0.146500000000000000E+07 + 0.140700000000000000E+07 + 0.134400000000000000E+07 + 0.127300000000000000E+07 + 0.121400000000000000E+07 + 0.117700000000000000E+07 + 0.131900000000000000E+07 + 0.122700000000000000E+07 + 0.117700000000000000E+07 + 0.115100000000000000E+07 + 0.108800000000000000E+07 + 0.874000000000000000E+06 +__slmsts + 12 + 0.395000010728836060E+00 + 0.409999996423721313E+00 + 0.435000002384185791E+00 + 0.485000014305114746E+00 + 0.451000005006790161E+00 + 0.419999986886978149E+00 + 0.476999998092651367E+00 + 0.476000010967254639E+00 + 0.425999999046325684E+00 + 0.492000013589859009E+00 + 0.481999993324279785E+00 + 0.862999975681304932E+00 +__slz + 11 + -0.500000000000000000E+00 + -0.400000005960464478E+00 + -0.300000011920928955E+00 + -0.250000000000000000E+00 + -0.200000002980232239E+00 + -0.159999996423721313E+00 + -0.119999997317790985E+00 + -0.900000035762786865E-01 + -0.599999986588954926E-01 + -0.299999993294477463E-01 + -0.999999977648258209E-02 diff --git a/docs/ComputerDocs-Cheyenne/README_compile_cheyenne.dms b/docs/ComputerDocs-Cheyenne/README_compile_cheyenne.dms deleted file mode 100644 index 3e0b30f..0000000 --- a/docs/ComputerDocs-Cheyenne/README_compile_cheyenne.dms +++ /dev/null @@ -1,44 +0,0 @@ -I could not get the large channel sim to run on Cheyenne until I compiled our versions of the MPI -HDF5 libraries and linked to those (as opposed to the Cheyenne built-in libraries). - - - -In order to do compile our own HDF5 and MPI libriares, you need to clear paths to the -Cheyenne built-in libraries. Load/unload modules to get the following state: - - stephenh@cheyenne2:~/Rams/misc> module list - - Currently Loaded Modules: - 1) ncarenv/1.2 2) intel/17.0.1 3) ncarcompilers/0.4.1 4) slurm/17.02.4 - -Then save this state as your default: - - module save default - -Then log out and log back in again. You need to do all of the above steps in order to clear out a -bunch of variables that point to the built-in libraries (NCAR_LDFLAGS_*, specifically). - - - -Once the environment is set properly, untar the source code for the MPI libraries and run configure -(change --prefix path to where you want the libraries to be installed): - - ./configure --prefix=/glade/u/home/stephenh/Rams/misc/mpich2-1.4.1-install --disable-f77 -disable-fc --disable-cxx -enable-fast=O3 CPPFLAGS=-DNDEBUG --with-device=ch3:nemesis CC=icc FC=ifort F90= - -Then compile the MPI libraries: - - make - make install - -Compile the HDF5 libraries (set --prefix to where you want the libraries installed, and set the path -to mpicc accordingly): - - ./configure --prefix=/glade/u/home/stephenh/Rams/misc/hdf5-1.8.9-install --disable-fortran --disable-fortran2003 --enable-parallel CC=/glade/u/home/stephenh/Rams/misc/mpich2-1.4.1-install/bin/mpicc - make - make install - - -Then use the source code saved in rams_20171109_rce_6.2.08 to compile RAMS. Set the paths for -HDF5_ROOT and MPI_ROOT accordingly in the include.mk.cheyenne.mylibs file. - - diff --git a/docs/ComputerDocs-Cheyenne/Scripts_and_Files/README_compile_cheyenne b/docs/ComputerDocs-Cheyenne/Scripts_and_Files/README_compile_cheyenne deleted file mode 100644 index 3e0b30f..0000000 --- a/docs/ComputerDocs-Cheyenne/Scripts_and_Files/README_compile_cheyenne +++ /dev/null @@ -1,44 +0,0 @@ -I could not get the large channel sim to run on Cheyenne until I compiled our versions of the MPI -HDF5 libraries and linked to those (as opposed to the Cheyenne built-in libraries). - - - -In order to do compile our own HDF5 and MPI libriares, you need to clear paths to the -Cheyenne built-in libraries. Load/unload modules to get the following state: - - stephenh@cheyenne2:~/Rams/misc> module list - - Currently Loaded Modules: - 1) ncarenv/1.2 2) intel/17.0.1 3) ncarcompilers/0.4.1 4) slurm/17.02.4 - -Then save this state as your default: - - module save default - -Then log out and log back in again. You need to do all of the above steps in order to clear out a -bunch of variables that point to the built-in libraries (NCAR_LDFLAGS_*, specifically). - - - -Once the environment is set properly, untar the source code for the MPI libraries and run configure -(change --prefix path to where you want the libraries to be installed): - - ./configure --prefix=/glade/u/home/stephenh/Rams/misc/mpich2-1.4.1-install --disable-f77 -disable-fc --disable-cxx -enable-fast=O3 CPPFLAGS=-DNDEBUG --with-device=ch3:nemesis CC=icc FC=ifort F90= - -Then compile the MPI libraries: - - make - make install - -Compile the HDF5 libraries (set --prefix to where you want the libraries installed, and set the path -to mpicc accordingly): - - ./configure --prefix=/glade/u/home/stephenh/Rams/misc/hdf5-1.8.9-install --disable-fortran --disable-fortran2003 --enable-parallel CC=/glade/u/home/stephenh/Rams/misc/mpich2-1.4.1-install/bin/mpicc - make - make install - - -Then use the source code saved in rams_20171109_rce_6.2.08 to compile RAMS. Set the paths for -HDF5_ROOT and MPI_ROOT accordingly in the include.mk.cheyenne.mylibs file. - - diff --git a/docs/ComputerDocs-Cheyenne/Scripts_and_Files/fix_file_timestamps b/docs/ComputerDocs-Cheyenne/Scripts_and_Files/fix_file_timestamps deleted file mode 100644 index 284b61e..0000000 --- a/docs/ComputerDocs-Cheyenne/Scripts_and_Files/fix_file_timestamps +++ /dev/null @@ -1,25 +0,0 @@ -#! /bin/bash -# -# Script to fix timestamps on the RAMS analysis files. -# -# For some reason the HDF5 files are getting dated in the future -# which is subsequently causing the repack script to wait until -# that future date to compress the file. -# -# The header files are getting the correct timestamp. To fix -# this, use touch command to make the timestamp on each -# analysis file match that of its corresponding header -# file. - -RamsDir="$1" - -for Hfile in $(ls -1 $RamsDir/*-head.txt) -do - AfilePat=$(echo $Hfile | sed 's/-head.txt/-*.h5/') - Afiles=$(ls $AfilePat) - - echo "**********************************************************" - Cmd="touch -r $Hfile $Afiles" - echo "Running: $Cmd" - $Cmd -done diff --git a/docs/ComputerDocs-Cheyenne/Scripts_and_Files/include.mk.cheyenne b/docs/ComputerDocs-Cheyenne/Scripts_and_Files/include.mk.cheyenne deleted file mode 100644 index 5d00dbb..0000000 --- a/docs/ComputerDocs-Cheyenne/Scripts_and_Files/include.mk.cheyenne +++ /dev/null @@ -1,120 +0,0 @@ -############################################################################# -# Define make (gnu make works best) -############################################################################# -MAKE=/usr/bin/make - -############################################################################# -# Set your RAMS root path and version number -############################################################################# -RAMS_ROOT=/glade/u/home/stephenh/Rams/rams_20171109_rce_6.2.08 -RAMS_VERSION=6.2.08 - -#HDF5_ROOT=/glade/u/home/stephenh/Rams/misc/hdf5-1.8.9-install -#MPI_ROOT=/glade/u/home/stephenh/Rams/misc/mpich2-1.4.1-install - -MODEL=$(RAMS_ROOT)/src/$(RAMS_VERSION) -UTILS_INCS=-I$(MODEL)/include - -############################################################################# -# HDF libraries -# Note that linking libraries below are in a particular order to work! -############################################################################# -#HDF5_LIBS=-L$(HDF5_ROOT)/lib -lhdf5_hl -lhdf5 -lsz -lz -#HDF5_INCS=-I$(HDF5_ROOT)/include -#HDF5_DEFS= - -############################################################################# -# TYPE OF COMPUTER SYSTEM (used for DEFINE statements for intrinsic calls) -############################################################################# -CMACH=PC_LINUX1 #Standard Linux (only option available now) - -############################################################################# -# UNCOMMENT 1 LINUX FORTRAN COMPILER SET OF FLAGS BELOW -############################################################################# -# Note that some Fortran optimizations greater than -O1 will not necessarily -# produce identical results when running same executable multiple times. -# This is perhaps due to order of operations or unrolling loop order that -# changes solutions slightly. This is not ideal for research applications -# involving sensitivity studies that require exact duplication. As such, -# the Makefile is setup to allow different optimizations for different source -# files. The F_OPTS1 and F_OPTS2 variables below can hold different compiler -# flags as needed. Further, for duplication of results you may need to force -# IEEE standard which is done in examples below. -# Please coordinate variables below with the commands in the Makefile. -# Mandatory fortran variables are (F_COMP, F_OPTS1, F_OPTS2, LOADER,OPTS). - -#Definitions of compiler flags below -# F_COMP = path to compiler executable -# F_OPTS1 = Uses of flags for lower optimization for some files -# F_OPTS2 = Uses of flags for higher optimization for some files -# LOADER_OPTS = Flags and optimaztion for LOADER -# LIBS = Extra system libraries for linking that some compilers need - -#***************************** -# FOR INTEL IFORT COMPILER -#***************************** -# (-g) for debugging, (-traceback) for more compiler error info -# (-check bounds) for array bounds checking, (-fp-model precise) for IEEE -# (-check uninit) for finding uninitialized variables, (-free) for free format -F_COMP=mpif90 -F_OPTS=-free -static-intel -fp-model precise -traceback -march=corei7 -axAVX -#F_OPTS=-free -fp-model precise -traceback -static-intel -march=corei7 -axAVX -check bounds -check uninit -F_OPTS1=-O1 $(F_OPTS) -F_OPTS2=-O2 $(F_OPTS) -LOADER=$(F_COMP) -LOADER_OPTS=$(F_OPTS2) -#LOADER=./run_ld -#LOADER_OPTS= -#LIBS=-L/usr/lib/x86_64-linux-gnu -lrt - -#***************************** -# FOR PGI PGF90 COMPILER -#***************************** -# (-g) for debugging, (-Kieee) for IEEE, (-Mfree) for free format -#F_COMP=/usr/local/pgi/linux86-64/15.10/bin/pgf90 -#F_OPTS1=-Mfree -O1 -Kieee -#F_OPTS2=-Mfree -O2 -Kieee -#LOADER_OPTS=-Mfree -O2 -Kieee -#LIBS= - -#***************************** -# FOR GFORTRAN COMPILER -#***************************** -# (-Wall) for warnings, (-ffree-form) for free format -# (-fno-sign-zero) for not making zeros negative values -# (-fcheck=bounds) check for array bounds issues -# (-fcheck=all) all runtime checking -#F_COMP=/usr/bin/gfortran -#F_OPTS1=-ffree-form -O1 -#F_OPTS2=-ffree-form -O2 -#LOADER_OPTS=-ffree-form -O2 -#LIBS=-L/usr/lib/x86_64-linux-gnu -lrt -lpthread - -############################################################################# -# LINUX C compiler choice and flags (gcc) -############################################################################# -C_COMP=mpicc -C_OPTS=-O3 -DUNDERSCORE -DLITTLE - -############################################################################# -# System archive command syntax -############################################################################# -ARCH=ar rs - -############################################################################# -# MPI - parallel processing choices -############################################################################# -PAR_LIBS= #leave blank (override below if using MPI) -PAR_DEFS= #leave blank (override below if using MPI) -#---------------------------------------------------------------------------- -# If using MPI libraries: -#---------------------------------------------------------------------------- -#---------------LINUX MPICH---------------------------------------------------- -#PAR_INCS=-I$(MPI_ROOT)/include -#PAR_LIBS=-L$(MPI_ROOT)/lib -lmpich -lmpl -llmpe -PAR_DEFS=-DRAMS_MPI - -#---------------LINUX OPENMPI------------------------------------------------ -#PAR_INCS=-I$(MPI_ROOT)/include -#PAR_LIBS=-L$(MPI_ROOT)/lib -lmpi -#PAR_DEFS=-DRAMS_MPI diff --git a/docs/ComputerDocs-Cheyenne/Scripts_and_Files/repack_files b/docs/ComputerDocs-Cheyenne/Scripts_and_Files/repack_files deleted file mode 100644 index 2e00507..0000000 --- a/docs/ComputerDocs-Cheyenne/Scripts_and_Files/repack_files +++ /dev/null @@ -1,52 +0,0 @@ -#!/usr/bin/env bash - -############################################################################################## -# Script to repack (compress) HDF5 simulation output files - -Usage="USAGE: $0 " - -if [ "$1" == "" ] -then - echo "ERROR: must supply one argument to script" - echo "" - echo $Usage - exit -1 -fi - -RamsinFile=$1 - -GzipLevel=6 - -# Get the analysis file prefix out of the ramsin file, and use -# this for a pattern match to find the rams output files for this -# simulation. -# -# The first sed filter is to get rid of comments (don't want to pick up a commented -# out value for AFILEPREF) -FilePref=$(sed 's/[!].*//g' $RamsinFile | grep AFILEPREF | sed -e 's/.*=//' -e "s/[', \t]//g") - -for RamsFile in ${FilePref}*.h5 -do - echo "***************** $RamsFile ****************************" - NumGzipDsets=$(h5stat --dset $RamsFile | grep GZIP | sed 's/GZIP filter: //') - if [ $NumGzipDsets -gt 0 ] - then - echo "File is already compressed" - else - echo "File needs to be compressed" - - TempFile="${RamsFile}.temp" - RepackCmd="h5repack -f SHUF -f GZIP=$GzipLevel $RamsFile $TempFile" - echo "$RepackCmd" - $RepackCmd - - # only replace the original file if the repack command succeeded - if [ $? -eq 0 ] - then - MvCmd="mv $TempFile $RamsFile" - echo "$MvCmd" - $MvCmd - fi - fi -done - diff --git a/docs/ComputerDocs-Cheyenne/Scripts_and_Files/restart_job b/docs/ComputerDocs-Cheyenne/Scripts_and_Files/restart_job deleted file mode 100644 index d925327..0000000 --- a/docs/ComputerDocs-Cheyenne/Scripts_and_Files/restart_job +++ /dev/null @@ -1,132 +0,0 @@ -#!/usr/bin/env bash - -############################################################################################## -# Script to automatically restart a RAMS simulation (HISTORY start). -# -# This is useful after starting the first run (RUNTYPE = 'INITIAL'), and you want -# to automatically fire off a new job via a history start (RUNTYPE = 'HISTORY'). - -Usage="USAGE: $0 " - -if [ $# != 3 ] -then - echo "ERROR: must supply exactly three arguments to script" - echo "" - echo $Usage - exit -1 -fi - -QsubScript=$1 -RamsFile=$2 -EndRamsFile=$3 - -echo "***************************************************************" -echo "Attempting to restart RAMS job" -echo " qsub script: $QsubScript" -echo " ramsin file: $RamsFile" -echo " end rams file: $EndRamsFile" -echo "" - -RamsFileTemplate="${RamsFile}.template" -if [ ! -f $RamsFileTemplate ] -then - echo "ERROR: cannot read RAMSIN template file: $RamsFileTemplate" - echo "" - echo $Usage - exit -2 -fi - -# Get the pbs job name from the qsub script file and see if the job is running. -# Unfortunately, the only way I know of getting the full job name is through -# the "qstat -f job_id" invocation of qstat. Doing less verbose options of qstat -# will truncate the name if longer than 11 or 15 characters. So, do an initial -# qstat to find the all of this users jobs that are in the queue, and check each -# one to see if it matches the full job name. -JobName=$(grep PBS $QsubScript | grep "\-N" | sed 's/.* //') -UserName=$(id -un) -NumJobsRunning=$( - for JobId in $(qstat -u $UserName | grep $UserName | sed 's/\..*//') - do - qstat -f $JobId | grep Job_Name | sed 's/.* //' - done | grep -c "^${JobName}$" - ) - -if [ $NumJobsRunning -gt 0 ] -then - echo "Job is still running, try again later" - exit 0 -fi - -# If we made it here, we are going to attempt a history start. -# -# Determine the file to use for the history start. Use either the last or next -# to last of the header files. The idea is that the RAMS analysis files are -# written before the header file so if a header file exists, the associated -# analysis files are intact. Ideally, you want to use the latest header file, -# but if the job died during the write of that header file, the restart won't -# work. If that's the case, the last header file will not match in size with -# the second to the last header file. In this case the second to last header -# file should be used for the restart. -# - If there are not at least two header files, then might as well do an -# initial run again. -# - If the sizes of the final two header files match, then use the final -# header file. -# - If the sizes don't match, use the second to last header file. - -# Get the analysis file prefix out of the RAMS file. -FilePref="$(sed 's/[!].*//g' $RamsFile | grep AFILEPREF | sed -e 's/.*=//' -e "s/[', \t]//g")-A-" - -# Set positional parameters to the final two header files. If there are < 2 files, -# then bail out. HeadFile1 will be the second to last file, HeadFile2 will be -# the last file. -set -- $(ls ${FilePref}*-head.txt | tail -n 2) -HeadFile1=$1 -HeadFile2=$2 -if [ "$HeadFile1" == "" ] || [ "$HeadFile2" == "" ] -then - echo "Not enough header files for a restart. Redo the INITIAL run." - exit 0 -fi - -# Get the sizes of the two header files. If sizes match, use header 2. -# If sizes don't match, use header 1. -SizeHF1=$(wc -c $HeadFile1 | sed 's/ .*//') -SizeHF2=$(wc -c $HeadFile2 | sed 's/ .*//') - -if [ $SizeHF1 -eq $SizeHF2 ] -then - RestartFile=$HeadFile2 -else - RestartFile=$HeadFile1 -fi - -# Check the restart file to see if it matches the end file. If so, then the -# job has completed in which case the restart is not necessary. -if [ "$RestartFile" == "$EndRamsFile" ] -then - echo "Job has completed, skipping restart." - exit 0 -fi - -# Change HFILIN to the new restart file in the RAMS file -# Use "@" for delimiter in the substitue command for sed below since -# RestartFile can contain slashes. -sed "s@@$RestartFile@g" $RamsFileTemplate > ${RamsFile}.temp -if [ $? -ne 0 ] -then - echo "Error occurred while attempting to change HFILIN in $RamsFile" - echo "Skipping the restart" - exit -3 -else - mv ${RamsFile}.temp $RamsFile -fi - -# Fire off the history restart -QsubCmd="qsub ./$QsubScript" - -echo "Restarting RAMS:" -echo " HFILIN: $RestartFile" -echo " Command: $QsubCmd" -echo "" - -$QsubCmd diff --git a/docs/ComputerDocs-Cheyenne/Scripts_and_Files/restart_rce_sims b/docs/ComputerDocs-Cheyenne/Scripts_and_Files/restart_rce_sims deleted file mode 100644 index 9a45bfb..0000000 --- a/docs/ComputerDocs-Cheyenne/Scripts_and_Files/restart_rce_sims +++ /dev/null @@ -1,17 +0,0 @@ -#!/usr/bin/env bash - -############################################################################################## -# Script to restart a list of RCE simulations - -#SimList="RCE_3km_1mom_db_udef RCE_3km_1mom_db_rlongup RCE_3km_2mom_db_udef RCE_3km_2mom_db_rlongup" -SimList="RCE_CHAN_S300" - -echo "Restarting RCE simulations: $SimList" -echo - -for Sim in $SimList -do - cd $HOME/Sims/${Sim} - restart_job run_rams RAMSIN ./RAMS/${Sim}-A-2012-04-30-000000-head.txt - echo -done diff --git a/docs/ComputerDocs-Cheyenne/Scripts_and_Files/restart_tsd_1grid b/docs/ComputerDocs-Cheyenne/Scripts_and_Files/restart_tsd_1grid deleted file mode 100644 index b4fbe9d..0000000 --- a/docs/ComputerDocs-Cheyenne/Scripts_and_Files/restart_tsd_1grid +++ /dev/null @@ -1,9 +0,0 @@ -#!/usr/bin/env bash - -############################################################################################## -# Script to restart the 1 grid TS Debby simulation - -#cd $HOME/Sims/TSD_SPIN_UP_1G -#restart_job run_rams RAMSIN.spin_up ./RAMS/TSD_SPIN_UP_1G-A-2006-08-22-060000-head.txt -cd $HOME/Sims/TSD_SD_1G -restart_job run_rams RAMSIN ./RAMS/TSD_SD_1G-A-2006-08-24-180000-head.txt diff --git a/docs/ComputerDocs-Cheyenne/Scripts_and_Files/restart_tsd_1km b/docs/ComputerDocs-Cheyenne/Scripts_and_Files/restart_tsd_1km deleted file mode 100644 index adfe8b9..0000000 --- a/docs/ComputerDocs-Cheyenne/Scripts_and_Files/restart_tsd_1km +++ /dev/null @@ -1,7 +0,0 @@ -#!/usr/bin/env bash - -############################################################################################## -# Script to restart the 1 grid TS Debby simulation - -cd $HOME/Sims/TSD_SD_1KM -restart_job run_rams RAMSIN ./RAMS/TSD_SD_1G-A-2006-08-24-140000-head.txt diff --git a/docs/ComputerDocs-Cheyenne/Scripts_and_Files/restart_tsd_3grids b/docs/ComputerDocs-Cheyenne/Scripts_and_Files/restart_tsd_3grids deleted file mode 100644 index 97a72fb..0000000 --- a/docs/ComputerDocs-Cheyenne/Scripts_and_Files/restart_tsd_3grids +++ /dev/null @@ -1,9 +0,0 @@ -#!/usr/bin/env bash - -############################################################################################## -# Script to restart the 3 grid TS Debby simulation - -#cd $HOME/Sims/TSD_SPIN_UP -#restart_job run_rams RAMSIN.spin_up ./RAMS/TSD_SPIN_UP-A-2006-08-22-060000-head.txt -cd $HOME/Sims/TSD_SD -restart_job run_rams RAMSIN ./RAMS/TSD_SD-A-2006-08-24-180000-head.txt diff --git a/docs/ComputerDocs-Cheyenne/Scripts_and_Files/restart_tsd_500m b/docs/ComputerDocs-Cheyenne/Scripts_and_Files/restart_tsd_500m deleted file mode 100644 index 2f7903b..0000000 --- a/docs/ComputerDocs-Cheyenne/Scripts_and_Files/restart_tsd_500m +++ /dev/null @@ -1,7 +0,0 @@ -#!/usr/bin/env bash - -############################################################################################## -# Script to restart the 1 grid TS Debby simulation - -cd $HOME/Sims/TSD_SD_500M -restart_job run_rams RAMSIN ./RAMS/TSD_SD_1G-A-2006-08-24-140000-head.txt diff --git a/docs/ComputerDocs-Cheyenne/Scripts_and_Files/run_rams b/docs/ComputerDocs-Cheyenne/Scripts_and_Files/run_rams deleted file mode 100644 index 3022384..0000000 --- a/docs/ComputerDocs-Cheyenne/Scripts_and_Files/run_rams +++ /dev/null @@ -1,22 +0,0 @@ -#!/bin/bash -### Job Name -#PBS -N RceChS300 -### Project code -#PBS -A UCSU0054 -#PBS -l walltime=12:00:00 -#PBS -q economy -### Output and error files -#PBS -e LOG_FILES -#PBS -o LOG_FILES -### Select 42 nodes with 36 CPUs each for a total of 1512 MPI processes -### This yields an average of 397 columns/core -#PBS -l select=42:ncpus=36:mpiprocs=36 -### Send email on abort, begin and end -#PBS -m abe -### Specify mail recipient -#PBS -M stephen.herbener@colostate.edu - -### Run the executable -export MPI_TYPE_DEPTH=20 -#mpiexec_mpt dplace -s 1 ./rams -f RAMSIN -/glade/u/home/stephenh/Rams/misc/mpich2-1.4.1-install/bin/mpirun -np 1512 ./rams -f RAMSIN diff --git a/docs/ComputerDocs-Cheyenne/Scripts_and_Files/x.repack.sh b/docs/ComputerDocs-Cheyenne/Scripts_and_Files/x.repack.sh deleted file mode 100644 index ef08f8a..0000000 --- a/docs/ComputerDocs-Cheyenne/Scripts_and_Files/x.repack.sh +++ /dev/null @@ -1,287 +0,0 @@ -#! /bin/bash -############################################################## -# Program: x.repack.sh -# Programmer: Robert Seigel -# University of Miami -# rseigel@rsmas.miami.edu -# 16 March 2013 -# Execute: x.repack.sh [] [] -# : surface or analysis MANDATORY -# []: MANDATORY if = analysis -# If using LSF job execution, then -# = Job Name -# If NOT using LSF job execution, then -# = 6.0-opt, if the -# executable is rams-6.0-opt -# []: OPTIONAL 3rd argument if RAMS has already -# finished and the user wants to repack all -# files in the supplied directory -# *** dummy argument 2 still required *** -# Purpose: This script repacks the HDF5 files while a distributive -# memory RAMS run is occurring. Because Parallel HDF5 is -# not yet supporting online compression, this script -# takes its place to conserve disk space. -# Overview: This script runs while RAMS is running. It first looks -# in RAMSIN to find where the files are being written. -# Then, it iteratively checks to see if new files are -# created. If a new file is output, it waits until the -# file is created and then uses h5repack to repack -# the HDF5 file. Once the RAMS processes are finished, -# x.repack.sh will terminate. -# -#****************************************************************** -# It is suggested to run this process in the background, as -# simulations often take a long time. To do so, here is an example: -# nohup x.repack.sh analysis 6.0-opt > repack.txt & -# This will execute x.repack.sh to repack the HDF5 analysis files -# that are output from rams-6.0-opt. The script output is placed -# in repack.txt for reference. -############################################################## - - -############################################################## -# FUNCTION to find the new file and repack it according to -# specified gzip level -repack () -{ - echo "Start repack" - - # Initialize some variables if this is our first entry into this routine - if [ $lastmod -eq 0 ]; then - newmod=0 - oldfsize=0 - fi - - # Loop over .h5 files in requested directory - for f in $thisdir*'.h5' - do - - # get time since file was last modified - modsecs=$(date --utc --reference=$f +%s) - nowsecs=$(date +%s) - delta=$(($nowsecs-$modsecs)) - filesize=$(stat -c%s "$f") - - # Test if the following are true in order to repack the file - # (1) Current file AGE is LE user-defined age threshold (filter out old sims) - # (2) Current file is EITHER (1) newer than previous file OR - # (2) larger than previous file - # (3) Current file SIZE is GT user-defined size threshold (filter out already - # repacked files) - if [[ $delta -le $repacksecs ]] && \ - [[ ( $modsecs -gt $lastmod || $filesize -gt $prevfilesize ) ]] && \ - [[ $filesize -gt $unpackFsize ]]; then - - # Wait UNTIL header file exists to make sure HDF5 write is done - if [ $runtype == "analysis" ]; then - hfile=${f:0:$((${#f}-5))}'head.txt' - - until [ -e $hfile ]; do sleep 1; done - - # Case where file is being overwritten - until [ ! $hfile -ot $f ]; do sleep 2; done - - # In case the header file is big - sleep 3 - fi - - # Repack the file - echo "h5repack -f SHUF -f GZIP=$gziplevel $f $f.temp" #***UNCOMMENT - h5repack -f SHUF -f GZIP=$gziplevel $f $f.temp #***UNCOMMENT - mv $f.temp $f #***UNCOMMENT - echo "New file $f has been repacked because it was created $delta secs ago" - newmod=$(date --utc --reference=$f +%s) - - # Now copy the file to a remote computer. RSA keys have already been generated. - #scp $f ldgrant@frost.atmos.colostate.edu:$supcelldir - #scp $hfile ldgrant@frost.atmos.colostate.edu:$supcelldir -# scp $f $copydir -# scp $hfile $copydir - - fi - prevfilesize=$(stat -c%s "$f") - - done - lastmod=$newmod -} -###################################################################################### -###################################################################################### -# ONLYEDIT THESE - -#set -x - -# Define some parameters -exectype=1 # Type of job execution. - # 1 = LSF - # 2 = Standard way, using a direct call to MPI -runtype=$1 # this is either surface or analysis from command line -ramsname=$2 # second command line input *MANDATORY for analysis* - # This is not used if exectype=1 -#repacksecs=108000 # maximum age in seconds of a file that is to be repacked (30 h) -repacksecs=1080000 # maximum age in seconds of a file that is to be repacked (30 h) -unpackFsize=5000 # megabyte threshold for unpacked file size (~ 5G) -#unpackFsize=1 # megabyte threshold for unpacked file size (~ 1M) -gziplevel=6 # gzip level -checkint=120 # in seconds -#supcelldir='/tasman/ldgrant/LPsup_300/' # Directory for file transfers -#copydir='ldgrant@frost.atmos.colostate.edu:/tasman/ldgrant/LPsup_300/z.'$2'/' # Directory for file transfers -#echo "copydir: $copydir" - -# END ONLYEDIT -###################################################################################### -###################################################################################### -# Perform some checks - -# Did the user input the process name during an analysis repack? -if [ "$ramsname" == "rams-" -a "$runtype" == "analysis" ]; then - echo 'Please specify the RAMS executable name, excluding rams-' - exit -fi -# Is the user exercising the 3rd argument? If so, dont read RAMSIN -if [ -z "$3" ]; then - RAMSINread=1 -else - RAMSINread=0 -fi -# Convert file size to megabytes -unpackFsize=$((unpackFsize*1024*1024)) - -############################################################## -# First Read RAMSIN to grab file locations -# This method is based on the fact that each RAMSIN parameter -# is preceeded by THREE SPACES. -if [ $RAMSINread -eq 1 ]; then - # TOPFILES - # find the line - topdir=`egrep '^ TOPFILES' RAMSIN` - # remove suffix from 2nd single quote - topdir=${topdir%\'*} - # remove prefix from 1st single quote - topdir=${topdir#*\'} - - # SFCFILES - sfcdir=`egrep '^ SFCFILES' RAMSIN` - sfcdir=${sfcdir%\'*} - sfcdir=${sfcdir#*\'} - - # SSTFILES - sstdir=`egrep '^ SSTFPFX' RAMSIN` - sstdir=${sstdir%\'*} - sstdir=${sstdir#*\'} - - # NDVIFILES - ndvidir=`egrep '^ NDVIFPFX' RAMSIN` - ndvidir=${ndvidir%\'*} - ndvidir=${ndvidir#*\'} - - # ANALFILES - analdir=`egrep '^ AFILEPREF' RAMSIN` - analdir=${analdir%\'*} - analdir=${analdir#*\'} -fi - -############################################################## -# Execute repacking of HDF5 files - -if [ -z "$3" ]; then - if [ "$runtype" == "surface" ]; then - - # topo files - lastmod=0 - thisdir=$topdir - repack - - # sfc files - lastmod=0 - thisdir=$sfcdir - repack - - # sst files - lastmod=0 - thisdir=$sstdir - repack - - # ndvi files - lastmod=0 - thisdir=$ndvidir - repack - - elif [ "$runtype" == "analysis" ]; then - - # Copy RAMSIN to the directory on frost - #scp RAMSIN ldgrant@frost.atmos.colostate.edu:$supcelldir -# scp RAMSIN $copydir - - - # analysis files - thisdir=$analdir - - # Determine job string for repack execution - if [ $exectype -eq 1 ]; then # LSF - jobout=$(bjobs | grep $ramsname | grep RUN 2>&1 | sed "s/ .*//") - elif [ $exectype -eq 2 ]; then # Standard - jobout=$(pidof -s $ramsname) - fi - echo "jobout1: $jobout" - - # Initialize filecounts. - # The repacking process can take a long time. During the repacking, files - # may be generated and the loop in 'repack' does not see them. These vars - # will test if new files have been created. - prefilecount=`ls -1 $thisdir*'.h5' | wc -l` - postfilecount=0 - echo "prefilecount, postfilecount: $prefilecount $postfilecount" - - # Continue to execute repack if (1) the model is running OR - # (2) the number of files have changed since - # last repack, i.e. new files were generated - lastmod=0 - while [[ -n "$jobout" ]] || [[ $prefilecount -ne $postfilecount ]] - do - - # Reset prefilecount before repack call - prefilecount=`ls -1 $thisdir*'.h5' | wc -l` - - # Execute the repack function. - repack - - # Regrab file count. If this number is different than prefilecount, the - # repack function will execute again - postfilecount=`ls -1 $thisdir*'.h5' | wc -l` - echo "prefilecount, postfilecount: $prefilecount $postfilecount" - - # execute time controller - sleep $checkint - - # Check again for job name to see if it finished - # Determine job string for repack execution - if [ $exectype -eq 1 ]; then # LSF - jobout=$(bjobs | grep $ramsname | grep RUN 2>&1) - elif [ $exectype -eq 2 ]; then # Standard - jobout=$(pidof -s $ramsname) - fi - echo "jobout2: $jobout" - done - # One final check after while loop to catch the ending file - #repack - - # We are done - echo $ramsname" finished and x.repack.sh is terminating" - else - echo "Runtype not recognized!" - echo "Runtype must be either 'surface' or 'analysis'" - exit - fi -else - lastmod=0 - repacksecs=31556900 # seconds in a year. If files are older, change. - thisdir=$3 # set directory to third argumemnt - repack - exit -fi - -exit - -############################################################### - - diff --git a/docs/ComputerDocs-Cheyenne/include.mk.cheyenne.mylibs b/docs/ComputerDocs-Cheyenne/include.mk.cheyenne.mylibs deleted file mode 100644 index 4372cd1..0000000 --- a/docs/ComputerDocs-Cheyenne/include.mk.cheyenne.mylibs +++ /dev/null @@ -1,117 +0,0 @@ -############################################################################# -# Define make (gnu make works best) -############################################################################# -MAKE=/usr/bin/make - -############################################################################# -# Set your RAMS root path and version number -############################################################################# -RAMS_ROOT=/glade/u/home/stephenh/Rams/rams_20171109_rce_6.2.08 -RAMS_VERSION=6.2.08 - -HDF5_ROOT=/glade/u/home/stephenh/Rams/misc/hdf5-1.8.9-install -MPI_ROOT=/glade/u/home/stephenh/Rams/misc/mpich2-1.4.1-install - -MODEL=$(RAMS_ROOT)/src/$(RAMS_VERSION) -UTILS_INCS=-I$(MODEL)/include - -############################################################################# -# HDF libraries -# Note that linking libraries below are in a particular order to work! -############################################################################# -HDF5_LIBS=-L$(HDF5_ROOT)/lib -lhdf5_hl -lhdf5 -lz -HDF5_INCS=-I$(HDF5_ROOT)/include -HDF5_DEFS= - -############################################################################# -# TYPE OF COMPUTER SYSTEM (used for DEFINE statements for intrinsic calls) -############################################################################# -CMACH=PC_LINUX1 #Standard Linux (only option available now) - -############################################################################# -# UNCOMMENT 1 LINUX FORTRAN COMPILER SET OF FLAGS BELOW -############################################################################# -# Note that some Fortran optimizations greater than -O1 will not necessarily -# produce identical results when running same executable multiple times. -# This is perhaps due to order of operations or unrolling loop order that -# changes solutions slightly. This is not ideal for research applications -# involving sensitivity studies that require exact duplication. As such, -# the Makefile is setup to allow different optimizations for different source -# files. The F_OPTS1 and F_OPTS2 variables below can hold different compiler -# flags as needed. Further, for duplication of results you may need to force -# IEEE standard which is done in examples below. -# Please coordinate variables below with the commands in the Makefile. -# Mandatory fortran variables are (F_COMP, F_OPTS1, F_OPTS2, LOADER,OPTS). - -#Definitions of compiler flags below -# F_COMP = path to compiler executable -# F_OPTS1 = Uses of flags for lower optimization for some files -# F_OPTS2 = Uses of flags for higher optimization for some files -# LOADER_OPTS = Flags and optimaztion for LOADER -# LIBS = Extra system libraries for linking that some compilers need - -#***************************** -# FOR INTEL IFORT COMPILER -#***************************** -# (-g) for debugging, (-traceback) for more compiler error info -# (-check bounds) for array bounds checking, (-fp-model precise) for IEEE -# (-check uninit) for finding uninitialized variables, (-free) for free format -F_COMP=ifort -F_OPTS=-free -static-intel -fp-model precise -traceback -march=corei7 -axAVX -F_OPTS1=-O1 $(F_OPTS) -F_OPTS2=-O2 $(F_OPTS) - -LOADER=$(F_COMP) -LOADER_OPTS=$(F_OPTS2) - -#***************************** -# FOR PGI PGF90 COMPILER -#***************************** -# (-g) for debugging, (-Kieee) for IEEE, (-Mfree) for free format -#F_COMP=/usr/local/pgi/linux86-64/15.10/bin/pgf90 -#F_OPTS1=-Mfree -O1 -Kieee -#F_OPTS2=-Mfree -O2 -Kieee -#LOADER_OPTS=-Mfree -O2 -Kieee -#LIBS= - -#***************************** -# FOR GFORTRAN COMPILER -#***************************** -# (-Wall) for warnings, (-ffree-form) for free format -# (-fno-sign-zero) for not making zeros negative values -# (-fcheck=bounds) check for array bounds issues -# (-fcheck=all) all runtime checking -#F_COMP=/usr/bin/gfortran -#F_OPTS1=-ffree-form -O1 -#F_OPTS2=-ffree-form -O2 -#LOADER_OPTS=-ffree-form -O2 -#LIBS=-L/usr/lib/x86_64-linux-gnu -lrt -lpthread - -############################################################################# -# LINUX C compiler choice and flags (gcc) -############################################################################# -C_COMP=$(MPI_ROOT)/bin/mpicc -C_OPTS=-O3 -DUNDERSCORE -DLITTLE - -############################################################################# -# System archive command syntax -############################################################################# -ARCH=ar rs - -############################################################################# -# MPI - parallel processing choices -############################################################################# -#PAR_LIBS= #leave blank (override below if using MPI) -#PAR_DEFS= #leave blank (override below if using MPI) -#---------------------------------------------------------------------------- -# If using MPI libraries: -#---------------------------------------------------------------------------- -#---------------LINUX MPICH---------------------------------------------------- -PAR_INCS=-I$(MPI_ROOT)/include -PAR_LIBS=-L$(MPI_ROOT)/lib -lmpich -lmpl -llmpe -lrt -PAR_DEFS=-DRAMS_MPI - -#---------------LINUX OPENMPI------------------------------------------------ -#PAR_INCS=-I$(MPI_ROOT)/include -#PAR_LIBS=-L$(MPI_ROOT)/lib -lmpi -#PAR_DEFS=-DRAMS_MPI diff --git a/docs/GridStruct3D.pdf b/docs/GridStruct3D.pdf new file mode 100644 index 0000000..7077f99 Binary files /dev/null and b/docs/GridStruct3D.pdf differ diff --git a/docs/GridStructXY.pdf b/docs/GridStructXY.pdf new file mode 100644 index 0000000..4ebefa9 Binary files /dev/null and b/docs/GridStructXY.pdf differ diff --git a/docs/GridStructXZ.pdf b/docs/GridStructXZ.pdf new file mode 100644 index 0000000..0fd9d38 Binary files /dev/null and b/docs/GridStructXZ.pdf differ diff --git a/docs/RAMS-Namelist.pdf b/docs/RAMS-Namelist.pdf index b1665e9..7b34e13 100644 Binary files a/docs/RAMS-Namelist.pdf and b/docs/RAMS-Namelist.pdf differ diff --git a/docs/RAMS-OutputVariablesREVU.pdf b/docs/RAMS-OutputVariablesREVU.pdf index 8db4d45..b9d4edb 100644 Binary files a/docs/RAMS-OutputVariablesREVU.pdf and b/docs/RAMS-OutputVariablesREVU.pdf differ diff --git a/docs/RAMS-Updates.pdf b/docs/RAMS-Updates.pdf index 4f50c52..8086d32 100644 Binary files a/docs/RAMS-Updates.pdf and b/docs/RAMS-Updates.pdf differ diff --git a/docs/RAMS-VariableList.pdf b/docs/RAMS-VariableList.pdf index 9b1c80e..19ca5a9 100644 Binary files a/docs/RAMS-VariableList.pdf and b/docs/RAMS-VariableList.pdf differ diff --git a/docs/RAMS-radiation-bands.pdf b/docs/RAMS-radiation-bands.pdf new file mode 100644 index 0000000..3ac851c Binary files /dev/null and b/docs/RAMS-radiation-bands.pdf differ diff --git a/docs/README-FIRST-RAMS.pdf b/docs/README-FIRST-RAMS.pdf index 0444e75..9adf835 100644 Binary files a/docs/README-FIRST-RAMS.pdf and b/docs/README-FIRST-RAMS.pdf differ diff --git a/etc/RTE-RRTMGP/aero2rrtmgp_lw.nc b/etc/RTE-RRTMGP/aero2rrtmgp_lw.nc new file mode 100644 index 0000000..1484406 Binary files /dev/null and b/etc/RTE-RRTMGP/aero2rrtmgp_lw.nc differ diff --git a/etc/RTE-RRTMGP/aero2rrtmgp_sw.nc b/etc/RTE-RRTMGP/aero2rrtmgp_sw.nc new file mode 100644 index 0000000..eaecf93 Binary files /dev/null and b/etc/RTE-RRTMGP/aero2rrtmgp_sw.nc differ diff --git a/etc/RTE-RRTMGP/garand-atmos-1.nc b/etc/RTE-RRTMGP/garand-atmos-1.nc new file mode 100644 index 0000000..fa92c2e Binary files /dev/null and b/etc/RTE-RRTMGP/garand-atmos-1.nc differ diff --git a/etc/RTE-RRTMGP/mic2rrtmgp_lw.nc b/etc/RTE-RRTMGP/mic2rrtmgp_lw.nc new file mode 100644 index 0000000..648bb60 Binary files /dev/null and b/etc/RTE-RRTMGP/mic2rrtmgp_lw.nc differ diff --git a/etc/RTE-RRTMGP/mic2rrtmgp_sw.nc b/etc/RTE-RRTMGP/mic2rrtmgp_sw.nc new file mode 100644 index 0000000..1a64093 Binary files /dev/null and b/etc/RTE-RRTMGP/mic2rrtmgp_sw.nc differ diff --git a/etc/RTE-RRTMGP/rrtmgp-allsky.nc b/etc/RTE-RRTMGP/rrtmgp-allsky.nc new file mode 100644 index 0000000..de97d57 Binary files /dev/null and b/etc/RTE-RRTMGP/rrtmgp-allsky.nc differ diff --git a/etc/RTE-RRTMGP/rrtmgp-cloud-optics-coeffs-lw.nc b/etc/RTE-RRTMGP/rrtmgp-cloud-optics-coeffs-lw.nc new file mode 100644 index 0000000..f3cb190 Binary files /dev/null and b/etc/RTE-RRTMGP/rrtmgp-cloud-optics-coeffs-lw.nc differ diff --git a/etc/RTE-RRTMGP/rrtmgp-cloud-optics-coeffs-reordered-sw.nc b/etc/RTE-RRTMGP/rrtmgp-cloud-optics-coeffs-reordered-sw.nc new file mode 100644 index 0000000..2a98593 Binary files /dev/null and b/etc/RTE-RRTMGP/rrtmgp-cloud-optics-coeffs-reordered-sw.nc differ diff --git a/etc/RTE-RRTMGP/rrtmgp-data-lw-g128-210809.nc b/etc/RTE-RRTMGP/rrtmgp-data-lw-g128-210809.nc new file mode 100644 index 0000000..cf117a3 Binary files /dev/null and b/etc/RTE-RRTMGP/rrtmgp-data-lw-g128-210809.nc differ diff --git a/etc/RTE-RRTMGP/rrtmgp-data-lw-g256-2018-12-04.nc b/etc/RTE-RRTMGP/rrtmgp-data-lw-g256-2018-12-04.nc new file mode 100644 index 0000000..c66d3a5 Binary files /dev/null and b/etc/RTE-RRTMGP/rrtmgp-data-lw-g256-2018-12-04.nc differ diff --git a/etc/RTE-RRTMGP/rrtmgp-data-sw-g112-210809.nc b/etc/RTE-RRTMGP/rrtmgp-data-sw-g112-210809.nc new file mode 100644 index 0000000..84f7bd8 Binary files /dev/null and b/etc/RTE-RRTMGP/rrtmgp-data-sw-g112-210809.nc differ diff --git a/etc/RTE-RRTMGP/rrtmgp-data-sw-g224-2018-12-04.nc b/etc/RTE-RRTMGP/rrtmgp-data-sw-g224-2018-12-04.nc new file mode 100644 index 0000000..2ed67d1 Binary files /dev/null and b/etc/RTE-RRTMGP/rrtmgp-data-sw-g224-2018-12-04.nc differ diff --git a/etc/RTE-RRTMGP/rrtmgp-solar-var-tables.nc b/etc/RTE-RRTMGP/rrtmgp-solar-var-tables.nc new file mode 100644 index 0000000..3545eb2 Binary files /dev/null and b/etc/RTE-RRTMGP/rrtmgp-solar-var-tables.nc differ diff --git a/include.mk b/include.mk index 47aaf10..c97acfe 100644 --- a/include.mk +++ b/include.mk @@ -1,3 +1,17 @@ +# NOTES: +# For doing parallel simulations, compile MPICH or OPENMPI with both FORTRAN +# and C bindings turned on like the following configure statement for +# compiling MPICH. Most of the time you enter the software package main +# directory, issue the "configure" command, run "make", and then "make install". +# For the configure statement to work, your ".bash_profile" needs to know "which" +# C and Fortran compilers you are using. After compiling MPICH in this example, +# it will create "mpif90" and "mpicc" that you can use in this include.mk file +# for "F_COMP" and "C_COMP" env variables below. Make sure the paths to these +# compilers and associated libraries are in your .bash_profile PATH and +# LD_LIBRARY_PATH as needed. +# ./configure --prefix=/file-path-here-for-mpi/mpich-3.3.2 \ +# --enable-fast=O3 CPPFLAGS=-DNDEBUG CC=gcc FC=ifort + ############################################################################# # Define make (gnu make works best). ############################################################################# @@ -6,8 +20,8 @@ MAKE=/usr/bin/make ############################################################################# # Set your RAMS root path and version number. ############################################################################# -RAMS_ROOT=/home/smsaleeb/rams_20210806_dev -RAMS_VERSION=6.3.02 +RAMS_ROOT=/home/smsaleeb/rams_git_dev +RAMS_VERSION=6.3.04 ############################################################################# # Set root locations for HDF5 I/O software. @@ -15,18 +29,26 @@ RAMS_VERSION=6.3.02 # Typically can use "parallel" for either, but some supercomputers require # use of the serial executable. ############################################################################# -HDF5_ROOT=/home/smsaleeb/software/hdf5-1.10.7 +HDF5_ROOT= +#/share/apps/hdf5-1.10.1/intel ############################################################################# # Set root locations for parallel processing MPI software. # You can comment out MPI_ROOT for serial processing compile. ############################################################################# -MPI_ROOT=/home/smsaleeb/software/mpich-3.3.2 +#MPI_ROOT=/share/apps/openmpi-3.1.2/intel-2019 +MPI_ROOT=/share/apps/22.04/openmpi/4.1.5 + +############################################################################# +# RTE+RRTMGP requires netcdf +############################################################################# +#NETCDF_FORTRAN_ROOT= +#NETCDF_C_ROOT= ############################################################################# # Do not change these 2. They point from RAMS_ROOT to the source code. ############################################################################# -MODEL=$(RAMS_ROOT)/src/$(RAMS_VERSION) +MODEL=$(RAMS_ROOT)/src UTILS_INCS=-I$(MODEL)/include ############################################################################# @@ -40,8 +62,11 @@ UTILS_INCS=-I$(MODEL)/include #HDF5_LIBS=-L$(HDF5_ROOT)/lib -lhdf5_hl -lhdf5 \ # -Wl,-rpath,/home/smsaleeb/software/szip-2.1/lib \ # -Wl,-rpath,/home/smsaleeb/software/zlib-1.2.5/lib -HDF5_LIBS=-L$(HDF5_ROOT)/lib -lhdf5_hl -lhdf5 -HDF5_INCS=-I$(HDF5_ROOT)/include +#HDF5_LIBS=-L$(HDF5_ROOT)/lib -lhdf5_hl -lhdf5 +#HDF5_INCS=-I$(HDF5_ROOT)/include +#HDF5_DEFS= +HDF5_LIBS= -lhdf5_hl -lhdf5 +HDF5_INCS= HDF5_DEFS= ############################################################################# @@ -78,7 +103,8 @@ CMACH=PC_LINUX1 #Standard Linux (only option available now) # (-g) for debugging, (-traceback) for more compiler error info # (-check bounds) for array bounds checking, (-fp-model precise) for IEEE # (-check uninit) for finding uninitialized variables, (-free) for free format -F_COMP=/home/smsaleeb/intel/composer_xe_2011_sp1.8.273/bin/intel64/ifort +#F_COMP=/home/smsaleeb/intel/composer_xe_2011_sp1.8.273/bin/intel64/ifort +F_COMP=/home/smsaleeb/software/mpich-3.3.2/bin/mpif90 F_OPTS1=-free -O1 -fp-model precise F_OPTS2=-free -O2 -fp-model precise LOADER_OPTS= -free -O2 -fp-model precise @@ -115,16 +141,21 @@ LIBS=-L/usr/lib/x86_64-linux-gnu -lrt -lpthread -lsz -lz # (-fno-sign-zero) for not making zeros negative values # (-fcheck=bounds) check for array bounds issues # (-fcheck=all) all runtime checking -#F_COMP=/usr/bin/gfortran -#F_OPTS1=-ffree-form -O1 -#F_OPTS2=-ffree-form -O2 -#LOADER_OPTS=-ffree-form -O2 -#LIBS=-L/usr/lib/x86_64-linux-gnu -lrt -lpthread -lz -lsz +F_COMP=gfortran +F_OPTS1=-fallow-argument-mismatch -ffree-form -O1 +F_OPTS2=-fallow-argument-mismatch -ffree-form -O2 +F_OPTS3=-fallow-argument-mismatch -ffree-form -O3 +#F_OPTS1=-fallow-argument-mismatch -ffree-form -O1 -fbacktrace +#F_OPTS2=-fallow-argument-mismatch -ffree-form -O2 -fbacktrace +#F_OPTS3=-fallow-argument-mismatch -ffree-form -O3 -fbacktrace +#Use F_OPTS3 for RTE+RRTMGP. See Makefiles in src/version/radiate/rte-rrtmgp +LOADER_OPTS=-ffree-form -O2 +LIBS=-L/usr/lib/x86_64-linux-gnu -lrt -lpthread -lz -lsz ############################################################################# # C compiler choice and flags (gcc) and (mpicc) are most common # Add the "-DRAMS_DOUBLE_PREC" compiler flag to "C_OPTS" for turning on -# double precision rather than default double precision. Note that using +# double precision rather than default single precision. Note that using # double will make output and runtimes substantially longer but provide the # extra precision needed in some highly sensitive simulations. # @@ -141,7 +172,8 @@ LIBS=-L/usr/lib/x86_64-linux-gnu -lrt -lpthread -lsz -lz # that are not really as issue for us, but you can turn warnings back on by # removing the "-w" if you wish to alter code to eliminate warnings. ############################################################################# -C_COMP=gcc +#C_COMP=gcc +C_COMP=/home/smsaleeb/software/mpich-3.3.2/bin/mpicc C_OPTS=-O3 -DUNDERSCORE -DLITTLE -std=gnu99 -DENABLE_PARALLEL_COMPRESSION -w #C_OPTS=-O3 -DUNDERSCORE -DLITTLE -std=gnu99 -DRAMS_DOUBLE_PREC \ # -DENABLE_PARALLEL_COMPRESSION -w @@ -161,9 +193,10 @@ ARCH=ar rsU # software and HDF5 software. # Add or remove needed libraries to PAR_LIBS. Missing or needed libraries # will be highlighted in compile time error messages. Typical library -# specs are: -lmpich, -lmpl, -lmpi. +# specs are: -lmpich, -lmpl, -lmpi, -lmpifort # Comment out these "PAR_" lines for serial processing compile. ############################################################################# PAR_INCS=-I$(MPI_ROOT)/include -PAR_LIBS=-L$(MPI_ROOT)/lib -lmpich -lmpl +#PAR_LIBS=-L$(MPI_ROOT)/lib -lmpich -lmpl +PAR_LIBS=-L$(MPI_ROOT)/lib PAR_DEFS=-DRAMS_MPI diff --git a/src/6.3.02/core/ref_sounding.f90 b/src/6.3.02/core/ref_sounding.f90 deleted file mode 100644 index 56efcb8..0000000 --- a/src/6.3.02/core/ref_sounding.f90 +++ /dev/null @@ -1,17 +0,0 @@ -!############################################################################## -Module ref_sounding - -use grid_dims - -implicit none - - integer :: iref,jref - real :: topref - - !Base state variables in 1D (constant in time) - real, dimension(nzpmax,maxgrds) :: u01dn,v01dn,pi01dn,th01dn,dn01dn,rt01dn - - integer :: ipsflg,itsflg,irtsflg,iusflg,nsndg - real, dimension(maxsndg) :: us,vs,ts,thds,ps,hs,rts - -END MODULE ref_sounding diff --git a/src/6.3.02/bc/cyclic_mod.f90 b/src/bc/cyclic_mod.f90 similarity index 100% rename from src/6.3.02/bc/cyclic_mod.f90 rename to src/bc/cyclic_mod.f90 diff --git a/src/6.3.02/bc/rbnd.f90 b/src/bc/rbnd.f90 similarity index 92% rename from src/6.3.02/bc/rbnd.f90 rename to src/bc/rbnd.f90 index 7a5b8f1..e130876 100644 --- a/src/6.3.02/bc/rbnd.f90 +++ b/src/bc/rbnd.f90 @@ -13,12 +13,14 @@ Subroutine latbnd () ! and the recomputation of all boundary tendencies on nested grids ! after the first nested grid timestep. -if (nxtnest(ngrid) .eq. 0) then +! LDG, 11/2022: call boundary conditions on all grids for 1-way nesting +! Commented out check for grid number +!if (nxtnest(ngrid) .eq. 0) then ! Radiative and/or mesoscale compensation region lateral ! boundary conditions. - if (ibnd .eq. 1 .or. jbnd .eq. 1) then + if (ibnd .eq. 1 .or. jbnd .eq. 1 .or. ngrid .gt. 1) then CALL latnormv (mzp,mxp,myp,ibcon & ,basic_g(ngrid)%up (1,1,1) ,tend%ut (1) & @@ -27,7 +29,7 @@ Subroutine latbnd () endif -endif +!endif return END SUBROUTINE latbnd @@ -287,7 +289,9 @@ Subroutine vpsets () implicit none -if (nxtnest(ngrid) .eq. 0) then +! LDG, 11/2022: call boundary conditions on all grids for 1-way nesting +! Commented out check for grid number +!if (nxtnest(ngrid) .eq. 0) then CALL latset (mzp,mxp,myp,ia,iz,ja,jz,ibcon,'U' & ,basic_g(ngrid)%up (1,1,1) ,basic_g(ngrid)%up (1,1,1) & ,basic_g(ngrid)%vp (1,1,1) ,grid_g(ngrid)%dxu (1,1) & @@ -308,7 +312,7 @@ Subroutine vpsets () ,basic_g(ngrid)%vp (1,1,1) ,grid_g(ngrid)%dxu (1,1) & ,grid_g(ngrid)%dxm (1,1) ,grid_g(ngrid)%dyv (1,1) & ,grid_g(ngrid)%dym (1,1) ,'NULL') -endif +!endif if (nsttop .eq. 1) then CALL topset (mzp,mxp,myp,basic_g(ngrid)%up(1,1,1),'U') @@ -328,7 +332,9 @@ Subroutine vpsets () CALL dumset (mzp,mxp,myp,ibcon,basic_g(ngrid)%up(1,1,1),'U') CALL dumset (mzp,mxp,myp,ibcon,basic_g(ngrid)%vp(1,1,1),'V') -if (nxtnest(ngrid) .eq. 0) then +! LDG, 11/2022: call boundary conditions on all grids for 1-way nesting +! Commented out check for grid number +!if (nxtnest(ngrid) .eq. 0) then CALL latset (mzp,mxp,myp,ia,iz,ja,jz,ibcon,'U' & ,basic_g(ngrid)%uc (1,1,1) ,basic_g(ngrid)%up (1,1,1) & ,basic_g(ngrid)%vp (1,1,1) ,grid_g(ngrid)%dxu (1,1) & @@ -349,7 +355,7 @@ Subroutine vpsets () ,basic_g(ngrid)%vp (1,1,1) ,grid_g(ngrid)%dxu (1,1) & ,grid_g(ngrid)%dxm (1,1) ,grid_g(ngrid)%dyv (1,1) & ,grid_g(ngrid)%dym (1,1) ,'NULL') -endif +!endif if (nsttop .eq. 1) then CALL topset (mzp,mxp,myp,basic_g(ngrid)%uc(1,1,1),'U') @@ -398,13 +404,15 @@ Subroutine trsets () scalarp => scalar_tab(n,ngrid)%var_p scalart => scalar_tab(n,ngrid)%var_t - if (nxtnest(ngrid) .eq. 0) then + ! LDG, 11/2022: call boundary conditions on all grids for 1-way nesting + ! Commented out check for grid number + !if (nxtnest(ngrid) .eq. 0) then CALL latset (mzp,mxp,myp,ia,iz,ja,jz,ibcon,'TR' & ,scalarp ,basic_g(ngrid)%up (1,1,1) & ,basic_g(ngrid)%vp (1,1,1) ,grid_g(ngrid)%dxu (1,1) & ,grid_g(ngrid)%dxm (1,1) ,grid_g(ngrid)%dyv (1,1) & ,grid_g(ngrid)%dym (1,1) ,scalar_tab(n,ngrid)%name) - endif + !endif if (nsttop .eq. 1) & CALL topset (mzp,mxp,myp,scalarp,'T') @@ -430,7 +438,8 @@ Subroutine latset (m1,m2,m3,ia,iz,ja,jz,ibcon,vnam,ap,uc,vc,dxu,dxm,dyv,dym & implicit none -integer :: m1,m2,m3,ia,iz,ja,jz,ibcon,i,j,k,lbw,lbe,lbs,lbn,setlbcinit +integer :: m1,m2,m3,ia,iz,ja,jz,ibcon,i,j,k,lbw,lbe,lbs,lbn,setlbcinit & + ,lsflg_thisgrid,ibnd_thisgrid real :: thresh,dtlx,c1,dxr,dyr,atau real, dimension(m1,m2,m3) :: ap,uc,vc real, dimension(m2,m3) :: dxu,dxm,dyv,dym @@ -442,6 +451,20 @@ Subroutine latset (m1,m2,m3,ia,iz,ja,jz,ibcon,vnam,ap,uc,vc,dxu,dxm,dyv,dym & lbs=0 !Variable initialized lbn=0 !Variable initialized +! LDG 11/2022: variable lsflg_thisgrid is used in place of lsflg throughout +! this routine. We want to use conditions equivalent of lsflg=2 (constant +! inflow, radiative outflow) for ngrid>1: constant inflow leaves the +! boundary tendencies untouched for inflow conditions since boundary values +! for nests are handled in nstbtnd, and it allows features to pass smoothly +! out of the nest for outflow conditions, which is desirable for 1-way +! nesting setups. Note that this would need modification if 2-way nesting +! were ever re-introduced. +lsflg_thisgrid = lsflg +if (ngrid .gt. 1) lsflg_thisgrid = 2 +! Do the same for ibnd, since this routine can be called for all grids +ibnd_thisgrid = ibnd +if (ngrid .gt. 1) ibnd_thisgrid = 1 + if (iand(ibcon,1) .gt. 0) lbw = ia - 1 if (iand(ibcon,2) .gt. 0) lbe = iz + 1 if (iand(ibcon,4) .gt. 0) lbs = ja - 1 @@ -465,8 +488,8 @@ Subroutine latset (m1,m2,m3,ia,iz,ja,jz,ibcon,vnam,ap,uc,vc,dxu,dxm,dyv,dym & if(iaerolbc(ngrid)==1)then if( ((sname == 'CIFNP') .and. & (jnmb(3)>=5 .and. (iifn==1.or.iifn==2))) .or. & - ((sname == 'CCCNP' .or. sname == 'CCCMP' .or. & - sname == 'GCCNP' .or. sname == 'GCCMP') .and. & + ((sname == 'CN1NP' .or. sname == 'CN1MP' .or. & + sname == 'CN2NP' .or. sname == 'CN2MP') .and. & iaerosol==1) .or. & ((sname == 'MD1NP' .or. sname == 'MD1MP' .or. & sname == 'MD2NP' .or. sname == 'MD2MP') .and. & @@ -492,11 +515,11 @@ Subroutine latset (m1,m2,m3,ia,iz,ja,jz,ibcon,vnam,ap,uc,vc,dxu,dxm,dyv,dym & allocate(temp_v1(m1)) allocate(temp_v2(m1)) -if (ibnd .ne. 2 .and. vnam .ne. 'U' .and. lsflg .ne. 3) then +if (ibnd_thisgrid .ne. 2 .and. vnam .ne. 'U' .and. lsflg_thisgrid .ne. 3) then -! Western and Eastern boundaries for zero gradient option +! Western and Eastern boundaries for zero gradient option (grid 1 only) - if (lsflg .eq. 0) then + if (lsflg_thisgrid .eq. 0) then if (iand(ibcon,1) .gt. 0) then do j = 1,m3 do k = 1,m1 @@ -519,7 +542,7 @@ Subroutine latset (m1,m2,m3,ia,iz,ja,jz,ibcon,vnam,ap,uc,vc,dxu,dxm,dyv,dym & endif else -! Western boundary for lsflg = 1 or 2 +! Western boundary for lsflg = 1 or 2, or ngrid > 1 if (iand(ibcon,1) .gt. 0) then do j = 1,m3 @@ -563,7 +586,7 @@ Subroutine latset (m1,m2,m3,ia,iz,ja,jz,ibcon,vnam,ap,uc,vc,dxu,dxm,dyv,dym & else !radiative BC ap(k,lbw,j) = temp_v2(k) endif - elseif (lsflg .eq. 1) then + elseif (lsflg_thisgrid .eq. 1) then if(setlbcinit==1) then ap(k,ia,j) = ap(k,ia,j)+(ap(k,lbw,j)-ap(k,ia,j))*(dtlt/atau) endif @@ -573,7 +596,7 @@ Subroutine latset (m1,m2,m3,ia,iz,ja,jz,ibcon,vnam,ap,uc,vc,dxu,dxm,dyv,dym & enddo endif -! Eastern Boundary for LSFLG = 1 or 2 +! Eastern Boundary for LSFLG = 1 or 2, or ngrid > 1 if (iand(ibcon,2) .gt. 0) then do j = 1,m3 @@ -617,7 +640,7 @@ Subroutine latset (m1,m2,m3,ia,iz,ja,jz,ibcon,vnam,ap,uc,vc,dxu,dxm,dyv,dym & else !radiative BC ap(k,lbe,j) = temp_v2(k) endif - elseif (lsflg .eq. 1) then + elseif (lsflg_thisgrid .eq. 1) then if(setlbcinit==1) then ap(k,iz,j) = ap(k,iz,j)+(ap(k,lbe,j)-ap(k,iz,j))*(dtlt/atau) endif @@ -629,11 +652,11 @@ Subroutine latset (m1,m2,m3,ia,iz,ja,jz,ibcon,vnam,ap,uc,vc,dxu,dxm,dyv,dym & endif endif -if(jdim.eq.1.and.jbnd.ne.2.and.vnam.ne.'V'.and.lsflg.ne.3)then +if(jdim.eq.1.and.jbnd.ne.2.and.vnam.ne.'V'.and.lsflg_thisgrid.ne.3)then -! Southern and Northern boundaries for zero gradient option +! Southern and Northern boundaries for zero gradient option (grid 1 only) - if (lsflg .eq. 0) then + if (lsflg_thisgrid .eq. 0) then if (iand(ibcon,4) .gt. 0) then do i = 1,m2 do k = 1,m1 @@ -656,7 +679,7 @@ Subroutine latset (m1,m2,m3,ia,iz,ja,jz,ibcon,vnam,ap,uc,vc,dxu,dxm,dyv,dym & endif else -! Southern boundary for LSFLG = 1 or 2 +! Southern boundary for LSFLG = 1 or 2, or ngrid > 1 if (iand(ibcon,4) .gt. 0) then do i = 1,m2 @@ -700,7 +723,7 @@ Subroutine latset (m1,m2,m3,ia,iz,ja,jz,ibcon,vnam,ap,uc,vc,dxu,dxm,dyv,dym & else !radiative BC ap(k,i,lbs) = temp_v2(k) endif - elseif (lsflg .eq. 1) then + elseif (lsflg_thisgrid .eq. 1) then if(setlbcinit==1) then ap(k,i,ja) = ap(k,i,ja)+(ap(k,i,lbs)-ap(k,i,ja))*(dtlt/atau) endif @@ -710,7 +733,7 @@ Subroutine latset (m1,m2,m3,ia,iz,ja,jz,ibcon,vnam,ap,uc,vc,dxu,dxm,dyv,dym & enddo endif -! Northern Boundary for LSFLG = 1 or 2 +! Northern Boundary for LSFLG = 1 or 2, or ngrid > 1 if (iand(ibcon,8) .gt. 0) then do i = 1,m2 @@ -754,7 +777,7 @@ Subroutine latset (m1,m2,m3,ia,iz,ja,jz,ibcon,vnam,ap,uc,vc,dxu,dxm,dyv,dym & else !radiative BC ap(k,i,lbn) = temp_v2(k) endif - elseif (lsflg .eq. 1) then + elseif (lsflg_thisgrid .eq. 1) then if(setlbcinit==1) then ap(k,i,jz) = ap(k,i,jz)+(ap(k,i,lbn)-ap(k,i,jz))*(dtlt/atau) endif diff --git a/src/6.3.02/bc/rbnd_nonscalar.f90 b/src/bc/rbnd_nonscalar.f90 similarity index 94% rename from src/6.3.02/bc/rbnd_nonscalar.f90 rename to src/bc/rbnd_nonscalar.f90 index 1e3ede1..20f9afe 100644 --- a/src/6.3.02/bc/rbnd_nonscalar.f90 +++ b/src/bc/rbnd_nonscalar.f90 @@ -309,6 +309,10 @@ Subroutine micro_bcond (m1,m2,m3,micro,ibcon) micro%nucicert(k,1,j) = 0. micro%vapliqt(k,1,j) = 0. micro%vapicet(k,1,j) = 0. + micro%evapliqt(k,1,j) = 0. + micro%evapicet(k,1,j) = 0. + micro%freezingt(k,1,j) = 0. + micro%meltingt(k,1,j) = 0. micro%melticet(k,1,j) = 0. micro%rimecldt(k,1,j) = 0. micro%rain2icet(k,1,j) = 0. @@ -329,6 +333,14 @@ Subroutine micro_bcond (m1,m2,m3,micro,ibcon) micro%vapgraut(k,1,j) = 0. micro%vaphailt(k,1,j) = 0. micro%vapdrizt(k,1,j) = 0. + micro%evapcldt(k,1,j) = 0. + micro%evapraint(k,1,j) = 0. + micro%evapprist(k,1,j) = 0. + micro%evapsnowt(k,1,j) = 0. + micro%evapaggrt(k,1,j) = 0. + micro%evapgraut(k,1,j) = 0. + micro%evaphailt(k,1,j) = 0. + micro%evapdrizt(k,1,j) = 0. micro%meltprist(k,1,j) = 0. micro%meltsnowt(k,1,j) = 0. micro%meltaggrt(k,1,j) = 0. @@ -397,6 +409,10 @@ Subroutine micro_bcond (m1,m2,m3,micro,ibcon) micro%nucicert(k,m2,j) = 0. micro%vapliqt(k,m2,j) = 0. micro%vapicet(k,m2,j) = 0. + micro%evapliqt(k,m2,j) = 0. + micro%evapicet(k,m2,j) = 0. + micro%freezingt(k,m2,j) = 0. + micro%meltingt(k,m2,j) = 0. micro%melticet(k,m2,j) = 0. micro%rimecldt(k,m2,j) = 0. micro%rain2icet(k,m2,j) = 0. @@ -417,6 +433,14 @@ Subroutine micro_bcond (m1,m2,m3,micro,ibcon) micro%vapgraut(k,m2,j) = 0. micro%vaphailt(k,m2,j) = 0. micro%vapdrizt(k,m2,j) = 0. + micro%evapcldt(k,m2,j) = 0. + micro%evapraint(k,m2,j) = 0. + micro%evapprist(k,m2,j) = 0. + micro%evapsnowt(k,m2,j) = 0. + micro%evapaggrt(k,m2,j) = 0. + micro%evapgraut(k,m2,j) = 0. + micro%evaphailt(k,m2,j) = 0. + micro%evapdrizt(k,m2,j) = 0. micro%meltprist(k,m2,j) = 0. micro%meltsnowt(k,m2,j) = 0. micro%meltaggrt(k,m2,j) = 0. @@ -485,6 +509,10 @@ Subroutine micro_bcond (m1,m2,m3,micro,ibcon) micro%nucicert(k,i,1) = 0. micro%vapliqt(k,i,1) = 0. micro%vapicet(k,i,1) = 0. + micro%evapliqt(k,i,1) = 0. + micro%evapicet(k,i,1) = 0. + micro%freezingt(k,i,1) = 0. + micro%meltingt(k,i,1) = 0. micro%melticet(k,i,1) = 0. micro%rimecldt(k,i,1) = 0. micro%rain2icet(k,i,1) = 0. @@ -505,6 +533,14 @@ Subroutine micro_bcond (m1,m2,m3,micro,ibcon) micro%vapgraut(k,i,1) = 0. micro%vaphailt(k,i,1) = 0. micro%vapdrizt(k,i,1) = 0. + micro%evapcldt(k,i,1) = 0. + micro%evapraint(k,i,1) = 0. + micro%evapprist(k,i,1) = 0. + micro%evapsnowt(k,i,1) = 0. + micro%evapaggrt(k,i,1) = 0. + micro%evapgraut(k,i,1) = 0. + micro%evaphailt(k,i,1) = 0. + micro%evapdrizt(k,i,1) = 0. micro%meltprist(k,i,1) = 0. micro%meltsnowt(k,i,1) = 0. micro%meltaggrt(k,i,1) = 0. @@ -573,6 +609,10 @@ Subroutine micro_bcond (m1,m2,m3,micro,ibcon) micro%nucicert(k,i,m3) = 0. micro%vapliqt(k,i,m3) = 0. micro%vapicet(k,i,m3) = 0. + micro%evapliqt(k,i,m3) = 0. + micro%evapicet(k,i,m3) = 0. + micro%freezingt(k,i,m3) = 0. + micro%meltingt(k,i,m3) = 0. micro%melticet(k,i,m3) = 0. micro%rimecldt(k,i,m3) = 0. micro%rain2icet(k,i,m3) = 0. @@ -593,6 +633,14 @@ Subroutine micro_bcond (m1,m2,m3,micro,ibcon) micro%vapgraut(k,i,m3) = 0. micro%vaphailt(k,i,m3) = 0. micro%vapdrizt(k,i,m3) = 0. + micro%evapcldt(k,i,m3) = 0. + micro%evapraint(k,i,m3) = 0. + micro%evapprist(k,i,m3) = 0. + micro%evapsnowt(k,i,m3) = 0. + micro%evapaggrt(k,i,m3) = 0. + micro%evapgraut(k,i,m3) = 0. + micro%evaphailt(k,i,m3) = 0. + micro%evapdrizt(k,i,m3) = 0. micro%meltprist(k,i,m3) = 0. micro%meltsnowt(k,i,m3) = 0. micro%meltaggrt(k,i,m3) = 0. @@ -672,7 +720,8 @@ Subroutine leaf_bcond (m2,m3,mzg,mzs,npat,leaf,ibcon) leaf%veg_tai (1,j,ipat) = leaf%veg_tai (2,j,ipat) leaf%veg_rough (1,j,ipat) = leaf%veg_rough (2,j,ipat) leaf%veg_height (1,j,ipat) = leaf%veg_height (2,j,ipat) - leaf%patch_rough (1,j,ipat) = leaf%patch_rough (2,j,ipat) + leaf%patch_rought (1,j,ipat) = leaf%patch_rought (2,j,ipat) + leaf%patch_roughm (1,j,ipat) = leaf%patch_roughm (2,j,ipat) leaf%soil_rough (1,j,ipat) = leaf%soil_rough (2,j,ipat) leaf%sfcwater_nlev (1,j,ipat) = leaf%sfcwater_nlev (2,j,ipat) leaf%stom_resist (1,j,ipat) = leaf%stom_resist (2,j,ipat) @@ -712,7 +761,8 @@ Subroutine leaf_bcond (m2,m3,mzg,mzs,npat,leaf,ibcon) leaf%veg_tai (m2,j,ipat) = leaf%veg_tai (m2-1,j,ipat) leaf%veg_rough (m2,j,ipat) = leaf%veg_rough (m2-1,j,ipat) leaf%veg_height (m2,j,ipat) = leaf%veg_height (m2-1,j,ipat) - leaf%patch_rough (m2,j,ipat) = leaf%patch_rough (m2-1,j,ipat) + leaf%patch_rought (m2,j,ipat) = leaf%patch_rought (m2-1,j,ipat) + leaf%patch_roughm (m2,j,ipat) = leaf%patch_roughm (m2-1,j,ipat) leaf%soil_rough (m2,j,ipat) = leaf%soil_rough (m2-1,j,ipat) leaf%sfcwater_nlev (m2,j,ipat) = leaf%sfcwater_nlev (m2-1,j,ipat) leaf%stom_resist (m2,j,ipat) = leaf%stom_resist (m2-1,j,ipat) @@ -752,7 +802,8 @@ Subroutine leaf_bcond (m2,m3,mzg,mzs,npat,leaf,ibcon) leaf%veg_tai (i,1,ipat) = leaf%veg_tai (i,2,ipat) leaf%veg_rough (i,1,ipat) = leaf%veg_rough (i,2,ipat) leaf%veg_height (i,1,ipat) = leaf%veg_height (i,2,ipat) - leaf%patch_rough (i,1,ipat) = leaf%patch_rough (i,2,ipat) + leaf%patch_rought (i,1,ipat) = leaf%patch_rought (i,2,ipat) + leaf%patch_roughm (i,1,ipat) = leaf%patch_roughm (i,2,ipat) leaf%soil_rough (i,1,ipat) = leaf%soil_rough (i,2,ipat) leaf%sfcwater_nlev (i,1,ipat) = leaf%sfcwater_nlev (i,2,ipat) leaf%stom_resist (i,1,ipat) = leaf%stom_resist (i,2,ipat) @@ -792,7 +843,8 @@ Subroutine leaf_bcond (m2,m3,mzg,mzs,npat,leaf,ibcon) leaf%veg_tai (i,m3,ipat) = leaf%veg_tai (i,m3-1,ipat) leaf%veg_rough (i,m3,ipat) = leaf%veg_rough (i,m3-1,ipat) leaf%veg_height (i,m3,ipat) = leaf%veg_height (i,m3-1,ipat) - leaf%patch_rough (i,m3,ipat) = leaf%patch_rough (i,m3-1,ipat) + leaf%patch_rought (i,m3,ipat) = leaf%patch_rought (i,m3-1,ipat) + leaf%patch_roughm (i,m3,ipat) = leaf%patch_roughm (i,m3-1,ipat) leaf%soil_rough (i,m3,ipat) = leaf%soil_rough (i,m3-1,ipat) leaf%sfcwater_nlev (i,m3,ipat) = leaf%sfcwater_nlev (i,m3-1,ipat) leaf%stom_resist (i,m3,ipat) = leaf%stom_resist (i,m3-1,ipat) @@ -840,14 +892,14 @@ Subroutine rad_bcond (m1,m2,m3,radiate,ibcon) do j = 1,m3 do k = 1,m1 radiate%fthrd(k,1,j) = radiate%fthrd(k,2,j) - if(ilwrtyp == 3 .or. iswrtyp == 3) then + if(ilwrtyp >= 3 .or. iswrtyp >= 3) then radiate%bext(k,1,j) = radiate%bext(k,2,j) endif - if(iswrtyp == 3) then + if(iswrtyp >= 3) then radiate%swup(k,1,j) = radiate%swup(k,2,j) radiate%swdn(k,1,j) = radiate%swdn(k,2,j) endif - if(ilwrtyp == 3) then + if(ilwrtyp >= 3) then radiate%lwup(k,1,j) = radiate%lwup(k,2,j) radiate%lwdn(k,1,j) = radiate%lwdn(k,2,j) endif @@ -860,14 +912,14 @@ Subroutine rad_bcond (m1,m2,m3,radiate,ibcon) do j = 1,m3 do k = 1,m1 radiate%fthrd(k,m2,j) = radiate%fthrd(k,m2-1,j) - if(ilwrtyp == 3 .or. iswrtyp == 3) then + if(ilwrtyp >= 3 .or. iswrtyp >= 3) then radiate%bext(k,m2,j) = radiate%bext(k,m2-1,j) endif - if(iswrtyp == 3) then + if(iswrtyp >= 3) then radiate%swup(k,m2,j) = radiate%swup(k,m2-1,j) radiate%swdn(k,m2,j) = radiate%swdn(k,m2-1,j) endif - if(ilwrtyp == 3) then + if(ilwrtyp >= 3) then radiate%lwup(k,m2,j) = radiate%lwup(k,m2-1,j) radiate%lwdn(k,m2,j) = radiate%lwdn(k,m2-1,j) endif @@ -880,14 +932,14 @@ Subroutine rad_bcond (m1,m2,m3,radiate,ibcon) do i = 1,m2 do k = 1,m1 radiate%fthrd(k,i,1) = radiate%fthrd(k,i,2) - if(ilwrtyp == 3 .or. iswrtyp == 3) then + if(ilwrtyp >= 3 .or. iswrtyp >= 3) then radiate%bext(k,i,1) = radiate%bext(k,i,2) endif - if(iswrtyp == 3) then + if(iswrtyp >= 3) then radiate%swup(k,i,1) = radiate%swup(k,i,2) radiate%swdn(k,i,1) = radiate%swdn(k,i,2) endif - if(ilwrtyp == 3) then + if(ilwrtyp >= 3) then radiate%lwup(k,i,1) = radiate%lwup(k,i,2) radiate%lwdn(k,i,1) = radiate%lwdn(k,i,2) endif @@ -900,14 +952,14 @@ Subroutine rad_bcond (m1,m2,m3,radiate,ibcon) do i = 1,m2 do k = 1,m1 radiate%fthrd(k,i,m3) = radiate%fthrd(k,i,m3-1) - if(ilwrtyp == 3 .or. iswrtyp == 3) then + if(ilwrtyp >= 3 .or. iswrtyp >= 3) then radiate%bext(k,i,m3) = radiate%bext(k,i,m3-1) endif - if(iswrtyp == 3) then + if(iswrtyp >= 3) then radiate%swup(k,i,m3) = radiate%swup(k,i,m3-1) radiate%swdn(k,i,m3) = radiate%swdn(k,i,m3-1) endif - if(ilwrtyp == 3) then + if(ilwrtyp >= 3) then radiate%lwup(k,i,m3) = radiate%lwup(k,i,m3-1) radiate%lwdn(k,i,m3) = radiate%lwdn(k,i,m3-1) endif diff --git a/src/6.3.02/bc/rbnd_trsetsns.f90 b/src/bc/rbnd_trsetsns.f90 similarity index 97% rename from src/6.3.02/bc/rbnd_trsetsns.f90 rename to src/bc/rbnd_trsetsns.f90 index 7ef6d0f..d619582 100644 --- a/src/6.3.02/bc/rbnd_trsetsns.f90 +++ b/src/bc/rbnd_trsetsns.f90 @@ -17,7 +17,7 @@ Subroutine trsets_ns () CALL trsetns (mzp,mxp,myp,radiate_g(ngrid)%fthrd,1) endif -if(ilwrtyp == 3 .or. iswrtyp == 3) then +if(ilwrtyp >= 3 .or. iswrtyp >= 3) then CALL trsetns (mzp,mxp,myp,radiate_g(ngrid)%bext,2) endif diff --git a/src/6.3.02/block/hdf5_f2c.c b/src/block/hdf5_f2c.c similarity index 100% rename from src/6.3.02/block/hdf5_f2c.c rename to src/block/hdf5_f2c.c diff --git a/src/6.3.02/block/hdf5_utils.f90 b/src/block/hdf5_utils.f90 similarity index 100% rename from src/6.3.02/block/hdf5_utils.f90 rename to src/block/hdf5_utils.f90 diff --git a/src/6.3.02/block/mk_main.f90 b/src/block/mk_main.f90 similarity index 100% rename from src/6.3.02/block/mk_main.f90 rename to src/block/mk_main.f90 diff --git a/src/6.3.02/core/coriolis.f90 b/src/core/coriolis.f90 similarity index 93% rename from src/6.3.02/core/coriolis.f90 rename to src/core/coriolis.f90 index 1234098..f5fbcc9 100644 --- a/src/6.3.02/core/coriolis.f90 +++ b/src/core/coriolis.f90 @@ -108,6 +108,8 @@ Subroutine corlsu (m1,m2,m3,i0,j0,ia,iz,ja,jz,up,vp,ut,vt3da,top,rtg,fcor) if (initial == 2 .or. (initial == 3 .and. initorig == 2)) return +!Now do geostrophic wind forcing if we initialized horizontally homogeneously +if (iugforce>=1) then if (itopo == 1) then do j = ja,jz @@ -133,6 +135,11 @@ Subroutine corlsu (m1,m2,m3,i0,j0,ia,iz,ja,jz,up,vp,ut,vt3da,top,rtg,fcor) enddo endif +else + print*, 'geostrophic wind forcing is strongly recommended for INITIAL = 1 and ICORFLG = 1' + print*, 'stop statement can be removed from core/coriolis.f90' + stop +endif return END SUBROUTINE corlsu @@ -178,6 +185,7 @@ Subroutine corlsv (m1,m2,m3,i0,j0,ia,iz,ja,jz,up,vp,vt,vt3da,top,rtg,fcor) if (initial == 2 .or. (initial == 3 .and. initorig == 2)) return +if (iugforce >= 1) then if (itopo == 1) then do j = ja,jz @@ -203,6 +211,7 @@ Subroutine corlsv (m1,m2,m3,i0,j0,ia,iz,ja,jz,up,vp,vt,vt3da,top,rtg,fcor) enddo endif +endif return END SUBROUTINE corlsv diff --git a/src/6.3.02/core/modsched.f90 b/src/core/modsched.f90 similarity index 100% rename from src/6.3.02/core/modsched.f90 rename to src/core/modsched.f90 diff --git a/src/6.3.02/core/newbase.f90 b/src/core/newbase.f90 similarity index 79% rename from src/6.3.02/core/newbase.f90 rename to src/core/newbase.f90 index bf5648d..68ab12c 100644 --- a/src/6.3.02/core/newbase.f90 +++ b/src/core/newbase.f90 @@ -139,3 +139,33 @@ Subroutine new_base_state (n1,n2,n3) return END SUBROUTINE new_base_state +!####################################################################### +Subroutine update_base_winds() + +use ref_sounding +use node_mod, only:mmzp +use mem_grid, only:ztn,ngrid,time + +implicit none + +integer :: it1, it2,nlev +real :: timefac +real, dimension(size(ug,1)) :: newug, newvg + +nlev = size(ug,1) +it1 = findloc(time-forc_time >= 0, .TRUE., DIM=1, BACK=.TRUE.) +if (time - forc_time(it1) == 0.) then + CALL htint(nlev,ug(:,it1),forc_lev,mmzp(ngrid),u01dn(:,ngrid),ztn(:,ngrid) ) + CALL htint(nlev,vg(:,it1),forc_lev,mmzp(ngrid),v01dn(:,ngrid),ztn(:,ngrid) ) +else + it2 = it1 + 1 + if (it2>size(forc_time)) stop "No future UG/VG for GEOSTROPHIC WIND FORCING" + timefac = (time - forc_time(it1))/(forc_time(it2)-forc_time(it1)) + newug = ug(:,it1) + (ug(:,it2) - ug(:,it1)) * timefac + newvg = vg(:,it1) + (vg(:,it2) - vg(:,it1)) * timefac + + CALL htint(nlev,newug,forc_lev,mmzp(ngrid),u01dn(:,ngrid),ztn(:,ngrid) ) + CALL htint(nlev,newvg,forc_lev,mmzp(ngrid),v01dn(:,ngrid),ztn(:,ngrid) ) +endif + +END SUBROUTINE update_base_winds diff --git a/src/6.3.02/core/raco.f90 b/src/core/raco.f90 similarity index 100% rename from src/6.3.02/core/raco.f90 rename to src/core/raco.f90 diff --git a/src/6.3.02/core/radvc.f90 b/src/core/radvc.f90 similarity index 99% rename from src/6.3.02/core/radvc.f90 rename to src/core/radvc.f90 index d04ced5..eb0a561 100644 --- a/src/6.3.02/core/radvc.f90 +++ b/src/core/radvc.f90 @@ -6,6 +6,7 @@ Subroutine advectc (varn,mzp,mxp,myp,ia,iz,ja,jz,izu,jzv) use mem_scratch use mem_grid use mem_basic +use ref_sounding, only:wsub implicit none @@ -68,7 +69,7 @@ Subroutine advectc (varn,mzp,mxp,myp,ia,iz,ja,jz,izu,jzv) scratch%vt3db(ind) = (basic_g(ngrid)%vp(k,i,j) & + basic_g(ngrid)%vc(k,i,j)) * dtlto2 scratch%vt3dc(ind) = (basic_g(ngrid)%wp(k,i,j) & - + basic_g(ngrid)%wc(k,i,j)) * dtlto2 + + basic_g(ngrid)%wc(k,i,j)) * dtlto2 + wsub(k,ngrid)*dtlt enddo enddo enddo @@ -92,7 +93,7 @@ Subroutine advectc (varn,mzp,mxp,myp,ia,iz,ja,jz,izu,jzv) !imono=1 option should be considered experimental. !May need bug fixing (Saleeby Oct 5, 2020). !pp and pm terms might not have density multiplied correctly. - imono = 0 + imono = 1 do n=1,num_scalar(ngrid) diff --git a/src/6.3.02/core/rammain.f90 b/src/core/rammain.f90 similarity index 100% rename from src/6.3.02/core/rammain.f90 rename to src/core/rammain.f90 diff --git a/src/6.3.02/core/rams_model.f90 b/src/core/rams_model.f90 similarity index 98% rename from src/6.3.02/core/rams_model.f90 rename to src/core/rams_model.f90 index a33628a..2501a45 100644 --- a/src/6.3.02/core/rams_model.f90 +++ b/src/core/rams_model.f90 @@ -128,7 +128,7 @@ Subroutine rams_model (nl_fname) ! varfiles have their own smaller memory allocation. ! This needs to be called before finishing node decomposition and grid setup. if (stopparallel/=1) CALL rams_mem_alloc () - if (stopparallel==1) CALL sfc_mem_alloc () + if (stopparallel==1.and.isfcl.ne.3) CALL sfc_mem_alloc () ! Set the buffer sizes for internodal communication if(force1node==0) CALL par_set_comm_buff_sizes () @@ -140,6 +140,10 @@ Subroutine rams_model (nl_fname) ! Any run (INITIAL, HISTORY, MAKESFC, MAKEVFILE, MAKEHFILE, ERROR) needs ! a set of surface files in place so always call update_sfc_var_files() at ! this point. + ! Adele - above is true unless ISFCL == 3, in which case surface files are + ! not needed. Keep call to update_sfc_var_files for all cases in the unlikely + ! event that there are specified fluxes with varfiles or hvarfiles. I + ! turned off surface file creation inside update_sfc_var_files if ISFCL=3 ! Make sure that the correct surface files and varfiles are in place CALL update_sfc_var_files () diff --git a/src/core/ref_sounding.f90 b/src/core/ref_sounding.f90 new file mode 100644 index 0000000..e7c9490 --- /dev/null +++ b/src/core/ref_sounding.f90 @@ -0,0 +1,23 @@ +!############################################################################## +Module ref_sounding + +use grid_dims + +implicit none + + integer :: iref,jref,nzref + real :: topref,divls + + !Base state variables in 1D (constant in time) + real, dimension(nzpmax,maxgrds) :: u01dn,v01dn,pi01dn,th01dn,dn01dn,rt01dn,o3ref,wsub + + !Base state forcing variables + character(strl1) :: sound_file,forcingfile + integer :: iugforce + real, allocatable, dimension(:) :: forc_lev, forc_time, forc_ts + real, allocatable, dimension(:,:) :: ug, vg + + integer :: ipsflg,itsflg,irtsflg,iusflg,io3flg,nsndg + real, dimension(maxsndg) :: us,vs,ts,thds,ps,hs,rts,o3s + +END MODULE ref_sounding diff --git a/src/6.3.02/core/rexev.f90 b/src/core/rexev.f90 similarity index 99% rename from src/6.3.02/core/rexev.f90 rename to src/core/rexev.f90 index 9572f80..77445b8 100644 --- a/src/6.3.02/core/rexev.f90 +++ b/src/core/rexev.f90 @@ -410,7 +410,7 @@ Subroutine exthvadv (mzp,mxp,myp,ia,iz,ja,jz,izu,jzv,thvadv) enddo enddo -imono = 0 !flag for monotonic flux limiter in Z only +imono = 1 !flag for monotonic flux limiter in Z only CALL fa_xc (mzp,mxp,myp,ia,iz & ,thetav,srthtv & diff --git a/src/6.3.02/core/rthrm.f90 b/src/core/rthrm.f90 similarity index 100% rename from src/6.3.02/core/rthrm.f90 rename to src/core/rthrm.f90 diff --git a/src/6.3.02/core/rtimh.f90 b/src/core/rtimh.f90 similarity index 99% rename from src/6.3.02/core/rtimh.f90 rename to src/core/rtimh.f90 index f8f988c..bd796b7 100644 --- a/src/6.3.02/core/rtimh.f90 +++ b/src/core/rtimh.f90 @@ -45,9 +45,9 @@ Subroutine timestep () !------------------------------------------------------------------------------ ! Radiation parameterization -! If running Harrington radiation, this radiation call only updates +! If running Harrington, BUGSRAD, or RTE-RRTMGP radiation, this radiation call only updates ! theta-il tendency, zeros out fthrd, runs radprep and then mclatchy. -! Actual Harrinton call done from microphysics driver for Level=3 micro. +! Actual radiation call done from microphysics driver for Level=3 micro. ! For Chen-Cotton or Mahrer-Pielke radiation options, the radiation ! physics is done at this point. It updates the tendency but does not ! apply it until the following timestep. Updates fluxes needed for diff --git a/src/6.3.02/core/rtimi.f90 b/src/core/rtimi.f90 similarity index 100% rename from src/6.3.02/core/rtimi.f90 rename to src/core/rtimi.f90 diff --git a/src/6.3.02/cuparm/conv_coms.f90 b/src/cuparm/conv_coms.f90 similarity index 100% rename from src/6.3.02/cuparm/conv_coms.f90 rename to src/cuparm/conv_coms.f90 diff --git a/src/6.3.02/cuparm/kf_cuparm.f90 b/src/cuparm/kf_cuparm.f90 similarity index 100% rename from src/6.3.02/cuparm/kf_cuparm.f90 rename to src/cuparm/kf_cuparm.f90 diff --git a/src/6.3.02/cuparm/kf_driver.f90 b/src/cuparm/kf_driver.f90 similarity index 100% rename from src/6.3.02/cuparm/kf_driver.f90 rename to src/cuparm/kf_driver.f90 diff --git a/src/6.3.02/cuparm/kf_rconv.f90 b/src/cuparm/kf_rconv.f90 similarity index 100% rename from src/6.3.02/cuparm/kf_rconv.f90 rename to src/cuparm/kf_rconv.f90 diff --git a/src/6.3.02/cuparm/rconv.f90 b/src/cuparm/rconv.f90 similarity index 100% rename from src/6.3.02/cuparm/rconv.f90 rename to src/cuparm/rconv.f90 diff --git a/src/6.3.02/dprep/dgrib1_main.f90 b/src/dprep/dgrib1_main.f90 similarity index 98% rename from src/6.3.02/dprep/dgrib1_main.f90 rename to src/dprep/dgrib1_main.f90 index bf5e956..d4fd724 100644 --- a/src/6.3.02/dprep/dgrib1_main.f90 +++ b/src/dprep/dgrib1_main.f90 @@ -16,7 +16,7 @@ Program griber ,nlev,slev,inproj,miss,startlev,endlev & ,iyyyy,imm,idd,ihh,fyyyy,fmm,fdd,fhh,leapyear & ,nvar3d,nvar2d,nvarsd,iplevs(1000),islevs(1000),datatype & - ,writesoillevs,writesnowlevs + ,writesoillevs,writesnowlevs,mx,plev1(1000),plev2(1000) real :: alat1,alon1,alat2,alon2,alov,aorient,dx,dy,reflat1,reflat2 & ,tinc,amiss,alatscr logical :: llisglobal,matched @@ -416,6 +416,22 @@ Program griber endif print*,'Number of Pressure Levels= ',nlev +!************************************************************************** +!Make sure the pressure levels are in descending order for correct output +!if not ordered properly in grib file - plev1, plev23, and mx added to +!integer variables declarations (Stephen Noble, SRNL) +plev1=iplevs +do i=1,nlev + mx=maxval(plev1) + plev2(i)=mx + do j=1,nlev + if (plev1(j)==mx) then + plev1(j)=-999 + endif + enddo +enddo +iplevs=plev2 + !************************************************************************** !Determine the number of SOIL levels we are going to use. !Only add soil (moisture and/or temperature) if the soil moisture is there. diff --git a/src/6.3.02/dprep/dgrib2_main.f90 b/src/dprep/dgrib2_main.f90 similarity index 98% rename from src/6.3.02/dprep/dgrib2_main.f90 rename to src/dprep/dgrib2_main.f90 index e945bdd..a5f1af8 100644 --- a/src/6.3.02/dprep/dgrib2_main.f90 +++ b/src/dprep/dgrib2_main.f90 @@ -16,7 +16,7 @@ Program griber ,nlev,slev,inproj,miss,startlev,endlev & ,iyyyy,imm,idd,ihh,fyyyy,fmm,fdd,fhh,leapyear & ,nvar3d,nvar2d,nvarsd,iplevs(1000),islevs(1000),datatype & - ,writesoillevs,writesnowlevs + ,writesoillevs,writesnowlevs,mx,plev1(1000),plev2(1000) real :: alat1,alon1,alat2,alon2,alov,aorient,dx,dy,reflat1,reflat2 & ,tinc,amiss,alatscr logical :: llisglobal,matched @@ -416,6 +416,22 @@ Program griber endif print*,'Number of Pressure Levels= ',nlev +!************************************************************************** +!Make sure the pressure levels are in descending order for correct output +!if not ordered properly in grib file - plev1, plev23, and mx added to +!integer variables declarations (Stephen Noble, SRNL) +plev1=iplevs +do i=1,nlev + mx=maxval(plev1) + plev2(i)=mx + do j=1,nlev + if (plev1(j)==mx) then + plev1(j)=-999 + endif + enddo +enddo +iplevs=plev2 + !************************************************************************** !Determine the number of SOIL levels we are going to use. !Only add soil (moisture and/or temperature) if the soil moisture is there. diff --git a/src/6.3.02/fdda/nud_analysis.f90 b/src/fdda/nud_analysis.f90 similarity index 100% rename from src/6.3.02/fdda/nud_analysis.f90 rename to src/fdda/nud_analysis.f90 diff --git a/src/6.3.02/fdda/oda_krig.f90 b/src/fdda/oda_krig.f90 similarity index 100% rename from src/6.3.02/fdda/oda_krig.f90 rename to src/fdda/oda_krig.f90 diff --git a/src/6.3.02/fdda/oda_nudge.f90 b/src/fdda/oda_nudge.f90 similarity index 100% rename from src/6.3.02/fdda/oda_nudge.f90 rename to src/fdda/oda_nudge.f90 diff --git a/src/6.3.02/fdda/oda_proc_obs.f90 b/src/fdda/oda_proc_obs.f90 similarity index 100% rename from src/6.3.02/fdda/oda_proc_obs.f90 rename to src/fdda/oda_proc_obs.f90 diff --git a/src/6.3.02/fdda/oda_read.f90 b/src/fdda/oda_read.f90 similarity index 100% rename from src/6.3.02/fdda/oda_read.f90 rename to src/fdda/oda_read.f90 diff --git a/src/6.3.02/fdda/oda_sta_count.f90 b/src/fdda/oda_sta_count.f90 similarity index 100% rename from src/6.3.02/fdda/oda_sta_count.f90 rename to src/fdda/oda_sta_count.f90 diff --git a/src/6.3.02/fdda/oda_sta_input.f90 b/src/fdda/oda_sta_input.f90 similarity index 100% rename from src/6.3.02/fdda/oda_sta_input.f90 rename to src/fdda/oda_sta_input.f90 diff --git a/src/6.3.02/fdda/varf_read.f90 b/src/fdda/varf_read.f90 similarity index 100% rename from src/6.3.02/fdda/varf_read.f90 rename to src/fdda/varf_read.f90 diff --git a/src/6.3.02/fdda/varf_update.f90 b/src/fdda/varf_update.f90 similarity index 100% rename from src/6.3.02/fdda/varf_update.f90 rename to src/fdda/varf_update.f90 diff --git a/src/6.3.02/gdf/gdf_input.f90 b/src/gdf/gdf_input.f90 similarity index 100% rename from src/6.3.02/gdf/gdf_input.f90 rename to src/gdf/gdf_input.f90 diff --git a/src/6.3.02/gdf/gdf_read_sfc.f90 b/src/gdf/gdf_read_sfc.f90 similarity index 100% rename from src/6.3.02/gdf/gdf_read_sfc.f90 rename to src/gdf/gdf_read_sfc.f90 diff --git a/src/6.3.02/gdf/gdf_read_upa.f90 b/src/gdf/gdf_read_upa.f90 similarity index 100% rename from src/6.3.02/gdf/gdf_read_upa.f90 rename to src/gdf/gdf_read_upa.f90 diff --git a/src/6.3.02/include/revu_sub_names.h b/src/include/revu_sub_names.h similarity index 100% rename from src/6.3.02/include/revu_sub_names.h rename to src/include/revu_sub_names.h diff --git a/src/6.3.02/include/sub_gribnames.h b/src/include/sub_gribnames.h similarity index 100% rename from src/6.3.02/include/sub_gribnames.h rename to src/include/sub_gribnames.h diff --git a/src/6.3.02/include/utils_sub_names.h b/src/include/utils_sub_names.h similarity index 100% rename from src/6.3.02/include/utils_sub_names.h rename to src/include/utils_sub_names.h diff --git a/src/6.3.02/init/data_init.f90 b/src/init/data_init.f90 similarity index 63% rename from src/6.3.02/init/data_init.f90 rename to src/init/data_init.f90 index b7d6e99..47ed481 100644 --- a/src/6.3.02/init/data_init.f90 +++ b/src/init/data_init.f90 @@ -187,3 +187,109 @@ Subroutine handle_dustsource (n2,n3,glat,glon,dustfrac,ifm) return END SUBROUTINE handle_dustsource + +!########################################################################## +Subroutine readforcing () + +use ref_sounding +use node_mod +use mem_grid +use netcdf +use io_params, only:iupdsst + +implicit none + +integer :: ivar, dimid +integer :: ncid, stat, varid, nlev, nt +integer :: ispresent(2)=0 + +! Forcing file should conform to the DEPHY format for variable names + +!Initialize nlev in case it isn't read from the file +nlev = 1 +if ((my_rams_num .eq. mainnum) .or. (nmachs .eq. 1)) then + if (nf90_open(trim(forcingfile), NF90_NOWRITE, ncid) .eq. NF90_NOERR) then + + !Get dimensions and read them + if(iugforce==2) then + stat = nf90_inq_dimid(ncid, "lev", dimid) + if (stat .eq. NF90_NOERR) then + stat = nf90_inquire_dimension(ncid, dimid, len=nlev) + else + stop "Can't find dimension 'lev' in forcing file" + endif + allocate(forc_lev(nlev)) + stat = nf90_inq_varid(ncid,"lev",varid) + stat = nf90_get_var(ncid, varid, forc_lev) + endif + + if(iugforce==2 .or. iupdsst==2) then + stat = nf90_inq_dimid(ncid, "time", dimid) + if (stat .eq. NF90_NOERR) then + stat = nf90_inquire_dimension(ncid, dimid, len=nt) + else + stop "Can't find dimension 'time' in forcing file" + endif + allocate(forc_time(nt)) + stat = nf90_inq_varid(ncid,"time",varid) + stat = nf90_get_var(ncid, varid, forc_time) + endif + + !Now start checking for possible forcing variables and reading them + stat = nf90_inq_varid(ncid,"ug",varid) + if (stat == NF90_NOERR) then + allocate(ug(nlev,nt), vg(nlev,nt)) + stat = nf90_get_var(ncid, varid, ug) + + stat = nf90_inq_varid(ncid,"vg",varid) + stat = nf90_get_var(ncid,varid, vg) + if (stat .ne. NF90_NOERR) stop "can't read geostrophic wind in forcing file" + elseif (stat .ne. NF90_NOERR .and. iugforce==2) then + stop "geostrophic wind not present in forcing file" + endif + + stat = nf90_inq_varid(ncid,"ts",varid) + if (stat == NF90_NOERR) then + allocate(forc_ts(nt)) + stat = nf90_get_var(ncid,varid,forc_ts) + if (stat .ne. NF90_NOERR) stop "can't read surface temperature forcing" + elseif (stat .ne. NF90_NOERR .and. iupdsst==2) then + stop "SSTs not present in forcing file" + endif + + else + print*,'Error opening forcing file!!!!' + stop + endif +endif + +! Process mainnum now has the desired data. If there +! are model nodes, broadcast that information to them. +if(nmachs .gt. 1) then + CALL broadcast_forcing_dims(nlev,nt) + + if (my_rams_num .ne. mainnum) then + if (iugforce==2) then + allocate(forc_lev(nlev),forc_time(nt)) + allocate(ug(nlev,nt),vg(nlev,nt)) + endif + if (iupdsst==2) then + if (.not. allocated(forc_time)) allocate(forc_time(nt)) + allocate(forc_ts(nt)) + endif + endif + + if (iugforce == 2) then + CALL broadcast_forcing (ug,nlev,nt) + CALL broadcast_forcing (vg,nlev,nt) + CALL broadcast_forcing (forc_lev,nlev,1) + endif + if (iupdsst == 2) then + CALL broadcast_forcing (forc_ts,1,nt) + endif + if (iugforce == 2 .or. iupdsst == 2) then + CALL broadcast_forcing (forc_time,1,nt) + endif +endif + +END SUBROUTINE readforcing diff --git a/src/6.3.02/init/gridset.f90 b/src/init/gridset.f90 similarity index 99% rename from src/6.3.02/init/gridset.f90 rename to src/init/gridset.f90 index 0a272b7..a96ab8e 100644 --- a/src/6.3.02/init/gridset.f90 +++ b/src/init/gridset.f90 @@ -162,7 +162,11 @@ Subroutine gridset () zmn(1,1) = 0. zmn(2,1) = deltaz do k = 3,nnzp(1) - dzr = dzrat + if (zmn(k-1,1) kpm(2,nestza) .and. & k <= kpm(nnzp(nestza)-1,nestza) .and. & diff --git a/src/6.3.02/init/rams_grid.f90 b/src/init/rams_grid.f90 similarity index 100% rename from src/6.3.02/init/rams_grid.f90 rename to src/init/rams_grid.f90 diff --git a/src/6.3.02/init/rdint.f90 b/src/init/rdint.f90 similarity index 95% rename from src/6.3.02/init/rdint.f90 rename to src/init/rdint.f90 index b71579f..54652a3 100644 --- a/src/6.3.02/init/rdint.f90 +++ b/src/init/rdint.f90 @@ -13,6 +13,7 @@ Subroutine initlz () use mem_oda use io_params use micphys +use ref_sounding, only: iugforce use kpp_parameters, only:IKPP use node_mod @@ -50,15 +51,18 @@ Subroutine initlz () CALL top_read (ifm) enddo - do ifm = 1,ngrids - CALL sfc_read (ifm) - enddo + if (isfcl .ne. 3) then + do ifm = 1,ngrids + CALL sfc_read (ifm) + enddo + endif ! Define grid topography, transform, latitude-longitude, and map factor arrays. ! Note that this call needs to come after the top_read call since grid_setup(2) ! is setting rtgt which needs topology elevations (topt). CALL grid_setup (2) + if (isfcl .ne. 3) then ! read SST files CALL sst_read (1,ifm,ierr) if (ierr /= 0) then @@ -72,6 +76,7 @@ Subroutine initlz () print*,'rdint: Error in ndvi surface files' stop 'rdint: ndvi surface file error' endif + endif ! The following things will be done for INITIAL = 1 or 3... @@ -90,6 +95,7 @@ Subroutine initlz () print*, '' endif CALL inithh () + if (iugforce==2 .or. iupdsst==2) CALL readforcing () endif ! If "history" initialization or restart, call INITHIS. @@ -159,13 +165,13 @@ Subroutine initlz () ! Reset aerosols on history initialization if((initial==1 .or. initial==2 .or. (initial==3.and.iaerohist==1)) & .and. level<=3) then - if(iaerosol > 0) CALL init_ccn (mzp,mxp,myp & - ,micro_g(ifm)%cccnp (1,1,1) & - ,micro_g(ifm)%cccmp (1,1,1) & + if(iaerosol > 0) CALL init_ccn1 (mzp,mxp,myp & + ,micro_g(ifm)%cn1np (1,1,1) & + ,micro_g(ifm)%cn1mp (1,1,1) & ,basic_g(ifm)%dn0 (1,1,1),ifm) - if(iaerosol > 0) CALL init_gccn (mzp,mxp,myp & - ,micro_g(ifm)%gccnp (1,1,1) & - ,micro_g(ifm)%gccmp (1,1,1) & + if(iaerosol > 0) CALL init_ccn2 (mzp,mxp,myp & + ,micro_g(ifm)%cn2np (1,1,1) & + ,micro_g(ifm)%cn2mp (1,1,1) & ,basic_g(ifm)%dn0 (1,1,1),ifm) if(idust > 0) CALL init_dust (mzp,mxp,myp & ,micro_g(ifm)%md1np (1,1,1) & @@ -248,18 +254,18 @@ Subroutine initlz () endif ! Fill land surface data for all grids that have no standard input files - CALL sfcdata () + if (isfcl .ne. 3) CALL sfcdata () ! Initialize various LEAF variables. - if((initial==1.or.initial==2).and.ipast_sfc == 0) then + if((initial==1.or.initial==2).and.ipast_sfc == 0.and.isfcl.ne.3) then CALL geonest_nofile (1,ngrids) endif ! Reinitialize certain surface variables to prevent inconsistencies ! that arise from horizontal interpolation related to surface patches. ! This is not invoked if current and history grids match. - if(initial==3 .or. ((initial==1.or.initial==2).and.ipast_sfc==1)) then + if(initial==3 .or. ((initial==1.or.initial==2).and.ipast_sfc==1).and.isfcl.ne.3) then if(hrestart == 2) CALL sfcinit_hstart () endif diff --git a/src/6.3.02/init/rhhi.f90 b/src/init/rhhi.f90 similarity index 86% rename from src/6.3.02/init/rhhi.f90 rename to src/init/rhhi.f90 index 07b19d2..737f4dc 100644 --- a/src/6.3.02/init/rhhi.f90 +++ b/src/init/rhhi.f90 @@ -62,7 +62,7 @@ Subroutine arrsnd () implicit none integer :: nnns,k,kk,kkk -real :: toffset,dir,spd,zold1,zold2,tavg,rtss,wt +real :: toffset,dir,spd,zold1,zold2,tavg,rtss,wt,extra real, dimension(:), allocatable :: temp_vec ! Arrange the input sounding @@ -77,9 +77,13 @@ Subroutine arrsnd () vs(nsndg) = 0. enddo - open(1,file='SOUND_IN',status='old',form='formatted') + open(1,file=trim(sound_file),status='old',form='formatted') do nsndg=1,maxsndg - read(1,*,end=1999) ps(nsndg),ts(nsndg),rts(nsndg),us(nsndg),vs(nsndg) + if (io3flg==0) then + read(1,*,end=1999) ps(nsndg),ts(nsndg),rts(nsndg),us(nsndg),vs(nsndg) + elseif (io3flg==1) then + read(1,*,end=1999) ps(nsndg),ts(nsndg),rts(nsndg),us(nsndg),vs(nsndg),o3s(nsndg) + endif if(ps(nsndg).le.0.) go to 1999 enddo 1999 continue @@ -181,6 +185,9 @@ Subroutine arrsnd () 125 format(' HUMIDITY TYPE (IRTSFLG=',I2,') NOT KNOWN') stop endif + + !convert ozone from ppb + if(io3flg.eq.1)o3s(nsndg) = o3s(nsndg)*1.e-9 enddo 300 continue deallocate(temp_vec) @@ -263,6 +270,14 @@ Subroutine refs1d () CALL htint (nsndg,thds,hs,mmzp(ngrid),temp_vec,ztn(1,ngrid)) CALL htint (nsndg,us,hs,mmzp(ngrid),u01dn(1,ngrid),ztn(1,ngrid)) CALL htint (nsndg,vs,hs,mmzp(ngrid),v01dn(1,ngrid),ztn(1,ngrid)) +if (io3flg==1) then + CALL htint(nsndg,o3s,hs,mmzp(ngrid),o3ref(1,ngrid),ztn(1,ngrid)) +endif + +!Calculate number of levels for radiation profiles using a combination +!of the model prognostic grid and the input sounding. If ozone is present, +!also fill the ozone reference profile above the prognostic model top +CALL calc_refs() if (level .ge. 1) then CALL htint (nsndg,rts,hs,mmzp(ngrid),rt01dn(1,ngrid),ztn(1,ngrid)) @@ -294,11 +309,66 @@ Subroutine refs1d () / (rgas * th01dn(k,ngrid) * pi01dn(k,ngrid)) enddo +CALL calc_wsub() + deallocate(temp_vec) return END SUBROUTINE refs1d +!############################################################################## +Subroutine calc_wsub + +use ref_sounding +use mem_grid +use node_mod + +implicit none + +integer :: k + +!Adele - calculate large-scale divergence +wsub(1,ngrid)=0. +do k = 2,nnzp(ngrid) + if (divls<0) then + wsub(k,ngrid) = divls + elseif (divls>0.) then + wsub(k,ngrid)=wsub(k-1,ngrid)-divls*(zmn(k,ngrid)-zmn(k-1,ngrid)) + else + wsub(k,ngrid)=0. + endif +enddo +return +END SUBROUTINE calc_wsub +!############################################################################## +Subroutine calc_refs + +use ref_sounding +use mem_grid +use node_mod + +implicit none + +integer :: k +if (io3flg==1) then + do k=1,nsndg + if (hs(k)>zmn(mmzp(ngrid),ngrid)) then + o3ref(mmzp(ngrid)+1:mmzp(ngrid)+nsndg-k+1,ngrid) = o3s(k:nsndg) + nzref = mmzp(ngrid) + nsndg - k + 1 + exit + endif + enddo +else + do k=1,nsndg + if (hs(k)>zmn(mmzp(ngrid),ngrid)) then + nzref = mmzp(ngrid) + nsndg - k + 1 + exit + endif + enddo +endif + +return +END SUBROUTINE !############################################################################## Subroutine flds3d (n1,n2,n3,i0,j0,uc,vc,pi0,theta,thp,rtp,pc,rv & ,topt,topu,topv,rtgt,rtgu,rtgv) diff --git a/src/6.3.02/init/rinit.f90 b/src/init/rinit.f90 similarity index 100% rename from src/6.3.02/init/rinit.f90 rename to src/init/rinit.f90 diff --git a/src/6.3.02/io/anal_extra.f90 b/src/io/anal_extra.f90 similarity index 100% rename from src/6.3.02/io/anal_extra.f90 rename to src/io/anal_extra.f90 diff --git a/src/6.3.02/io/anal_write.f90 b/src/io/anal_write.f90 similarity index 100% rename from src/6.3.02/io/anal_write.f90 rename to src/io/anal_write.f90 diff --git a/src/6.3.02/io/history_start.f90 b/src/io/history_start.f90 similarity index 97% rename from src/6.3.02/io/history_start.f90 rename to src/io/history_start.f90 index dc46538..c9b7304 100644 --- a/src/6.3.02/io/history_start.f90 +++ b/src/io/history_start.f90 @@ -9,6 +9,8 @@ Subroutine history_start () use node_mod use micro_prm, only:nkr use kpp_parameters, only:nkppz +use ref_sounding, only:iugforce + implicit none @@ -33,6 +35,12 @@ Subroutine history_start () if(print_msg) print*,'back from read' +if (iugforce==2 .or. iupdsst==2) CALL readforcing () + +CALL calc_refs() + +CALL calc_wsub() + do ifm = 1,ngrids icm = nxtnest(ifm) if (icm == 0) then @@ -114,8 +122,10 @@ Subroutine read_distribute_hheader (hnamein) ie=cio_f(iunhd,1,'vs',vs,nsndg) ie=cio_f(iunhd,1,'ts',ts,nsndg) ie=cio_f(iunhd,1,'thds',thds,nsndg) + ie=cio_f(iunhd,1,'rts',rts,nsndg) ie=cio_f(iunhd,1,'ps',ps,nsndg) ie=cio_f(iunhd,1,'hs',hs,nsndg) + if(io3flg==1)ie=cio_f(iunhd,1,'o3s',o3s,nsndg) !Get original simulation type ie=cio_i(iunhd,1,'initorig',initorig,1) diff --git a/src/6.3.02/io/inithis.f90 b/src/io/inithis.f90 similarity index 97% rename from src/6.3.02/io/inithis.f90 rename to src/io/inithis.f90 index 4732c9f..fc95d3c 100644 --- a/src/6.3.02/io/inithis.f90 +++ b/src/io/inithis.f90 @@ -90,8 +90,10 @@ Subroutine inithis (inithisflg) ie=cio_f(iunhd,1,'vs',vs,nsndg) ie=cio_f(iunhd,1,'ts',ts,nsndg) ie=cio_f(iunhd,1,'thds',thds,nsndg) +ie=cio_f(iunhd,1,'rts',rts,nsndg) ie=cio_f(iunhd,1,'ps',ps,nsndg) ie=cio_f(iunhd,1,'hs',hs,nsndg) +if(io3flg==1)ie=cio_f(iunhd,1,'o3s',o3s,nsndg) !Get original simulation type ie=cio_i(iunhd,1,'initorig',initorig,1) @@ -627,6 +629,13 @@ Subroutine inithis (inithisflg) !Deallocate temporary arrays deallocate(u01dn1,v01dn1,rt01dn1,th01dn1,pi01dn1,dn01dn1) + !Calculate number of levels for radiation profiles using a combination + !of the model prognostic grid and the input sounding. If ozone is present, + !also fill the ozone reference profile above the prognostic model top + CALL calc_refs() + + !Calculate large-scale subsidence + CALL calc_wsub() endif !If doing full history initialization !Deallocate temporary arrays @@ -659,6 +668,7 @@ Subroutine sfcinit_hstart () integer :: i,j,ifm,ipat,k,nveg,nsoil,hifm,maxmatch real :: c1,hpis,hprss +if (isfcl == 3) return ! This routine fills the LEAF arrays for a history-initial start. ! Refill many of the LEAF variables, as the interpolated values may not be relevant. @@ -689,7 +699,8 @@ Subroutine sfcinit_hstart () hprss = hpis ** cpor * p00 - leaf_g(ifm)%patch_rough(i,j,1) = 0.001 + leaf_g(ifm)%patch_rought(i,j,1) = 0.001 + leaf_g(ifm)%patch_roughm(i,j,1) = 0.001 do ipat = 2,npatch @@ -701,8 +712,9 @@ Subroutine sfcinit_hstart () !since leaf class may change due to interpolation. Land patch may !now be a small fraction (<.009) or could be significantly different !such as water patch. These values will be correctly set 1st timestep. - leaf_g(ifm)%soil_rough(i,j,ipat) = zrough - leaf_g(ifm)%patch_rough(i,j,ipat) = max(zrough,grid_g(ifm)%topzo(i,j)) + leaf_g(ifm)%soil_rough(i,j,ipat) = ztrough + leaf_g(ifm)%patch_rought(i,j,ipat) = max(ztrough,grid_g(ifm)%topzo(i,j)) + leaf_g(ifm)%patch_roughm(i,j,ipat) = max(zmrough,grid_g(ifm)%topzo(i,j)) leaf_g(ifm)%stom_resist(i,j,ipat) = 1.e6 !Recompute soil moisture since we changed soil classes. Must make @@ -723,7 +735,7 @@ Subroutine sfcinit_hstart () leaf_g(ifm)%sfcwater_nlev(i,j,ipat) = float(k) enddo - !Initialize for all land surface options (isfcl=0,1,2) + !Initialize for most land surface options (isfcl=0,1,2,not 3) !Update this since leaf classes and ndvi have changes due to !history initialization on different grid. if (ipat >= 2) CALL ndvi (ifm & diff --git a/src/6.3.02/io/io_params.f90 b/src/io/io_params.f90 similarity index 100% rename from src/6.3.02/io/io_params.f90 rename to src/io/io_params.f90 diff --git a/src/6.3.02/io/opspec.f90 b/src/io/opspec.f90 similarity index 97% rename from src/6.3.02/io/opspec.f90 rename to src/io/opspec.f90 index 97427a3..98c6f88 100644 --- a/src/6.3.02/io/opspec.f90 +++ b/src/io/opspec.f90 @@ -231,10 +231,12 @@ Subroutine opspec1 () print*,'FATAL - IAERORAD OUT OF RANGE: MUST BE 0-1' IFATERR = IFATERR + 1 endif - if (iaerorad .eq. 1 .and. (iswrtyp.ne.3 .or. ilwrtyp.ne.3)) THEN + if (iaerorad .eq. 1 .and. (iswrtyp.eq.1 .or. ilwrtyp.eq.1 .or. & + iswrtyp.eq.2 .or. ilwrtyp.eq.2 .or. & + iswrtyp.eq.4 .or. ilwrtyp.eq.4)) THEN print*,'FATAL - Aerosol radiation turned on but will' print*,' only impact shortwave and/or longwave' - print*,' radiation if type is set to 3 (Harrington)' + print*,' radiation if type is set to 3(Harrington) or 5(RTE-RRTMGP)' IFATERR = IFATERR + 1 endif @@ -293,6 +295,10 @@ Subroutine opspec1 () print*,'FATAL - ISNOW OUT OF RANGE' IFATERR = IFATERR + 1 endif + if (iifn .eq. 4 .and. itrkdustifn .eq. 1) then + print*, 'FATAL - ITRKDUSTIFN must be 0 when using simple icenuc (iifn=4)' + IFATERR = IFATERR + 1 + endif if (iaggr .lt. 0 .or. iaggr .gt. 5) THEN print*,'FATAL - IAGGR OUT OF RANGE' IFATERR = IFATERR + 1 @@ -317,8 +323,8 @@ Subroutine opspec1 () print*,'FATAL - IMBUDGET OUT OF RANGE' IFATERR = IFATERR + 1 endif - if (iifn .lt. 0 .or. iifn .gt. 3) THEN - print*,'FATAL - IIFN OUT OF RANGE: MUST BE 0-3' + if (iifn .lt. 0 .or. iifn .gt. 4) THEN + print*,'FATAL - IIFN OUT OF RANGE: MUST BE 0-4' IFATERR = IFATERR + 1 endif if (isedim .lt. 0 .or. isedim .gt. 1) THEN @@ -381,6 +387,10 @@ Subroutine opspec1 () print*,'Either set IDUST>0 or set ITRKDUST=ITRKDUSTIFN=0' IFATERR = IFATERR + 1 endif + if ((iaerodep.eq.1 .and. isfcl.eq.3)) THEN + print*,'FATAL - The surface scheme must be turned on to run aerosol deposition' + IFATERR = IFATERR + 1 + endif elseif (level .eq. 4) then idriz=0 if (ipris>0.or.isnow>0.or.iaggr>0.or.igraup>0.or.ihail>0) then @@ -838,7 +848,7 @@ Subroutine opspec3 () ifaterr = ifaterr + 1 endif -IF(ISFCL.GT.0.AND.NZG.LE.2)THEN +IF(ISFCL.GT.0.AND.ISFCL.LT.3.AND.NZG.LE.2)THEN PRINT*, & ' FATAL - at least 3 soil levels are needed for soil' & ,' model.' diff --git a/src/6.3.02/io/ranlavg.f90 b/src/io/ranlavg.f90 similarity index 100% rename from src/6.3.02/io/ranlavg.f90 rename to src/io/ranlavg.f90 diff --git a/src/6.3.02/io/rcio.f90 b/src/io/rcio.f90 similarity index 98% rename from src/6.3.02/io/rcio.f90 rename to src/io/rcio.f90 index 6120f02..88bb468 100644 --- a/src/6.3.02/io/rcio.f90 +++ b/src/io/rcio.f90 @@ -53,8 +53,10 @@ Subroutine commio (io,iun) ie=cio_f(iun,irw,'vs',vs,nsndg) ie=cio_f(iun,irw,'ts',ts,nsndg) ie=cio_f(iun,irw,'thds',thds,nsndg) +ie=cio_f(iun,irw,'rts',rts,nsndg) ie=cio_f(iun,irw,'ps',ps,nsndg) ie=cio_f(iun,irw,'hs',hs,nsndg) +if(io3flg==1)ie=cio_f(iun,irw,'o3s',o3s,nsndg) !Grid navigation and structures ie=cio_i1(iun,irw,'ihtran',ihtran,1) diff --git a/src/6.3.02/io/rname.f90 b/src/io/rname.f90 similarity index 93% rename from src/6.3.02/io/rname.f90 rename to src/io/rname.f90 index 25bafea..a081a55 100644 --- a/src/6.3.02/io/rname.f90 +++ b/src/io/rname.f90 @@ -7,7 +7,7 @@ Subroutine nvfillm (group,vr,ii,ff,cc,nv) use mem_all use node_mod -use leaf_coms, only:ifreeslip +use leaf_coms, only:ifreeslip,icharnock implicit none @@ -25,7 +25,7 @@ Subroutine nvfillm (group,vr,ii,ff,cc,nv) real :: ff integer :: ii,nv integer :: inrflg -integer, parameter ::nvgrid=37,nvstrt=77,nvindat=145,nvsound=10 +integer, parameter ::nvgrid=38,nvstrt=77,nvindat=152,nvsound=13 integer :: igrids(nvgrid),istart(nvstrt),iindat(nvindat),isound(nvsound) character(len=16) :: grids(nvgrid),start(nvstrt),indat(nvindat),sound(nvsound) data igrids/nvgrid*0/,istart/nvstrt*0/,iindat/nvindat*0/,isound/nvsound*0/ @@ -33,7 +33,7 @@ Subroutine nvfillm (group,vr,ii,ff,cc,nv) DATA GRIDS/ & 'EXPNME','RUNTYPE','TIMEUNIT','TIMMAX','IMONTH1','IDATE1','IYEAR1' & ,'ITIME1','NGRIDS','NNXP','NNYP','NNZP','NZG','NZS','NXTNEST' & - ,'IPRNTSTMT','IHTRAN','DELTAX','DELTAZ','DZRAT' & + ,'IPRNTSTMT','IHTRAN','DELTAX','DELTAZ','DZRAT','ZDELAY' & ,'DZMAX','ZZ','DTLONG','NACOUST','NSTRATX' & ,'NNDTRAT','NESTZ','NSTRATZ','POLELAT','POLELON','NINEST','NJNEST' & ,'NKNEST','CENTLAT','CENTLON','NNSTTOP','NNSTBOT'/ @@ -54,12 +54,14 @@ Subroutine nvfillm (group,vr,ii,ff,cc,nv) ,'ISSTFN','IVEGTFN','ISOILFN','NDVIFN','ITOPSFLG','TOPTENH' & ,'TOPTWVL','IZ0FLG','Z0MAX','Z0FACT'/ DATA INDAT/ & - 'ICORFLG','IBND','JBND','CPHAS','LSFLG','NFPT','DISTIM','ISWRTYP' & + 'ICORFLG','IUGFORCE','FORCINGFILE','DIVLS','IBND','JBND','ISPONGE_PTS' & + ,'SPONGE_TAU','CPHAS','LSFLG','NFPT','DISTIM','ISWRTYP' & ,'ILWRTYP','RADFRQ','LONRAD','NNQPARM','CONFRQ','WCLDBS','IKPP' & ,'NKPPZ','FRQKPP','RELAX_SST','RELAX_OCNT','RELAX_SAL','DMAXKPP' & ,'DSCALEKPP','KPPITERMAX','KPPRNT','UBMN_KPP','NPATCH','NVEGPAT' & ,'ISFCL','IFREESLIP','SIBFILE','CO2_INIT','ISOILDAT','SNUDCENT' & - ,'ISNOWDAT','NVGCON','PCTLCON','NSLCON','ZROUGH','ALBEDO','SEATMP' & + ,'ISNOWDAT','NVGCON','PCTLCON','NSLCON','ZTROUGH','ZMROUGH' & + ,'ICHARNOCK','ALBEDO','SEATMP' & ,'DTHCON','DRTCON','SLZ','SLMSTR','STGOFF','IDIFFK','IDIFFPERTS' & ,'IHORGRAD','CSX','CSZ','XKHKM','ZKHKM','AKMIN','IBUBBLE','IBUBGRD' & ,'IBDXIA','IBDXIZ','IBDYJA','IBDYJZ','IBDZK1','IBDZK2','BTHP' & @@ -71,14 +73,15 @@ Subroutine nvfillm (group,vr,ii,ff,cc,nv) ,'IGRAUP','IHAIL','CPARM','DPARM','RPARM','PPARM','SPARM','APARM' & ,'GPARM','HPARM','GNU','HUCMFILE','NDTCOLL','IAEROSOL','ISALT' & ,'IDUST','IDUSTLOFT','DUSTFILE','ICCNLEV','IIFN','IIFN_FORMULA' & - ,'IAERORAD','IAERODEP','IAEROPRNT','IAEROHIST','CIN_MAX','CCN_MAX' & - ,'GCCN_MAX','DUST1_MAX','DUST2_MAX','SALTF_MAX','SALTJ_MAX' & + ,'IAERORAD','IAERODEP','IAEROPRNT','IAEROHIST','CIN_MAX','CCN1_MAX' & + ,'CCN2_MAX','DUST1_MAX','DUST2_MAX','SALTF_MAX','SALTJ_MAX' & ,'SALTS_MAX','IAEROLBC','ICO2LBC','BCTAU','IAERO_CHEM' & ,'AERO_EPSILON','AERO_MEDRAD','ITRKEPSILON','ITRKDUST' & ,'ITRKDUSTIFN','SCMTIME','ISCMX','ISCMY','FRACSAT','IABCARB' & ,'ABC1_MAX','ABC2_MAX'/ DATA SOUND/ & - 'IPSFLG','ITSFLG','IRTSFLG','IUSFLG','HS','PS','TS','RTS','US','VS'/ + 'IPSFLG','ITSFLG','IRTSFLG','IUSFLG','IO3FLG','SOUND_FILE' & + ,'HS','PS','TS','RTS','US','VS','O3S'/ !############################################################################## interface @@ -130,6 +133,7 @@ END SUBROUTINE varseti IF(VR.EQ.'DELTAX') CALL varsetf (VR,DELTAX,NV,1,FF,.001,1.E6) IF(VR.EQ.'DELTAZ') CALL varsetf (VR,DELTAZ,NV,1,FF,0.,1.E5) IF(VR.EQ.'DZRAT') CALL varsetf (VR,DZRAT,NV,1,FF,.1,10.) + IF(VR.EQ.'ZDELAY') CALL varsetf (VR,ZDELAY,NV,1,FF,0.,1.E6) IF(VR.EQ.'DZMAX') CALL varsetf (VR,DZMAX,NV,1,FF,.001,1.E5) IF(VR.EQ.'ZZ') CALL varsetf (VR,ZZ(NV),NV,NZPMAX,FF,0.,1.E6) IF(VR.EQ.'DTLONG') CALL varsetf (VR,DTLONG,NV,1,FF,0.,1.E8) @@ -235,14 +239,19 @@ END SUBROUTINE varseti CALL varchk (VR,GROUP,INDAT,IINDAT,NVINDAT,INRFLG) IF(INRFLG.EQ.1) RETURN IF(VR.EQ.'ICORFLG') CALL varseti (VR,ICORFLG,NV,1,II,0,1) + IF(VR.EQ.'IUGFORCE') CALL varseti (VR,IUGFORCE,NV,1,II,0,2) + IF(VR.EQ.'FORCINGFILE') CALL varsetc (VR,FORCINGFILE,NV,1,CC,1,strl1) + IF(VR.EQ.'DIVLS') CALL varsetf (VR,DIVLS,NV,1,FF,-1.,1.) IF(VR.EQ.'IBND') CALL varseti (VR,IBND,NV,1,II,1,2) IF(VR.EQ.'JBND') CALL varseti (VR,JBND,NV,1,II,1,2) + IF(VR.EQ.'ISPONGE_PTS') CALL varseti (VR,ISPONGE_PTS(NV),NV,MAXGRDS,II,0,100) + IF(VR.EQ.'SPONGE_TAU') CALL varsetf (VR,SPONGE_TAU(NV),NV,MAXGRDS,FF,0.,43200.) IF(VR.EQ.'CPHAS') CALL varsetf (VR,CPHAS,NV,1,FF,.001,1.E8) IF(VR.EQ.'LSFLG') CALL varseti (VR,LSFLG,NV,1,II,0,3) IF(VR.EQ.'NFPT') CALL varseti (VR,NFPT,NV,1,II,0,10000) IF(VR.EQ.'DISTIM') CALL varsetf (VR,DISTIM,NV,1,FF,0.,10000.) - IF(VR.EQ.'ISWRTYP') CALL varseti (VR,ISWRTYP,NV,1,II,0,3) - IF(VR.EQ.'ILWRTYP') CALL varseti (VR,ILWRTYP,NV,1,II,0,3) + IF(VR.EQ.'ISWRTYP') CALL varseti (VR,ISWRTYP,NV,1,II,0,5) + IF(VR.EQ.'ILWRTYP') CALL varseti (VR,ILWRTYP,NV,1,II,0,5) IF(VR.EQ.'RADFRQ') CALL varsetf (VR,RADFRQ,NV,1,FF,.001,100000.) IF(VR.EQ.'LONRAD') CALL varseti (VR,LONRAD,NV,1,II,0,1) IF(VR.EQ.'NNQPARM') CALL varseti (VR,NNQPARM(NV),NV,MAXGRDS,II,0,2) @@ -261,7 +270,7 @@ END SUBROUTINE varseti IF(VR.EQ.'UBMN_KPP') CALL varsetf (VR,UBMN_KPP,NV,1,FF,0.,7.) IF(VR.EQ.'NPATCH') CALL varseti (VR,NPATCH,NV,1,II,2,10) IF(VR.EQ.'NVEGPAT') CALL varseti (VR,NVEGPAT,NV,1,II,1,10) - IF(VR.EQ.'ISFCL') CALL varseti (VR,ISFCL,NV,1,II,0,2) + IF(VR.EQ.'ISFCL') CALL varseti (VR,ISFCL,NV,1,II,0,3) IF(VR.EQ.'IFREESLIP') CALL varseti (VR,IFREESLIP,NV,1,II,0,1) IF(VR.EQ.'SIBFILE') CALL varsetc (VR,SIBFILE,NV,1,CC,1,strl1) IF(VR.EQ.'CO2_INIT') CALL varsetf (VR,CO2_INIT(NV),NV,NZPMAX,FF,0.,1000.) @@ -271,11 +280,13 @@ END SUBROUTINE varseti IF(VR.EQ.'NVGCON') CALL varseti (VR,NVGCON,NV,1,II,0,20) IF(VR.EQ.'PCTLCON') CALL varsetf (VR,PCTLCON,NV,1,FF,0.,1.) IF(VR.EQ.'NSLCON') CALL varseti (VR,NSLCON,NV,1,II,1,12) - IF(VR.EQ.'ZROUGH') CALL varsetf (VR,ZROUGH,NV,1,FF,.0001,100.) + IF(VR.EQ.'ZTROUGH') CALL varsetf (VR,ZTROUGH,NV,1,FF,.0001,100.) + IF(VR.EQ.'ZMROUGH') CALL varsetf (VR,ZMROUGH,NV,1,FF,.0001,100.) + IF(VR.EQ.'ICHARNOCK') CALL varseti (VR,ICHARNOCK,NV,1,II,0,1) IF(VR.EQ.'ALBEDO') CALL varsetf (VR,ALBEDO,NV,1,FF,0.,1.) IF(VR.EQ.'SEATMP') CALL varsetf (VR,SEATMP,NV,1,FF,100.,500.) - IF(VR.EQ.'DTHCON') CALL varsetf (VR,DTHCON,NV,1,FF,-100.,100.) - IF(VR.EQ.'DRTCON') CALL varsetf (VR,DRTCON,NV,1,FF,-1.,1.) + IF(VR.EQ.'DTHCON') CALL varsetf (VR,DTHCON,NV,1,FF,-500.,500.) + IF(VR.EQ.'DRTCON') CALL varsetf (VR,DRTCON,NV,1,FF,-500.,500.) IF(VR.EQ.'SLZ') CALL varsetf (VR,SLZ(NV),NV,NZGMAX,FF,-1.E5,0.) IF(VR.EQ.'SLMSTR') CALL varsetf (VR,SLMSTR(NV),NV,NZGMAX,FF,0.,1.) IF(VR.EQ.'STGOFF') CALL varsetf (VR,STGOFF(NV),NV,NZGMAX,FF,-50.,50.) @@ -354,15 +365,15 @@ END SUBROUTINE varseti IF(VR.EQ.'IDUSTLOFT') CALL varseti (VR,IDUSTLOFT,NV,1,II,0,99) IF(VR.EQ.'DUSTFILE') CALL varsetc (VR,DUSTFILE,NV,1,CC,1,strl1) IF(VR.EQ.'ICCNLEV') CALL varseti (VR,ICCNLEV,NV,1,II,0,3) - IF(VR.EQ.'IIFN') CALL varseti (VR,IIFN,NV,1,II,0,3) + IF(VR.EQ.'IIFN') CALL varseti (VR,IIFN,NV,1,II,0,4) IF(VR.EQ.'IIFN_FORMULA') CALL varseti (VR,IIFN_FORMULA,NV,1,II,1,2) IF(VR.EQ.'IAERORAD') CALL varseti (VR,IAERORAD,NV,1,II,0,1) IF(VR.EQ.'IAERODEP') CALL varseti (VR,IAERODEP,NV,1,II,0,1) IF(VR.EQ.'IAEROPRNT') CALL varseti (VR,IAEROPRNT,NV,1,II,0,1) IF(VR.EQ.'IAEROHIST') CALL varseti (VR,IAEROHIST,NV,1,II,0,1) - IF(VR.EQ.'CIN_MAX') CALL varsetf (VR,CIN_MAX,NV,1,FF,0.,1.E4) - IF(VR.EQ.'CCN_MAX') CALL varsetf (VR,CCN_MAX,NV,1,FF,0.,1.E4) - IF(VR.EQ.'GCCN_MAX') CALL varsetf (VR,GCCN_MAX,NV,1,FF,0.,1.E4) + IF(VR.EQ.'CIN_MAX') CALL varsetf (VR,CIN_MAX,NV,1,FF,-2.,1.E3) + IF(VR.EQ.'CCN1_MAX') CALL varsetf (VR,CCN1_MAX,NV,1,FF,0.,1.E4) + IF(VR.EQ.'CCN2_MAX') CALL varsetf (VR,CCN2_MAX,NV,1,FF,0.,1.E4) IF(VR.EQ.'DUST1_MAX') CALL varsetf (VR,DUST1_MAX,NV,1,FF,0.,1.E4) IF(VR.EQ.'DUST2_MAX') CALL varsetf (VR,DUST2_MAX,NV,1,FF,0.,1.E4) IF(VR.EQ.'ABC1_MAX') CALL varsetf (VR,ABC1_MAX,NV,1,FF,0.,1.E4) @@ -388,12 +399,15 @@ END SUBROUTINE varseti IF(VR.EQ.'ITSFLG') CALL varseti (VR,ITSFLG,NV,1,II,0,10) IF(VR.EQ.'IRTSFLG') CALL varseti (VR,IRTSFLG,NV,1,II,0,10) IF(VR.EQ.'IUSFLG') CALL varseti (VR,IUSFLG,NV,1,II,0,10) + IF(VR.EQ.'IO3FLG') CALL varseti (VR,IO3FLG,NV,1,II,0,10) + IF(VR.EQ.'SOUND_FILE') CALL varsetc (VR,SOUND_FILE,NV,1,CC,1,strl1) IF(VR.EQ.'HS') CALL varsetf (VR,HS(NV),NV,MAXSNDG,FF,-1.e3,1.E5) IF(VR.EQ.'PS') CALL varsetf (VR,PS(NV),NV,MAXSNDG,FF,0.,1.E7) IF(VR.EQ.'TS') CALL varsetf (VR,TS(NV),NV,MAXSNDG,FF,-200.,1000.) IF(VR.EQ.'RTS') CALL varsetf (VR,RTS(NV),NV,MAXSNDG,FF,-200.,1000.) IF(VR.EQ.'US') CALL varsetf (VR,US(NV),NV,MAXSNDG,FF,-500.,500.) IF(VR.EQ.'VS') CALL varsetf (VR,VS(NV),NV,MAXSNDG,FF,-500.,500.) + IF(VR.EQ.'O3S') CALL varsetf (VR,O3S(NV),NV,MAXSNDG,FF,0.,1.e10) ENDIF return @@ -404,7 +418,7 @@ Subroutine nameout () use mem_all use isan_coms -use leaf_coms, only:ifreeslip +use leaf_coms, only:ifreeslip,icharnock implicit none @@ -426,7 +440,7 @@ Subroutine nameout () ,ISSTFLG(NG),IVEGTFLG(NG),NG=1,NGRIDS) WRITE(6,104)(' ',ISOILFLG(NG),NDVIFLG(NG) & ,NNQPARM(NG),IDIFFK(NG),NG=1,NGRIDS) -WRITE(6,105)(' ',IAEROLBC(NG),ICO2LBC(NG) & +WRITE(6,105)(' ',IAEROLBC(NG),ICO2LBC(NG),ISPONGE_PTS(NG) & ,NG=1,NGRIDS) 101 FORMAT(A1,' NNXP=',I4,' NNYP=',I4,' NNZP=',I4 & @@ -438,7 +452,7 @@ Subroutine nameout () 104 FORMAT(A1,'ISOILFLG=',I4,' NDVIFLG=',I4 & ,' NNQPARM=',I4,' IDIFFK=',I4,999(A1,/,I14,3I16)) 105 FORMAT(A1,'IAEROLBC=',I4,' ICO2LBC=',I4 & - ,999(A1,/,I14,1I16)) + ,' ISPONGE_PT=',I4,999(A1,/,I14,2I16)) PRINT*, ' ' @@ -467,6 +481,7 @@ Subroutine nameout () ,'IUPDNDVI=',IUPDNDVI & ,'IUPDSST=',IUPDSST & ,'ICORFLG=',ICORFLG & + ,'IUGFORCE=',IUGFORCE & ,'IBND=',IBND & ,'JBND=',JBND & ,'LSFLG=',LSFLG & @@ -478,6 +493,7 @@ Subroutine nameout () ,'NVEGPAT=',NVEGPAT & ,'ISFCL=',ISFCL & ,'IFREESLIP=',IFREESLIP & + ,'ICHARNOCK=',ICHARNOCK & ,'IKPP=',IKPP & ,'NKPPZ=',NKPPZ & ,'KPPITERMAX=',KPPITERMAX & @@ -543,6 +559,7 @@ Subroutine nameout () ,'ITSFLG=',ITSFLG & ,'IRTSFLG=',IRTSFLG & ,'IUSFLG=',IUSFLG & + ,'IO3FLG=',IO3FLG & ,'IMPL=',IMPL PRINT*, ' ' @@ -552,6 +569,7 @@ Subroutine nameout () ,'DELTAX=',DELTAX & ,'DELTAZ=',DELTAZ & ,'DZRAT=',DZRAT & + ,'ZDELAY=',ZDELAY & ,'DZMAX=',DZMAX & ,'DTLONG=',DTLONG & ,'POLELAT=',POLELAT & @@ -565,6 +583,7 @@ Subroutine nameout () ,'Z0FACT=',Z0FACT & ,'CPHAS=',CPHAS & ,'DISTIM=',DISTIM & + ,'DIVLS=',DIVLS & ,'RADFRQ=',RADFRQ & ,'CONFRQ=',CONFRQ & ,'FRQKPP=',FRQKPP & @@ -576,7 +595,8 @@ Subroutine nameout () ,'UBMN_KPP=',UBMN_KPP & ,'WCLDBS=',WCLDBS & ,'PCTLCON=',PCTLCON & - ,'ZROUGH=',ZROUGH & + ,'ZTROUGH=',ZTROUGH & + ,'ZMROUGH=',ZMROUGH & ,'ALBEDO=',ALBEDO & ,'SEATMP=',SEATMP & ,'DTHCON=',DTHCON & @@ -604,8 +624,8 @@ Subroutine nameout () ,'GPARM=',GPARM & ,'HPARM=',HPARM & ,'CIN_MAX=',CIN_MAX & - ,'CCN_MAX=',CCN_MAX & - ,'GCCN_MAX=',GCCN_MAX & + ,'CCN1_MAX=',CCN1_MAX & + ,'CCN2_MAX=',CCN2_MAX & ,'DUST1_MAX=',DUST1_MAX & ,'DUST2_MAX=',DUST2_MAX & ,'ABC1_MAX=',ABC1_MAX & @@ -620,14 +640,14 @@ Subroutine nameout () WRITE(6,301)(' ',TOPTENH(NG),TOPTWVL(NG),CENTLAT(NG),NG=1,NGRIDS) WRITE(6,302)(' ',CENTLON(NG),CSX(NG),CSZ(NG),NG=1,NGRIDS) WRITE(6,303)(' ',XKHKM(NG),ZKHKM(NG),AKMIN(NG),NG=1,NGRIDS) -WRITE(6,304)(' ',BCTAU(NG),NG=1,NGRIDS) +WRITE(6,304)(' ',BCTAU(NG),SPONGE_TAU(NG),NG=1,NGRIDS) 301 FORMAT(A1,'TOPTENH=',E12.5,' TOPTWVL=',E12.5 & ,' CENTLAT=',E12.5,999(A1,/,E21.5,2E28.5)) 302 FORMAT(A1,'CENTLON=',E12.5,' CSX=',E12.5 & ,' CSZ=',E12.5,999(A1,/,E21.5,2E28.5)) 303 FORMAT(A1,' XKHKM=',E12.5,' ZKHKM=',E12.5 & ,' AKMIN=',E12.5,999(A1,/,E21.5,2E28.5)) -304 FORMAT(A1,' BCTAU=',E12.5,999(A1,/,E21.5)) +304 FORMAT(A1,' BCTAU=',E12.5' SPONGE_TAU=',E12.5,999(A1,/,E21.5,E28.5)) PRINT*, ' ' @@ -780,7 +800,7 @@ Subroutine namein (IUNIT,GROUP) NVARN=0 CALL findgr (IUNIT,GROUP) DO 10 NR=1,MAXREC - READ(IUNIT,'(A80)',END=100)LINE + READ(IUNIT,'(A256)',END=100)LINE CALL strip (LINE,LINEW,NCW) NCW=MAX(NCW,1) CALL toknze (LINEW,NCW,TOKENS,NTOK) diff --git a/src/6.3.02/io/rprnt.f90 b/src/io/rprnt.f90 similarity index 100% rename from src/6.3.02/io/rprnt.f90 rename to src/io/rprnt.f90 diff --git a/src/6.3.02/isan/aobj.f90 b/src/isan/aobj.f90 similarity index 100% rename from src/6.3.02/isan/aobj.f90 rename to src/isan/aobj.f90 diff --git a/src/6.3.02/isan/asgen.f90 b/src/isan/asgen.f90 similarity index 100% rename from src/6.3.02/isan/asgen.f90 rename to src/isan/asgen.f90 diff --git a/src/6.3.02/isan/asti.f90 b/src/isan/asti.f90 similarity index 100% rename from src/6.3.02/isan/asti.f90 rename to src/isan/asti.f90 diff --git a/src/6.3.02/isan/asti2.f90 b/src/isan/asti2.f90 similarity index 100% rename from src/6.3.02/isan/asti2.f90 rename to src/isan/asti2.f90 diff --git a/src/6.3.02/isan/astp.f90 b/src/isan/astp.f90 similarity index 100% rename from src/6.3.02/isan/astp.f90 rename to src/isan/astp.f90 diff --git a/src/6.3.02/isan/avarf.f90 b/src/isan/avarf.f90 similarity index 100% rename from src/6.3.02/isan/avarf.f90 rename to src/isan/avarf.f90 diff --git a/src/6.3.02/isan/file_inv.f90 b/src/isan/file_inv.f90 similarity index 100% rename from src/6.3.02/isan/file_inv.f90 rename to src/isan/file_inv.f90 diff --git a/src/6.3.02/isan/isan_coms.f90 b/src/isan/isan_coms.f90 similarity index 100% rename from src/6.3.02/isan/isan_coms.f90 rename to src/isan/isan_coms.f90 diff --git a/src/6.3.02/isan/isan_io.f90 b/src/isan/isan_io.f90 similarity index 100% rename from src/6.3.02/isan/isan_io.f90 rename to src/isan/isan_io.f90 diff --git a/src/6.3.02/isan/isan_name.f90 b/src/isan/isan_name.f90 similarity index 99% rename from src/6.3.02/isan/isan_name.f90 rename to src/isan/isan_name.f90 index 472f372..bc28c07 100644 --- a/src/6.3.02/isan/isan_name.f90 +++ b/src/isan/isan_name.f90 @@ -117,7 +117,7 @@ Subroutine namein_isan (IUNIT,GROUP) NVARN=0 CALL findgr (IUNIT,GROUP) DO 10 NR=1,MAXREC - READ(IUNIT,'(A80)',END=100)LINE + READ(IUNIT,'(A256)',END=100)LINE CALL strip (LINE,LINEW,NCW) NCW=MAX(NCW,1) CALL toknze (LINEW,NCW,TOKENS,NTOK) diff --git a/src/6.3.02/isan/refstate.f90 b/src/isan/refstate.f90 similarity index 100% rename from src/6.3.02/isan/refstate.f90 rename to src/isan/refstate.f90 diff --git a/src/6.3.02/isan/v_interps.f90 b/src/isan/v_interps.f90 similarity index 100% rename from src/6.3.02/isan/v_interps.f90 rename to src/isan/v_interps.f90 diff --git a/src/6.3.02/isan/write_varf.f90 b/src/isan/write_varf.f90 similarity index 100% rename from src/6.3.02/isan/write_varf.f90 rename to src/isan/write_varf.f90 diff --git a/src/6.3.02/kpp/kpp_coeffs.f90 b/src/kpp/kpp_coeffs.f90 similarity index 100% rename from src/6.3.02/kpp/kpp_coeffs.f90 rename to src/kpp/kpp_coeffs.f90 diff --git a/src/6.3.02/kpp/kpp_init.f90 b/src/kpp/kpp_init.f90 similarity index 100% rename from src/6.3.02/kpp/kpp_init.f90 rename to src/kpp/kpp_init.f90 diff --git a/src/6.3.02/kpp/kpp_mix.f90 b/src/kpp/kpp_mix.f90 similarity index 100% rename from src/6.3.02/kpp/kpp_mix.f90 rename to src/kpp/kpp_mix.f90 diff --git a/src/6.3.02/kpp/kpp_ocint.f90 b/src/kpp/kpp_ocint.f90 similarity index 100% rename from src/6.3.02/kpp/kpp_ocint.f90 rename to src/kpp/kpp_ocint.f90 diff --git a/src/6.3.02/kpp/kpp_override.f90 b/src/kpp/kpp_override.f90 similarity index 100% rename from src/6.3.02/kpp/kpp_override.f90 rename to src/kpp/kpp_override.f90 diff --git a/src/6.3.02/kpp/kpp_params.f90 b/src/kpp/kpp_params.f90 similarity index 100% rename from src/6.3.02/kpp/kpp_params.f90 rename to src/kpp/kpp_params.f90 diff --git a/src/6.3.02/kpp/kpp_timestep.f90 b/src/kpp/kpp_timestep.f90 similarity index 100% rename from src/6.3.02/kpp/kpp_timestep.f90 rename to src/kpp/kpp_timestep.f90 diff --git a/src/6.3.02/kpp/kpp_typexfer.f90 b/src/kpp/kpp_typexfer.f90 similarity index 100% rename from src/6.3.02/kpp/kpp_typexfer.f90 rename to src/kpp/kpp_typexfer.f90 diff --git a/src/6.3.02/lib/an_header.f90 b/src/lib/an_header.f90 similarity index 100% rename from src/6.3.02/lib/an_header.f90 rename to src/lib/an_header.f90 diff --git a/src/6.3.02/lib/charutils.f90 b/src/lib/charutils.f90 similarity index 100% rename from src/6.3.02/lib/charutils.f90 rename to src/lib/charutils.f90 diff --git a/src/6.3.02/lib/dateutils.f90 b/src/lib/dateutils.f90 similarity index 100% rename from src/6.3.02/lib/dateutils.f90 rename to src/lib/dateutils.f90 diff --git a/src/6.3.02/lib/griber_grb1.c b/src/lib/griber_grb1.c similarity index 100% rename from src/6.3.02/lib/griber_grb1.c rename to src/lib/griber_grb1.c diff --git a/src/6.3.02/lib/griber_grb2.c b/src/lib/griber_grb2.c similarity index 100% rename from src/6.3.02/lib/griber_grb2.c rename to src/lib/griber_grb2.c diff --git a/src/6.3.02/lib/hdf5_f2c.c b/src/lib/hdf5_f2c.c similarity index 100% rename from src/6.3.02/lib/hdf5_f2c.c rename to src/lib/hdf5_f2c.c diff --git a/src/6.3.02/lib/hdf5_utils.f90 b/src/lib/hdf5_utils.f90 similarity index 100% rename from src/6.3.02/lib/hdf5_utils.f90 rename to src/lib/hdf5_utils.f90 diff --git a/src/6.3.02/lib/interp_lib.f90 b/src/lib/interp_lib.f90 similarity index 100% rename from src/6.3.02/lib/interp_lib.f90 rename to src/lib/interp_lib.f90 diff --git a/src/6.3.02/lib/map_proj.f90 b/src/lib/map_proj.f90 similarity index 100% rename from src/6.3.02/lib/map_proj.f90 rename to src/lib/map_proj.f90 diff --git a/src/6.3.02/lib/numutils.f90 b/src/lib/numutils.f90 similarity index 100% rename from src/6.3.02/lib/numutils.f90 rename to src/lib/numutils.f90 diff --git a/src/6.3.02/lib/parlib.c b/src/lib/parlib.c similarity index 100% rename from src/6.3.02/lib/parlib.c rename to src/lib/parlib.c diff --git a/src/6.3.02/lib/polarst.f90 b/src/lib/polarst.f90 similarity index 100% rename from src/6.3.02/lib/polarst.f90 rename to src/lib/polarst.f90 diff --git a/src/6.3.02/lib/rconstants.f90 b/src/lib/rconstants.f90 similarity index 100% rename from src/6.3.02/lib/rconstants.f90 rename to src/lib/rconstants.f90 diff --git a/src/6.3.02/lib/rget.F90 b/src/lib/rget.F90 similarity index 100% rename from src/6.3.02/lib/rget.F90 rename to src/lib/rget.F90 diff --git a/src/6.3.02/lib/rnamel.f90 b/src/lib/rnamel.f90 similarity index 100% rename from src/6.3.02/lib/rnamel.f90 rename to src/lib/rnamel.f90 diff --git a/src/6.3.02/lib/rsys.F90 b/src/lib/rsys.F90 similarity index 100% rename from src/6.3.02/lib/rsys.F90 rename to src/lib/rsys.F90 diff --git a/src/6.3.02/lib/therm_lib.f90 b/src/lib/therm_lib.f90 similarity index 100% rename from src/6.3.02/lib/therm_lib.f90 rename to src/lib/therm_lib.f90 diff --git a/src/6.3.02/lib/utils_c.c b/src/lib/utils_c.c similarity index 100% rename from src/6.3.02/lib/utils_c.c rename to src/lib/utils_c.c diff --git a/src/6.3.02/lib/utils_f.f90 b/src/lib/utils_f.f90 similarity index 100% rename from src/6.3.02/lib/utils_f.f90 rename to src/lib/utils_f.f90 diff --git a/src/6.3.02/memory/alloc.f90 b/src/memory/alloc.f90 similarity index 100% rename from src/6.3.02/memory/alloc.f90 rename to src/memory/alloc.f90 diff --git a/src/6.3.02/memory/grid_dims.f90 b/src/memory/grid_dims.f90 similarity index 100% rename from src/6.3.02/memory/grid_dims.f90 rename to src/memory/grid_dims.f90 diff --git a/src/6.3.02/memory/grid_struct.f90 b/src/memory/grid_struct.f90 similarity index 100% rename from src/6.3.02/memory/grid_struct.f90 rename to src/memory/grid_struct.f90 diff --git a/src/6.3.02/memory/mem_all.f90 b/src/memory/mem_all.f90 similarity index 100% rename from src/6.3.02/memory/mem_all.f90 rename to src/memory/mem_all.f90 diff --git a/src/6.3.02/memory/mem_basic.f90 b/src/memory/mem_basic.f90 similarity index 100% rename from src/6.3.02/memory/mem_basic.f90 rename to src/memory/mem_basic.f90 diff --git a/src/6.3.02/memory/mem_cuparm.f90 b/src/memory/mem_cuparm.f90 similarity index 100% rename from src/6.3.02/memory/mem_cuparm.f90 rename to src/memory/mem_cuparm.f90 diff --git a/src/6.3.02/memory/mem_grid.f90 b/src/memory/mem_grid.f90 similarity index 98% rename from src/6.3.02/memory/mem_grid.f90 rename to src/memory/mem_grid.f90 index ff18d06..e79fef2 100644 --- a/src/6.3.02/memory/mem_grid.f90 +++ b/src/memory/mem_grid.f90 @@ -57,7 +57,7 @@ Module mem_grid integer,dimension(maxgrds) :: memgrd !------------------------------------------------------------------------------- - real :: time,ztop,dzrat,dzmax + real :: time,ztop,dzrat,dzmax,zdelay integer :: impl,iyear1,imonth1,idate1,ihour1 & ,itime1,nacoust,initial,initorig,iflag,hrestart integer, dimension(maxgrds) :: nnacoust @@ -98,8 +98,10 @@ Module mem_grid !--------------------------------------------------------------------------- !------------------------------------------------------------------------------- integer :: lsflg,ibnd,jbnd,icorflg,nfpt + integer, dimension(maxgrds) :: isponge_pts !------------------------------------------------------------------------------- real :: distim ,cphas + real, dimension(maxgrds) :: sponge_tau !------------------------------------------------------------------------------- Contains diff --git a/src/6.3.02/memory/mem_kpp.f90 b/src/memory/mem_kpp.f90 similarity index 100% rename from src/6.3.02/memory/mem_kpp.f90 rename to src/memory/mem_kpp.f90 diff --git a/src/6.3.02/memory/mem_leaf.f90 b/src/memory/mem_leaf.f90 similarity index 94% rename from src/6.3.02/memory/mem_leaf.f90 rename to src/memory/mem_leaf.f90 index 33aec59..44d38e4 100644 --- a/src/6.3.02/memory/mem_leaf.f90 +++ b/src/memory/mem_leaf.f90 @@ -20,7 +20,7 @@ Module mem_leaf ustar,tstar,rstar & ,veg_fracarea,veg_lai,veg_rough,veg_height & ,veg_albedo,veg_tai & - ,patch_area,patch_rough,leaf_class & + ,patch_area,patch_rought,patch_roughm,leaf_class & ,soil_rough,sfcwater_nlev,stom_resist & ,ground_rsat,ground_rvap & ,veg_water,veg_temp,can_rvap,can_temp & @@ -36,7 +36,7 @@ Module mem_leaf !------------------------------------------------------------------------------- integer :: nslcon,nvgcon,nvegpat,isfcl,isoildat,isnowdat - real :: zrough,pctlcon,ubmin,albedo,drtcon,dthcon,seatmp + real :: ztrough,zmrough=0.005,pctlcon,ubmin,albedo,drtcon,dthcon,seatmp real, dimension(nzgmax) :: stgoff,slmstr real, dimension(nzgmax+1) :: slz character(len=strl1) :: sibfile @@ -74,7 +74,8 @@ Subroutine alloc_leaf (leaf,nx,ny,nzg,nzs,np) allocate (leaf%veg_tai (nx,ny,np)) allocate (leaf%patch_area (nx,ny,np)) - allocate (leaf%patch_rough (nx,ny,np)) + allocate (leaf%patch_rought (nx,ny,np)) + allocate (leaf%patch_roughm (nx,ny,np)) allocate (leaf%leaf_class (nx,ny,np)) allocate (leaf%soil_rough (nx,ny,np)) @@ -133,7 +134,8 @@ Subroutine dealloc_leaf (leaf) if(allocated(leaf%veg_tai)) deallocate (leaf%veg_tai) if(allocated(leaf%patch_area)) deallocate (leaf%patch_area) - if(allocated(leaf%patch_rough)) deallocate (leaf%patch_rough) + if(allocated(leaf%patch_rought)) deallocate (leaf%patch_rought) + if(allocated(leaf%patch_roughm)) deallocate (leaf%patch_roughm) if(allocated(leaf%leaf_class)) deallocate (leaf%leaf_class) if(allocated(leaf%soil_rough)) deallocate (leaf%soil_rough) @@ -233,9 +235,12 @@ Subroutine filltab_leaf (leaf,leafm,imean,nx,ny,nzg,nzs,np,ng) CALL vtables2 (leaf%patch_area(1,1,1),leafm%patch_area(1,1,1) & ,ng, npts, imean, & 'PATCH_AREA :6:anal:mpti') - CALL vtables2 (leaf%patch_rough(1,1,1),leafm%patch_rough(1,1,1) & + CALL vtables2 (leaf%patch_rought(1,1,1),leafm%patch_rought(1,1,1) & ,ng, npts, imean, & - 'PATCH_ROUGH :6:anal:mpti:recycle_sfc') + 'PATCH_ROUGHT :6:anal:mpti:recycle_sfc') + CALL vtables2 (leaf%patch_roughm(1,1,1),leafm%patch_roughm(1,1,1) & + ,ng, npts, imean, & + 'PATCH_ROUGHM :6:anal:mpti:recycle_sfc') CALL vtables2 (leaf%leaf_class(1,1,1),leafm%leaf_class(1,1,1) & ,ng, npts, imean, & 'LEAF_CLASS :6:anal:mpti') diff --git a/src/6.3.02/memory/mem_micro.f90 b/src/memory/mem_micro.f90 similarity index 92% rename from src/6.3.02/memory/mem_micro.f90 rename to src/memory/mem_micro.f90 index 62cbfba..ecd7f97 100644 --- a/src/6.3.02/memory/mem_micro.f90 +++ b/src/memory/mem_micro.f90 @@ -14,7 +14,7 @@ Module mem_micro !Bin precip vars ,pcpvic,pcpvip,pcpvid & !Aerosol categories mass and number - ,cccnp,gccnp,cccmp,gccmp & + ,cn1np,cn2np,cn1mp,cn2mp & ,md1np,md2np,md1mp,md2mp & ,salt_film_np,salt_jet_np,salt_spum_np & ,salt_film_mp,salt_jet_mp,salt_spum_mp & @@ -35,11 +35,14 @@ Module mem_micro ,resol_aero1_mp,resol_aero2_mp & ! MICRO BUDGET PROCESSES (imbudget >=1) ,latheatvap,latheatfrz,nuccldrt,cld2raint,ice2raint,nucicert & - ,vapliqt,vapicet,melticet,rimecldt,rain2icet,aggregatet & + ,vapliqt,vapicet,evapliqt,evapicet,freezingt,meltingt & + ,melticet,rimecldt,rain2icet,aggregatet & ,latheatvapt,latheatfrzt & ! MICRO BUDGET PROCESSES (imbudget >=2) ,inuchomrt,inuccontrt,inucifnrt,inuchazrt,vapcldt,vapraint & ,vapprist,vapsnowt,vapaggrt,vapgraut,vaphailt,vapdrizt & + ,evapcldt,evapraint,evapprist,evapsnowt,evapaggrt,evapgraut & + ,evaphailt,evapdrizt & ,meltprist,meltsnowt,meltaggrt,meltgraut,melthailt & ,rimecldsnowt,rimecldaggrt,rimecldgraut,rimecldhailt & ,rain2prt,rain2snt,rain2agt,rain2grt,rain2hat & @@ -129,10 +132,10 @@ Subroutine alloc_micro (micro,n1,n2,n3,n4) ! Allocate arrays based on options (if necessary) if (level >= 0 .and. level .ne. 4) then if(iaerosol > 0) then - allocate (micro%cccnp(n1,n2,n3)) - allocate (micro%cccmp(n1,n2,n3)) - allocate (micro%gccnp(n1,n2,n3)) - allocate (micro%gccmp(n1,n2,n3)) + allocate (micro%cn1np(n1,n2,n3)) + allocate (micro%cn1mp(n1,n2,n3)) + allocate (micro%cn2np(n1,n2,n3)) + allocate (micro%cn2mp(n1,n2,n3)) endif if(idust > 0) then allocate (micro%md1np(n1,n2,n3)) @@ -290,6 +293,10 @@ Subroutine alloc_micro (micro,n1,n2,n3,n4) allocate (micro%nucicert(n1,n2,n3)) allocate (micro%vapliqt(n1,n2,n3)) allocate (micro%vapicet(n1,n2,n3)) + allocate (micro%evapliqt(n1,n2,n3)) + allocate (micro%evapicet(n1,n2,n3)) + allocate (micro%freezingt(n1,n2,n3)) + allocate (micro%meltingt(n1,n2,n3)) allocate (micro%melticet(n1,n2,n3)) allocate (micro%rimecldt(n1,n2,n3)) allocate (micro%rain2icet(n1,n2,n3)) @@ -310,6 +317,14 @@ Subroutine alloc_micro (micro,n1,n2,n3,n4) allocate (micro%vapgraut(n1,n2,n3)) allocate (micro%vaphailt(n1,n2,n3)) allocate (micro%vapdrizt(n1,n2,n3)) + allocate (micro%evapcldt(n1,n2,n3)) + allocate (micro%evapraint(n1,n2,n3)) + allocate (micro%evapprist(n1,n2,n3)) + allocate (micro%evapsnowt(n1,n2,n3)) + allocate (micro%evapaggrt(n1,n2,n3)) + allocate (micro%evapgraut(n1,n2,n3)) + allocate (micro%evaphailt(n1,n2,n3)) + allocate (micro%evapdrizt(n1,n2,n3)) allocate (micro%meltprist(n1,n2,n3)) allocate (micro%meltsnowt(n1,n2,n3)) allocate (micro%meltaggrt(n1,n2,n3)) @@ -408,6 +423,7 @@ Subroutine alloc_micro (micro,n1,n2,n3,n4) allocate (micro%nuccldct(n1,n2,n3)) allocate (micro%cld2raint(n1,n2,n3)) allocate (micro%vapliqt(n1,n2,n3)) + if(iceprocs==1) then allocate (micro%latheatfrz(n1,n2,n3)) ! allocate (micro%ice2raint(n1,n2,n3)) @@ -493,10 +509,10 @@ Subroutine dealloc_micro (micro) if (allocated(micro%q6)) deallocate (micro%q6) if (allocated(micro%q7)) deallocate (micro%q7) - if (allocated(micro%cccnp)) deallocate (micro%cccnp) - if (allocated(micro%gccnp)) deallocate (micro%gccnp) - if (allocated(micro%cccmp)) deallocate (micro%cccmp) - if (allocated(micro%gccmp)) deallocate (micro%gccmp) + if (allocated(micro%cn1np)) deallocate (micro%cn1np) + if (allocated(micro%cn2np)) deallocate (micro%cn2np) + if (allocated(micro%cn1mp)) deallocate (micro%cn1mp) + if (allocated(micro%cn2mp)) deallocate (micro%cn2mp) if (allocated(micro%md1np)) deallocate (micro%md1np) if (allocated(micro%md2np)) deallocate (micro%md2np) if (allocated(micro%md1mp)) deallocate (micro%md1mp) @@ -599,6 +615,10 @@ Subroutine dealloc_micro (micro) if (allocated(micro%nucicert)) deallocate (micro%nucicert) if (allocated(micro%vapliqt)) deallocate (micro%vapliqt) if (allocated(micro%vapicet)) deallocate (micro%vapicet) + if (allocated(micro%evapliqt)) deallocate (micro%evapliqt) + if (allocated(micro%evapicet)) deallocate (micro%evapicet) + if (allocated(micro%freezingt)) deallocate (micro%freezingt) + if (allocated(micro%meltingt)) deallocate (micro%meltingt) if (allocated(micro%melticet)) deallocate (micro%melticet) if (allocated(micro%rimecldt)) deallocate (micro%rimecldt) if (allocated(micro%rain2icet)) deallocate (micro%rain2icet) @@ -618,6 +638,14 @@ Subroutine dealloc_micro (micro) if (allocated(micro%vapgraut)) deallocate (micro%vapgraut) if (allocated(micro%vaphailt)) deallocate (micro%vaphailt) if (allocated(micro%vapdrizt)) deallocate (micro%vapdrizt) + if (allocated(micro%evapcldt)) deallocate (micro%evapcldt) + if (allocated(micro%evapraint)) deallocate (micro%evapraint) + if (allocated(micro%evapprist)) deallocate (micro%evapprist) + if (allocated(micro%evapsnowt)) deallocate (micro%evapsnowt) + if (allocated(micro%evapaggrt)) deallocate (micro%evapaggrt) + if (allocated(micro%evapgraut)) deallocate (micro%evapgraut) + if (allocated(micro%evaphailt)) deallocate (micro%evaphailt) + if (allocated(micro%evapdrizt)) deallocate (micro%evapdrizt) if (allocated(micro%meltprist)) deallocate (micro%meltprist) if (allocated(micro%meltsnowt)) deallocate (micro%meltsnowt) if (allocated(micro%meltaggrt)) deallocate (micro%meltaggrt) @@ -768,22 +796,22 @@ Subroutine filltab_micro (micro,microm,imean,n1,n2,n3,ng) 'Q7 :3:anal:mpti:mpt1') !Aerosol categories mass and number - if (allocated(micro%cccnp)) & - CALL vtables2 (micro%cccnp(1,1,1),microm%cccnp(1,1,1) & + if (allocated(micro%cn1np)) & + CALL vtables2 (micro%cn1np(1,1,1),microm%cn1np(1,1,1) & ,ng, npts, imean, & - 'CCCNP :3:anal:mpti:mpt1') - if (allocated(micro%gccnp)) & - CALL vtables2 (micro%gccnp(1,1,1),microm%gccnp(1,1,1) & + 'CN1NP :3:anal:mpti:mpt1') + if (allocated(micro%cn2np)) & + CALL vtables2 (micro%cn2np(1,1,1),microm%cn2np(1,1,1) & ,ng, npts, imean, & - 'GCCNP :3:anal:mpti:mpt1') - if (allocated(micro%cccmp)) & - CALL vtables2 (micro%cccmp(1,1,1),microm%cccmp(1,1,1) & + 'CN2NP :3:anal:mpti:mpt1') + if (allocated(micro%cn1mp)) & + CALL vtables2 (micro%cn1mp(1,1,1),microm%cn1mp(1,1,1) & ,ng, npts, imean, & - 'CCCMP :3:anal:mpti:mpt1') - if (allocated(micro%gccmp)) & - CALL vtables2 (micro%gccmp(1,1,1),microm%gccmp(1,1,1) & + 'CN1MP :3:anal:mpti:mpt1') + if (allocated(micro%cn2mp)) & + CALL vtables2 (micro%cn2mp(1,1,1),microm%cn2mp(1,1,1) & ,ng, npts, imean, & - 'GCCMP :3:anal:mpti:mpt1') + 'CN2MP :3:anal:mpti:mpt1') if (allocated(micro%md1np)) & CALL vtables2 (micro%md1np(1,1,1),microm%md1np(1,1,1) & ,ng, npts, imean, & @@ -1082,6 +1110,22 @@ Subroutine filltab_micro (micro,microm,imean,n1,n2,n3,ng) CALL vtables2 (micro%vapicet(1,1,1),microm%vapicet(1,1,1) & ,ng, npts, imean, & 'VAPICET :3:anal:mpti') + if (allocated(micro%evapliqt)) & + CALL vtables2 (micro%evapliqt(1,1,1),microm%evapliqt(1,1,1) & + ,ng, npts, imean, & + 'EVAPLIQT :3:anal:mpti') + if (allocated(micro%evapicet)) & + CALL vtables2 (micro%evapicet(1,1,1),microm%evapicet(1,1,1) & + ,ng, npts, imean, & + 'EVAPICET :3:anal:mpti') + if (allocated(micro%freezingt)) & + CALL vtables2 (micro%freezingt(1,1,1),microm%freezingt(1,1,1) & + ,ng, npts, imean, & + 'FREEZINGT :3:anal:mpti') + if (allocated(micro%meltingt)) & + CALL vtables2 (micro%meltingt(1,1,1),microm%meltingt(1,1,1) & + ,ng, npts, imean, & + 'MELTINGT :3:anal:mpti') if (allocated(micro%melticet)) & CALL vtables2 (micro%melticet(1,1,1),microm%melticet(1,1,1) & ,ng, npts, imean, & @@ -1154,7 +1198,39 @@ Subroutine filltab_micro (micro,microm,imean,n1,n2,n3,ng) if (allocated(micro%vapdrizt)) & CALL vtables2 (micro%vapdrizt(1,1,1),microm%vapdrizt(1,1,1) & ,ng, npts, imean, & - 'VAPDRIZT :3:anal:mpti') + 'VAPDRIZT :3:anal:mpti') + if (allocated(micro%evapcldt)) & + CALL vtables2 (micro%evapcldt(1,1,1),microm%evapcldt(1,1,1) & + ,ng, npts, imean, & + 'EVAPCLDT :3:anal:mpti') + if (allocated(micro%evapraint)) & + CALL vtables2 (micro%evapraint(1,1,1),microm%evapraint(1,1,1) & + ,ng, npts, imean, & + 'EVAPRAINT :3:anal:mpti') + if (allocated(micro%evapprist)) & + CALL vtables2 (micro%evapprist(1,1,1),microm%evapprist(1,1,1) & + ,ng, npts, imean, & + 'EVAPPRIST :3:anal:mpti') + if (allocated(micro%evapsnowt)) & + CALL vtables2 (micro%evapsnowt(1,1,1),microm%evapsnowt(1,1,1) & + ,ng, npts, imean, & + 'EVAPSNOWT :3:anal:mpti') + if (allocated(micro%evapaggrt)) & + CALL vtables2 (micro%evapaggrt(1,1,1),microm%evapaggrt(1,1,1) & + ,ng, npts, imean, & + 'EVAPAGGRT :3:anal:mpti') + if (allocated(micro%evapgraut)) & + CALL vtables2 (micro%evapgraut(1,1,1),microm%evapgraut(1,1,1) & + ,ng, npts, imean, & + 'EVAPGRAUT :3:anal:mpti') + if (allocated(micro%evaphailt)) & + CALL vtables2 (micro%evaphailt(1,1,1),microm%evaphailt(1,1,1) & + ,ng, npts, imean, & + 'EVAPHAILT :3:anal:mpti') + if (allocated(micro%evapdrizt)) & + CALL vtables2 (micro%evapdrizt(1,1,1),microm%evapdrizt(1,1,1) & + ,ng, npts, imean, & + 'EVAPDRIZT :3:anal:mpti') if (allocated(micro%meltprist)) & CALL vtables2 (micro%meltprist(1,1,1),microm%meltprist(1,1,1) & ,ng, npts, imean, & diff --git a/src/6.3.02/memory/mem_mksfc.f90 b/src/memory/mem_mksfc.f90 similarity index 100% rename from src/6.3.02/memory/mem_mksfc.f90 rename to src/memory/mem_mksfc.f90 diff --git a/src/6.3.02/memory/mem_nestb.f90 b/src/memory/mem_nestb.f90 similarity index 100% rename from src/6.3.02/memory/mem_nestb.f90 rename to src/memory/mem_nestb.f90 diff --git a/src/6.3.02/memory/mem_oda.f90 b/src/memory/mem_oda.f90 similarity index 100% rename from src/6.3.02/memory/mem_oda.f90 rename to src/memory/mem_oda.f90 diff --git a/src/6.3.02/memory/mem_radiate.f90 b/src/memory/mem_radiate.f90 similarity index 98% rename from src/6.3.02/memory/mem_radiate.f90 rename to src/memory/mem_radiate.f90 index 91a31b7..bc084f2 100644 --- a/src/6.3.02/memory/mem_radiate.f90 +++ b/src/memory/mem_radiate.f90 @@ -42,14 +42,14 @@ Subroutine alloc_radiate (radiate,n1,n2,n3) allocate (radiate%cosz(n2,n3)) allocate (radiate%aodt(n2,n3)) endif - if(ilwrtyp == 3 .or. iswrtyp == 3) then + if(ilwrtyp >= 3 .or. iswrtyp >= 3) then allocate (radiate%bext(n1,n2,n3)) endif - if(ilwrtyp == 3) then + if(ilwrtyp >= 3) then allocate (radiate%lwup(n1,n2,n3)) allocate (radiate%lwdn(n1,n2,n3)) endif - if(iswrtyp == 3) then + if(iswrtyp >= 3) then allocate (radiate%swup(n1,n2,n3)) allocate (radiate%swdn(n1,n2,n3)) endif diff --git a/src/6.3.02/memory/mem_scratch.f90 b/src/memory/mem_scratch.f90 similarity index 100% rename from src/6.3.02/memory/mem_scratch.f90 rename to src/memory/mem_scratch.f90 diff --git a/src/6.3.02/memory/mem_sib.f90 b/src/memory/mem_sib.f90 similarity index 100% rename from src/6.3.02/memory/mem_sib.f90 rename to src/memory/mem_sib.f90 diff --git a/src/6.3.02/memory/mem_tend.f90 b/src/memory/mem_tend.f90 similarity index 96% rename from src/6.3.02/memory/mem_tend.f90 rename to src/memory/mem_tend.f90 index 91e0173..0d65d36 100644 --- a/src/6.3.02/memory/mem_tend.f90 +++ b/src/memory/mem_tend.f90 @@ -13,7 +13,7 @@ Module mem_tend ,fncnt, ffcdt, ffict, ffipt, ffidt & ,ffsnt, ffglt, ffhlt, ffint & ,cifnt, tket & - ,cccmt, gccmt, cccnt, gccnt & + ,cn1mt, cn2mt, cn1nt, cn2nt & ,md1nt, md2nt, md1mt, md2mt & ,salt_film_nt,salt_jet_nt,salt_spum_nt & ,salt_film_mt,salt_jet_mt,salt_spum_mt & @@ -109,10 +109,10 @@ Subroutine alloc_tend (numz,numx,numy,ngrs) if (allocated(turb_g(1)%tkep)) allocate (tend%tket(ntpts)) - if (allocated(micro_g(1)%cccnp)) allocate (tend%cccnt(ntpts)) - if (allocated(micro_g(1)%gccnp)) allocate (tend%gccnt(ntpts)) - if (allocated(micro_g(1)%cccmp)) allocate (tend%cccmt(ntpts)) - if (allocated(micro_g(1)%gccmp)) allocate (tend%gccmt(ntpts)) + if (allocated(micro_g(1)%cn1np)) allocate (tend%cn1nt(ntpts)) + if (allocated(micro_g(1)%cn2np)) allocate (tend%cn2nt(ntpts)) + if (allocated(micro_g(1)%cn1mp)) allocate (tend%cn1mt(ntpts)) + if (allocated(micro_g(1)%cn2mp)) allocate (tend%cn2mt(ntpts)) if (allocated(micro_g(1)%md1np)) allocate (tend%md1nt(ntpts)) if (allocated(micro_g(1)%md2np)) allocate (tend%md2nt(ntpts)) if (allocated(micro_g(1)%md1mp)) allocate (tend%md1mt(ntpts)) @@ -238,10 +238,10 @@ Subroutine dealloc_tend (ngrs) if (allocated(tend%tket)) deallocate (tend%tket) - if (allocated(tend%cccnt))deallocate (tend%cccnt) - if (allocated(tend%gccnt))deallocate (tend%gccnt) - if (allocated(tend%cccmt)) deallocate (tend%cccmt) - if (allocated(tend%gccmt)) deallocate (tend%gccmt) + if (allocated(tend%cn1nt))deallocate (tend%cn1nt) + if (allocated(tend%cn2nt))deallocate (tend%cn2nt) + if (allocated(tend%cn1mt)) deallocate (tend%cn1mt) + if (allocated(tend%cn2mt)) deallocate (tend%cn2mt) if (allocated(tend%md1nt)) deallocate (tend%md1nt) if (allocated(tend%md2nt)) deallocate (tend%md2nt) if (allocated(tend%md1mt)) deallocate (tend%md1mt) @@ -389,14 +389,14 @@ Subroutine filltab_tend (basic,micro,turb,sib,tracer,ng) if( allocated(tend%tket)) & CALL vtables_scalar (turb%tkep(1,1,1),tend%tket(1),ng,'TKEP') - if (allocated(tend%cccnt)) & - CALL vtables_scalar (micro%cccnp(1,1,1),tend%cccnt(1),ng,'CCCNP') - if (allocated(tend%gccnt)) & - CALL vtables_scalar (micro%gccnp(1,1,1),tend%gccnt(1),ng,'GCCNP') - if (allocated(tend%cccmt)) & - CALL vtables_scalar (micro%cccmp(1,1,1),tend%cccmt(1),ng,'CCCMP') - if (allocated(tend%gccmt)) & - CALL vtables_scalar (micro%gccmp(1,1,1),tend%gccmt(1),ng,'GCCMP') + if (allocated(tend%cn1nt)) & + CALL vtables_scalar (micro%cn1np(1,1,1),tend%cn1nt(1),ng,'CN1NP') + if (allocated(tend%cn2nt)) & + CALL vtables_scalar (micro%cn2np(1,1,1),tend%cn2nt(1),ng,'CN2NP') + if (allocated(tend%cn1mt)) & + CALL vtables_scalar (micro%cn1mp(1,1,1),tend%cn1mt(1),ng,'CN1MP') + if (allocated(tend%cn2mt)) & + CALL vtables_scalar (micro%cn2mp(1,1,1),tend%cn2mt(1),ng,'CN2MP') if (allocated(tend%md1nt)) & CALL vtables_scalar (micro%md1np(1,1,1),tend%md1nt(1),ng,'MD1NP') if (allocated(tend%md2nt)) & diff --git a/src/6.3.02/memory/mem_tracer.f90 b/src/memory/mem_tracer.f90 similarity index 100% rename from src/6.3.02/memory/mem_tracer.f90 rename to src/memory/mem_tracer.f90 diff --git a/src/6.3.02/memory/mem_turb.f90 b/src/memory/mem_turb.f90 similarity index 100% rename from src/6.3.02/memory/mem_turb.f90 rename to src/memory/mem_turb.f90 diff --git a/src/6.3.02/memory/mem_varinit.f90 b/src/memory/mem_varinit.f90 similarity index 100% rename from src/6.3.02/memory/mem_varinit.f90 rename to src/memory/mem_varinit.f90 diff --git a/src/6.3.02/memory/var_tables.f90 b/src/memory/var_tables.f90 similarity index 100% rename from src/6.3.02/memory/var_tables.f90 rename to src/memory/var_tables.f90 diff --git a/src/6.3.02/memory/vtab_fill.f90 b/src/memory/vtab_fill.f90 similarity index 100% rename from src/6.3.02/memory/vtab_fill.f90 rename to src/memory/vtab_fill.f90 diff --git a/src/6.3.02/micro/aero_deposit.f90 b/src/micro/aero_deposit.f90 similarity index 99% rename from src/6.3.02/micro/aero_deposit.f90 rename to src/micro/aero_deposit.f90 index 2787abf..b078b00 100644 --- a/src/6.3.02/micro/aero_deposit.f90 +++ b/src/micro/aero_deposit.f90 @@ -91,8 +91,8 @@ Subroutine deposition_driver (i,j,m1,xztop,rtgt & rundep=0 !Set up profile of aerosol properties if they exist - if((acat==1 .and. iaerosol>0) .or. & ! CCN - (acat==2 .and. iaerosol>0) .or. & ! GCCN + if((acat==1 .and. iaerosol>0) .or. & ! CCN mode 1 + (acat==2 .and. iaerosol>0) .or. & ! CCN mode 2 (acat==3 .and. idust>0) .or. & ! Small dust mode (acat==4 .and. idust>0) .or. & ! Large dust mode (acat==5 .and. isalt>0) .or. & ! Salt film mode @@ -525,7 +525,8 @@ Subroutine cal_dwet (T,rh,ddry,dwet,vhoff,epsilonsol,rhodry,rhowet) !Equation r = A * rd ** B requires radius in microns !r100 growth equation computes in meters and needs converstion !to microns before applying to "ddry" which is in microns -!Then return radius in microns +!Then return radius in microns. ddry and dwet are actually radii +!and not diameter. implicit none @@ -598,7 +599,7 @@ Subroutine cal_dwet (T,rh,ddry,dwet,vhoff,epsilonsol,rhodry,rhowet) dwet = min(10.,dwet) !If particle swells, compute density of particle + water -volumeratio = ddry**3 / dwet**3 +volumeratio = min(1.00, ddry**3 / dwet**3) rhowet = rhodry * volumeratio + 1000. * (1.-volumeratio) if(rhowet<1000.0 .or. rhowet>2659.0 .or.rhodry<1000.0 .or. rhodry>2659.0) then diff --git a/src/6.3.02/micro/aero_include.f90 b/src/micro/aero_include.f90 similarity index 100% rename from src/6.3.02/micro/aero_include.f90 rename to src/micro/aero_include.f90 diff --git a/src/6.3.02/micro/aero_sources.f90 b/src/micro/aero_sources.f90 similarity index 100% rename from src/6.3.02/micro/aero_sources.f90 rename to src/micro/aero_sources.f90 diff --git a/src/6.3.02/micro/mic_adj.f90 b/src/micro/mic_adj.f90 similarity index 97% rename from src/6.3.02/micro/mic_adj.f90 rename to src/micro/mic_adj.f90 index e6a86ec..8604dbc 100644 --- a/src/6.3.02/micro/mic_adj.f90 +++ b/src/micro/mic_adj.f90 @@ -141,7 +141,7 @@ Subroutine adj1 (m1,m2,m3,rtp,micro,ngr) rxloss=0 !Zero out hydrometeor fields if they are below a min threshold for 2-moment - if(jnmb(lcat)>=5 .and. (rx(k,lcat) < rxmin .or. cx(k,lcat) <= 0.0)) then + if(jnmb(lcat)>=5 .and. (rx(k,lcat) < rxmin .or. cx(k,lcat) < cxmin)) then zerocheck=1 cxloss = cx(k,lcat) rxloss = rx(k,lcat) @@ -355,12 +355,12 @@ Subroutine adj1 (m1,m2,m3,rtp,micro,ngr) endif endif if(iaerosol>0)then - if(micro%cccnp(k,i,j) > maxaero) then - print*,"Too many CCN:",micro%cccnp(k,i,j) + if(micro%cn1np(k,i,j) > maxaero) then + print*,"Too many CCN1:",micro%cn1np(k,i,j) toomany=1 endif - if(micro%gccnp(k,i,j) > maxaero) then - print*,"Too many GCCN:",micro%gccnp(k,i,j) + if(micro%cn2np(k,i,j) > maxaero) then + print*,"Too many CCN2:",micro%cn2np(k,i,j) toomany=1 endif endif @@ -419,13 +419,13 @@ Subroutine adj1 (m1,m2,m3,rtp,micro,ngr) !SET SMALL VALUES TO ZERO if(iaerosol>0) then - if(micro%cccnp(k,i,j)0) then diff --git a/src/6.3.02/micro/mic_aero.f90 b/src/micro/mic_aero.f90 similarity index 91% rename from src/6.3.02/micro/mic_aero.f90 rename to src/micro/mic_aero.f90 index 5cbf2d5..d095e9e 100644 --- a/src/6.3.02/micro/mic_aero.f90 +++ b/src/micro/mic_aero.f90 @@ -57,8 +57,8 @@ Subroutine aerosols () do i = ia,iz CALL aero_copy (1,mzp & - ,micro_g(ngrid)%cccnp(1,i,j),micro_g(ngrid)%cccmp(1,i,j) & - ,micro_g(ngrid)%gccnp(1,i,j),micro_g(ngrid)%gccmp(1,i,j) & + ,micro_g(ngrid)%cn1np(1,i,j),micro_g(ngrid)%cn1mp(1,i,j) & + ,micro_g(ngrid)%cn2np(1,i,j),micro_g(ngrid)%cn2mp(1,i,j) & ,micro_g(ngrid)%md1np(1,i,j),micro_g(ngrid)%md1mp(1,i,j) & ,micro_g(ngrid)%md2np(1,i,j),micro_g(ngrid)%md2mp(1,i,j) & ,micro_g(ngrid)%salt_film_np(1,i,j),micro_g(ngrid)%salt_film_mp(1,i,j) & @@ -79,13 +79,13 @@ Subroutine aerosols () ,leaf_g(ngrid)%leaf_class(i,j,1:npatch) & ,leaf_g(ngrid)%patch_area(i,j,1:npatch) & ,leaf_g(ngrid)%ustar(i,j,1:npatch) & - ,leaf_g(ngrid)%patch_rough(i,j,1:npatch) & + ,leaf_g(ngrid)%patch_rought(i,j,1:npatch) & ,imonth1 & ) CALL aero_copy (2,mzp & - ,micro_g(ngrid)%cccnp(1,i,j),micro_g(ngrid)%cccmp(1,i,j) & - ,micro_g(ngrid)%gccnp(1,i,j),micro_g(ngrid)%gccmp(1,i,j) & + ,micro_g(ngrid)%cn1np(1,i,j),micro_g(ngrid)%cn1mp(1,i,j) & + ,micro_g(ngrid)%cn2np(1,i,j),micro_g(ngrid)%cn2mp(1,i,j) & ,micro_g(ngrid)%md1np(1,i,j),micro_g(ngrid)%md1mp(1,i,j) & ,micro_g(ngrid)%md2np(1,i,j),micro_g(ngrid)%md2mp(1,i,j) & ,micro_g(ngrid)%salt_film_np(1,i,j),micro_g(ngrid)%salt_film_mp(1,i,j) & @@ -157,7 +157,7 @@ Subroutine aerosol_init () END SUBROUTINE aerosol_init !############################################################################## -Subroutine aero_copy (aflag,m1,cccnp,cccmp,gccnp,gccmp,md1np,md1mp & +Subroutine aero_copy (aflag,m1,cn1np,cn1mp,cn2np,cn2mp,md1np,md1mp & ,md2np,md2mp,salt_film_np,salt_film_mp,salt_jet_np & ,salt_jet_mp,salt_spum_np,salt_spum_mp & ,abc1np,abc1mp,abc2np,abc2mp) @@ -170,7 +170,7 @@ Subroutine aero_copy (aflag,m1,cccnp,cccmp,gccnp,gccmp,md1np,md1mp & implicit none integer :: m1,k,aflag -real, dimension(m1) :: cccnp,cccmp,gccnp,gccmp,md1np,md1mp & +real, dimension(m1) :: cn1np,cn1mp,cn2np,cn2mp,md1np,md1mp & ,md2np,md2mp,salt_film_np,salt_film_mp,salt_jet_np & ,salt_jet_mp,salt_spum_np,salt_spum_mp & ,abc1np,abc1mp,abc2np,abc2mp @@ -185,10 +185,10 @@ Subroutine aero_copy (aflag,m1,cccnp,cccmp,gccnp,gccmp,md1np,md1mp & !Fill scratch arrays for aerosol modes for level=1,2 do k = 1,m1-1 if (iaerosol > 0) then - aerocon(k,1) = cccnp(k) - aeromas(k,1) = cccmp(k) - aerocon(k,2) = gccnp(k) - aeromas(k,2) = gccmp(k) + aerocon(k,1) = cn1np(k) + aeromas(k,1) = cn1mp(k) + aerocon(k,2) = cn2np(k) + aeromas(k,2) = cn2mp(k) endif if (idust > 0) then aerocon(k,3) = md1np(k) @@ -216,10 +216,10 @@ Subroutine aero_copy (aflag,m1,cccnp,cccmp,gccnp,gccmp,md1np,md1mp & !Copy back scratch arrays to aerosol modes for level=1,2 do k = 1,m1-1 if (iaerosol > 0) then - cccnp(k) = aerocon(k,1) - cccmp(k) = aeromas(k,1) - gccnp(k) = aerocon(k,2) - gccmp(k) = aeromas(k,2) + cn1np(k) = aerocon(k,1) + cn1mp(k) = aeromas(k,1) + cn2np(k) = aerocon(k,2) + cn2mp(k) = aeromas(k,2) endif if (idust > 0) then md1np(k) = aerocon(k,3) diff --git a/src/6.3.02/micro/mic_chknan.f90 b/src/micro/mic_chknan.f90 similarity index 94% rename from src/6.3.02/micro/mic_chknan.f90 rename to src/micro/mic_chknan.f90 index aac82ee..1a29a31 100644 --- a/src/6.3.02/micro/mic_chknan.f90 +++ b/src/micro/mic_chknan.f90 @@ -73,22 +73,22 @@ Subroutine checkmicro (string) isnanr(micro_g(ngrid)%salt_jet_mp(k,i,j)) .or. & isnanr(micro_g(ngrid)%salt_spum_mp(k,i,j)) ) prtflg=1 endif - !CHECK CCN AND GCCN + !CHECK CCN Modes if(iaerosol > 0)then - if(isnanr(micro_g(ngrid)%cccnp(k,i,j)) .or. & - isnanr(micro_g(ngrid)%cccmp(k,i,j)) .or. & - isnanr(micro_g(ngrid)%gccnp(k,i,j)) .or. & - isnanr(micro_g(ngrid)%gccmp(k,i,j)) ) prtflg=1 - tempvar = valugp(mzp,mxp,myp,k,i,j,tend%cccnt(1)) + if(isnanr(micro_g(ngrid)%cn1np(k,i,j)) .or. & + isnanr(micro_g(ngrid)%cn1mp(k,i,j)) .or. & + isnanr(micro_g(ngrid)%cn2np(k,i,j)) .or. & + isnanr(micro_g(ngrid)%cn2mp(k,i,j)) ) prtflg=1 + tempvar = valugp(mzp,mxp,myp,k,i,j,tend%cn1nt(1)) if(isnanr(tempvar)) prtflg=1 if(tempvar>1.e30) prtflg=1 - tempvar = valugp(mzp,mxp,myp,k,i,j,tend%cccmt(1)) + tempvar = valugp(mzp,mxp,myp,k,i,j,tend%cn1mt(1)) if(isnanr(tempvar)) prtflg=1 if(tempvar>1.e30) prtflg=1 - tempvar = valugp(mzp,mxp,myp,k,i,j,tend%gccnt(1)) + tempvar = valugp(mzp,mxp,myp,k,i,j,tend%cn2nt(1)) if(isnanr(tempvar)) prtflg=1 if(tempvar>1.e30) prtflg=1 - tempvar = valugp(mzp,mxp,myp,k,i,j,tend%gccmt(1)) + tempvar = valugp(mzp,mxp,myp,k,i,j,tend%cn2mt(1)) if(isnanr(tempvar)) prtflg=1 if(tempvar>1.e30) prtflg=1 endif @@ -348,7 +348,7 @@ Subroutine checkmicro (string) if(prtflg==1)then print*,'Checked After: ',string - print*,'NAN Check (ngrid,k,j,i)',ngrid,k,j+mj0(ngrid),i+mi0(ngrid) + print*,'NAN Check (ngrid,k,i,j)',ngrid,k,i+mi0(ngrid),j+mj0(ngrid) print*,'wp: ',basic_g(ngrid)%wp(k,i,j) print*,'wc: ',basic_g(ngrid)%wc(k,i,j) @@ -376,14 +376,14 @@ Subroutine checkmicro (string) print*,'cifnp-tend: ',valugp(mzp,mxp,myp,k,i,j,tend%cifnt(1)) endif if(iaerosol > 0)then - print*,'cccnp: ',micro_g(ngrid)%cccnp(k,i,j) - print*,'cccnp-tend: ',valugp(mzp,mxp,myp,k,i,j,tend%cccnt(1)) - print*,'cccmp: ',micro_g(ngrid)%cccmp(k,i,j) - print*,'cccmp-tend: ',valugp(mzp,mxp,myp,k,i,j,tend%cccmt(1)) - print*,'gccnp: ',micro_g(ngrid)%gccnp(k,i,j) - print*,'gccnp-tend: ',valugp(mzp,mxp,myp,k,i,j,tend%gccnt(1)) - print*,'gccmp: ',micro_g(ngrid)%gccmp(k,i,j) - print*,'gccmp-tend: ',valugp(mzp,mxp,myp,k,i,j,tend%gccmt(1)) + print*,'cn1np: ',micro_g(ngrid)%cn1np(k,i,j) + print*,'cn1np-tend: ',valugp(mzp,mxp,myp,k,i,j,tend%cn1nt(1)) + print*,'cn1mp: ',micro_g(ngrid)%cn1mp(k,i,j) + print*,'cn1mp-tend: ',valugp(mzp,mxp,myp,k,i,j,tend%cn1mt(1)) + print*,'cn2np: ',micro_g(ngrid)%cn2np(k,i,j) + print*,'cn2np-tend: ',valugp(mzp,mxp,myp,k,i,j,tend%cn2nt(1)) + print*,'cn2mp: ',micro_g(ngrid)%cn2mp(k,i,j) + print*,'cn2mp-tend: ',valugp(mzp,mxp,myp,k,i,j,tend%cn2mt(1)) endif if(idust > 0)then print*,'md1np: ',micro_g(ngrid)%md1np(k,i,j) diff --git a/src/6.3.02/micro/mic_coll.f90 b/src/micro/mic_coll.f90 similarity index 95% rename from src/6.3.02/micro/mic_coll.f90 rename to src/micro/mic_coll.f90 index 2134c4a..4e1a65e 100644 --- a/src/6.3.02/micro/mic_coll.f90 +++ b/src/micro/mic_coll.f90 @@ -564,6 +564,15 @@ Subroutine effxy (m1,k1,k2) integer :: m1,k,ncall7 integer, dimension(11) :: k1,k2 data ncall7/0/ + +integer :: etmp +real :: wt1,wt2,tagg +real, dimension(12) :: temps,efftemp +! Celcius temperature +data temps / 0., -5., -10., -14., -15., -16., -20., -25., -30., -35., -40., -50./ +! Aggregation efficiency +data efftemp /0.20, 0.15, 0.20, 0.60, 0.65, 0.60, 0.10, 0.08, 0.06, 0.04, 0.025, 0.020/ + save ! 1 = rp,rs,ra,rg,rh @@ -604,32 +613,54 @@ Subroutine effxy (m1,k1,k2) ! 4 = pp,ps,pa if (jnmb(5) .ge. 1) then do k = k1(3),k2(3) - if (abs(tx(k,3)+14.) .le. 2.) then - eff(k,4) = 1.4 - else - eff(k,4) = min(0.2,10. ** (0.035 * tx(k,3) - 0.7)) + tagg = tx(k,3) + if (tagg <= -50.0) then + tagg = -50.0 + elseif (tagg >= 0.0) then + tagg = 0.0 endif + do etmp=1,11 + if ( (tagg <= temps(etmp)) .and. (tagg >= temps(etmp+1)) )then + wt1=abs( (tagg-temps(etmp)) / (temps(etmp)-temps(etmp+1)) ) + wt2=1.0-wt1 + eff(k,4) = wt2*efftemp(etmp) + wt1*efftemp(etmp+1) + endif + enddo enddo ! 5 = ss,sa do k = k1(4),k2(4) - if (abs(tx(k,4)+14.) .le. 2.) then - eff(k,5) = 1.4 - else - eff(k,5) = min(0.2,10. ** (0.035 * tx(k,4) - 0.7)) + tagg = tx(k,4) + if (tagg <= -50.0) then + tagg = -50.0 + elseif (tagg >= 0.0) then + tagg = 0.0 endif + do etmp=1,11 + if ( (tagg <= temps(etmp)) .and. (tagg >= temps(etmp+1)) )then + wt1=abs( (tagg-temps(etmp)) / (temps(etmp)-temps(etmp+1)) ) + wt2=1.0-wt1 + eff(k,5) = wt2*efftemp(etmp) + wt1*efftemp(etmp+1) + endif + enddo enddo ! 6 = aa do k = k1(5),k2(5) if (rx(k,5) .ge. rxmin) then - if (abs(tx(k,5)+14.) .le. 2.) then - eff(k,6) = 1.4 - elseif (tx(k,5) .ge. -1.) then - eff(k,6) = 1. - else - eff(k,6) = min(0.2,10. ** (0.035 * tx(k,5) - 0.7)) + tagg = tx(k,5) + if (tagg <= -50.0) then + tagg = -50.0 + elseif (tagg >= 0.0) then + tagg = 0.0 endif + do etmp=1,11 + if ( (tagg <= temps(etmp)) .and. (tagg >= temps(etmp+1)) )then + wt1=abs( (tagg-temps(etmp)) / (temps(etmp)-temps(etmp+1)) ) + wt2=1.0-wt1 + eff(k,6) = wt2*efftemp(etmp) + wt1*efftemp(etmp+1) + endif + enddo endif enddo endif @@ -640,7 +671,19 @@ Subroutine effxy (m1,k1,k2) if (qr(k,6) .gt. 0.) then eff(k,7) = 1.0 else - eff(k,7) = min(0.2,10. ** (0.035 * tx(k,6) - 0.7)) + tagg = tx(k,6) + if (tagg <= -50.0) then + tagg = -50.0 + elseif (tagg >= 0.0) then + tagg = 0.0 + endif + do etmp=1,11 + if ( (tagg <= temps(etmp)) .and. (tagg >= temps(etmp+1)) )then + wt1=abs( (tagg-temps(etmp)) / (temps(etmp)-temps(etmp+1)) ) + wt2=1.0-wt1 + eff(k,7) = wt2*efftemp(etmp) + wt1*efftemp(etmp+1) + endif + enddo endif enddo endif @@ -652,7 +695,19 @@ Subroutine effxy (m1,k1,k2) if (qr(k,7) .gt. 0.) then eff(k,8) = 1.0 else - eff(k,8) = min(0.2,10. ** (0.035 * tx(k,7) - 0.7)) + tagg = tx(k,7) + if (tagg <= -50.0) then + tagg = -50.0 + elseif (tagg >= 0.0) then + tagg = 0.0 + endif + do etmp=1,11 + if ( (tagg <= temps(etmp)) .and. (tagg >= temps(etmp+1)) )then + wt1=abs( (tagg-temps(etmp)) / (temps(etmp)-temps(etmp+1)) ) + wt2=1.0-wt1 + eff(k,8) = wt2*efftemp(etmp) + wt1*efftemp(etmp+1) + endif + enddo endif endif enddo @@ -751,9 +806,9 @@ Subroutine col3344 (mx,mz,mc1,k1,k2) c1 = eff(k,mc1) * cx(k,mx) ** 2 tabvalx & - = wct1(k,mx) ** 2 * coltabr(ict1(k,mx),ict1(k,mx),ip) & + = wct1(k,mx) ** 2 * coltabr(ict1(k,mx),ict1(k,mx),ip) & + 2. * wct1(k,mx) * wct2(k,mx) * coltabr(ict1(k,mx),ict2(k,mx),ip) & - + wct2(k,mx) ** 2 * coltabr(ict2(k,mx),ict2(k,mx),ip) + + wct2(k,mx) ** 2 * coltabr(ict2(k,mx),ict2(k,mx),ip) colamt = min(rx(k,mx),colfacr2(k) * c1 * 10. ** (-tabvalx)) rxfer(k,mx,mz) = rxfer(k,mx,mz) + colamt diff --git a/src/6.3.02/micro/mic_driv.f90 b/src/micro/mic_driv.f90 similarity index 89% rename from src/6.3.02/micro/mic_driv.f90 rename to src/micro/mic_driv.f90 index 433cb15..61c2596 100644 --- a/src/6.3.02/micro/mic_driv.f90 +++ b/src/micro/mic_driv.f90 @@ -98,7 +98,7 @@ Subroutine micro () !Zero out the radiative heating rate "fthrd" if this this a radiation timestep !and if running Harrington Radiation as called below with microphysics loop. -if (iswrtyp .eq. 3 .or. ilwrtyp .eq. 3) then +if (iswrtyp .eq. 3 .or. ilwrtyp .eq. 3 .or. iswrtyp .eq. 4 .or. ilwrtyp .eq. 4) then if (mod(time + .001,radfrq) .lt. dtlt .or. time .lt. .001) then CALL azero (mzp*mxp*myp,radiate_g(ngrid)%fthrd(1,1,1)) endif @@ -138,7 +138,7 @@ Subroutine micro () ,npatch & !LEAF Variables needed for aerosol deposition ,leaf_g(ngr)%ustar(i,j,1:npatch) & - ,leaf_g(ngr)%patch_rough(i,j,1:npatch) & + ,leaf_g(ngr)%patch_rought(i,j,1:npatch) & ,imonth1 & ) !Copy local variables back to global variables @@ -197,7 +197,7 @@ Subroutine mcphys (m1,k1,k2,k3,i,j,ngr,maxnzp & integer :: i,j,k,lcat,jcat,icv,icx,mc1,mc2,mc3,mc4,m1 & ,ngr & ,maxnzp,mcat & - ,k1cnuc,k2cnuc,k1dnuc,k2dnuc,k1pnuc,k2pnuc,lhcat + ,k1cnuc,k2cnuc,k1dnuc,k2dnuc,k1pnuc,k2pnuc,lhcat,lcatact real, dimension(8) :: dpcp0 integer, dimension(8) :: mcats,mivap,mix02 @@ -250,6 +250,14 @@ Subroutine mcphys (m1,k1,k2,k3,i,j,ngr,maxnzp & data dpcp0 /.001,.001,.010,.010,.010,.003,.001,.001/ save +!Output some data for diagnostic purposes +!if(i==4)then +! do k=2,38 +! print*,'ice_start',k,(theta(k) * (pi0(k)+pp(k)) / 1004.) - 273.16 & +! ,rx(k,3)+rx(k,4),(cx(k,3)+cx(k,4))*dn0(k)/1000. +! enddo +!endif + ! Compute pressure, temperature, and moisture for vapor diffusion CALL thrmstr (m1,k1,k2,thp(1),theta(1),rtp(1),rv(1) & ,pp(1),pi0(1) & @@ -266,8 +274,8 @@ Subroutine mcphys (m1,k1,k2,k3,i,j,ngr,maxnzp & enddo ! Evaluate radiative heating rates if using Harrington radiation scheme -if (iswrtyp .eq. 3 .or. ilwrtyp .eq. 3) then - if (mod(time + .001,radfrq) .lt. dtlt .or. time .lt. .001) then +if (mod(time + .001,radfrq) .lt. dtlt .or. time .lt. .001) then + if (iswrtyp .eq. 3 .or. ilwrtyp .eq. 3) then !Saleeby(2008): Change passing of 7 to 8 if adding drizzle mode ! and modify locations in radcalc3 and radcomp3 to match CALL radcalc3 (m1,i,j,ngr,maxnzp,7,iswrtyp,ilwrtyp,zm,zt & @@ -286,6 +294,24 @@ Subroutine mcphys (m1,k1,k2,k3,i,j,ngr,maxnzp & ,radiate%lwdn (1,i,j) & ,dn0(1) & ) + elseif (iswrtyp .eq. 4 .or. ilwrtyp .eq. 4) then + CALL radcalc4 (m1,maxnzp,7,iswrtyp,ilwrtyp & + ,glat,rtgt,topt & + ,radiate%albedt (i,j) ,radiate%cosz (i,j) & + ,radiate%rlongup (i,j) ,radiate%rshort(i,j) & + ,radiate%rlong (i,j) & + ,zm,zt,rv(1),dn0(1),pi0(1),pp(1),radiate%fthrd(1,i,j),i,j,ngr & + ,radiate%bext(1,i,j),radiate%swup(1,i,j),radiate%swdn(1,i,j) & + ,radiate%lwup(1,i,j),radiate%lwdn(1,i,j)) + elseif (iswrtyp .eq. 5 .or. ilwrtyp .eq. 5) then + CALL radcalc5 (m1,maxnzp,iswrtyp,ilwrtyp & + ,glat,rtgt,topt & + ,radiate%albedt (i,j) ,radiate%cosz (i,j) & + ,radiate%rlongup (i,j) ,radiate%rshort(i,j) & + ,radiate%rlong (i,j) ,radiate%aodt (i,j) & + ,zm,zt,rv(1),dn0(1),pi0(1),pp(1),radiate%fthrd(1,i,j),i,j,ngr & + ,radiate%bext(1,i,j),radiate%swup(1,i,j),radiate%swdn(1,i,j) & + ,radiate%lwup(1,i,j),radiate%lwdn(1,i,j)) endif endif @@ -312,7 +338,7 @@ Subroutine mcphys (m1,k1,k2,k3,i,j,ngr,maxnzp & enddo ! Pristine ice to snow transfer -if (jnmb(4) .ge. 1) then +if (jnmb(3).ge.1) then CALL psxfer (k1(3),k2(3),k1(4),k2(4),i,j) endif @@ -416,9 +442,16 @@ Subroutine mcphys (m1,k1,k2,k3,i,j,ngr,maxnzp & rx_lhr = rx qx_lhr = qx + ! Make hydrometeor transfers due to collision-coalescence CALL colxfers (m1,k1,k2,scrmic1,scrmic2) +! Pristine ice to snow transfer done after collision-coalescence to +! avoid any mass/number adjustments that impact cloud-ice number +if (jnmb(3) .ge. 1) then + CALL psxfer (k1(3),k2(3),k1(4),k2(4),i,j) +endif + ! Calcs r,q,c for each category considering melting processes ! in the order of pristine,cloud,drizzle,snow,agg,graupel,hail,rain ! though nothing done for cloud or drizzle in (x02) routine @@ -467,11 +500,21 @@ Subroutine mcphys (m1,k1,k2,k3,i,j,ngr,maxnzp & qx_lhr = qx ! Ice nucleation -if (jnmb(3) .ge. 1) then +if (jnmb(3) .ge. 1 .and. iifn .lt. 4) then CALL icenuc (m1,k1(1),k2(1),k1(8),k2(8),k1pnuc,k2pnuc,ngr,rv(1) & ,dn0(1),dtlt,i,j) +elseif (iifn .eq. 4) then + CALL snownuc(m1,k1pnuc,k2pnuc,ngr,rv(1),dn0(1),dtlt,i,j) endif +!Output some data for diagnostic purposes +!if(i==4)then +! do k=2,38 +! print*,'ice_nuc',k,(theta(k) * (pi0(k)+pp(k)) / 1004.) - 273.16 & +! ,rx(k,3)+rx(k,4),(cx(k,3)+cx(k,4))*dn0(k)/1000. +! enddo +!endif + ! Finds bottom and top later of pristine ice if (jnmb(3) .ge. 1) then k1(3) = min(k1(3),k1pnuc) @@ -484,6 +527,14 @@ Subroutine mcphys (m1,k1,k2,k3,i,j,ngr,maxnzp & if (jnmb(1) .ge. 3) CALL enemb (m1,k1,k2,1,dn0(1)) if (jnmb(8) .ge. 3) CALL enemb (m1,k1,k2,8,dn0(1)) +!if(i==4)then +! do k=2,38 +! print*,'ice_presed',k,(theta(k) * (pi0(k)+pp(k)) / 1004.) - 273.16 & +! ,rx(k,3)+rx(k,4),(cx(k,3)+cx(k,4))*dn0(k)/1000. +! enddo +!endif + + ! Update latent heating budgets after ice nucleation CALL calc_lhr_icenuc (k1,k2) @@ -536,6 +587,14 @@ Subroutine mcphys (m1,k1,k2,k3,i,j,ngr,maxnzp & ,ustar(1),prough(1),imonthx & ) +!Output some data for diagnostic purposes +!if(i==4)then +! do k=2,38 +! print*,'ice_last',k,(theta(k) * (pi0(k)+pp(k)) / 1004.) - 273.16 & +! ,rx(k,3)+rx(k,4),(cx(k,3)+cx(k,4))*dn0(k)/1000. +! enddo +!endif + return END SUBROUTINE mcphys @@ -566,10 +625,10 @@ Subroutine copyback (m1,k2,k3,i,j,micro) !Copyback AEROSOLS if (iaerosol > 0) then - CALL ae1kmic (2,m1-1,micro%cccnp(1,i,j),aerocon(1,1)) - CALL ae1kmic (2,m1-1,micro%cccmp(1,i,j),aeromas(1,1)) - CALL ae1kmic (2,m1-1,micro%gccnp(1,i,j),aerocon(1,2)) - CALL ae1kmic (2,m1-1,micro%gccmp(1,i,j),aeromas(1,2)) + CALL ae1kmic (2,m1-1,micro%cn1np(1,i,j),aerocon(1,1)) + CALL ae1kmic (2,m1-1,micro%cn1mp(1,i,j),aeromas(1,1)) + CALL ae1kmic (2,m1-1,micro%cn2np(1,i,j),aerocon(1,2)) + CALL ae1kmic (2,m1-1,micro%cn2mp(1,i,j),aeromas(1,2)) endif if (idust > 0) then CALL ae1kmic (2,m1-1,micro%md1np(1,i,j),aerocon(1,3)) @@ -749,6 +808,10 @@ Subroutine copyback (m1,k2,k3,i,j,micro) CALL ae1kmic (1,m1,micro%nucicert(1,i,j),xnucicert(1)) CALL ae1kmic (1,m1,micro%vapliqt(1,i,j),xvapliqt(1)) CALL ae1kmic (1,m1,micro%vapicet(1,i,j),xvapicet(1)) + CALL ae1kmic (1,m1,micro%evapliqt(1,i,j),xevapliqt(1)) + CALL ae1kmic (1,m1,micro%evapicet(1,i,j),xevapicet(1)) + CALL ae1kmic (1,m1,micro%freezingt(1,i,j),xfreezingt(1)) + CALL ae1kmic (1,m1,micro%meltingt(1,i,j),xmeltingt(1)) CALL ae1kmic (1,m1,micro%melticet(1,i,j),xmelticet(1)) CALL ae1kmic (1,m1,micro%rimecldt(1,i,j),xrimecldt(1)) CALL ae1kmic (1,m1,micro%rain2icet(1,i,j),xrain2icet(1)) @@ -769,6 +832,14 @@ Subroutine copyback (m1,k2,k3,i,j,micro) CALL ae1kmic (1,m1,micro%vapgraut(1,i,j),xvapgraut(1)) CALL ae1kmic (1,m1,micro%vaphailt(1,i,j),xvaphailt(1)) CALL ae1kmic (1,m1,micro%vapdrizt(1,i,j),xvapdrizt(1)) + CALL ae1kmic (1,m1,micro%evapcldt(1,i,j),xevapcldt(1)) + CALL ae1kmic (1,m1,micro%evapraint(1,i,j),xevapraint(1)) + CALL ae1kmic (1,m1,micro%evapprist(1,i,j),xevapprist(1)) + CALL ae1kmic (1,m1,micro%evapsnowt(1,i,j),xevapsnowt(1)) + CALL ae1kmic (1,m1,micro%evapaggrt(1,i,j),xevapaggrt(1)) + CALL ae1kmic (1,m1,micro%evapgraut(1,i,j),xevapgraut(1)) + CALL ae1kmic (1,m1,micro%evaphailt(1,i,j),xevaphailt(1)) + CALL ae1kmic (1,m1,micro%evapdrizt(1,i,j),xevapdrizt(1)) CALL ae1kmic (1,m1,micro%meltprist(1,i,j),xmeltprist(1)) CALL ae1kmic (1,m1,micro%meltsnowt(1,i,j),xmeltsnowt(1)) CALL ae1kmic (1,m1,micro%meltaggrt(1,i,j),xmeltaggrt(1)) @@ -804,6 +875,10 @@ Subroutine copyback (m1,k2,k3,i,j,micro) micro%nucicert(1,i,j) = micro%nucicert(2,i,j) micro%vapliqt(1,i,j) = micro%vapliqt(2,i,j) micro%vapicet(1,i,j) = micro%vapicet(2,i,j) + micro%evapliqt(1,i,j) = micro%evapliqt(2,i,j) + micro%evapicet(1,i,j) = micro%evapicet(2,i,j) + micro%freezingt(1,i,j) = micro%freezingt(2,i,j) + micro%meltingt(1,i,j) = micro%meltingt(2,i,j) micro%melticet(1,i,j) = micro%melticet(2,i,j) micro%rimecldt(1,i,j) = micro%rimecldt(2,i,j) micro%rain2icet(1,i,j) = micro%rain2icet(2,i,j) @@ -824,6 +899,14 @@ Subroutine copyback (m1,k2,k3,i,j,micro) micro%vapgraut(1,i,j) = micro%vapgraut(2,i,j) micro%vaphailt(1,i,j) = micro%vaphailt(2,i,j) micro%vapdrizt(1,i,j) = micro%vapdrizt(2,i,j) + micro%evapcldt(1,i,j) = micro%evapcldt(2,i,j) + micro%evapraint(1,i,j) = micro%evapraint(2,i,j) + micro%evapprist(1,i,j) = micro%evapprist(2,i,j) + micro%evapsnowt(1,i,j) = micro%evapsnowt(2,i,j) + micro%evapaggrt(1,i,j) = micro%evapaggrt(2,i,j) + micro%evapgraut(1,i,j) = micro%evapgraut(2,i,j) + micro%evaphailt(1,i,j) = micro%evaphailt(2,i,j) + micro%evapdrizt(1,i,j) = micro%evapdrizt(2,i,j) micro%meltprist(1,i,j) = micro%meltprist(2,i,j) micro%meltsnowt(1,i,j) = micro%meltsnowt(2,i,j) micro%meltaggrt(1,i,j) = micro%meltaggrt(2,i,j) @@ -870,7 +953,7 @@ Subroutine calc_lhr_vap (k1,k2) integer :: lcat,k integer, dimension(11) :: k1,k2 -real :: temp,fracliq1,fracliq2,latheat +real :: temp,fracliq1,fracliq2,latheat,rxchange if(imbudget>=1)then @@ -921,14 +1004,22 @@ Subroutine calc_lhr_vap (k1,k2) ! Now calculate melting if (lhrtheta) then - latheat = (alli/pitot(k)) * (rx(k,lcat) & - *(1.-fracliq2)-rx(k,lcat)*(1.-fracliq1)) + latheat = (alli/pitot(k)) * & + (rx(k,lcat)*(1.-fracliq2)-rx(k,lcat)*(1.-fracliq1)) else - latheat = alli * cpi * (rx(k,lcat) & - *(1.-fracliq2)-rx(k,lcat)*(1.-fracliq1)) + latheat = alli * cpi * & + (rx(k,lcat)*(1.-fracliq2)-rx(k,lcat)*(1.-fracliq1)) endif xlatheatfrz(k) = xlatheatfrz(k) + latheat xlatheatfrzt(k) = xlatheatfrzt(k) + latheat + + ! Compute total freezing or melting and enter as positive values + rxchange = (rx(k,lcat)*(1.-fracliq2)-rx(k,lcat)*(1.-fracliq1)) + if (rxchange >= 0.0) then + xfreezingt(k) = xfreezingt(k) + rxchange + else + xmeltingt(k) = xmeltingt(k) - rxchange + endif endif enddo @@ -1000,6 +1091,12 @@ Subroutine calc_lhr_collmelt (m1) xlatheatfrz(k) = xlatheatfrz(k) + alli * cpi * (rice2(k)-rice1(k)) xlatheatfrzt(k) = xlatheatfrzt(k) + alli * cpi * (rice2(k)-rice1(k)) endif + ! Compute total freezing or melting and enter as positive values + if (rice2(k)-rice1(k) >= 0.0) then + xfreezingt(k) = xfreezingt(k) + (rice2(k)-rice1(k)) + else + xmeltingt(k) = xmeltingt(k) - (rice2(k)-rice1(k)) + endif enddo endif diff --git a/src/6.3.02/micro/mic_gamma.f90 b/src/micro/mic_gamma.f90 similarity index 100% rename from src/6.3.02/micro/mic_gamma.f90 rename to src/micro/mic_gamma.f90 diff --git a/src/6.3.02/micro/mic_init.f90 b/src/micro/mic_init.f90 similarity index 81% rename from src/6.3.02/micro/mic_init.f90 rename to src/micro/mic_init.f90 index 18169cf..a74eb6c 100644 --- a/src/6.3.02/micro/mic_init.f90 +++ b/src/micro/mic_init.f90 @@ -151,9 +151,17 @@ Subroutine init_ifn (n1,n2,n3,cifnp,dn0,ifm) implicit none integer :: n1,n2,n3,i,j,k,ifm +real :: e_a,e_b,e_t,e_k,e_c real, dimension(n1,n2,n3) :: cifnp,dn0 real :: cin_maxt +!CREATE YOUR OWN CUSTOM POTENTIAL IFN/INP PROFILE BELOW. OUR SORT OF +!DEFAULT IS THE EXPONENTIALLY DECREASING PROFILE, BUT THIS IS BY ALL +!MEANS NOT A DEFINITIVE PROFILE, JUST A NECESSARY PLACEHOLDER SO THAT +!SOME HETEROGENEOUS ICE NUCLEATION CAN OCCUR IF IIFN==1or2. IIFN==3 +!USES ONE OF THE DEMOTT FORMULAS AND IS BASED ON LARGE AEROSOLS DETERMINED +!FROM THE CLOUD DROPLET NUCLEATING AEROSOL DISTRIBUTIONS. + ! Initialize IFN if(iaeroprnt==1 .and. print_msg) then print*,'Start Initializing Ice Nuclei concentration' @@ -167,18 +175,65 @@ Subroutine init_ifn (n1,n2,n3,cifnp,dn0,ifm) cin_maxt = cin_max * 1.e6 !Set up Vertical profile - if(k<=2) cifnp(k,i,j)=cin_maxt - ! Exponential decrease that scales with pressure decrease - if(k>2) cifnp(k,i,j)=cin_maxt*exp(-zt(k)/7000.) - !Output initial sample profile - if(iaeroprnt==1 .and. i==1 .and. j==1 .and. print_msg) then - if(k==1) print*,' Ice Nuclei - init (k,zt,ifn/kg,ifn/L) on Grid:',ifm + !*************************************************************************** + !Exponential decrease that scales with pressure decrease. + if (cin_max >= 0.0) then + if(k<=2) cifnp(k,i,j)=cin_maxt + if(k >2) cifnp(k,i,j)=cin_maxt*exp(-zt(k)/7000.) + !Output initial sample profile + if(iaeroprnt==1 .and. i==1 .and. j==1 .and. print_msg) then + if(k==1) print*,' Ice Nuclei - init (k,zt,ifn/mg,ifn/L) on Grid:',ifm print'(a9,i5,f11.1,2f17.7)',' IFN-init' & - ,k,zt(k),cifnp(k,i,j),cifnp(k,i,j)/1.e3*dn0(k,i,j) + ,k,zt(k),cifnp(k,i,j)/1.e6,cifnp(k,i,j)/1.e3*dn0(k,i,j) + endif + !*************************************************************************** + !Use SPICULE INP profile if cin_maxt ~ -1.0 + !Profile from aircraft obs during the SPICULE field campaign. + !To mimic the SPICULE profile in magnitude, need to set the following parameters. + !and use IIFN=2 for DeMott scheme, and IFN_FORMULA=2 for DeMott(2015) dust formula. + !Perhaps using this profile is more realistic given that is has basis + !in reality from observations of the central-western continental U.S. + elseif (cin_max > -1.01 .and. cin_max < -0.99) then + e_t = 0.10 ! Controls the shape of the profile + e_a = 2.50 ! approximately cin_maxt + e_k = 3.80 + e_b = 5.80 ! Level where you want profile to start decreasing + e_c = 1.32 ! Necessary so you do not get negative numbers (changes with "a") + cifnp(k,i,j)=(-1.0*(e_a/2.0)*(erf(((zt(k)/1000)-e_b)/sqrt(4.0*e_k*e_t)))+e_c) + !NOTE THAT THIS CURVE FIT TO DATA IS BASED ON #/CM3 UNITS, SO CONVERT BELOW + cifnp(k,i,j) = cifnp(k,i,j) * 1.e6 / dn0(k,i,j) ! convert #/cm3 to #/kg + !Output initial sample profile + if(iaeroprnt==1 .and. i==1 .and. j==1 .and. print_msg) then + if(k==1) print*,' Ice Nuclei - init (k,zt,inp/cm3,inp/mg,inp/L) on Grid:',ifm + print'(a9,i5,f11.1,3f12.3)',' IFN-init',k,zt(k) & + ,cifnp(k,i,j)/1.e6*dn0(k,i,j),cifnp(k,i,j)/1.e6,cifnp(k,i,j)/1.e3*dn0(k,i,j) + endif + !*************************************************************************** + !Use MC3E INP profile if cin_maxt ~ 2.0 + !Profile from aircraft obs during the MC3E field project. (Marinescu et al. 2016) + !To mimic the MC3E profile in magnitude, need to set the following parameters. + !and use IIFN=2 for DeMott scheme, and IFN_FORMULA=1 for DeMott(2010) general formula. + !Perhaps using this profile is more realistic given that is has basis + !in reality from observations in the southern great plains of the continental U.S. + elseif (cin_max > -2.01 .and. cin_max < -1.99) then + e_t = 0.35 ! Controls the shape of the profile + e_a = 3.28 ! approximately cin_maxt + e_k = 3.00 + e_b = 2.27 ! Level where you want profile to start decreasing + e_c = 1.96 ! Necessary so you do not get negative numbers (changes with "a") + cifnp(k,i,j)=(-1.0*(e_a/2.0)*(erf(((zt(k)/1000)-e_b)/sqrt(4.0*e_k*e_t)))+e_c) + !NOTE THAT THIS CURVE FIT TO DATA IS BASED ON #/MG UNITS, SO CONVERT BELOW + cifnp(k,i,j) = cifnp(k,i,j) * 1.e6 ! convert #/mg to #/kg + !Output initial sample profile + if(iaeroprnt==1 .and. i==1 .and. j==1 .and. print_msg) then + if(k==1) print*,' Ice Nuclei - init (k,zt,inp/cm3,inp/mg,inp/L) on Grid:',ifm + print'(a9,i5,f11.1,3f12.3)',' IFN-init',k,zt(k) & + ,cifnp(k,i,j)/1.e6*dn0(k,i,j),cifnp(k,i,j)/1.e6,cifnp(k,i,j)/1.e3*dn0(k,i,j) + endif + !*************************************************************************** endif - enddo enddo enddo @@ -189,7 +244,7 @@ Subroutine init_ifn (n1,n2,n3,cifnp,dn0,ifm) END SUBROUTINE init_ifn !############################################################################## -Subroutine init_ccn (n1,n2,n3,cccnp,cccmp,dn0,ifm) +Subroutine init_ccn1 (n1,n2,n3,cn1np,cn1mp,dn0,ifm) use micphys use rconstants @@ -198,34 +253,34 @@ Subroutine init_ccn (n1,n2,n3,cccnp,cccmp,dn0,ifm) implicit none integer :: n1,n2,n3,i,j,k,ifm -real, dimension(n1,n2,n3) :: cccnp,cccmp,dn0 -real :: ccn_maxt +real, dimension(n1,n2,n3) :: cn1np,cn1mp,dn0 +real :: ccn1_maxt -! Initialize CCN -if(iaeroprnt==1 .and. print_msg) print*,'Start Initializing CCN concentration' +! Initialize CCN mode 1 +if(iaeroprnt==1 .and. print_msg) print*,'Start Initializing CCN mode 1 concen' !Convert RAMSIN #/mg to #/kg - ccn_maxt = ccn_max * 1.e6 + ccn1_maxt = ccn1_max * 1.e6 do j = 1,n3 do i = 1,n2 do k = 1,n1 !Set up Vertical profile - if(k<=2) cccnp(k,i,j)=ccn_maxt + if(k<=2) cn1np(k,i,j)=ccn1_maxt !Exponential decrease that scales with pressure decrease - if(k>2) cccnp(k,i,j)=ccn_maxt*exp(-zt(k)/7000.) + if(k>2) cn1np(k,i,j)=ccn1_maxt*exp(-zt(k)/7000.) !Output initial sample profile if(iaeroprnt==1 .and. i==1 .and. j==1 .and. print_msg) then - if(k==1) print*,' CCN-init (k,zt,ccn/mg,ccn/cc) on Grid:',ifm - print'(a9,i5,f11.1,2f17.7)',' CCN-init' & - ,k,zt(k),cccnp(k,i,j)/1.e6,cccnp(k,i,j)/1.e6*dn0(k,i,j) + if(k==1) print*,' CCN-1-init (k,zt,ccn1/mg,ccn1/cc) on Grid:',ifm + print'(a11,i5,f11.1,2f17.7)',' CCN-1-init' & + ,k,zt(k),cn1np(k,i,j)/1.e6,cn1np(k,i,j)/1.e6*dn0(k,i,j) endif - !Set up Field of CCN mass mixing ratio (kg/kg) - cccmp(k,i,j) = ((aero_medrad(1)*aero_rg2rm(1))**3.) & - *cccnp(k,i,j)/(0.23873/aero_rhosol(1)) + !Set up Field of CCN-mode-1 mass mixing ratio (kg/kg) + cn1mp(k,i,j) = ((aero_medrad(1)*aero_rg2rm(1))**3.) & + *cn1np(k,i,j)/(0.23873/aero_rhosol(1)) enddo enddo @@ -234,10 +289,10 @@ Subroutine init_ccn (n1,n2,n3,cccnp,cccmp,dn0,ifm) if(iaeroprnt==1 .and. print_msg) print*,' ' return -END SUBROUTINE init_ccn +END SUBROUTINE init_ccn1 !############################################################################## -Subroutine init_gccn (n1,n2,n3,gccnp,gccmp,dn0,ifm) +Subroutine init_ccn2 (n1,n2,n3,cn2np,cn2mp,dn0,ifm) use micphys use rconstants @@ -246,34 +301,34 @@ Subroutine init_gccn (n1,n2,n3,gccnp,gccmp,dn0,ifm) implicit none integer :: n1,n2,n3,i,j,k,ifm -real, dimension(n1,n2,n3) :: gccnp,gccmp,dn0 -real :: gccn_maxt +real, dimension(n1,n2,n3) :: cn2np,cn2mp,dn0 +real :: ccn2_maxt -! Initialize Giant-CCN -if(iaeroprnt==1 .and. print_msg) print*,'Start Initializing GCCN concentration' +! Initialize CCN mode 2 +if(iaeroprnt==1 .and. print_msg) print*,'Start Initializing CCN mode 2 concen' !Convert RAMSIN #/mg to #/kg - gccn_maxt = gccn_max * 1.e6 + ccn2_maxt = ccn2_max * 1.e6 do j = 1,n3 do i = 1,n2 do k = 1,n1 !Set up Vertical profile - if(k<=2) gccnp(k,i,j)=gccn_maxt + if(k<=2) cn2np(k,i,j)=ccn2_maxt ! Exponential decrease that scales with pressure decrease - if(k>2) gccnp(k,i,j)=gccn_maxt*exp(-zt(k)/7000.) + if(k>2) cn2np(k,i,j)=ccn2_maxt*exp(-zt(k)/7000.) !Output initial sample profile if(iaeroprnt==1 .and. i==1 .and. j==1 .and. print_msg) then - if(k==1) print*,' GCCN-init (k,zt,gccn/mg,gccn/cc) on Grid:',ifm - print'(a10,i5,f11.1,2f17.7)',' GCCN-init' & - ,k,zt(k),gccnp(k,i,j)/1.e6,gccnp(k,i,j)/1.e6*dn0(k,i,j) + if(k==1) print*,' CCN-2-init (k,zt,ccn2/mg,ccn2/cc) on Grid:',ifm + print'(a11,i5,f11.1,2f17.7)',' CCN-2-init' & + ,k,zt(k),cn2np(k,i,j)/1.e6,cn2np(k,i,j)/1.e6*dn0(k,i,j) endif - !Set up Field of GCCN mass mixing ratio (kg/kg) - gccmp(k,i,j) = ((aero_medrad(2)*aero_rg2rm(2))**3.) & - *gccnp(k,i,j)/(0.23873/aero_rhosol(2)) + !Set up Field of CCN-mode-2 mass mixing ratio (kg/kg) + cn2mp(k,i,j) = ((aero_medrad(2)*aero_rg2rm(2))**3.) & + *cn2np(k,i,j)/(0.23873/aero_rhosol(2)) enddo enddo @@ -282,7 +337,7 @@ Subroutine init_gccn (n1,n2,n3,gccnp,gccmp,dn0,ifm) if(iaeroprnt==1 .and. print_msg) print*,' ' return -END SUBROUTINE init_gccn +END SUBROUTINE init_ccn2 !############################################################################## Subroutine init_dust (n1,n2,n3,md1np,md2np,md1mp,md2mp,dn0,ifm) @@ -510,13 +565,13 @@ Subroutine init_tracer (n1,n2,n3,tracerp,dn0,ifm,nsc) integer :: n1,n2,n3,i,j,k,ifm,nsc,ii,jj real, dimension(n1,n2,n3) :: tracerp,dn0 -real :: ccn_maxt +real :: ccn1_maxt ! Initialize Tracers if(print_msg) print*,'Start Initializing Tracers, Grid:',ifm,' Tracer:',nsc !Convert RAMSIN #/mg to #/kg - ccn_maxt = ccn_max * 1.e6 + ccn1_maxt = ccn1_max * 1.e6 do j = 1,n3 do i = 1,n2 @@ -528,8 +583,8 @@ Subroutine init_tracer (n1,n2,n3,tracerp,dn0,ifm,nsc) !Set up Vertical profile, Exponential decrease that scales with pressure if(nsc==1) then - if(k<=2) tracerp(k,i,j)=ccn_maxt - if(k>2) tracerp(k,i,j)=ccn_maxt*exp(-zt(k)/7000.) + if(k<=2) tracerp(k,i,j)=ccn1_maxt + if(k>2) tracerp(k,i,j)=ccn1_maxt*exp(-zt(k)/7000.) endif !Set up Field of CCN mass mixing ratio (kg/kg) if(nsc==2) then @@ -720,8 +775,11 @@ Subroutine micinit () print*,'' endif +! 125 micron max diameter ice crystal size for participating +! in Hallet-Mossop 2ndary ice splintering process. dps = 125.e-6 dps2 = dps ** 2 + rictmin = 1.0001 rictmax = 0.9999 * float(nembc) diff --git a/src/6.3.02/micro/mic_misc.f90 b/src/micro/mic_misc.f90 similarity index 97% rename from src/6.3.02/micro/mic_misc.f90 rename to src/micro/mic_misc.f90 index 0d6d104..ed70198 100644 --- a/src/6.3.02/micro/mic_misc.f90 +++ b/src/micro/mic_misc.f90 @@ -160,10 +160,10 @@ Subroutine range_check (m1,k1,k2,k3,i,j,frq,ngr,dtlt,time,micro) cifnx(k) = micro%cifnp(k,i,j) endif if (iaerosol > 0) then - aerocon(k,1) = micro%cccnp(k,i,j) - aeromas(k,1) = micro%cccmp(k,i,j) - aerocon(k,2) = micro%gccnp(k,i,j) - aeromas(k,2) = micro%gccmp(k,i,j) + aerocon(k,1) = micro%cn1np(k,i,j) + aeromas(k,1) = micro%cn1mp(k,i,j) + aerocon(k,2) = micro%cn2np(k,i,j) + aeromas(k,2) = micro%cn2mp(k,i,j) endif if (idust > 0) then aerocon(k,3) = micro%md1np(k,i,j) @@ -326,6 +326,18 @@ Subroutine range_check (m1,k1,k2,k3,i,j,frq,ngr,dtlt,time,micro) if (k2(3) == 1) k1(3) = k + 1 endif enddo +elseif (iifn == 4) then + !If using a combined pristineice-snow category, this + !will be useful + do k = 2,m1-1 + if (micro%rsp(k,i,j) >= rxmin) then + k2(3) = k + rx(k,3) = micro%rsp(k,i,j) + if (jnmb(4) >= 5) cx(k,3) = micro%csp(k,i,j) + else + if (k2(3) == 1) k1(3) = k + 1 + endif + enddo endif ! fill scratch arrays for snow @@ -423,6 +435,10 @@ Subroutine range_check (m1,k1,k2,k3,i,j,frq,ngr,dtlt,time,micro) xnucicert(k) = micro%nucicert(k,i,j) xvapliqt(k) = micro%vapliqt(k,i,j) xvapicet(k) = micro%vapicet(k,i,j) + xevapliqt(k) = micro%evapliqt(k,i,j) + xevapicet(k) = micro%evapicet(k,i,j) + xfreezingt(k) = micro%freezingt(k,i,j) + xmeltingt(k) = micro%meltingt(k,i,j) xmelticet(k) = micro%melticet(k,i,j) xrimecldt(k) = micro%rimecldt(k,i,j) xaggregatet(k) = micro%aggregatet(k,i,j) @@ -445,6 +461,14 @@ Subroutine range_check (m1,k1,k2,k3,i,j,frq,ngr,dtlt,time,micro) xvapgraut(k) = micro%vapgraut(k,i,j) xvaphailt(k) = micro%vaphailt(k,i,j) xvapdrizt(k) = micro%vapdrizt(k,i,j) + xevapcldt(k) = micro%evapcldt(k,i,j) + xevapraint(k) = micro%evapraint(k,i,j) + xevapprist(k) = micro%evapprist(k,i,j) + xevapsnowt(k) = micro%evapsnowt(k,i,j) + xevapaggrt(k) = micro%evapaggrt(k,i,j) + xevapgraut(k) = micro%evapgraut(k,i,j) + xevaphailt(k) = micro%evaphailt(k,i,j) + xevapdrizt(k) = micro%evapdrizt(k,i,j) xmeltprist(k) = micro%meltprist(k,i,j) xmeltsnowt(k) = micro%meltsnowt(k,i,j) xmeltaggrt(k) = micro%meltaggrt(k,i,j) @@ -494,6 +518,10 @@ Subroutine range_check (m1,k1,k2,k3,i,j,frq,ngr,dtlt,time,micro) xnucicert(k) = 0. xvapliqt(k) = 0. xvapicet(k) = 0. + xevapliqt(k) = 0. + xevapicet(k) = 0. + xfreezingt(k) = 0. + xmeltingt(k) = 0. xmelticet(k) = 0. xrimecldt(k) = 0. xaggregatet(k) = 0. @@ -516,6 +544,14 @@ Subroutine range_check (m1,k1,k2,k3,i,j,frq,ngr,dtlt,time,micro) xvapgraut(k) = 0. xvaphailt(k) = 0. xvapdrizt(k) = 0. + xevapcldt(k) = 0. + xevapraint(k) = 0. + xevapprist(k) = 0. + xevapsnowt(k) = 0. + xevapaggrt(k) = 0. + xevapgraut(k) = 0. + xevaphailt(k) = 0. + xevapdrizt(k) = 0. xmeltprist(k) = 0. xmeltsnowt(k) = 0. xmeltaggrt(k) = 0. diff --git a/src/6.3.02/micro/mic_nuc.f90 b/src/micro/mic_nuc.f90 similarity index 91% rename from src/6.3.02/micro/mic_nuc.f90 rename to src/micro/mic_nuc.f90 index 01202f2..d986e71 100644 --- a/src/6.3.02/micro/mic_nuc.f90 +++ b/src/micro/mic_nuc.f90 @@ -13,7 +13,7 @@ Subroutine cldnuc (m1,k1cnuc,k2cnuc,k1dnuc,k2dnuc,rv,wp,i,j,dn0) real :: tairc_nuc,w_nuc,rg_nuc,tab,sfcareatotal real :: rjw,wtw1,wtw2,rjconcen,wtcon1,wtcon2,jrg1,jrg2,eps1,eps2 real :: total_cld_nucc,total_drz_nucc,total_cld_nucr,total_drz_nucr -real, dimension(9) :: concen_tab +real, dimension(aerocat) :: concen_tab !Re-set cloud layer before nucleation k1cnuc = 2 @@ -50,7 +50,7 @@ Subroutine cldnuc (m1,k1cnuc,k2cnuc,k1dnuc,k2dnuc,rv,wp,i,j,dn0) enddo !************************************************************************* -!Saleeby(6/3/02) Prognosing number concentration of cloud and drizzle **** +!Saleeby(6/3/2002) Prognosing number concentration of cloud and drizzle **** !************************************************************************* elseif (jnmb(1) >= 5) then do k = 2,m1-1 @@ -68,15 +68,15 @@ Subroutine cldnuc (m1,k1cnuc,k2cnuc,k1dnuc,k2dnuc,rv,wp,i,j,dn0) !Set aside ice nuclei for DeMott scheme and recomute aerosol stats if(iifn==3) CALL prenuc_ifn (m1,k,dn0,rv) -!**********LOOP OVER CCN, GCCN, 2 DUST MODES, 3 SALT MODES *************** +!**********LOOP OVER 2 CCN MODES, 2 DUST MODES, 3 SALT MODES *************** !Use the acat loop for turning on aerosol nucleation do acat=1,aerocat concen_tab(acat) = 0.0 concen_nuc = 0.0 - if((acat==1) .or. & ! CCN - (acat==2) .or. & ! GCCN + if((acat==1) .or. & ! CCN-1 + (acat==2) .or. & ! CCN-2 (acat==3 .and. idust>0) .or. & ! Small dust mode (acat==4 .and. idust>0) .or. & ! Large dust mode (acat==5 .and. isalt>0) .or. & ! Salt film mode @@ -181,6 +181,15 @@ Subroutine cldnuc (m1,k1cnuc,k2cnuc,k1dnuc,k2dnuc,rv,wp,i,j,dn0) endif concen_tab(acat) = concen_nuc * tab * epstemp + !Saleeby(2023-06-06) + !Override nucleation if median radius (rg) less than minimum lookup + !table size. In the past we simply forced rg up to the minimum and + !continued activation of aerosols with rg < 10nm. Perhaps we need to + !limit this activation. So, no activation if rg < 10nm. In this respect, + !some aerosols may be carried around without nucleating. They can still + !be radiatively important and undergo depositin. + if (rg < 0.01e-6) concen_tab(acat) = 0.0 + endif !if concen_nuc > mincon endif !if acat aerosol type is valid enddo !looping over aerocat @@ -190,8 +199,8 @@ Subroutine cldnuc (m1,k1cnuc,k2cnuc,k1dnuc,k2dnuc,rv,wp,i,j,dn0) do acat=1,aerocat aero_ratio(acat) = 0.0 ! Aerosol fraction aero_vap(acat) = 0.0 ! Total surface area of aerosol category - if((acat==1) .or. & ! CCN - (acat==2) .or. & ! GCCN + if((acat==1) .or. & ! CCN-1 + (acat==2) .or. & ! CCN-2 (acat==3 .and. idust>0) .or. & ! Small dust mode (acat==4 .and. idust>0) .or. & ! Large dust mode (acat==5 .and. isalt>0) .or. & ! Salt film mode @@ -220,8 +229,8 @@ Subroutine cldnuc (m1,k1cnuc,k2cnuc,k1dnuc,k2dnuc,rv,wp,i,j,dn0) total_drz_nucr=0.0 do acat=1,aerocat ctc = 0 - if((acat==1) .or. & ! CCN - (acat==2) .or. & ! GCCN + if((acat==1) .or. & ! CCN-1 + (acat==2) .or. & ! CCN-2 (acat==3 .and. idust>0) .or. & ! Small dust mode (acat==4 .and. idust>0) .or. & ! Large dust mode (acat==5 .and. isalt>0) .or. & ! Salt film mode @@ -256,6 +265,11 @@ Subroutine cldnuc (m1,k1cnuc,k2cnuc,k1dnuc,k2dnuc,rv,wp,i,j,dn0) !Vapor allocated to a given aerosol species vaprccn = 0.5*excessrv*cldrat !Sum of all nucleation <= 1/2 excessrv + !Saleeby(2023-06-01): Replacing line above to try and limit new nucleation. + !Anecdotal evidence suggests that we nucleate too many aerosols, so we are + !seeing if this will switch more to growth of existing droplets over making + !more new ones. + !vaprccn = 0.25*excessrv*cldrat !Sum of all nucleation <= 1/4 excessrv !Determine if nucleated droplets go to cloud or drizzle drop=1 @@ -266,8 +280,9 @@ Subroutine cldnuc (m1,k1cnuc,k2cnuc,k1dnuc,k2dnuc,rv,wp,i,j,dn0) if(concen_tab(acat) > vaprccn / emb0(drop)) concen_tab(acat) = vaprccn / emb0(drop) if(concen_tab(acat) < vaprccn / emb1(drop)) vaprccn = concen_tab(acat) * emb1(drop) -!Nucleate to 2-micron diameter droplets whose mass is emb0 -!if(concen_tab(acat) * emb0(drop) <= vaprccn) vaprccn=concen_tab(acat) * emb0(drop) + !Saleeby(2023-05-30) + !Nucleate to minimum drop diameter (cloud or drizzle) droplets whose mass is emb0 + if(concen_tab(acat) * emb0(drop) <= vaprccn) vaprccn=concen_tab(acat) * emb0(drop) !Accumulated nucleated particles if not removing them if(iccnlev==0) then @@ -370,7 +385,7 @@ Subroutine cldnuc (m1,k1cnuc,k2cnuc,k1dnuc,k2dnuc,rv,wp,i,j,dn0) ccncon(ic) = ccncon(ic) + ccncon(ic-1) ccnmas(ic) = ccnmas(ic) + ccnmas(ic-1) endif - !Track immersion freezing droplets that contain large CCN, GCCN, or DUST + !Track immersion freezing droplets that contain large CCN1, CCN2, or DUST ! Do not track immersion freezing for salt species (acat=5,6,7) if(iifn==3.and.(acat==1.or.acat==2.or.acat==3.or.acat==4.or.acat==8.or.acat==9 & .or.acat==aerocat-1.or.acat==aerocat) & @@ -475,6 +490,47 @@ Subroutine cldnuc (m1,k1cnuc,k2cnuc,k1dnuc,k2dnuc,rv,wp,i,j,dn0) return END SUBROUTINE cldnuc +!############################################################################## +Subroutine snownuc (m1,kp1,kp2,ngr,rv,dn0,dtlt,i,j) + +use rconstants +use micphys + +implicit none + +integer :: m1, kp1, kp2, ngr, i, j, k +real :: rnuc,nnuc,sati,satw,excessrv,rsnew,dtlt +real,dimension(m1) :: rv, dn0 + +kp1 = m1 +kp2 = 0 +do k = 2,m1-1 + excessrv = rv(k) - rvisair(k) + satw = rv(k)/rvlsair(k) - 1. + sati = rv(k)/rvisair(k) - 1. + rsnew = 0. + !rvisair 0.05 .and. rvisair(k) < rvlsair(k) & + .and. (satw<0. .or. rx(k,1)>=2.e-6)) then + !Adele - assuming that cin_max is in 1/L!!! + nnuc = max(0.,cin_max/dn0(k)*1.e3-cx(k,3)-cx(k,4)) + if (nnuc > 0) then + rnuc = nnuc * emb0(4) + rsnew = min(rnuc,.5*excessrv) + rx(k,3) = rx(k,3) + rsnew + rv(k) = rv(k) - rsnew + !Set sum of pristine ice and snow concentration + cx(k,3) = cx(k,3) + nnuc + if (kkp2) kp2=k + if (imbudget >= 1) then + xnucicert(k) = xnucicert(k) + rsnew * budget_scalet + endif + endif + endif +enddo +return +END SUBROUTINE snownuc !############################################################################## Subroutine icenuc (m1,kc1,kc2,kd1,kd2,k1pnuc,k2pnuc,ngr,rv,dn0,dtlt,i,j) @@ -762,12 +818,12 @@ Subroutine icenuc (m1,kc1,kc2,kd1,kd2,k1pnuc,k2pnuc,ngr,rv,dn0,dtlt,i,j) !Input aerosols in #/cm3 and outputs #/L activated if(iifn_formula==1) then !Original Demott(2010) formula - nifn(k) = 0.0000594 * (-tairc(k))**3.33 & - * (tot_in)**(0.0264*(-tairc(k))+0.0033) + nifn(k) = 0.0000594 * ( -max(-35.0,tairc(k)) )**3.33 & + * (tot_in)**(0.0264*( -max(-35.0,tairc(k)) )+0.0033) elseif(iifn_formula==2) then !Modified Demott(2010) for dust-dominated cases !Paul suggested an additional factor of 3 multiplier - nifn(k) = 3.0 * 0.0008 * 10 ** (-0.2*(tairc(k)+9.7)) * tot_in ** 1.25 + nifn(k) = 3.0 * 0.0008 * 10 ** (-0.2*(max(-35.0,tairc(k))+9.7)) * tot_in ** 1.25 endif !Adjust units and such @@ -797,15 +853,15 @@ Subroutine icenuc (m1,kc1,kc2,kd1,kd2,k1pnuc,k2pnuc,ngr,rv,dn0,dtlt,i,j) vapnuc=0.0 if(jnmb(1)>=5)then if(iccnlev==0) then - vapnuc = max(0.,haznuc + diagni - cx(k,3)) + vapnuc = max(0.,haznuc + diagni - cx(k,3) - cx(k,4)) elseif(iccnlev>=1 .and. iifn==3) then vapnuc = max(0.,haznuc + diagni) elseif(iccnlev>=1 .and. iifn<=2) then vapnuc = max(0.,haznuc) - vapnuc = vapnuc + max(0.,diagni - cx(k,3)) + vapnuc = vapnuc + max(0.,diagni - cx(k,3) - cx(k,4)) endif else - vapnuc = max(0.,haznuc + diagni - cx(k,3)) + vapnuc = max(0.,haznuc + diagni - cx(k,3) - cx(k,4)) endif !Modify haze nucleation and IN nucleation if not enough vapor available @@ -821,7 +877,7 @@ Subroutine icenuc (m1,kc1,kc2,kd1,kd2,k1pnuc,k2pnuc,ngr,rv,dn0,dtlt,i,j) !(Saleeby10-17-2011) Determine haze nucleation and IN nucleation !DeMott(2010) formula already applied for ICLOUD >= 5 !Allow large DeMott (diagni) particles to preferentially nucleate - !over the haze particles (cccnp) for IIFN==3. Perhaps should include + !over the haze particles (cn1np) for IIFN==3. Perhaps should include !all aerosols into potential haze nucleation? if((haznuc.gt.0.0 .or. diagni.gt.0.0) .and. jnmb(3).ge.5) then @@ -894,12 +950,12 @@ Subroutine icenuc (m1,kc1,kc2,kd1,kd2,k1pnuc,k2pnuc,ngr,rv,dn0,dtlt,i,j) !Input aerosols in #/cm3 and outputs #/L activated if(iifn_formula==1) then !Original Demott(2010) formula - ifntemp = 0.0000594 * (-tairc(k))**3.33 & - * (tot_in)**(0.0264*(-tairc(k))+0.0033) + ifntemp = 0.0000594 * ( -max(-35.0,tairc(k)) )**3.33 & + * (tot_in)**(0.0264*( -max(-35.0,tairc(k)) )+0.0033) elseif(iifn_formula==2) then !Modified Demott(2010) for dust-dominated cases !Paul suggested an additional factor of 3 multiplier - ifntemp = 3.0 * 0.0008 * 10 ** (-0.2*(tairc(k)+9.7)) * tot_in ** 1.25 + ifntemp = 3.0 * 0.0008 * 10 ** (-0.2*(max(-35.0,tairc(k))+9.7)) * tot_in ** 1.25 endif !Adjust units and such diff --git a/src/6.3.02/micro/mic_nucpre.f90 b/src/micro/mic_nucpre.f90 similarity index 92% rename from src/6.3.02/micro/mic_nucpre.f90 rename to src/micro/mic_nucpre.f90 index c79240b..7a56c2f 100644 --- a/src/6.3.02/micro/mic_nucpre.f90 +++ b/src/micro/mic_nucpre.f90 @@ -14,8 +14,8 @@ Subroutine prenuc_ccn (k,i,j) !Set default values to override if aerosol type exists aero_rg(acat) = aero_medrad(acat) ! Default median radius - if((acat==1) .or. & ! CCN - (acat==2) .or. & ! GCCN + if((acat==1) .or. & ! CCN-1 + (acat==2) .or. & ! CCN-2 (acat==3 .and. idust>0) .or. & ! Small dust mode (acat==4 .and. idust>0) .or. & ! Large dust mode (acat==5 .and. isalt>0) .or. & ! Salt film mode @@ -36,7 +36,9 @@ Subroutine prenuc_ccn (k,i,j) aero_rg(acat)=((0.23873/rhosol*aeromas(k,acat)/aerocon(k,acat)) & **(1./3.))/aero_rg2rm(acat) - if(aero_rg(acat) < 0.01e-6) aero_rg(acat) = 0.01e-6 + !Saleeby(2023-06-06):Do not limit minimum rg (median radius) + !if(aero_rg(acat) < 0.01e-6) aero_rg(acat) = 0.01e-6 + if(aero_rg(acat) > 6.50e-6) aero_rg(acat) = 6.50e-6 aeromas(k,acat) = ((aero_rg(acat)*aero_rg2rm(acat))**3.) & @@ -75,16 +77,15 @@ Subroutine prenuc_ifn (m1,k,dn0,rv) tot_in = 0.0 total_in(k) = 0.0 - !Loop over CCN, GCCN, SMALL DUST, LARGE DUST, REGEN 1&2 (1,2,3,4,8,9) - !Not looping over salt species since these cannot act is ice nuclei + !Not looping over salt species since these are not allowed to act as ice nuclei do acat=1,aerocat in_thresh = 1 totifnn(k,acat) = 0.0 totifnm(k,acat) = 0.0 - if((acat==1) .or. & ! CCN - (acat==2) .or. & ! GCCN + if((acat==1) .or. & ! CCN-1 + (acat==2) .or. & ! CCN-2 (acat==3 .and. idust>0) .or. & ! Small dust mode (acat==4 .and. idust>0) .or. & ! Large dust mode (acat==8 .and. iabcarb>0) .or. & ! Absorbing carbon 1 mode @@ -183,7 +184,7 @@ Subroutine prenuc_ifn (m1,k,dn0,rv) !DeMott IN activation based on total number of all aerosol !greater than 0.5 micron diameter. nifn(k) = 0.0 - if(tairc(k) .lt. 0.0 .and. total_in(k) .gt. mincon) then + if(tairc(k) < 0.0 .and. total_in(k) > mincon) then !For DeMott Eqn, the aerosol number to put into the eqn needs to be !the remaining of unprocessed aerosols > 0.5 microns + the remaining !aerosols > 0.5 microns contained in droplets + @@ -202,12 +203,12 @@ Subroutine prenuc_ifn (m1,k,dn0,rv) !Input aerosols in #/cm3 and outputs #/L activated if(iifn_formula==1) then !Original Demott(2010) formula - nifn(k) = 0.0000594 * (-tairc(k))**3.33 & - * (tot_in)**(0.0264*(-tairc(k))+0.0033) + nifn(k) = 0.0000594 * ( -max(-35.0,tairc(k)) )**3.33 & + * (tot_in)**(0.0264*( -max(-35.0,tairc(k)) )+0.0033) elseif(iifn_formula==2) then !Modified Demott(2010) for dust-dominated cases !Paul suggested an additional factor of 3 multiplier - nifn(k) = 3.0 * 0.0008 * 10 ** (-0.2*(tairc(k)+9.7)) * tot_in ** 1.25 + nifn(k) = 3.0 * 0.0008 * 10 ** (-0.2*(max(-35.0,tairc(k))+9.7)) * tot_in ** 1.25 endif !Adjust units and such @@ -254,8 +255,8 @@ Subroutine prenuc_ifn (m1,k,dn0,rv) totifnn(k,acat) = totifnn(k,acat) * ifnfrac totifnm(k,acat) = totifnm(k,acat) * ifnfrac if(iccnlev>=1 .and. ifnfrac>0.0) then - if((acat==1) .or. & ! CCN - (acat==2) .or. & ! GCCN + if((acat==1) .or. & ! CCN-1 + (acat==2) .or. & ! CCN-2 (acat==3 .and. idust>0) .or. & ! Small dust mode (acat==4 .and. idust>0) .or. & ! Large dust mode (acat==8 .and. iabcarb>0) .or. & ! Absorbing carbon 1 mode @@ -296,7 +297,10 @@ Subroutine prenuc_ifn (m1,k,dn0,rv) rhosol=aero_rhosol(acat) aero_rg(acat)=((0.23873/rhosol*aeromas(k,acat)/aerocon(k,acat)) & **(1./3.))/aero_rg2rm(acat) - if(aero_rg(acat) < 0.01e-6) aero_rg(acat) = 0.01e-6 + + !Saleeby(2023-06-06):Do not limit minimum rg (median radius) + !if(aero_rg(acat) < 0.01e-6) aero_rg(acat) = 0.01e-6 + if(aero_rg(acat) > 6.50e-6) aero_rg(acat) = 6.50e-6 aeromas(k,acat) = ((aero_rg(acat)*aero_rg2rm(acat))**3.) & *aerocon(k,acat)/(0.23873/rhosol) diff --git a/src/6.3.02/micro/mic_nuctab.f90 b/src/micro/mic_nuctab.f90 similarity index 99% rename from src/6.3.02/micro/mic_nuctab.f90 rename to src/micro/mic_nuctab.f90 index 44cbe21..3b7e6ae 100644 --- a/src/6.3.02/micro/mic_nuctab.f90 +++ b/src/micro/mic_nuctab.f90 @@ -13,12 +13,12 @@ Subroutine aero_nuc_tab_nh42so4 (rrv,rrvlsair,eps1,eps2,wtw1,wtw2,wtcon1,wtcon2 real :: mult1,mult2,nucss1,nucss2,nucss,rrv,rrvlsair !Saleeby (6/3/02) -!The following tables are percent of prescibed CCN to activate. +!The following tables are percent of prescibed aerosols to activate. !Table dimensions are: ! (median radius,updraft,concentration,temperature,solubility). -!Large aerosols or GCCN number are prescibed by the user and these +!Large aerosols (rg>0.96microns) are prescibed by the user and these !automatically nucleate and they have no lookup tables. -!Small aerosols or CCN with median radius from 0.01 - 0.96 microns +!Small aerosols with median radius from 0.01 - 0.96 microns !are user prescribed in concentration from 1 - 10,000 /mg. !Median radius is in centimeters as is the parcel model. @@ -7193,12 +7193,12 @@ Subroutine aero_nuc_tab_nacl (rrv,rrvlsair,eps1,eps2,wtw1,wtw2,wtcon1,wtcon2 & real :: mult1,mult2,nucss1,nucss2,nucss,rrv,rrvlsair !Saleeby (6/3/02) -!The following tables are percent of prescibed CCN to activate. +!The following tables are percent of prescibed aerosols to activate. !Table dimensions are: ! (median radius,updraft,concentration,temperature,solubility). -!Large aerosols or GCCN number are prescibed by the user and these +!Large aerosols are prescibed by the user and these !automatically nucleate and they have no lookup tables. -!Small aerosols or CCN with median radius from 0.01 - 0.96 microns +!Small aerosols with median radius from 0.01 - 0.96 microns !are user prescribed in concentration from 1 - 10,000 /mg. !Median radius is in centimeters as is the parcel model. diff --git a/src/6.3.02/micro/mic_tabs.f90 b/src/micro/mic_tabs.f90 similarity index 100% rename from src/6.3.02/micro/mic_tabs.f90 rename to src/micro/mic_tabs.f90 diff --git a/src/6.3.02/micro/mic_vap.f90 b/src/micro/mic_vap.f90 similarity index 93% rename from src/6.3.02/micro/mic_vap.f90 rename to src/micro/mic_vap.f90 index 4412ebe..829954c 100644 --- a/src/6.3.02/micro/mic_vap.f90 +++ b/src/micro/mic_vap.f90 @@ -339,14 +339,22 @@ Subroutine vapflux (m1,lcat,k1,k2,rv,i,j) endif endif - !Vapor deposition and evaporation budgets for all species + !Vapor deposition and evaporation budgets for all species. + !Deposition, condensation, evaporation, sublimation are all given positive + ! values as process rates. if(imbudget >= 1) then - if(lcat.eq.1 .or. lcat.eq.2 .or. lcat.eq.8) & - xvapliqt(k) = xvapliqt(k) + vap(k,lcat)*budget_scalet - if(lcat.ge.3 .and. lcat.le.7) & - xvapicet(k) = xvapicet(k) + vap(k,lcat)*budget_scalet + if(lcat.eq.1 .or. lcat.eq.2 .or. lcat.eq.8) then + if(vap(k,lcat) > 0.00) xvapliqt(k) = xvapliqt(k) + vap(k,lcat)*budget_scalet + if(vap(k,lcat) < 0.00) xevapliqt(k) = xevapliqt(k) - vap(k,lcat)*budget_scalet + endif + if(lcat.ge.3 .and. lcat.le.7) then + if(vap(k,lcat) > 0.00) xvapicet(k) = xvapicet(k) + vap(k,lcat)*budget_scalet + if(vap(k,lcat) < 0.00) xevapicet(k) = xevapicet(k) - vap(k,lcat)*budget_scalet + endif endif + if(imbudget >= 2) then + if(vap(k,lcat) > 0.00) then if(lcat==1) xvapcldt(k) = xvapcldt(k) + vap(k,lcat)*budget_scalet if(lcat==2) xvapraint(k) = xvapraint(k) + vap(k,lcat)*budget_scalet if(lcat==3) xvapprist(k) = xvapprist(k) + vap(k,lcat)*budget_scalet @@ -355,6 +363,17 @@ Subroutine vapflux (m1,lcat,k1,k2,rv,i,j) if(lcat==6) xvapgraut(k) = xvapgraut(k) + vap(k,lcat)*budget_scalet if(lcat==7) xvaphailt(k) = xvaphailt(k) + vap(k,lcat)*budget_scalet if(lcat==8) xvapdrizt(k) = xvapdrizt(k) + vap(k,lcat)*budget_scalet + endif + if(vap(k,lcat) < 0.00) then + if(lcat==1) xevapcldt(k) = xevapcldt(k) - vap(k,lcat)*budget_scalet + if(lcat==2) xevapraint(k) = xevapraint(k) - vap(k,lcat)*budget_scalet + if(lcat==3) xevapprist(k) = xevapprist(k) - vap(k,lcat)*budget_scalet + if(lcat==4) xevapsnowt(k) = xevapsnowt(k) - vap(k,lcat)*budget_scalet + if(lcat==5) xevapaggrt(k) = xevapaggrt(k) - vap(k,lcat)*budget_scalet + if(lcat==6) xevapgraut(k) = xevapgraut(k) - vap(k,lcat)*budget_scalet + if(lcat==7) xevaphailt(k) = xevaphailt(k) - vap(k,lcat)*budget_scalet + if(lcat==8) xevapdrizt(k) = xevapdrizt(k) - vap(k,lcat)*budget_scalet + endif endif 229 continue diff --git a/src/6.3.02/micro/micphys.f90 b/src/micro/micphys.f90 similarity index 95% rename from src/6.3.02/micro/micphys.f90 rename to src/micro/micphys.f90 index 98c9718..c7accd8 100644 --- a/src/6.3.02/micro/micphys.f90 +++ b/src/micro/micphys.f90 @@ -19,7 +19,7 @@ Module micphys ,nembc=20 real, parameter :: dtc=1.,ddnc=2.e-6 ,dthz=1.,drhhz=.02 real, parameter :: budget_scalet=1. -real, parameter :: rxmin=1.e-9,cxmin=1.e-3 +real, parameter :: rxmin=1.e-16,cxmin=1.e-5 !IDIFFPERTS !0=normal scalar diffusion @@ -104,13 +104,16 @@ Module micphys !******Variables Needed for COMPUTING BUDGETS ****************************** !For imbudget>=1 real, dimension(nzpmax) :: xlatheatvap,xlatheatfrz,xnuccldrt,xcld2raint & -,xice2raint,xnucicert,xvapliqt,xvapicet,xmelticet,xrimecldt,xaggregatet & +,xice2raint,xnucicert,xvapliqt,xvapicet,xevapliqt,xevapicet & +,xmelticet,xrimecldt,xaggregatet,xfreezingt,xmeltingt & ,xrain2icet,xlatheatvapt,xlatheatfrzt !For imbudget>=2 real, dimension(nzpmax) :: xinuchomrt,xinuccontrt,xinucifnrt,xinuchazrt & ,xvapcldt,xvapraint,xvapprist,xvapsnowt,xvapaggrt,xvapgraut,xvaphailt & -,xvapdrizt,xmeltprist,xmeltsnowt,xmeltaggrt,xmeltgraut,xmelthailt & +,xvapdrizt,xevapcldt,xevapraint,xevapprist,xevapsnowt,xevapaggrt & +,xevapgraut,xevaphailt,xevapdrizt & +,xmeltprist,xmeltsnowt,xmeltaggrt,xmeltgraut,xmelthailt & ,xrimecldsnowt,xrimecldaggrt,xrimecldgraut,xrimecldhailt,xrain2prt & ,xrain2snt,xrain2agt,xrain2grt,xrain2hat,xaggrselfprist & ,xaggrselfsnowt,xaggrprissnowt @@ -128,7 +131,7 @@ Module micphys !******Variables Needed for CCN nucleation and restore ********************* integer :: iccnlev,ic,rgb -real :: cin_max,ccn_max,gccn_max,dust1_max,dust2_max,saltf_max,saltj_max & +real :: cin_max,ccn1_max,ccn2_max,dust1_max,dust2_max,saltf_max,saltj_max & ,salts_max,enxferratio,rxferratio,ccnmass,ccnnum,rxtemp,cxtemp,fracmass & ,cxloss,concen_nuc,aeromass,rg,rhosol,cldrat,epsil,ant,rcm,rmlar,rmsma & ,power,scnmass,dcnmass,dinmass,abc1_max,abc2_max @@ -163,8 +166,8 @@ Module micphys !Make sure you change both if you alter number of species !Each category can have the soluble component be either !Ammonium sulfate (NH4-2SO4) or Sodium chloride (NaCl) -! 1 = Sub-micron CCN -! 2 = Super-micron GCCN +! 1 = CCN mode 1 +! 2 = CCN mode 2 ! 3 = Small mode mineral dust (soluble coating) ! 4 = Large mode mineral dust (soluble coating) ! 5 = Film mode sea salt @@ -194,8 +197,8 @@ Module micphys !tables with parcel model runs using a new sigma. The median radii bins !in nucleation and pre_nucleation routines (rg, rmsma, rmlar) are also !specifically set for sigma=1.8. These would need to be updated as well. -data aero_sigma / 1.80 & !CCN - ,1.80 & !GCCN +data aero_sigma / 1.80 & !CCN mode 1 + ,1.80 & !CCN mode 2 ,1.80 & !small mineral dust ,1.80 & !large mineral dust ,1.80 & !salt film mode @@ -208,8 +211,8 @@ Module micphys !Set the relationship between median radius and mean mass radius !based on aerosol distribution spectral width !exp(1.5 * (alog(sigma))**2) -data aero_rg2rm / 1.6791 & !CCN - ,1.6791 & !GCCN +data aero_rg2rm / 1.6791 & !CCN mode 1 + ,1.6791 & !CCN mode 2 ,1.6791 & !small mineral dust ,1.6791 & !large mineral dust ,1.6791 & !salt film mode diff --git a/src/6.3.02/micro/write_scm.f90 b/src/micro/write_scm.f90 similarity index 92% rename from src/6.3.02/micro/write_scm.f90 rename to src/micro/write_scm.f90 index 459e6bf..33fb26d 100644 --- a/src/6.3.02/micro/write_scm.f90 +++ b/src/micro/write_scm.f90 @@ -128,7 +128,7 @@ Subroutine readwrite_scm (wf,fln) CALL iofil ('dn0.txt' ,basic_g(ng)%dn0 (:,i,j),m1,wf,fln) CALL iofil ('pi0.txt' ,basic_g(ng)%pi0 (:,i,j),m1,wf,fln) -if(iswrtyp == 3 .or. ilwrtyp == 3) then +if(iswrtyp >= 3 .or. ilwrtyp >= 3) then CALL iofil ('fthrd.txt' ,radiate_g(ng)%fthrd (:,i,j),m1,wf,fln) CALL iofil ('fthrdp.txt' ,radiate_g(ng)%fthrdp (:,i,j),m1,wf,fln) CALL iofil ('bext.txt' ,radiate_g(ng)%bext (:,i,j),m1,wf,fln) @@ -145,10 +145,10 @@ Subroutine readwrite_scm (wf,fln) endif if(iaerosol > 0) then - CALL iofil ('cccnp.txt',micro_g(ng)%cccnp(:,i,j),m1,wf,fln) - CALL iofil ('cccmp.txt',micro_g(ng)%cccmp(:,i,j),m1,wf,fln) - CALL iofil ('gccnp.txt',micro_g(ng)%gccnp(:,i,j),m1,wf,fln) - CALL iofil ('gccmp.txt',micro_g(ng)%gccmp(:,i,j),m1,wf,fln) + CALL iofil ('cn1np.txt',micro_g(ng)%cn1np(:,i,j),m1,wf,fln) + CALL iofil ('cn1mp.txt',micro_g(ng)%cn1mp(:,i,j),m1,wf,fln) + CALL iofil ('cn2np.txt',micro_g(ng)%cn2np(:,i,j),m1,wf,fln) + CALL iofil ('cn2mp.txt',micro_g(ng)%cn2mp(:,i,j),m1,wf,fln) endif if(idust > 0) then @@ -295,7 +295,7 @@ Subroutine readwrite_scm (wf,fln) if(jnmb(8)>=5) CALL iofil ('immerdp.txt',micro_g(ng)%immerdp(:,i,j),m1,wf,fln) if(jnmb(2)>=5) CALL iofil ('immerrp.txt',micro_g(ng)%immerrp(:,i,j),m1,wf,fln) endif - if(imbudget>=1) then !14 + if(imbudget>=1) then !18 CALL iofil ('latheatvap.txt' ,micro_g(ng)%latheatvap (:,i,j),m1,wf,fln) CALL iofil ('latheatfrz.txt' ,micro_g(ng)%latheatfrz (:,i,j),m1,wf,fln) CALL iofil ('nuccldrt.txt' ,micro_g(ng)%nuccldrt (:,i,j),m1,wf,fln) @@ -304,6 +304,10 @@ Subroutine readwrite_scm (wf,fln) CALL iofil ('nucicert.txt' ,micro_g(ng)%nucicert (:,i,j),m1,wf,fln) CALL iofil ('vapliqt.txt' ,micro_g(ng)%vapliqt (:,i,j),m1,wf,fln) CALL iofil ('vapicet.txt' ,micro_g(ng)%vapicet (:,i,j),m1,wf,fln) + CALL iofil ('evapliqt.txt' ,micro_g(ng)%evapliqt (:,i,j),m1,wf,fln) + CALL iofil ('evapicet.txt' ,micro_g(ng)%evapicet (:,i,j),m1,wf,fln) + CALL iofil ('freezingt.txt' ,micro_g(ng)%freezingt (:,i,j),m1,wf,fln) + CALL iofil ('meltingt.txt' ,micro_g(ng)%meltingt (:,i,j),m1,wf,fln) CALL iofil ('melticet.txt' ,micro_g(ng)%melticet (:,i,j),m1,wf,fln) CALL iofil ('rimecldt.txt' ,micro_g(ng)%rimecldt (:,i,j),m1,wf,fln) CALL iofil ('rain2icet.txt' ,micro_g(ng)%rain2icet (:,i,j),m1,wf,fln) @@ -311,7 +315,7 @@ Subroutine readwrite_scm (wf,fln) CALL iofil ('latheatvapt.txt',micro_g(ng)%latheatvapt(:,i,j),m1,wf,fln) CALL iofil ('latheatfrzt.txt',micro_g(ng)%latheatfrzt(:,i,j),m1,wf,fln) endif - if(imbudget>=2) then !29 + if(imbudget>=2) then !37 CALL iofil ('inuchomrt.txt' ,micro_g(ng)%inuchomrt (:,i,j),m1,wf,fln) CALL iofil ('inuccontrt.txt' ,micro_g(ng)%inuccontrt (:,i,j),m1,wf,fln) CALL iofil ('inucifnrt.txt' ,micro_g(ng)%inucifnrt (:,i,j),m1,wf,fln) @@ -324,6 +328,14 @@ Subroutine readwrite_scm (wf,fln) CALL iofil ('vapgraut.txt' ,micro_g(ng)%vapgraut (:,i,j),m1,wf,fln) CALL iofil ('vaphailt.txt' ,micro_g(ng)%vaphailt (:,i,j),m1,wf,fln) CALL iofil ('vapdrizt.txt' ,micro_g(ng)%vapdrizt (:,i,j),m1,wf,fln) + CALL iofil ('evapcldt.txt' ,micro_g(ng)%evapcldt (:,i,j),m1,wf,fln) + CALL iofil ('evapraint.txt' ,micro_g(ng)%evapraint (:,i,j),m1,wf,fln) + CALL iofil ('evapprist.txt' ,micro_g(ng)%evapprist (:,i,j),m1,wf,fln) + CALL iofil ('evapsnowt.txt' ,micro_g(ng)%evapsnowt (:,i,j),m1,wf,fln) + CALL iofil ('evapaggrt.txt' ,micro_g(ng)%evapaggrt (:,i,j),m1,wf,fln) + CALL iofil ('evapgraut.txt' ,micro_g(ng)%evapgraut (:,i,j),m1,wf,fln) + CALL iofil ('evaphailt.txt' ,micro_g(ng)%evaphailt (:,i,j),m1,wf,fln) + CALL iofil ('evapdrizt.txt' ,micro_g(ng)%evapdrizt (:,i,j),m1,wf,fln) CALL iofil ('meltprist.txt' ,micro_g(ng)%meltprist (:,i,j),m1,wf,fln) CALL iofil ('meltsnowt.txt' ,micro_g(ng)%meltsnowt (:,i,j),m1,wf,fln) CALL iofil ('meltaggrt.txt' ,micro_g(ng)%meltaggrt (:,i,j),m1,wf,fln) diff --git a/src/6.3.02/micro_bin/micro_prm.f90 b/src/micro_bin/micro_prm.f90 similarity index 100% rename from src/6.3.02/micro_bin/micro_prm.f90 rename to src/micro_bin/micro_prm.f90 diff --git a/src/6.3.02/micro_bin/microphysics.f90 b/src/micro_bin/microphysics.f90 similarity index 99% rename from src/6.3.02/micro_bin/microphysics.f90 rename to src/micro_bin/microphysics.f90 index 284df0f..868f6d1 100644 --- a/src/6.3.02/micro_bin/microphysics.f90 +++ b/src/micro_bin/microphysics.f90 @@ -44,7 +44,7 @@ Subroutine micro_proc () use mem_micro use rconstants use micro_prm -use micphys, only: imbudget,ipris,igraup,ihail,ccn_max +use micphys, only: imbudget,ipris,igraup,ihail,ccn1_max IMPLICIT NONE @@ -77,7 +77,7 @@ Subroutine micro_proc () integer itimestep, kr, ikl do kr=1,nkr - fccn0(kr) =FCCNR0(KR)*1000.*xccn(kr)*ccn_max + fccn0(kr) =FCCNR0(KR)*1000.*xccn(kr)*ccn1_max enddo @@ -455,7 +455,7 @@ Subroutine micro_init (bininit) use micro_prm use mem_micro use mem_grid -use micphys, only:ccn_max,cin_max,iaero_chem,aero_medrad,iifn +use micphys, only:ccn1_max,cin_max,iaero_chem,aero_medrad,iifn use module_hujisbm IMPLICIT NONE @@ -547,23 +547,23 @@ Subroutine micro_init (bininit) ! Initialize arrays for the initial run. Do not run this for history restart. if(bininit==1) then -!Factor of 1000 is to convert to CGS units. ccn_max is #/mg +!Factor of 1000 is to convert to CGS units. ccn1_max is #/mg DO k=1,mzp DO i=1,mxp DO j=1,myp DO KR=1,NKR IF (k<=2) THEN - micro_g(ngrid)%fncn(k,i,j,KR)=FCCNR0(KR)*1000.*xccn(kr)*ccn_max + micro_g(ngrid)%fncn(k,i,j,KR)=FCCNR0(KR)*1000.*xccn(kr)*ccn1_max ELSE micro_g(ngrid)%fncn(k,i,j,KR)=FCCNR0(KR)*1000.*xccn(kr)* & - ccn_max*exp(-zt(k)/7000.) + ccn1_max*exp(-zt(k)/7000.) ENDIF ENDDO ENDDO END DO END DO if (iceprocs == 1 .and. iifn == 2) then - fracin = cin_max/ccn_max + fracin = cin_max/ccn1_max micro_g(ngrid)%ffin=micro_g(ngrid)%fncn*fracin endif endif diff --git a/src/6.3.02/micro_bin/module_hujisbm.f90 b/src/micro_bin/module_hujisbm.f90 similarity index 100% rename from src/6.3.02/micro_bin/module_hujisbm.f90 rename to src/micro_bin/module_hujisbm.f90 diff --git a/src/6.3.02/mksfc/geodat.f90 b/src/mksfc/geodat.f90 similarity index 99% rename from src/6.3.02/mksfc/geodat.f90 rename to src/mksfc/geodat.f90 index 608fe25..c223fe9 100644 --- a/src/6.3.02/mksfc/geodat.f90 +++ b/src/mksfc/geodat.f90 @@ -498,11 +498,11 @@ Subroutine zoq (NIQ,NJQ,DATQ,SDQ,NGR) do jq=1,njq do iq=1,niq if(ITOPSFLG(ngr).lt.0) then ! No orography - datq(iq,jq)=zrough + datq(iq,jq)=ztrough elseif(iz0flg(ngr).eq.1) then datq(iq,jq)=min(z0fact*sdq(iq,jq),z0max(NGR)) else - datq(iq,jq)=zrough + datq(iq,jq)=ztrough endif enddo enddo diff --git a/src/6.3.02/mksfc/landuse_input.f90 b/src/mksfc/landuse_input.f90 similarity index 100% rename from src/6.3.02/mksfc/landuse_input.f90 rename to src/mksfc/landuse_input.f90 diff --git a/src/6.3.02/mksfc/mksfc_driver.f90 b/src/mksfc/mksfc_driver.f90 similarity index 90% rename from src/6.3.02/mksfc/mksfc_driver.f90 rename to src/mksfc/mksfc_driver.f90 index 10419fa..8768a5f 100644 --- a/src/6.3.02/mksfc/mksfc_driver.f90 +++ b/src/mksfc/mksfc_driver.f90 @@ -7,6 +7,7 @@ Subroutine make_sfcfiles () use mem_grid use io_params use node_mod +use mem_leaf, only:isfcl implicit none @@ -51,11 +52,16 @@ Subroutine make_sfcfiles () if (trim(runtype) == 'MAKESFC') then - print*, 'MAKESFC run: Making all surface, topo, sst, and ndvi files.' - itoperr = 1 - isfcerr = 1 - issterr = 1 - indvierr = 1 + if (isfcl .ne. 3) then + print*, 'MAKESFC run: Making all surface, topo, sst, and ndvi files.' + itoperr = 1 + isfcerr = 1 + issterr = 1 + indvierr = 1 + else + print*,'MAKESFC run: Making topo file.' + itoperr = 1 + endif ng1=1 ; ng2 =ngrids ! sst,ndvi grid bounds ng1t=1 ; ng2t=ngrids ! topo grid bounds @@ -66,28 +72,30 @@ Subroutine make_sfcfiles () .or. trim(runtype) == 'HISTORY' & .or. trim(runtype) == 'ERROR') then - ! Check sfc files - do ifm = 1,ngrids - CALL sfc_check (ifm,isfcerr) - if(isfcerr == 1) exit - enddo - ! Check topo files do ifm = 1,ngrids CALL top_check (ifm,itoperr) if(itoperr == 1) exit enddo - ! Check sst files - CALL sst_read (2,ifm,issterr) + if (isfcl .ne. 3) then + ! Check sfc files + do ifm = 1,ngrids + CALL sfc_check (ifm,isfcerr) + if(isfcerr == 1) exit + enddo + + ! Check sst files + CALL sst_read (2,ifm,issterr) - ! Check ndvi files - CALL ndvi_read (2,ifm,indvierr) + ! Check ndvi files + CALL ndvi_read (2,ifm,indvierr) - ! If we are making ndvi files, we must also make the sfc files (and vice versa) - if(indvierr == 1) isfcerr = 1 - if(isfcerr == 1) indvierr = 1 + ! If we are making ndvi files, we must also make the sfc files (and vice versa) + if(indvierr == 1) isfcerr = 1 + if(isfcerr == 1) indvierr = 1 + endif if (isfcerr==0 .and. issterr==0 .and. & itoperr==0 .and.indvierr==0) then print*, 'Surface, topo, sst, and ndvi files all ok for' diff --git a/src/6.3.02/mksfc/mksfc_ndvi.f90 b/src/mksfc/mksfc_ndvi.f90 similarity index 99% rename from src/6.3.02/mksfc/mksfc_ndvi.f90 rename to src/mksfc/mksfc_ndvi.f90 index cb65ca9..25a9230 100644 --- a/src/6.3.02/mksfc/mksfc_ndvi.f90 +++ b/src/mksfc/mksfc_ndvi.f90 @@ -58,7 +58,7 @@ Subroutine ndvi_read_dataheader (ifm) ! read prefix list and times do itime = 1,nvndvif(ifm) - read(25,'(A80)') line + read(25,'(A256)') line CALL char_strip_var (line,flnm,line2) read (line2,*) iyearvn(itime,ifm),imonthvn(itime,ifm) & ,idatevn(itime,ifm),ihourvn(itime,ifm) diff --git a/src/6.3.02/mksfc/mksfc_sfc.f90 b/src/mksfc/mksfc_sfc.f90 similarity index 100% rename from src/6.3.02/mksfc/mksfc_sfc.f90 rename to src/mksfc/mksfc_sfc.f90 diff --git a/src/6.3.02/mksfc/mksfc_sst.f90 b/src/mksfc/mksfc_sst.f90 similarity index 99% rename from src/6.3.02/mksfc/mksfc_sst.f90 rename to src/mksfc/mksfc_sst.f90 index 2b1076b..7e4a035 100644 --- a/src/6.3.02/mksfc/mksfc_sst.f90 +++ b/src/mksfc/mksfc_sst.f90 @@ -63,7 +63,7 @@ Subroutine sst_read_dataheader (ifm) nvsstf(ifm)=0 do itime = 1,nsst - read(25,'(A80)') line + read(25,'(A256)') line CALL char_strip_var (line,flnm,line2) read (line2,*) issty,isstm,isstd,issth diff --git a/src/6.3.02/mksfc/mksfc_top.f90 b/src/mksfc/mksfc_top.f90 similarity index 100% rename from src/6.3.02/mksfc/mksfc_top.f90 rename to src/mksfc/mksfc_top.f90 diff --git a/src/6.3.02/mksfc/ndvi_read.f90 b/src/mksfc/ndvi_read.f90 similarity index 100% rename from src/6.3.02/mksfc/ndvi_read.f90 rename to src/mksfc/ndvi_read.f90 diff --git a/src/6.3.02/mksfc/nest_geosst.f90 b/src/mksfc/nest_geosst.f90 similarity index 98% rename from src/6.3.02/mksfc/nest_geosst.f90 rename to src/mksfc/nest_geosst.f90 index 3b8abf5..713a169 100644 --- a/src/6.3.02/mksfc/nest_geosst.f90 +++ b/src/mksfc/nest_geosst.f90 @@ -257,7 +257,8 @@ Subroutine geonest_nofile (ngra,ngrb) ,leaf_g(ifm)%veg_height (1,1,1) & ,leaf_g(ifm)%veg_albedo (1,1,1) & ,leaf_g(ifm)%patch_area (1,1,1) & - ,leaf_g(ifm)%patch_rough (1,1,1) & + ,leaf_g(ifm)%patch_rought (1,1,1) & + ,leaf_g(ifm)%patch_roughm (1,1,1) & ,leaf_g(ifm)%leaf_class (1,1,1) & ,leaf_g(ifm)%soil_rough (1,1,1) & ,leaf_g(ifm)%sfcwater_nlev (1,1,1) & @@ -411,7 +412,8 @@ Subroutine geonest_nofile (ngra,ngrb) ,leaf_g(ifm)%veg_height (1,1,1) & ,leaf_g(ifm)%veg_albedo (1,1,1) & ,leaf_g(ifm)%patch_area (1,1,1) & - ,leaf_g(ifm)%patch_rough (1,1,1) & + ,leaf_g(ifm)%patch_rought (1,1,1) & + ,leaf_g(ifm)%patch_roughm (1,1,1) & ,leaf_g(ifm)%leaf_class (1,1,1) & ,leaf_g(ifm)%soil_rough (1,1,1) & ,leaf_g(ifm)%sfcwater_nlev (1,1,1) & diff --git a/src/6.3.02/mksfc/sst_read.f90 b/src/mksfc/sst_read.f90 similarity index 100% rename from src/6.3.02/mksfc/sst_read.f90 rename to src/mksfc/sst_read.f90 diff --git a/src/6.3.02/mpi/mpass_cyclic.f90 b/src/mpi/mpass_cyclic.f90 similarity index 100% rename from src/6.3.02/mpi/mpass_cyclic.f90 rename to src/mpi/mpass_cyclic.f90 diff --git a/src/6.3.02/mpi/mpass_dtl.f90 b/src/mpi/mpass_dtl.f90 similarity index 100% rename from src/6.3.02/mpi/mpass_dtl.f90 rename to src/mpi/mpass_dtl.f90 diff --git a/src/6.3.02/mpi/mpass_init.f90 b/src/mpi/mpass_init.f90 similarity index 92% rename from src/6.3.02/mpi/mpass_init.f90 rename to src/mpi/mpass_init.f90 index 56e779c..e4cddd2 100644 --- a/src/6.3.02/mpi/mpass_init.f90 +++ b/src/mpi/mpass_init.f90 @@ -19,7 +19,7 @@ Subroutine broadcast_config () use mem_all use isan_coms use node_mod -use leaf_coms, only:ifreeslip +use leaf_coms, only:ifreeslip, icharnock implicit none @@ -29,10 +29,10 @@ Subroutine broadcast_config () !Saleeby(2016) !Increment memory buffer size here if you add RAMSIN Namelist variables. !Add to the appropriate section below as (#-of-them * arraysize). - nwords = 219 * 1 & !single values + nwords = 224 * 1 & !single values + 1 * 8 & !micro (8-hydromet types for gnu) + 3 * aerocat & !micro (number aerosol species) - + 42 * maxgrds & !grid-dependent (max grids) + + 44 * maxgrds & !grid-dependent (max grids) + 3 * nzpmax & !max vertical levels + 3 * nzgmax & !max soil levels + 1 * maxisn & !max isentropic levels @@ -40,7 +40,7 @@ Subroutine broadcast_config () + 6 * maxsndg & !max input sounding levels + 2 * 32 & !32 character length strings + 1 * maxlite * 32 & !lite variables 32 char length strings - + 17 * 1 * strl1 & !individual input strings + + 18 * 1 * strl1 & !individual input strings + 1 * 50 * strl1 & !array of input strings + 5 * maxgrds * strl1 & !grid-dependent array of input strings + 100 !extras so we have enough buffer @@ -84,6 +84,7 @@ Subroutine broadcast_config () CALL par_put_float (DELTAX,1) CALL par_put_float (DELTAZ,1) CALL par_put_float (DZRAT,1) + CALL par_put_float (ZDELAY,1) CALL par_put_float (DZMAX,1) CALL par_put_float (ZZ,NZPMAX) CALL par_put_float (DTLONG,1) @@ -188,8 +189,12 @@ Subroutine broadcast_config () ! $MODEL_OPTIONS namelist group CALL par_put_int (ICORFLG,1) + CALL par_put_int (IUGFORCE,1) + CALL par_put_float (DIVLS,1) CALL par_put_int (IBND,1) CALL par_put_int (JBND,1) + CALL par_put_int (ISPONGE_PTS,MAXGRDS) + CALL par_put_float (SPONGE_TAU,MAXGRDS) CALL par_put_float (CPHAS,1) CALL par_put_int (LSFLG,1) CALL par_put_int (NFPT,1) @@ -223,7 +228,9 @@ Subroutine broadcast_config () CALL par_put_int (NVGCON,1) CALL par_put_float (PCTLCON,1) CALL par_put_int (NSLCON,1) - CALL par_put_float (ZROUGH,1) + CALL par_put_float (ZTROUGH,1) + CALL par_put_float (ZMROUGH,1) + CALL par_put_int (ICHARNOCK,1) CALL par_put_float (ALBEDO,1) CALL par_put_float (SEATMP,1) CALL par_put_float (DTHCON,1) @@ -313,8 +320,8 @@ Subroutine broadcast_config () CALL par_put_int (IAEROPRNT,1) CALL par_put_int (IAEROHIST,1) CALL par_put_float (CIN_MAX,1) - CALL par_put_float (CCN_MAX,1) - CALL par_put_float (GCCN_MAX,1) + CALL par_put_float (CCN1_MAX,1) + CALL par_put_float (CCN2_MAX,1) CALL par_put_float (DUST1_MAX,1) CALL par_put_float (DUST2_MAX,1) CALL par_put_float (SALTF_MAX,1) @@ -338,12 +345,15 @@ Subroutine broadcast_config () CALL par_put_int (ITSFLG,1) CALL par_put_int (IRTSFLG,1) CALL par_put_int (IUSFLG,1) + CALL par_put_int (IO3FLG,1) CALL par_put_float (HS,MAXSNDG) CALL par_put_float (PS,MAXSNDG) CALL par_put_float (TS,MAXSNDG) CALL par_put_float (RTS,MAXSNDG) CALL par_put_float (US,MAXSNDG) CALL par_put_float (VS,MAXSNDG) + CALL par_put_float (O3S,MAXSNDG) + CALL par_put_char (SOUND_FILE,strl1) ! $ISAN_CONTROL namelist group CALL par_put_int (ISZSTAGE,1) @@ -417,6 +427,7 @@ Subroutine broadcast_config () CALL par_get_float (DELTAX,1) CALL par_get_float (DELTAZ,1) CALL par_get_float (DZRAT,1) + CALL par_get_float (ZDELAY,1) CALL par_get_float (DZMAX,1) CALL par_get_float (ZZ,NZPMAX) CALL par_get_float (DTLONG,1) @@ -520,8 +531,12 @@ Subroutine broadcast_config () ! $MODEL_OPTIONS namelist group CALL par_get_int (ICORFLG,1) + CALL par_get_int (IUGFORCE,1) + CALL par_get_float (DIVLS,1) CALL par_get_int (IBND,1) CALL par_get_int (JBND,1) + CALL par_get_int (ISPONGE_PTS,MAXGRDS) + CALL par_get_float (SPONGE_TAU,MAXGRDS) CALL par_get_float (CPHAS,1) CALL par_get_int (LSFLG,1) CALL par_get_int (NFPT,1) @@ -555,7 +570,9 @@ Subroutine broadcast_config () CALL par_get_int (NVGCON,1) CALL par_get_float (PCTLCON,1) CALL par_get_int (NSLCON,1) - CALL par_get_float (ZROUGH,1) + CALL par_get_float (ZTROUGH,1) + CALL par_get_float (ZMROUGH,1) + CALL par_get_int (ICHARNOCK,1) CALL par_get_float (ALBEDO,1) CALL par_get_float (SEATMP,1) CALL par_get_float (DTHCON,1) @@ -645,8 +662,8 @@ Subroutine broadcast_config () CALL par_get_int (IAEROPRNT,1) CALL par_get_int (IAEROHIST,1) CALL par_get_float (CIN_MAX,1) - CALL par_get_float (CCN_MAX,1) - CALL par_get_float (GCCN_MAX,1) + CALL par_get_float (CCN1_MAX,1) + CALL par_get_float (CCN2_MAX,1) CALL par_get_float (DUST1_MAX,1) CALL par_get_float (DUST2_MAX,1) CALL par_get_float (SALTF_MAX,1) @@ -670,12 +687,15 @@ Subroutine broadcast_config () CALL par_get_int (ITSFLG,1) CALL par_get_int (IRTSFLG,1) CALL par_get_int (IUSFLG,1) + CALL par_get_int (IO3FLG,1) CALL par_get_float (HS,MAXSNDG) CALL par_get_float (PS,MAXSNDG) CALL par_get_float (TS,MAXSNDG) CALL par_get_float (RTS,MAXSNDG) CALL par_get_float (US,MAXSNDG) CALL par_get_float (VS,MAXSNDG) + CALL par_get_float (O3S,MAXSNDG) + CALL par_get_char (SOUND_FILE,strl1) ! $ISAN_CONTROL namelist group CALL par_get_int (ISZSTAGE,1) @@ -1028,7 +1048,7 @@ Subroutine broadcast_hist_header (ngrids1,nnxp1,nnyp1,nnzp1,nzg1 & !Saleeby(2018): Increment "nwords" buffer if added "par_put" and !"par_get" calls below. - nwords = 17 + ((3 + (6 * nzpmax)) * maxgrds) + (6 * maxsndg) & + nwords = 17 + ((3 + (6 * nzpmax)) * maxgrds) + (8 * maxsndg) & + (maxvars * atable_elem_words) ! note that what got allocated was nwords*sizeof(real) bytes @@ -1072,10 +1092,13 @@ Subroutine broadcast_hist_header (ngrids1,nnxp1,nnyp1,nnzp1,nzg1 & CALL par_put_float (vs,maxsndg) CALL par_put_float (ts,maxsndg) CALL par_put_float (thds,maxsndg) + CALL par_put_float (rts,maxsndg) CALL par_put_float (ps,maxsndg) CALL par_put_float (hs,maxsndg) + CALL par_put_float (o3s,maxsndg) ! 1-D reference state for all grids + CALL par_put_float (wsub,nzpmax*maxgrds) CALL par_put_float (u01dn,nzpmax*maxgrds) CALL par_put_float (v01dn,nzpmax*maxgrds) CALL par_put_float (pi01dn,nzpmax*maxgrds) @@ -1120,10 +1143,13 @@ Subroutine broadcast_hist_header (ngrids1,nnxp1,nnyp1,nnzp1,nzg1 & CALL par_get_float (vs,maxsndg) CALL par_get_float (ts,maxsndg) CALL par_get_float (thds,maxsndg) + CALL par_get_float (rts,maxsndg) CALL par_get_float (ps,maxsndg) CALL par_get_float (hs,maxsndg) + CALL par_get_float (o3s,maxsndg) ! 1-D reference state for all grids + CALL par_get_float (wsub,nzpmax*maxgrds) CALL par_get_float (u01dn,nzpmax*maxgrds) CALL par_get_float (v01dn,nzpmax*maxgrds) CALL par_get_float (pi01dn,nzpmax*maxgrds) @@ -1421,3 +1447,90 @@ Subroutine broadcast_dustsource (source,nx_source,ny_source) return END SUBROUTINE broadcast_dustsource +!########################################################################## +Subroutine broadcast_forcing_dims (n1,n2) + +use node_mod + +implicit none + + real, allocatable :: buff(:) + integer :: nwords,n1,n2 + + nwords = 50 + allocate (buff(nwords)) ! note that what got allocated was nwords*sizeof(real) bytes + + ! The mainnum process will send data, all others will receive in the broadcast + ! + ! Therefore, the algorithm is: + ! For mainnum + ! pack buffer + ! broadcast buffer to other processes + ! For the other processes + ! receive buffer from mainnum + ! unpack buffer + if (my_rams_num .eq. mainnum) then + ! sending node: pack data into the buffer, then send + CALL par_init_put (buff,nwords) + + ! forcing data + CALL par_put_int (n1,1) + CALL par_put_int (n2,1) + + CALL par_broadcast (machnum(mainnum)) + else + ! receiving nodes + CALL par_init_recv_bcast (buff,nwords) ! don't call this if you are mainnum + CALL par_broadcast (machnum(mainnum)) + + CALL par_get_int (n1,1) + CALL par_get_int (n2,1) + endif + + deallocate (buff) + +return +END SUBROUTINE broadcast_forcing_dims +!########################################################################## +Subroutine broadcast_forcing (forcdata,n1,n2) + +use node_mod + +implicit none + + real, allocatable :: buff(:) + integer :: nwords,n1,n2 + real, dimension(n1,n2) :: forcdata + + nwords = 50 + n1*n2 + allocate (buff(nwords)) ! note that what got allocated was nwords*sizeof(real) bytes + + ! The mainnum process will send data, all others will receive in the broadcast + ! + ! Therefore, the algorithm is: + ! For mainnum + ! pack buffer + ! broadcast buffer to other processes + ! For the other processes + ! receive buffer from mainnum + ! unpack buffer + if (my_rams_num .eq. mainnum) then + ! sending node: pack data into the buffer, then send + CALL par_init_put (buff,nwords) + + ! forcing data + CALL par_put_float (forcdata,n1*n2) + + CALL par_broadcast (machnum(mainnum)) + else + ! receiving nodes + CALL par_init_recv_bcast (buff,nwords) ! don't call this if you are mainnum + CALL par_broadcast (machnum(mainnum)) + + CALL par_get_float (forcdata,n1*n2) + endif + + deallocate (buff) + +return +END SUBROUTINE broadcast_forcing diff --git a/src/6.3.02/mpi/mpass_lbc.f90 b/src/mpi/mpass_lbc.f90 similarity index 100% rename from src/6.3.02/mpi/mpass_lbc.f90 rename to src/mpi/mpass_lbc.f90 diff --git a/src/6.3.02/mpi/mpass_nest.f90 b/src/mpi/mpass_nest.f90 similarity index 100% rename from src/6.3.02/mpi/mpass_nest.f90 rename to src/mpi/mpass_nest.f90 diff --git a/src/6.3.02/mpi/node_mod.f90 b/src/mpi/node_mod.f90 similarity index 100% rename from src/6.3.02/mpi/node_mod.f90 rename to src/mpi/node_mod.f90 diff --git a/src/6.3.02/mpi/par_decomp.f90 b/src/mpi/par_decomp.f90 similarity index 100% rename from src/6.3.02/mpi/par_decomp.f90 rename to src/mpi/par_decomp.f90 diff --git a/src/6.3.02/mpi/para_init.f90 b/src/mpi/para_init.f90 similarity index 100% rename from src/6.3.02/mpi/para_init.f90 rename to src/mpi/para_init.f90 diff --git a/src/6.3.02/mpi/rnode.f90 b/src/mpi/rnode.f90 similarity index 95% rename from src/6.3.02/mpi/rnode.f90 rename to src/mpi/rnode.f90 index b056e23..e606c2e 100644 --- a/src/6.3.02/mpi/rnode.f90 +++ b/src/mpi/rnode.f90 @@ -5,6 +5,7 @@ Subroutine rams_node () use node_mod use micphys, only:idiffperts,iconv use kpp_parameters, only:IKPP + use ref_sounding, only:iugforce implicit none @@ -37,6 +38,12 @@ Subroutine rams_node () CALL dtset () !---------------------------------------------------------------------------- +! Update base state winds if doing geostrophic wind forcing +!---------------------------------------------------------------------------- + if(iugforce==2)then + CALL update_base_winds() + endif +!---------------------------------------------------------------------------- ! Compute new "temporary base state" for THP and RTP for diffusing ! perturbations from the mean state at current time. !---------------------------------------------------------------------------- diff --git a/src/6.3.02/nesting/nest_drivers.f90 b/src/nesting/nest_drivers.f90 similarity index 98% rename from src/6.3.02/nesting/nest_drivers.f90 rename to src/nesting/nest_drivers.f90 index 98c3e76..9556eb1 100644 --- a/src/6.3.02/nesting/nest_drivers.f90 +++ b/src/nesting/nest_drivers.f90 @@ -21,32 +21,32 @@ Subroutine nstbdriv () ! print*, jdim,ibcon,ia,iz,ja,jz -CALL nstbtnd (mzp,mxp,myp,ia,iz,ja,jz,ibcon & +CALL nstbtnd (mzp,mxp,myp,ia,iz,ja,jz,ibcon,ngrid & ,basic_g(ngrid)%up(1,1,1),tend%ut(1) & ,nbounds(ngrid)%bux(1,1,1),nbounds(ngrid)%buy(1,1,1) & ,nbounds(ngrid)%buz(1,1,1) & ,'u',tymeinvv,nstbot,nsttop,jdim) -CALL nstbtnd (mzp,mxp,myp,ia,iz,ja,jz,ibcon & +CALL nstbtnd (mzp,mxp,myp,ia,iz,ja,jz,ibcon,ngrid & ,basic_g(ngrid)%vp(1,1,1),tend%vt(1) & ,nbounds(ngrid)%bvx(1,1,1),nbounds(ngrid)%bvy(1,1,1) & ,nbounds(ngrid)%bvz(1,1,1) & ,'v',tymeinvv,nstbot,nsttop,jdim) -CALL nstbtnd (mzp,mxp,myp,ia,iz,ja,jz,ibcon & +CALL nstbtnd (mzp,mxp,myp,ia,iz,ja,jz,ibcon,ngrid & ,basic_g(ngrid)%wp(1,1,1),tend%wt(1) & ,nbounds(ngrid)%bwx(1,1,1),nbounds(ngrid)%bwy(1,1,1) & ,nbounds(ngrid)%bwz(1,1,1) & ,'w',tymeinvv,nstbot,nsttop,jdim) -CALL nstbtnd (mzp,mxp,myp,ia,iz,ja,jz,ibcon & +CALL nstbtnd (mzp,mxp,myp,ia,iz,ja,jz,ibcon,ngrid & ,basic_g(ngrid)%pp(1,1,1),tend%pt(1) & ,nbounds(ngrid)%bpx(1,1,1),nbounds(ngrid)%bpy(1,1,1) & ,nbounds(ngrid)%bpz(1,1,1) & ,'p',tymeinvv,nstbot,nsttop,jdim) do n = 1,num_scalar(ngrid) - CALL nstbtnd (mzp,mxp,myp,ia,iz,ja,jz,ibcon & + CALL nstbtnd (mzp,mxp,myp,ia,iz,ja,jz,ibcon,ngrid & ,scalar_tab(n,ngrid)%var_p,scalar_tab(n,ngrid)%var_t & ,nbounds(ngrid)%bsx(1,1,1,n),nbounds(ngrid)%bsy(1,1,1,n) & ,nbounds(ngrid)%bsz(1,1,1,n) & diff --git a/src/6.3.02/nesting/nest_feed.f90 b/src/nesting/nest_feed.f90 similarity index 100% rename from src/6.3.02/nesting/nest_feed.f90 rename to src/nesting/nest_feed.f90 diff --git a/src/6.3.02/nesting/nest_intrp.f90 b/src/nesting/nest_intrp.f90 similarity index 77% rename from src/6.3.02/nesting/nest_intrp.f90 rename to src/nesting/nest_intrp.f90 index 1211e49..3285f70 100644 --- a/src/6.3.02/nesting/nest_intrp.f90 +++ b/src/nesting/nest_intrp.f90 @@ -1,11 +1,14 @@ !############################################################################## -Subroutine nstbtnd (m1,m2,m3,ia,iz,ja,jz,ibcon & +Subroutine nstbtnd (m1,m2,m3,ia,iz,ja,jz,ibcon,ngrid & ,scp,sct,bx,by,bz,vnam,tymeinv,nstbot,nsttop,jdim) +use node_mod, only: mi0, mj0 +use mem_grid, only: nnxp, nnyp, isponge_pts, sponge_tau + implicit none -integer :: m1,m2,m3,ia,iz,ja,jz,ibcon,nstbot,nsttop,jdim,i,j,k & - ,nzfm,nxfm,nyfm,incia,inciz,incja,incjz +integer :: m1,m2,m3,ia,iz,ja,jz,ibcon,ngrid,nstbot,nsttop,jdim & + ,i,j,k,nzfm,nxfm,nyfm,incia,inciz,incja,incjz real :: tymeinv real, dimension(m1,m2,m3) :: scp,sct real, dimension(m1,m3,2) :: bx @@ -13,6 +16,54 @@ Subroutine nstbtnd (m1,m2,m3,ia,iz,ja,jz,ibcon & real, dimension(m2,m3,2) :: bz character(len=*) :: vnam +! locally defined variables for sponge code +integer :: npts_sponge & ! user-defined number of points in the sponge zone + ! ** IMPORTANT ** code not implemented to have this + ! nudging zone distance be greater than the size of + ! the parallelized subdomain. Addressing this would + ! require MPI message passing code modifications. + ,nxpf,nypf ! total grid points on entire domain for this variable +real :: tau_sponge & ! user-defined sponge zone time scale in seconds + ,itau_spg & ! inverse sponge zone time scale + ,numer,wgttot ! for calculating weights +! 2D weights for distance from the boundary edge +real, dimension(m2,m3) :: wgtW,wgtE,wgtS,wgtN + +! ** NOTE ** Would probably be best practice to have b arrays contain more information +! through width of sponge zone, instead of nudging entire sponge zone to one boundary +! value. This becomes even more important if sponge zone width is increased beyond +! 5-10 points! However, also note that b arrays only have non-zero values for sub-domains +! containing a boundary. +! ** NOTE ** move tau_sponge and npts_sponge to namelist, make them grid-dependent + + +! set up sponge zone time scale and calculate inverse nudging timescale +tau_sponge = sponge_tau(ngrid) !30. ! s +!tau_sponge = 60. ! s ! PJM change for testing +!tau_sponge = 10. ! s ! PJM change for testing +itau_spg = 1./tau_sponge +! set up number of points in the sponge zone. Can vary for different grids +! Here, use 5 points on grid2 and 8 points on grid3 +npts_sponge = isponge_pts(ngrid) !5 +!if (ngrid .eq. 3) npts_sponge = 8 +! check that subdomain lengths are not smaller than the sponge zone width +! these are conservative estimates since they use ia/ja and iz/jz +if ( iand(ibcon,1) .ne. 0 .or. iand(ibcon,2) .ne. 0 ) then ! W or E boundary + if ( (iz-ia+1) .lt. npts_sponge ) then + stop 'In subroutine nstbtnd: subdomain x-dimension length is smaller than sponge zone' + endif +endif +if (jdim .eq. 1) then + if ( iand(ibcon,4) .ne. 0 .or. iand(ibcon,8) .ne. 0) then ! S or N boundary + if ( (jz-ja+1) .lt. npts_sponge ) then + stop 'In subroutine nstbtnd: subdomain y-dimension length is smaller than sponge zone' + endif + endif +endif + + +! set up subdomain end-grid indices: reduced by one for winds in their respective directions +! (nxfm, nyfm are no longer used with addition of sponge code) nzfm = m1 nxfm = iz + 1 nyfm = jz + 1 @@ -20,16 +71,110 @@ Subroutine nstbtnd (m1,m2,m3,ia,iz,ja,jz,ibcon & if (vnam .eq. 'u') nxfm =nxfm - 1 if (vnam .eq. 'v') nyfm =nyfm - 1 if (jdim .eq. 0) nyfm = 1 - +! Do the same for total number of points on the entire grid in x and y, for sponge zone +! weight calculations +nxpf = nnxp(ngrid) +nypf = nnyp(ngrid) +if (vnam .eq. 'u') nxpf =nxpf - 1 +if (vnam .eq. 'v') nypf =nypf - 1 +if (jdim .eq. 0) nypf = 1 + +! set up counter increments to properly account for subdomain bounds on grid edges incia = 0 inciz = 0 -if (iand(ibcon,1) .ne. 0) incia = 1 -if (iand(ibcon,2) .ne. 0 .and. vnam .ne. 'u') inciz = 1 +if (iand(ibcon,1) .ne. 0) incia = 1 ! W boundary +if (iand(ibcon,2) .ne. 0 .and. vnam .ne. 'u') inciz = 1 ! E boundary, non-normal wind incja = 0 incjz = 0 -if (iand(ibcon,4) .ne. 0) incja = jdim -if (iand(ibcon,8) .ne. 0 .and. vnam .ne. 'v') incjz = jdim - +if (iand(ibcon,4) .ne. 0) incja = jdim ! S boundary +if (iand(ibcon,8) .ne. 0 .and. vnam .ne. 'v') incjz = jdim ! N boundary, non-normal wind + + +! Set up weight array properly accounting for corners. +! Make four different weights arrays, one each for N,S,E,W, and check +! if their sum is > 1. If so, normalize each weight so they add up to 1. +! For a linear weight and 4-point nudging zone, this will look like +! the following example for the NW corner: + +! NW corner, Contributions from W nudging: +! .50 .43 .33 .20 0.0 0.0 +! .57 .50 .40 .25 0.0 0.0 +! .63 .60 .50 .25 0.0 0.0 +! .80 .75 .50 .25 0.0 0.0 +! 1.0 .75 .50 .25 0.0 0.0 +! 1.0 .75 .50 .25 0.0 0.0 + +! NW corner, Contributions from N nudging: +! .50 .57 .63 .80 1.0 1.0 +! .43 .50 .60 .75 .75 .75 +! .33 .40 .50 .50 .50 .50 +! .20 .25 .25 .25 .25 .25 +! 0.0 0.0 0.0 0.0 0.0 0.0 +! 0.0 0.0 0.0 0.0 0.0 0.0 + +! Total nudging weight: +! 1.0 1.0 1.0 1.0 1.0 1.0 +! 1.0 1.0 1.0 1.0 .75 .75 +! 1.0 1.0 1.0 .75 .50 .50 +! 1.0 1.0 .75 .25 .25 .25 +! 1.0 .75 .50 .25 0.0 0.0 +! 1.0 .75 .50 .25 0.0 0.0 + +! Cannot model weights after varfile nudging code because we don't +! have underlying structure in b's, only the boundary values. +! However, let's set this up with grid-wide indexing in case +! b's are given more underlying structure in the future. + +!set up 2D weights array - first initialize to zeros +numer=0. +wgttot=0. +do j = 1,m3 + do i = 1,m2 + wgtW(i,j) = 0. + wgtE(i,j) = 0. + wgtS(i,j) = 0. + wgtN(i,j) = 0. + enddo +enddo +! Set up quadratic weight functions +do j = 1,m3 + do i = 1,m2 + ! W boundary weight + numer = max( 0., float( npts_sponge + 1-(i+mi0(ngrid)) ) ) + wgtW(i,j) = numer*numer/float(npts_sponge*npts_sponge) + ! E boundary weight - nxpf is the total x-grid length (1-less for u) + numer = max( 0., float( npts_sponge + i+mi0(ngrid)-nxpf ) ) + wgtE(i,j) = numer*numer/float(npts_sponge*npts_sponge) + if (jdim .eq. 1) then + ! S boundary weight + numer = max( 0., float( npts_sponge + 1-(j+mj0(ngrid)) ) ) + wgtS(i,j) = numer*numer/float(npts_sponge*npts_sponge) + ! N boundary weight - nypf is the total y-grid length (1-less for v) + numer = max( 0., float( npts_sponge + j+mj0(ngrid)-nypf ) ) + wgtN(i,j) = numer*numer/float(npts_sponge*npts_sponge) + endif + ! take care of corners + wgttot = wgtW(i,j)+wgtE(i,j)+wgtS(i,j)+wgtN(i,j) + if ( wgttot .gt. 1. ) then + wgtW(i,j) = wgtW(i,j) / wgttot + wgtE(i,j) = wgtE(i,j) / wgttot + wgtS(i,j) = wgtS(i,j) / wgttot + wgtN(i,j) = wgtN(i,j) / wgttot + endif + enddo +enddo +! debugging +!if( ngrid.eq.2 .and. vnam.eq.'w') then +! if( (mi0(ngrid).eq.0) .and. (mj0(ngrid).eq.0) ) then +! print'(2a,i1,a,2i4,a)',vnam,', grid',ngrid,', (i0,j0) = (',mi0(ngrid),mj0(ngrid),'),wgtW = ' +! do j=m3,1,-1 +! write(*,'(a,a,i02,999(2x,f4.2))') vnam,'j',j+mj0(ngrid),wgtW(:,j) +! enddo +! endif +!endif + + +! bottom boundary if (nstbot .eq. 0) then do j = ja,jz do i = ia,iz @@ -37,6 +182,7 @@ Subroutine nstbtnd (m1,m2,m3,ia,iz,ja,jz,ibcon & enddo enddo endif +! top boundary if (nsttop .eq. 0) then do j = ja,jz do i = ia,iz @@ -45,34 +191,72 @@ Subroutine nstbtnd (m1,m2,m3,ia,iz,ja,jz,ibcon & enddo endif -if (iand(ibcon,1) .ne. 0) then - do j = ja-incja,jz+incjz - do k = 1,m1 - sct(k,1,j) = (bx(k,j,1) - scp(k,1,j)) * tymeinv +! west boundary +if (iand(ibcon,1) .ne. 0) then ! this subdomain is on the boundary + do j = ja-incja,jz+incjz ! loop through all j points along this subdomain boundary + do k = 1,m1 ! loop through all vertical levels in this j column + ! set tendency based on the difference between the west border value + ! interpolated from the parent nest (bx(k,j,1)) and the value itself (scp) + do i = ia-incia,iz+inciz + sct(k,i,j) = sct(k,i,j) & + + wgtW(i,j) * (bx(k,j,1) - scp(k,i,j)) * itau_spg + enddo + ! below is the old code which sets only the boundary value to bx. tymeinv is a + ! fractional timestep based on which integration this is relative to the parent grid. + !sct(k,1,j) = (bx(k,j,1) - scp(k,1,j)) * tymeinv enddo enddo endif -if (iand(ibcon,2) .ne. 0) then - do j = ja-incja,jz+incjz - do k = 1,m1 - sct(k,nxfm,j) = (bx(k,j,2) - scp(k,nxfm,j)) * tymeinv +! east boundary +if (iand(ibcon,2) .ne. 0) then ! this subdomain is on the boundary + do j = ja-incja,jz+incjz ! loop through all j points along this subdomain boundary + do k = 1,m1 ! loop through all vertical levels in this j column + ! set tendency based on the difference between the east border value + ! interpolated from the parent nest (bx(k,j,2)) and the value itself (scp) + do i = ia-incia,iz+inciz + sct(k,i,j) = sct(k,i,j) & + + wgtE(i,j) * (bx(k,j,2) - scp(k,i,j)) * itau_spg + ! TEMPORARY - print some stuff + !if(ngrid.eq.3 .and. vnam.eq.'u' .and. (k.eq.30) ) then + ! print*, 'E boundary,gr3,u,k(30): i,j, wgtE, bx(30,j,2), scp, sct' + ! print*, i,j, wgtE(i,j), bx(k,j,2), scp(k,i,j), sct(k,i,j) + !endif + enddo + ! below is the old code which sets only the boundary value to bx + !sct(k,nxfm,j) = (bx(k,j,2) - scp(k,nxfm,j)) * tymeinv enddo enddo endif if (jdim .eq. 1) then - if (iand(ibcon,4) .ne. 0) then - do i = ia-incia,iz+inciz - do k = 1,m1 - sct(k,i,1) = (by(k,i,1) - scp(k,i,1)) * tymeinv + ! south boundary + if (iand(ibcon,4) .ne. 0) then ! this subdomain is on the boundary + do i = ia-incia,iz+inciz ! loop through all i points along this subdomain boundary + do k = 1,m1 ! loop through all vertical levels in this i column + ! set tendency based on the difference between the south border value + ! interpolated from the parent nest (by(k,j,1)) and the value itself (scp) + do j = ja-incja,jz+incjz + sct(k,i,j) = sct(k,i,j) & + + wgtS(i,j) * (by(k,i,1) - scp(k,i,j)) * itau_spg + enddo + ! below is the old code which sets only the boundary value to by + !sct(k,i,1) = (by(k,i,1) - scp(k,i,1)) * tymeinv enddo enddo endif - if (iand(ibcon,8) .ne. 0) then - do i = ia-incia,iz+inciz - do k = 1,m1 - sct(k,i,nyfm) = (by(k,i,2) - scp(k,i,nyfm)) * tymeinv + ! north boundary + if (iand(ibcon,8) .ne. 0) then ! this subdomain is on the boundary + do i = ia-incia,iz+inciz ! loop through all i points along this subdomain boundary + do k = 1,m1 ! loop through all vertical levels in this i column + ! set tendency based on the difference between the north border value + ! interpolated from the parent nest (by(k,j,2)) and the value itself (scp) + do j = ja-incja,jz+incjz + sct(k,i,j) = sct(k,i,j) & + + wgtN(i,j) * (by(k,i,2) - scp(k,i,j)) * itau_spg + enddo + ! below is the old code which sets only the boundary value to by + !sct(k,i,nyfm) = (by(k,i,2) - scp(k,i,nyfm)) * tymeinv enddo enddo endif @@ -88,31 +272,31 @@ Subroutine cofnest () implicit none -integer :: nf,nc,nrat,if,jf,kf,kc +integer :: nf,nc,nrat,ibetter,jf,kf,kc real :: alpha,et,ev real, dimension(:), allocatable :: vctr1, vctr2, vctr3 do nf = 2,ngrids nc = nxtnest(nf) - allocate(vctr1(nnzp(nc))) - allocate(vctr2(nnzp(nc))) - allocate(vctr3(nnzp(nc))) + allocate(vctr1(nnzp(nf))) + allocate(vctr2(nnzp(nf))) + allocate(vctr3(nnzp(nf))) if (nc .eq. 0) go to 50 nrat = nstratx(nf) alpha = ((1. / float(nrat)) ** 2 - 1.) / 24. - do if = 1,nnxp(nf) - et = -.5 + float(2 * mod(if+nrat-2,nrat) + 1) / (2.0 * float(nrat)) - ev = -.5 + float(mod(if+nrat-2,nrat) + 1) / float(nrat) - - ei1(if,nf) = et * (et - 1.) / 2. + alpha - ei2(if,nf) = (1. - et * et) - 2. * alpha - ei3(if,nf) = et * (et + 1.) / 2. + alpha - ei4(if,nf) = (ev * ev - 0.25) * (1.5 - ev) / 6.0 - ei5(if,nf) = (0.5 - ev) * (2.25 - ev * ev) * 0.5 - ei6(if,nf) = (0.5 + ev) * (2.25 - ev * ev) * 0.5 - ei7(if,nf) = (ev * ev - 0.25) * (1.5 + ev) / 6.0 + do ibetter = 1,nnxp(nf) + et = -.5 + float(2 * mod(ibetter+nrat-2,nrat) + 1) / (2.0 * float(nrat)) + ev = -.5 + float(mod(ibetter+nrat-2,nrat) + 1) / float(nrat) + + ei1(ibetter,nf) = et * (et - 1.) / 2. + alpha + ei2(ibetter,nf) = (1. - et * et) - 2. * alpha + ei3(ibetter,nf) = et * (et + 1.) / 2. + alpha + ei4(ibetter,nf) = (ev * ev - 0.25) * (1.5 - ev) / 6.0 + ei5(ibetter,nf) = (0.5 - ev) * (2.25 - ev * ev) * 0.5 + ei6(ibetter,nf) = (0.5 + ev) * (2.25 - ev * ev) * 0.5 + ei7(ibetter,nf) = (ev * ev - 0.25) * (1.5 + ev) / 6.0 enddo if (jdim .eq. 1) then diff --git a/src/radiate/bugsrad/bandsolve.f90 b/src/radiate/bugsrad/bandsolve.f90 new file mode 100644 index 0000000..df690e2 --- /dev/null +++ b/src/radiate/bugsrad/bandsolve.f90 @@ -0,0 +1,134 @@ + + +! CVS: $Id: bandsolve.F,v 1.1 2001/04/30 08:43:42 norm Exp $ +! CVS: $Name: $ + + module bandsolve + + implicit none + + public::bandec, banbks + + contains + + subroutine bandec(a, n, m1, m2, np, mp, al, mpl, indx, d) + + use bugs_kinds + + integer(kind=int_kind), intent(in) :: n, m1, m2, np, mp, mpl + + real(kind=dbl_kind), intent(inout), dimension(1:,1:) :: a + + integer(kind=int_kind), intent(out), dimension(1:) :: indx + real(kind=dbl_kind), intent(out), dimension(1:,1:) :: al + real(kind=dbl_kind), intent(out) :: d + + !Local variables + real(kind=dbl_kind), parameter:: TINY=1.0e-20_dbl_kind + integer(kind=int_kind) :: i, j, k, ell, mm + real(kind=dbl_kind) :: dum + + mm = m1 + m2 + 1 + + ! if(mm > mp .or. m1 > mpl .or. n > np) then + ! print *, "Bad arguments in bandec" + ! !pause + ! endif + + + ell = m1 + + do i = 1, m1 + do j = m1+2-i, mm + a(i,j-ell) = a(i,j) + enddo + ell = ell - 1 + do j = mm-ell, mm + a(i,j) = 0.0 + enddo + enddo + + d = 1.0 + ell = m1 + do k = 1,n + dum = a(k,1) + i = k + if (ell < n) ell = ell+1 + do j = k+1, ell + if (abs(a(j,1)) > abs(dum)) then + dum = a(j,1) + i = j + endif + enddo + indx(k) = i + if (dum == 0.0) a(k,1) = TINY !This was in num. rec. + if (i /= k) then + d = -d + do j = 1, mm + dum = a(k,j) + a(k,j) = a(i,j) + a(i,j) = dum + enddo + endif + do i = k+1, ell + dum = a(i,1)/a(k,1) + al(k,i-k) = dum + do j = 2, mm + a(i, j-1) = a(i,j) - dum*a(k,j) + enddo + a(i,mm) = 0.0 + enddo + enddo + return + end subroutine bandec + + + subroutine banbks(a, n, m1, m2, np, mp, al, mpl, indx, b) + + use bugs_kinds + + integer(kind=int_kind), intent(in):: n, m1, m2, np, mp, mpl + integer(kind=int_kind), intent(in), dimension(:):: indx + real(kind=dbl_kind), intent(in), dimension(:,:):: a, al + + real(kind=dbl_kind), intent(inout), dimension(:):: b + + !Local variables + + integer(kind=int_kind):: i, k, ell, mm + real(kind=dbl_kind):: dum + + mm = m1 + m2 + 1 + + if (mm > mp .or. m1 > mpl .or. n > np) then + print *, "Bad arguments in banbks" + endif + + ell = m1 + + do k = 1, n + i = indx(k) + if (i /= k) then + dum = b(k) + b(k) = b(i) + b(i) = dum + endif + if (ell < n) ell = ell+1 + do i = k+1, ell + b(i) = b(i) - al(k,i-k)*b(k) + enddo + enddo + + ell = 1 + do i = n, 1, -1 + dum = b(i) + do k = 2, ell + dum = dum - a(i,k)*b(k+i-1) + enddo + b(i) = dum/a(i,1) + if (ell < mm) ell = ell+1 + enddo + return + end subroutine banbks + + end module bandsolve diff --git a/src/radiate/bugsrad/bugs_files.f90 b/src/radiate/bugsrad/bugs_files.f90 new file mode 100644 index 0000000..098f4ea --- /dev/null +++ b/src/radiate/bugsrad/bugs_files.f90 @@ -0,0 +1,2551 @@ + + +! CVS: $Id: bugs_lwr.F,v 1.7 2006/11/16 18:45:09 norm Exp $ +! CVS: $Name: $ +! Modified for new version of planck function + +!----------------------------------------------------------------------- + + subroutine bugs_lwr & + ( ncol , nlm , pp , ppl, & + dp , tt , rmix , cwrho, & + cwn , & + cirho , o3mix , ts , cldamt, & + cldmax , b1 , b2 , b3, & + b4 , umco2 , umch4 , umn2o, & + fdlw , fdlwcl , fulw , fulwcl, & + sel_rules & + ) + + use bugs_kinds + use bugsrad_planck, only: planck + use gases_ckd, only: gases, stanpir,pscale + use continuum + implicit none + +!----------------------------------------------------------------------- +! REFERENCES: +! bugs_lwr replaces crclwr written by G. Stephens. bugs_lwr computes the +! downward and upward longwave radiative fluxes, and longwave heating +! rates. +! Laura D. Fowler (slikrock/08-23-96). + +! send comments to laura@slikrock.atmos.colostate.edu and +! partain@atmos.colostate.edu. + +! MODIFICATIONS: +! * moved the computation of the all-sky and clear-sky radiative heating +! rates to bugs_rad. +! Laura D. Fowler and Phil Partain/slikrock (01-27-99). + +! * added effective radii of cloud droplets and ice crystals that are +! dependent on the cloud water and cloud ice contents. +! Laura D. Fowler/slikrock (06-08-00). + +! * cleaned up the argument list to remove variables related to short +! wave radiative transfer. +! Laura D. Fowler/slikrock (02-01-00). + +! * changed declarations to adapt the code from BUGS4 to BUGS5. +! Laura D. Fowler/slikrock (02-01-00). + +! SUBROUTINES CALLED: + +! pscale : pressure scaling. +! cloudg : computes cloud optical properties of water/ice +! clouds. +! gascon_ckd_parm : water vapor continuum absorption. +! plank : computes planck function. +! comscp1 : combines optical properties for gray absorption +! (clouds and water vapor continuum). +! comscp2 : combines optical properties for non-gray gaseous +! absorption. +! gases : computes gases absorption. +! two_rt_lw : two-stream parameterization. + +! FUNCTIONS CALLED: +! none. + +! INCLUDED COMMONS: +! none. + +! ARGUMENT LIST VARIABLES: +! All arrays indexed as nlm correspond to variables defined in the +! middle of layers. All arrays indexed as nlm+1 correspond to variables +! defined at levels at the top and bottom of layers. + +! INPUT ARGUMENTS: +! ---------------- + logical (kind=log_kind), intent(in):: & + sel_rules + + integer (kind=int_kind), intent(in):: & + ncol, &!Length of sub-domain. + nlm !Number of layers. + + real (kind=dbl_kind), intent(in):: & + umco2, & !Concentration of CO2 (ppm). + umch4, & !Concentration of CH4 (???). + umn2o !Concentration of N2o (???). + + real (kind=dbl_kind), intent(in), dimension(ncol):: & + ts, & !Surface temperature (K). + cldmax !Maximum cloud fraction (-). + + real (kind=dbl_kind), intent(in), dimension(ncol,nlm):: & + ppl, & !Layer pressure (hPa). + dp, & !Layer thickness (hPa). + tt, & !Temperature (K). + rmix, & !Water vapor mixing ratio (kg/kg). + cwrho, & !Cloud water mixing ratio (g/m^3). + cwn, & !Cloud droplet concentration (#/kg) . + cirho, & !Cloud ice mixing ratio (g/m^3). + o3mix, & !Ozone mixing ratio (kg/kg). + cldamt, & !Cloud fraction (-). + b1, & !Cloud overlap parameter (-). + b2, & !Cloud overlap parameter (-). + b3, & !Cloud overlap parameter (-). + b4 !Cloud overlap parameter (-). + + real (kind=dbl_kind), intent(in), dimension(ncol,nlm+1):: & + pp !Level pressure (hPa). + + +! OUTPUT ARGUMENTS: +! ----------------- + real (kind=dbl_kind), intent(out), dimension(ncol,nlm+1):: & + fdlw, & !Downward LW flux (W/m^2). + fdlwcl, & !Downward clear-ksy LW flux (W/m^2). + fulw, & !Upward LW flux (W/m^2). + fulwcl !Upward clear-sky LW flux (W/m^2). + +! LOCAL VARIABLES: + + integer (kind=int_kind), parameter :: & + mb = 18, & !Total number of spectral intervals. + mbs = 6, & !Number of shortwave (SW) spectral intervals. + mbir = 12 !Number of longwave (LW) spectral intervals. + + + integer (kind=int_kind):: & + i, & !Horizontal index. + l, & !Vertical index. + ib, & !Index of spectral interval. + ig, & !Index of k-distribution. + ibmbs !Index of LW spectral interval. + + integer (kind=int_kind), dimension(ncol,nlm):: & + ip1, & !Used in conjunction with pressure weigthing. + ip2 !Used in conjunction with pressure weigthing. + + real (kind=dbl_kind) :: & + hk, & !Weighted spectral solar constant (W/m^2). + eps, & !Threshold for cloud optical properties . + tmax, & !Temperature threshold (K). + pdist + data eps,tmax,pdist /1.e-05,340.,2./ + + real (kind=dbl_kind), dimension(mbir):: & + kg !Nb of k-distributions per spectral intervals. + data kg /2,3,4,4,3,5,2,10,12,7,7,8/ + + real (kind=dbl_kind), dimension(mbir):: & + asym_wat, &!Spectral asymmetry factor of water clouds. + asym_ice !Spectral asymmetry factor of ice clouds. + + real (kind=dbl_kind), dimension(mb):: & + cnrw, & !Real part of refractive index (Water clouds). + cniw, & !Imaginary part of refractive index (Water clouds). + cnri, & !Real part of refractive index (Ice clouds). + cnii, & !Imaginary part of refractive indec (Ice clouds). + xlam !Center of spectral band. + + real (kind=dbl_kind), dimension(ncol,mbir):: & + es !Spectral surface emissivity (-). + + real (kind=dbl_kind), dimension(ncol,nlm):: & + rew, & !Effective radius for cloud water (mu). + rei, & !Effective radius for cloud ice (mu). + ttem, & !Local temperature (K). + pkd, & ! + tau1, & !All-sky optical depth (-). + tauclr1, & !Clear-sky optical depth (-). + tau, & !All-sky optical depth (-). + tauclr, & !Clear-sky optical depth (-). + taer, & !Aerosol optical depth (-). + tray, & !Rayley optical depth (-). + tg, & !Gases optical depth (-). + tgm, & !WV continuum optical depth (-). + tcldi, & !Ice cloud optical depth (-). + tcldw, & !Water cloud optical depth (-). + wc, & !All-sky single scattering albedo (-). + wcclr, & !Clear-sky single scattering albedo (-). + waer, & !Aerosol single scattering albedo (-). + wray, & !Rayley single scattering albedo (-). + wcldi, & !Ice cloud single scattering albedo (-). + wcldw, & !Water cloud single scattering albedo (-). + asym, & !All-sky asymmetry factor (-). + asyclr, & !Clear-sky asymmetry factor (-). + asyaer, & !Aerosol asymmetry factor (-). + asycldi, & !Ice cloud asymmetry factor (-). + asycldw, & !Water cloud asymmetry factor (-). + fwclr, & ! + fwcld ! + + real (kind=dbl_kind), dimension(ncol,nlm+1):: & + bf, & !Planck function for layers (W/m^2). + fdg, & !Spectral downward flux (W/m^2). + fdgcl, & !Spectral clear-sky downward flux (W/m^2). + fug, & !Spectral upward flux (W/m^2). + fugcl !Spectral clear-sky upward flux (W/m^2). + +! longwave asymmetry parameters: +! (assumes: re=10 for water; re=30 for ice) + data asym_wat /0.8200, 0.8547, 0.8619, 0.8683, 0.8723, 0.8703, & + 0.8566, 0.8040, 0.7463, 0.6579, 0.5103, 0.1279 / + data asym_ice /0.8524, 0.8791, 0.9022, 0.8797, 0.8637, 0.8722, & + 0.8609, 0.8168, 0.7663, 0.6584, 0.6172, 0.3585 / + +!--- cnrw and cniw (water clouds): + data cnrw/1.3422,1.3281,1.3174,1.2901,1.3348,1.3700,1.3191,1.2821, & + 1.3160,1.3030,1.2739,1.2319,1.1526,1.1981,1.3542,1.4917, & + 1.5463,1.8718/ + data cniw/6.4790e-9,1.3417e-06,1.2521e-4,7.1533e-4,4.2669e-2, & + 4.3785e-3,1.3239e-2 ,1.5536e-2,5.3894e-2,3.4346e-2, & + 3.7490e-2,4.7442e-2 ,1.2059e-1,3.3546e-1,4.1698e-1, & + 4.0674e-1,3.6362e-1 ,5.2930e-1/ + +!--- cnri and cnii (ice clouds): + data cnri/1.3266,1.2986,1.2826,1.2556,1.2963,1.3956, & + 1.3324,1.2960,1.3121,1.3126,1.2903,1.2295, & + 1.1803,1.5224,1.5572,1.5198,1.4993,1.7026/ + data cnii/7.0696e-9,9.1220e-7,1.2189e-4,5.7648e-4,4.3144e-2, & + 8.2935e-3,1.5540e-2,2.5594e-2,5.9424e-2,5.1511e-2, & + 4.0325e-2,4.7994e-2,2.3834e-1,3.0697e-1,1.1852e-1, & + 4.3048e-2,6.3218e-2,1.5843e-1/ + +!---- spectral band center: + data xlam/0.45 ,1.0 ,1.6 ,2.2 ,3.0 ,3.75 ,4.878 ,5.556, & + 6.452 ,7.547 ,8.511,9.615,11.236,13.605,16.529,21.277, & + 29.412,71.403/ + +!----------------------------------------------------------------------- + +!---- 0. initialize output arrays: + + fdlw(:,:) = 0. + fdlwcl(:,:) = 0. + fulw(:,:) = 0. + fulwcl(:,:) = 0. + + !rew(:,:) = 3. + !assuming gamma shape parameter of 4 + !rew(:,:) = 10. + rew(:,:) = 6.e6*(cwrho/cwn*0.0019894e-6)**(1./3.) + rei(:,:) = 30. + + do l = 1, nlm + do i = 1, ncol + ttem(i,l) = min(tmax,tt(i,l)) + enddo + enddo + +!---- note: this will be changed to accomodate the spectral dependence +! the surface emissivity: + + do ib = 1, mbir + do i = 1, ncol + es(i,ib) = 1. + enddo + enddo + +!-- pressure scaling: + + call pscale(ncol,nlm,ppl,stanpir,pkd,ip1,ip2) + +!---- 1. loop over the mbir spectral intervals starts here: + + do ib = mbs+1, mb + ibmbs = ib - mbs + + tray(:,:) = 0. + wray(:,:) = 0. + taer(:,:) = 0. + waer(:,:) = 0. + asyaer(:,:) = 1. + +!---- 1.1 optical properties of water and ice clouds (as in crclwr for +! now): + + call cloudg & + ( ncol , nlm , mb , ib, & + pp , tt , cwrho , rew, & + pdist , cnrw , cniw , cnri, & + cnii , xlam , tcldw , wcldw, & + asycldw , .false. & + ) + + call cloudg & + ( ncol , nlm , mb , ib, & + pp , tt , cirho , rei, & + pdist , cnrw , cniw , cnri, & + cnii , xlam , tcldi , wcldi, & + asycldi , .true. & + ) + +! the asymmetry factor for water and ice clouds are fixed as for now +! functions of the spectral intervals: + + do l = 1, nlm + do i = 1, ncol + if(cwrho(i,l) .ge. eps) asycldw(i,l) = asym_wat(ibmbs) + if(cirho(i,l) .ge. eps) asycldi(i,l) = asym_ice(ibmbs) + enddo + enddo + +!---- 1.2 water vapor continuum: + + call gascon & + (ncol , nlm, ib , pp, & + ppl , dp, tt , rmix, & + tgm & + ) + +!---- 1.3 planck function: + call planck(ncol,nlm,ibmbs,ts,tt,bf) + +!---- 1.4 combines single-scattering properties for gray absorption: + + call comscp1 & + ( ncol , nlm , taer , tcldi, & + tcldw , tgm , tray , waer, & + wcldi , wcldw , wray , asyaer, & + asycldi , asycldw , tau1 , tauclr1, & + asym , asyclr , fwcld , fwclr & + ) + +!---- loop over the k-probability distributions starts here: + + do ig = 1, kg(ibmbs) + +!---- 1.5 gaseous absorption: + + call gases & + ( ncol , nlm , ib , ig, & + pp , dp , tt , rmix, & + o3mix , umco2 , umch4 , umn2o, & + hk , tg , pkd , ip1, & + ip2 & + ) + +!---- 1.6 combines all single-scattering properties: + + call comscp2 & + ( ncol , nlm , tg , fwcld, & + fwclr , tau1 , tauclr1 , tau, & + tauclr , wc , wcclr & + ) + + + !NBW - Minor (?) bug fix + !With near-zero CO2 and very low water vapor amounts, the + !correlated-K parameterization can generate negative optical + !depths in the CO2-H2O overlap bands. Here's a quick fix: + where (tau .lt. 0) + tau = 0. + endwhere + where (tauclr .lt. 0) + tauclr = 0. + endwhere + +!---- 1.7 two-stream approximation: +! No overlap + call two_rt_lw & + ( ncol , nlm , mbs , mbir, & + ib , wc , asym , tau, & + es , bf , fug , fdg, & + sel_rules & + ) + + call two_rt_lw & + ( ncol , nlm , mbs , mbir, & + ib , wcclr , asyclr , tauclr, & + es , bf , fugcl , fdgcl, & + sel_rules & + ) + + fdlw(:,:) = fdlw(:,:) + fdg(:,:)*hk + fulw(:,:) = fulw(:,:) + fug(:,:)*hk + fdlwcl(:,:) = fdlwcl(:,:) + fdgcl(:,:)*hk + fulwcl(:,:) = fulwcl(:,:) + fugcl(:,:)*hk + !print'(5e20.10)',xlam(ib),fdg(1,2),fdg(1,nlm),fug(1,1),fug(1,nlm) + enddo ! end k-distribution + + enddo ! end spectral interval + + + return + end subroutine bugs_lwr + +!----------------------------------------------------------------------- + + +! CVS: $Id: bugs_swr.F,v 1.4 2005/11/22 21:55:48 norm Exp $ +! CVS: $Name: $ + +!----------------------------------------------------------------------- + + subroutine bugs_swr & + ( ncol , nlm , pp , ppl, & + dp , tt , rmix , cwrho, & + cwn , & + cirho , o3mix , ts , amu0, & + slr , alvdf , alndf , alvdr, & + alndr , cldamt , cldmax , umco2 , & + umch4 , umn2o , b1 , b2 , & + b3 , b4 , fdsw , fdswcl , & + fusw , fuswcl , radvbc , radvbccl , & + radvdc ,radvdccl , radnbc , radnbccl , & + radndc ,radndccl ,sel_rules & + ) + + + use bugs_kinds + use gases_ckd, only: gases, stanps, pscale + use rayleigh, only: rayle + implicit none + +!----------------------------------------------------------------------- +! REFERENCES: +! bugs_swr replaces crcswr written by G. Stephens. BUGSswr computes the +! downward and upward SW radiative fluxes, and SW heating rates. +! Laura D. Fowler (slikrock/08-20-97). + +! send comments to laura@slikrock.atmos.colostate.edu and +! partain@atmos.colostate.edu. + +! MODIFICATIONS: +! * moved the computation of the all-sky and clear-sky radiative heating +! rates to bugs_rad. +! Laura D. Fowler and Phil Partain(slikrock/01-27-99). + +! * added effective radii of cloud droplets and ice crystals that are +! dependent on the cloud water and cloud ice contents. +! Laura D. Fowler/slikrock (06-08-00). + +! * cleaned up the argument list to remove variables related to short +! wave radiative transfer. +! Laura D. Fowler/slikrock (02-01-00). + +! * changed declarations to adapt the code from BUGS4 to BUGS5. +! Laura D. Fowler/slikrock (02-01-00). + +! SUBROUTINES CALLED: + +! pscale : pressure scaling. +! cloudg : computes cloud optical properties of water/ice +! clouds. +! rayle : Computes Rayleigh scattering properties. +! comscp1 : combines optical properties for gray absorption +! (clouds and water vapor continuum). +! comscp2 : combines optical properties for non-gray gaseous +! absorption. +! gases : computes gases absorption. +! two_rt_sw : two-stream parameterization. + +! FUNCTIONS CALLED: +! none. + +! INCLUDED COMMONS: +! none. + +! ARGUMENT LIST VARIABLES: +! All arrays indexed as nlm correspond to variables defined in the +! middle of layers. All arrays indexed as nlm+1 correspond to variables +! defined at levels at the top and bottom of layers. + +! INPUT ARGUMENTS: +! ---------------- + logical (kind=log_kind), intent(in):: & + sel_rules + + integer (kind=int_kind), intent(in):: & + ncol, & !Length of sub-domain. + nlm !Number of layers. + + real (kind=dbl_kind), intent(in):: & + umco2, & !Concentration of CO2 (ppm). + umch4, & !Concentration of CH4 (???). + umn2o !Concentration of N2o (???). + + real (kind=dbl_kind), intent(in), dimension(ncol):: & + ts, &!Surface temperature (K). + amu0, & !Cosine of solar zenith angle (-). + slr, & !Fraction of daylight (-). + alvdr, & !Visible direct surface albedo (-). + alndr, & !Near-IR direct surface albedo (-). + alvdf, & !Visible diffuse surface albedo (-). + alndf, & !Near-IR diffuse surface albedo (-). + cldmax !Maximum cloud fraction (-). + + real (kind=dbl_kind), intent(in), dimension(ncol,nlm):: & + ppl, & !Layer pressure (hPa). + dp, & !Layer thickness (hPa). + tt, & !Temperature (K). + rmix, & !Water vapor mixing ratio (kg/kg). + cwrho, & !Cloud water water content (g/m^-3). + cwn, & !Cloud droplet concentration (#/kg). + cirho, & !Cloud ice content (g/m^-3). + o3mix, & !Ozone mixing ratio (kg/kg). + cldamt, & !Cloud fraction (-). + b1, & !Cloud overlap parameter (-). + b2, & !Cloud overlap parameter (-). + b3, & !Cloud overlap parameter (-). + b4 !Cloud overlap parameter (-). + + real (kind=dbl_kind), intent(in), dimension(ncol,nlm+1):: & + pp !Level pressure (hPa). + + + +! OUTPUT ARGUMENTS: +! ----------------- + real (kind=dbl_kind), intent(out), dimension(ncol):: & + radvbc, & !SFC all-sky visible direct net SW radiation (W/m^-2). + radvbccl, & !SFC clear-sky visible direct net SW radiation (W/m^-2). + radvdc, & !SFC all-sky visible direct net SW radiation (W/m^-2). + radvdccl, & !SFC clear-sky visible direct net SW radiation (W/m^-2). + radnbc, & !SFC all-sky near-ir direct net SW radiation (W/m^-2). + radnbccl, & !SFC clear-sky near-ir direct net SW radiation (W/m^-2). + radndc, & !SFC all-sky near-ir direct net SW radiation (W/m^-2). + radndccl !SFC clear-sky near-ir direct net SW radiation (W/m^-2). + + real (kind=dbl_kind), intent(out), dimension(ncol,nlm+1):: & + fdsw , & !Downward SW flux (W/m^-2). + fdswcl, & !Downward clear-ksy SW flux (W/m^-2). + fusw, & !Upward SW flux (W/m^-2). + fuswcl !Upward clear-sky SW flux (W/m^-2). + +! LOCAL VARIABLES: + integer (kind=int_kind), parameter :: & + mb = 18, & !Total number of spectral intervals. + mbs = 6, & !Number of shortwave (SW) spectral intervals. + mbir = 12 !Number of longwave (LW) spectral intervals. + + integer (kind=int_kind) :: & + i, & !Horizontal index. + l, & !Vertical index. + ib, & !Index of spectral interval. + ig !Index of k-distribution. + + integer (kind=int_kind), dimension(ncol,nlm):: & + ip1, & !Used in conjunction with pressure weigthing. + ip2 !Used in conjunction with pressure weigthing. + + real (kind=dbl_kind) :: & + hk, & !Weighted spectral solar constant (W/m^-2). . + tmax, & !Temperature threshold (K). + eps, & !Threshold for cloud optical properties . + pdist + data eps,tmax,pdist /1.e-05,340.,2./ + + real (kind=dbl_kind), dimension(mbs):: & + kg !Nb of k-distributions per spectral intervals. + data kg /10,8,12,7,12,5/ + + real (kind=dbl_kind), dimension(mbs):: & + asym_wat, & !Spectral asymmetry factor of water clouds. + asym_ice, & !Spectral asymmetry factor of ice clouds. + ri !Coefficients related to Rayleigh absorption. + data ri / 0.9022e-5, 0.5282e-6, 0.5722e-7, & + 0.1433e-7, 0.4526e-8, 0.1529e-8 / + + real (kind=dbl_kind), dimension(mb):: & + cnrw, & !Real part of refractive index (Water clouds). + cniw, & !Imaginary part of refractive index (Water clouds). + cnri, & !Real part of refractive index (Ice clouds). + cnii, & !Imaginary part of refractive indec (Ice clouds). + xlam !Center of spectral band. + + real (kind=dbl_kind), dimension(ncol,mbs):: & + asdir, & !Spectral direct surface albedo (-). + asdif !Spectral diffuse surface albedo (-). + + real (kind=dbl_kind), dimension(ncol,nlm):: & + rew, & !Effective radius for cloud water (mu). + rei, & !Effective radius for cloud ice (mu). + ttem, & !Local temperature (K). + pkd, & ! + tau1, & !All-sky optical depth (-). + tauclr1, & !Clear-sky optical depth (-). + tau, & !All-sky optical depth (-). + tauclr, & !Clear-sky optical depth (-). + taer, & !Aerosol optical depth (-). + tray, & !Rayley optical depth (-). + tg, & !Gases optical depth (-). + tgm, & !WV continuum optical depth (-). + tcldi, & !Ice cloud optical depth (-). + tcldw, & !Water cloud optical depth (-). + wc, & !All-sky single scattering albedo (-). + wcclr, & !Clear-sky single scattering albedo (-). + waer, & !Aerosol single scattering albedo (-). + wray, & !Rayley single scattering albedo (-). + wcldi, & !Ice cloud single scattering albedo (-). + wcldw, & !Water cloud single scattering albedo (-). + asym, & !All-sky asymmetry factor (-). + asyclr, & !Clear-sky asymmetry factor (-). + asyaer, & !Aerosol asymmetry factor (-). + asycldi, & !Ice cloud asymmetry factor (-). + asycldw, & !Water cloud asymmetry factor (-). + fwclr, & ! + fwcld ! + + real (kind=dbl_kind), dimension(ncol,nlm+1):: & + fdgdir, & !Spectral direct downward flux (W/m^2). + fdgcldir, & !Spectral direct clear-sky downward flux (W/m^2). + fdgdif, & !Spectral diffuse downward flux (W/m^2). + fdgcldif, & !Spectral diffuse clear-sky downward flux (W/m^2). + fugdif, & !Spectral diffuse upward flux (W/m^2). + fugcldif !Spectral diffuse clear-sky upward flux (W/m^2). + +! shortwave asymmetry parameters: +! (assumes: re=10 for water; re=30 for ice) + data asym_wat / 0.8625, 0.8469, 0.8287, 0.8182, 0.9472, 0.7630 / + data asym_ice / 0.8678, 0.8640, 0.8653, 0.8615, 0.9526, 0.8293 / + +!--- cnrw and cniw (water clouds): + data cnrw/1.3422,1.3281,1.3174,1.2901,1.3348,1.3700,1.3191,1.2821, & + 1.3160,1.3030,1.2739,1.2319,1.1526,1.1981,1.3542,1.4917, & + 1.5463,1.8718/ + data cniw/6.4790e-9,1.3417e-06,1.2521e-4,7.1533e-4,4.2669e-2, & + 4.3785e-3,1.3239e-2 ,1.5536e-2,5.3894e-2,3.4346e-2, & + 3.7490e-2,4.7442e-2 ,1.2059e-1,3.3546e-1,4.1698e-1, & + 4.0674e-1,3.6362e-1 ,5.2930e-1/ + +!--- cnri and cnii (ice clouds): + data cnri/1.3266,1.2986,1.2826,1.2556,1.2963,1.3956, & + 1.3324,1.2960,1.3121,1.3126,1.2903,1.2295, & + 1.1803,1.5224,1.5572,1.5198,1.4993,1.7026/ + data cnii/7.0696e-9,9.1220e-7,1.2189e-4,5.7648e-4,4.3144e-2, & + 8.2935e-3,1.5540e-2,2.5594e-2,5.9424e-2,5.1511e-2, & + 4.0325e-2,4.7994e-2,2.3834e-1,3.0697e-1,1.1852e-1, & + 4.3048e-2,6.3218e-2,1.5843e-1/ + +!---- spectral band center: + data xlam/0.45 ,1.0 ,1.6 ,2.2 ,3.0 ,3.75 ,4.878 ,5.556, & + 6.452 ,7.547 ,8.511,9.615,11.236,13.605,16.529,21.277, & + 29.412,71.403/ + +!----------------------------------------------------------------------- + +!---- 0. initialize local and output arrays: + + radvbc(:) = 0. + radvbccl(:) = 0. + radvdc(:) = 0. + radvdccl(:) = 0. + radnbc(:) = 0. + radnbccl(:) = 0. + radndc(:) = 0. + radndccl(:) = 0. + + fdsw(:,:) = 0. + fdswcl(:,:) = 0. + fusw(:,:) = 0. + fuswcl(:,:) = 0. + + !rew(:,:) = 10. + rew(:,:) = 6.e6*(cwrho/cwn*0.0019894e-6)**(1./3.) + rei(:,:) = 30. + + fdgdir(:,:) = 0.0 + fdgcldir(:,:) = 0.0 + fdgdif(:,:) = 0.0 + fdgcldif(:,:) = 0.0 + fugdif(:,:) = 0.0 + fugcldif(:,:) = 0.0 + + do l = 1, nlm + do i = 1, ncol + ttem(i,l) = min(tmax,tt(i,l)) + enddo + enddo + + do i = 1, ncol + asdir(i,1) = alvdr(i) + asdir(i,2:6) = alndr(i) + asdif(i,1) = alvdf(i) + asdif(i,2:6) = alndf(i) + enddo + +!-- pressure scaling: + + call pscale(ncol,nlm,ppl,stanps,pkd,ip1,ip2) + +!---- 1. loop over the mbs spectral intervals starts here: + + do ib = 1, mbs + + tgm(:,:) = 0. + taer(:,:) = 0. + waer(:,:) = 0. + asyaer(:,:) = 1. +! fdswband(:,:) = 0. +! fuswband(:,:) = 0. + +!---- 1.1 rayleigh absorption: + + call rayle ( & + nlm, & + ib, & + pp, & + tray, & + wray) + +!---- 1.2 optical properties of water and ice clouds (as in crcswr for +! now): + + call cloudg & + ( ncol , nlm , mb , ib, & + pp , tt , cwrho , rew, & + pdist , cnrw , cniw , cnri, & + cnii , xlam , tcldw , wcldw, & + asycldw , .false. & + ) + + call cloudg & + ( ncol , nlm , mb , ib, & + pp , tt , cirho , rei, & + pdist , cnrw , cniw , cnri, & + cnii , xlam , tcldi , wcldi, & + asycldi , .true. & + ) + +! the asymmetry factor for water and ice clouds are fixed as +! functions of the spectral intervals. + + do l = 1, nlm + do i = 1, ncol + if(cwrho(i,l).ge.eps) asycldw(i,l) = asym_wat(ib) + if(cirho(i,l).ge.eps) asycldi(i,l) = asym_ice(ib) + enddo + enddo + +!---- 1.3 combines single-scattering properties for gray absorption: + + call comscp1 & + ( ncol , nlm , taer , tcldi, & + tcldw , tgm , tray , waer, & + wcldi , wcldw , wray , asyaer, & + asycldi , asycldw , tau1 , tauclr1, & + asym , asyclr , fwcld , fwclr & + ) + +!---- loop over the k-probability distributions starts here: + + do ig = 1, kg(ib) + +!---- 1.4 non-gray gaseous absorption: + + call gases & + ( ncol , nlm , ib , ig, & + pp , dp , ttem , rmix, & + o3mix , umco2 , umch4 , umn2o, & + hk , tg , pkd , ip1, & + ip2 & + ) + +!---- 1.5 combines single-scattering properties: + + call comscp2 & + ( ncol , nlm , tg , fwcld, & + fwclr , tau1 , tauclr1 , tau, & + tauclr , wc , wcclr & + ) + +!---- 1.6 two-stream approximation: +! No overlap + call two_rt_sw & + ( ncol , nlm , mbs , ib, & + slr , amu0 , wc , asym, & + tau , asdir , asdif , fugdif, & + fdgdir , fdgdif , sel_rules & + ) + + call two_rt_sw & + ( ncol , nlm , mbs , ib, & + slr , amu0 , wcclr , asyclr, & + tauclr , asdir , asdif , fugcldif, & + fdgcldir ,fdgcldif , sel_rules & + ) + + fdsw(:,:) = fdsw(:,:) & + + (fdgdir(:,:)+fdgdif(:,:))*hk + fusw(:,:) = fusw(:,:) + fugdif(:,:)*hk + fdswcl(:,:) = fdswcl(:,:) & + + (fdgcldir(:,:)+fdgcldif(:,:)) * hk + fuswcl(:,:) = fuswcl(:,:) + fugcldif(:,:)*hk + +!---- 1.7 computes the surface visible and near infrared net radiation. + select case (ib) + + case(1) + radvbc(:) = radvbc(:) + fdgdir(:,nlm+1)*hk + radvbccl(:) = radvbccl(:) + fdgcldir(:,nlm+1)*hk + radvdc(:) = radvdc(:) + fdgdif(:,nlm+1)*hk + radvdccl(:) = radvdccl(:) + fdgcldif(:,nlm+1)*hk + + case(2:6) + radnbc(:) = radnbc(:) + fdgdir(:,nlm+1)*hk + radnbccl(:) = radnbccl(:) + fdgcldir(:,nlm+1)*hk + radndc(:) = radndc(:) + fdgdif(:,nlm+1)*hk + radndccl(:) = radndccl(:) + fdgcldif(:,nlm+1)*hk + + end select + + enddo ! end k-distribution + enddo ! end spectral interval + + return + end subroutine bugs_swr + +!----------------------------------------------------------------------- + + + + + +! CVS: $Id: cloudg.F,v 1.8 2006/11/16 19:54:12 norm Exp $ +! CVS: $Name: $ + +!----------------------------------------------------------------------- + + subroutine cloudg & + ( ncol , nlm , mb , ib, & + pp , tt , wcont , re, & + pdist , cnrw , cniw , cnri, & + cnii , xlam , tcld , wcld, & + asycld , flag & + ) + + use bugs_kinds + + implicit none + +!----------------------------------------------------------------------- +! REFERENCES: +! Cleaned up version of cloud.f from G. Stephens. Computes the cloud +! optical properties. + +! This routine has been modified to include the the corrections to +! ADT for spherical particles based upon the work of David Mitchell +! DRI. All the derivations have been carried out for the modified +! gamma distribution assuming that m=0.5 (em in program), a +! parameter in eqn (5) of Mitchell (1994). + +! tcld, wcld, asycld are the optical depth, single scattering albedo, +! and asymmetry parameter of cloud particles based on the use of +! ADT theory as used by Stephens et al (1990). Effective radius re +! is input (in microns) and the water content is in g/m3. The logical +! variable flag is .false. for water and .true. for ice. + +! send comments to laura@slikrock.atmos.colostate.edu and +! partain@atmos.colostate.edu. + +! MODIFICATIONS: +! * changed declarations to adapt the code from BUGS4 to BUGS5. +! Laura D. Fowler/slikrock (02-01-00). + +! SUBROUTINES CALLED: +! none. + +! FUNCTIONS CALLED: +! none + +! INCLUDED COMMONS: +! none. + +! ARGUMENT LIST VARIABLES: +! INPUT ARGUMENTS: +! ---------------- + logical (kind=log_kind), intent(in):: & + flag !If true, computes optical properties of ice clouds, of +! of water clouds otherwise. + + integer (kind=int_kind), intent(in):: & + ncol, & !Length of sub-domain. + nlm, & !Number of layers. + mb, & !Total number of spectral intervals. + ib !Index of spectral interval. + + real (kind=dbl_kind), intent(in), dimension(mb):: & + cnrw, & !Real part of refractive index (Water clouds). + cniw, & !Imaginary part of refractive index (Water clouds). + cnri, & !Real part of refractive index (Ice clouds). + cnii, & !Imaginary part of refractive index (Ice clouds). + xlam !Center of spectral band. + + real (kind=dbl_kind), intent(in):: & + pdist ! + + real (kind=dbl_kind), intent(in), dimension(ncol,nlm):: & + tt , & !Temperature (K). + wcont , & !Cloud water/ice content (g/m^-3). + re !Cloud effective radius (mu). + + real (kind=dbl_kind), intent(in), dimension(ncol,nlm+1):: & + pp !Level pressure (hPa). + +! OUTPUT ARGUMENTS: +! ----------------- + real (kind=dbl_kind), intent(out), dimension(ncol,nlm):: & + tcld, & !Cloud optical depth (-). + wcld, & !Cloud single scattering albedo (-). + asycld !Cloud asymmetry factor (-). + +! LOCAL VARIABLES: + complex (kind=dbl_kind):: & + cm,um + + integer (kind=int_kind):: & + i, l + + real (kind=dbl_kind):: & + abs , area , c0 , c1, & + cnr , cni , dz , eps, & + ext , f2 , f3 , no, & + p0 , p1 , p2 , pi, & + rm , xm , vm , rho_water + +!----------------------------------------------------------------------- + +!---- initialize local and output arrays: + + tcld(:,:) = 0. + wcld(:,:) = 0. + asycld(:,:) = 1. + +!-- initialize miscellaneous constants and indices of refraction: + + pi = acos(-1.) + eps = 1.e-14!1.e-5 + + if(flag) then + !Ice case + cnr = cnri(ib) + cni = cnii(ib) + rho_water = 1.0e6 !gm^-3 + else + cnr = cnrw(ib) + cni = cniw(ib) + rho_water = 1.0e6 !gm^-3 + endif + +!-- constants depending upon the characteristic width of the distribu +! tion.(these may be made to vary with hydrometeor species and thus +! pdist could be made to depend upon level and column numbers). + +! p0 = 0. + p0 = pdist + p1 = p0 + 1. + p2 = p0 + 2. + f2 = p1 * p0 + f3 = p2 * f2 + +!---- calculate cloud optical properties: + + do l = 1, nlm + do i = 1, ncol + if(wcont(i,l) .gt. eps) then + dz=29.286*log(pp(i,l+1)/pp(i,l)) * tt(i,l) + rm = re(i,l)/p2 + no = wcont(i,l) / ( (4.*pi/3.)*f3*rho_water*rm**3 ) !Particles per cubic micrometer + area = pi*f2*no*rm**2*1.0e6 !The factor converts inverse micrometers, + !i.e., micrometer^2/micrometer^3, to inverse meters + c0 = 2.*area + c1 = c0/f2 + xm = 2.*pi*rm/xlam(ib) + cm = cmplx(cnr,-cni) + + if (ib .eq. 1 .or. ib .eq. 2) then + !For band 1 (0.5 um) only compute the extinction. + um = 2.*xm*(cnr-1.)*cmplx(0.d0,1.d0) + ext = c0 + 2.*c1*real(p0/(um*(um+1.)**p1) & + + 1./(um**2*(um+1.)**p0)-1./um**2) + tcld(i,l) = ext*dz + wcld(i,l) = 0.999999 + asycld(i,l) = 0.85 + else + !Compute both extinction and absorption coefficients for all other bands. + um = 2.*xm*(cm-1.)*cmplx(0.d0,1.d0) + ext = c0 + 2.*c1*real( p0/(um*(um+1.)**p1) & + + 1./(um**2*(um+1.)**p0)-1./um**2) + vm = 4.*xm*cni + abs = area + c1*sngl( p0/(vm*(vm+1.)**p1) & + + 1./(vm**2*(vm+1.)**p0) - 1./vm**2 ) +! abs = area + c1*sngl( & +! p0/(dble(vm)*(dble(vm)+1.)**dble(p1)) & +! + 1./(dble(vm)**2*(dble(vm)+1.)**dble(p0)) & +! - 1./dble(vm)**2) + tcld(i,l) = ext*dz + + if (ext.lt.abs) ext = abs + wcld(i,l) = (ext-abs)/ext + + if(wcld(i,l) .lt. 0.) then + print *,wcld(i,l),ext,abs,wcont(i,l) + print *,pp(i,l),pp(i,l+1) + print *,tt(i,l) + print *,re(i,l) + stop + endif + endif +! if(flag) then +! if(ib==2) print*,ib,tcld(i,l),wcld(i,l),rm,xlam(ib),re(i,l),p2 +! if(ib==2) print*,um,xm,cm,ext,c0,c1,p0,p1,area,vm +! else +! !if(ib<=8) print*,ib,tcld(i,l),wcld(i,l) +! endif + asycld(i,l)=0.85 !default, overridden in bugs_swr(), bugs_lwr() + endif + enddo + enddo + + return + end subroutine cloudg +!----------------------------------------------------------------------- + + +! CVS: $Id: comscp1.F,v 1.3 2001/04/30 08:48:56 norm Exp $ +! CVS: $Name: $ + +!----------------------------------------------------------------------- + + subroutine comscp1 & + ( ncol , nlm , taer , tcldi, & + tcldw , tgm , tray , waer, & + wcldi , wcldw , wray , asyaer, & + asycldi , asycldw , tccld1 , tcclr1, & + asycld , asyclr , fwcld , fwclr & + ) + + use bugs_kinds + + implicit none + +!----------------------------------------------------------------------- +! REFERENCES: +! comscp1 combines single scattering properties due to Rayleigh absorp +! tion, aerosols, water continuum, gray gaseous absorption, ice crystals +! and water droplets. +! Laura D. Fowler/slikrock (08-12-97). + +! send comments to laura@slikrock.atmos.colostate.edu and +! partain@atmos.colostate.edu + +! MODIFICATIONS: +! * changed declarations to adapt the code from BUGS4 to BUGS5. +! Laura D. Fowler/slikrock (02-01-00). + +! SUBROUTINES CALLED: +! none. + +! FUNCTIONS CALLED: +! none. + +! INCLUDED COMMONS: +! none. + +! ARGUMENT LIST VARIABLES: +! All arrays indexed as nlm correspond to variables defined in the +! middle of layers. In this subroutine, all the arrays are defined as +! local arrays in BUGSswr. + +! INPUT ARGUMENTS: +! ---------------- + integer (kind=int_kind), intent(in):: & + ncol, & !Length of sub-domain.. + nlm !Number of layers. + + real (kind=dbl_kind), intent(in), dimension(ncol,nlm):: & + asyaer, & !Asymmetry factor of aerosols (-). + asycldi, & !Asymmetry factor of ice clouds (-). + asycldw, & !Asymmetry factor of water clouds (-). + taer, & !Optical depth of aerosols (-). + tcldi, & !Optical depth of ice clouds (-). + tcldw, & !Optical depth of water clouds (-). + tgm, & !Optical depth of water vapor continuum (-). + tray, & !Optical depth due to Rayleigh absorption (-). + waer, & !Single scattering albedo of aerosols (-). + wcldi, & !Single scattering albedo of ice clouds (-). + wcldw, & !Single scattering albedo of water clouds (-). + wray !Single scattering albedo due to Rayleigh +! absorption (-). + +! OUTPUT ARGUMENTS: +! ----------------- + real (kind=dbl_kind), intent(out), dimension(ncol,nlm):: & + asyclr, & !Clear-sky asymmetry factor (-). + asycld, & !All-sky asymmetry factor (-). + tcclr1, & !Clear-sky optical depth (-). + tccld1, & !All-sky optical depth (-). + fwclr, & !Total clear-sky single-scattering albedo (-). + fwcld !Total cloudy single-scattering albedo (-). + +! LOCAL LIST VARIABLES: + + integer (kind=int_kind):: & + i, & !Horizontal index. + l !Vertical index. + + real (kind=dbl_kind):: & + wwray,wwaer,wwcldi,wwcldw + +!----------------------------------------------------------------------- + + do l = 1, nlm + do i = 1, ncol + + tcclr1(i,l) = tgm(i,l) + tray(i,l) + taer(i,l) + tccld1(i,l) = tcclr1(i,l)+ tcldi(i,l) + tcldw(i,l) + + wwray = wray(i,l)*tray(i,l) + wwaer = waer(i,l)*taer(i,l) + wwcldi = wcldi(i,l)*tcldi(i,l) + wwcldw = wcldw(i,l)*tcldw(i,l) + + fwclr(i,l) = wwray+wwaer + fwcld(i,l) = fwclr(i,l)+wwcldi+wwcldw + + if(fwclr(i,l).gt.1.e-10) then + asyclr(i,l) = (asyaer(i,l)*wwaer)/fwclr(i,l) + else + asyclr(i,l) = 1. + endif + + if(fwcld(i,l).gt.1.e-10) then + asycld(i,l) = (asyaer(i,l)*wwaer+asycldi(i,l)*wwcldi & + + asycldw(i,l)*wwcldw) & + / fwcld(i,l) + else + asycld(i,l) = 1. + endif + + enddo + enddo + + return + end subroutine comscp1 + +!----------------------------------------------------------------------- + + +! CVS: $Id: comscp2.F,v 1.3 2001/04/30 08:47:14 norm Exp $ +! CVS: $Name: $ + + +!----------------------------------------------------------------------- + + subroutine comscp2 & + ( ncol , nlm , tg , fwcld, & + fwclr , tccld1 , tcclr1 , tccld, & + tcclr , wccld , wcclr & + ) + + use bugs_kinds + + implicit none + +!----------------------------------------------------------------------- +! REFERENCES: +! comscp2 combines the single scattering properties computed in comscp1 +! to the single scattering properties due to non-gray absorption. +! Laura D. Fowler (slikrock. 08-12-97). + +! send comments to laura@slikrock.atmos.colostate.edu and +! partain@atmos.colostate.edu + +! MODIFICATIONS: +! * changed declarations to adapt the code from BUGS4 to BUGS5. +! Laura D. Fowler/slikrock (02-01-00). + +! SUBROUTINES CALLED: +! none. + +! FUNCTIONS CALLED: +! none. + +! INCLUDED COMMONS: +! none. + +! ARGUMENT LIST VARIABLES: +! All arrays indexed as nlm correspond to variables defined in the +! middle of layers. In this subroutine, all the arrays are defined as +! local arrays in BUGSswr. + +! INPUT ARGUMENTS: +! ---------------- + integer (kind=int_kind), intent(in):: & + ncol, & !Length of sub-domain.. + nlm !Number of layers. + + real (kind=dbl_kind), dimension(ncol,nlm):: & + tg, & !Optical depth of non-gray gases (-). + fwclr, & !Clear-sky single scattering albedo from comscp1 (-). + fwcld ! + +! INPUT/OUTPUT ARGUMENTS: +! ----------------- + real (kind=dbl_kind), dimension(ncol,nlm):: & + tcclr1, & !Clear-sky optical depth (-). + tccld1, & !All-sky optical depth (-). + tcclr, & !Clear-sky optical depth (-). + tccld !All-sky optical depth (-). + +! OUTPUT ARGUMENTS: +! ----------------- + real (kind=dbl_kind), intent(out), dimension(ncol,nlm):: & + wcclr, & !Clear-sky single scattering albedo (-). + wccld !All-sky single scattering albedo (-). + +! LOCAL LIST VARIABLES: + + integer (kind=int_kind):: & + i, & !Horizontal index. + l !Vertical index. + +!----------------------------------------------------------------------- + + do l = 1, nlm + do i = 1, ncol + + tcclr(i,l) = tcclr1(i,l) + tg(i,l) + tccld(i,l) = tccld1(i,l) + tg(i,l) + + if(tcclr(i,l).gt.0.) then + wcclr(i,l) = fwclr(i,l)/tcclr(i,l) + else + wcclr(i,l) = 0. + endif + wcclr(i,l) = min(.999999_dbl_kind,wcclr(i,l)) + + if(tccld(i,l).gt.0.) then + wccld(i,l) = fwcld(i,l)/tccld(i,l) + else + wccld(i,l) = 0. + endif + wccld(i,l) = min(.999999_dbl_kind,wccld(i,l)) + + enddo + enddo + + return + end subroutine comscp2 + +!----------------------------------------------------------------------- + + +! CVS: $Id: two_rt_lw.F,v 1.7 2003/11/11 21:55:13 norm Exp $ +! CVS: $Name: $ + +!----------------------------------------------------------------------- + + subroutine two_rt_lw & + ( ncol , nlm, mbs , mbir, & + ib , wc, asym , tau, & + es , bf, fu , fd, & + sel_rules & + ) + + use bugs_kinds + + + + implicit none +!----------------------------------------------------------------------- +! REFERENCES: +! two_rt_lw replaces two_rt and add written by G. Stephens. two_rt_lw +! computes the spectral fluxes using a two-stream approximation method. +! Philip Partain, Philip Gabriel, and Laura D. Fowler/graben (09-08-99). + +! MODIFICATIONS: +! * changed declarations to adapt the code from BUGS4 to BUGS5. +! Laura D. Fowler/slikrock (02-01-00). + +! SUBROUTINES CALLED: +! none. + +! FUNCTIONS CALLED: +! none. + +! INCLUDED COMMONS: +! none. + +! ARGUMENT LIST VARIABLES: +! All arrays indexed as nlm correspond to variables defined in the +! middle of layers. All arrays indexed as nlm+1 correspond to variables +! defined at levels at the top and bottom of layers. + +! INPUT ARGUMENTS: +! ---------------- + logical (kind=log_kind), intent(in):: & + sel_rules + + integer (kind=int_kind), intent(in):: & + ncol, & !Length of sub-domain. + nlm, & !Number of layers. + mbs, & !Number of SW spectral intervals. + mbir, & !Number of IR spectral intervals. + ib !Index of spectral interval. + + real (kind=dbl_kind), intent(in), dimension(ncol,mbir):: & + es !Spectral surface emissivity (-). + + real (kind=dbl_kind), intent(in), dimension(ncol,nlm):: & + wc, & !Single scattering albedo (-). + asym, & !Asymmetry factor (-). + tau !Optical depth (-). + + real (kind=dbl_kind), intent(in), dimension(ncol,nlm+1):: & + bf !Planck function (W/m^2). + +! OUTPUT ARGUMENTS: +! ----------------- + real (kind=dbl_kind), intent(out), dimension(ncol,nlm+1):: & + fd, & !Spectral downward flux (W/m^2). + fu !Spectral upward flux (W/m^2). + +! LOCAL VARIABLES: + + integer (kind=int_kind):: & + i, & !Horizontal index. + l, & !Vertical index. + ibms !Index of spectral interval. + + real (kind=dbl_kind), dimension(nlm):: & + rr, & ! + tr, & ! + sigu, & ! + sigd ! + + real (kind=dbl_kind):: & + aa , bb , beta0 , cc, & + diffac , denom , fact , eggtau, & + ggtau, & + kappa , oms , prop ,r, rinf, & + t , taus + data diffac /2./ + + real (kind=dbl_kind), dimension(nlm):: & + td , vu , exptau + + real (kind=dbl_kind), dimension(nlm+1):: & + re, vd + +! SELECTION RULE VARIABLES + + logical (kind=log_kind):: & + fail + + real (kind=dbl_kind):: & + tausthresh, & + wcthresh, & + tauscat + + data tausthresh / 0.001 / + data wcthresh / 0.975 / + +!---------------------------------------------------------------------- + + fd(:,1) = 0. + + ibms = ib - mbs + + do 1000 i = 1, ncol + + if(sel_rules) then + + fail = .false. + tauscat = 0.0 + do l = nlm, 1, -1 + if (wc(i,l).gt.wcthresh) fail = .true. + tauscat = tauscat + wc(i,l)*tau(i,l) + enddo + if (fail.and.tauscat.ge.tausthresh) goto 2000 + +!>> BEGIN SELECTION RULES << +! print *,'selection rules' + do l = 1, nlm + exptau(l) = exp(-2.0*tau(i,l)) + if(tau(i,l) .lt. 0.8e-2) then + sigu(l) = (bf(i,l)+bf(i,l+1))*tau(i,l) + sigd(l) = sigu(l) + else + prop = (1.-exptau(l))/tau(i,l) + aa = 2.-prop + bb = -2.*exptau(l)+prop + cc = 0.5 + sigu(l) = (aa*bf(i,l)+bb*bf(i,l+1))*cc + sigd(l) = (bb*bf(i,l)+aa*bf(i,l+1))*cc + endif + fd(i,l+1) = sigd(l) + exptau(l) * fd(i,l) + enddo + + fu(i,nlm+1) = bf(i,nlm+1)*es(i,ibms) +! & + fd(i,nlm+1)*(1.0-es(i,ibms)) + + do l = nlm , 1, -1 + fu(i,l) = sigu(l) + exptau(l) * fu(i,l+1) + enddo + + cycle + + endif + +!>> END SELECTION RULES << + +!>> BEGIN FULL CALCULATION << +2000 re(1) = 0. + vd(1) = 0. +! print *,'full up calculation' + + do l = 1, nlm + fact = asym(i,l)*asym(i,l) + oms = ((1.-fact)*wc(i,l))/(1.-fact*wc(i,l)) + taus = (1.-fact*wc(i,l))*tau(i,l) + + beta0 = (4.+asym(i,l))/(8.*(1.+asym(i,l))) + t = diffac*(1.-oms*(1.-beta0)) !-0.25 + r = diffac*oms*beta0 !-0.25 + kappa = sqrt(t**2-r**2) + rinf = r/(kappa+t) + ggtau = kappa*taus + eggtau = exp(-ggtau) + denom = (1.-rinf**2*eggtau**2) + tr(l) = (1.-rinf**2)*eggtau/denom + rr(l) = rinf*(1.-eggtau**2)/denom + + if(taus .lt. 0.8e-2) then + sigu(l) = 0.5*diffac*(bf(i,l)+bf(i,l+1))*taus + sigd(l) = sigu(l) + else + aa = (t+r)*(1.-rr(l))-(1.+rr(l)-tr(l))/taus + bb = -(t+r)*tr(l)+(1.+rr(l)-tr(l))/taus + cc = diffac*(1.-oms)/kappa**2 + sigu(l) = cc*(aa*bf(i,l)+bb*bf(i,l+1)) + sigd(l) = cc*(bb*bf(i,l)+aa*bf(i,l+1)) + endif + enddo + +!---- 1. do adding, going from top down: + + do l = 1, nlm + prop = 1. / (1. - re(l)*rr(l)) + re(l+1) = rr(l) + tr(l)**2*re(l)*prop + vd(l+1) = sigd(l) + (tr(l)*vd(l) & + + tr(l)*re(l)*sigu(l))*prop + vu(l) = (rr(l)*vd(l) + sigu(l))*prop + td(l) = prop + enddo + +!---- 2. calculate fluxes going up through the layers: + + fu(i,nlm+1) = es(i,ibms)*bf(i,nlm+1) + + do l = nlm+1, 2, -1 + fd(i,l) = re(l)*fu(i,l) + vd(l) + fu(i,l-1) = tr(l-1)*fu(i,l)*td(l-1) + vu(l-1) + enddo + +!>> END FULL CALCULATION << + + 1000 continue + + return + end subroutine two_rt_lw + +!------------------------------------------------------------------------ + + +! CVS: $Id: two_rt_lw_iter.F,v 1.2 2003/11/11 21:55:13 norm Exp $ +! CVS: $Name: $ + +!----------------------------------------------------------------------- + + subroutine two_rt_lw_iter & + ( & + ncol , nlm , mbs , mbir, & + ib , cldamt , wc , wcclr, & + asym , asyclr , tau , tauclr, & + es , bf , fu , fd, & + sel_rules , b1 , b2 , b3, & + b4 & + ) + + use bugs_kinds + + + + implicit none + +!----------------------------------------------------------------------- +! REFERENCES: +! two_rt_lw replaces two_rt and add written by G. Stephens. two_rt_lw +! computes the spectral fluxes using a two-stream approximation method. +! Philip Partain, Philip Gabriel, and Laura D. Fowler/graben (09-08-99). + +! MODIFICATIONS: +! * changed declarations to adapt the code from BUGS4 to BUGS5. +! Laura D. Fowler/slikrock (02-01-00). + +! SUBROUTINES CALLED: +! none. + +! FUNCTIONS CALLED: +! none. + +! INCLUDED COMMONS: +! none. + +! ARGUMENT LIST VARIABLES: +! All arrays indexed as nlm correspond to variables defined in the +! middle of layers. All arrays indexed as nlm+1 correspond to variables +! defined at levels at the top and bottom of layers. + +! INPUT ARGUMENTS: +! ---------------- + logical (kind=log_kind), intent(in):: & + sel_rules + + integer (kind=int_kind), intent(in):: & + ncol, & !Length of sub-domain. + nlm, & !Number of layers. + mbs, & !Number of SW spectral intervals. + mbir, & !Number of IR spectral intervals. + ib !Index of spectral interval. + + real (kind=dbl_kind), intent(in), dimension(ncol,mbir):: & + es !Spectral surface emissivity (-). + + real (kind=dbl_kind), intent(in), dimension(ncol,nlm):: & + cldamt, & !Cloud fraction (-). + wc, & !All sky single scattering albedo (-). + wcclr, & !Clear sky single scattering albedo (-). + asym, & !All sky asymmetry factor (-). + asyclr, & !Clear sky asymmetry factor (-). + tau, & !All sky optical depth (-). + tauclr, & !Clear sky optical depth (-). + b1, & !Cloud overlap parameter (-). + b2, & !Cloud overlap parameter (-). + b3, & !Cloud overlap parameter (-). + b4 !Cloud overlap parameter (-). + + real (kind=dbl_kind), intent(in), dimension(ncol,nlm+1):: & + bf !Planck function (W/m^2). + +! OUTPUT ARGUMENTS: +! ----------------- + real (kind=dbl_kind), intent(out), dimension(ncol,nlm+1):: & + fd, & !Spectral downward flux (W/m^2). + fu !Spectral upward flux (W/m^2). + +! LOCAL VARIABLES: + + integer (kind=int_kind):: & + i, & !Horizontal index. + l, & !Vertical index. + ibms, & !Index of spectral interval. + j, & + nsr, & + nsmx, & + n, & + ii, & + jj, & + kk, & + ir, & + iter + integer (kind=int_kind), dimension(16*nlm-6):: & + idc + + integer (kind=int_kind), dimension(4*nlm+2):: & + nir + + real (kind=dbl_kind), dimension(nlm):: & + rrcld, & !All sky global reflection (-). + rrclr, & !Clear sky global reflection (-). + trcld, & !All sky global transmission (-). + trclr, & !Clear sky global transmission (-). + sigucld, & !All sky upwelling source (-). + siguclr, & !Clear sky upwelling source (-). + sigdcld, & !All sky downwelling source (-). + sigdclr, & !Clear sky downwelling source (-). + exptau ! + + real (kind=dbl_kind), dimension(4*nlm+2):: & + b, & + fvc, & + error !, & +! old_fvc + + real (kind=dbl_kind), dimension(16*nlm-6):: & + smx + + real (kind=dbl_kind):: & + aa , bb , beta0 , cc, & + diffac , denom , fact , eggtau, & + ggtau, & + kappa , oms , prop ,r, rinf, & + t , taus , omega + data diffac /2./ + +! SELECTION RULE VARIABLES + + logical (kind=log_kind):: & + fail + + real (kind=dbl_kind):: & + tausthresh, & + wcthresh, & + tauscat + data tausthresh / 0.001 / + data wcthresh / 0.975 / + +!---------------------------------------------------------------------- + nsr = 4*nlm + 2 + nsmx = 16*nlm - 6 + + fd(:,1) = 0. + + ibms = ib - mbs + + do i = 1, ncol + +!---- 2. DO LONGWAVE: + do l = 1, nlm + !ALL SKY + fact = asym(i,l)*asym(i,l) + oms = ((1.-fact)*wc(i,l))/(1.-fact*wc(i,l)) + taus = (1.-fact*wc(i,l))*tau(i,l) + + beta0 = (4.+asym(i,l))/(8.*(1.+asym(i,l))) + t = diffac*(1.-oms*(1.-beta0)) !-0.25 + r = diffac*oms*beta0 !-0.25 + kappa = sqrt(t**2-r**2) + rinf = r/(kappa+t) + ggtau = kappa*taus + + eggtau = exp(-ggtau) + + denom = (1.-rinf**2*eggtau**2) + trcld(l) = (1.-rinf**2)*eggtau/denom + rrcld(l) = rinf*(1.-eggtau**2)/denom + + if(taus .lt. 0.8e-2) then + sigucld(l) = cldamt(i,l)*0.5*diffac*(bf(i,l)+ & + bf(i,l+1))*taus + sigdcld(l) = cldamt(i,l)*sigucld(l) + else + aa = (t+r)*(1.-rrcld(l))-(1.+rrcld(l)-trcld(l))/taus + bb = -(t+r)*trcld(l)+(1.+rrcld(l)-trcld(l))/taus + cc = diffac*(1.-oms)/kappa**2 + sigucld(l) = cldamt(i,l)*cc*(aa*bf(i,l)+bb*bf(i,l+1)) + sigdcld(l) = cldamt(i,l)*cc*(bb*bf(i,l)+aa*bf(i,l+1)) + endif + + !CLEAR SKY + fact = asyclr(i,l)*asyclr(i,l) + oms = ((1.-fact)*wcclr(i,l))/(1.-fact*wcclr(i,l)) + taus = (1.-fact*wcclr(i,l))*tauclr(i,l) + + beta0 = (4.+asyclr(i,l))/(8.*(1.+asyclr(i,l))) + t = diffac*(1.-oms*(1.-beta0)) !-0.25 + r = diffac*oms*beta0 !-0.25 + kappa = sqrt(t**2-r**2) + rinf = r/(kappa+t) + ggtau = kappa*taus + + eggtau = exp(-ggtau) + + denom = (1.-rinf**2*eggtau**2) + trclr(l) = (1.-rinf**2)*eggtau/denom + rrclr(l) = rinf*(1.-eggtau**2)/denom + + if(taus .lt. 0.8e-2) then + siguclr(l) = (1.0-cldamt(i,l))*0.5*diffac*(bf(i,l)+ & + bf(i,l+1))*taus + sigdclr(l) = (1.0-cldamt(i,l))*siguclr(l) + else + aa = (t+r)*(1.-rrclr(l))-(1.+rrclr(l)-trclr(l))/taus + bb = -(t+r)*trclr(l)+(1.+rrclr(l)-trclr(l))/taus + cc = diffac*(1.-oms)/kappa**2 + siguclr(l) = (1.0-cldamt(i,l))*cc*(aa*bf(i,l)+ & + bb*bf(i,l+1)) + sigdclr(l) = (1.0-cldamt(i,l))*cc*(bb*bf(i,l)+ & + aa*bf(i,l+1)) + endif + + enddo + + +!---- 1. LOAD SMX VECTOR + nir(:) = 4 + + idc(1) = 5 + idc(2) = 6 + smx(1) = -trcld(1) * b4(i,1) + smx(2) = -trcld(1) * (1.-b2(i,1)) + nir(1) = 2 + + idc(3) = 5 + idc(4) = 6 + smx(3) = -trclr(1) * (1.-b4(i,1)) + smx(4) = -trclr(1) * b2(i,1) + nir(2) = 2 + + idc(5) = 5 + idc(6) = 6 + smx(5) = -rrcld(1) * b4(i,1) + smx(6) = -rrcld(1) * (1.-b2(i,1)) + nir(3) = 2 + + idc(7) = 5 + idc(8) = 6 + smx(7) = -rrclr(1) * (1.-b4(i,1)) + smx(8) = -rrclr(1) * b2(i,1) + nir(4) = 2 + + do l = 1,nlm-1 + n = (l-1)*16 + 9 + ir = 4*l + + idc(n) = ir-1 + idc(n+1) = ir + idc(n+2) = ir+5 + idc(n+3) = ir+6 + smx(n) = -rrcld(l+1) * b3(i,l+1) + smx(n+1) = -rrcld(l+1) * (1.-b1(i,l+1)) + smx(n+2) = -trcld(l+1) * b4(i,l+1) + smx(n+3) = -trcld(l+1) * (1.-b2(i,l+1)) + + idc(n+4) = ir-1 + idc(n+5) = ir + idc(n+6) = ir+5 + idc(n+7) = ir+6 + smx(n+4) = -rrclr(l+1) * (1.-b3(i,l+1)) + smx(n+5) = -rrclr(l+1) * b1(i,l+1) + smx(n+6) = -trclr(l+1) * (1.-b4(i,l+1)) + smx(n+7) = -trclr(l+1) * b2(i,l+1) + + idc(n+8) = ir-1 + idc(n+9) = ir + idc(n+10) = ir+5 + idc(n+11) = ir+6 + smx(n+8) = -trcld(l+1) * b3(i,l+1) + smx(n+9) = -trcld(l+1) * (1.-b1(i,l+1)) + smx(n+10) = -rrcld(l+1) * b4(i,l+1) + smx(n+11) = -rrcld(l+1) * (1.-b2(i,l+1)) + + idc(n+12) = ir-1 + idc(n+13) = ir + idc(n+14) = ir+5 + idc(n+15) = ir+6 + smx(n+12) = -trclr(l+1) * (1.-b3(i,l+1)) + smx(n+13) = -trclr(l+1) * b1(i,l+1) + smx(n+14) = -rrclr(l+1) * (1.-b4(i,l+1)) + smx(n+15) = -rrclr(l+1) * b2(i,l+1) + enddo + + ir = 4*nlm + + idc(16*nlm-7) = 4*nlm-1 + idc(16*nlm-6) = 4*nlm + smx(16*nlm-7) = 0.0 !1.-es(i,ibms) + smx(16*nlm-6) = 0.0 !1.-es(i,ibms) + nir(ir+1) = 1 + nir(ir+2) = 1 + + b(:) = 0.0 + do l = 1,nlm + b(l*4-3) = sigucld(l) + b(l*4-2) = siguclr(l) + b(l*4-1) = sigdcld(l) + b(l*4) = sigdclr(l) + enddo + b(nlm*4+1) = cldamt(i,nlm)*es(i,ibms)*bf(i,nlm+1) + b(nlm*4+2) = (1.-cldamt(i,nlm))*es(i,ibms)*bf(i,nlm+1) + + + + +!-------------- GAUSS SEIDEL W/ OVERRELAXATION ------------------ + omega = 1.0 + + fvc(:) = b(:) + + do iter=1,200 + kk = 1 + do ii=1,nsr + t = 0.0 + do j=1,nir(ii) + jj = idc(kk) + t = t + smx(kk) * fvc(jj) + kk = kk + 1 + enddo + t = t + fvc(ii) + fvc(ii) = fvc(ii) + omega * (b(ii)-t) + error(ii) = b(ii) - t + enddo + + if (maxval(abs(error)) .le. 0.05) then + !print *,omega,iter,' iterations' + exit + endif + enddo + + +!---- 3. SUM CLEAR AND CLOUDY FLUXES + do l = 1,nlm+1 + fu(i,l) = fvc(l*4-3)+fvc(l*4-2) + enddo + do l = 1,nlm + fd(i,l+1) = fvc(l*4-1)+fvc(l*4) + enddo + + end do !i=1,ncol + + return + end subroutine two_rt_lw_iter + + +! CVS: $Id: two_rt_lw_sel.F,v 1.3 2003/11/11 21:55:13 norm Exp $ +! CVS: $Name: $ + + +!----------------------------------------------------------------------- + + subroutine two_rt_lw_sel & + ( & + ncol , nlm , mbs , mbir , ib, & + tauclr , es , bf , fu , fd & + ) + + use bugs_kinds + + + + + implicit none + +!----------------------------------------------------------------------- +! REFERENCES: +! two_rt_lw replaces two_rt and add written by G. Stephens. two_rt_lw +! computes the spectral fluxes using a two-stream approximation method. +! Philip Partain, Philip Gabriel, and Laura D. Fowler/graben (09-08-99). + +! MODIFICATIONS: +! * changed declarations to adapt the code from BUGS4 to BUGS5. +! Laura D. Fowler/slikrock (02-01-00). + +! SUBROUTINES CALLED: +! none. + +! FUNCTIONS CALLED: +! none. + +! INCLUDED COMMONS: +! none. + +! ARGUMENT LIST VARIABLES: +! All arrays indexed as nlm correspond to variables defined in the +! middle of layers. All arrays indexed as nlm+1 correspond to variables +! defined at levels at the top and bottom of layers. + +! INPUT ARGUMENTS: +! ---------------- + integer (kind=int_kind), intent(in):: & + ncol, & !Length of sub-domain. + nlm, & !Number of layers. + mbs, & !Number of SW spectral intervals. + mbir, & !Number of IR spectral intervals. + ib !Index of spectral interval. + + real (kind=dbl_kind), intent(in), dimension(ncol,mbir):: & + es ! Spectral surface emissivity (-). + real (kind=dbl_kind), intent(in), dimension(ncol,nlm):: & + tauclr !Optical depth (-). + real (kind=dbl_kind), intent(in), dimension(ncol,nlm+1):: & + bf !Planck function (-). + +! OUTPUT ARGUMENTS: +! ----------------- + real (kind=dbl_kind), intent(out), dimension(ncol,nlm+1):: & + fd, & !Spectral downward flux (W/m^2). + fu !Spectral upward flux (W/m^2). + +! LOCAL VARIABLES: + + integer (kind=int_kind):: & + i, & !Horizontal index. + l, & !Vertical index. + ibms !Index of spectral interval. + + real (kind=dbl_kind), dimension(nlm):: & + sigu, & + sigd, & + exptau + + real (kind=dbl_kind):: & + aa, & + bb, & + cc, & + prop + +!---------------------------------------------------------------------- + + + ibms = ib - mbs + + do 1000 i = 1, ncol + + !TOA/BOA initializations + fu(i,nlm+1) = bf(i,nlm+1)*es(i,ibms) + fd(i,1) = 0. + + do l=1,nlm + exptau(l) = exp(-2.*tauclr(i,l)) + if(tauclr(i,l) .lt. 0.8e-2) then + sigu(l) = (bf(i,l)+bf(i,l+1))*tauclr(i,l) + sigd(l) = sigu(l) + else + prop = (1.-exptau(l))/tauclr(i,l) + aa = 2.-prop + bb = -2.*exptau(l)+prop + cc = 0.5 + sigu(l) = (aa*bf(i,l)+bb*bf(i,l+1))*cc + sigd(l) = (bb*bf(i,l)+aa*bf(i,l+1))*cc + endif + fd(i,l+1) = sigd(l) + exptau(l) * fd(i,l) + enddo + + do l=nlm,1,-1 + fu(i,l) = sigu(l) + exptau(l) * fu(i,l+1) + enddo + +1000 continue + + return + end subroutine two_rt_lw_sel + + +! CVS: $Id: two_rt_sw_bs.F,v 1.3 2003/11/11 21:55:13 norm Exp $ +! CVS: $Name: $ + +!----------------------------------------------------------------------- + + subroutine two_rt_sw_bs & + ( ncol , nlm , mbs , ib, & + slr , amu0 , wc , wcclr, & + asym , asyclr , tau , tauclr, & + asdir , asdif , fudif , fddir, & + fddif ,sel_rules , b1 , b2, & + b3 , b4 & + ) + + + use bugs_kinds + use bandsolve + + + + implicit none + +!----------------------------------------------------------------------- +! REFERENCES: +! two_rt_sw replaces two_rt and add written by G. Stephens. two_rt_sw +! computes the spectral fluxes using a two-stream approximation method. +! Philip Partain, Philip Gabriel, and Laura D. Fowler/graben (09-08-99). + +! MODIFICATIONS: +! * changed declarations to adapt the code from BUGS4 to BUGS5. +! Laura D. Fowler/slikrock (02-01-00). + +! SUBROUTINES CALLED: +! none. + +! FUNCTIONS CALLED: +! none. + +! INCLUDED COMMONS: +! none. + +! ARGUMENT LIST VARIABLES: +! All arrays indexed as nlm correspond to variables defined in the +! middle of layers. All arrays indexed as nlm+1 correspond to variables +! defined at levels at the top and bottom of layers. + +! INPUT ARGUMENTS: +! ---------------- + logical (kind=log_kind), intent(in):: & + sel_rules + + integer (kind=int_kind), intent(in):: & + ncol, & !Length of sub-domain. + nlm, & !Number of layers. + mbs, & !Number of SW spectral intervals. + ib !Index of spectral interval. + + real (kind=dbl_kind), intent(in), dimension(ncol):: & + slr, & !Fraction of daylight (-). + amu0 !Cosine of the solar zenith angle (-). + + real (kind=dbl_kind), intent(in), dimension(ncol,mbs):: & + asdir, & !Spectral direct surface albedo (-). + asdif !Spectral diffuse surface albedo (-). + + real (kind=dbl_kind), intent(in), dimension(ncol,nlm):: & + wc, & !Single scattering albedo (-). + wcclr, & !Single scattering albedo (-). + asym, & !Asymmetry factor (-). + asyclr, & !Asymmetry factor (-). + tau, & !Optical depth (-). + tauclr, & !Optical depth (-). + b1, & !Cloud overlap parameter (-). + b2, & !Cloud overlap parameter (-). + b3, & !Cloud overlap parameter (-). + b4 !Cloud overlap parameter (-). + +! OUTPUT ARGUMENTS: +! ----------------- + real (kind=dbl_kind), intent(out), dimension(ncol,nlm+1):: & + fddir, & !Spectral direct downward flux (W/m^2). + fddif, & !Spectral diffuse downward flux (W/m^2). + fudif !Spectral diffuse upward flux (W/m^2). + +! LOCAL VARIABLES: +! ---------------- + integer (kind=int_kind):: & + i, & ! Horizontal index. + l ! Vertical index. + + integer (kind=int_kind), dimension(nlm*4+2):: & + indx !Vector used by bandec and banbks + + real (kind=dbl_kind), dimension(nlm):: & + rrcld, & !All sky global reflection + rrclr, & !Clear sky global reflection + trcld, & !All sky global transmission + trclr, & !Clear sky global transmission + sigucld, & !All sky upwelling source + siguclr, & !Clear sky upwelling source + sigdcld, & !All sky downwelling source + sigdclr !Clear sky downwelling source + + real (kind=dbl_kind), dimension(nlm*4+2,11):: & + a, & !Diagonal matrix for bandec and banbks + al !Matrix used by bandec and banbks + + real (kind=dbl_kind), dimension(nlm*4+2):: & + b !Vector of sources (for A*x = b) + + real (kind=dbl_kind):: & + exptaucld, & + exptauclr, & + directcld(nlm+1), & + directclr(nlm+1), & + d + + real (kind=dbl_kind):: & + aa , bb , cc , denom, & + eggtau , eps , g3 , g4, & + ggtau , kappa , r , rinf, & + t , oms , taus , fact, & + asy + data eps /1.e-02/ + + real (kind=dbl_kind), dimension(nlm+1):: & + re , vd + +! SELECTION RULE VARIABLES: +! ------------------------- + logical (kind=log_kind):: & + fail + + real (kind=dbl_kind):: & + tausthresh, & + wcthresh, & + tauscat + +!#ifdef usenewexp +! real(kind=dbl_kind), external :: exp +!#endif + +! data tausthresh / 0.001 / +! data wcthresh / 0.975 / + data tausthresh / 0.01 / + data wcthresh / 0.98 / + +!---------------------------------------------------------------------- + + do 1000 i = 1, ncol + +! if (sel_rules) then +! fail = .false. +! tauscat = 0.0 +! do l = nlm, 1, -1 +! if (wc(i,l).gt.wcthresh) fail = .true. +! tauscat = tauscat + wc(i,l)*tau(i,l) +! enddo +! if (fail.and.tauscat.ge.tausthresh) goto 2000 +! +!!>> BEGIN SELECTION RULES << +!! print *,'selection rules' +! fddir(i,1) = amu0(i)*slr(i) +! fddif(i,:) = 0.0 +! do l=1,nlm +! fddir(i,l+1) = fddir(i,l) * exp(-1.*tau(i,l)/amu0(i)) +! enddo +! +! fudif(i,nlm+1) = fddir(i,nlm+1) * asdir(i,ib) +! +! do l=nlm,1,-1 +! fudif(i,l) = fudif(i,l+1) * exp(-2.*tau(i,l)) +! enddo +! +! cycle +! endif +!!>> END SELECTION RULES << + +!>> BEGIN FULL CALCULATION << +2000 directcld(1) = 0. + directclr(1) = 1. + re(1) = 0. + vd(1) = 0. +! print *,'full up calculation' + +!---- 1. DO SHORTWAVE: + !ALL SKY + do l = 1, nlm + fact = asym(i,l)*asym(i,l) + oms = ((1.-fact)*wc(i,l))/(1.-fact*wc(i,l)) + taus = (1.-fact*wc(i,l))*tau(i,l) + asy = asym(i,l)/(1.+asym(i,l)) + + exptaucld = exp(-taus/amu0(i)) + +!--- local coefficients: delta-eddington + t = 0.25 * (7. - oms*(4.+3.*asy)) + r = -0.25 * (1. - oms*(4.-3.*asy)) + kappa = sqrt(t**2-r**2) + rinf = r/(kappa+t) + ggtau = kappa*taus + + eggtau = exp(-ggtau) + denom = (1.-rinf**2*eggtau**2) + trcld(l) = (1.-rinf**2)*eggtau/denom + rrcld(l) = rinf*(1.-eggtau**2)/denom + + if(abs(kappa**2-1./amu0(i)**2) .lt. eps) then + fact = 1./eps + else + fact = 1./(kappa**2-1./amu0(i)**2) + endif + !cc = oms*slr(i)*fact + cc = oms*fact + g3 = 0.5-0.75*asy*amu0(i) + g4 = 1.-g3 + aa = g3*(t-1./amu0(i))+g4*r + bb = g4*(t+1./amu0(i))+g3*r + + sigucld(l)=cc*((aa-rrcld(l)*bb)-aa*trcld(l)*exptaucld)* & + (b3(i,l)*directcld(l)+(1.-b1(i,l))*directclr(l)) + sigdcld(l)=cc*(-bb*trcld(l)+(bb-rrcld(l)*aa)*exptaucld)* & + (b3(i,l)*directcld(l)+(1.-b1(i,l))*directclr(l)) + + !CLEAR SKY + fact = asyclr(i,l)*asyclr(i,l) + oms = ((1.-fact)*wcclr(i,l))/(1.-fact*wcclr(i,l)) + taus = (1.-fact*wcclr(i,l))*tauclr(i,l) + asy = asyclr(i,l)/(1.+asyclr(i,l)) + + exptauclr = exp(-taus/amu0(i)) + + +!--- local coefficients: delta-eddington + t = 0.25 * (7. - oms*(4.+3.*asy)) + r = -0.25 * (1. - oms*(4.-3.*asy)) + kappa = sqrt(t**2-r**2) + rinf = r/(kappa+t) + ggtau = kappa*taus + + eggtau = exp(-ggtau) + + denom = (1.-rinf**2*eggtau**2) + trclr(l) = (1.-rinf**2)*eggtau/denom + rrclr(l) = rinf*(1.-eggtau**2)/denom + + if(abs(kappa**2-1./amu0(i)**2) .lt. eps) then + fact = 1./eps + else + fact = 1./(kappa**2-1./amu0(i)**2) + endif + !cc = oms*slr(i)*fact + cc = oms*fact + g3 = 0.5-0.75*asy*amu0(i) + g4 = 1.-g3 + aa = g3*(t-1./amu0(i))+g4*r + bb = g4*(t+1./amu0(i))+g3*r + + siguclr(l)=cc*((aa-rrclr(l)*bb)-aa*trclr(l)*exptauclr)* & + (b1(i,l)*directclr(l)+(1.-b3(i,l))*directcld(l)) + sigdclr(l)=cc*(-bb*trclr(l)+(bb-rrclr(l)*aa)*exptauclr)* & + (b1(i,l)*directclr(l)+(1.-b3(i,l))*directcld(l)) + + directclr(l+1) = exptauclr * & + ((1.-b3(i,l))*directcld(l) + b1(i,l)*directclr(l)) + directcld(l+1) = exptaucld * & + (b3(i,l)*directcld(l) + (1.-b1(i,l))*directclr(l)) + enddo + +!---- 2. LOAD A MATRIX, B MATRIX + a(:,:) = 0.0 + + a(1,6) = -1.0 + a(1,10) = trcld(1) * b4(i,1) + a(1,11) = trcld(1) * (1.-b2(i,1)) + + a(2,6) = -1.0 + a(2,9) = trclr(1) * (1.-b4(i,1)) + a(2,10) = trclr(1) * b2(i,1) + + a(3,6) = -1.0 + a(3,8) = rrcld(1) * b4(i,1) + a(3,9) = rrcld(1) * (1.-b2(i,1)) + + a(4,6) = -1.0 + a(4,7) = rrclr(1) * (1.-b4(i,1)) + a(4,8) = rrclr(1) * b2(i,1) + + do l = 2,nlm + a(l*4-3,4) = rrcld(l) * b3(i,l) + a(l*4-3,5) = rrcld(l) * (1.-b1(i,l)) + a(l*4-3,6) = -1.0 + a(l*4-3,10) = trcld(l) * b4(i,l) + a(l*4-3,11) = trcld(l) * (1.-b2(i,l)) + + a(l*4-2,3) = rrclr(l) * (1.-b3(i,l)) + a(l*4-2,4) = rrclr(l) * b1(i,l) + a(l*4-2,6) = -1.0 + a(l*4-2,9) = trclr(l) * (1.-b4(i,l)) + a(l*4-2,10) = trclr(l) * b2(i,l) + + a(l*4-1,2) = trcld(l) * b3(i,l) + a(l*4-1,3) = trcld(l) * (1.-b1(i,l)) + a(l*4-1,6) = -1.0 + a(l*4-1,8) = rrcld(l) * b4(i,l) + a(l*4-1,9) = rrcld(l) * (1.-b2(i,l)) + + a(l*4,1) = trclr(l) * (1.-b3(i,l)) + a(l*4,2) = trclr(l) * b1(i,l) + a(l*4,6) = -1.0 + a(l*4,7) = rrclr(l) * (1.-b4(i,l)) + a(l*4,8) = rrclr(l) * b2(i,l) + enddo + + a(nlm*4+1,4) = asdif(i,ib) + a(nlm*4+1,6) = -1.0 + a(nlm*4+2,4) = asdif(i,ib) + a(nlm*4+2,6) = -1.0 + + b(:) = 0.0 + do l = 1,nlm +! b(l*4-3) = -1.*(b3(i,l)*sigucld(l) + (1.-b1(i,l)) *siguclr(l)) +! b(l*4-2) = -1.*((1.-b3(i,l))*sigucld(l) + b1(i,l) *siguclr(l)) +! b(l*4-1) = -1.*(b3(i,l)*sigdcld(l) + (1.-b1(i,l)) *sigdclr(l)) +! b(l*4) = -1.*((1.-b3(i,l))*sigdcld(l) + b1(i,l) *sigdclr(l)) + b(l*4-3) = -sigucld(l) + b(l*4-2) = -siguclr(l) + b(l*4-1) = -sigdcld(l) + b(l*4) = -sigdclr(l) + enddo + b(nlm*4+1) = -asdir(i,ib)*directcld(nlm+1)*amu0(i) + b(nlm*4+2) = -asdir(i,ib)*directclr(nlm+1)*amu0(i) + +! do l = 1,nlm*4+2 +! print '(15E15.7)',(a(l,k),k=1,11) +! enddo + +! do l = 1,nlm*4+2 +! print *,l,b(l) +! enddo +! + call bandec(a,nlm*4+2,5,5,nlm*4+2,11,al,11,indx,d) + call banbks(a,nlm*4+2,5,5,nlm*4+2,11,al,11,indx,b) + +!---- 3. SUM CLEAR AND CLOUDY FLUXES + do l = 1,nlm+1 + fudif(i,l) = slr(i)*(b(l*4-3)+b(l*4-2)) + enddo + do l = 1,nlm + fddif(i,l+1) = slr(i)*(b(l*4-1)+b(l*4)) + enddo + + fddir(i,1) = amu0(i)*slr(i) + do l = 1, nlm + fddir(i,l+1) = amu0(i)*slr(i)* & + (directcld(l+1)+directclr(l+1)) + enddo +! do l = 1, nlm+1 +! print *,ib,l,fddir(l),fddif(l),fudif(l) +! enddo +!>> END FULL CALCULATION << + + 1000 continue + + return + end subroutine two_rt_sw_bs + + +! CVS: $Id: two_rt_sw.F,v 1.7 2006/11/16 21:19:38 norm Exp $ +! CVS: $Name: $ + +!NBW This has been modified to apply delta-M descaling +!NBW to the direct and diffuse downwelling fluxes + + +!----------------------------------------------------------------------- + + subroutine two_rt_sw & + ( ncol , nlm , mbs , ib, & + slr , amu0 , wc , asym, & + tau , asdir , asdif , fudif, & + fddir , fddif ,sel_rules & + ) + + use bugs_kinds + + + + implicit none + +!----------------------------------------------------------------------- +! REFERENCES: +! two_rt_sw replaces two_rt and add written by G. Stephens. two_rt_sw +! computes the spectral fluxes using a two-stream approximation method. +! Philip Partain, Philip Gabriel, and Laura D. Fowler/graben (09-08-99). + +! MODIFICATIONS: +! * changed declarations to adapt the code from BUGS4 to BUGS5. +! Laura D. Fowler/slikrock (02-01-00). + +! SUBROUTINES CALLED: +! none. + +! FUNCTIONS CALLED: +! none. + +! INCLUDED COMMONS: +! none. + +! ARGUMENT LIST VARIABLES: +! All arrays indexed as nlm correspond to variables defined in the +! middle of layers. All arrays indexed as nlm+1 correspond to variables +! defined at levels at the top and bottom of layers. + +! INPUT ARGUMENTS: +! ---------------- + logical (kind=log_kind), intent(in):: & + sel_rules + + integer (kind=int_kind), intent(in):: & + ncol, & !Length of sub-domain. + nlm, & !Number of layers. + mbs, & !Number of SW spectral intervals. + ib !Index of spectral interval. + + real (kind=dbl_kind), intent(in), dimension(ncol):: & + slr, & !Fraction of daylight (-). + amu0 !Cosine of the solar zenith angle (-). + + real (kind=dbl_kind), intent(in), dimension(ncol,mbs):: & + asdir, & !Spectral direct surface albedo (-). + asdif !Spectral diffuse surface albedo (-). + + real (kind=dbl_kind), intent(in), dimension(ncol,nlm):: & + wc, & !Single scattering albedo (-). + asym, & !Asymmetry factor (-). + tau !Optical depth (-). + +! OUTPUT ARGUMENTS: +! ----------------- + real (kind=dbl_kind), intent(out), dimension(ncol,nlm+1):: & + fddir, & !Spectral direct downward flux (W/m^2). + fddif, & !Spectral diffuse downward flux (W/m^2). + fudif !Spectral diffuse upward flux (W/m^2). + +! LOCAL VARIABLES: + + integer (kind=int_kind):: & + i, & ! Horizontal index. + l ! Vertical index. + + real (kind=dbl_kind), dimension(nlm):: & + rr, & ! + tr, & ! + sigu, & ! + sigd ! + + real (kind=dbl_kind):: & + exptau_s(nlm),direct_s(nlm+1),exptau_us(nlm),direct_us(nlm+1) + + real (kind=dbl_kind):: & + aa , bb , cc , denom, & + eggtau , eps , g3 , g4, & + ggtau , kappa , r , rinf, & + t , oms , taus , fact, & + asy , prop, fd_total + data eps /1.e-02/ + + real (kind=dbl_kind), dimension(nlm):: & + td , vu + + real (kind=dbl_kind), dimension(nlm+1):: & + re , vd + +! SELECTION RULE VARIABLES + + logical (kind=log_kind):: & + fail + + real (kind=dbl_kind):: & + tausthresh, & + wcthresh, & + tauscat + + +! data tausthresh / 0.001 / +! data wcthresh / 0.975 / + data tausthresh / 0.01 / + data wcthresh / 0.98 / + +!---------------------------------------------------------------------- + + do 1000 i = 1, ncol + + if(sel_rules) then + + fail = .false. + tauscat = 0.0 + do l = nlm, 1, -1 + if (wc(i,l).gt.wcthresh) fail = .true. + tauscat = tauscat + wc(i,l)*tau(i,l) + enddo + + if (fail.and.tauscat.ge.tausthresh) goto 2000 + +!>> BEGIN SELECTION RULES << + print *,'selection rules' + fddir(i,1) = amu0(i)*slr(i) + fddif(i,:) = 0.0 + do l = 1, nlm + fddir(i,l+1) = fddir(i,l) * exp(-1.*tau(i,l)/amu0(i)) + enddo + fudif(i,nlm+1) = fddir(i,nlm+1) * asdir(i,ib) + + do l = nlm, 1, -1 + fudif(i,l) = fudif(i,l+1) * exp(-2.*tau(i,l)) + enddo + + cycle + + endif +!>> END SELECTION RULES << + +!>> BEGIN FULL CALCULATION << +2000 direct_s(1) = 1. + direct_us(1) = 1. + re(1) = 0. + vd(1) = 0. + + do l = 1, nlm + !delta-M on + fact = asym(i,l)*asym(i,l) + asy = asym(i,l)/(1.+asym(i,l)) !Orig w/ delta M + !This is the delta-M scaling approx + !delta-M off + !fact = 0. + !asy = asym(i,l) + !End delta-M on/off + oms = ((1.-fact)*wc(i,l))/(1.-fact*wc(i,l)) + taus = (1.-fact*wc(i,l))*tau(i,l) + + + exptau_s(l) = exp(-taus/amu0(i)) !delta-M scaled + direct_s(l+1) = exptau_s(l)*direct_s(l) !delta-M scaled + exptau_us(l) = exp(-tau(i,l)/amu0(i)) !unscaled + direct_us(l+1) = exptau_us(l)*direct_us(l) !unscaled + +!---- local coefficients: delta-eddington + t = 0.25 * (7. - oms*(4.+3.*asy)) + r = -0.25 * (1. - oms*(4.-3.*asy)) + kappa = sqrt(t**2-r**2) + rinf = r/(kappa+t) + ggtau = kappa*taus + eggtau = exp(-ggtau) + denom = (1.-rinf**2*eggtau**2) + tr(l) = (1.-rinf**2)*eggtau/denom + rr(l) = rinf*(1.-eggtau**2)/denom + + if(abs(kappa**2-1./amu0(i)**2) .lt. eps) then + fact = 1./eps + else + fact = 1./(kappa**2-1./amu0(i)**2) + endif + cc = oms*slr(i)*fact + g3 = 0.5-0.75*asy*amu0(i) + g4 = 1.-g3 + aa = g3*(t-1./amu0(i))+g4*r + bb = g4*(t+1./amu0(i))+g3*r + sigu(l) = cc*((aa-rr(l)*bb)-aa*tr(l)*exptau_s(l)) & + * direct_s(l) + sigd(l) = cc*(-bb*tr(l)+(bb-rr(l)*aa)*exptau_s(l)) & + * direct_s(l) + enddo + +!---- 1. do adding, going from top down: + + do l = 1, nlm + prop = 1. / (1. - re(l)*rr(l)) + re(l+1) = rr(l) + tr(l)**2*re(l)*prop + vd(l+1) = sigd(l) + (tr(l)*vd(l) & + + tr(l)*re(l)*sigu(l))*prop + vu(l) = (rr(l)*vd(l) + sigu(l))*prop + td(l) = prop + enddo + +!---- 2. calculate diffuse fluxes: + + fddif(i,1) = 0. + fudif(i,nlm+1) = (asdif(i,ib)*vd(nlm+1) & + + asdir(i,ib)*slr(i)*amu0(i)*direct_s(nlm+1)) & + / (1.-asdif(i,ib)*re(nlm+1)) + + do l = nlm+1, 2, -1 + fddif(i,l) = re(l)*fudif(i,l) + vd(l) + fudif(i,l-1) = tr(l-1)*fudif(i,l)*td(l-1) + vu(l-1) + enddo + +!---- 3. Compute direct flux and descale the direct and diffuse fluxes + fddir(i,1) = amu0(i)*slr(i) + do l = 1, nlm + fd_total = amu0(i)*slr(i)*direct_s(l+1) + fddif(i,l+1) + fddir(i,l+1) = amu0(i)*slr(i)*direct_us(l+1) + fddif(i,l+1) = fd_total - fddir(i,l+1) + enddo + +!>> END FULL CALCULATION << + + 1000 continue + return + end subroutine two_rt_sw + +!------------------------------------------------------------------------ diff --git a/src/radiate/bugsrad/bugs_rad.f90 b/src/radiate/bugsrad/bugs_rad.f90 new file mode 100644 index 0000000..6825a50 --- /dev/null +++ b/src/radiate/bugsrad/bugs_rad.f90 @@ -0,0 +1,576 @@ + + +! CVS: $Id: bugs_rad.F,v 1.7 2003/11/12 20:37:49 norm Exp $ +! CVS: $Name: $ + +!------------------------------------------------------------------------ + + subroutine bugs_rad & + ( nlen , len , nlm , pl2, & + pl , dpl , tl , ql, & + qcwl , ncwl, qcil , qril , o3l, & + ts , amu0 , slr , alvdf, & + alndf , alvdr , alndr , s0, & + grav , cp , asl , atl, & + fdsw , fusw , fdlw , fulw, & + acld, umco2, umch4, umn2o ) + + use bugs_kinds + + + implicit none + +!------------------------------------------------------------------------ +! bugs_rad is the driver for the parameterization of the cloud fraction, +! cloud optical properties, and long and short wave radiative fluxes. + +! REFERENCES: +! Laura D. Fowler, and Phil Partain /slikrock (01-11-98). + +! MODIFICATIONS: +! * added 1 compiler directive; Phil Partain (04-04-00). + +! * changed declarations to adapt the code from BUGS4 to BUGS5. +! Laura D. Fowler/slikrock (02-01-00). + +! SUBROUTINES CALLED: +! EAUcf :Calculation of the cloud fraction. +! EAUcfQPs :Calculation of diagnostics related to EAUcf. +! BUGSlwr :Calculation of LW radiative heating rates and fluxes. +! BUGSswr :Calculation of SW radiative heating rates and fluxes. +! BUGSradQPs:Calculation of diagnostics related to BUGSlwr and +! BUGSswr. +! note: EAUcf, EAUcfQPs, and BUGSradQPs are not called in the offline +! version of this code. + +! FUNCTIONS CALLED: +! none. + +! INCLUDED COMMON BLOCKS: +! none. + +! ARGUMENT LIST VARIABLES: +! INPUT ARGUMENTS: +! ---------------- + integer (kind=int_kind), intent(in):: & + nlen, & !Length of total domain. + len, & !Length of sub domain. + nlm !Number of layers. + + real (kind=dbl_kind), intent(in):: & + grav, & !Gravitational constant + cp, & !Constant pressure spec. heat of dry air (J/(K-kg)). + s0 !Solar constant (W/m^-2). + + real (kind=dbl_kind), intent(in), dimension(nlen):: & + ts, & !Surface temperature (K). + amu0, & !Cosine of solar zenith angle (-). + slr, & !Fraction of daylight (-). + alvdr, & !Visible direct surface albedo (-). + alndr, & !Near-IR direct surface albedo (-). + alvdf, & !Visible diffuse surface albedo (-). + alndf !Near-IR diffuse surface albedo (-). + + real (kind=dbl_kind), intent(in), dimension(nlen,nlm):: & + pl, & !Layer pressure (hPa). + dpl, & !Layer thickness (hPa). + tl, & !Temperature (K). + ql, & !Specific humidity (kg/kg). + qcwl, & !Cloud water mixing ratio (kg/kg). + ncwl, & !Cloud water mixing ratio (kg/kg). + qcil, & !Cloud ice mixing ratio (kg/kg). + qril, & !Snow mixing ratio (kg/kg). + o3l !Ozone mixing ratio (kg/kg). + + real (kind=dbl_kind), intent(in), dimension(nlen,nlm+1):: & + pl2 !Level pressure (hPa). + + real (kind=dbl_kind), intent(in), dimension(nlen,nlm):: & + acld !Radiative cloud fraction + ! (-). + real (kind=dbl_kind), intent(in), dimension(nlen) :: & + umco2, & !Concentration of CO2 (ppm). + umch4, & !Concentration of CH4 (ppm). + umn2o !Concentration of N2O (ppm). + + + +! OUTPUT ARGUMENTS: +! ------------------ + real (kind=dbl_kind), dimension(nlen):: & + radvbc, & !SFC visible direct net SW radiation (W/m^-2). + radvdc, & !SFC visible diffuse net SW radiation (W/m^-2). + radnbc, & !SFC near-ir direct net SW radiation (W/m^-2). + radndc, & !SFC near-ir diffuse net SW radiation (W/m^-2). + radvbcc, & !SFC visible direct clear net SW radiation (W/m^-2). + radvdcc, & !SFC visible diffuse clear net SW radiation (W/m^-2). + radnbcc, & !SFC near-ir direct clear net SW radiation (W/m^-2). + radndcc !SFC near-ir diffuse clear net SW radiation (W/m^-2). + + real (kind=dbl_kind), dimension(len,nlm+1):: & + fdsw, & !Downward SW flux (W/m^-2). + fusw, & !Upward SW flux (W/m^-2). + fdlw, & !Downward LW flux (W/m^-2). + fulw, & !Upward LW flux (W/m^-2). + fdswcl, & !Downward clear-sky SW flux (W/m^-2). + fuswcl, & !Upward clear-sky SW flux (W/m^-2). + fdlwcl, & !Downward clear-sky LW flux (W/m^-2). + fulwcl !Upward clear-sky LW flux (W/m^-2). + + real (kind=dbl_kind), dimension(nlen,nlm):: & + atl, & !All-sky LW radiative heating rate (K/s). + asl, & !All-sky SW radiative heating rate (K/s). + atlcl, & !Clear-sky LW radiative heating rate (K/s). + aslcl !Clear-sky SW radiative heating rate (K/s). + +! LOCAL VARIABLES: + + character(len=80), save:: & + cvs_version1, & + cvs_version2 + + logical (kind=log_kind):: & + sel_rules_lw, & + sel_rules_sw + + logical (kind=log_kind), dimension(len):: & + bitx !Scans daytime grid-points (-). + + integer (kind=int_kind):: & + i, l, ll, & + nnp, & !Number of layers plus one (TOA "sponge" layer). + nday !Number of daytime grid-points . + + integer (kind=int_kind), dimension(len):: & + iday !Location of daytime grid-points. + + real (kind=dbl_kind):: & + heat_fac !Mutiplying factor . + + real (kind=dbl_kind), dimension(len):: & + ts_loc, & !Local surface temperature (K). + amu0_loc, & !Local cosine of solar zenith angle (-). + slr_loc, & !Local fraction of daylight (-). + alvdr_loc, & !Local visible direct surface albedo (-). + alndr_loc, & !Local near-IR direct surface albedo (-). + alvdf_loc, & !Local visible diffuse surface albedo (-). + alndf_loc, & !Local near-IR diffuse surface albedo (-). + acldmx, & !Local Maximum cloud fraction (-). + den, & !Multiplying factor . + delf, & !Net flux + delfcl, & !Net flux (clear) + radvbc_loc, & !Local SFC visible direct net SW radiation (W/m^-2). + radvdc_loc, & !Local SFC visible direct net SW radiation (W/m^-2). + radnbc_loc, & !Local SFC near-ir direct net SW radiation (W/m^-2). + radndc_loc, & !Local SFC near-ir direct net SW radiation (W/m^-2). + radvbcc_loc, & !As radvbc_loc, but clear-sky (W/m^-2). + radvdcc_loc, & !As radvbc_loc, but clear-sky (W/m^-2). + radnbcc_loc, & !As radncb_loc, but clear-sky (W/m^-2). + radndcc_loc !As radncb_loc, but clear-sky (W/m^-2). + + real (kind=dbl_kind), dimension(len,nlm):: & + pl_loc, & !Local layer pressure (hPa). + dpl_loc, & !Local layer thickness (hPa). + tl_loc, & !Local temperature (K). + ql_loc, & !Local specific humidity (kg/kg). + qcwl_loc, & !Local cloud water mixing ratio (kg/kg). + ncwl_loc, & !Local cloud water mixing ratio (kg/kg). + qcil_loc, & !Local cloud ice mixing ratio (kg/kg). + o3l_loc, & !Local ozone mixing ratio (kg/kg). + acld_loc, & !Local radiative cloud fraction (-). + rmix, & !Water vapor mixing ratio (kg/kg). + cwrho, & !Density of cloud water (g/m^-3). + nwrho, & !Density of cloud water (g/m^-3). + cirho, & !Density of cloud ice (g/m^-3). + o3mix, & !Ozone mixing ratio (kg/kg). + b1, & !Cloud overlap parameter (-). + b2, & !Cloud overlap parameter (-). + b3, & !Cloud overlap parameter (-). + b4 !Cloud overlap parameter (-). + + real (kind=dbl_kind), dimension(len,nlm+1):: & + pl2_loc !Local level pressure (hPa). + + real (kind=dbl_kind), dimension(:), allocatable:: & + ts_day, & !As ts_loc, but for daytime grid-points (K). + amu0_day, & !As amu0_loc,but for daytime grid-points (-). + slr_day, & !As slr_loc,but for daytime grid-points (-). + alvdf_day, & !As alvdf_loc,but for daytime grid-points (-). + alndf_day, & !As alndf_loc,but for daytime grid-points (-). + alvdr_day, & !As alvdr_loc,but for daytime grid-points (-). + alndr_day, & !As alndr_loc,but for daytime grid-points (-). + acldmx_day !As acldmx_loc,but for daytime grid-points (-). + + real (kind=dbl_kind), dimension(:,:), allocatable:: & + pl_day, & !As pl,but for daytime grid-points (hPa). + dpl_day, & !As dpl,but for daytime grid-points (hPa). + tl_day, & !As tl,but for daytime grid-points (K). + rmix_day, & !As rmix,but for daytime grid-points (kg/kg). + cwrho_day, & !As cwrho,but for daytime grid-points (g/m^-3). + nwrho_day, & !As cwrho,but for daytime grid-points (g/m^-3). + cirho_day, & !As cirho,but for daytime grid-points (g/m^-3). + o3mix_day, & !As o3mix,but for daytime grid-points (kg/kg). + acld_day !As acld,but for daytime grid-points (-). + + real (kind=dbl_kind), dimension(:,:), allocatable:: & + pl2_day, & !As pl2_loc, but for daytime grid-points (hPa). + fdsw_day, & !As fdsw, but for daytime grid points (W/m^-2). + fdswcl_day, & !As fdswcl, but for daytime grid points (W/m^-2). + fusw_day, & !As fusw, but for daytime grid points (W/m^-2). + fuswcl_day, &!As fuswcl, but for daytime grid points (W/m^-2). + b1_day, & !As b1, but for daytime grid points (-). + b2_day, & !As b2, but for daytime grid points (-). + b3_day, & !As b3, but for daytime grid points (-). + b4_day !As b4, but for daytime grid points (-). + + real (kind=dbl_kind), dimension(:), allocatable:: & + radvbc_day, & !As radvbc_loc, but for daytime grid-pts (W/m^-2). + radvdc_day, & !As radvbc_loc, but for daytime grid-pts (W/m^-2). + radnbc_day, & !As radnbc_loc, but for daytime grid-pts (W/m^-2). + radndc_day, & !As radnbc_loc, but for daytime grid-pts (W/m^-2). + radvbcc_day, & !As radvbcc, but for daytime grid-pts (W/m^-2). + radvdcc_day, & !As radvbcc, but for daytime grid-pts (W/m^-2). + radnbcc_day, & !As radnbc_loc, but for daytime grid-pts (W/m^-2). + radndcc_day !As radnbc_loc, but for daytime grid-pts (W/m^-2). + + + +!----------------------------------------------------------------------- + !print*,'---- enter subroutine bugs_rad:' + +!---- 1.0 initialization of output variables and arrays: + + acld_loc(:,:) = 0. + fdsw(:,:) = 0. + fdswcl(:,:) = 0. + fusw(:,:) = 0. + fuswcl(:,:) = 0. + fdlw(:,:) = 0. + fdlwcl(:,:) = 0. + fulw(:,:) = 0. + fulwcl(:,:) = 0. + atlcl(1:len,:) = 0. + aslcl(1:len,:) = 0. + atl(1:len,:) = 0. + asl(1:len,:) = 0. + radvbc(1:len) = 0. + radvdc(1:len) = 0. + radnbc(1:len) = 0. + radndc(1:len) = 0. + radvbcc(1:len) = 0. + radvdcc(1:len) = 0. + radnbcc(1:len) = 0. + radndcc(1:len) = 0. + radvbc_loc(1:len) = 0. + radvdc_loc(1:len) = 0. + radnbc_loc(1:len) = 0. + radndc_loc(1:len) = 0. + radvbcc_loc(1:len) = 0. + radvdcc_loc(1:len) = 0. + radnbcc_loc(1:len) = 0. + radndcc_loc(1:len) = 0. + + +!---- 1.1 initialization of local scalars + !print*,'loc1' + + cvs_version1 = & + "Version:$Id: bugs_rad.F,v 1.7 2003/11/12 20:37:49 norm Exp $" + cvs_version2 = & + "Version:$Name: $" + + sel_rules_sw = .false. + sel_rules_lw = .false. + + heat_fac = grav*0.01/cp + +!---- 1.2 initialization of local arrays + !print*,'loc2' + + ts_loc(:) = ts(1:len) + amu0_loc(:) = amu0(1:len) + slr_loc(:) = slr(1:len) + alvdr_loc(:) = alvdr(1:len) + alndr_loc(:) = alndr(1:len) + alvdf_loc(:) = alvdf(1:len) + alndf_loc(:) = alndf(1:len) + + nnp = nlm + pl2_loc(:,:) = pl2(:,:) + pl_loc(:,:) = pl(:,:) + dpl_loc(:,:) = dpl(:,:) + tl_loc(:,:) = tl(:,:) + ql_loc(:,:) = ql(:,:) + qcwl_loc(:,:)= qcwl(:,:) + ncwl_loc(:,:)= ncwl(:,:) + qcil_loc(:,:)= qcil(:,:) + o3l_loc(:,:) = o3l(:,:) + acld_loc(:,:)= acld(1:len,1:nlm) + + !print*,ts_loc,amu0_loc,slr_loc + !print*,alvdr_loc,alndr_loc,alvdf_loc,alndf_loc + !print*,tl(1,nlm-4:nlm),ql(1,nlm-4:nlm) + + do l = 1, nlm + acldmx(1:len) = max(acldmx(1:len),acld_loc(1:len,l)) + enddo +! print*,'bugsrad' +! print*,qcwl_loc(1,:) + + +!--- 2. computation of cloud overlap parameters + !print*,'loc3' + do i = 1, len + b1(i,1) = 1.0 - acld_loc(i,1) + b3(i,1) = 1.0 + do l = 2,nlm + if (acld_loc(i,l-1).eq.1.0) then + b1(i,l) = 1.0 + else + b1(i,l) = (1.0 - max(acld_loc(i,l),acld_loc(i,l-1))) / & + (1.0 - acld_loc(i,l-1)) + endif + if (acld_loc(i,l-1).eq.0.0) then + b3(i,l) = 1.0 + else + b3(i,l) = min(acld_loc(i,l),acld_loc(i,l-1)) / & + acld_loc(i,l-1) + endif + enddo + + b2(i,nlm) = 1.0 - acld_loc(i,nlm) + b4(i,nlm) = 1.0 + do l = 1,nlm-1 + if (acld_loc(i,l+1).eq.1.0) then + b2(i,l) = 1.0 + else + b2(i,l) = (1.0 - max(acld_loc(i,l),acld_loc(i,l+1))) / & + (1.0 - acld_loc(i,l+1)) + endif + if (acld_loc(i,l+1).eq.0.0) then + b4(i,l) = 1.0 + else + b4(i,l) = min(acld_loc(i,l),acld_loc(i,l+1)) / & + acld_loc(i,l+1) + endif + enddo + enddo +! do l = 1,nlm +! print *,l,acld_loc(1,l),b1(1,l),b2(1,l),b3(1,l),b4(1,l) +! enddo + + + do l = 1, nnp + den(1:len) = pl_loc(1:len,l)*100/(287.*tl_loc(1:len,l)) + rmix(1:len,l) = ql_loc(1:len,l)/(1.-ql_loc(1:len,l)) + cwrho(1:len,l) = den*1000.*qcwl_loc(1:len,l)*acld_loc(1:len,l) + nwrho(1:len,l) = den*ncwl_loc(1:len,l)*acld_loc(1:len,l) + cirho(1:len,l) = den*1000.*qcil_loc(1:len,l)*acld_loc(1:len,l) + o3mix(1:len,l) = o3l_loc(1:len,l) + enddo + + +! print*,'bugs2' +! print*,cwrho(1,:) +! print*,acld_loc(1,:) + +!-- 3. call to the bugs_rad longwave radiation code: + !print*,'---- enter subroutine bugs_lwr:' + call bugs_lwr & + ( len , nnp , pl2_loc , pl_loc, & + dpl_loc , tl_loc , rmix , cwrho, & + nwrho, & + cirho , o3mix , ts_loc ,acld_loc, & + acldmx , b1 , b2 , b3, & + b4 , umco2 , umch4 , umn2o, & + fdlw , fdlwcl , fulw , fulwcl, & + sel_rules_lw & + ) + + !print*,'---- exit subroutine bugs_lwr:' + +!-- 4. call to the bugs_rad shortwave radiation code: + +!-- note: slr needs to be modified to accomodate the difference in +! s0 between the original radiation code and that in BUGS2. + slr_loc(1:len) = slr_loc(1:len) * s0/1339.945 + +!-- note: computation of the shortwave radiative heating rates and +! fluxes are made for daytime grid-points only: + bitx(1:len) = amu0_loc(1:len) .ge. 0.01 + nday = 0 + do i = 1, len + if(bitx(i)) then + nday = nday + 1 + iday(nday) = i + endif + enddo + if(nday .eq. 0) goto 1000 + + !print*,'allocate' + allocate(ts_day(nday)) + allocate(amu0_day(nday)) + allocate(slr_day(nday)) + allocate(alvdr_day(nday)) + allocate(alndr_day(nday)) + allocate(alvdf_day(nday)) + allocate(alndf_day(nday)) + allocate(acldmx_day(nday)) + allocate(pl_day(nday,nnp)) + allocate(dpl_day(nday,nnp)) + allocate(tl_day(nday,nnp)) + allocate(rmix_day(nday,nnp)) + allocate(cwrho_day(nday,nnp)) + allocate(nwrho_day(nday,nnp)) + allocate(cirho_day(nday,nnp)) + allocate(o3mix_day(nday,nnp)) + allocate(acld_day(nday,nnp)) + allocate(b1_day(nday,nnp)) + allocate(b2_day(nday,nnp)) + allocate(b3_day(nday,nnp)) + allocate(b4_day(nday,nnp)) + + allocate(pl2_day(nday,nnp+1)) + + allocate(fdsw_day(nday,nnp+1)) + allocate(fdswcl_day(nday,nnp+1)) + allocate(fusw_day(nday,nnp+1)) + allocate(fuswcl_day(nday,nnp+1)) + allocate(radvbc_day(nday)) + allocate(radvdc_day(nday)) + allocate(radnbc_day(nday)) + allocate(radndc_day(nday)) + allocate(radvbcc_day(nday)) + allocate(radvdcc_day(nday)) + allocate(radnbcc_day(nday)) + allocate(radndcc_day(nday)) + + !print*,'copystuff' + ts_day(1:nday) = ts_loc(iday(1:nday)) + amu0_day(1:nday) = amu0_loc(iday(1:nday)) + slr_day(1:nday) = slr_loc(iday(1:nday)) + alvdf_day(1:nday) = alvdf_loc(iday(1:nday)) + alndf_day(1:nday) = alndf_loc(iday(1:nday)) + alvdr_day(1:nday) = alvdr_loc(iday(1:nday)) + alndr_day(1:nday) = alndr_loc(iday(1:nday)) + acldmx_day(1:nday) = acldmx(iday(1:nday)) + pl_day(1:nday,1:nnp) = pl_loc(iday(1:nday),1:nnp) + dpl_day(1:nday,1:nnp) = dpl_loc(iday(1:nday),1:nnp) + tl_day(1:nday,1:nnp) = tl_loc(iday(1:nday),1:nnp) + rmix_day(1:nday,1:nnp) = rmix(iday(1:nday),1:nnp) + cwrho_day(1:nday,1:nnp) = cwrho(iday(1:nday),1:nnp) + nwrho_day(1:nday,1:nnp) = nwrho(iday(1:nday),1:nnp) + cirho_day(1:nday,1:nnp) = cirho(iday(1:nday),1:nnp) + o3mix_day(1:nday,1:nnp) = o3mix(iday(1:nday),1:nnp) + acld_day(1:nday,1:nnp) = acld_loc(iday(1:nday),1:nnp) + b1_day(1:nday,1:nnp) = b1(iday(1:nday),1:nnp) + b2_day(1:nday,1:nnp) = b2(iday(1:nday),1:nnp) + b3_day(1:nday,1:nnp) = b3(iday(1:nday),1:nnp) + b4_day(1:nday,1:nnp) = b4(iday(1:nday),1:nnp) + pl2_day(1:nday,1:nnp+1) = pl2_loc(iday(1:nday),1:nnp+1) + + + !print*,'---- enter subroutine bugs_swr:' + call bugs_swr & + ( nday , nnp , pl2_day , pl_day, & + dpl_day , tl_day , rmix_day , cwrho_day, & + nwrho_day, & + cirho_day , o3mix_day , ts_day , amu0_day, & + slr_day , alvdf_day , alndf_day , alvdr_day, & + alndr_day , acld_day , acldmx_day , umco2, & + umch4 , umn2o , b1_day , b2_day, & + b3_day , b4_day , fdsw_day , fdswcl_day, & + fusw_day , fuswcl_day , radvbc_day , radvbcc_day, & + radvdc_day , radvdcc_day , radnbc_day , radnbcc_day, & + radndc_day , radndcc_day , sel_rules_sw & + ) + + !print*,'---- end subroutine bugs_swr:' + + radvbc_loc(iday(1:nday)) = radvbc_day(1:nday) + radvdc_loc(iday(1:nday)) = radvdc_day(1:nday) + radnbc_loc(iday(1:nday)) = radnbc_day(1:nday) + radndc_loc(iday(1:nday)) = radndc_day(1:nday) + radvbcc_loc(iday(1:nday)) = radvbcc_day(1:nday) + radvdcc_loc(iday(1:nday)) = radvdcc_day(1:nday) + radnbcc_loc(iday(1:nday)) = radnbcc_day(1:nday) + radndcc_loc(iday(1:nday)) = radndcc_day(1:nday) + fdsw(iday(1:nday),:) = fdsw_day(1:nday,:) + fdswcl(iday(1:nday),:) = fdswcl_day(1:nday,:) + fusw(iday(1:nday),:) = fusw_day(1:nday,:) + fuswcl(iday(1:nday),:) = fuswcl_day(1:nday,:) + + deallocate(ts_day) + deallocate(amu0_day) + deallocate(slr_day) + deallocate(alvdr_day) + deallocate(alndr_day) + deallocate(alvdf_day) + deallocate(alndf_day) + deallocate(acldmx_day) + deallocate(pl_day) + deallocate(dpl_day) + deallocate(tl_day) + deallocate(rmix_day) + deallocate(cwrho_day) + deallocate(nwrho_day) + deallocate(cirho_day) + deallocate(o3mix_day) + deallocate(acld_day) + deallocate(pl2_day) + deallocate(b1_day) + deallocate(b2_day) + deallocate(b3_day) + deallocate(b4_day) + deallocate(radvbc_day) + deallocate(radvdc_day) + deallocate(radnbc_day) + deallocate(radndc_day) + deallocate(radvbcc_day) + deallocate(radvdcc_day) + deallocate(radnbcc_day) + deallocate(radndcc_day) + deallocate(fdsw_day) + deallocate(fdswcl_day) + deallocate(fusw_day) + deallocate(fuswcl_day) + + + 1000 continue + +!---- 5. computation of long and short wave radiative heating rates: + !print*,'loc5' + do l = 1, nlm + ll = l + delf(1:len) = fulw(1:len,ll)-fdlw(1:len,ll) & + - fulw(1:len,ll+1)+fdlw(1:len,ll+1) + delfcl(1:len) = fulwcl(1:len,ll)-fdlwcl(1:len,ll) & + - fulwcl(1:len,ll+1)+ fdlwcl(1:len,ll+1) + atl(1:len,l) = -heat_fac*delf/dpl(1:len,l) + atlcl(1:len,l) = -heat_fac*delfcl/dpl(1:len,l) + + delf(1:len) = fusw(1:len,ll)-fdsw(1:len,ll) & + - fusw(1:len,ll+1)+fdsw(1:len,ll+1) + delfcl(1:len) = fuswcl(1:len,ll)-fdswcl(1:len,ll) & + - fuswcl(1:len,ll+1) + fdswcl(1:len,ll+1) + asl(1:len,l) = -heat_fac*delf/dpl(1:len,l) + aslcl(1:len,l) = -heat_fac*delfcl/dpl(1:len,l) + enddo + + +!---- back to full arrays: + radvbc(1:len) = radvbc_loc(1:len) + radvdc(1:len) = radvdc_loc(1:len) + radnbc(1:len) = radnbc_loc(1:len) + radndc(1:len) = radndc_loc(1:len) + radvbcc(1:len) = radvbcc_loc(1:len) + radvdcc(1:len) = radvdcc_loc(1:len) + radnbcc(1:len) = radnbcc_loc(1:len) + radndcc(1:len) = radndcc_loc(1:len) + + + !print*,'---- exit subroutine bugs_rad:' + return + end subroutine bugs_rad + +!---------------------------------------------------------------------- diff --git a/src/radiate/bugsrad/bugsrad_physconst.f90 b/src/radiate/bugsrad/bugsrad_physconst.f90 new file mode 100644 index 0000000..6b0597e --- /dev/null +++ b/src/radiate/bugsrad/bugsrad_physconst.f90 @@ -0,0 +1,43 @@ + + +module bugsrad_physconst + + use bugs_kinds + implicit none + private + + ! Physical and math constants + real (kind=dbl_kind), parameter, public :: & + gravity = 9.80665_dbl_kind &! (m s^-2) + ,cp_dry_air = 1.004e+03_dbl_kind &! (J kg^-1 K^-1) + ,R_d = 287.0_dbl_kind &! (J K^-1 kg^-1) + ,R_star = 8.3143e+03_dbl_kind &! (J K^-1 kmol^-1) + ,sol_const = 1.360e+03_dbl_kind &! (W m^-2) + ,P_std = 1.01325e+05_dbl_kind &! (Pa) + ,T_std = 273.15_dbl_kind &! (K) + ,PI = 3.1415926535_dbl_kind &! (-) + ,molar_volume = 2.2421e+4_dbl_kind &! (cm3-atm) + ,N_av = 6.0221367e23 ! (molecules/mol) + + + ! Molecular weights (g/mol) + real (kind=dbl_kind), parameter, public :: & + MW_dry_air = 28.964_dbl_kind & + ,MW_h2o = 18.016_dbl_kind & + ,MW_co2 = 44.010_dbl_kind & + ,MW_o3 = 48.000_dbl_kind & + ,MW_ch4 = 16.042_dbl_kind & + ,MW_n2o = 44.016_dbl_kind + + !Other + integer (kind=int_kind), parameter, public:: & + mbs = 6 !Number of shortwave spectral bands + real (kind=dbl_kind), parameter, public :: & + epsilon = MW_h2o/MW_dry_air & + ,f_virt = (1._dbl_kind - epsilon)/epsilon + + real (kind=dbl_kind), dimension(mbs), parameter, public :: & + ri = (/ 1.19234e-26, 7.6491e-28, 9.0856e-29, 1.97266e-29 & + ,6.13005e-30, 2.06966e-30 /) + +end module bugsrad_physconst diff --git a/src/radiate/bugsrad/bugsrad_planck.f90 b/src/radiate/bugsrad/bugsrad_planck.f90 new file mode 100644 index 0000000..cd8c526 --- /dev/null +++ b/src/radiate/bugsrad/bugsrad_planck.f90 @@ -0,0 +1,68 @@ + + +! CVS: $Id: bugsrad_planck.F90,v 1.1 2003/08/06 19:41:13 norm Exp $ +! CVS: $Name: $ + +module bugsrad_planck + + use bugs_kinds + implicit none + + integer, private, parameter :: MBIR = 12 !Number of IR bands + real (kind=dbl_kind), private, dimension(6, MBIR) :: & + b = reshape ((/ -25.889132, 0.75038381, -0.87074567E-02, 0.50701144E-04, -0.14856755E-06, 0.17579587E-09, & !Band 1 Coefficients for fitted polynomial + 25.397471, -0.59596460, 0.53117737E-02, -0.21681758E-04, 0.36630792E-07, -0.11541419E-10, & !Band 2 which computes the blackbody flux emission + 57.891546, -1.4745788, 0.14577775E-01, -0.68637478E-04, 0.14707480E-06, -0.98862337E-10, & !Band 3 as a function of temperature and band. + 21.837317, -0.63194381, 0.71338812E-02, -0.38569394E-04, 0.95685257E-07, -0.76188561E-10, & !Band 4 + 0.83155466, -0.15281669, 0.31020500E-02, -0.23768837E-04, 0.74605666E-07, -0.67494167E-10, & !Band 5 + -19.432674, 0.37744942, -0.22166529E-02, 0.11663914E-05, 0.22128830E-07, -0.28943829E-10, & !Band 6 + -51.844021, 1.2280373, -0.10600353E-01, 0.38135251E-04, -0.45111018E-07, 0.16679671E-10, & !Band 7 + -31.210771, 0.85737498, -0.87947387E-02, 0.39416747E-04, -0.67469797E-07, 0.43711306E-10, & !Band 8 + -5.4417604, 0.28970317, -0.44571665E-02, 0.26395273E-04, -0.52111967E-07, 0.37627129E-10, & !Band 9 + 14.646543, -0.25202253, 0.67234738E-03, 0.67552180E-05, -0.19815201E-07, 0.17221281E-10, & !Band 10 + 12.218584, -0.31591213, 0.26032011E-02, -0.58878366E-05, 0.73276694E-08, -0.38798834E-11, & !Band 11 + 1.0183416, -0.79710154E-01, 0.13753393E-02, -0.40247214E-05, 0.63186167E-08, -0.41250652E-11 /), & !Band 12 + (/ 6, MBIR /)) + + contains + subroutine planck & + ( NCOL, & ! Input: Number of columns + NLM, & ! Input: Number of model layers + nbir, & ! Input: IR band number + ts, & ! Input: surface temperature, K + tt, & ! Input: atmospheric layer temperature, K + bf ) ! Output: blackbody emission, W/m^2 + + integer (kind=int_kind), intent(in) :: & + NCOL, & + NLM, & + nbir + real (kind=dbl_kind), intent(in), dimension(:) :: & + ts + real (kind=dbl_kind), intent(in), dimension(:,:) :: & + tt + real (kind=dbl_kind), intent(out), dimension(:,:) :: & + bf + + + !Local variables + integer (kind=int_kind) :: & + i_lay !Layer index + real(kind=dbl_kind), dimension(NCOL) :: & + tmp !Tmp var to hold interface temperature + + + !Blackbody emission at top-of-model + bf(:,1) = b(1,nbir)+tt(:,1)*(b(2,nbir)+tt(:,1)*(b(3,nbir)+tt(:,1)*(b(4,nbir)+tt(:,1)*(b(5,nbir)+tt(:,1)*b(6,nbir))))) + !Emission at remaining interfaces + do i_lay = 2,NLM + tmp(:) = 0.5*(tt(:,i_lay-1)+tt(:,i_lay)) + bf(:,i_lay)= b(1,nbir)+tmp(:)*(b(2,nbir)+tmp(:)*(b(3,nbir)+tmp(:)*(b(4,nbir)+tmp(:)*(b(5,nbir)+tmp(:)*b(6,nbir))))) + !enddo + enddo + !Surface emission + bf(:,NLM+1) = b(1,nbir)+ts(:)*(b(2,nbir)+ts(:)*(b(3,nbir)+ts(:)*(b(4,nbir)+ts(:)*(b(5,nbir)+ts(:)*b(6,nbir))))) + return + end subroutine planck + +end module bugsrad_planck diff --git a/src/radiate/bugsrad/cloud_correlate.f90 b/src/radiate/bugsrad/cloud_correlate.f90 new file mode 100644 index 0000000..1b109d3 --- /dev/null +++ b/src/radiate/bugsrad/cloud_correlate.f90 @@ -0,0 +1,281 @@ + + +! CVS: $Id: cloud_correlate.F90,v 1.3 2005/11/22 22:32:22 norm Exp $ +! CVS: $Name: $ + +module bugs_cloud_correlate + use bugs_kinds + implicit none + real(kind=dbl_kind), PARAMETER :: MIN_CF = 1.0e-6 !Minimum layer cloud fraction considered cloudy + real(kind=dbl_kind), PARAMETER :: MIN_LC = 1.0 !Minimum correlation length in meters + !If L_c is smaller than this, random is assumed + contains + + subroutine bugs_ctot(nlen, len_loc, nlm, pl2,tl, acld, l_c, c_tot) + !Calculates the total cloud amount using the profile of cloud + !fraction acld and the correlation length l_c + integer (kind=int_kind), intent(in) :: & + nlen, & ! Length of total domain + len_loc, & ! Length of sub domain + nlm ! Number of layers + real (kind=dbl_kind), intent(in), dimension(nlen) :: & + l_c ! Correlation length + real(kind=dbl_kind), intent(in), dimension(nlen,nlm) :: & + tl, & ! Layer temperature + acld ! Radiative cloud fraction + real(kind=dbl_kind), intent(in), dimension(nlen,nlm+1) :: & + pl2 ! Level pressure + real(kind=dbl_kind), intent(out), dimension(nlen) :: & + c_tot ! Total cloud amount + + ! Local variables + integer(kind=int_kind) :: & + i_lay_a, i_lay_b, i_domain, Ncloud, kcld, j ! Indices + integer(kind=int_kind), dimension(:), allocatable :: & + i_cld ! Indices of cloudy layers + real(kind=dbl_kind) :: & + z0, & + dz, & + alpha + real(kind=dbl_kind), dimension(nlm) :: & + z ! mid-layer heights estimated via hydrostatic equation + real(kind=dbl_kind), dimension(:), allocatable :: & + cloud, & + olap, & + cld_below ! Amount of cloud in each layer that lies under clear + ! sky, i.e., that contributes to total cloudiness + + do i_domain = 1, nlen + !Figure out the cloudy layers + Ncloud = count(acld(i_domain,:) > MIN_CF) + if (Ncloud == 0) then + !No cloud + c_tot(i_domain) = 0. + else if (Ncloud == 1) then + !One cloudy layer + c_tot(i_domain) = maxval(acld(i_domain,:)) + else + if (maxval(acld(i_domain,:)) >= 1.) then + c_tot(i_domain) = 1.0 + else + !Multiple cloudy layers. + ! Get the mid-layer heights + ! Don't worry about actual surface elevation, since we only use dz's + z0 = 0. + do i_lay_a = nlm, 1, -1 + dz = 29.286*log(pl2(i_domain,i_lay_a+1)/pl2(i_domain,i_lay_a))*tl(i_domain,i_lay_a) + z(i_lay_a) = z0 + dz/2. + z0 = z0 + dz + enddo + + !First figure out what layers the clouds are in + allocate(i_cld(Ncloud),cloud(Ncloud),olap(Ncloud-1), cld_below(Ncloud)) + kcld = 0 + do i_lay_a = 1, nlm + if (acld(i_domain,i_lay_a) > MIN_CF) then + kcld = kcld+1 + i_cld(kcld) = i_lay_a + endif + enddo + !Second, condense the cloud fraction vector to remove any cloud-free layers + !and set up the olap and cld_below vectors + cloud(1) = acld(i_domain,i_cld(1)) + do kcld = 2, Ncloud + cloud(kcld) = acld(i_domain,i_cld(kcld)) + !Overlap of this layer with prior + if (l_c(i_domain) < MIN_LC) then + !Pure random correlation between this pair of layers + olap(kcld-1) = cloud(kcld-1)*cloud(kcld) + else + dz=z(i_cld(kcld-1)) - z(i_cld(kcld)) + alpha = exp(-dz/l_c(i_domain)) + olap(kcld-1) = alpha*min(cloud(kcld-1),cloud(kcld)) + & + (1. - alpha)*cloud(kcld-1)*cloud(kcld) + endif + enddo + + !Third, compute the total cloud amount + cld_below(1) = cloud(1) + cld_below(2) = cloud(2) - olap(1) + do kcld = 3,Ncloud + do j = kcld-1,1,-1 + select case (kcld-j) + case(1) + cld_below(kcld) = cloud(kcld) - olap(kcld-1) + case(2:) + cld_below(kcld) = cld_below(kcld)*(1. - (cloud(j)-olap(j))/& + (1. - cloud(j+1))) + end select + enddo + enddo + c_tot(i_domain) = sum(cld_below) + deallocate(i_cld, cloud,olap, cld_below) + endif + endif + enddo + return + end subroutine bugs_ctot + + + subroutine bugs_cloudfit(len, nlm, c_tot, acld, & + c_maximal, cf_max, cf_random) + use bugs_kinds + implicit none + + integer (kind=int_kind), intent(in) :: & + len, & !Length of domain + nlm !Number of layers in each column + real (kind=dbl_kind), intent(in), dimension(len) :: & + c_tot !Total cloud fraction computed by bugs_ctot + real (kind=dbl_kind), intent(in), dimension(len,nlm) :: & + acld !Vector of cloud fractions for each column + real (kind=dbl_kind), intent(out), dimension(len) :: & + c_maximal !Fraction of column which is maximally overlapped + real (kind=dbl_kind), intent(out), dimension(len,nlm) :: & + cf_max, & !Vector of layer cloud fractions inside the maximally-overlapped column + cf_random !Vector of layer cloud fractions outside the maximally-overlapped column + + + !LOCAL VARIABLES + integer(kind=int_kind) :: i, j, Nc + + real(kind=dbl_kind) :: min_frac, max_frac + real(kind=dbl_kind) :: prod, c_tot_max, cf_stacked, & + c_tot_calcd,tol,delta + real(kind=dbl_kind), dimension(nlm) :: cf_tmp + integer(kind=int_kind) :: frac_set + + !Use these below to reproduce original gs_olap results + real(kind=dbl_kind) :: cf_stacked_thresh, & + cf_stacked_min + integer(kind=int_kind) :: cf_stacked_min_set + + !Set tol + tol = 1.0e-5 + do i = 1,len + !For each column, get the max and min nonzero cloud fractions + frac_set = 0 + min_frac = 1. + max_frac = 0. + Nc = 0 + do j = 1, nlm + if (acld(i,j) > MIN_CF) then + frac_set = 1 + Nc = Nc + 1 + if (acld(i,j) < min_frac) then + min_frac = acld(i,j) + endif + if (acld(i,j) > max_frac) then + max_frac = acld(i,j) + endif + endif + enddo + if (frac_set == 0) then + !No nonzero cloud amount in column, clear sky + min_frac = 0. + max_frac = 0. + c_maximal(i) = 0. + cf_max(i,:) = 0. + cf_random(i,:) = 0. + else + !Min_frac and max_frac determined for this column + + !Determine c_tot for purely random sky (maximum c_tot possible for this sky) + prod = 1. + do j = 1, nlm + prod = prod*(1. - acld(i,j)) + enddo + c_tot_max = 1. - prod + !Now determine the stacked (maximally overlapped) cloud fraction using c_tot to constrain + !Check to see if the actual c_tot is less than c_tot_max by a nonnegligible amount + !If so, run an iteration in which cf_stacked is incremented until c_tot_calcd + !is just less than c_tot. Note that cf_stacked is not allowed to exceed the maximum + !layer cloud fraction, max_frac + if (c_tot_max - c_tot(i) > tol) then + cf_stacked = 0. + c_tot_calcd = c_tot_max + delta = max_frac/1000. + do while (c_tot_calcd > c_tot(i) .and. cf_stacked <= max_frac) + !Compute c_tot_calcd for the given cf_stacked + prod = 1. + do j = 1, nlm + if (acld(i,j) > cf_stacked) then + prod = prod*(1. - acld(i,j))/(1. - cf_stacked) + endif + enddo + c_tot_calcd = cf_stacked + (1 - cf_stacked)*(1. - prod) + cf_stacked = cf_stacked + delta + enddo + if (cf_stacked > max_frac) then + !Reached end of iterations and c_tot_calcd is not less than c_tot + !Set cf_stacked to its maximum value. This makes c_tot_calcd as small + !as possible + cf_stacked = max_frac + else + !Good result, converged such that c_tot_calcd < c_tot before cf_stacked + !got too large. + !For good measure, back up half a step + cf_stacked = cf_stacked - delta/2. + endif + else + !The actual c_tot is greater than or equal to c_tot_max, so set cf_stacked to + !its minimum value. This makes c_tot_calcd as large as possible + !If only one cloud layer, must have cf_stacked = the cloud fraction in that + !layer. Otherwise (i.e., Nc > 1), we can have 0. overlap and cf_stacked = 0. + if (Nc == 1) then + cf_stacked = min_frac + else + cf_stacked = 0. + endif + endif + + !To reproduce the original gsolap calcs + !Comment between here and the next comment to use constrained gsolap + ! cf_stacked_min = 1. + ! cf_stacked_thresh = 0.00 + ! cf_stacked_min_set = 0 + + ! do j = 1, nlm + ! if (acld(i,j) < cf_stacked_min .and. acld(i,j) > cf_stacked_thresh) then + ! cf_stacked_min = acld(i,j) + ! cf_stacked_min_set = 1 + ! endif + ! enddo + ! if (cf_stacked_min_set == 0) then + ! cf_stacked = 0 + ! else + ! cf_stacked = cf_stacked_min + ! endif + ! cf_stacked = 0. !Force random + !End reproduce original gsolap calcs + + c_maximal(i) = cf_stacked + do j = 1, nlm + if (acld(i,j) >= cf_stacked) then + cf_max(i,j) = cf_stacked + cf_random(i,j) = acld(i,j) - cf_stacked + else + cf_max(i,j) = acld(i,j) + cf_random(i,j) = 0. + endif + enddo + !If c_maximal is other than zero or 1, renormalize the cloud fractions + !to the range [0. - 1.] + if (c_maximal(i) > 0. .and. c_maximal(i) < 1.) then + cf_max(i,:) = cf_max(i,:)/c_maximal(i) + cf_random(i,:) = cf_random(i,:)/(1. - c_maximal(i)) + endif + + !Diagnostic calc - comment out if not debugging + !prod = 1. + !do j = 1, nlm + ! if (acld(i,j) > cf_stacked) then + ! prod = prod*(1. - acld(i,j))/(1. - cf_stacked) + ! endif + !enddo + !c_tot_calcd = cf_stacked + (1 - cf_stacked)*(1. - prod) + endif + enddo + end subroutine bugs_cloudfit + +end module bugs_cloud_correlate diff --git a/src/radiate/bugsrad/continuum.f90 b/src/radiate/bugsrad/continuum.f90 new file mode 100644 index 0000000..8e080a9 --- /dev/null +++ b/src/radiate/bugsrad/continuum.f90 @@ -0,0 +1,275 @@ + + +! CVS: $Id: continuum.F90,v 1.1 2007/05/30 15:52:47 norm Exp $ +! CVS: $Name: $ +module continuum + +use bugs_kinds +implicit none + +integer (kind=int_kind), parameter :: & + ncoef = 7 & + , nreg = 2 & + , nband = 12 + +real (kind=dbl_kind), dimension(nband) :: & + h2obnd + +real (kind=dbl_kind), dimension(ncoef,nreg,nband):: & + ck24_3 !weighted by Planck function + +data h2obnd /-5,-3.5,-2.0,-2,-1.,-4,-4,-4,-3,-3.5,-3,-2/ + +data ck24_3/ & !ckd24fu.fuliou.lin.plnk.out +! band 1 + 1.667e+00, 9.421e-01,-7.358e-03, 1.355e+00, & + 2.557e+03, 5.798e+01,-4.570e-01, & +! band 1 + 6.417e+00, 1.002e+00,-6.991e-03, 1.010e+00, & + 1.203e+01, 4.501e-02,-2.428e-02, & +! band 2 + 2.390e+00, 9.528e-01,-6.058e-03, 1.071e+00, & + 2.676e+02, 9.848e+00,-1.459e-01, & +! band 2 + 4.849e+00, 1.002e+00,-6.910e-03, 8.961e-01, & + 1.635e+01, 2.115e-02, 7.243e-02, & +! band 3 + 2.326e+00, 9.720e-01,-6.551e-03, 8.739e-01, & + 6.984e+01, 8.346e-01, 4.824e-02, & +! band 3 + 5.002e+00, 1.005e+00,-9.286e-03, 6.222e-01, & + 1.168e+01, 3.611e-03, 3.148e-01, & +! band 4 + -4.865e+00, 8.455e-01,-6.911e-03, 1.475e+00,& + 2.905e+02, 7.078e+00,-6.846e-01, & +! band 4 + 4.596e+00, 1.012e+00,-1.152e-02, 5.713e-01, & + 1.270e+01,-1.395e-03, 3.447e-01, & +! band 5 + -5.396e+00, 8.596e-01,-8.479e-03, 1.619e+00,& + 1.664e+02, 3.236e+00,-7.782e-01, & +! band 5 + 7.478e+00, 1.007e+00,-1.963e-02, 2.771e-01, & + 6.021e+00,-4.489e-03, 6.709e-01, & +! band 6 + 1.262e+00, 2.347e-01,-2.360e-02, 1.655e-01, & + 5.068e+02, 2.462e+01, 3.920e-01, & +! band 6 + 9.334e+00, 1.002e+00,-2.429e-02, 3.575e-02, & + 2.751e-01,-1.189e-03, 9.593e-01, & +! band 7 + -1.222e+00, 5.423e-01,-2.327e-02, 5.197e-01,& + 6.423e+02, 5.038e+01, 1.502e-01, & +! band 7 + 8.506e+00, 1.000e+00,-2.339e-02, 8.891e-03, & + -6.805e-01,-1.639e-04, 9.917e-01, & +! band 8 + -3.638e+00, 8.534e-01,-1.344e-02, 6.816e-01,& + 5.385e+02, 4.428e+01,-6.366e-03, & +! band 8 + 6.921e+00, 1.002e+00,-1.974e-02, 6.350e-02, & + 6.838e-01,-1.121e-03, 9.237e-01, & +! band 9 + -2.329e+00, 7.893e-01,-2.588e-03, 1.017e+00,& + 1.525e+02, 1.029e+01,-1.486e-01, & +! band 9 + 6.742e-01, 1.008e+00,-3.376e-03, 9.105e-01, & + 1.074e+01,-3.307e-03, 5.741e-02, & +! band 10 + -1.677e+00, 9.173e-01,-5.780e-03, 1.504e+00,& + 7.886e+02, 2.288e+01,-5.999e-01, & +! band 10 + 3.396e+00, 1.005e+00,-3.433e-03, 1.012e+00, & + 7.635e+00, 3.010e-03,-2.418e-02, & +! band 11 + 7.943e-01, 9.260e-01,-5.050e-03, 1.141e+00, & + 2.221e+02, 1.021e+01,-2.246e-01, & +! band 11 + 3.356e+00, 1.002e+00,-4.719e-03, 9.578e-01, & + 6.164e+00, 1.186e-03, 2.264e-02, & +! band 12 + -5.874e+00, 7.060e-01,-1.532e-03, 1.141e+00,& + 1.463e+02, 6.534e+00,-4.308e-01, & +! band 12 + 4.709e-01, 1.010e+00,-6.067e-03, 8.513e-01, & + 1.161e+01,-6.629e-03, 8.885e-02 & + / + + +contains + +subroutine gascon & + (ncol, nlm, ib, pp & + ,ppl, dp, tt, rmix & + ,tgm ) + + use bugs_kinds, only: int_kind, dbl_kind + use bugsrad_physconst, only: gravity, R_d, f_virt + implicit none + +!----------------------------------------------------------------------- +! MODIFICATIONS: +! * changed declarations to adapt the code from BUGS4 to BUGS5. +! Laura D. Fowler/slikrock (02-01-00). + +! NBW - Modified 27/11/2002 +! H2O continuum now based on CKD2.4, from Fred Rose and Dave Kurtz + +! REFERENCES: +! Parameterized CKD_2.1 continuum absorption. +! adapted from the Fu-Liou 4-stream radiative transfer model original +! code by Fred Rose. use radparams_0898. +! Phil Partain/graben (04/04/00). + +! send comments to partain@atmos.colostate.edu. + +! SUBROUTINES CALLED: +! none. + +! FUNCTIONS CALLED: +! none. + +! INCLUDED COMMONS: +! none. + +! ARGUMENT LIST VARIABLES: +! INPUT ARGUMENTS: +! ---------------- + integer (kind=int_kind), intent(in):: & + ncol & !Length of sub-domain. + ,nlm & !Number of layers. + ,ib !Spectral interval. + + real (kind=dbl_kind), intent(in), dimension(:,:):: & + ppl & !Pressure (hPa). + ,dp & !Pressure thickness (hPa). + ,tt & !Temperature (K). + ,rmix & !Water vapor mixing ratio (kg/kg). + ,pp + +! OUTPUT ARGUMENTS: +! ----------------- + real (kind=dbl_kind), intent(out), dimension(:,:):: & + tgm !Water vapor continuum optical depth (-). + +! LOCAL VARIABLES: + + integer (kind=int_kind):: & + i,l + + integer (kind=int_kind), dimension(18):: & + iflb + data iflb /6*0,12,11,10,9,8,7,6,5,4,3,2,1/ + + real (kind=dbl_kind):: & + dz, amnt, patm, tv + + tgm(:,:) = 0. + if( iflb(ib) .eq. 0) return + +! print*,'nlm in continuum',nlm + do i = 1, ncol + do l = 1, nlm + if(rmix(i,l).gt.0.0) then + ! The factor of 10 converts hPa to Pa and kg/m^2 to g/cm^2 + amnt = 10._dbl_kind*dp(i,l)*rmix(i,l)/gravity + patm = ppl(i,l) /1013.25_dbl_kind +! print*,'in loop',i,l,tt(i,l),rmix(i,l),f_virt + tv = tt(i,l)*(1._dbl_kind + f_virt*rmix(i,l)) + dz = (R_d/gravity)*tv*log(pp(i,l+1)/pp(i,l))* & + 0.001_dbl_kind + tgm(i,l) = parm_ckd24(iflb(ib),amnt,patm,tt(i,l),dz) + endif + enddo + enddo + + return +end subroutine gascon + +function parm_ckd24(iband,amnt,patm,temp,dz) result(ckd24_tau) + use bugs_kinds + use bugsrad_physconst, only: R_star,MW_h2o + implicit none +! Parameterization of CKD_2.4 continuum over Fu-Liou Bands +! Input: +! iband = integer (1-12) where +! Band 1 =' 5:280cm-1' +! Band 2 ='280:400cm-1' +! Band 3 ='400:540cm-1' +! Band 4 ='540:670cm-1' +! Band 5 ='670:800cm-1' +! Band 6 ='800:980cm-1' +! Band 7 ='980:1100cm-1' +! Band 8 ='1100:1250cm-1' +! Band 9 ='1250:1400cm-1' +! Band10 ='1400:1700cm-1' +! Band11 ='1700:1900cm-1' +! Band12 ='1900:2200cm-1' +! amnt = h2O ammount (g/cm**2) +! patm = pressure (atm) +! temp = temperature (k) +! dz = pathlength (Km) +! Output: +! parm_ckd24 = parameterized CKD_2.4optical depth for band +!234567890123456789012345678901234567890123456789012345678901234567890 + + + +! These Regressions are more sensitive to pathlength +! So accomodations for very Thin or Thick layers are made. + + integer (kind=int_kind), intent(in):: & + iband + + real (kind=dbl_kind), intent(in):: & + amnt & !Water vapor content (g/cm^2). + ,patm & !Pressure (atm). + ,temp & !Temperature (K). + ,dz !Path length (km). + +! OUTPUT ARGUMENTS: + real (kind=dbl_kind):: & + ckd24_tau !Optical depth to water vapor continuum (-). + +! LOCAL VARIABLES: + integer(kind=int_kind) :: & + ireg + + real (kind=dbl_kind):: & + factor, dz1, amnt1, patmx, ph2o, tau_log + + dz1 =dz + factor=1.000 + if ( dz < 0.25 ) then + factor = 0.25/dz + dz1 = 0.25 + elseif (dz > 1.50) then + factor = 1.50/dz + dz1 = 1.50 + endif + amnt1=amnt*factor + +! Regression is now broken up into TWO parts one for small +! one for large water vapor ammounts. + + ireg=1 + if (log(amnt1) > h2obnd(iband)) ireg=2 + + ph2o = amnt1 *(R_star*1.e4_dbl_kind*temp )/ & + (dz1*1.0d+05*MW_h2o *1.01325d+06) + + patmx = log(patm) + tau_log = ck24_3(1,ireg,iband) + & + ck24_3(2,ireg,iband)* log(amnt1) + & + ck24_3(3,ireg,iband)* temp + & + ck24_3(4,ireg,iband)* patmx + & + ck24_3(5,ireg,iband)* (ph2o) + & + ck24_3(6,ireg,iband)* amnt1 + & + ck24_3(7,ireg,iband)* log(ph2o) + ckd24_tau = exp ( tau_log ) + ckd24_tau = ckd24_tau/factor + return +end function parm_ckd24 + + +end module continuum diff --git a/src/radiate/bugsrad/driver_read.f90 b/src/radiate/bugsrad/driver_read.f90 new file mode 100644 index 0000000..21c5b0b --- /dev/null +++ b/src/radiate/bugsrad/driver_read.f90 @@ -0,0 +1,213 @@ + + +! CVS: $Id: driver_read.F,v 1.10 2003/11/11 21:55:13 norm Exp $ +! CVS: $Name: $ + + +!----------------------------------------------------------------------- + subroutine bugs_driver(nlm,amu0,alvdr,pl,tl,ql,qcwl,ncwl,qcil & + , qrwl,qril,o3l,asl,atl,fuswb,fdswb,fulwb,fdlwb) + + use bugs_kinds, only: int_kind, dbl_kind + use bugsrad_physconst, only: gravity, cp_dry_air, sol_const + + implicit none + +!----------------------------------------------------------------------- +! driver_read is the main routine for running the CSU radiative transfer +! code offline (that is, apart from the CSU GCM). It reads a profile +! from a file and also specifies variables that are not read in. It +! then calls BUGSrad to do the radiative transfer. This driver is not +! used when the code is compiled online with the CSU GCM. + +! REFERENCES: +! Phil Partain /wombat (04-04-00). + +! MODIFICATIONS: +! * changed declarations to adapt the code from BUGS4 to BUGS5. +! Laura D. Fowler/slikrock (02-01-00). + +! SUBROUTINES CALLED: +! bugs_rad :The radiative transfer code + +! FUNCTIONS CALLED: +! none. + +! INCLUDED COMMON BLOCKS: +! none. + +! LOCAL VARIABLES: + integer (kind=int_kind):: & + nlen,& !Length of total domain. + len,& !Length of sub domain. + nlm,& !Number of layers. + i,l + + real (kind=dbl_kind), dimension(1):: & + ts ,& !Surface temperature (K). + amu0 ,& !Cosine of solar zenith angle (-). + slr ,& !Fraction of daylight (-). + alvdr,& !Visible direct surface albedo (-). + alndr,& !Near-IR direct surface albedo (-). + alvdf,& !Visible diffuse surface albedo (-). + alndf,& !Near-IR diffuse surface albedo (-). + umco2,& !Col-avg concentration CO2 (ppm). + umch4,& !Col-avg concentration CH4 (ppm). + umn2o !Col-avg concentration N2O (ppm). + + real (kind=dbl_kind), dimension(1,nlm):: & + pl,& !Layer pressure (hPa). + dpl,& !Layer thickness (hPa). + tl ,& !Temperature (K). + ql ,& !Specific humidity (kg/kg). + qcwl ,& !Cloud water mixing ratio (kg/kg). + ncwl ,& !Cloud droplet concentration (#/kg). + qcil,& !Cloud ice mixing ratio (kg/kg). + qrwl,& !Rain mixing ratio (kg/kg). + qril,& !Snow mixing ratio (kg/kg). + o3l,& !Ozone mixing ratio (kg/kg). + acld,& !Radiative cloud fraction (-). + atl ,& !All-sky LW radiative heating rate (K/s). + asl ,& !All-sky SW radiative heating rate (K/s). + fulwb,& !All-sky LW upwelling flux (W/m^2). + fdlwb,& !All-sky LW downwelling flux (W/m^2). + fuswb,& !All-sky SW upwelling flux (W/m^2). + fdswb !All-sky SW downwelling flux (W/m^2). + + !Note that rain mixing ratio is unused by BUGSrad, but I've put it + !into the std_profile.dat file for completeness + + real (kind=dbl_kind), dimension(1,nlm+1):: & + pl2 !Level pressure (hPa). + + real (kind=dbl_kind), dimension(1,nlm+1):: & + fulw,& !All-sky LW upwelling flux (W/m^2). + fdlw,& !All-sky LW downwelling flux (W/m^2). + fusw,& !All-sky SW upwelling flux (W/m^2). + fdsw !All-sky SW downwelling flux (W/m^2). + +!----------------------------------------------------------------------- + !print*,'inside bugs_driver' + !print*,tl(1,1:5) + !print*,ql(1,1:5) + !print*,qcwl(1,1:5) +!---- 1. READ PROFILE DATA FROM FILE: + + nlen = 1 !to do timing tests + len = nlen +!---- +! AJD changed: original: +! do l=2,nlm+1 +! pl2(1,l)=(pl(1,l-1)+pl(1,l))/2. +! enddo +! pl2(1,1)=pl2(1,2)+abs(pl2(1,2)-pl2(1,3)) +! Bug in original: pl(1,nlm+1) is not defined! +! +! AJD changed: modified: + do l=2,nlm + pl2(1,l)=(pl(1,l-1)+pl(1,l))/2. + enddo + pl2(1,1)=pl2(1,2)+abs(pl2(1,2)-pl2(1,3)) +! AJD - extrapolate to the top-layer pressure: + pl2(1,nlm+1)=pl2(1,nlm)-abs(pl2(1,nlm-1)-pl2(1,nlm)) + + pl = pl/100. !convert from Pascals to millibars + pl2 = pl2/100. + + do l=1,nlm + dpl(1,l) = pl2(1,l)-pl2(1,l+1) + if (qcwl(1,l)>1.e-14 .or. qrwl(1,l)>1.e-14 & + .or. qcil(1,l)>1.e-14 .or. qril(1,l)>1.e-14) then + acld(1,l)=1. + else + acld(1,l)=0. + endif + enddo + + ts = tl(1,1) !Adele - fix later + + !BUGSRAD works with columns that are upside down. + CALL flip_profile(nlm,pl) + CALL flip_profile(nlm+1,pl2) + CALL flip_profile(nlm,dpl) + CALL flip_profile(nlm,tl) + CALL flip_profile(nlm,ql) + CALL flip_profile(nlm,qcwl) + CALL flip_profile(nlm,ncwl) + CALL flip_profile(nlm,qcil) + CALL flip_profile(nlm,qrwl) + CALL flip_profile(nlm,qril) + CALL flip_profile(nlm,o3l) + CALL flip_profile(nlm,acld) + + alndr=alvdr + alvdf = alvdr + alndf = alvdr + + umco2=400. + umch4=0. !Methane + umn2o=0. !N2O + fdsw=0. + fusw=0. + fdlw=0. + fulw=0. + + slr = 1.0 + +!---- 4. CALL THE RADIATIVE TRANSFER CODE: + call bugs_rad(nlen,len,nlm,pl2,pl,dpl,tl,ql,qcwl,ncwl,qcil,qril, & + o3l,ts,amu0,slr,alvdf,alndf,alvdr,alndr,sol_const, & + gravity,cp_dry_air,asl,atl,fdsw,fusw,fdlw,fulw, & + acld, umco2, umch4, umn2o) + CALL flip_profile(nlm,pl) + CALL flip_profile(nlm,tl) + CALL flip_profile(nlm,ql) + CALL flip_profile(nlm,qcwl) + CALL flip_profile(nlm,ncwl) + CALL flip_profile(nlm,qcil) + CALL flip_profile(nlm,qrwl) + CALL flip_profile(nlm,qril) + CALL flip_profile(nlm,o3l) + CALL flip_profile(nlm,asl) + CALL flip_profile(nlm,atl) + CALL flip_profile(nlm+1,fusw) + CALL flip_profile(nlm+1,fdsw) + CALL flip_profile(nlm+1,fulw) + CALL flip_profile(nlm+1,fdlw) + + fdswb(1,:)=fdsw(1,1:nlm) + fuswb(1,:)=fusw(1,1:nlm) + fdlwb(1,:)=fdlw(1,1:nlm) + fulwb(1,:)=fulw(1,1:nlm) + + end subroutine bugs_driver + + subroutine flip_profile(nrad,prof) + use bugs_kinds, only: dbl_kind + + implicit none + + integer::nrad,i + real(kind=dbl_kind),dimension(1,nrad)::prof,temp + + temp=prof + do i=1,nrad + prof(1,i)=temp(1,nrad+1-i) + enddo + + end subroutine flip_profile + subroutine flip_profile_int(nrad,prof) + use bugs_kinds, only: dbl_kind + + implicit none + + integer::nrad,i + integer,dimension(1,nrad)::prof,temp + + temp=prof + do i=1,nrad + prof(1,i)=temp(1,nrad+1-i) + enddo + + end subroutine flip_profile_int +!----------------------------------------------------------------------- diff --git a/src/radiate/bugsrad/gases_ckd.f90 b/src/radiate/bugsrad/gases_ckd.f90 new file mode 100644 index 0000000..48fa6d8 --- /dev/null +++ b/src/radiate/bugsrad/gases_ckd.f90 @@ -0,0 +1,1534 @@ + + +! CVS: $Id: gases_ckd.F90,v 1.1 2003/11/07 22:18:38 norm Exp $ +! CVS: $Name: $ + +module gases_ckd +!Correlated-k coefficients and routines for calculating gaseous absorption per Fu, 1991 +!The hk* variables are the weights for the k-distribution intervals for each band +!The variable fk1o3 is the ozone absorption coefficient in (atm-cm)^-1 +!The various c2h2o, c3h2o, c10ch4, c10n2o etc. variables are coefficients +!required to calculate the absorption coefficient in (atm-cm)^-1. + + use bugs_kinds, only: int_kind, dbl_kind + implicit none + private + + public :: & + gases & ! Subroutine for calculation gas transmission + ,pscale + +!This include file contains all the correlated-k coefficient +!values and associated parameters, (including some public ones) +!CVS: $Id: gases_ckd_data.h,v 1.4 2006/11/16 18:43:30 norm Exp $ +!CVS: $Name: $ + + public ::& + MB & ! Total number of spectral intervals + ,MBS & ! Number of shortwave spectral intervals + ,MBIR & ! Number of longwave spectral intervals + ,KG & ! Number of k samples per spectral interval + ,STANPS & ! Reference pressures for shortwave correlated-k tabulation + ,STANPIR ! Reference pressures for longwave correlated-k tabulation + + ! Number of bands + integer(kind=int_kind), parameter :: & + MB = 18 & ! Total number of spectral bands + ,MBS = 6 & ! Number of shortwave spectral bands + ,MBIR = 12 ! Number of longwave spectral bands + + ! Number of k samples per band + integer(kind=int_kind), parameter, dimension(MB) :: & + KG = (/ 10, 8, 12, 7, 12, 5, & ! Number of k samples per shortwave band + 2, 3, 4, 4, 3, 5, & ! Number of k samples per longwave band + 2, 10, 12, 7, 7, 8 /) + + ! Pressure and temperature resolution for k tabulations + integer(kind=int_kind), parameter :: & + NUMPS = 11 & ! Number of pressures in the shortwave k tabulations + ,NUMTS = 3 & ! Number of temperatures in the shortwave k tabulations + ,NUMPIR = 19 & ! Number of pressures in the longwave k tabulations + ,NUMTIR = 3 & ! Number of temperatures in the longwave k tabulations + ,T_1 = 1 & ! + ,T_2 = 2 & ! + ,T_3 = 3 + + ! Reference pressures in hPa for correlated-k tabulations + real(kind=dbl_kind), parameter, dimension(NUMPS) :: & + STANPS = (/ 10.0, 15.8, 25.1, 39.8, 63.1, 100.0, & + 158.0, 251.0, 398.0, 631.0, 1000.0 /) + + real(kind=dbl_kind), parameter, dimension(NUMPIR) :: & + STANPIR = (/ 0.251, 0.398, 0.631, 1.000, 1.58, 2.51, & + 3.98, 6.31, 10.0, 15.8, 25.1, 39.8, 63.1, & + 100.0, 158.0, 251.0, 398.0, 631.0, 1000.0 /) + + + integer (kind=int_kind):: & + i,j,k + + real (kind=dbl_kind), dimension(KG(1)) :: hk1 ! 50000 - 14500 cm^-1 + real (kind=dbl_kind), dimension(KG(2)) :: hk2 ! 14500 - 7700 cm^-1 + real (kind=dbl_kind), dimension(KG(3)) :: hk3 ! 7700 - 5250 cm^-1 + real (kind=dbl_kind), dimension(KG(4)) :: hk4 ! 5250 - 4000 cm^-1 + real (kind=dbl_kind), dimension(KG(5)) :: hk5 ! 4000 - 2850 cm^-1 + real (kind=dbl_kind), dimension(KG(6)) :: hk6 ! 2850 - 2500 cm^-1 + real (kind=dbl_kind), dimension(KG(7)) :: hk7 ! 2200 - 1900 cm^-1 + real (kind=dbl_kind), dimension(KG(8)) :: hk8 ! 1900 - 1700 cm^-1 + real (kind=dbl_kind), dimension(KG(9)) :: hk9 ! 1700 - 1400 cm^-1 + real (kind=dbl_kind), dimension(KG(10)) :: hk10 ! 1400 - 1250 cm^-1 + real (kind=dbl_kind), dimension(KG(11)) :: hk11 ! 1250 - 1100 cm^-1 + real (kind=dbl_kind), dimension(KG(12)) :: hk12 ! 1100 - 980 cm^-1 + real (kind=dbl_kind), dimension(KG(13)) :: hk13 ! 980 - 800 cm^-1 + real (kind=dbl_kind), dimension(KG(14)) :: hk14 ! 800 - 670 cm^-1 + real (kind=dbl_kind), dimension(KG(15)) :: hk15 ! 670 - 540 cm^-1 + real (kind=dbl_kind), dimension(KG(16)) :: hk16 ! 540 - 400 cm^-1 + real (kind=dbl_kind), dimension(KG(17)) :: hk17 ! 400 - 280 cm^-1 + real (kind=dbl_kind), dimension(KG(18)) :: hk18 ! 280 - 0 cm^-1 + + + real (kind=dbl_kind), dimension(KG(1)) :: fk1o3 + real (kind=dbl_kind), dimension(NUMTS, NUMPS, KG(2)) :: c2h2o + real (kind=dbl_kind), dimension(NUMTS, NUMPS, KG(3)) :: c3h2o + real (kind=dbl_kind), dimension(NUMTS, NUMPS, KG(4)) :: c4h2o + real (kind=dbl_kind), dimension(NUMTS, NUMPS, KG(5)) :: c5h2o + real (kind=dbl_kind), dimension(NUMTS, NUMPS, KG(6)) :: c6h2o + + real (kind=dbl_kind), dimension(NUMTIR, NUMPIR, KG(7)) :: c7h2o + real (kind=dbl_kind), dimension(NUMTIR, NUMPIR, KG(8)) :: c8h2o + real (kind=dbl_kind), dimension(NUMTIR, NUMPIR, KG(9)) :: c9h2o + real (kind=dbl_kind), dimension(NUMTIR, NUMPIR, KG(10)) :: c10h2o + real (kind=dbl_kind), dimension(NUMTIR, NUMPIR) :: c10ch4 + real (kind=dbl_kind), dimension(NUMTIR, NUMPIR) :: c10n2o + real (kind=dbl_kind), dimension(NUMTIR, NUMPIR, KG(11)) :: c11h2o + real (kind=dbl_kind), dimension(NUMTIR, NUMPIR) :: c11ch4 + real (kind=dbl_kind), dimension(NUMTIR, NUMPIR) :: c11n2o + real (kind=dbl_kind), dimension(NUMTIR, NUMPIR, KG(12)) :: c12o3 + real (kind=dbl_kind), dimension(NUMTIR, NUMPIR) :: c12h2o + real (kind=dbl_kind), dimension(NUMTIR, NUMPIR, KG(13)) :: c13h2o + real (kind=dbl_kind), dimension(NUMTIR, NUMPIR, KG(14)) :: c14hca + real (kind=dbl_kind), dimension(NUMTIR, NUMPIR, KG(14)) :: c14hcb + real (kind=dbl_kind), dimension(NUMTIR, NUMPIR, KG(15)) :: c15hca + real (kind=dbl_kind), dimension(NUMTIR, NUMPIR, KG(15)) :: c15hcb + real (kind=dbl_kind), dimension(NUMTIR, NUMPIR, KG(16)) :: c16h2o + real (kind=dbl_kind), dimension(NUMTIR, NUMPIR, KG(17)) :: c17h2o + real (kind=dbl_kind), dimension(NUMTIR, NUMPIR, KG(18)) :: c18h2o + + data hk1 /.24,.16,.24,.28,.03,.016,.01,.008,.008,.008 / + data hk2 /.71,.11,.06,.06,.04,.016,.0034,.0006/ + data hk3 /.34,.11,.1 ,.09,.12 ,.1 , .06,.04,.026,.01,.0035,.0005/ + data hk4 /.52,.21,.11,.1,.04,.015,.005/ + data hk5 /.13,.14,.13 ,.16 ,.18 ,.14 , .07,.02,.016,.008,.004,.002 / + data hk6 /.3,.2,.2,.2,.1/ + data hk7 /0.7,0.3/ + data hk8 /0.2,0.7,0.1 / + data hk9 /0.22,0.51,0.22,0.05/ + data hk10 /0.28,0.42,0.25,0.05 / + data hk11 /0.80,0.15,0.05 / + data hk12 /0.45,0.30,0.2,0.04,0.01/ + data hk13 / 0.95, 0.05 / + data hk14 / .3,.3,.2,.12,.06,.012,.004,.0025,.0011,.0004 / + data hk15 /.24,.36,.18,.1,.05,.02,.016,.012,.01,.006,.0039,.0021/ + data hk16 /.12,.24,.24,.20,.12,.06,.02/ + data hk17 /.12,.26,.22,.20,.10,.085,.015/ + data hk18 /.10,.1,.2,.25,.2,.1,.03,.02/ + + data fk1o3 /.2204e-08,.1207e-01,.4537e-01,.1032e+00,.1740e+00, & + .1210e+01,.7367e+01,.2050e+02,.8100e+02,.2410e+03/ + + + data((c2h2o(T_1,j,i),i=1,KG(2)),j=1,NUMPS) / & + -0.1735E+02,-0.1407E+02,-0.1268E+02,-0.1131E+02,-0.9261E+01,-0.6666E+01,-0.3937E+01,-0.5448E+00,-0.1690E+02,-0.1365E+02, & + -0.1232E+02,-0.1101E+02,-0.9058E+01,-0.6574E+01,-0.3914E+01,-0.5529E+00,-0.1643E+02,-0.1323E+02,-0.1195E+02,-0.1068E+02, & + -0.8840E+01,-0.6475E+01,-0.3889E+01,-0.6143E+00,-0.1598E+02,-0.1282E+02,-0.1157E+02,-0.1035E+02,-0.8598E+01,-0.6339E+01, & + -0.3848E+01,-0.6636E+00,-0.1551E+02,-0.1241E+02,-0.1119E+02,-0.1001E+02,-0.8342E+01,-0.6178E+01,-0.3788E+01,-0.8181E+00, & + -0.1506E+02,-0.1201E+02,-0.1082E+02,-0.9692E+01,-0.8073E+01,-0.6017E+01,-0.3703E+01,-0.9003E+00,-0.1446E+02,-0.1154E+02, & + -0.1042E+02,-0.9332E+01,-0.7810E+01,-0.5846E+01,-0.3576E+01,-0.1083E+01,-0.1394E+02,-0.1112E+02,-0.1005E+02,-0.8992E+01, & + -0.7548E+01,-0.5674E+01,-0.3477E+01,-0.1266E+01,-0.1351E+02,-0.1076E+02,-0.9722E+01,-0.8702E+01,-0.7334E+01,-0.5531E+01, & + -0.3401E+01,-0.1524E+01,-0.1311E+02,-0.1044E+02,-0.9422E+01,-0.8423E+01,-0.7117E+01,-0.5383E+01,-0.3410E+01,-0.1785E+01, & + -0.1274E+02,-0.1015E+02,-0.9162E+01,-0.8190E+01,-0.6949E+01,-0.5236E+01,-0.3477E+01,-0.2082E+01 / + + data((c2h2o(T_2,j,i),i=1,KG(2)),j=1,NUMPS) / & + 0.2407E-02, 0.2847E-02, 0.3768E-02, 0.4626E-02, 0.5631E-02, 0.4542E-02, 0.3475E-02,-0.3085E-02, 0.2428E-02, 0.2805E-02, & + 0.3412E-02, 0.3893E-02, 0.4773E-02, 0.3998E-02, 0.2742E-02,-0.2556E-02, 0.2428E-02, 0.2721E-02, 0.3077E-02, 0.3161E-02, & + 0.4019E-02, 0.3224E-02, 0.2512E-02,-0.1884E-02, 0.2449E-02, 0.2617E-02, 0.2763E-02, 0.2658E-02, 0.3286E-02, 0.2617E-02, & + 0.1989E-02,-0.1740E-02, 0.2512E-02, 0.2470E-02, 0.2470E-02, 0.2282E-02, 0.2512E-02, 0.1926E-02, 0.1465E-02,-0.2612E-02, & + 0.2554E-02, 0.2303E-02, 0.2303E-02, 0.1842E-02, 0.2030E-02, 0.1340E-02, 0.1068E-02,-0.1413E-02, 0.2449E-02, 0.2198E-02, & + 0.2030E-02, 0.1465E-02, 0.1528E-02, 0.9838E-03, 0.1005E-02,-0.1099E-02, 0.2868E-02, 0.2198E-02, 0.1968E-02, 0.1382E-02, & + 0.1172E-02, 0.5652E-03, 0.6070E-03,-0.1662E-02, 0.3077E-02, 0.2219E-02, 0.1800E-02, 0.1277E-02, 0.1005E-02, 0.3349E-03, & + 0.2512E-03,-0.1195E-02, 0.3182E-02, 0.2219E-02, 0.1758E-02, 0.1172E-02, 0.7326E-03, 0.4815E-03, 0.6280E-04,-0.1880E-02, & + 0.3265E-02, 0.2114E-02, 0.1696E-02, 0.1298E-02, 0.4187E-03, 0.4187E-03,-0.3768E-03,-0.1467E-02 / + + data((c2h2o(T_3,j,i),i=1,KG(2)),j=1,NUMPS) / & + -0.1180E-04,-0.1294E-04,-0.1142E-04,-0.7232E-05,-0.8754E-05,-0.1484E-04,-0.8373E-05, 0.1028E-04,-0.1218E-04,-0.1142E-04, & + -0.9515E-05,-0.1522E-05,-0.9134E-05,-0.1484E-04,-0.3425E-05, 0.1142E-06,-0.1294E-04,-0.9895E-05,-0.7231E-05,-0.4187E-05, & + -0.7612E-05,-0.3806E-05, 0.1522E-05,-0.3882E-05,-0.1256E-04,-0.8754E-05,-0.7612E-05,-0.6470E-05,-0.4948E-05,-0.3425E-05, & + 0.4948E-05,-0.1054E-04,-0.1370E-04,-0.6089E-05,-0.8373E-05,-0.5709E-05,-0.3045E-05,-0.3806E-05, 0.5328E-05, 0.8678E-05, & + -0.1370E-04,-0.6851E-05,-0.8373E-05,-0.1522E-05,-0.3425E-05, 0.0000E+00, 0.1256E-04,-0.1572E-04,-0.1484E-04,-0.7231E-05, & + -0.7992E-05,-0.4567E-05,-0.2664E-05,-0.3807E-06,-0.1522E-05, 0.2169E-05,-0.1713E-04,-0.9515E-05,-0.6089E-05,-0.6851E-05, & + -0.3045E-05,-0.1142E-05, 0.1903E-05, 0.9363E-05,-0.1560E-04,-0.9134E-05,-0.5328E-05,-0.4948E-05, 0.0000E+00, 0.7611E-06, & + -0.6851E-05, 0.1252E-04,-0.1522E-04,-0.8373E-05,-0.6089E-05,-0.6089E-05,-0.3805E-06,-0.1142E-05,-0.3807E-06, 0.2512E-05, & + -0.1599E-04,-0.7231E-05,-0.5709E-05,-0.4567E-05, 0.1522E-05,-0.2284E-05,-0.3941E-10, 0.5290E-05 / + + + data((c3h2o(T_1,j,i),i=1,KG(3)),j=1,NUMPS) / & + -0.1900E+02,-0.1515E+02,-0.1344E+02,-0.1224E+02,-0.1081E+02,-0.9337E+01,-0.7965E+01,-0.6585E+01,-0.4578E+01,-0.2247E+01, & + 0.1747E+00, 0.3083E+01,-0.1854E+02,-0.1471E+02,-0.1300E+02,-0.1181E+02,-0.1039E+02,-0.8927E+01,-0.7576E+01,-0.6238E+01, & + -0.4317E+01,-0.2119E+01, 0.1888E+00, 0.3033E+01,-0.1808E+02,-0.1426E+02,-0.1257E+02,-0.1137E+02,-0.9966E+01,-0.8513E+01, & + -0.7177E+01,-0.5885E+01,-0.4053E+01,-0.1977E+01, 0.2245E+00, 0.3005E+01,-0.1763E+02,-0.1381E+02,-0.1213E+02,-0.1094E+02, & + -0.9542E+01,-0.8094E+01,-0.6779E+01,-0.5524E+01,-0.3788E+01,-0.1796E+01, 0.2961E+00, 0.2828E+01,-0.1716E+02,-0.1337E+02, & + -0.1170E+02,-0.1051E+02,-0.9116E+01,-0.7677E+01,-0.6381E+01,-0.5153E+01,-0.3493E+01,-0.1607E+01, 0.3850E+00, 0.2660E+01, & + -0.1670E+02,-0.1295E+02,-0.1127E+02,-0.1008E+02,-0.8690E+01,-0.7265E+01,-0.5991E+01,-0.4799E+01,-0.3212E+01,-0.1438E+01, & + 0.4582E+00, 0.2588E+01,-0.1596E+02,-0.1231E+02,-0.1067E+02,-0.9501E+01,-0.8151E+01,-0.6793E+01,-0.5588E+01,-0.4458E+01, & + -0.2940E+01,-0.1257E+01, 0.4888E+00, 0.2260E+01,-0.1530E+02,-0.1184E+02,-0.1017E+02,-0.8992E+01,-0.7661E+01,-0.6369E+01, & + -0.5213E+01,-0.4145E+01,-0.2701E+01,-0.1108E+01, 0.4239E+00, 0.1974E+01,-0.1481E+02,-0.1144E+02,-0.9756E+01,-0.8573E+01, & + -0.7255E+01,-0.5994E+01,-0.4868E+01,-0.3829E+01,-0.2485E+01,-0.9738E+00, 0.3343E+00, 0.1667E+01,-0.1439E+02,-0.1108E+02, & + -0.9360E+01,-0.8183E+01,-0.6885E+01,-0.5646E+01,-0.4559E+01,-0.3555E+01,-0.2314E+01,-0.8904E+00, 0.2169E+00, 0.1289E+01, & + -0.1402E+02,-0.1073E+02,-0.8987E+01,-0.7817E+01,-0.6551E+01,-0.5335E+01,-0.4278E+01,-0.3316E+01,-0.2147E+01,-0.8695E+00, & + 0.1587E-01, 0.8658E+00 / + + data((c3h2o(T_2,j,i),i=1,KG(3)),j=1,NUMPS) / & + 0.1132E-01, 0.8855E-02, 0.6698E-02, 0.5296E-02, 0.4396E-02, 0.3370E-02, 0.3245E-02, 0.4145E-02, 0.4731E-02, 0.4756E-02, & + 0.3116E-02,-0.2763E-02, 0.1135E-01, 0.8917E-02, 0.6657E-02, 0.5170E-02, 0.4207E-02, 0.3056E-02, 0.2868E-02, 0.3433E-02, & + 0.3726E-02, 0.4109E-02, 0.2836E-02,-0.3119E-02, 0.1135E-01, 0.8980E-02, 0.6615E-02, 0.5045E-02, 0.4061E-02, 0.2847E-02, & + 0.2491E-02, 0.2847E-02, 0.2910E-02, 0.2671E-02, 0.2396E-02,-0.3245E-02, 0.1135E-01, 0.9043E-02, 0.6594E-02, 0.4940E-02, & + 0.3914E-02, 0.2638E-02, 0.2156E-02, 0.2261E-02, 0.2051E-02, 0.1978E-02, 0.1566E-02,-0.3203E-02, 0.1139E-01, 0.9085E-02, & + 0.6531E-02, 0.4835E-02, 0.3768E-02, 0.2428E-02, 0.1842E-02, 0.1612E-02, 0.1591E-02, 0.1279E-02, 0.7201E-03,-0.2763E-02, & + 0.1143E-01, 0.9085E-02, 0.6447E-02, 0.4752E-02, 0.3684E-02, 0.2261E-02, 0.1570E-02, 0.1235E-02, 0.1151E-02, 0.7243E-03, & + 0.6489E-04,-0.2240E-02, 0.1135E-01, 0.9001E-02, 0.5694E-02, 0.4438E-02, 0.3412E-02, 0.1968E-02, 0.1235E-02, 0.9420E-03, & + 0.8792E-03, 0.5045E-03,-0.1821E-03,-0.1936E-02, 0.1174E-01, 0.9273E-02, 0.5882E-02, 0.4689E-02, 0.3454E-02, 0.1947E-02, & + 0.1151E-02, 0.6070E-03, 0.6698E-03, 0.9420E-04,-0.6740E-03,-0.2707E-02, 0.1218E-01, 0.9336E-02, 0.6050E-02, 0.4731E-02, & + 0.3475E-02, 0.1863E-02, 0.1151E-02, 0.4605E-03, 0.3768E-03,-0.1214E-03,-0.4396E-03,-0.1903E-02, 0.1235E-01, 0.9294E-02, & + 0.6029E-02, 0.4584E-02, 0.3370E-02, 0.1800E-02, 0.1068E-02, 0.2303E-03, 0.1675E-03,-0.4501E-03,-0.7571E-03,-0.1149E-02, & + 0.1233E-01, 0.9315E-02, 0.6029E-02, 0.4438E-02, 0.3203E-02, 0.1842E-02, 0.9629E-03, 0.0000E+00,-0.2198E-03,-0.5338E-03, & + -0.9721E-03,-0.7661E-03 / + + data((c3h2o(T_3,j,i),i=1,KG(3)),j=1,NUMPS) / & + -0.3692E-04,-0.3844E-04,-0.2588E-04,-0.1180E-04,-0.1066E-04,-0.3426E-05,-0.2664E-05, 0.7611E-06, 0.6089E-05,-0.4568E-06, & + -0.2077E-04,-0.1142E-04,-0.3730E-04,-0.3806E-04,-0.2360E-04,-0.1256E-04,-0.1180E-04,-0.4567E-05,-0.3425E-05,-0.2284E-05, & + -0.1522E-05,-0.4225E-05,-0.9940E-05,-0.4187E-05,-0.3501E-04,-0.3844E-04,-0.2131E-04,-0.1256E-04,-0.9896E-05,-0.3806E-05, & + -0.4186E-05, 0.7612E-06,-0.1903E-05, 0.4110E-05, 0.1789E-05,-0.2169E-04,-0.3425E-04,-0.3882E-04,-0.1941E-04,-0.1294E-04, & + -0.9515E-05,-0.4567E-05,-0.4186E-05, 0.1522E-05,-0.4187E-10, 0.4605E-05,-0.2588E-05, 0.6470E-05,-0.3501E-04,-0.3730E-04, & + -0.1751E-04,-0.1332E-04,-0.1066E-04,-0.3806E-05,-0.4567E-05,-0.1142E-05,-0.3045E-05, 0.1104E-05,-0.1058E-04, 0.2816E-04, & + -0.3578E-04,-0.3501E-04,-0.1751E-04,-0.1332E-04,-0.1218E-04,-0.3806E-05,-0.3425E-05,-0.3806E-06,-0.4187E-05,-0.6090E-06, & + -0.6965E-05,-0.3463E-04,-0.3578E-04,-0.3349E-04,-0.1675E-04,-0.9895E-05,-0.9515E-05,-0.6090E-05,-0.6470E-05,-0.3807E-06, & + -0.5328E-05,-0.4186E-06,-0.3996E-05, 0.2074E-04,-0.3540E-04,-0.3083E-04,-0.1789E-04,-0.9896E-05,-0.1104E-04,-0.6470E-05, & + -0.5709E-05, 0.3425E-05,-0.4567E-05, 0.3463E-05, 0.5633E-05,-0.3159E-05,-0.3730E-04,-0.2740E-04,-0.1484E-04,-0.1066E-04, & + -0.1142E-04,-0.6470E-05,-0.6470E-05, 0.1522E-05,-0.1522E-05,-0.3045E-05, 0.3197E-05,-0.1039E-04,-0.3425E-04,-0.2284E-04, & + -0.1370E-04,-0.1028E-04,-0.1104E-04,-0.8373E-05,-0.4948E-05, 0.1903E-05,-0.7612E-06,-0.1104E-05, 0.2455E-05,-0.3805E-07, & + -0.3235E-04,-0.2093E-04,-0.1294E-04,-0.1142E-04,-0.1180E-04,-0.6851E-05,-0.3045E-05,-0.7611E-06, 0.1256E-05,-0.7231E-06, & + 0.9924E-05, 0.3578E-05 / + + + data((c4h2o(T_1,j,i),i=1,KG(4)),j=1,NUMPS) / & + -0.1722E+02,-0.1402E+02,-0.1202E+02,-0.1001E+02,-0.7702E+01,-0.5273E+01,-0.6530E+00,-0.1677E+02,-0.1359E+02,-0.1164E+02, & + -0.9662E+01,-0.7419E+01,-0.5001E+01,-0.6040E+00,-0.1630E+02,-0.1316E+02,-0.1125E+02,-0.9303E+01,-0.7092E+01,-0.4750E+01, & + -0.5715E+00,-0.1584E+02,-0.1274E+02,-0.1086E+02,-0.8939E+01,-0.6751E+01,-0.4458E+01,-0.4928E+00,-0.1538E+02,-0.1232E+02, & + -0.1048E+02,-0.8579E+01,-0.6399E+01,-0.4191E+01,-0.4683E+00,-0.1493E+02,-0.1192E+02,-0.1011E+02,-0.8241E+01,-0.6065E+01, & + -0.3910E+01,-0.4310E+00,-0.1440E+02,-0.1145E+02,-0.9643E+01,-0.7873E+01,-0.5710E+01,-0.3668E+01,-0.3304E+00,-0.1391E+02, & + -0.1104E+02,-0.9238E+01,-0.7479E+01,-0.5367E+01,-0.3387E+01,-0.3604E+00,-0.1348E+02,-0.1069E+02,-0.8918E+01,-0.7122E+01, & + -0.5086E+01,-0.3152E+01,-0.3030E+00,-0.1310E+02,-0.1037E+02,-0.8626E+01,-0.6790E+01,-0.4815E+01,-0.2945E+01,-0.4789E+00, & + -0.1275E+02,-0.1011E+02,-0.8347E+01,-0.6484E+01,-0.4584E+01,-0.2788E+01,-0.5807E+00 / + + data((c4h2o(T_2,j,i),i=1,KG(4)),j=1,NUMPS) / & + 0.7934E-02, 0.9231E-02, 0.1005E-01, 0.9043E-02, 0.8164E-02, 0.8980E-02, 0.6403E-02, 0.7954E-02, 0.9169E-02, 0.9797E-02, & + 0.8687E-02, 0.7724E-02, 0.7954E-02, 0.6652E-02, 0.7954E-02, 0.9043E-02, 0.9608E-02, 0.8499E-02, 0.7347E-02, 0.7473E-02, & + 0.6382E-02, 0.7996E-02, 0.8980E-02, 0.9378E-02, 0.8289E-02, 0.7264E-02, 0.6594E-02, 0.6674E-02, 0.8059E-02, 0.8938E-02, & + 0.9294E-02, 0.8227E-02, 0.7201E-02, 0.6678E-02, 0.7032E-02, 0.8122E-02, 0.8896E-02, 0.9189E-02, 0.8038E-02, 0.7033E-02, & + 0.5987E-02, 0.5475E-02, 0.8268E-02, 0.9064E-02, 0.8792E-02, 0.7975E-02, 0.6573E-02, 0.5087E-02, 0.4657E-02, 0.8541E-02, & + 0.8980E-02, 0.9085E-02, 0.7996E-02, 0.6133E-02, 0.4501E-02, 0.3860E-02, 0.8813E-02, 0.9043E-02, 0.9294E-02, 0.8122E-02, & + 0.5861E-02, 0.4354E-02, 0.3964E-02, 0.8875E-02, 0.8834E-02, 0.9797E-02, 0.8164E-02, 0.5463E-02, 0.4417E-02, 0.3270E-02, & + 0.8938E-02, 0.8771E-02, 0.1005E-01, 0.8247E-02, 0.5589E-02, 0.4835E-02, 0.3033E-02 / + + data((c4h2o(T_3,j,i),i=1,KG(4)),j=1,NUMPS) / & + -0.1484E-04,-0.2169E-04,-0.2436E-04,-0.2588E-04,-0.1142E-04,-0.1142E-05,-0.1519E-04,-0.1522E-04,-0.2055E-04,-0.2131E-04, & + -0.2398E-04,-0.4948E-05,-0.1675E-04,-0.3593E-04,-0.1522E-04,-0.2055E-04,-0.1865E-04,-0.2207E-04,-0.4948E-05,-0.1180E-04, & + -0.1237E-04,-0.1598E-04,-0.2017E-04,-0.1903E-04,-0.2284E-04,-0.1028E-04,-0.1865E-04,-0.2381E-04,-0.1713E-04,-0.2017E-04, & + -0.1827E-04,-0.2169E-04,-0.1218E-04,-0.9515E-05,-0.2415E-04,-0.1827E-04,-0.2093E-04,-0.1637E-04,-0.1827E-04,-0.9134E-05, & + -0.8373E-05,-0.1243E-04,-0.1560E-04,-0.1865E-04,-0.1599E-04,-0.1256E-04,-0.1066E-04,-0.1142E-05,-0.2181E-04,-0.1675E-04, & + -0.1560E-04,-0.1522E-04,-0.1675E-04,-0.1865E-04,-0.1865E-04,-0.9522E-05,-0.1332E-04,-0.1370E-04,-0.1446E-04,-0.2055E-04, & + -0.1142E-04,-0.2512E-04,-0.3343E-04,-0.1294E-04,-0.1294E-04,-0.1751E-04,-0.2512E-04,-0.1560E-04,-0.2854E-04,-0.7003E-05, & + -0.8753E-05,-0.1028E-04,-0.1751E-04,-0.2512E-04,-0.1713E-04,-0.1713E-04,-0.1245E-04 / + + + data((c5h2o(T_1,j,i),i=1,KG(5)),j=1,NUMPS) / & + -0.1499E+02,-0.1267E+02,-0.1118E+02,-0.9696E+01,-0.7992E+01,-0.6323E+01,-0.4414E+01,-0.2961E+01,-0.1715E+01,-0.1406E+00, & + 0.1612E+01, 0.3689E+01,-0.1454E+02,-0.1223E+02,-0.1075E+02,-0.9277E+01,-0.7576E+01,-0.5915E+01,-0.4043E+01,-0.2630E+01, & + -0.1449E+01, 0.2314E-01, 0.1708E+01, 0.3744E+01,-0.1408E+02,-0.1178E+02,-0.1031E+02,-0.8851E+01,-0.7154E+01,-0.5503E+01, & + -0.3666E+01,-0.2288E+01,-0.1141E+01, 0.2772E+00, 0.1819E+01, 0.3788E+01,-0.1363E+02,-0.1134E+02,-0.9876E+01,-0.8423E+01, & + -0.6733E+01,-0.5091E+01,-0.3286E+01,-0.1938E+01,-0.8649E+00, 0.5349E+00, 0.1969E+01, 0.3795E+01,-0.1318E+02,-0.1091E+02, & + -0.9452E+01,-0.8004E+01,-0.6309E+01,-0.4677E+01,-0.2904E+01,-0.1595E+01,-0.5641E+00, 0.7592E+00, 0.2109E+01, 0.3783E+01, & + -0.1275E+02,-0.1048E+02,-0.9028E+01,-0.7585E+01,-0.5892E+01,-0.4267E+01,-0.2524E+01,-0.1274E+01,-0.2782E+00, 0.9376E+00, & + 0.2257E+01, 0.3714E+01,-0.1180E+02,-0.9887E+01,-0.8492E+01,-0.7014E+01,-0.5390E+01,-0.3834E+01,-0.2156E+01,-0.9775E+00, & + -0.3129E-01, 0.1151E+01, 0.2330E+01, 0.3592E+01,-0.1114E+02,-0.9367E+01,-0.8002E+01,-0.6514E+01,-0.4928E+01,-0.3435E+01, & + -0.1835E+01,-0.7064E+00, 0.2153E+00, 0.1309E+01, 0.2422E+01, 0.3488E+01,-0.1074E+02,-0.8941E+01,-0.7582E+01,-0.6116E+01, & + -0.4536E+01,-0.3072E+01,-0.1521E+01,-0.4651E+00, 0.4053E+00, 0.1465E+01, 0.2374E+01, 0.3260E+01,-0.1041E+02,-0.8545E+01, & + -0.7180E+01,-0.5745E+01,-0.4177E+01,-0.2735E+01,-0.1245E+01,-0.2356E+00, 0.5786E+00, 0.1516E+01, 0.2263E+01, 0.3074E+01, & + -0.1008E+02,-0.8149E+01,-0.6804E+01,-0.5409E+01,-0.3855E+01,-0.2427E+01,-0.9857E+00,-0.4939E-01, 0.7060E+00, 0.1483E+01, & + 0.2159E+01, 0.2745E+01 / + + data((c5h2o(T_2,j,i),i=1,KG(5)),j=1,NUMPS) / & + 0.9985E-02, 0.8373E-02, 0.7431E-02, 0.6866E-02, 0.4584E-02, 0.2952E-02, 0.3098E-02, 0.3768E-02, 0.4013E-02, 0.3960E-02, & + 0.3228E-02, 0.3203E-02, 0.1007E-01, 0.8436E-02, 0.7368E-02, 0.6657E-02, 0.4375E-02, 0.2617E-02, 0.2742E-02, 0.3286E-02, & + 0.3192E-02, 0.2992E-02, 0.2612E-02, 0.1968E-02, 0.1019E-01, 0.8457E-02, 0.7264E-02, 0.6426E-02, 0.4187E-02, 0.2365E-02, & + 0.2324E-02, 0.2614E-02, 0.2736E-02, 0.2068E-02, 0.2085E-02, 0.1005E-02, 0.1028E-01, 0.8478E-02, 0.7138E-02, 0.6259E-02, & + 0.3998E-02, 0.2156E-02, 0.1926E-02, 0.1953E-02, 0.2250E-02, 0.1844E-02, 0.1869E-02,-0.6489E-03, 0.1030E-01, 0.8478E-02, & + 0.7033E-02, 0.6112E-02, 0.3852E-02, 0.1989E-02, 0.1716E-02, 0.1763E-02, 0.1432E-02, 0.1193E-02, 0.1306E-02,-0.5861E-03, & + 0.1042E-01, 0.8499E-02, 0.6887E-02, 0.5987E-02, 0.3768E-02, 0.1800E-02, 0.1549E-02, 0.1712E-02, 0.1287E-02, 0.7389E-03, & + 0.7222E-03,-0.1130E-02, 0.8227E-02, 0.7201E-02, 0.6866E-02, 0.5903E-02, 0.3412E-02, 0.1591E-02, 0.1402E-02, 0.1346E-02, & + 0.1041E-02, 0.8185E-03, 0.3349E-03,-0.4815E-03, 0.8268E-02, 0.6992E-02, 0.7159E-02, 0.6384E-02, 0.3286E-02, 0.1591E-02, & + 0.1271E-02, 0.1202E-02, 0.9187E-03, 0.6531E-03,-0.4187E-03,-0.7954E-03, 0.8478E-02, 0.7159E-02, 0.7117E-02, 0.6447E-02, & + 0.3349E-02, 0.1528E-02, 0.9964E-03, 0.9210E-03, 0.6112E-03, 0.6259E-03,-0.3768E-03,-0.1298E-02, 0.8520E-02, 0.7075E-02, & + 0.7096E-02, 0.6405E-02, 0.3245E-02, 0.1528E-02, 0.1011E-02, 0.7877E-03, 0.7536E-03, 0.9001E-04,-0.6719E-03,-0.1026E-02, & + 0.8561E-02, 0.6950E-02, 0.7033E-02, 0.6280E-02, 0.2993E-02, 0.1528E-02, 0.6698E-03, 0.5847E-03, 0.2847E-03,-0.6280E-04, & + -0.9420E-03,-0.1444E-02 / + + data((c5h2o(T_3,j,i),i=1,KG(5)),j=1,NUMPS) / & + -0.1408E-04,-0.2664E-04,-0.1180E-04,-0.1903E-04,-0.9515E-05, 0.3806E-06,-0.6851E-05,-0.3806E-05,-0.4834E-05,-0.3239E-05, & + -0.2284E-05,-0.1028E-04,-0.1484E-04,-0.2550E-04,-0.1142E-04,-0.1827E-04,-0.9515E-05, 0.3805E-06,-0.4948E-05, 0.3806E-06, & + -0.2664E-06, 0.1058E-04,-0.1012E-04,-0.1142E-04,-0.1560E-04,-0.2512E-04,-0.1256E-04,-0.1865E-04,-0.9134E-05, 0.1142E-05, & + -0.3425E-05, 0.2474E-05,-0.9781E-05,-0.1519E-05,-0.7916E-05,-0.1294E-04,-0.1560E-04,-0.2474E-04,-0.1180E-04,-0.2017E-04, & + -0.7992E-05, 0.3805E-06,-0.2283E-05,-0.4453E-05,-0.1180E-05,-0.5138E-05,-0.4453E-05,-0.3425E-05,-0.1522E-04,-0.2550E-04, & + -0.9896E-05,-0.1903E-04,-0.9134E-05,-0.1142E-05,-0.7611E-06,-0.5252E-05,-0.4567E-06,-0.4643E-05,-0.4567E-06,-0.4567E-05, & + -0.1294E-04,-0.2512E-04,-0.1028E-04,-0.2055E-04,-0.9896E-05,-0.4567E-05,-0.2284E-05,-0.5100E-05,-0.4339E-06,-0.9515E-06, & + -0.1252E-04,-0.7612E-06,-0.2246E-04,-0.1370E-04,-0.1066E-04,-0.1598E-04,-0.8754E-05,-0.5328E-05,-0.6622E-05,-0.5138E-05, & + -0.8754E-07,-0.9515E-06, 0.6090E-05, 0.4187E-05,-0.3463E-04,-0.1599E-04,-0.1218E-04,-0.2093E-04,-0.9515E-05,-0.4567E-05, & + -0.1104E-05,-0.1903E-05,-0.1488E-05,-0.3730E-05,-0.4567E-05, 0.3045E-05,-0.3463E-04,-0.1675E-04,-0.1294E-04,-0.1979E-04, & + -0.1066E-04,-0.4187E-05,-0.4034E-05,-0.2893E-05,-0.2588E-05,-0.9401E-05, 0.2284E-05, 0.3045E-05,-0.2778E-04,-0.1522E-04, & + -0.1560E-04,-0.1751E-04,-0.1256E-04,-0.5709E-05,-0.2474E-05,-0.2577E-05,-0.2284E-05,-0.4187E-06, 0.7650E-05,-0.3425E-05, & + -0.3083E-04,-0.1827E-04,-0.1370E-04,-0.1751E-04,-0.1104E-04,-0.9515E-05,-0.6318E-05,-0.4358E-05,-0.7613E-07, 0.4643E-05, & + 0.4415E-05, 0.1028E-04 / + + + data((c6h2o(T_1,j,i),i=1,KG(6)),j=1,NUMPS) / & + -0.1905E+02,-0.1602E+02,-0.1472E+02,-0.1307E+02,-0.1024E+02,-0.1823E+02,-0.1555E+02,-0.1427E+02,-0.1266E+02,-0.9938E+01, & + -0.1749E+02,-0.1508E+02,-0.1381E+02,-0.1225E+02,-0.9641E+01,-0.1684E+02,-0.1462E+02,-0.1337E+02,-0.1185E+02,-0.9367E+01, & + -0.1630E+02,-0.1417E+02,-0.1294E+02,-0.1145E+02,-0.9123E+01,-0.1578E+02,-0.1373E+02,-0.1251E+02,-0.1108E+02,-0.8881E+01, & + -0.1517E+02,-0.1327E+02,-0.1209E+02,-0.1072E+02,-0.8653E+01,-0.1463E+02,-0.1284E+02,-0.1169E+02,-0.1040E+02,-0.8453E+01, & + -0.1421E+02,-0.1244E+02,-0.1133E+02,-0.1014E+02,-0.8312E+01,-0.1382E+02,-0.1207E+02,-0.1100E+02,-0.9887E+01,-0.8220E+01, & + -0.1348E+02,-0.1173E+02,-0.1071E+02,-0.9685E+01,-0.8220E+01 / + + data((c6h2o(T_2,j,i),i=1,KG(6)),j=1,NUMPS) / & + 0.1024E-01, 0.1842E-02, 0.6908E-03, 0.1737E-02, 0.3517E-02, 0.8394E-02, 0.2072E-02, 0.8164E-03, 0.1716E-02, 0.2805E-02, & + 0.8143E-02, 0.2240E-02, 0.9001E-03, 0.1570E-02, 0.1800E-02, 0.8227E-02, 0.2386E-02, 0.9420E-03, 0.1486E-02, 0.1068E-02, & + 0.8373E-02, 0.2533E-02, 0.9210E-03, 0.1319E-02, 0.9420E-03, 0.8394E-02, 0.2700E-02, 0.9629E-03, 0.1026E-02, 0.5233E-03, & + 0.8917E-02, 0.2575E-02, 0.8792E-03, 0.7536E-03, 0.4187E-03, 0.9378E-02, 0.2617E-02, 0.7955E-03, 0.6070E-03, 0.4815E-03, & + 0.9797E-02, 0.2638E-02, 0.6908E-03, 0.5233E-03, 0.6280E-03, 0.1009E-01, 0.2638E-02, 0.4815E-03, 0.2931E-03, 0.4815E-03, & + 0.1036E-01, 0.2428E-02, 0.3140E-03, 0.3977E-03, 0.2093E-03 / + + data((c6h2o(T_3,j,i),i=1,KG(6)),j=1,NUMPS) / & + -0.5366E-04,-0.1522E-04,-0.5709E-05,-0.2664E-05, 0.3806E-05,-0.4301E-04,-0.1484E-04,-0.4948E-05,-0.7610E-06, 0.7610E-06, & + -0.3920E-04,-0.1484E-04,-0.4948E-05, 0.3804E-06,-0.3806E-05,-0.3920E-04,-0.1522E-04,-0.4948E-05, 0.3425E-05, 0.1903E-05, & + -0.3806E-04,-0.1484E-04,-0.3045E-05, 0.2664E-05, 0.7993E-05,-0.4148E-04,-0.1408E-04,-0.3806E-05, 0.4187E-05, 0.7993E-05, & + -0.5481E-04,-0.1180E-04,-0.3045E-05, 0.3045E-05, 0.2284E-05,-0.5709E-04,-0.1104E-04,-0.2283E-05,-0.2664E-05,-0.1142E-05, & + -0.6090E-04,-0.1218E-04,-0.2664E-05, 0.3804E-06, 0.3045E-05,-0.6698E-04,-0.1218E-04,-0.2664E-05, 0.1523E-05,-0.1142E-05, & + -0.6508E-04,-0.1218E-04,-0.3425E-05, 0.1903E-05, 0.7612E-06 / + + + data((c7h2o(T_1,j,i),i=1,KG(7)),j=1,NUMPIR) / & + -0.2008E+02,-0.1467E+02,-0.2004E+02,-0.1426E+02,-0.2001E+02,-0.1386E+02,-0.1998E+02,-0.1345E+02,-0.1995E+02,-0.1304E+02, & + -0.1992E+02,-0.1263E+02,-0.1989E+02,-0.1223E+02,-0.1986E+02,-0.1183E+02,-0.1984E+02,-0.1143E+02,-0.1758E+02,-0.1038E+02, & + -0.1602E+02,-0.9480E+01,-0.1469E+02,-0.8752E+01,-0.1349E+02,-0.8218E+01,-0.1255E+02,-0.7677E+01,-0.1174E+02,-0.7184E+01, & + -0.1110E+02,-0.6735E+01,-0.1056E+02,-0.6332E+01,-0.1019E+02,-0.5975E+01,-0.9874E+01,-0.5644E+01 / + + data((c7h2o(T_2,j,i),i=1,KG(7)),j=1,NUMPIR) / & + 0.2533E-02, 0.2269E-01, 0.2575E-02, 0.2263E-01, 0.2554E-02, 0.2267E-01, 0.2491E-02, 0.2250E-01, 0.2449E-02, 0.2244E-01, & + 0.2344E-02, 0.2234E-01, 0.2219E-02, 0.2208E-01, 0.5694E-02, 0.2190E-01, 0.9650E-02, 0.2162E-01, 0.3286E-01, 0.1848E-01, & + 0.2987E-01, 0.1578E-01, 0.2527E-01, 0.1465E-01, 0.2175E-01, 0.1386E-01, 0.2056E-01, 0.1235E-01, 0.1963E-01, 0.1116E-01, & + 0.1926E-01, 0.1040E-01, 0.2014E-01, 0.1040E-01, 0.2024E-01, 0.1042E-01, 0.1972E-01, 0.1080E-01 / + + data((c7h2o(T_3,j,i),i=1,KG(7)),j=1,NUMPIR) / & + -0.8754E-05,-0.6698E-04,-0.1104E-04,-0.6432E-04,-0.1142E-04,-0.6051E-04,-0.1180E-04,-0.6128E-04,-0.1180E-04,-0.6242E-04, & + -0.1218E-04,-0.6280E-04,-0.1218E-04,-0.6204E-04, 0.5328E-04,-0.5709E-04, 0.1275E-03,-0.5214E-04,-0.1370E-03,-0.4148E-04, & + -0.1100E-03,-0.3045E-04,-0.9248E-04,-0.3197E-04,-0.7346E-04,-0.2436E-04,-0.5100E-04,-0.2131E-04,-0.5861E-04,-0.2550E-04, & + -0.5328E-04,-0.3311E-04,-0.6090E-04,-0.4225E-04,-0.5443E-04,-0.4415E-04,-0.4034E-04,-0.4339E-04 / + + + data((c8h2o(T_1,j,i),i=1,KG(8)),j=1,NUMPIR) / & + -0.2283E+02,-0.1639E+02,-0.6155E+01,-0.2237E+02,-0.1595E+02,-0.5775E+01,-0.2191E+02,-0.1551E+02,-0.5381E+01,-0.2145E+02, & + -0.1507E+02,-0.5004E+01,-0.2099E+02,-0.1463E+02,-0.4617E+01,-0.2053E+02,-0.1419E+02,-0.4218E+01,-0.2025E+02,-0.1375E+02, & + -0.3806E+01,-0.2021E+02,-0.1330E+02,-0.3403E+01,-0.2018E+02,-0.1287E+02,-0.2993E+01,-0.1998E+02,-0.1091E+02,-0.2586E+01, & + -0.1744E+02,-0.9171E+01,-0.2162E+01,-0.1490E+02,-0.7642E+01,-0.1763E+01,-0.1303E+02,-0.6526E+01,-0.1373E+01,-0.1113E+02, & + -0.5846E+01,-0.9699E+00,-0.9814E+01,-0.5280E+01,-0.5955E+00,-0.8582E+01,-0.4787E+01,-0.2510E+00,-0.8020E+01,-0.4350E+01, & + 0.2770E-01,-0.7571E+01,-0.3942E+01, 0.2406E+00,-0.7140E+01,-0.3537E+01, 0.3567E+00 / + + data((c8h2o(T_2,j,i),i=1,KG(8)),j=1,NUMPIR) / & + 0.3722E-01, 0.1505E-01, 0.6615E-02, 0.3722E-01, 0.1518E-01, 0.5840E-02, 0.3720E-01, 0.1526E-01, 0.5170E-02, 0.3399E-01, & + 0.1530E-01, 0.4773E-02, 0.3012E-01, 0.1551E-01, 0.4333E-02, 0.2625E-01, 0.1553E-01, 0.3956E-02, 0.2240E-01, 0.1562E-01, & + 0.3454E-02, 0.1846E-01, 0.1574E-01, 0.3161E-02, 0.1446E-01, 0.1572E-01, 0.3098E-02, 0.5924E-02, 0.8875E-02, 0.2658E-02, & + 0.2204E-01, 0.7096E-02, 0.2504E-02, 0.1591E-01, 0.5233E-02, 0.2292E-02, 0.8855E-02, 0.4249E-02, 0.2190E-02, 0.5422E-02, & + 0.3496E-02, 0.2041E-02, 0.4919E-02, 0.3621E-02, 0.2200E-02, 0.6657E-02, 0.3663E-02, 0.2248E-02, 0.8645E-02, 0.3852E-02, & + 0.2118E-02, 0.8771E-02, 0.3873E-02, 0.2176E-02, 0.9043E-02, 0.3747E-02, 0.2079E-02 / + + data((c8h2o(T_3,j,i),i=1,KG(8)),j=1,NUMPIR) / & + -0.1568E-03,-0.4681E-04, 0.4567E-05,-0.1568E-03,-0.4605E-04,-0.3425E-05,-0.1572E-03,-0.4605E-04,-0.1104E-04,-0.2154E-03, & + -0.4453E-04,-0.6851E-05,-0.2843E-03,-0.4225E-04,-0.7231E-05,-0.3562E-03,-0.4110E-04,-0.7231E-05,-0.3692E-03,-0.4110E-04, & + -0.1028E-04,-0.3007E-03,-0.4263E-04,-0.6470E-05,-0.2325E-03,-0.3996E-04,-0.8373E-05,-0.5290E-04,-0.7612E-05,-0.4948E-05, & + -0.7422E-04,-0.1256E-04,-0.8449E-05,-0.3501E-04,-0.1446E-04,-0.4834E-05, 0.4529E-04,-0.2246E-04,-0.2893E-05, 0.6470E-05, & + -0.1789E-04,-0.7498E-05,-0.4948E-05,-0.1713E-04,-0.8183E-05,-0.5481E-04,-0.1713E-04,-0.1447E-04,-0.4986E-04,-0.1903E-04, & + -0.1353E-04,-0.5138E-04,-0.1484E-04,-0.1147E-04,-0.5328E-04,-0.1560E-04,-0.6588E-05 / + + + data((c9h2o(T_1,j,i),i=1,KG(9)),j=1,NUMPIR) / & + -0.2066E+02,-0.1464E+02,-0.8301E+01,-0.3548E+01,-0.2025E+02,-0.1419E+02,-0.7905E+01,-0.3260E+01,-0.2019E+02,-0.1374E+02, & + -0.7495E+01,-0.2927E+01,-0.2013E+02,-0.1329E+02,-0.7078E+01,-0.2584E+01,-0.2007E+02,-0.1284E+02,-0.6675E+01,-0.2247E+01, & + -0.2001E+02,-0.1239E+02,-0.6268E+01,-0.1890E+01,-0.1996E+02,-0.1194E+02,-0.5853E+01,-0.1530E+01,-0.1991E+02,-0.1150E+02, & + -0.5441E+01,-0.1133E+01,-0.1987E+02,-0.1105E+02,-0.5022E+01,-0.7447E+00,-0.1575E+02,-0.9657E+01,-0.4191E+01,-0.3728E+00, & + -0.1329E+02,-0.8133E+01,-0.3638E+01, 0.1616E-01,-0.1181E+02,-0.6675E+01,-0.3178E+01, 0.4083E+00,-0.1036E+02,-0.5655E+01, & + -0.2731E+01, 0.7953E+00,-0.8628E+01,-0.4990E+01,-0.2303E+01, 0.1153E+01,-0.7223E+01,-0.4453E+01,-0.1877E+01, 0.1454E+01, & + -0.6567E+01,-0.3974E+01,-0.1461E+01, 0.1663E+01,-0.6077E+01,-0.3551E+01,-0.1071E+01, 0.1800E+01,-0.5651E+01,-0.3136E+01, & + -0.7005E+00, 0.1809E+01,-0.5241E+01,-0.2726E+01,-0.3859E+00, 0.1781E+01 / + + data((c9h2o(T_2,j,i),i=1,KG(9)),j=1,NUMPIR) / & + 0.1315E-01, 0.4542E-02, 0.3496E-02, 0.4877E-02, 0.9650E-02, 0.4542E-02, 0.3098E-02, 0.3956E-02, 0.6154E-02, 0.4626E-02, & + 0.2763E-02, 0.3077E-02, 0.2658E-02, 0.4626E-02, 0.2512E-02, 0.2261E-02, 0.2658E-02, 0.4689E-02, 0.2219E-02, 0.1405E-02, & + 0.2700E-02, 0.4752E-02, 0.1926E-02, 0.7473E-03, 0.2658E-02, 0.4773E-02, 0.1737E-02, 0.5066E-03, 0.4668E-02, 0.4815E-02, & + 0.1507E-02, 0.1842E-03, 0.8541E-02, 0.4794E-02, 0.1382E-02,-0.2156E-03, 0.1022E-01, 0.2198E-02, 0.3977E-03,-0.2910E-03, & + 0.5484E-02, 0.6698E-03, 0.0000E+00,-0.2339E-03, 0.3349E-02, 0.1068E-02,-0.2512E-03,-0.4228E-03, 0.1884E-02, 0.2093E-03, & + -0.3977E-03,-0.6405E-03,-0.8373E-04,-0.5233E-03,-0.4124E-03,-0.5945E-03, 0.7536E-03,-0.6698E-03,-0.4919E-03,-0.4794E-03, & + 0.3600E-02,-0.4605E-03,-0.4375E-03,-0.3517E-03, 0.3873E-02,-0.5861E-03,-0.3203E-03,-0.4689E-03, 0.3935E-02,-0.7326E-03, & + -0.2072E-03,-0.4228E-03, 0.4124E-02,-0.8582E-03,-0.4187E-04,-0.5945E-03 / + + data((c9h2o(T_3,j,i),i=1,KG(9)),j=1,NUMPIR) / & + -0.8525E-04, 0.1865E-04,-0.1142E-05, 0.2664E-05,-0.1313E-03, 0.1865E-04, 0.0000E+00, 0.1256E-04,-0.6470E-04, 0.1865E-04, & + -0.3045E-05, 0.8754E-05, 0.3805E-06, 0.1789E-04,-0.6851E-05, 0.5328E-05, 0.1142E-05, 0.1827E-04,-0.6090E-05, 0.4148E-05, & + 0.1142E-05, 0.1865E-04,-0.3806E-05,-0.3768E-05,-0.1903E-05, 0.1751E-04,-0.4948E-05, 0.3121E-05, 0.3159E-04, 0.1979E-04, & + -0.3045E-05,-0.9896E-06, 0.1005E-03, 0.1789E-04,-0.6089E-05,-0.1865E-05,-0.2207E-04, 0.1941E-04, 0.1903E-05, 0.2322E-05, & + -0.1675E-04, 0.6090E-05,-0.7611E-06, 0.4397E-05, 0.3425E-04, 0.3806E-06, 0.1522E-05, 0.3806E-05, 0.4796E-04, 0.1522E-05, & + -0.3806E-06, 0.3654E-05,-0.6851E-05, 0.2664E-05,-0.3920E-05,-0.6850E-06,-0.1370E-04, 0.5328E-05,-0.6584E-05,-0.8716E-05, & + -0.8374E-10, 0.1522E-05,-0.6356E-05, 0.1294E-05,-0.9515E-05, 0.7612E-06,-0.3235E-05,-0.1066E-05,-0.7612E-05, 0.1142E-05, & + -0.4529E-05, 0.3730E-05,-0.2664E-05,-0.3806E-06,-0.3501E-05,-0.5328E-06 / + + + data((c10h2o(T_1,j,i),i=1,KG(10)),j=1,NUMPIR) / & + -0.2023E+02,-0.1641E+02,-0.1171E+02,-0.6090E+01,-0.2016E+02,-0.1595E+02,-0.1133E+02,-0.5867E+01,-0.2011E+02,-0.1550E+02, & + -0.1095E+02,-0.5660E+01,-0.2005E+02,-0.1504E+02,-0.1055E+02,-0.5407E+01,-0.2001E+02,-0.1459E+02,-0.1015E+02,-0.5137E+01, & + -0.1997E+02,-0.1413E+02,-0.9749E+01,-0.4852E+01,-0.1993E+02,-0.1367E+02,-0.9337E+01,-0.4534E+01,-0.1990E+02,-0.1321E+02, & + -0.8920E+01,-0.4211E+01,-0.1987E+02,-0.1276E+02,-0.8506E+01,-0.3889E+01,-0.1645E+02,-0.1179E+02,-0.7711E+01,-0.3613E+01, & + -0.1442E+02,-0.1081E+02,-0.6942E+01,-0.3316E+01,-0.1308E+02,-0.9950E+01,-0.6344E+01,-0.2950E+01,-0.1212E+02,-0.9217E+01, & + -0.5904E+01,-0.2577E+01,-0.1131E+02,-0.8559E+01,-0.5519E+01,-0.2256E+01,-0.1064E+02,-0.7962E+01,-0.5183E+01,-0.1929E+01, & + -0.1013E+02,-0.7447E+01,-0.4833E+01,-0.1643E+01,-0.9712E+01,-0.7071E+01,-0.4485E+01,-0.1410E+01,-0.9305E+01,-0.6760E+01, & + -0.4145E+01,-0.1249E+01,-0.8966E+01,-0.6477E+01,-0.3820E+01,-0.1114E+01 / + + data((c10h2o(T_2,j,i),i=1,KG(10)),j=1,NUMPIR) / & + 0.7913E-02, 0.8206E-02, 0.1509E-01, 0.1869E-01, 0.4228E-02, 0.8247E-02, 0.1467E-01, 0.1783E-01, 0.2010E-02, 0.8227E-02, & + 0.1442E-01, 0.1687E-01, 0.1947E-02, 0.8289E-02, 0.1394E-01, 0.1568E-01, 0.1863E-02, 0.8289E-02, 0.1346E-01, 0.1484E-01, & + 0.1842E-02, 0.8415E-02, 0.1310E-01, 0.1400E-01, 0.1800E-02, 0.8457E-02, 0.1275E-01, 0.1377E-01, 0.1696E-02, 0.8478E-02, & + 0.1220E-01, 0.1321E-01, 0.1842E-02, 0.8478E-02, 0.1189E-01, 0.1250E-01, 0.1409E-01, 0.8624E-02, 0.1254E-01, 0.1214E-01, & + 0.9043E-02, 0.1045E-01, 0.1225E-01, 0.1260E-01, 0.8561E-02, 0.1202E-01, 0.1181E-01, 0.1296E-01, 0.1114E-01, 0.1235E-01, & + 0.1191E-01, 0.1330E-01, 0.1199E-01, 0.1271E-01, 0.1195E-01, 0.1371E-01, 0.1415E-01, 0.1315E-01, 0.1218E-01, 0.1361E-01, & + 0.1478E-01, 0.1338E-01, 0.1296E-01, 0.1306E-01, 0.1518E-01, 0.1375E-01, 0.1365E-01, 0.1334E-01, 0.1530E-01, 0.1411E-01, & + 0.1392E-01, 0.1327E-01, 0.1547E-01, 0.1507E-01, 0.1390E-01, 0.1264E-01 / + + data((c10h2o(T_3,j,i),i=1,KG(10)),j=1,NUMPIR) / & + -0.1089E-03,-0.2740E-04,-0.2017E-04,-0.5519E-04,-0.4491E-04,-0.2740E-04,-0.1408E-04,-0.5937E-04,-0.6090E-05,-0.2702E-04, & + -0.6470E-05,-0.4719E-04,-0.7232E-05,-0.2740E-04,-0.6089E-05,-0.4910E-04,-0.7231E-05,-0.2969E-04,-0.4186E-05,-0.5366E-04, & + -0.6090E-05,-0.3045E-04,-0.2284E-05,-0.4986E-04,-0.4568E-05,-0.3121E-04,-0.4948E-05,-0.5100E-04,-0.3426E-05,-0.3007E-04, & + -0.7993E-05,-0.4910E-04, 0.1522E-05,-0.2931E-04,-0.9896E-05,-0.5366E-04,-0.5823E-04,-0.1599E-04,-0.1713E-04,-0.4110E-04, & + -0.3121E-04,-0.1713E-04,-0.3159E-04,-0.3578E-04,-0.3996E-04,-0.1598E-04,-0.3958E-04,-0.4605E-04,-0.3349E-04,-0.1751E-04, & + -0.3844E-04,-0.5576E-04,-0.2626E-04,-0.2474E-04,-0.3920E-04,-0.4464E-04,-0.1979E-04,-0.3045E-04,-0.3958E-04,-0.5336E-04, & + -0.2893E-04,-0.3616E-04,-0.3996E-04,-0.4754E-04,-0.2398E-04,-0.3083E-04,-0.4415E-04,-0.5119E-04,-0.2702E-04,-0.2664E-04, & + -0.4605E-04,-0.4038E-04,-0.2398E-04,-0.2360E-04,-0.4948E-04,-0.5149E-04 / + + + data((c10ch4(k,j),j=1,NUMPIR),k=1,NUMTIR) / & + -0.8909E+01,-0.8464E+01,-0.8018E+01,-0.7573E+01,-0.7133E+01,-0.6687E+01,-0.6240E+01,-0.5803E+01,-0.5377E+01,-0.4534E+01, & + -0.3983E+01,-0.3502E+01,-0.3062E+01,-0.2648E+01,-0.2265E+01,-0.1896E+01,-0.1568E+01,-0.1234E+01,-0.9298E+00, 0.9629E-03, & + 0.9838E-03, 0.1088E-02, 0.1172E-02, 0.1256E-02, 0.1402E-02, 0.1528E-02, 0.1633E-02, 0.1716E-02, 0.4815E-03,-0.3977E-03, & + -0.5652E-03,-0.5024E-03,-0.4605E-03,-0.4563E-03,-0.4438E-03,-0.4521E-03,-0.4312E-03,-0.3789E-03,-0.1294E-04,-0.1408E-04, & + -0.1522E-04,-0.1675E-04,-0.1751E-04,-0.1941E-04,-0.2246E-04,-0.2207E-04,-0.1827E-04,-0.1256E-04,-0.9515E-05,-0.6470E-05, & + -0.3045E-05,-0.3806E-05,-0.2055E-05,-0.3730E-05,-0.7612E-06,-0.3806E-05, 0.1256E-05 / + + + data((c10n2o(k,j),j=1,NUMPIR),k=1,NUMTIR) / & + -0.7863E+01,-0.7412E+01,-0.6963E+01,-0.6514E+01,-0.6065E+01,-0.5611E+01,-0.5167E+01,-0.4720E+01,-0.4283E+01,-0.3454E+01, & + -0.2858E+01,-0.2404E+01,-0.1922E+01,-0.1491E+01,-0.1097E+01,-0.7177E+00,-0.3548E+00, 0.1218E-01, 0.3088E+00, 0.4459E-02, & + 0.4542E-02, 0.4668E-02, 0.4752E-02, 0.4815E-02, 0.4919E-02, 0.5087E-02, 0.5254E-02, 0.5296E-02, 0.2324E-02, 0.2093E-02, & + 0.2294E-02, 0.2125E-02, 0.2058E-02, 0.1920E-02, 0.1786E-02, 0.1689E-02, 0.1788E-02, 0.2144E-02,-0.7231E-05,-0.7231E-05, & + -0.7231E-05,-0.6470E-05,-0.6851E-05,-0.7231E-05,-0.5709E-05,-0.6470E-05,-0.4186E-05, 0.8754E-05,-0.7612E-05,-0.9134E-06, & + -0.8640E-05,-0.8487E-05,-0.8259E-05,-0.9553E-05,-0.8107E-05,-0.1654E-04,-0.1858E-04 / + + + data((c11h2o(T_1,j,i),i=1,KG(11)),j=1,NUMPIR) / & + -0.2005E+02,-0.1548E+02,-0.1021E+02,-0.2001E+02,-0.1504E+02,-0.1001E+02,-0.1997E+02,-0.1459E+02,-0.9814E+01,-0.1993E+02, & + -0.1416E+02,-0.9595E+01,-0.1989E+02,-0.1373E+02,-0.9349E+01,-0.1985E+02,-0.1328E+02,-0.9072E+01,-0.1982E+02,-0.1286E+02, & + -0.8833E+01,-0.1957E+02,-0.1243E+02,-0.8566E+01,-0.1911E+02,-0.1200E+02,-0.8276E+01,-0.1743E+02,-0.1134E+02,-0.7958E+01, & + -0.1625E+02,-0.1078E+02,-0.7629E+01,-0.1524E+02,-0.1036E+02,-0.7334E+01,-0.1429E+02,-0.9970E+01,-0.7051E+01,-0.1348E+02, & + -0.9620E+01,-0.6749E+01,-0.1282E+02,-0.9270E+01,-0.6505E+01,-0.1229E+02,-0.8932E+01,-0.6277E+01,-0.1186E+02,-0.8628E+01, & + -0.6120E+01,-0.1148E+02,-0.8345E+01,-0.6049E+01,-0.1112E+02,-0.8066E+01,-0.5906E+01 / + + data((c11h2o(T_2,j,i),i=1,KG(11)),j=1,NUMPIR) / & + 0.1842E-02, 0.2131E-01, 0.3033E-01, 0.1905E-02, 0.2137E-01, 0.2841E-01, 0.1926E-02, 0.2135E-01, 0.2696E-01, 0.1926E-02, & + 0.2133E-01, 0.2514E-01, 0.1884E-02, 0.2154E-01, 0.2401E-01, 0.5589E-02, 0.2156E-01, 0.2321E-01, 0.9483E-02, 0.2156E-01, & + 0.2210E-01, 0.1333E-01, 0.2150E-01, 0.2133E-01, 0.1725E-01, 0.2154E-01, 0.2074E-01, 0.2254E-01, 0.1999E-01, 0.2005E-01, & + 0.2118E-01, 0.1926E-01, 0.1978E-01, 0.1936E-01, 0.1920E-01, 0.1963E-01, 0.1905E-01, 0.1911E-01, 0.1934E-01, 0.1909E-01, & + 0.1903E-01, 0.1920E-01, 0.1922E-01, 0.1901E-01, 0.1899E-01, 0.1934E-01, 0.1930E-01, 0.1974E-01, 0.1966E-01, 0.1909E-01, & + 0.2014E-01, 0.1976E-01, 0.1905E-01, 0.1984E-01, 0.1963E-01, 0.1940E-01, 0.1897E-01 / + + data((c11h2o(T_3,j,i),i=1,KG(11)),j=1,NUMPIR) / & + -0.1522E-05,-0.6013E-04,-0.5062E-04,-0.2665E-05,-0.6204E-04,-0.5519E-04,-0.3806E-05,-0.6394E-04,-0.5633E-04,-0.4567E-05, & + -0.6280E-04,-0.5214E-04,-0.6090E-05,-0.6128E-04,-0.5290E-04, 0.6051E-04,-0.6242E-04,-0.5823E-04, 0.1313E-03,-0.6013E-04, & + -0.5176E-04, 0.1336E-03,-0.5747E-04,-0.4072E-04, 0.6318E-04,-0.5671E-04,-0.3996E-04,-0.5595E-04,-0.3996E-04,-0.4263E-04, & + -0.3958E-04,-0.4719E-04,-0.4453E-04,-0.3387E-04,-0.5138E-04,-0.5100E-04,-0.5252E-04,-0.4986E-04,-0.4491E-04,-0.5100E-04, & + -0.4453E-04,-0.4529E-04,-0.5176E-04,-0.4795E-04,-0.4453E-04,-0.5557E-04,-0.5176E-04,-0.5062E-04,-0.5747E-04,-0.4795E-04, & + -0.5633E-04,-0.5709E-04,-0.4643E-04,-0.3806E-04,-0.5481E-04,-0.5671E-04,-0.4948E-04 / + + + data((c11ch4(k,j),j=1,NUMPIR),k=1,NUMTIR) / & + -0.1207E+02,-0.1162E+02,-0.1116E+02,-0.1070E+02,-0.1024E+02,-0.9777E+01,-0.9319E+01,-0.8858E+01,-0.8398E+01,-0.7384E+01, & + -0.6643E+01,-0.6081E+01,-0.5602E+01,-0.5188E+01,-0.4822E+01,-0.4479E+01,-0.4184E+01,-0.3884E+01,-0.3627E+01, 0.1036E-01, & + 0.1036E-01, 0.1040E-01, 0.1040E-01, 0.1045E-01, 0.1047E-01, 0.1049E-01, 0.1055E-01, 0.1059E-01, 0.1059E-01, 0.1026E-01, & + 0.1011E-01, 0.1024E-01, 0.1049E-01, 0.1072E-01, 0.1089E-01, 0.1109E-01, 0.1153E-01, 0.1191E-01,-0.4910E-04,-0.4834E-04, & + -0.4910E-04,-0.4910E-04,-0.4910E-04,-0.4872E-04,-0.4834E-04,-0.4948E-04,-0.5100E-04,-0.5633E-04,-0.6166E-04,-0.5595E-04, & + -0.5366E-04,-0.5366E-04,-0.5328E-04,-0.5328E-04,-0.4948E-04,-0.5519E-04,-0.5595E-04 / + + + data((c11n2o(k,j),j=1,NUMPIR),k=1,NUMTIR) / & + -0.9461E+01,-0.9003E+01,-0.8543E+01,-0.8084E+01,-0.7629E+01,-0.7166E+01,-0.6707E+01,-0.6249E+01,-0.5793E+01,-0.5312E+01, & + -0.4847E+01,-0.4393E+01,-0.3974E+01,-0.3587E+01,-0.3231E+01,-0.2885E+01,-0.2602E+01,-0.2358E+01,-0.2108E+01, 0.4710E-02, & + 0.4752E-02, 0.4773E-02, 0.4773E-02, 0.4815E-02, 0.4877E-02, 0.4898E-02, 0.4982E-02, 0.5066E-02, 0.5296E-02, 0.5149E-02, & + 0.5129E-02, 0.5024E-02, 0.4752E-02, 0.4501E-02, 0.4270E-02, 0.4019E-02, 0.3646E-02, 0.2759E-02,-0.1484E-04,-0.1408E-04, & + -0.1446E-04,-0.1446E-04,-0.1522E-04,-0.1560E-04,-0.1522E-04,-0.1522E-04,-0.1598E-04,-0.1484E-04,-0.9895E-05,-0.1028E-04, & + -0.7612E-05,-0.1903E-05, 0.1903E-05, 0.0000E+00, 0.2283E-05, 0.6166E-05,-0.2740E-05 / + + + data((c12h2o(k,j),j=1,NUMPIR),k=1,NUMTIR) / & + -0.1984E+02,-0.1983E+02,-0.1982E+02,-0.1981E+02,-0.1963E+02,-0.1917E+02,-0.1871E+02,-0.1825E+02,-0.1779E+02,-0.1639E+02, & + -0.1545E+02,-0.1484E+02,-0.1433E+02,-0.1387E+02,-0.1345E+02,-0.1305E+02,-0.1268E+02,-0.1231E+02,-0.1196E+02, 0.6071E-03, & + 0.2072E-02, 0.6196E-02, 0.1030E-01, 0.1436E-01, 0.1846E-01, 0.2259E-01, 0.2667E-01, 0.2993E-01, 0.2878E-01, 0.2803E-01, & + 0.2851E-01, 0.2864E-01, 0.2874E-01, 0.2862E-01, 0.2859E-01, 0.2853E-01, 0.2868E-01, 0.2887E-01,-0.3808E-06, 0.2474E-04, & + 0.9895E-04, 0.1728E-03, 0.1911E-03, 0.1165E-03, 0.4225E-04,-0.3121E-04,-0.8982E-04,-0.9553E-04,-0.9705E-04,-0.9591E-04, & + -0.9287E-04,-0.9172E-04,-0.9096E-04,-0.9134E-04,-0.9248E-04,-0.1050E-03,-0.1031E-03 / + + + data((c12o3(T_1,j,i),i=1,KG(12)),j=1,NUMPIR) / & + -0.6590E+01,-0.3912E+01,-0.8513E+00, 0.2731E+01, 0.5515E+01,-0.6157E+01,-0.3583E+01,-0.7292E+00, 0.2740E+01, 0.5508E+01, & + -0.5731E+01,-0.3242E+01,-0.5800E+00, 0.2782E+01, 0.5485E+01,-0.5301E+01,-0.2901E+01,-0.4131E+00, 0.2805E+01, 0.5455E+01, & + -0.4879E+01,-0.2551E+01,-0.2288E+00, 0.2878E+01, 0.5416E+01,-0.4449E+01,-0.2201E+01,-0.2228E-01, 0.3000E+01, 0.5374E+01, & + -0.4018E+01,-0.1843E+01, 0.2055E+00, 0.3143E+01, 0.5342E+01,-0.3615E+01,-0.1502E+01, 0.4561E+00, 0.3288E+01, 0.5204E+01, & + -0.3228E+01,-0.1172E+01, 0.7099E+00, 0.3396E+01, 0.5077E+01,-0.2828E+01,-0.8499E+00, 0.9664E+00, 0.3463E+01, 0.4893E+01, & + -0.2480E+01,-0.5393E+00, 0.1229E+01, 0.3493E+01, 0.4656E+01,-0.2181E+01,-0.2653E+00, 0.1504E+01, 0.3456E+01, 0.4398E+01, & + -0.1950E+01,-0.1469E-01, 0.1735E+01, 0.3387E+01, 0.4115E+01,-0.1788E+01, 0.2517E+00, 0.1919E+01, 0.3251E+01, 0.3832E+01, & + -0.1677E+01, 0.5027E+00, 0.2032E+01, 0.3088E+01, 0.3581E+01,-0.1637E+01, 0.7373E+00, 0.2100E+01, 0.2910E+01, 0.3364E+01, & + -0.1650E+01, 0.9383E+00, 0.2123E+01, 0.2793E+01, 0.3150E+01,-0.1658E+01, 0.1091E+01, 0.2112E+01, 0.2683E+01, 0.3021E+01, & + -0.1654E+01, 0.1163E+01, 0.2099E+01, 0.2602E+01, 0.2871E+01 / + + data((c12o3(T_2,j,i),i=1,KG(12)),j=1,NUMPIR) / & + 0.9498E-02, 0.8894E-02, 0.1161E-01, 0.8828E-02,-0.1669E-02, 0.9613E-02, 0.8347E-02, 0.1053E-01, 0.8462E-02,-0.1612E-02, & + 0.9700E-02, 0.7829E-02, 0.9101E-02, 0.7915E-02,-0.1439E-02, 0.9815E-02, 0.7167E-02, 0.7981E-02, 0.7282E-02,-0.1094E-02, & + 0.9671E-02, 0.6764E-02, 0.6930E-02, 0.5613E-02,-0.8347E-03, 0.9613E-02, 0.6312E-02, 0.6225E-02, 0.4145E-02,-0.1295E-02, & + 0.9728E-02, 0.6099E-02, 0.5293E-02, 0.2965E-02,-0.1756E-02, 0.9844E-02, 0.5915E-02, 0.4496E-02, 0.1871E-02,-0.2044E-02, & + 0.9930E-02, 0.5817E-02, 0.3509E-02, 0.1324E-02,-0.2044E-02, 0.9988E-02, 0.5535E-02, 0.2711E-02, 0.6620E-03,-0.1813E-02, & + 0.1034E-01, 0.5247E-02, 0.1926E-02,-0.2303E-03,-0.1842E-02, 0.1058E-01, 0.4795E-02, 0.1197E-02,-0.9498E-03,-0.2216E-02, & + 0.1084E-01, 0.4414E-02, 0.6188E-03,-0.1123E-02,-0.2303E-02, 0.1079E-01, 0.3926E-02, 0.1756E-03,-0.1497E-02,-0.2274E-02, & + 0.1039E-01, 0.3425E-02,-0.1900E-03,-0.1353E-02,-0.2389E-02, 0.9815E-02, 0.2769E-02,-0.6620E-03,-0.1756E-02,-0.1785E-02, & + 0.9818E-02, 0.2444E-02,-0.1016E-02,-0.1410E-02,-0.1698E-02, 0.1074E-01, 0.3218E-02,-0.1235E-02,-0.1900E-02,-0.2533E-02, & + 0.1145E-01, 0.3684E-02,-0.1364E-02,-0.1353E-02,-0.1957E-02 / + + data((c12o3(T_3,j,i),i=1,KG(12)),j=1,NUMPIR) / & + -0.4030E-04,-0.2375E-04,-0.3814E-05,-0.4943E-04,-0.3166E-04,-0.3742E-04,-0.1871E-04,-0.1137E-04,-0.4317E-04,-0.2878E-04, & + -0.3526E-04,-0.2015E-04,-0.1295E-04,-0.4821E-04,-0.2303E-04,-0.3382E-04,-0.2087E-04,-0.1519E-04,-0.2231E-04,-0.1871E-04, & + -0.3454E-04,-0.2087E-04,-0.8109E-05,-0.6476E-05,-0.1511E-04,-0.3454E-04,-0.1820E-04,-0.1269E-05,-0.1439E-04,-0.5037E-05, & + -0.4173E-04,-0.2598E-04, 0.6645E-05,-0.1943E-04,-0.2087E-04,-0.3454E-04,-0.2267E-04, 0.2159E-05,-0.2231E-04,-0.2159E-05, & + -0.2950E-04,-0.2080E-04, 0.2159E-06,-0.4317E-05, 0.1799E-04,-0.3670E-04,-0.1590E-04,-0.4461E-05,-0.9354E-05,-0.3598E-05, & + -0.3216E-04,-0.1475E-04,-0.2231E-05,-0.1295E-04,-0.2878E-05,-0.3576E-04,-0.7347E-05,-0.1022E-04,-0.2159E-05,-0.7915E-05, & + -0.3015E-04,-0.5230E-05,-0.5109E-05,-0.6476E-05,-0.7196E-05,-0.2331E-04,-0.1079E-04,-0.4102E-05, 0.1439E-05,-0.1223E-04, & + -0.2216E-04,-0.1094E-04,-0.5325E-05,-0.7196E-06,-0.1655E-04,-0.1036E-04,-0.7627E-05,-0.2878E-05, 0.5037E-05,-0.1295E-04, & + 0.1029E-04,-0.1346E-04,-0.4821E-05,-0.7915E-05, 0.7915E-05, 0.2835E-04,-0.2893E-04,-0.1367E-05,-0.7196E-05,-0.1871E-04, & + 0.3965E-04,-0.3310E-04,-0.3310E-05,-0.7195E-06, 0.2303E-04 / + + + data((c13h2o(T_1,j,i),i=1,KG(13)),j=1,NUMPIR) / & + -0.1992E+02,-0.1446E+02,-0.1992E+02,-0.1405E+02,-0.1991E+02,-0.1363E+02,-0.1990E+02,-0.1322E+02,-0.1989E+02,-0.1282E+02, & + -0.1989E+02,-0.1242E+02,-0.1988E+02,-0.1201E+02,-0.1987E+02,-0.1159E+02,-0.1986E+02,-0.1119E+02,-0.1982E+02,-0.1079E+02, & + -0.1817E+02,-0.1039E+02,-0.1659E+02,-0.1000E+02,-0.1537E+02,-0.9623E+01,-0.1460E+02,-0.9266E+01,-0.1406E+02,-0.8959E+01, & + -0.1354E+02,-0.8676E+01,-0.1309E+02,-0.8411E+01,-0.1267E+02,-0.8232E+01,-0.1229E+02,-0.8094E+01 / + + data((c13h2o(T_2,j,i),i=1,KG(13)),j=1,NUMPIR) / & + 0.5024E-03, 0.3199E-01, 0.5652E-03, 0.3199E-01, 0.6071E-03, 0.3211E-01, 0.6489E-03, 0.3199E-01, 0.6699E-03, 0.3178E-01, & + 0.6908E-03, 0.3157E-01, 0.6908E-03, 0.3109E-01, 0.6698E-03, 0.3075E-01, 0.6698E-03, 0.3054E-01, 0.1474E-01, 0.3000E-01, & + 0.3085E-01, 0.2960E-01, 0.3659E-01, 0.2935E-01, 0.3016E-01, 0.2920E-01, 0.2834E-01, 0.2895E-01, 0.2780E-01, 0.2870E-01, & + 0.2753E-01, 0.2843E-01, 0.2755E-01, 0.2820E-01, 0.2765E-01, 0.2732E-01, 0.2769E-01, 0.2705E-01 / + + data((c13h2o(T_3,j,i),i=1,KG(13)),j=1,NUMPIR) / & + 0.6299E-09,-0.7993E-04,-0.3802E-06,-0.7992E-04,-0.3802E-06,-0.8525E-04,-0.3808E-06,-0.8449E-04,-0.7610E-06,-0.7764E-04, & + -0.1142E-05,-0.7231E-04,-0.1142E-05,-0.7345E-04,-0.2284E-05,-0.8259E-04,-0.2284E-05,-0.8031E-04, 0.2436E-03,-0.7878E-04, & + 0.7612E-05,-0.8525E-04,-0.1248E-03,-0.9439E-04,-0.9477E-04,-0.9172E-04,-0.8982E-04,-0.8640E-04,-0.7916E-04,-0.6813E-04, & + -0.7574E-04,-0.6090E-04,-0.7612E-04,-0.7117E-04,-0.7498E-04,-0.7041E-04,-0.7269E-04,-0.7992E-04 / + + + data((c14hca(T_1,j,i),i=1,KG(14)),j=1,NUMPIR) / & + -0.1847E+02,-0.1399E+02,-0.1106E+02,-0.8539E+01,-0.5852E+01,-0.3295E+01,-0.1208E+01,-0.6272E-01, 0.2055E+01, 0.6071E+01, & + -0.1801E+02,-0.1357E+02,-0.1067E+02,-0.8171E+01,-0.5562E+01,-0.3071E+01,-0.1073E+01, 0.1033E+00, 0.2055E+01, 0.6071E+01, & + -0.1755E+02,-0.1314E+02,-0.1027E+02,-0.7798E+01,-0.5224E+01,-0.2823E+01,-0.9280E+00, 0.2723E+00, 0.2165E+01, 0.5969E+01, & + -0.1709E+02,-0.1272E+02,-0.9868E+01,-0.7404E+01,-0.4880E+01,-0.2569E+01,-0.6908E+00, 0.4453E+00, 0.2241E+01, 0.5969E+01, & + -0.1663E+02,-0.1230E+02,-0.9467E+01,-0.7013E+01,-0.4535E+01,-0.2297E+01,-0.4408E+00, 0.6353E+00, 0.2359E+01, 0.5969E+01, & + -0.1617E+02,-0.1188E+02,-0.9050E+01,-0.6619E+01,-0.4160E+01,-0.1967E+01,-0.1687E+00, 0.8213E+00, 0.2421E+01, 0.5969E+01, & + -0.1571E+02,-0.1147E+02,-0.8629E+01,-0.6230E+01,-0.3771E+01,-0.1648E+01, 0.1573E+00, 0.1019E+01, 0.2511E+01, 0.5884E+01, & + -0.1525E+02,-0.1106E+02,-0.8215E+01,-0.5841E+01,-0.3393E+01,-0.1331E+01, 0.4013E+00, 0.1198E+01, 0.2654E+01, 0.5794E+01, & + -0.1480E+02,-0.1066E+02,-0.7800E+01,-0.5454E+01,-0.3032E+01,-0.9870E+00, 0.6323E+00, 0.1373E+01, 0.2905E+01, 0.5647E+01, & + -0.1402E+02,-0.9693E+01,-0.7206E+01,-0.4846E+01,-0.2656E+01,-0.6540E+00, 0.8323E+00, 0.1530E+01, 0.3211E+01, 0.5355E+01, & + -0.1343E+02,-0.9060E+01,-0.6596E+01,-0.4399E+01,-0.2294E+01,-0.3519E+00, 0.9823E+00, 0.1673E+01, 0.3420E+01, 0.5083E+01, & + -0.1279E+02,-0.8611E+01,-0.5785E+01,-0.4010E+01,-0.1936E+01,-0.1177E+00, 0.1134E+01, 0.1974E+01, 0.3591E+01, 0.4770E+01, & + -0.1230E+02,-0.8174E+01,-0.5298E+01,-0.3611E+01,-0.1607E+01, 0.3636E-01, 0.1433E+01, 0.2260E+01, 0.3539E+01, 0.4439E+01, & + -0.1192E+02,-0.7763E+01,-0.4946E+01,-0.3228E+01,-0.1321E+01, 0.1991E+00, 0.1720E+01, 0.2420E+01, 0.3383E+01, 0.4041E+01, & + -0.1154E+02,-0.7377E+01,-0.4576E+01,-0.2851E+01,-0.1093E+01, 0.4430E+00, 0.1896E+01, 0.2462E+01, 0.3122E+01, 0.3620E+01, & + -0.1118E+02,-0.7003E+01,-0.4210E+01,-0.2524E+01,-0.8973E+00, 0.7490E+00, 0.1966E+01, 0.2363E+01, 0.2818E+01, 0.3182E+01, & + -0.1080E+02,-0.6677E+01,-0.3872E+01,-0.2264E+01,-0.6846E+00, 0.9392E+00, 0.1867E+01, 0.2138E+01, 0.2505E+01, 0.2738E+01, & + -0.1031E+02,-0.6353E+01,-0.3596E+01,-0.1938E+01,-0.4537E+00, 0.1015E+01, 0.1659E+01, 0.1830E+01, 0.2142E+01, 0.2287E+01, & + -0.9695E+01,-0.5977E+01,-0.3427E+01,-0.1596E+01,-0.1979E+00, 0.9458E+00, 0.1363E+01, 0.1545E+01, 0.1743E+01, 0.1832E+01 / + + data((c14hca(T_2,j,i),i=1,KG(14)),j=1,NUMPIR) / & + 0.3628E-01, 0.2728E-01, 0.2213E-01, 0.1656E-01, 0.1507E-01, 0.1564E-01, 0.1623E-01, 0.1419E-01, 0.1455E-01, 0.1089E-02, & + 0.3632E-01, 0.2740E-01, 0.2164E-01, 0.1606E-01, 0.1369E-01, 0.1418E-01, 0.1444E-01, 0.1275E-01, 0.1331E-01, 0.9210E-03, & + 0.3636E-01, 0.2746E-01, 0.2114E-01, 0.1557E-01, 0.1239E-01, 0.1285E-01, 0.1237E-01, 0.1141E-01, 0.1141E-01, 0.9210E-03, & + 0.3640E-01, 0.2748E-01, 0.2064E-01, 0.1516E-01, 0.1141E-01, 0.1125E-01, 0.1092E-01, 0.1026E-01, 0.1011E-01,-0.5652E-03, & + 0.3646E-01, 0.2746E-01, 0.2024E-01, 0.1478E-01, 0.1036E-01, 0.9688E-02, 0.9610E-02, 0.9305E-02, 0.9399E-02,-0.6489E-03, & + 0.3651E-01, 0.2734E-01, 0.1984E-01, 0.1438E-01, 0.9436E-02, 0.8486E-02, 0.8214E-02, 0.8995E-02, 0.7892E-02,-0.8582E-03, & + 0.3655E-01, 0.2723E-01, 0.1951E-01, 0.1402E-01, 0.8716E-02, 0.7433E-02, 0.7169E-02, 0.8072E-02, 0.5443E-02,-0.1172E-02, & + 0.3659E-01, 0.2709E-01, 0.1911E-01, 0.1379E-01, 0.8107E-02, 0.6818E-02, 0.6818E-02, 0.7033E-02, 0.3056E-02,-0.1047E-02, & + 0.3670E-01, 0.2698E-01, 0.1890E-01, 0.1363E-01, 0.7502E-02, 0.6371E-02, 0.6558E-02, 0.6489E-02,-0.5652E-03,-0.1340E-02, & + 0.3592E-01, 0.2238E-01, 0.1804E-01, 0.1007E-01, 0.6730E-02, 0.5512E-02, 0.6194E-02, 0.4375E-02,-0.1109E-02,-0.3559E-03, & + 0.3609E-01, 0.2242E-01, 0.1526E-01, 0.8582E-02, 0.6284E-02, 0.5809E-02, 0.4501E-02, 0.9420E-03,-0.9001E-03,-0.1005E-02, & + 0.3703E-01, 0.2196E-01, 0.1281E-01, 0.7860E-02, 0.5861E-02, 0.5842E-02, 0.1800E-02,-0.1591E-02,-0.1235E-02,-0.9420E-03, & + 0.3728E-01, 0.2114E-01, 0.1347E-01, 0.6678E-02, 0.5449E-02, 0.4837E-02,-0.1084E-02,-0.1361E-02,-0.6699E-03,-0.1256E-03, & + 0.3683E-01, 0.2061E-01, 0.1350E-01, 0.6133E-02, 0.5449E-02, 0.2111E-02,-0.1386E-02,-0.1235E-02,-0.5652E-03,-0.8373E-04, & + 0.3656E-01, 0.1988E-01, 0.1348E-01, 0.5441E-02, 0.5149E-02,-0.8813E-03,-0.1116E-02,-0.8373E-03,-0.3140E-03,-0.6280E-04, & + 0.3669E-01, 0.1934E-01, 0.1363E-01, 0.5035E-02, 0.3585E-02,-0.1250E-02,-0.9357E-03,-0.8227E-03,-0.3140E-03,-0.4187E-04, & + 0.3618E-01, 0.1856E-01, 0.1390E-01, 0.3836E-02, 0.1470E-02,-0.1096E-02,-0.8080E-03,-0.4480E-03,-0.2093E-03,-0.2093E-04, & + 0.3416E-01, 0.1741E-01, 0.1431E-01, 0.1951E-02,-0.2923E-04,-0.9422E-03,-0.4576E-03,-0.2395E-03,-0.1565E-03,-0.2799E-04, & + 0.3219E-01, 0.1674E-01, 0.1516E-01, 0.6652E-03,-0.5051E-03,-0.7052E-03,-0.2002E-03,-0.2135E-03,-0.7633E-04,-0.7300E-04 / + + data((c14hca(T_3,j,i),i=1,KG(14)),j=1,NUMPIR) / & + -0.1290E-03,-0.9934E-04,-0.5595E-04,-0.3996E-04, 0.1294E-04,-0.9134E-05, 0.1294E-05,-0.3121E-05,-0.4757E-04,-0.1979E-04, & + -0.1305E-03,-0.9629E-04,-0.5481E-04,-0.4301E-04, 0.1827E-04,-0.9363E-05, 0.1777E-04,-0.2185E-04,-0.1903E-04,-0.1675E-04, & + -0.1313E-03,-0.9439E-04,-0.5404E-04,-0.4263E-04, 0.9134E-05,-0.1020E-04, 0.3524E-04,-0.2599E-04,-0.2093E-04, 0.1675E-04, & + -0.1313E-03,-0.9172E-04,-0.5252E-04,-0.4567E-04, 0.4186E-05,-0.3920E-05, 0.2552E-04,-0.2059E-04,-0.2246E-04,-0.1028E-04, & + -0.1324E-03,-0.9210E-04,-0.5138E-04,-0.4491E-04, 0.6470E-05,-0.2131E-05, 0.1496E-04,-0.1572E-04,-0.3311E-04,-0.8754E-05, & + -0.1324E-03,-0.9058E-04,-0.5328E-04,-0.4225E-04, 0.1827E-05,-0.8411E-06, 0.4719E-05,-0.6813E-05,-0.2474E-04,-0.1256E-04, & + -0.1340E-03,-0.8868E-04,-0.5633E-04,-0.4187E-04,-0.4415E-05, 0.6055E-05,-0.1648E-04,-0.1507E-04, 0.1979E-04,-0.2131E-04, & + -0.1340E-03,-0.8373E-04,-0.5899E-04,-0.3920E-04,-0.4072E-05, 0.1491E-04,-0.9781E-05,-0.5328E-05, 0.3578E-04,-0.1979E-04, & + -0.1321E-03,-0.7954E-04,-0.5899E-04,-0.4072E-04, 0.1066E-05, 0.5728E-05,-0.5138E-05,-0.8373E-05, 0.2626E-04,-0.2436E-04, & + -0.1363E-03,-0.6432E-04,-0.5176E-04,-0.3083E-04, 0.2169E-05,-0.8944E-05, 0.3159E-05, 0.6470E-05,-0.4187E-05, 0.4948E-05, & + -0.1302E-03,-0.7802E-04,-0.3311E-04,-0.1903E-04, 0.5328E-05,-0.1884E-04, 0.1408E-04, 0.3311E-04, 0.1142E-05,-0.7613E-06, & + -0.1473E-03,-0.6737E-04,-0.7536E-04,-0.1085E-04,-0.1903E-05,-0.1458E-04, 0.4034E-04,-0.3941E-10,-0.7992E-05, 0.2664E-05, & + -0.1361E-03,-0.5709E-04,-0.8550E-04,-0.5709E-05,-0.8640E-05, 0.6523E-05, 0.1903E-05,-0.8221E-05,-0.3045E-05,-0.9134E-05, & + -0.1329E-03,-0.5529E-04,-0.7107E-04, 0.2664E-05,-0.9020E-05, 0.3320E-04,-0.2131E-05,-0.4187E-05,-0.7231E-05,-0.3806E-05, & + -0.1278E-03,-0.5247E-04,-0.6465E-04, 0.3806E-05,-0.6091E-05, 0.1245E-04,-0.3844E-05,-0.6090E-05,-0.8754E-05,-0.2664E-05, & + -0.1321E-03,-0.5632E-04,-0.5897E-04, 0.1012E-04, 0.1168E-04,-0.4196E-06,-0.8411E-05,-0.8868E-05,-0.1484E-04,-0.1522E-05, & + -0.1252E-03,-0.4907E-04,-0.5932E-04, 0.3245E-04, 0.1996E-04,-0.3325E-05,-0.5785E-05,-0.6394E-05,-0.6851E-05,-0.1142E-05, & + -0.1093E-03,-0.4731E-04,-0.6761E-04, 0.1808E-04, 0.1754E-04,-0.5079E-05,-0.5809E-05,-0.5649E-05,-0.3988E-05,-0.5849E-06, & + -0.1151E-03,-0.4965E-04,-0.7163E-04, 0.7839E-05, 0.5505E-05,-0.6084E-05,-0.3344E-05,-0.3894E-05,-0.1391E-05,-0.1327E-05 / + + + data((c14hcb(T_1,j,i),i=1,KG(14)),j=1,NUMPIR) / & + -0.9398E+01,-0.5678E+01,-0.3606E+01,-0.2192E+01, 0.2104E+01, 0.3044E+01,-0.4587E+02,-0.4587E+02,-0.4587E+02,-0.4587E+02, & + -0.9094E+01,-0.5422E+01,-0.3448E+01,-0.1650E+01, 0.2046E+01, 0.2749E+01,-0.4587E+02,-0.4587E+02,-0.4587E+02,-0.4587E+02, & + -0.8760E+01,-0.5270E+01,-0.3329E+01,-0.1147E+01, 0.2112E+01, 0.2709E+01,-0.4587E+02,-0.4587E+02,-0.4587E+02,-0.4587E+02, & + -0.8537E+01,-0.5152E+01,-0.3129E+01,-0.9544E+00, 0.2254E+01, 0.2771E+01,-0.4587E+02,-0.4587E+02,-0.4587E+02,-0.4587E+02, & + -0.8176E+01,-0.4936E+01,-0.2680E+01,-0.9259E+00, 0.2247E+01,-0.4587E+02,-0.4587E+02,-0.4587E+02,-0.4587E+02,-0.4587E+02, & + -0.7836E+01,-0.4676E+01,-0.2378E+01,-0.3550E+00, 0.1396E+01, 0.1976E+01,-0.4587E+02,-0.4587E+02,-0.4587E+02,-0.4587E+02, & + -0.7419E+01,-0.4122E+01,-0.2407E+01,-0.1204E-01, 0.1744E+01,-0.4587E+02,-0.4587E+02,-0.4587E+02,-0.4587E+02,-0.4587E+02, & + -0.7124E+01,-0.3727E+01,-0.2160E+01, 0.6158E+00, 0.1953E+01,-0.4587E+02,-0.4587E+02,-0.4587E+02,-0.4587E+02,-0.4587E+02, & + -0.6823E+01,-0.3324E+01,-0.1748E+01,-0.9806E-01, 0.2319E+01,-0.4587E+02,-0.4587E+02,-0.4587E+02,-0.4587E+02,-0.4587E+02, & + -0.5957E+01,-0.3017E+01,-0.1647E+01, 0.1398E+01,-0.4587E+02,-0.4587E+02,-0.4587E+02,-0.4587E+02,-0.4587E+02,-0.4587E+02, & + -0.5115E+01,-0.2290E+01,-0.5273E+00, 0.5662E+00, 0.1459E+01,-0.4587E+02,-0.4587E+02,-0.4587E+02,-0.4587E+02,-0.4587E+02, & + -0.4162E+01,-0.1453E+01, 0.1116E+00,-0.4587E+02, 0.9569E+00,-0.4587E+02,-0.4587E+02,-0.4587E+02,-0.4587E+02,-0.4587E+02, & + -0.3611E+01,-0.9744E+00,-0.4587E+02,-0.4587E+02,-0.4587E+02,-0.4587E+02,-0.4587E+02,-0.4587E+02,-0.4587E+02,-0.4587E+02, & + -0.3075E+01,-0.4176E+00,-0.4587E+02,-0.4587E+02,-0.4587E+02,-0.4587E+02,-0.4587E+02,-0.4587E+02,-0.4587E+02,-0.4587E+02, & + -0.3469E+01,-0.9395E+00, 0.5092E+00, 0.6200E+00,-0.4587E+02,-0.4587E+02,-0.4587E+02,-0.4587E+02,-0.4587E+02,-0.4587E+02, & + -0.3808E+01,-0.1505E+01, 0.3901E+00, 0.6264E+00,-0.1155E+01,-0.4587E+02,-0.4587E+02,-0.4587E+02,-0.4587E+02,-0.4587E+02, & + -0.4058E+01,-0.1818E+01, 0.2693E+00, 0.7087E+00, 0.3820E+00,-0.4587E+02,-0.4587E+02,-0.4587E+02,-0.4587E+02,-0.4587E+02, & + -0.4262E+01,-0.2097E+01,-0.5711E-01, 0.5681E+00, 0.1310E+01, 0.7371E+00,-0.4587E+02,-0.4587E+02,-0.4587E+02,-0.4587E+02, & + -0.3997E+01,-0.1784E+01, 0.4388E-01, 0.5167E+00, 0.6930E+00,-0.6906E+00,-0.4587E+02,-0.4587E+02,-0.4587E+02,-0.4587E+02 / + + data((c14hcb(T_2,j,i),i=1,KG(14)),j=1,NUMPIR) / & + 0.2944E-01, 0.2723E-01, 0.1854E-01, 0.2023E-01, 0.2254E-01, 0.3059E-02, 0.4788E+00, 0.3059E-02, 0.3059E-02, 0.3059E-02, & + 0.3080E-01, 0.2549E-01, 0.1547E-01, 0.2225E-01, 0.2107E-01, 0.3059E-02, 0.4737E+00, 0.3059E-02, 0.3059E-02, 0.3059E-02, & + 0.3269E-01, 0.2656E-01, 0.2125E-01, 0.2179E-01, 0.2162E-01, 0.4589E+00, 0.4643E+00, 0.3059E-02, 0.3059E-02, 0.3059E-02, & + 0.3322E-01, 0.2476E-01, 0.2075E-01, 0.2139E-01, 0.1907E-01, 0.4501E+00, 0.4441E+00, 0.3059E-02, 0.3059E-02, 0.3059E-02, & + 0.3387E-01, 0.2182E-01, 0.2665E-01, 0.1841E-01, 0.2506E-01, 0.3059E-02, 0.3059E-02, 0.3059E-02, 0.3059E-02, 0.3059E-02, & + 0.3532E-01, 0.2091E-01, 0.1995E-01, 0.2067E-01, 0.1949E-01, 0.4491E+00, 0.3059E-02, 0.3059E-02, 0.3059E-02, 0.3059E-02, & + 0.3468E-01, 0.2075E-01, 0.2587E-01, 0.1401E-01, 0.8646E-02, 0.3059E-02, 0.3059E-02, 0.3059E-02, 0.3059E-02, 0.3059E-02, & + 0.3666E-01, 0.2430E-01, 0.1919E-01, 0.2007E-01, 0.3059E-02, 0.3059E-02, 0.3059E-02, 0.3059E-02, 0.3059E-02, 0.3059E-02, & + 0.3613E-01, 0.2147E-01, 0.1892E-01, 0.1361E-01, 0.3059E-02, 0.4506E+00, 0.3059E-02, 0.3059E-02, 0.3059E-02, 0.3059E-02, & + 0.3129E-01, 0.1954E-01, 0.2442E-01, 0.1011E-01, 0.4420E+00, 0.3059E-02, 0.3059E-02, 0.3059E-02, 0.3059E-02, 0.3059E-02, & + 0.3177E-01, 0.2101E-01, 0.1526E-01, 0.4376E+00, 0.4379E+00, 0.3059E-02, 0.3059E-02, 0.3059E-02, 0.3059E-02, 0.3059E-02, & + 0.2887E-01, 0.2044E-01, 0.1285E-01, 0.3059E-02,-0.4862E-03, 0.3059E-02, 0.3059E-02, 0.3059E-02, 0.3059E-02, 0.3059E-02, & + 0.2759E-01, 0.2114E-01, 0.4303E+00, 0.3059E-02, 0.3059E-02, 0.3059E-02, 0.3059E-02, 0.3059E-02, 0.3059E-02, 0.3059E-02, & + 0.2880E-01, 0.1690E-01,-0.4187E+00, 0.3059E-02, 0.3059E-02, 0.3059E-02, 0.3059E-02, 0.3059E-02, 0.3059E-02, 0.3059E-02, & + 0.2852E-01, 0.2255E-01, 0.2184E-01, 0.4334E+00, 0.4217E+00, 0.3059E-02, 0.3059E-02, 0.3059E-02, 0.3059E-02, 0.3059E-02, & + 0.2840E-01, 0.2136E-01, 0.1644E-01, 0.2812E-01, 0.4358E+00, 0.4288E+00, 0.3059E-02, 0.3059E-02, 0.3059E-02, 0.3059E-02, & + 0.2809E-01, 0.2173E-01, 0.1708E-01, 0.3346E-01, 0.4225E-01, 0.4419E+00, 0.3059E-02, 0.3059E-02, 0.3059E-02, 0.3059E-02, & + 0.2702E-01, 0.2260E-01, 0.1607E-01, 0.2720E-01, 0.3982E-01, 0.4452E+00, 0.4365E+00, 0.4345E+00, 0.4432E+00, 0.4623E+00, & + 0.2684E-01, 0.2328E-01, 0.2099E-01, 0.3040E-01, 0.3867E-01, 0.4389E+00, 0.3132E-01, 0.3158E-01, 0.4083E-01, 0.4580E+00 / + + data((c14hcb(T_3,j,i),i=1,KG(14)),j=1,NUMPIR) / & + -0.1581E-03,-0.9707E-04,-0.1250E-03, 0.2580E-03, 0.7378E-04,-0.1617E-01, 0.8646E-02,-0.4656E-05,-0.4656E-05,-0.4656E-05, & + -0.1319E-03,-0.9528E-04,-0.1710E-03, 0.7118E-04, 0.2076E-04,-0.1608E-01, 0.8552E-02,-0.4656E-05,-0.4656E-05,-0.4656E-05, & + -0.1721E-03,-0.4680E-04,-0.5522E-04,-0.6242E-04, 0.4517E-04,-0.7777E-02, 0.8382E-02,-0.4656E-05,-0.4656E-05,-0.4656E-05, & + -0.1482E-03,-0.4208E-04,-0.5216E-04,-0.6514E-04,-0.8378E-04,-0.7956E-02, 0.8013E-02,-0.4656E-05,-0.4656E-05,-0.4656E-05, & + -0.1501E-03,-0.4002E-04,-0.1664E-03, 0.2272E-04,-0.1888E-03,-0.4656E-05,-0.4656E-05,-0.4656E-05,-0.4656E-05,-0.4656E-05, & + -0.1201E-03,-0.4709E-04,-0.5371E-04,-0.1574E-03, 0.1854E-03,-0.7712E-02,-0.4656E-05,-0.4656E-05,-0.4656E-05,-0.4656E-05, & + -0.1333E-03,-0.1062E-03, 0.5785E-04,-0.4150E-04,-0.5717E-05,-0.4656E-05,-0.4656E-05,-0.4656E-05,-0.4656E-05,-0.4656E-05, & + -0.1212E-03,-0.8524E-04,-0.5895E-04,-0.2884E-03,-0.1581E-01,-0.4656E-05,-0.4656E-05,-0.4656E-05,-0.4656E-05,-0.4656E-05, & + -0.8148E-04,-0.9361E-04,-0.2873E-03, 0.1883E-03,-0.1594E-01, 0.8133E-02,-0.4656E-05,-0.4656E-05,-0.4656E-05,-0.4656E-05, & + -0.1221E-03,-0.1430E-04, 0.6335E-04,-0.2581E-03, 0.7977E-02,-0.4656E-05,-0.4656E-05,-0.4656E-05,-0.4656E-05,-0.4656E-05, & + -0.9257E-04,-0.5008E-04, 0.6389E-04,-0.7455E-02,-0.7745E-02,-0.4656E-05,-0.4656E-05,-0.4656E-05,-0.4656E-05,-0.4656E-05, & + -0.1186E-03,-0.9037E-04,-0.7461E-04,-0.4656E-05, 0.1168E-03,-0.4656E-05,-0.4656E-05,-0.4656E-05,-0.4656E-05,-0.4656E-05, & + -0.8513E-04,-0.5708E-04, 0.7763E-02,-0.4656E-05,-0.4656E-05,-0.4656E-05,-0.4656E-05,-0.4656E-05,-0.4656E-05,-0.4656E-05, & + -0.1124E-03,-0.1228E-03, 0.7663E-02,-0.4656E-05,-0.4656E-05,-0.4656E-05,-0.4656E-05,-0.4656E-05,-0.4656E-05,-0.4656E-05, & + -0.1015E-03,-0.8369E-04,-0.2167E-03,-0.7548E-02, 0.7608E-02,-0.4656E-05,-0.4656E-05,-0.4656E-05,-0.4656E-05,-0.4656E-05, & + -0.1049E-03,-0.6414E-04,-0.1384E-03,-0.1644E-03,-0.6919E-02, 0.7736E-02,-0.4656E-05,-0.4656E-05,-0.4656E-05,-0.4656E-05, & + -0.1008E-03,-0.7047E-04,-0.1276E-03,-0.2445E-03,-0.1860E-03, 0.7975E-02,-0.4656E-05,-0.4656E-05,-0.4656E-05,-0.4656E-05, & + -0.9629E-04,-0.1007E-03,-0.1127E-03,-0.1527E-03,-0.3238E-03,-0.7373E-02, 0.7877E-02, 0.7840E-02, 0.7997E-02, 0.8345E-02, & + -0.8800E-04,-0.1072E-03,-0.1046E-03,-0.1777E-03,-0.2146E-03,-0.7016E-02, 0.1516E-01, 0.1532E-01, 0.1509E-01, 0.8268E-02 / + + + data((c15hca(T_1,j,i),i=1,KG(15)),j=1,NUMPIR) / & + -0.1921E+02,-0.1363E+02,-0.1080E+02,-0.8392E+01,-0.6776E+01,-0.5696E+01,-0.4572E+01,-0.3752E+01,-0.2382E+01,-0.1110E+01, & + 0.6803E+00, 0.3259E+01,-0.1875E+02,-0.1321E+02,-0.1040E+02,-0.8026E+01,-0.6449E+01,-0.5401E+01,-0.4316E+01,-0.3498E+01, & + -0.2141E+01,-0.9439E+00, 0.8103E+00, 0.3314E+01,-0.1829E+02,-0.1278E+02,-0.1000E+02,-0.7646E+01,-0.6089E+01,-0.5085E+01, & + -0.4047E+01,-0.3217E+01,-0.1872E+01,-0.7106E+00, 0.9573E+00, 0.3390E+01,-0.1783E+02,-0.1236E+02,-0.9596E+01,-0.7264E+01, & + -0.5735E+01,-0.4740E+01,-0.3743E+01,-0.2882E+01,-0.1587E+01,-0.4714E+00, 0.1120E+01, 0.3425E+01,-0.1737E+02,-0.1195E+02, & + -0.9193E+01,-0.6877E+01,-0.5371E+01,-0.4404E+01,-0.3405E+01,-0.2574E+01,-0.1298E+01,-0.1747E+00, 0.1327E+01, 0.3547E+01, & + -0.1691E+02,-0.1153E+02,-0.8776E+01,-0.6490E+01,-0.4993E+01,-0.4049E+01,-0.3039E+01,-0.2256E+01,-0.1012E+01, 0.1103E+00, & + 0.1530E+01, 0.3651E+01,-0.1644E+02,-0.1112E+02,-0.8360E+01,-0.6105E+01,-0.4623E+01,-0.3688E+01,-0.2694E+01,-0.1915E+01, & + -0.6855E+00, 0.3993E+00, 0.1714E+01, 0.3950E+01,-0.1598E+02,-0.1073E+02,-0.7943E+01,-0.5723E+01,-0.4236E+01,-0.3314E+01, & + -0.2338E+01,-0.1596E+01,-0.3583E+00, 0.6963E+00, 0.1868E+01, 0.4127E+01,-0.1553E+02,-0.1034E+02,-0.7542E+01,-0.5357E+01, & + -0.3856E+01,-0.2942E+01,-0.1986E+01,-0.1299E+01,-0.5472E-01, 0.9443E+00, 0.2149E+01, 0.4261E+01,-0.1485E+02,-0.9661E+01, & + -0.7008E+01,-0.4830E+01,-0.3458E+01,-0.2566E+01,-0.1658E+01,-0.9639E+00, 0.2083E+00, 0.1182E+01, 0.2458E+01, 0.4452E+01, & + -0.1427E+02,-0.9166E+01,-0.6373E+01,-0.4404E+01,-0.3073E+01,-0.2209E+01,-0.1349E+01,-0.6648E+00, 0.4023E+00, 0.1452E+01, & + 0.2739E+01, 0.4466E+01,-0.1380E+02,-0.8726E+01,-0.5772E+01,-0.3982E+01,-0.2732E+01,-0.1874E+01,-0.1052E+01,-0.4403E+00, & + 0.5763E+00, 0.1792E+01, 0.2999E+01, 0.4335E+01,-0.1305E+02,-0.8270E+01,-0.5304E+01,-0.3586E+01,-0.2392E+01,-0.1568E+01, & + -0.8299E+00,-0.2650E+00, 0.8584E+00, 0.2062E+01, 0.3141E+01, 0.4168E+01,-0.1269E+02,-0.7900E+01,-0.4956E+01,-0.3205E+01, & + -0.2065E+01,-0.1332E+01,-0.6415E+00,-0.7921E-01, 0.1170E+01, 0.2269E+01, 0.3198E+01, 0.4066E+01,-0.1227E+02,-0.7536E+01, & + -0.4576E+01,-0.2859E+01,-0.1815E+01,-0.1139E+01,-0.4520E+00, 0.2272E+00, 0.1371E+01, 0.2351E+01, 0.3150E+01, 0.3935E+01, & + -0.1186E+02,-0.7159E+01,-0.4223E+01,-0.2538E+01,-0.1619E+01,-0.9324E+00,-0.1566E+00, 0.5151E+00, 0.1520E+01, 0.2339E+01, & + 0.3132E+01, 0.3880E+01,-0.1120E+02,-0.6777E+01,-0.3919E+01,-0.2330E+01,-0.1387E+01,-0.6737E+00, 0.1108E+00, 0.6991E+00, & + 0.1531E+01, 0.2163E+01, 0.3150E+01, 0.3767E+01,-0.9973E+01,-0.6279E+01,-0.3638E+01,-0.2048E+01,-0.1098E+01,-0.4407E+00, & + 0.3043E+00, 0.7797E+00, 0.1424E+01, 0.2002E+01, 0.3122E+01, 0.3611E+01,-0.8483E+01,-0.5607E+01,-0.3357E+01,-0.1744E+01, & + -0.8884E+00,-0.2264E+00, 0.3800E+00, 0.7504E+00, 0.1245E+01, 0.2032E+01, 0.3097E+01, 0.3546E+01 / + + data((c15hca(T_2,j,i),i=1,KG(15)),j=1,NUMPIR) / & + 0.3762E-01, 0.2372E-01, 0.1643E-01, 0.1208E-01, 0.1170E-01, 0.1164E-01, 0.1214E-01, 0.1161E-01, 0.1028E-01, 0.9185E-02, & + 0.7712E-02, 0.1001E-01, 0.3762E-01, 0.2382E-01, 0.1593E-01, 0.1145E-01, 0.1059E-01, 0.1049E-01, 0.1080E-01, 0.1057E-01, & + 0.8894E-02, 0.7807E-02, 0.7132E-02, 0.1032E-01, 0.3764E-01, 0.2386E-01, 0.1555E-01, 0.1080E-01, 0.9692E-02, 0.9231E-02, & + 0.9585E-02, 0.9644E-02, 0.7711E-02, 0.6443E-02, 0.6223E-02, 0.9922E-02, 0.3764E-01, 0.2395E-01, 0.1516E-01, 0.1028E-01, & + 0.8917E-02, 0.8415E-02, 0.8457E-02, 0.8777E-02, 0.6436E-02, 0.5428E-02, 0.5499E-02, 0.8017E-02, 0.3768E-01, 0.2399E-01, & + 0.1482E-01, 0.9692E-02, 0.8247E-02, 0.7640E-02, 0.7582E-02, 0.7783E-02, 0.5432E-02, 0.4482E-02, 0.4919E-02, 0.5903E-02, & + 0.3770E-01, 0.2401E-01, 0.1449E-01, 0.9252E-02, 0.7620E-02, 0.6678E-02, 0.6845E-02, 0.6925E-02, 0.4939E-02, 0.3471E-02, & + 0.4124E-02, 0.3873E-02, 0.3776E-01, 0.2395E-01, 0.1419E-01, 0.8959E-02, 0.7096E-02, 0.6184E-02, 0.6110E-02, 0.6075E-02, & + 0.4419E-02, 0.2891E-02, 0.3056E-02, 0.1214E-02, 0.3780E-01, 0.2391E-01, 0.1392E-01, 0.8687E-02, 0.6573E-02, 0.5733E-02, & + 0.5359E-02, 0.5009E-02, 0.4034E-02, 0.2755E-02, 0.1968E-02,-0.4187E-04, 0.3791E-01, 0.2382E-01, 0.1373E-01, 0.8561E-02, & + 0.6060E-02, 0.5120E-02, 0.4618E-02, 0.4713E-02, 0.3965E-02, 0.2481E-02, 0.8164E-03,-0.1088E-02, 0.3843E-01, 0.2148E-01, & + 0.1302E-01, 0.6384E-02, 0.5256E-02, 0.4260E-02, 0.4077E-02, 0.4181E-02, 0.4132E-02, 0.2135E-02,-0.2931E-03,-0.1151E-02, & + 0.3896E-01, 0.2081E-01, 0.1097E-01, 0.5568E-02, 0.4475E-02, 0.3795E-02, 0.3828E-02, 0.3996E-02, 0.3766E-02, 0.1193E-02, & + -0.1089E-02,-0.9420E-03, 0.3973E-01, 0.2024E-01, 0.9943E-02, 0.4815E-02, 0.3820E-02, 0.3663E-02, 0.3568E-02, 0.3881E-02, & + 0.2859E-02, 0.6698E-03,-0.1549E-02,-0.6280E-03, 0.3635E-01, 0.1963E-01, 0.1061E-01, 0.3812E-02, 0.3509E-02, 0.3429E-02, & + 0.3693E-02, 0.3316E-02, 0.1120E-02, 0.6552E-03,-0.1193E-02,-0.1109E-02, 0.3631E-01, 0.1893E-01, 0.1056E-01, 0.3172E-02, & + 0.3378E-02, 0.3164E-02, 0.2751E-02, 0.1722E-02, 0.1112E-02, 0.4354E-03,-0.7327E-03,-0.1319E-02, 0.3500E-01, 0.1828E-01, & + 0.1050E-01, 0.2831E-02, 0.2784E-02, 0.2564E-02, 0.1469E-02, 0.7739E-03, 0.1209E-02, 0.7913E-03,-0.2512E-03,-0.1758E-02, & + 0.3352E-01, 0.1763E-01, 0.1045E-01, 0.2401E-02, 0.1928E-02, 0.1340E-02, 0.3753E-03, 0.5794E-03, 0.9060E-03, 0.1042E-02, & + 0.1465E-03,-0.2533E-02, 0.2880E-01, 0.1729E-01, 0.1077E-01, 0.1347E-02, 0.1194E-02,-0.1191E-03, 0.2828E-03, 0.6606E-03, & + 0.9743E-03, 0.1002E-02, 0.0000E+00,-0.3140E-02, 0.2040E-01, 0.1585E-01, 0.1165E-01, 0.3871E-05, 0.1509E-04,-0.1046E-02, & + 0.2444E-03, 0.4359E-03, 0.1041E-02, 0.2429E-02,-0.1721E-03,-0.2786E-02, 0.1737E-01, 0.1560E-01, 0.1240E-01,-0.2139E-03, & + -0.1025E-02,-0.1248E-02,-0.6934E-04, 0.1649E-03, 0.4062E-03, 0.1554E-02,-0.4179E-03,-0.7795E-03 / + + data((c15hca(T_3,j,i),i=1,KG(15)),j=1,NUMPIR) / & + -0.1488E-03,-0.9248E-04,-0.2322E-04,-0.4187E-05, 0.1104E-04, 0.9895E-05,-0.2283E-05, 0.2512E-05,-0.9058E-05, 0.8449E-05, & + 0.8297E-05,-0.3882E-04,-0.1488E-03,-0.9058E-04,-0.2398E-04,-0.5709E-05, 0.1218E-04, 0.1180E-04, 0.1522E-05, 0.6927E-05, & + -0.1161E-04, 0.1714E-04,-0.4948E-06,-0.3540E-04,-0.1500E-03,-0.8830E-04,-0.2474E-04,-0.8373E-05, 0.6470E-05, 0.7992E-05, & + 0.9096E-05, 0.6737E-05,-0.1485E-04, 0.1873E-04,-0.4948E-06,-0.4491E-04,-0.1500E-03,-0.8601E-04,-0.2664E-04,-0.1028E-04, & + 0.6851E-05, 0.6851E-05, 0.1294E-04,-0.2550E-05,-0.1520E-04, 0.2310E-04, 0.4948E-06,-0.2017E-04,-0.1507E-03,-0.8373E-04, & + -0.2664E-04,-0.1256E-04, 0.4567E-05, 0.1028E-04, 0.9210E-05,-0.2131E-05,-0.6995E-05, 0.7498E-05,-0.1104E-04,-0.2284E-05, & + -0.1519E-03,-0.8183E-04,-0.2816E-04,-0.1142E-04, 0.7611E-06, 0.7231E-05, 0.1751E-05,-0.7612E-06, 0.8312E-05, 0.2436E-05, & + -0.7231E-05, 0.2398E-04,-0.1530E-03,-0.7992E-04,-0.2893E-04,-0.9896E-05, 0.3806E-06, 0.8906E-05, 0.3159E-05,-0.5328E-05, & + 0.3692E-05,-0.2093E-05,-0.6851E-05,-0.3045E-05,-0.1538E-03,-0.7536E-04,-0.3007E-04,-0.8754E-05,-0.3045E-05, 0.5138E-05, & + 0.9134E-06,-0.1979E-06, 0.1560E-05,-0.1507E-04, 0.2284E-04, 0.9895E-05,-0.1541E-03,-0.7688E-04,-0.2969E-04,-0.5709E-05, & + -0.3996E-05, 0.1142E-05,-0.8373E-06, 0.1235E-04,-0.7079E-05,-0.6737E-05, 0.1028E-04, 0.3578E-04,-0.1560E-03,-0.6851E-04, & + -0.1903E-04,-0.4187E-05,-0.4605E-05,-0.1142E-06, 0.3878E-05, 0.3597E-05,-0.9591E-05, 0.5328E-05, 0.7612E-05,-0.4948E-05, & + -0.1587E-03,-0.6546E-04,-0.2740E-04,-0.7612E-06,-0.3578E-05, 0.1713E-05, 0.6064E-05,-0.9781E-05, 0.1408E-05, 0.5709E-05, & + 0.8373E-05,-0.1256E-04,-0.1484E-03,-0.5823E-04,-0.4301E-04,-0.1522E-05, 0.7498E-05,-0.5328E-06,-0.7855E-05,-0.1599E-05, & + 0.1964E-04,-0.2284E-05, 0.7882E-10, 0.5328E-05,-0.1238E-03,-0.5700E-04,-0.5266E-04, 0.3286E-05, 0.4910E-05,-0.8602E-05, & + 0.6090E-06, 0.8454E-05, 0.1256E-05,-0.4072E-05,-0.1903E-05, 0.6470E-05,-0.1155E-03,-0.5231E-04,-0.4396E-04, 0.3626E-05, & + -0.7051E-05,-0.1743E-05, 0.9667E-05, 0.2064E-04,-0.2778E-05,-0.6546E-05,-0.4948E-05, 0.1903E-05,-0.1024E-03,-0.5129E-04, & + -0.4506E-04, 0.7943E-06, 0.3074E-06, 0.3243E-05, 0.2754E-04,-0.1479E-05, 0.1661E-05,-0.2969E-05,-0.1066E-04, 0.7612E-06, & + -0.8473E-04,-0.5418E-04,-0.4674E-04,-0.3418E-05, 0.9460E-05, 0.1151E-04, 0.5714E-05,-0.1069E-04,-0.2022E-05,-0.9061E-05, & + -0.1104E-04,-0.3083E-04,-0.4283E-04,-0.5037E-04,-0.4476E-04, 0.1951E-04, 0.8922E-05, 0.1296E-04,-0.4053E-05,-0.4355E-05, & + -0.2355E-05,-0.5004E-05,-0.1218E-04,-0.1522E-04, 0.6411E-05,-0.5937E-04,-0.5331E-04, 0.1934E-04, 0.5284E-05, 0.1129E-04, & + -0.2166E-05,-0.1484E-06,-0.5407E-05,-0.1364E-04,-0.3115E-05, 0.3004E-04,-0.5074E-04,-0.6256E-04,-0.5097E-04, 0.2218E-04, & + 0.1228E-04,-0.1160E-05,-0.1105E-05, 0.1618E-06,-0.6089E-05,-0.4216E-06,-0.5314E-05, 0.7903E-05 / + + + data((c15hcb(T_1,j,i),i=1,KG(15)),j=1,NUMPIR) / & + -0.9593E+01,-0.4078E+01,-0.2812E+01,-0.6506E+00,-0.4123E+00, 0.2055E+01, 0.4097E+01, 0.4671E+01, 0.4639E+01,-0.4587E+02, & + -0.4587E+02,-0.4587E+02,-0.9276E+01,-0.3757E+01,-0.2467E+01,-0.5784E+00, 0.8833E-01, 0.2232E+01, 0.3826E+01, 0.4723E+01, & + 0.4942E+01, 0.5135E+01,-0.4587E+02,-0.4587E+02,-0.8968E+01,-0.3508E+01,-0.2116E+01,-0.1363E+00, 0.1662E+00, 0.2424E+01, & + 0.4220E+01, 0.4513E+01, 0.1375E+01, 0.4601E+01,-0.4587E+02,-0.4587E+02,-0.8662E+01,-0.3164E+01,-0.1722E+01, 0.5178E-01, & + 0.7288E+00, 0.2411E+01, 0.3805E+01, 0.4766E+01, 0.4342E+01,-0.4587E+02,-0.4587E+02,-0.4587E+02,-0.8292E+01,-0.2799E+01, & + -0.1359E+01, 0.3271E+00, 0.1650E+01, 0.2395E+01, 0.4192E+01, 0.4758E+01, 0.2470E+01,-0.4587E+02,-0.4587E+02,-0.4587E+02, & + -0.7812E+01,-0.2404E+01,-0.1085E+01, 0.7167E+00, 0.2202E+01, 0.2922E+01, 0.4322E+01, 0.4591E+01, 0.4186E+01,-0.4587E+02, & + -0.4587E+02,-0.4587E+02,-0.7441E+01,-0.2066E+01,-0.7142E+00, 0.1057E+01, 0.2524E+01, 0.2946E+01, 0.4220E+01, 0.3607E+01, & + -0.4587E+02,-0.4587E+02,-0.4587E+02,-0.4587E+02,-0.7191E+01,-0.1745E+01,-0.3487E+00, 0.1453E+01, 0.2739E+01, 0.3660E+01, & + 0.4114E+01, 0.3245E+01,-0.4587E+02,-0.4587E+02,-0.4587E+02,-0.4587E+02,-0.6895E+01,-0.1326E+01,-0.3500E+00, 0.1647E+01, & + 0.2899E+01, 0.4023E+01, 0.3361E+01, 0.3360E+01,-0.4587E+02,-0.4587E+02,-0.4587E+02,-0.4587E+02,-0.5876E+01,-0.9573E+00, & + 0.2014E+00, 0.2130E+01, 0.3493E+01, 0.4088E+01,-0.4587E+02,-0.4587E+02,-0.4587E+02,-0.4587E+02,-0.4587E+02,-0.4587E+02, & + -0.4429E+01,-0.3417E+00, 0.1204E+01, 0.2780E+01, 0.3843E+01, 0.3099E+01,-0.4587E+02, 0.3605E+01,-0.4587E+02,-0.4587E+02, & + -0.4587E+02,-0.4587E+02,-0.3122E+01, 0.2697E+00, 0.1866E+01, 0.3526E+01, 0.3569E+01, 0.1025E+01,-0.4587E+02,-0.4587E+02, & + -0.4587E+02,-0.4587E+02,-0.4587E+02,-0.4587E+02,-0.2284E+01, 0.8186E+00, 0.2754E+01, 0.3206E+01, 0.3704E+01,-0.4587E+02, & + -0.4587E+02, 0.4625E+01,-0.4587E+02,-0.4587E+02,-0.4587E+02,-0.4587E+02,-0.1711E+01, 0.1220E+01, 0.3248E+01,-0.4587E+02, & + 0.2565E+01, 0.3297E+01,-0.4587E+02,-0.4587E+02,-0.4587E+02,-0.4587E+02,-0.4587E+02,-0.4587E+02,-0.1758E+01, 0.7970E+00, & + 0.2758E+01, 0.2926E+01, 0.2613E+01, 0.1974E+01,-0.4587E+02, 0.2310E+01,-0.4587E+02,-0.4587E+02,-0.4587E+02,-0.4587E+02, & + -0.1737E+01, 0.3499E+00, 0.2246E+01, 0.2673E+01, 0.3308E+01, 0.3463E+01, 0.3103E+01, 0.2611E+01, 0.2178E+01,-0.4587E+02, & + -0.4587E+02,-0.4587E+02,-0.1559E+01, 0.2215E+00, 0.1875E+01, 0.2500E+01, 0.3346E+01, 0.3585E+01, 0.3946E+01, 0.3533E+01, & + 0.3205E+01,-0.4587E+02,-0.4587E+02,-0.4587E+02,-0.1601E+01, 0.5060E-01, 0.1275E+01, 0.2176E+01, 0.3081E+01, 0.3649E+01, & + 0.3940E+01, 0.4106E+01, 0.4112E+01, 0.4349E+01, 0.2292E+01,-0.4587E+02,-0.1222E+01, 0.3199E+00, 0.1642E+01, 0.2380E+01, & + 0.3254E+01, 0.3534E+01, 0.3687E+01, 0.3717E+01, 0.3402E+01, 0.3868E+01,-0.4587E+02,-0.4587E+02 / + + data((c15hcb(T_2,j,i),i=1,KG(15)),j=1,NUMPIR) / & + 0.2967E-01, 0.1697E-01, 0.1795E-01, 0.1387E-01, 0.2032E-01, 0.1187E-01, 0.2560E-01, 0.1044E-01,-0.4560E+00, 0.3059E-02, & + 0.3059E-02, 0.3059E-02, 0.2998E-01, 0.1586E-01, 0.1786E-01, 0.1521E-01, 0.1710E-01, 0.1061E-01, 0.2030E-01, 0.1158E-01, & + 0.4452E+00, 0.3059E-02, 0.3059E-02, 0.3059E-02, 0.2993E-01, 0.1551E-01, 0.1481E-01, 0.9846E-02, 0.2443E-01, 0.1150E-01, & + 0.1865E-01, 0.1376E-01, 0.4617E+00, 0.3059E-02, 0.3059E-02, 0.3059E-02, 0.3035E-01, 0.1417E-01, 0.1438E-01, 0.1511E-01, & + 0.1901E-01, 0.8582E-02, 0.1746E-01, 0.1450E-01, 0.4523E+00, 0.3059E-02, 0.3059E-02, 0.3059E-02, 0.2970E-01, 0.1347E-01, & + 0.1322E-01, 0.1252E-01, 0.1665E-01, 0.1037E-01, 0.1320E-01, 0.1199E-01, 0.4436E+00, 0.3059E-02, 0.3059E-02, 0.3059E-02, & + 0.2949E-01, 0.1291E-01, 0.1671E-01, 0.1111E-01, 0.1400E-01, 0.1318E-01, 0.1060E-01, 0.1046E-01, 0.3059E-02, 0.3059E-02, & + 0.3059E-02, 0.3059E-02, 0.3004E-01, 0.1300E-01, 0.1413E-01, 0.9085E-02, 0.9764E-02, 0.2260E-01, 0.9778E-02, 0.4671E+00, & + 0.3059E-02, 0.3059E-02, 0.3059E-02, 0.3059E-02, 0.3086E-01, 0.1436E-01, 0.1205E-01, 0.1081E-01, 0.4681E-02, 0.1479E-01, & + 0.1888E-01, 0.3494E-01, 0.3059E-02, 0.3059E-02, 0.3059E-02, 0.3059E-02, 0.3094E-01, 0.1500E-01, 0.1457E-01, 0.1060E-01, & + 0.8319E-02, 0.8983E-02, 0.3791E-01, 0.2232E-01, 0.4631E+00, 0.3059E-02, 0.3059E-02, 0.3059E-02, 0.3158E-01, 0.1585E-01, & + 0.1292E-01, 0.6531E-02, 0.1383E-01, 0.4605E+00, 0.4662E+00, 0.3059E-02, 0.3059E-02, 0.3059E-02, 0.3059E-02, 0.3059E-02, & + 0.3182E-01, 0.1586E-01, 0.8724E-02, 0.5798E-02, 0.2454E-01, 0.4607E+00, 0.4560E+00, 0.4511E+00, 0.3059E-02, 0.3059E-02, & + 0.3059E-02, 0.3059E-02, 0.2369E-01, 0.1606E-01, 0.5477E-02, 0.1228E-01, 0.4579E+00, 0.4561E+00, 0.4497E+00, 0.3059E-02, & + 0.3059E-02, 0.3059E-02, 0.3059E-02, 0.3059E-02, 0.2190E-01, 0.1779E-01, 0.6267E-02, 0.4535E+00, 0.4533E+00, 0.3059E-02, & + 0.3059E-02, 0.3059E-02, 0.3059E-02, 0.3059E-02, 0.3059E-02, 0.3059E-02, 0.2100E-01, 0.1653E-01, 0.7449E-02, 0.4543E+00, & + 0.4472E+00, 0.4439E+00, 0.3059E-02, 0.3059E-02, 0.3059E-02, 0.3059E-02, 0.3059E-02, 0.3059E-02, 0.1864E-01, 0.1771E-01, & + 0.7040E-02, 0.2877E-01, 0.3381E-01, 0.2691E-01, 0.4466E+00, 0.3059E-02, 0.4613E+00, 0.3059E-02, 0.3059E-02, 0.3059E-02, & + 0.1637E-01, 0.1641E-01, 0.8424E-02, 0.1318E-01, 0.2060E-01, 0.3426E-01, 0.4122E-01, 0.4621E+00, 0.4555E+00, 0.4525E+00, & + 0.3059E-02, 0.3059E-02, 0.1607E-01, 0.1452E-01, 0.8013E-02, 0.1213E-01, 0.1482E-01, 0.2125E-01, 0.3379E-01, 0.3562E-01, & + 0.4619E+00, 0.4569E+00, 0.3059E-02, 0.3059E-02, 0.1698E-01, 0.1538E-01, 0.6616E-02, 0.1147E-01, 0.1217E-01, 0.1696E-01, & + 0.1871E-01, 0.2273E-01, 0.4513E-01, 0.4702E+00, 0.4617E+00, 0.4553E+00, 0.1700E-01, 0.1547E-01, 0.6456E-02, 0.1324E-01, & + 0.1502E-01, 0.2095E-01, 0.2547E-01, 0.2823E-01, 0.4107E-01, 0.4676E+00, 0.4583E+00, 0.4498E+00 / + + data((c15hcb(T_3,j,i),i=1,KG(15)),j=1,NUMPIR) / & + -0.6747E-05,-0.2483E-04, 0.6575E-04, 0.1026E-03, 0.3888E-03,-0.8519E-04,-0.1629E-03,-0.1808E-04,-0.8355E-02,-0.4656E-05, & + -0.4656E-05,-0.4656E-05,-0.2270E-04,-0.3427E-04, 0.5118E-04, 0.1218E-03, 0.1245E-03,-0.1245E-03, 0.3841E-05,-0.4151E-04, & + -0.8763E-02,-0.1687E-01,-0.4656E-05,-0.4656E-05,-0.4557E-04,-0.3023E-04, 0.2286E-04, 0.5656E-04, 0.4113E-04,-0.1407E-03, & + -0.1301E-03, 0.8503E-04,-0.7284E-02,-0.1669E-01,-0.4656E-05,-0.4656E-05,-0.5325E-04,-0.5309E-04,-0.1246E-04, 0.2244E-04, & + 0.5136E-04,-0.1272E-03, 0.4217E-04,-0.1749E-04,-0.8435E-02,-0.4656E-05,-0.4656E-05,-0.4656E-05,-0.6857E-04,-0.7217E-04, & + 0.1740E-05, 0.3653E-04,-0.1490E-03,-0.4090E-04,-0.2376E-04, 0.2047E-04,-0.7974E-02,-0.4656E-05,-0.4656E-05,-0.4656E-05, & + -0.1232E-03,-0.9826E-04,-0.2849E-04, 0.1703E-04,-0.1895E-03,-0.3363E-03, 0.7102E-04,-0.1838E-05,-0.1655E-01,-0.4656E-05, & + -0.4656E-05,-0.4656E-05,-0.9896E-04,-0.5127E-04,-0.2704E-04,-0.1218E-04,-0.1207E-03,-0.5883E-04, 0.6893E-04,-0.7924E-02, & + -0.4656E-05,-0.4656E-05,-0.4656E-05,-0.4656E-05,-0.7837E-04,-0.4980E-04, 0.6902E-05,-0.1072E-03,-0.4051E-04,-0.1991E-05, & + -0.1173E-03,-0.5195E-04,-0.4656E-05,-0.4656E-05,-0.4656E-05,-0.4656E-05,-0.8136E-04,-0.8102E-04, 0.1254E-03,-0.4658E-04, & + 0.3173E-04,-0.4461E-05,-0.1558E-03,-0.2036E-03, 0.8360E-02,-0.4656E-05,-0.4656E-05,-0.4656E-05,-0.2232E-04,-0.6411E-04, & + 0.9486E-04,-0.2322E-03,-0.8282E-04,-0.8202E-02, 0.8416E-02,-0.4656E-05,-0.4656E-05,-0.4656E-05,-0.4656E-05,-0.4656E-05, & + -0.1398E-03,-0.7165E-04,-0.4258E-04,-0.3970E-04,-0.2839E-03,-0.7873E-02, 0.8231E-02,-0.8213E-02,-0.4656E-05,-0.4656E-05, & + -0.4656E-05,-0.4656E-05,-0.6754E-04,-0.7469E-04,-0.6898E-04,-0.1702E-03,-0.8079E-02,-0.7270E-02, 0.8116E-02,-0.4656E-05, & + -0.4656E-05,-0.4656E-05,-0.4656E-05,-0.4656E-05,-0.2396E-04,-0.2361E-04,-0.8664E-04,-0.8038E-02,-0.8207E-02,-0.4656E-05, & + -0.4656E-05,-0.1670E-01,-0.4656E-05,-0.4656E-05,-0.4656E-05,-0.4656E-05,-0.5479E-04,-0.7593E-04,-0.1005E-03, 0.8199E-02, & + -0.7942E-02,-0.8244E-02,-0.4656E-05,-0.4656E-05,-0.4656E-05,-0.4656E-05,-0.4656E-05,-0.4656E-05,-0.3806E-04,-0.5825E-04, & + -0.1003E-03,-0.2925E-03,-0.1506E-03, 0.3148E-04, 0.8060E-02,-0.1593E-01, 0.8327E-02,-0.4656E-05,-0.4656E-05,-0.4656E-05, & + -0.4706E-04,-0.3630E-04,-0.7811E-04,-0.6881E-04,-0.1822E-03,-0.3091E-03,-0.3033E-03,-0.7684E-02,-0.7663E-02, 0.8167E-02, & + -0.4656E-05,-0.4656E-05,-0.7669E-04,-0.4610E-04,-0.8063E-04,-0.7250E-04,-0.1094E-03,-0.1241E-03,-0.2944E-03,-0.1736E-03, & + -0.7886E-02, 0.8248E-02,-0.4656E-05,-0.4656E-05,-0.7138E-04,-0.4545E-04,-0.3653E-04,-0.6075E-04,-0.4528E-04,-0.1077E-03, & + -0.1119E-03,-0.1657E-03,-0.4695E-03,-0.8112E-02,-0.7587E-02, 0.8217E-02,-0.6812E-04,-0.4558E-04,-0.6739E-04,-0.8861E-04, & + -0.9386E-04,-0.1334E-03,-0.2007E-03,-0.2179E-03,-0.1650E-03,-0.8001E-02, 0.8273E-02, 0.8118E-02 / + + + data((c16h2o(T_1,j,i),i=1,KG(16)),j=1,NUMPIR) / & + -0.2344E+02,-0.2016E+02,-0.1986E+02,-0.1655E+02,-0.1243E+02,-0.8437E+01,-0.4858E+01,-0.2298E+02,-0.2014E+02,-0.1984E+02, & + -0.1609E+02,-0.1198E+02,-0.8020E+01,-0.4548E+01,-0.2252E+02,-0.2012E+02,-0.1981E+02,-0.1564E+02,-0.1153E+02,-0.7596E+01, & + -0.4239E+01,-0.2206E+02,-0.2009E+02,-0.1957E+02,-0.1517E+02,-0.1111E+02,-0.7161E+01,-0.3871E+01,-0.2160E+02,-0.2007E+02, & + -0.1911E+02,-0.1472E+02,-0.1065E+02,-0.6721E+01,-0.3479E+01,-0.2113E+02,-0.2005E+02,-0.1865E+02,-0.1426E+02,-0.1021E+02, & + -0.6302E+01,-0.3081E+01,-0.2067E+02,-0.2003E+02,-0.1819E+02,-0.1379E+02,-0.9765E+01,-0.5883E+01,-0.2678E+01,-0.2026E+02, & + -0.2001E+02,-0.1773E+02,-0.1333E+02,-0.9332E+01,-0.5443E+01,-0.2253E+01,-0.2024E+02,-0.1999E+02,-0.1727E+02,-0.1288E+02, & + -0.8897E+01,-0.5029E+01,-0.1858E+01,-0.2026E+02,-0.1959E+02,-0.1481E+02,-0.1147E+02,-0.7477E+01,-0.4555E+01,-0.1464E+01, & + -0.2022E+02,-0.1632E+02,-0.1305E+02,-0.9885E+01,-0.6689E+01,-0.4108E+01,-0.1068E+01,-0.1936E+02,-0.1438E+02,-0.1163E+02, & + -0.8499E+01,-0.6146E+01,-0.3673E+01,-0.6816E+00,-0.1675E+02,-0.1281E+02,-0.1020E+02,-0.7716E+01,-0.5678E+01,-0.3256E+01, & + -0.3125E+00,-0.1510E+02,-0.1124E+02,-0.8821E+01,-0.7140E+01,-0.5243E+01,-0.2851E+01,-0.2560E-01,-0.1334E+02,-0.9708E+01, & + -0.8061E+01,-0.6611E+01,-0.4842E+01,-0.2459E+01, 0.1711E+00,-0.1155E+02,-0.8798E+01,-0.7440E+01,-0.6123E+01,-0.4439E+01, & + -0.2089E+01, 0.2480E+00,-0.1020E+02,-0.8154E+01,-0.6945E+01,-0.5681E+01,-0.4055E+01,-0.1737E+01, 0.2390E+00,-0.9464E+01, & + -0.7677E+01,-0.6512E+01,-0.5284E+01,-0.3707E+01,-0.1453E+01, 0.2015E+00,-0.9033E+01,-0.7246E+01,-0.6093E+01,-0.4882E+01, & + -0.3346E+01,-0.1264E+01, 0.1033E+00 / + + data((c16h2o(T_2,j,i),i=1,KG(16)),j=1,NUMPIR) / & + 0.4658E-01, 0.5840E-02, 0.4626E-02, 0.2688E-01, 0.2395E-01, 0.1804E-01, 0.2074E-01, 0.4660E-01, 0.1884E-02, 0.8561E-02, & + 0.2690E-01, 0.2403E-01, 0.1788E-01, 0.1934E-01, 0.4660E-01, 0.1800E-02, 0.1252E-01, 0.2694E-01, 0.2393E-01, 0.1786E-01, & + 0.1825E-01, 0.4660E-01, 0.1779E-02, 0.1649E-01, 0.2696E-01, 0.2397E-01, 0.1779E-01, 0.1765E-01, 0.4348E-01, 0.1758E-02, & + 0.2043E-01, 0.2696E-01, 0.2393E-01, 0.1748E-01, 0.1675E-01, 0.3944E-01, 0.1737E-02, 0.2445E-01, 0.2698E-01, 0.2384E-01, & + 0.1752E-01, 0.1549E-01, 0.3538E-01, 0.1654E-02, 0.2847E-01, 0.2702E-01, 0.2384E-01, 0.1714E-01, 0.1565E-01, 0.3127E-01, & + 0.1570E-02, 0.3245E-01, 0.2705E-01, 0.2374E-01, 0.1712E-01, 0.1514E-01, 0.2715E-01, 0.1444E-02, 0.3540E-01, 0.2711E-01, & + 0.2363E-01, 0.1702E-01, 0.1446E-01, 0.2960E-01, 0.1760E-01, 0.2977E-01, 0.2397E-01, 0.2087E-01, 0.1618E-01, 0.1445E-01, & + 0.2466E-01, 0.3039E-01, 0.2428E-01, 0.2217E-01, 0.1821E-01, 0.1593E-01, 0.1463E-01, 0.2640E-01, 0.2545E-01, 0.2231E-01, & + 0.2060E-01, 0.1773E-01, 0.1555E-01, 0.1473E-01, 0.3456E-01, 0.2135E-01, 0.2030E-01, 0.1844E-01, 0.1740E-01, 0.1559E-01, & + 0.1428E-01, 0.3203E-01, 0.2047E-01, 0.1809E-01, 0.1760E-01, 0.1725E-01, 0.1545E-01, 0.1541E-01, 0.2137E-01, 0.1857E-01, & + 0.1616E-01, 0.1698E-01, 0.1700E-01, 0.1537E-01, 0.1636E-01, 0.1338E-01, 0.1518E-01, 0.1580E-01, 0.1658E-01, 0.1710E-01, & + 0.1518E-01, 0.1513E-01, 0.1570E-01, 0.1614E-01, 0.1603E-01, 0.1673E-01, 0.1706E-01, 0.1497E-01, 0.1439E-01, 0.1987E-01, & + 0.1731E-01, 0.1601E-01, 0.1675E-01, 0.1681E-01, 0.1535E-01, 0.1425E-01, 0.2018E-01, 0.1723E-01, 0.1597E-01, 0.1691E-01, & + 0.1666E-01, 0.1509E-01, 0.1446E-01 / + + data((c16h2o(T_3,j,i),i=1,KG(16)),j=1,NUMPIR) / & + -0.2873E-03,-0.8031E-04, 0.4225E-04,-0.9287E-04,-0.6013E-04,-0.4339E-04,-0.2474E-04,-0.2862E-03,-0.8372E-05, 0.1146E-03, & + -0.9248E-04,-0.6166E-04,-0.3882E-04,-0.1827E-04,-0.2870E-03,-0.6851E-05, 0.1865E-03,-0.9172E-04,-0.6128E-04,-0.3616E-04, & + -0.7612E-05,-0.2877E-03,-0.7231E-05, 0.1880E-03,-0.9287E-04,-0.5671E-04,-0.4110E-04,-0.1104E-04,-0.3429E-03,-0.7612E-05, & + 0.1149E-03,-0.9287E-04,-0.6356E-04,-0.4529E-04,-0.2436E-04,-0.4187E-03,-0.7992E-05, 0.4339E-04,-0.9325E-04,-0.6280E-04, & + -0.4225E-04,-0.3197E-04,-0.4925E-03,-0.8754E-05,-0.2740E-04,-0.9477E-04,-0.6432E-04,-0.3768E-04,-0.3361E-04,-0.5511E-03, & + -0.8753E-05,-0.9972E-04,-0.9515E-04,-0.6394E-04,-0.3806E-04,-0.3787E-04,-0.4792E-03,-0.1028E-04,-0.1534E-03,-0.9477E-04, & + -0.6356E-04,-0.3616E-04,-0.2923E-04,-0.5070E-03, 0.1922E-03,-0.1028E-03,-0.5823E-04,-0.7954E-04,-0.2550E-04,-0.3893E-04, & + -0.3776E-03,-0.1043E-03,-0.7993E-04,-0.7422E-04,-0.4948E-04,-0.3007E-04,-0.3863E-04, 0.8335E-04,-0.5709E-04,-0.6090E-04, & + -0.7840E-04,-0.3692E-04,-0.3007E-04,-0.4251E-04,-0.6204E-04,-0.4872E-04,-0.3806E-04,-0.4681E-04,-0.3463E-04,-0.3007E-04, & + -0.4312E-04,-0.1142E-04,-0.5176E-04,-0.5024E-04,-0.3007E-04,-0.3730E-04,-0.3037E-04,-0.3888E-04, 0.2550E-04,-0.6508E-04, & + -0.2512E-04,-0.3083E-04,-0.3197E-04,-0.3041E-04,-0.3750E-04, 0.1484E-04,-0.1941E-04,-0.2626E-04,-0.3349E-04,-0.3463E-04, & + -0.2896E-04,-0.1716E-04,-0.7231E-04,-0.3920E-04,-0.2893E-04,-0.3540E-04,-0.3311E-04,-0.3734E-04,-0.2550E-05,-0.7650E-04, & + -0.3159E-04,-0.2778E-04,-0.3121E-04,-0.2169E-04,-0.4365E-04,-0.1546E-04,-0.7916E-04,-0.2931E-04,-0.2854E-04,-0.3654E-04, & + -0.1979E-04,-0.4811E-04,-0.1435E-04 / + + + data((c17h2o(T_1,j,i),i=1,KG(17)),j=1,NUMPIR) / & + -0.2255E+02,-0.2000E+02,-0.1703E+02,-0.1282E+02,-0.9215E+01,-0.5938E+01,-0.2009E+01,-0.2209E+02,-0.1997E+02,-0.1657E+02, & + -0.1236E+02,-0.8764E+01,-0.5499E+01,-0.1582E+01,-0.2163E+02,-0.1993E+02,-0.1611E+02,-0.1191E+02,-0.8324E+01,-0.5061E+01, & + -0.1170E+01,-0.2117E+02,-0.1990E+02,-0.1565E+02,-0.1146E+02,-0.7889E+01,-0.4631E+01,-0.7737E+00,-0.2071E+02,-0.1987E+02, & + -0.1519E+02,-0.1100E+02,-0.7440E+01,-0.4179E+01,-0.3719E+00,-0.2026E+02,-0.1985E+02,-0.1473E+02,-0.1054E+02,-0.6995E+01, & + -0.3721E+01, 0.0000E+00,-0.2024E+02,-0.1982E+02,-0.1426E+02,-0.1009E+02,-0.6549E+01,-0.3284E+01, 0.4053E+00,-0.2022E+02, & + -0.1980E+02,-0.1381E+02,-0.9639E+01,-0.6097E+01,-0.2821E+01, 0.8375E+00,-0.2021E+02,-0.1933E+02,-0.1335E+02,-0.9187E+01, & + -0.5653E+01,-0.2379E+01, 0.1272E+01,-0.2010E+02,-0.1503E+02,-0.1125E+02,-0.7665E+01,-0.4492E+01,-0.1893E+01, 0.1642E+01, & + -0.1747E+02,-0.1278E+02,-0.9547E+01,-0.6120E+01,-0.3756E+01,-0.1443E+01, 0.1995E+01,-0.1529E+02,-0.1095E+02,-0.8107E+01, & + -0.5036E+01,-0.3182E+01,-0.1032E+01, 0.2429E+01,-0.1370E+02,-0.9303E+01,-0.6691E+01,-0.4357E+01,-0.2683E+01,-0.6173E+00, & + 0.2805E+01,-0.1150E+02,-0.7859E+01,-0.5618E+01,-0.3843E+01,-0.2234E+01,-0.2171E+00, 0.2973E+01,-0.9590E+01,-0.6537E+01, & + -0.4886E+01,-0.3355E+01,-0.1805E+01, 0.1615E+00, 0.3157E+01,-0.7530E+01,-0.5699E+01,-0.4306E+01,-0.2892E+01,-0.1388E+01, & + 0.5448E+00, 0.3155E+01,-0.6758E+01,-0.5112E+01,-0.3809E+01,-0.2464E+01,-0.9947E+00, 0.8713E+00, 0.3203E+01,-0.6245E+01, & + -0.4610E+01,-0.3376E+01,-0.2058E+01,-0.6166E+00, 0.1073E+01, 0.3109E+01,-0.5777E+01,-0.4175E+01,-0.2963E+01,-0.1671E+01, & + -0.2556E+00, 0.1241E+01, 0.3014E+01 / + + data((c17h2o(T_2,j,i),i=1,KG(17)),j=1,NUMPIR) / & + 0.4264E-01, 0.1968E-02, 0.1863E-01, 0.1436E-01, 0.1101E-01, 0.1055E-01, 0.1281E-01, 0.4264E-01, 0.1989E-02, 0.1861E-01, & + 0.1438E-01, 0.1095E-01, 0.1030E-01, 0.1211E-01, 0.3996E-01, 0.1968E-02, 0.1861E-01, 0.1434E-01, 0.1103E-01, 0.1019E-01, & + 0.1160E-01, 0.3600E-01, 0.1947E-02, 0.1861E-01, 0.1442E-01, 0.1086E-01, 0.1003E-01, 0.1157E-01, 0.3203E-01, 0.5756E-02, & + 0.1861E-01, 0.1444E-01, 0.1080E-01, 0.9922E-02, 0.1151E-01, 0.2801E-01, 0.9713E-02, 0.1859E-01, 0.1446E-01, 0.1070E-01, & + 0.9880E-02, 0.1066E-01, 0.2393E-01, 0.1369E-01, 0.1859E-01, 0.1451E-01, 0.1057E-01, 0.9880E-02, 0.1072E-01, 0.1987E-01, & + 0.1767E-01, 0.1863E-01, 0.1451E-01, 0.1040E-01, 0.9880E-02, 0.1057E-01, 0.1572E-01, 0.2169E-01, 0.1863E-01, 0.1442E-01, & + 0.1022E-01, 0.9742E-02, 0.1036E-01, 0.3391E-02, 0.1884E-01, 0.1566E-01, 0.1105E-01, 0.1011E-01, 0.1001E-01, 0.1017E-01, & + 0.1982E-01, 0.1444E-01, 0.1189E-01, 0.1030E-01, 0.9859E-02, 0.9861E-02, 0.1038E-01, 0.1748E-01, 0.1321E-01, 0.9922E-02, & + 0.1068E-01, 0.1013E-01, 0.9937E-02, 0.9958E-02, 0.1346E-01, 0.9943E-02, 0.9566E-02, 0.1097E-01, 0.9815E-02, 0.9964E-02, & + 0.1059E-01, 0.9817E-02, 0.7159E-02, 0.8687E-02, 0.1114E-01, 0.1007E-01, 0.1014E-01, 0.1058E-01, 0.3370E-02, 0.7264E-02, & + 0.9378E-02, 0.1112E-01, 0.9767E-02, 0.1016E-01, 0.1101E-01, 0.2993E-02, 0.8017E-02, 0.9566E-02, 0.1116E-01, 0.9738E-02, & + 0.1025E-01, 0.1086E-01, 0.8331E-02, 0.8771E-02, 0.1001E-01, 0.1117E-01, 0.9847E-02, 0.1076E-01, 0.1084E-01, 0.7850E-02, & + 0.9378E-02, 0.1001E-01, 0.1105E-01, 0.9964E-02, 0.1113E-01, 0.1168E-01, 0.8038E-02, 0.9336E-02, 0.9817E-02, 0.1096E-01, & + 0.1024E-01, 0.1175E-01, 0.1107E-01 / + + data((c17h2o(T_3,j,i),i=1,KG(17)),j=1,NUMPIR) / & + -0.2188E-03,-0.2283E-05,-0.8069E-04,-0.4415E-04,-0.2284E-04,-0.4491E-04,-0.4518E-04,-0.2196E-03,-0.2665E-05,-0.8107E-04, & + -0.4301E-04,-0.2398E-04,-0.4795E-04,-0.4693E-04,-0.2683E-03,-0.3045E-05,-0.8107E-04,-0.4301E-04,-0.2246E-04,-0.4757E-04, & + -0.4152E-04,-0.3403E-03,-0.4187E-05,-0.8031E-04,-0.3996E-04,-0.1865E-04,-0.4301E-04,-0.4350E-04,-0.4118E-03, 0.6584E-04, & + -0.8107E-04,-0.4034E-04,-0.1903E-04,-0.4643E-04,-0.4834E-04,-0.4803E-03, 0.1378E-03,-0.8069E-04,-0.4072E-04,-0.1713E-04, & + -0.5176E-04,-0.3460E-04,-0.4099E-03, 0.2101E-03,-0.8069E-04,-0.3920E-04,-0.1713E-04,-0.5024E-04,-0.3524E-04,-0.3391E-03, & + 0.2809E-03,-0.7992E-04,-0.3616E-04,-0.2017E-04,-0.5633E-04,-0.4886E-04,-0.2668E-03, 0.2078E-03,-0.8069E-04,-0.3768E-04, & + -0.2131E-04,-0.5580E-04,-0.5454E-04,-0.2207E-04,-0.8601E-04,-0.4643E-04,-0.2436E-04,-0.4148E-04,-0.5458E-04,-0.4579E-04, & + -0.5138E-04,-0.2893E-04,-0.3273E-04,-0.3882E-04,-0.3920E-04,-0.5035E-04,-0.3170E-04,-0.2169E-04,-0.3007E-04,-0.2740E-04, & + -0.5328E-04,-0.4491E-04,-0.4403E-04,-0.6383E-04, 0.4834E-04,-0.2702E-04,-0.4453E-04,-0.4339E-04,-0.4457E-04,-0.4551E-04, & + -0.8133E-04, 0.3768E-04,-0.7611E-06,-0.2626E-04,-0.4643E-04,-0.4305E-04,-0.4840E-04,-0.5149E-04, 0.7193E-04,-0.2169E-04, & + -0.4491E-04,-0.3996E-04,-0.4483E-04,-0.4487E-04,-0.6698E-04,-0.4834E-04,-0.3463E-04,-0.4986E-04,-0.4377E-04,-0.4514E-04, & + -0.5377E-04,-0.2626E-04,-0.4187E-04,-0.3692E-04,-0.5100E-04,-0.4651E-04,-0.4392E-04,-0.5386E-04,-0.4643E-04,-0.4301E-04, & + -0.3578E-04,-0.5176E-04,-0.4594E-04,-0.4551E-04,-0.3920E-04,-0.3425E-04,-0.4491E-04,-0.3654E-04,-0.5138E-04,-0.4377E-04, & + -0.5614E-04,-0.5758E-04,-0.3600E-04 / + + + data((c18h2o(T_1,j,i),i=1,KG(18)),j=1,NUMPIR) / & + -0.2121E+02,-0.2002E+02,-0.1676E+02,-0.1274E+02,-0.8780E+01,-0.5167E+01,-0.2692E+01,-0.6275E+00,-0.2075E+02,-0.1996E+02, & + -0.1630E+02,-0.1228E+02,-0.8324E+01,-0.4718E+01,-0.2260E+01,-0.2303E+00,-0.2029E+02,-0.1990E+02,-0.1584E+02,-0.1182E+02, & + -0.7868E+01,-0.4269E+01,-0.1806E+01, 0.1645E+00,-0.2022E+02,-0.1985E+02,-0.1538E+02,-0.1136E+02,-0.7417E+01,-0.3820E+01, & + -0.1373E+01, 0.5657E+00,-0.2018E+02,-0.1981E+02,-0.1492E+02,-0.1090E+02,-0.6965E+01,-0.3369E+01,-0.9319E+00, 0.9577E+00, & + -0.2013E+02,-0.1937E+02,-0.1446E+02,-0.1044E+02,-0.6512E+01,-0.2917E+01,-0.4928E+00, 0.1376E+01,-0.2009E+02,-0.1891E+02, & + -0.1400E+02,-0.9984E+01,-0.6063E+01,-0.2466E+01,-0.6887E-01, 0.1768E+01,-0.2006E+02,-0.1845E+02,-0.1354E+02,-0.9530E+01, & + -0.5618E+01,-0.2024E+01, 0.3615E+00, 0.2196E+01,-0.2003E+02,-0.1800E+02,-0.1308E+02,-0.9075E+01,-0.5174E+01,-0.1593E+01, & + 0.7820E+00, 0.2600E+01,-0.1827E+02,-0.1464E+02,-0.1097E+02,-0.7525E+01,-0.3733E+01,-0.1077E+01, 0.1204E+01, 0.3014E+01, & + -0.1525E+02,-0.1210E+02,-0.9275E+01,-0.5876E+01,-0.2768E+01,-0.6286E+00, 0.1622E+01, 0.3394E+01,-0.1298E+02,-0.1060E+02, & + -0.7764E+01,-0.4462E+01,-0.2154E+01,-0.2001E+00, 0.2034E+01, 0.3756E+01,-0.1157E+02,-0.8941E+01,-0.5984E+01,-0.3509E+01, & + -0.1651E+01, 0.2279E+00, 0.2422E+01, 0.4066E+01,-0.9986E+01,-0.7062E+01,-0.4794E+01,-0.2818E+01,-0.1196E+01, 0.6394E+00, & + 0.2791E+01, 0.4283E+01,-0.8064E+01,-0.5512E+01,-0.3933E+01,-0.2274E+01,-0.7559E+00, 0.1036E+01, 0.3085E+01, 0.4444E+01, & + -0.6440E+01,-0.4863E+01,-0.3219E+01,-0.1791E+01,-0.3279E+00, 0.1427E+01, 0.3304E+01, 0.4527E+01,-0.5902E+01,-0.4207E+01, & + -0.2756E+01,-0.1350E+01, 0.7686E-01, 0.1776E+01, 0.3475E+01, 0.4550E+01,-0.5439E+01,-0.3739E+01,-0.2330E+01,-0.9233E+00, & + 0.4612E+00, 0.2066E+01, 0.3564E+01, 0.4502E+01,-0.5006E+01,-0.3316E+01,-0.1906E+01,-0.5066E+00, 0.8352E+00, 0.2272E+01, & + 0.3587E+01, 0.4419E+01 / + + data((c18h2o(T_2,j,i),i=1,KG(18)),j=1,NUMPIR) / & + 0.2338E-01, 0.1968E-02, 0.9503E-02, 0.3412E-02, 0.6280E-03,-0.1109E-02,-0.1089E-02,-0.1026E-02, 0.1972E-01, 0.2093E-02, & + 0.9503E-02, 0.3391E-02, 0.6489E-03,-0.1172E-02,-0.1164E-02,-0.1158E-02, 0.1603E-01, 0.3328E-02, 0.9524E-02, 0.3391E-02, & + 0.6489E-03,-0.1277E-02,-0.1229E-02,-0.1296E-02, 0.1229E-01, 0.7138E-02, 0.9524E-02, 0.3370E-02, 0.6070E-03,-0.1319E-02, & + -0.1264E-02,-0.1610E-02, 0.8478E-02, 0.1095E-01, 0.9566E-02, 0.3412E-02, 0.5652E-03,-0.1382E-02,-0.1266E-02,-0.1566E-02, & + 0.4563E-02, 0.1480E-01, 0.9566E-02, 0.3412E-02, 0.5443E-03,-0.1423E-02,-0.1199E-02,-0.1679E-02, 0.2261E-02, 0.1865E-01, & + 0.9608E-02, 0.3454E-02, 0.4815E-03,-0.1423E-02,-0.1296E-02,-0.1555E-02, 0.2198E-02, 0.2250E-01, 0.9671E-02, 0.3412E-02, & + 0.4187E-03,-0.1426E-02,-0.1472E-02,-0.1800E-02, 0.2072E-02, 0.2600E-01, 0.9734E-02, 0.3433E-02, 0.3977E-03,-0.1428E-02, & + -0.1541E-02,-0.1591E-02, 0.1987E-01, 0.8645E-02, 0.6280E-02, 0.1298E-02,-0.1151E-02,-0.1509E-02,-0.1662E-02,-0.1570E-02, & + 0.4668E-02, 0.8373E-02, 0.3956E-02,-0.4187E-04,-0.1968E-02,-0.1624E-02,-0.1700E-02,-0.1947E-02, 0.9231E-02, 0.5694E-02, & + 0.1444E-02,-0.2512E-03,-0.1827E-02,-0.1662E-02,-0.1576E-02,-0.1633E-02, 0.8666E-02, 0.3077E-02,-0.1737E-02,-0.1277E-02, & + -0.1507E-02,-0.1757E-02,-0.1612E-02,-0.1612E-02, 0.8164E-03,-0.4375E-02,-0.1884E-02,-0.1277E-02,-0.1564E-02,-0.1853E-02, & + -0.1591E-02,-0.1486E-02,-0.1486E-02,-0.2596E-02,-0.1633E-02,-0.1539E-02,-0.1662E-02,-0.1846E-02,-0.1423E-02,-0.1277E-02, & + -0.1423E-02,-0.2617E-02,-0.1005E-02,-0.1379E-02,-0.1687E-02,-0.1905E-02,-0.1528E-02,-0.1298E-02,-0.1675E-03,-0.1947E-02, & + -0.5024E-03,-0.1325E-02,-0.1696E-02,-0.1698E-02,-0.1486E-02,-0.1277E-02, 0.1047E-03,-0.1109E-02,-0.5861E-03,-0.1363E-02, & + -0.1620E-02,-0.1666E-02,-0.1507E-02,-0.9210E-03, 0.1047E-03,-0.1047E-02,-0.8394E-03,-0.1342E-02,-0.1591E-02,-0.1323E-02, & + -0.1340E-02,-0.9420E-03 / + + data((c18h2o(T_3,j,i),i=1,KG(18)),j=1,NUMPIR) / & + -0.1085E-03, 0.2283E-05,-0.4719E-04,-0.3807E-06,-0.1522E-05,-0.3425E-05,-0.7612E-06, 0.1751E-05,-0.1766E-03, 0.1523E-05, & + -0.4719E-04,-0.7609E-06,-0.3807E-06,-0.3045E-05, 0.1599E-05, 0.8723E-05,-0.2443E-03, 0.1941E-04,-0.4757E-04,-0.1522E-05, & + -0.3806E-06,-0.1903E-05,-0.2778E-05, 0.1294E-04,-0.1838E-03, 0.8563E-04,-0.4757E-04,-0.1903E-05, 0.1142E-05,-0.2664E-05, & + -0.6090E-06, 0.1321E-04,-0.1161E-03, 0.1526E-03,-0.4757E-04,-0.2664E-05,-0.3805E-06,-0.3806E-05,-0.2093E-05, 0.2253E-04, & + -0.4795E-04, 0.9248E-04,-0.4757E-04,-0.1903E-05, 0.0000E+00,-0.3045E-05,-0.7992E-06, 0.1393E-04,-0.9134E-05, 0.2246E-04, & + -0.4834E-04,-0.2664E-05, 0.3804E-06,-0.5328E-05,-0.1510E-05, 0.1465E-04,-0.1028E-04,-0.4757E-04,-0.4948E-04,-0.1142E-05, & + 0.7614E-06,-0.4910E-05,-0.5709E-06, 0.1477E-04,-0.1256E-04,-0.1066E-03,-0.4910E-04,-0.1523E-05,-0.3805E-06,-0.3121E-05, & + -0.2512E-05, 0.1142E-04,-0.7878E-04,-0.2664E-05,-0.8373E-05,-0.7612E-06, 0.1104E-04,-0.3311E-05,-0.1979E-05, 0.5709E-05, & + -0.2626E-04,-0.4872E-04,-0.3808E-06,-0.2283E-05, 0.2284E-05,-0.3349E-05,-0.4034E-05, 0.7231E-05,-0.4910E-04, 0.1599E-04, & + 0.1256E-04,-0.7612E-05, 0.1180E-05,-0.1815E-05,-0.7193E-05, 0.3045E-05, 0.1576E-09, 0.6470E-05,-0.1408E-04,-0.1903E-05, & + 0.1522E-05,-0.4746E-05,-0.4948E-05, 0.3806E-06, 0.9020E-04, 0.5214E-04, 0.6090E-05,-0.1104E-04, 0.1180E-05,-0.2778E-05, & + -0.6090E-05,-0.2664E-05,-0.6737E-04,-0.1218E-04,-0.3806E-05,-0.5214E-05,-0.1066E-05,-0.1294E-05,-0.3045E-05,-0.2664E-05, & + -0.4643E-04, 0.1713E-04,-0.1218E-04,-0.6204E-05,-0.2360E-05,-0.1979E-05,-0.1903E-05,-0.3806E-05,-0.3045E-04,-0.1256E-04, & + -0.9134E-05,-0.6508E-05,-0.1027E-05,-0.7993E-06,-0.1142E-05,-0.7992E-05,-0.3616E-04,-0.1028E-04,-0.1066E-04,-0.6051E-05, & + 0.1066E-05,-0.1751E-05,-0.2284E-05,-0.2284E-05,-0.3920E-04,-0.9895E-05,-0.1321E-04,-0.3844E-05,-0.2055E-05,-0.2512E-05, & + -0.3806E-05,-0.3425E-05 / + + +contains + +subroutine gases ( ncol , nlm , ib , ig & + , pp , dp , tt , rmix & + , o3mix , umco2 , umch4 , umn2o & + , hk , tg , pkd , ip1 & + , ip2 & + ) + +!----------------------------------------------------------------------- +! Calculates the non-gray spectral absorption due to H2O, O3, CO2, +! CHA4, and N2O at long and short wavelengths. + + ! INPUT ARGUMENTS: + integer (kind=int_kind), intent(in):: & + ncol &! Length of sub-domain. + ,nlm &! Number of layers. + ,ib &! Index of spectral interval. + ,ig ! Index of k-distribution. + + integer (kind=int_kind), intent(in), dimension(ncol,nlm):: & + ip1 &!Used in conjunction with pressure weighting. + ,ip2 !Used in conjunction with pressure weighting. + + real (kind=dbl_kind), intent(in):: & + umco2 &!Concentration of CO2 (ppm). + ,umch4 &!Concentration of CH4 (???). + ,umn2o !Concentration of N2O (???). + + real (kind=dbl_kind), intent(in), dimension(ncol,nlm):: & + dp &!Layer Thickness (hPa). + ,tt &!Layer Temperature (K). + ,rmix &!Layer Water Vapor Mixing Ratio (kg/kg). + ,o3mix &!Layer Ozone Mixing Ratio (kg/kg). + ,pkd !Used in conjunction with pressure weighting (-). + + real (kind=dbl_kind), intent(in), dimension(ncol,nlm+1):: & + pp !Level Pressure (hPa). + + ! OUTPUT ARGUMENTS: + real (kind=dbl_kind), intent(out):: & + hk !Weight (-). + + real (kind=dbl_kind), intent(out), dimension(ncol,nlm):: & + tg !Transmission (-). + + ! LOCAL VARIABLES: + + real (kind=dbl_kind), dimension(ncol,nlm):: & + fkg , fkga , fkgb , pq & + ,tg1 , tg2 , tg3 + +!----------------------------------------------------------------------- + select case (ib) + case (1) + ! (50000-14500 cm^-1 ): nongray absorption by O3. + ! 619.618 is the solar energy contained in that band (Wm^-2). + call qopo3s(fk1o3(ig),dp,o3mix,tg) + hk = 619.618*hk1(ig) + + case (2) + ! (14500-7700 cm^-1): nongray absorption by H2O. + ! 484.295 is the solar energy contained in the band (Wm^-2). + call qk(ncol,nlm,c2h2o(:,:,ig),tt,fkg,pkd,ip1,ip2) + call qoph2o(fkg,dp,rmix,tg) + hk = 484.295*hk2(ig) + + case (3) + ! (7700-5250 cm^-1): nongray absorption by H2O. + ! 149.845 is the solar energy contained in the band (Wm^-2). + call qk(ncol,nlm,c3h2o(:,:,ig),tt,fkg,pkd,ip1,ip2) + call qoph2o(fkg,dp,rmix,tg) + hk = 149.845*hk3(ig) + + case (4) + ! (5250-4000 cm^-1): nongray absorption by H2O. + ! 48.7302 is the solar energy contained in the band (Wm^-2). + call qk(ncol,nlm,c4h2o(:,:,ig),tt,fkg,pkd,ip1,ip2) + call qoph2o(fkg,dp,rmix,tg) + hk = 48.7302*hk4(ig) + + case (5) + ! (4000-2850 cm^-1): nongray absorption by H2O. + ! 31.6576 is the solar energy contained in the band (Wm^-2). + call qk(ncol,nlm,c5h2o(:,:,ig),tt,fkg,pkd,ip1,ip2) + call qoph2o(fkg,dp,rmix,tg) + hk = 31.6576*hk5(ig) + + case (6) + ! (2850-2500 cm^-1): nongray absorption by H2O. + ! 5.79927 is the solar energy contained in the band (Wm^-2). + call qk(ncol,nlm,c6h2o(:,:,ig),tt,fkg,pkd,ip1,ip2) + call qoph2o(fkg,dp,rmix,tg) + hk = 5.79927*hk6(ig) + + case (7) + ! (2200-1900 cm^-1): nongray absorption by H2O. + call qk(ncol,nlm,c7h2o(:,:,ig),tt,fkg,pkd,ip1,ip2) + call qoph2o(fkg,dp,rmix,tg) + hk = hk7(ig) + + case (8) + ! (1900-1700 cm^-1): nongray absorption by H2O. + call qk(ncol,nlm,c8h2o(:,:,ig),tt,fkg,pkd,ip1,ip2) + call qoph2o(fkg,dp,rmix,tg) + hk = hk8(ig) + + case (9) + ! (1700-1400 cm^-1): nongray absorption by H2O. + call qk(ncol,nlm,c9h2o(:,:,ig),tt,fkg,pkd,ip1,ip2) + call qoph2o(fkg,dp,rmix,tg) + hk = hk9(ig) + + case (10) + ! (1400-1250 cm^-1): overlapping absorption by H2O, CH4, and N2O + ! using approach one of Fu(1991). + call qk(ncol,nlm,c10h2o(:,:,ig),tt,fkg,pkd,ip1,ip2) + call qoph2o(fkg,dp,rmix,tg1) + call qk(ncol,nlm,c10ch4,tt,fkg,pkd,ip1,ip2) + call qopch4(fkg,dp,tg2) + call qk(ncol,nlm,c10n2o,tt,fkg,pkd,ip1,ip2) + call qopn2o(fkg,dp,tg3) + + tg = tg1 + tg2/1.6*umch4 + tg3/0.28*umn2o + hk = hk10(ig) + + case (11) + ! (1250-1100 cm^-1): overlapping absorption by H2O, CH4, and N2O + ! using approach one of Fu(1991). + call qk(ncol,nlm,c11h2o(:,:,ig),tt,fkg,pkd,ip1,ip2) + call qoph2o(fkg,dp,rmix,tg1) + call qk(ncol,nlm,c11ch4,tt,fkg,pkd,ip1,ip2) + call qopch4(fkg,dp,tg2) + call qk(ncol,nlm,c11n2o,tt,fkg,pkd,ip1,ip2) + call qopn2o(fkg,dp,tg3) + + tg = tg1 + tg2/1.6*umch4 + tg3/0.28*umn2o + hk = hk11(ig) + + case(12) + ! (1100-980 cm^-1): overlapping absorption by H2O and O3 + ! using approach one of Fu(1991). + call qkio3(ncol,nlm,c12o3(:,:,ig),tt,fkg,pkd,ip1,ip2) + call qopo3i(fkg,dp,o3mix,tg1) + call qk(ncol,nlm,c12h2o,tt,fkg,pkd,ip1,ip2) + call qoph2o(fkg,dp,rmix,tg2) + + tg = tg1 + tg2 + hk = hk12(ig) + + case (13) + ! (980-800 cm^-1 ): nongray absorption by H2O. + call qk(ncol,nlm,c13h2o(:,:,ig),tt,fkg,pkd,ip1,ip2) + call qoph2o(fkg,dp,rmix,tg) + hk = hk13(ig) + + case (14) + ! (800-670 cm^-1): overlapping absorption by H2O and CO2 + ! using approach two of Fu(1991). + + where (pp(:,1:nlm) .ge. 63.1) + pq = rmix + elsewhere + pq = 0._dbl_kind + end where + + call qk(ncol,nlm,c14hca(:,:,ig),tt,fkga,pkd,ip1,ip2) + call qk(ncol,nlm,c14hcb(:,:,ig),tt,fkgb,pkd,ip1,ip2) + + fkg = fkga/330.0*umco2+pq*fkgb + call qophc(fkg,dp,tg) + hk = hk14(ig) + + case (15) + ! (670-540 cm^-1): overlapping absorption by H2O and CO2 + ! using approach two of Fu(1991). + + where (pp(:,1:nlm) .ge. 63.1) + pq = rmix + elsewhere + pq = 0._dbl_kind + end where + call qk(ncol,nlm,c15hca(:,:,ig),tt,fkga,pkd,ip1,ip2) + call qk(ncol,nlm,c15hcb(:,:,ig),tt,fkgb,pkd,ip1,ip2) + + fkg = fkga/330.0*umco2+pq*fkgb + call qophc(fkg,dp,tg) + hk = hk15(ig) + + case (16) + ! (540-400 cm^-1 ): nongray absorption by H2O. + call qk(ncol,nlm,c16h2o(:,:,ig),tt,fkg,pkd,ip1,ip2) + call qoph2o(fkg,dp,rmix,tg) + hk = hk16(ig) + + case (17) + ! (400-280 cm^-1 ): nongray absorption by H2O. + call qk(ncol,nlm,c17h2o(:,:,ig),tt,fkg,pkd,ip1,ip2) + call qoph2o(fkg,dp,rmix,tg) + hk = hk17(ig) + + case (18) + ! (280-000 cm^-1 ): nongray absorption by H2O. + call qk(ncol,nlm,c18h2o(:,:,ig),tt,fkg,pkd,ip1,ip2) + call qoph2o(fkg,dp,rmix,tg) + hk = hk18(ig) + + case default + stop + end select + + return +end subroutine gases + + +subroutine qopch4 (fkg, dp, tg) +!----------------------------------------------------------------------- +! Absorption by CH4 in the 1400-1250cm^-1 and 1250-1100cm^-1 +! spectral intervals. + + use bugsrad_physconst, only: molar_volume,gravity,MW_dry_air + implicit none + +! ARGUMENT LIST VARIABLES: +! INPUT ARGUMENTS: +! ---------------- + real (kind=dbl_kind), intent(in), dimension(:,:):: & + dp &!Layer Thickness (hPa). + ,fkg !Gaseous absorption coefficients (cm-atm)^-1. + +! OUTPUT ARGUMENTS: +! ----------------- + real (kind=dbl_kind), intent(out), dimension(:,:):: & + tg !Transmission (-). + + real (kind=dbl_kind) :: & + ch4_conc !ppv + + ch4_conc = 1.6e-6_dbl_kind + tg = fkg*dp*molar_volume*10.0/gravity*ch4_conc/MW_dry_air + + return +end subroutine qopch4 + + +subroutine qopn2o (fkg , dp, tg) +!----------------------------------------------------------------------- +! Absorption by N2O in the 1400-1250cm^-1 and 1250-1100cm^-1 +! spectral intervals. + + use bugsrad_physconst, only: molar_volume, gravity, MW_dry_air + implicit none + + real (kind=dbl_kind), intent(in), dimension(:,:):: & + dp & !Layer Thickness (hPa). + ,fkg !Gaseous absorption coefficients (cm-atm)^-1. + + ! OUTPUT ARGUMENTS: + real (kind=dbl_kind), intent(out), dimension(:,:):: & + tg !Transmission (-). + + real (kind = dbl_kind):: & + n2o_conc !ppv + + n2o_conc = 0.28e-6_dbl_kind + tg = fkg*dp*molar_volume*10.0/gravity*n2o_conc/MW_dry_air + + return +end subroutine qopn2o + + +subroutine qoph2o (fkg , dp , rmix , tg) +!----------------------------------------------------------------------- +! Absorption by H2O in each SW and LW spectral interval. + + use bugsrad_physconst, only: molar_volume, gravity, MW_h2o + implicit none + + real (kind=dbl_kind), intent(in), dimension(:,:):: & + dp & !Layer Thickness (hPa). + ,rmix & !Water Vapor Mixing Ratio (kg/kg). + ,fkg !Gaseous absorption coefficients (cm-atm)^-1. + + ! OUTPUT ARGUMENTS: + real (kind=dbl_kind), intent(out), dimension(:,:):: & + tg !Transmisssion (-). + + tg = fkg*rmix*dp*molar_volume/MW_h2o*10.0/gravity + + return +end subroutine qoph2o + + +subroutine qopo3i (fkg , dp , o3mix , tg ) +!----------------------------------------------------------------------- +! Absorption by O3 in the infrared band (1100-980 cm^-1). + + use bugsrad_physconst, only: molar_volume, gravity, MW_o3 + implicit none + + real (kind=dbl_kind), intent(in), dimension(:,:):: & + dp & !Layer Thickness (hPa). + ,o3mix & !Ozone Mixing Ratio (kg/kg). + ,fkg !Gaseous absorption coefficients (cm-atm)^-1. + + ! OUTPUT ARGUMENTS: + real (kind=dbl_kind), intent(out), dimension(:,:):: & + tg !Transmission (-). + + tg = fkg*o3mix*dp*molar_volume/MW_o3*10.0/gravity + + return +end subroutine qopo3i + + +subroutine qopo3s (fk , dp , o3mix , tg ) +!----------------------------------------------------------------------- +! Computes non-gray absorption of O3. + + use bugsrad_physconst, only: molar_volume, gravity, MW_o3 + implicit none + + real (kind=dbl_kind), intent(in):: & + fk ! + + real (kind=dbl_kind), intent(in), dimension(:,:):: & + dp & !Layer Thickness (hPa). + ,o3mix !Ozone Mixing Ratio (kg/kg). + + ! OUTPUT ARGUMENTS: + real (kind=dbl_kind), intent(out), dimension(:,:):: & + tg !Transmission (-). + + tg = o3mix*dp*fk*molar_volume/MW_o3*10.0/gravity + + return +end subroutine qopo3s + + +subroutine qophc(fkg,dp,tg) +!----------------------------------------------------------------------- +! Overlapping of H2O and CO2 bands. + + implicit none + + ! INPUT ARGUMENTS + real (kind=dbl_kind), intent(in), dimension(:,:):: & + dp & !Layer Thickness (hPa). + ,fkg !Gaseous absorption coefficients (cm-atm)^-1. + + ! OUTPUT ARGUMENTS: + real (kind=dbl_kind), intent(out), dimension(:,:):: & + tg !Transmission (-). + + tg = fkg*dp + return +end subroutine qophc + +subroutine qk(ncol,nlm,coefk,tt,fkg,pkd,ip1,ip2) +!----------------------------------------------------------------------- +! Interpolates the correlated k coeffients to the temperatures tt +! using the form +! ln k = a + b * ( t - 245 ) + c * ( t - 245 ) ** 2 +! and linearly interpolates in pressure if needed. + + implicit none + + ! INPUT ARGUMENTS: + integer (kind=int_kind), intent(in):: & + ncol & !Length of sub-domain. + ,nlm !Number of layers. + + integer (kind=int_kind), intent(in), dimension(:,:):: & + ip1 & !Used in conjunction with pressure weigthing. + ,ip2 !Used in conjunction with pressure weigthing. + + real (kind=dbl_kind), intent(in), dimension(:,:):: & + coefk !Pre-computed coefficients. + + real (kind=dbl_kind), intent(in), dimension(:,:):: & + tt & !Layer temperature (K). + ,pkd !Scaled pressure (hPa). + + ! OUTPUT ARGUMENTS: + real (kind=dbl_kind), intent(out), dimension(:,:):: & + fkg !Gaseous absorption coefficients (cm-atm)^-1. + + ! LOCAL VARIABLES: + integer (kind=int_kind):: & + i, l, i1, i2 + + real (kind=dbl_kind):: & + x1,x2,y1 + + + do l = 1, nlm + do i = 1, ncol + i1=ip1(i,l) + i2=ip2(i,l) + y1 = tt(i,l) - 245.0 + if (y1.lt.-65.) y1 = -65. + if (y1.gt.75.) y1 = 75. + x1 = exp(coefk(1,i1)+coefk(2,i1)*y1+coefk(3,i1)*y1**2) + if(i1.eq.i2) then + fkg(i,l) = x1 * pkd(i,l) + else + x2 = exp(coefk(1,i2)+coefk(2,i2)*y1+coefk(3,i2)*y1**2) + fkg(i,l) = x1 + ( x2 - x1 ) * pkd(i,l) + endif + enddo + enddo + + return +end subroutine qk + +subroutine qkio3 (ncol , nlm , coefk , tt , fkg , pkd , ip1 , ip2) +! Computes the gaseous absorption coefficients in units of (cm-atm)^-1 +! for a given cumulative probability in nlm layers. coefk are +! the coefficients used to calculate the absorption coefficient at the +! temperature t for the 19 pressures by +! ln k = a + b * ( t - 250 ) + c * ( t - 250 ) ** 2 +! and the absorption coefficient at conditions other than those nineteen +! pressures is interpolated linearly with pressure (Fu, 1991). + + implicit none + + ! INPUT ARGUMENTS: + integer (kind=int_kind), intent(in):: & + ncol & !Length of sub-domain. + ,nlm !Number of layers. + + integer (kind=int_kind), intent(in), dimension(:,:):: & + ip1 & !Used in conjunction with pressure weigthing. + ,ip2 !Used in conjunction with pressure weigthing. + + real (kind=dbl_kind), intent(in), dimension(:,:):: & + coefk !Pre-computed coefficients. + + real (kind=dbl_kind), intent(in), dimension(:,:):: & + tt & !Layer temperature (K). + ,pkd !Scaled pressure (hPa). + + + ! OUTPUT ARGUMENTS: + real (kind=dbl_kind), intent(out), dimension(:,:):: & + fkg !Gaseous absorption coefficients (cm-atm)^-1. + + + ! LOCAL VARIABLES: + integer (kind=int_kind):: & + i, l, i1, i2 + + real (kind=dbl_kind):: & + x1,x2,y1 + + do l = 1, nlm + do i = 1, ncol + i1 = ip1(i,l) + i2 =ip2(i,l) + y1 = tt(i,l) - 250.0 + if (y1.lt.-70.) y1 = -70. + if (y1.gt.75.) y1 = 70. + x1 = exp(coefk(1,i1)+coefk(2,i1)*y1+coefk(3,i1)*y1**2) + if(i1.eq.i2) then + fkg(i,l) = x1 * pkd(i,l) + else + x2 = exp(coefk(1,i2)+coefk(2,i2)*y1+coefk(3,i2)*y1**2) + fkg(i,l) = x1 + ( x2 - x1 ) * pkd(i,l) + endif + enddo + enddo + + return +end subroutine qkio3 + +subroutine pscale (ncol , nlm , ppl, stanp, pkd , ip1 , ip2 ) +!----------------------------------------------------------------------- +! pscale is used to scale pressure for use in the k-distribu +! tion routine. + + implicit none + + ! INPUT ARGUMENTS: + integer (kind=int_kind), intent(in):: & + ncol & !Length of sub-domain. + ,nlm !Number of layers. + + real (kind=dbl_kind), dimension(:,:):: & + ppl !Pressure (hPa). + + real (kind=dbl_kind), dimension(:):: & + stanp + + ! OUTPUT ARGUMENTS: + integer (kind=int_kind), dimension(:,:):: & + ip1 & !pointer. + ,ip2 !pointer. + + real (kind=dbl_kind), dimension(:,:):: & + pkd !Weighted pressure (hPa). + + ! LOCAL VARIABLES: + integer (kind=int_kind):: & + n_stanp + + integer (kind=int_kind):: & + i1, icol, l + + n_stanp = size(stanp) + + do icol = 1, ncol + i1 = 1 + do l = 1, nlm + if( ppl(icol,l) .lt. stanp(1) ) then + pkd(icol,l) = ppl(icol,l) / stanp(1) + ip1(icol,l) = 1 + ip2(icol,l) = 1 + elseif ( ppl(icol,l) .ge. stanp(n_stanp) ) then + pkd(icol,l) = (ppl(icol,l) - stanp(n_stanp-1)) & + / (stanp(n_stanp) - stanp(n_stanp-1)) + ip1(icol,l) = n_stanp - 1 + ip2(icol,l) = n_stanp + else +30 continue + if ( ppl(icol,l) .ge. stanp(i1) ) goto 20 + pkd(icol,l) = (ppl(icol,l)-stanp(i1-1)) & + / (stanp(i1)-stanp(i1-1)) + ip1(icol,l) = i1-1 + ip2(icol,l) = i1 + goto 5 +20 i1 = i1 + 1 + goto 30 + endif +5 enddo + enddo + + return +end subroutine pscale + + +!----------------------------------------------------------------------- +end module gases_ckd diff --git a/src/radiate/bugsrad/kinds.f90 b/src/radiate/bugsrad/kinds.f90 new file mode 100644 index 0000000..cd6222f --- /dev/null +++ b/src/radiate/bugsrad/kinds.f90 @@ -0,0 +1,32 @@ + + +! CVS: $Id: kinds.F90,v 1.1 2004/01/26 16:24:44 norm Exp $ +! CVS: $Name: $ + +!||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| + +module bugs_kinds + +!*********************************************************************** +! +! This module defines variable precision for all common data +! types. +! +!----------------------------------------------------------------------- + +implicit none + +!----------------------------------------------------------------------- + +integer, parameter :: char_len = 80, & + int_kind = kind(1), & + log_kind = kind(.true.), & + real_kind = selected_real_kind(6), & + dbl_kind = selected_real_kind(6) !13 for dble + !dbl_kind = selected_real_kind(13) !13 for dble + +end module bugs_kinds + +!||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| + + diff --git a/src/radiate/bugsrad/newexp.f90 b/src/radiate/bugsrad/newexp.f90 new file mode 100644 index 0000000..09268ca --- /dev/null +++ b/src/radiate/bugsrad/newexp.f90 @@ -0,0 +1,24 @@ + + +! CVS: $Id: newexp.F90,v 1.1 2003/11/11 21:55:13 norm Exp $ +! CVS: $Name: $ + +module newexp + use bugs_kinds + contains + + function exp(x) result(val) + !Fast replacement for standard exp() function + implicit none + real (kind = dbl_kind), intent(in) :: x + real (kind=dbl_kind):: & + y1 , y2 , y4 , val + + y1 = 1._dbl_kind - x*(0.2507213_dbl_kind - (x*(0.0292732_dbl_kind - x*0.0038278_dbl_kind))) + y2 = y1*y1 + y4 = y2*y2 + val = 1._dbl_kind/y4 + return + end function exp + +end module newexp diff --git a/src/radiate/bugsrad/rayle.f90 b/src/radiate/bugsrad/rayle.f90 new file mode 100644 index 0000000..ad13ab0 --- /dev/null +++ b/src/radiate/bugsrad/rayle.f90 @@ -0,0 +1,92 @@ + + +! CVS: $Id: rayle.F90,v 1.2 2007/05/30 20:26:31 norm Exp $ +! CVS: $Name: $ +module rayleigh +contains +!----------------------------------------------------------------------- + +subroutine rayle (& + nlm & !Number of layers + ,ib & !Index of spectral interval + ,pp & !Level pressure, hPa + ,tray & !Rayleigh optical depth + ,wray) !Rayleigh single-scattering albedo + + use bugs_kinds + use bugsrad_physconst, only: N_av, gravity, MW_dry_air, ri + + implicit none + +!----------------------------------------------------------------------- +! REFERENCES: +! Multitasked version of rayle.f from G. Stephens. Rayle computes the +! optical depth and single scattering albedo due to Rayleigh scattering. +! Laura D. Fowler (slikrock. 08-20-97) + +! send comments to laura@slikrock.atmos.colostate.edu and +! partain@atmos.colostate.edu + +! MODIFICATIONS: +! * changed declarations to adapt the code from BUGS4 to BUGS5. +! Laura D. Fowler/slikrock (02-01-00). +! 22 Nov 2005 +! Updated Rayleigh optical depth calculation. Now uses band-averaged +! Rayleigh scattering cross-sections following Bodhaine et al. 1999 +! Band average values are weighted by a top-of-atmosphere solar +! spectrum obtained from Modtran 4.1 (see Anderson et al., 2000), +! and based on Kurucz, 1995 +! + + +! SUBROUTINES CALLED: +! none. + +! FUNCTIONS CALLED: +! none. + +! INCLUDED COMMONS: +! none. + +! ARGUMENT LIST VARIABLES: +! INPUT ARGUMENTS: +! ---------------- + integer (kind=int_kind), intent(in):: & + nlm & !Number of layers. + ,ib !Index of spectral interval. + + real (kind=dbl_kind), intent(in), dimension(:,:):: & !(ncol,nlm+1) + pp !Level pressure (hPa). + +! OUTPUT ARGUMENTS: +! ----------------- + real (kind=dbl_kind), intent(out), dimension(:,:):: & !(ncol,nlm) + wray & !Rayleigh single scattering albedo (-). + ,tray !Rayleigh optical depth (-). + +! LOCAL VARIABLES: + integer (kind=int_kind):: & + i & !Horizontal index. + ,l !Vertical index. + real (kind=dbl_kind) :: & + fact !multiplier derived from scattering cross-section + !for scaling from pressure to optical depth + +!----------------------------------------------------------------------- + +!---- computes rayleigh scattering: +! The factor of 10. adjusts units from g-cm to kg-m and takes into +! account that pressure is in hPa. +!---- Do top level first + fact=ri(ib)*N_av/(MW_dry_air*gravity)*10. + tray(:,1) = pp(:,2)*fact + !Now remaining levels + do l = 2, nlm + tray(:,l) = (pp(:,l+1)-pp(:,l))*fact + enddo + wray(:,:) = 1.0 + return + end subroutine rayle +end module rayleigh + +!----------------------------------------------------------------------- diff --git a/src/radiate/bugsrad/two_rt_lw_ocastrndm.f90 b/src/radiate/bugsrad/two_rt_lw_ocastrndm.f90 new file mode 100644 index 0000000..6270b21 --- /dev/null +++ b/src/radiate/bugsrad/two_rt_lw_ocastrndm.f90 @@ -0,0 +1,278 @@ + + +subroutine two_rt_lw_gsolap & + ( ncol , nlm , mbs , mbir, & + ib , cldamt , wc_cld, wc_clr, & + asym_cld ,asym_clr,tau_cld , tau_clr, & + es , bf , fu_all , fu_clr, & + fd_all , fd_clr , c_maximal, cf_max,& + cf_random) + + + use bugs_kinds + implicit none + +!----------------------------------------------------------------------- +! REFERENCES: +! Alternate cloud overlap calculations + + +! SUBROUTINES CALLED: +! none. + +! FUNCTIONS CALLED: +! none. + +! INCLUDED COMMONS: +! none. + +! ARGUMENT LIST VARIABLES: +! INPUT ARGUMENTS: +! ---------------- + integer (kind=int_kind), intent(in):: & + ncol, & !Length of sub-domain. + nlm, & !Number of layers. + mbs, & !Number of SW spectral intervals. + mbir, & !Number of IR spectral intervals. + ib !Index of spectral interval. + + real (kind=dbl_kind), intent(in), dimension(ncol) :: & + c_maximal + + real (kind=dbl_kind), intent(in), dimension(ncol,mbir):: & + es !Spectral surface emissivity (-). + + real (kind=dbl_kind), intent(in), dimension(ncol,nlm):: & + wc_cld, & !Single scattering albedo (-). + wc_clr, & !Clear sky single-scattering albedo + asym_cld, & !Asymmetry factor (-). + asym_clr, & !Clear sky asymmetry factor + tau_cld, & !Optical depth (-). + tau_clr, & !Clear sky optical depth + cldamt, & !Cloud fraction (-). + cf_max, & !Cf in maximally overlapped region (-). + cf_random !Cf in randomly overlapped region (-). + + real (kind=dbl_kind), intent(in), dimension(ncol,nlm+1):: & + bf !Planck function (W/m^2). + +! OUTPUT ARGUMENTS: +! ----------------- + real (kind=dbl_kind), intent(out), dimension(ncol,nlm+1):: & + fd_all, & !All-sky spectral downward flux (W/m^2). + fd_clr, & !Clear sky spectral downward flux + fu_all, & !All-sky spectral upward flux (W/m^2). + fu_clr !Clear sky spectral upward flux + +! LOCAL VARIABLES: +! ---------------- + integer (kind=int_kind) :: & + i, & !Horizontal index. + l, & !Vertical index. + ibms !Index of spectral interval. + + real (kind=dbl_kind), dimension(nlm):: & + rr_clr, & ! + rr_cld, & ! + rr_tmp, & ! + tr_clr, & ! + tr_cld, & ! + tr_tmp, & ! + sigu_clr, & ! + sigu_cld, & ! + sigu_tmp, & ! + sigd_clr, & ! + sigd_cld, & ! + sigd_tmp ! + + real (kind=dbl_kind) :: & + aa, & ! + bb, & ! + beta0, & ! + cc, & ! + diffac, & ! + denom, & ! + fact, & ! + eggtau, & ! + ggtau, & ! + kappa, & ! + oms, & ! + prop, & ! + r, & ! + rinf, & ! + t, & ! + taus ! + + data diffac /2./ + + real (kind=dbl_kind), dimension(nlm):: & + td, & ! + vu, & ! + exptau + + real (kind=dbl_kind), dimension(nlm+1):: & + re, & ! + vd, & ! + fd_max, & !Maximally overlapped cloudy sky spectral downward flux + fd_rndm, & !Broken sky (randomly overlapped cloudy sky) spectral downward flux + fu_max, & !Maximally overlapped cloud sky spectral upward flux + fu_rndm !Broken sky (randomly overlapped cloudy sky) spectral upward flux + + + real (kind=dbl_kind) :: & + cld_ran, & !The random overlap fraction of cloud + cmin !Minimum cloud fraction in a column + + ibms = ib - mbs +!Begin loop over all columns + do i = 1, ncol + + !Clear layer properties + do l = 1, nlm + fact = asym_clr(i,l)*asym_clr(i,l) + oms = ((1.-fact)*wc_clr(i,l))/(1.-fact*wc_clr(i,l)) + taus = (1.-fact*wc_clr(i,l))*tau_clr(i,l) + + beta0 = (4.+asym_clr(i,l))/(8.*(1.+asym_clr(i,l))) + t = diffac*(1.-oms*(1.-beta0)) !-0.25 + r = diffac*oms*beta0 !-0.25 + kappa = sqrt(t**2-r**2) + rinf = r/(kappa+t) + ggtau = kappa*taus + eggtau = exp(-ggtau) + denom = (1.-rinf**2*eggtau**2) + tr_clr(l) = (1.-rinf**2)*eggtau/denom + rr_clr(l) = rinf*(1.-eggtau**2)/denom + + if(taus .lt. .8e-2) then + sigu_clr(l) = 0.5*diffac*(bf(i,l)+bf(i,l+1))*taus + sigd_clr(l) = sigu_clr(l) + else + aa = (t+r)*(1.-rr_clr(l))-(1.+rr_clr(l)-tr_clr(l))/taus + bb = -(t+r)*tr_clr(l)+(1.+rr_clr(l)-tr_clr(l))/taus + cc = diffac*(1.-oms)/kappa**2 + sigu_clr(l) = cc*(aa*bf(i,l)+bb*bf(i,l+1)) + sigd_clr(l) = cc*(bb*bf(i,l)+aa*bf(i,l+1)) + endif + enddo + + !CLEAR SKY adding + re(1) = 0. + vd(1) = 0. + do l = 1, nlm + prop = 1. / (1. - re(l)*rr_clr(l)) + re(l+1) = rr_clr(l) + tr_clr(l)**2*re(l)*prop + vd(l+1) = sigd_clr(l) + (tr_clr(l)*vd(l) & + + tr_clr(l)*re(l)*sigu_clr(l))*prop + vu(l) = (rr_clr(l)*vd(l) + sigu_clr(l))*prop + td(l) = prop + enddo + + !CLEAR SKY flux calculation + fu_clr(i,nlm+1) = es(i,ibms)*bf(i,nlm+1) + fd_clr(i,1) = 0. + do l = nlm+1, 2, -1 + fd_clr(i,l) = re(l)*fu_clr(i,l) + vd(l) + fu_clr(i,l-1) = tr_clr(l-1)*fu_clr(i,l)*td(l-1) + vu(l-1) + enddo + !END CLEAR SKY CALC + + + !Cloudy layer properties + do l = 1, nlm + fact = asym_cld(i,l)*asym_cld(i,l) + oms = ((1.-fact)*wc_cld(i,l))/(1.-fact*wc_cld(i,l)) + taus = (1.-fact*wc_cld(i,l))*tau_cld(i,l) + + beta0 = (4.+asym_cld(i,l))/(8.*(1.+asym_cld(i,l))) + t = diffac*(1.-oms*(1.-beta0)) !-0.25 + r = diffac*oms*beta0 !-0.25 + kappa = sqrt(t**2-r**2) + rinf = r/(kappa+t) + ggtau = kappa*taus + eggtau = exp(-ggtau) + denom = (1.-rinf**2*eggtau**2) + tr_cld(l) = (1.-rinf**2)*eggtau/denom + rr_cld(l) = rinf*(1.-eggtau**2)/denom + + if(taus .lt. .8e-2) then + sigu_cld(l) = 0.5*diffac*(bf(i,l)+bf(i,l+1))*taus + sigd_cld(l) = sigu_cld(l) + else + aa = (t+r)*(1.-rr_cld(l))-(1.+rr_cld(l)-tr_cld(l))/taus + bb = -(t+r)*tr_cld(l)+(1.+rr_cld(l)-tr_cld(l))/taus + cc = diffac*(1.-oms)/kappa**2 + sigu_cld(l) = cc*(aa*bf(i,l)+bb*bf(i,l+1)) + sigd_cld(l) = cc*(bb*bf(i,l)+aa*bf(i,l+1)) + endif + enddo + + + !BEGIN MAXIMALLY OVERLAPPED CALC + !For layers where 0. < cf_max < 1., treat as randomly combined + do l = 1, nlm + rr_tmp(l) = cf_max(i,l)*rr_cld(l) + (1. - cf_max(i,l))*rr_clr(l) + tr_tmp(l) = cf_max(i,l)*tr_cld(l) + (1. - cf_max(i,l))*tr_clr(l) + sigu_tmp(l) = cf_max(i,l)*sigu_cld(l) + (1. - cf_max(i,l))*sigu_clr(l) + sigd_tmp(l) = cf_max(i,l)*sigd_cld(l) + (1. - cf_max(i,l))*sigd_clr(l) + enddo + !MAXIMALLY OVERLAPPED adding + re(1) = 0. + vd(1) = 0. + do l = 1, nlm + prop = 1. / (1. - re(l)*rr_tmp(l)) + re(l+1) = rr_tmp(l) + tr_tmp(l)**2*re(l)*prop + vd(l+1) = sigd_tmp(l) + (tr_tmp(l)*vd(l) & + + tr_tmp(l)*re(l)*sigu_tmp(l))*prop + vu(l) = (rr_tmp(l)*vd(l) + sigu_tmp(l))*prop + td(l) = prop + enddo + !MAXIMALLY OVERLAPPED flux calculation + fu_max(nlm+1) = es(i,ibms)*bf(i,nlm+1) + do l = nlm+1, 2, -1 + fd_max(l) = re(l)*fu_max(l) + vd(l) + fu_max(l-1) = tr_tmp(l-1)*fu_max(l)*td(l-1) + vu(l-1) + enddo + !END MAXIMALLY-OVERLAPPED CALC + + + !BEGIN RANDOMLY-OVERLAPPED CALC + do l = 1, nlm + rr_tmp(l) = cf_random(i,l)*rr_cld(l) + (1. - cf_random(i,l))*rr_clr(l) + tr_tmp(l) = cf_random(i,l)*tr_cld(l) + (1. - cf_random(i,l))*tr_clr(l) + sigu_tmp(l) = cf_random(i,l)*sigu_cld(l) + (1. - cf_random(i,l))*sigu_clr(l) + sigd_tmp(l) = cf_random(i,l)*sigd_cld(l) + (1. - cf_random(i,l))*sigd_clr(l) + enddo + + !RANDOMLY-OVERLAPPED adding + re(1) = 0. + vd(1) = 0. + do l = 1,nlm + prop = 1./(1. - re(l)*rr_tmp(l)) + re(l+1) = rr_tmp(l) + tr_tmp(l)*tr_tmp(l)*re(l)*prop + vd(l+1) = sigd_tmp(l) + (tr_tmp(l)*vd(l) + tr_tmp(l)*re(l)*sigu_tmp(l))*prop + vu(l) = (rr_tmp(l)*vd(l) + sigu_tmp(l))*prop + td(l) = prop + enddo + + !RANDOMLY-OVERLAPPED flux calculation + fu_rndm(nlm+1) = es(i,ibms)*bf(i,nlm+1) + do l = nlm+1, 2, -1 + fd_rndm(l) = re(l)*fu_rndm(l) + vd(l) + fu_rndm(l-1) = tr_tmp(l-1)*fu_rndm(l)*td(l-1) + vu(l-1) + enddo + !END RANDOMLY-OVERLAPPED CALC + + !ALL-SKY: Begin + !This is the combined maximally- and randomly overlapped portions of the sky + fd_all(i,1) = 0. + fu_all(i,nlm+1) = (1. - c_maximal(i))*fu_rndm(nlm+1) + c_maximal(i)*fu_max(nlm+1) + do l = 1, nlm + fd_all(i,l+1) = (1. - c_maximal(i))*fd_rndm(l+1) + c_maximal(i)*fd_max(l+1) + fu_all(i,l) = (1. - c_maximal(i))*fu_rndm(l) + c_maximal(i)*fu_max(l) + enddo + !>> END FULL CALCULATION << + + enddo !Loop over columns + return + end subroutine two_rt_lw_gsolap diff --git a/src/radiate/bugsrad/two_rt_sw_ocastrndm.f90 b/src/radiate/bugsrad/two_rt_sw_ocastrndm.f90 new file mode 100644 index 0000000..1fbfc56 --- /dev/null +++ b/src/radiate/bugsrad/two_rt_sw_ocastrndm.f90 @@ -0,0 +1,367 @@ + + +! CVS: $Id: two_rt_sw_ocastrndm.F90,v 1.2 2006/11/16 21:11:23 norm Exp $ +! CVS: $Name: $ + +!NBW This has been modified to apply descaling to the +!NBW delta-M scaled downwelling direct and diffuse fluxes + +subroutine two_rt_sw_gsolap & + ( ncol , nlm , mbs , ib , & + slr , amu0 , wc_clr , asym_clr , & + tau_clr , wc_cld , asym_cld , tau_cld , & + asdir , asdif , fddir_clr , fddif_clr , & + fudif_clr , fddir_all , fddif_all , fudif_all , & + cldamt , c_maximal , cf_max, cf_random ) + + use bugs_kinds + implicit none + +!------------------------------------------------------------------------------ +! REFERENCES +! Alternate cloud overlap calculation +! +! SUBROUTINES CALLED: +! +! FUNCTIONS CALLED: +! +! INCLUDED COMMONS: +! +! ARGUMENT LIST +! Inputs + integer (kind=int_kind), intent(in):: & + ncol, & !Length of sub-domain + nlm, & !Number of layers + mbs, & !Number of SW spectral intervals + ib !Index of spectral interval + + real (kind=dbl_kind), intent(in), dimension(ncol):: & + slr, & !Fraction of daylight + amu0, & !Cosine of solar zenith angle + c_maximal !Maximally overlapped fraction + + real (kind=dbl_kind), intent(in), dimension(ncol,mbs):: & + asdir, & !Spectral direct surface albedo + asdif !Spectral diffuse serface albedo + + real (kind=dbl_kind), intent(in), dimension(ncol,nlm):: & + wc_clr, & !Clear-sky single scattering albedo + wc_cld, & !Cloudy-sky single scattering albedo + asym_clr, & !Clear-sky asymmetry parameter + asym_cld, & !Cloudy-sky asymmetry parameter + tau_clr, & !Clear-sky optical depth + tau_cld, & !Cloudy-sky optical depth + cldamt, & !Cloud fraction + cf_max, & !Maximally overlapped cloud fractions + cf_random !Randomly overlapped cloud fractions + +! Outputs + real(kind=dbl_kind), intent(out), dimension(ncol, nlm+1):: & + fddir_clr, & !Clear-sky spectral direct downward flux (W/m^2) + fddir_all, & !All-sky spectral direct downward flux (W/m^2) + fddif_clr, & !Clear-sky spectral diffuse downward flux (W/m^2) + fddif_all, & !All-sky spectral diffuse downward flux (W/m^2) + fudif_clr, & !Clear-sky spectral diffuse upward flux (W/m^2) + fudif_all !All-sky spectral diffuse upward flux (W/m^2) + + +! LOCAL VARIABLES + integer (kind=int_kind) :: & + i, & !Horizontal index + l !Vertical index + + real (kind=dbl_kind), parameter :: & + eps = 1.0e-2 + + real (kind=dbl_kind) :: & + aa, & ! + bb, & ! + cc, & ! + denom, & ! + eggtau, & ! + g3, & ! + g4, & ! + ggtau, & ! + kappa, & ! + r, & ! + rinf, & ! + t, & ! + oms, & ! + taus, & ! + fact, & ! + asy, & ! + prop, & ! + fd_total ! + + real (kind=dbl_kind), dimension(nlm) :: & + exptau_s_clr, & ! + exptau_s_cld, & ! + exptau_us_clr,& ! + exptau_us_cld,& + rr_clr, & ! + rr_cld, & ! + rr_tmp, & ! + tr_clr, & ! + tr_cld, & ! + tr_tmp, & ! + sigu, & ! + sigd, & ! + sigu_clr_fract,& ! + sigu_cld_fract,& ! + sigd_clr_fract,& ! + sigd_cld_fract,& ! + sigu_tmp_fract, & ! + sigd_tmp_fract, & ! + td, & ! + vu ! + + real (kind=dbl_kind), dimension(nlm+1) :: & + direct_s, & ! + direct_us, & + re, & ! + vd ! + + real (kind=dbl_kind), dimension(nlm+1):: & + fddir_max, & !Maximum-overlap fraction spectral direct downward flux (W/m^2) + fddir_rndm, & !Random-overlap fraction spectral direct downward flux (W/m^2) + fddif_max, & !Maximum-overlap fraction spectral diffuse downward flux (W/m^2) + fddif_rndm, & !Random-overlap fraction spectral diffuse downward flux (W/m^2) + fudif_max, & !Maximum-overlap fraction spectral diffuse upward flux (W/m^2) + fudif_rndm !Random-overlap fraction spectral diffuse upward flux (W/m^2) + + + fddir_clr = 0. + fddir_all = 0. + fddif_clr = 0. + fddif_all = 0. + fudif_clr = 0. + fudif_all = 0. + + fddir_max = 0. + fddir_rndm = 0. + fddif_max = 0. + fddif_rndm = 0. + fudif_max = 0. + fudif_rndm = 0. + +! Begin loop over all columns + do i = 1, ncol + + !Clear layer properties + direct_s(1) = 1. + direct_us(1) = 1. + do l = 1, nlm + !Delta-M on + fact = asym_clr(i,l)*asym_clr(i,l) + asy = asym_clr(i,l)/(1. + asym_clr(i,l)) + !Delta-M off + !fact = 0. + !asy = asym_clr(i,l) + !End delta-M on/off + oms = ((1. - fact)*wc_clr(i,l))/(1. - fact*wc_clr(i,l)) + taus = (1. - fact*wc_clr(i,l))*tau_clr(i,l) + + + exptau_s_clr(l) = exp(-taus/amu0(i)) + direct_s(l+1) = exptau_s_clr(l)*direct_s(l) + exptau_us_clr(l) = exp(-tau_clr(i,l)) + direct_us(l+1) = exptau_us_clr(l)*direct_us(l) + ! Local Eddington coefficients + t = 0.25*(7. - oms*(4. + 3.*asy)) + r = -0.25*(1. - oms*(4. - 3.*asy)) + kappa = sqrt(t*t - r*r) + rinf = r/(kappa+t) + ggtau = kappa*taus + eggtau = exp(-ggtau) + denom = (1. - rinf*rinf*eggtau*eggtau) + tr_clr(l) = (1. - rinf*rinf)*eggtau/denom + rr_clr(l) = rinf*(1. - eggtau*eggtau)/denom + + fact = kappa*kappa - 1./(amu0(i)*amu0(i)) + if (abs(fact) .lt. eps) then + fact = 1./eps + else + fact = 1./fact + endif + + cc = oms*slr(i)*fact + g3 = 0.5 - 0.75*asy*amu0(i) + g4 = 1. - g3 + aa = g3*(t - 1./amu0(i)) + g4*r + bb = g4*(t + 1./amu0(i)) + g3*r + sigu_clr_fract(l) = cc*((aa - rr_clr(l)*bb) - aa*tr_clr(l)*exptau_s_clr(l)) + sigd_clr_fract(l) = cc*(-bb*tr_clr(l) + (bb-rr_clr(l)*aa)*exptau_s_clr(l)) + enddo + + !CLEAR-SKY adding + re(1) = 0. + vd(1) = 0. + do l = 1, nlm + prop = 1./(1. - re(l)*rr_clr(l)) + re(l+1) = rr_clr(l) + tr_clr(l)*tr_clr(l)*re(l)*prop + vd(l+1) = sigd_clr_fract(l)*direct_s(l) + (tr_clr(l)*vd(l) + tr_clr(l)*re(l)*sigu_clr_fract(l)*direct_s(l))*prop + vu(l) = (rr_clr(l)*vd(l) + sigu_clr_fract(l)*direct_s(l))*prop + td(l) = prop + enddo + + !CLEAR-SKY diffuse flux calculation + fddif_clr(i,1) = 0. + fudif_clr(i,nlm+1) = (asdif(i,ib)*vd(nlm+1) + & + asdir(i,ib)*slr(i)*amu0(i)*direct_s(nlm+1))/ & + (1. - asdif(i,ib)*re(nlm+1)) + do l = nlm+1, 2, -1 + fddif_clr(i,l) = re(l)*fudif_clr(i,l) + vd(l) + fudif_clr(i,l-1) = tr_clr(l-1)*fudif_clr(i,l)*td(l-1) + vu(l-1) + enddo + + !CLEAR-SKY direct flux calculation, with delta-M descaling + fddir_clr(i,1) = amu0(i)*slr(i) + do l = 1, nlm + fd_total = fddif_clr(i,1)+amu0(i)*slr(i)*direct_s(l+1) + fddir_clr(i,l+1) = amu0(i)*slr(i)*direct_us(l+1) + fddif_clr(i,l+1) = fd_total - fddir_clr(i,l+1) + enddo + !END CLEAR-SKY CALC + + !Cloudy layer properties + direct_s(1) = 1. + do l = 1, nlm + !Delta-M on + fact = asym_cld(i,l)*asym_cld(i,l) + asy = asym_cld(i,l)/(1. + asym_cld(i,l)) + !Delta-M off + !fact = 0. + !asy = asym_cld(i,l) + !End Delta-M on/off + oms = ((1. - fact)*wc_cld(i,l))/(1. - fact*wc_cld(i,l)) + taus = (1. - fact*wc_cld(i,l))*tau_cld(i,l) + + + + exptau_s_cld(l) = exp(-taus/amu0(i)) + direct_s(l+1) = exptau_s_cld(l)*direct_s(l) + exptau_us_cld(l) = exp(-tau_cld(i,l)/amu0(i)) + !direct_us_cld is not needed till later + ! Local eddington coefficients + t = 0.25*(7. - oms*(4. + 3.*asy)) + r = -0.25*(1. - oms*(4. - 3.*asy)) + kappa = sqrt(t*t - r*r) + rinf = r/(kappa+t) + ggtau = kappa*taus + eggtau = exp(-ggtau) + denom = (1. - rinf*rinf*eggtau*eggtau) + tr_cld(l) = (1. - rinf*rinf)*eggtau/denom + rr_cld(l) = rinf*(1. - eggtau*eggtau)/denom + + fact = kappa*kappa - 1./(amu0(i)*amu0(i)) + if (abs(fact) .lt. eps) then + fact = 1./eps + else + fact = 1./fact + endif + + cc = oms*slr(i)*fact + g3 = 0.5 - 0.75*asy*amu0(i) + g4 = 1. - g3 + aa = g3*(t - 1./amu0(i)) + g4*r + bb = g4*(t + 1./amu0(i)) + g3*r + sigu_cld_fract(l) = cc*((aa - rr_cld(l)*bb) - aa*tr_cld(l)*exptau_s_cld(l)) + sigu(l) = sigu_cld_fract(l)*direct_s(l) + sigd_cld_fract(l) = cc*(-bb*tr_cld(l) + (bb-rr_cld(l)*aa)*exptau_s_cld(l)) + sigd(l) = sigd_cld_fract(l)*direct_s(l) + enddo + + !BEGIN MAXIMALLY OVERLAPPED CALC + !For layers where 0. < cf_max < 1., treat as randomly combined + direct_s(1) = 1. + direct_us(1) = 1. + do l = 1,nlm + rr_tmp(l) = cf_max(i,l)*rr_cld(l) + (1. - cf_max(i,l))*rr_clr(l) + tr_tmp(l) = cf_max(i,l)*tr_cld(l) + (1. - cf_max(i,l))*tr_clr(l) + sigu_tmp_fract(l) = cf_max(i,l)*sigu_cld_fract(l) + (1. - cf_max(i,l))*sigu_clr_fract(l) + sigd_tmp_fract(l) = cf_max(i,l)*sigd_cld_fract(l) + (1. - cf_max(i,l))*sigd_clr_fract(l) + direct_s(l+1) = (cf_max(i,l)*exptau_s_cld(l) + (1. - cf_max(i,l))*exptau_s_clr(l))*direct_s(l) + direct_us(l+1) = (cf_max(i,l)*exptau_us_cld(l) + (1. - cf_max(i,l))*exptau_us_clr(l))*direct_us(l) + enddo + !MAXIMALLY OVERLAPPED adding + re(1) = 0. + vd(1) = 0. + do l = 1, nlm + prop = 1./(1. - re(l)*rr_tmp(l)) + re(l+1) = rr_tmp(l) + tr_tmp(l)*tr_tmp(l)*re(l)*prop + vd(l+1) = sigd_tmp_fract(l)*direct_s(l) + (tr_tmp(l)*vd(l) + tr_tmp(l)*re(l)*sigu_tmp_fract(l)*direct_s(l))*prop + vu(l) = (rr_tmp(l)*vd(l) + sigu_tmp_fract(l)*direct_s(l))*prop + td(l) = prop + enddo + + !MAXIMALLY OVERLAPPED diffuse flux calculation + fddif_max(1) = 0. + fudif_max(nlm+1) = (asdif(i,ib)*vd(nlm+1) + & + asdir(i,ib)*slr(i)*amu0(i)*direct_s(nlm+1))/ & + (1. - asdif(i,ib)*re(nlm+1)) + do l = nlm+1, 2, -1 + fddif_max(l) = re(l)*fudif_max(l) + vd(l) + fudif_max(l-1) = tr_tmp(l-1)*fudif_max(l)*td(l-1) + vu(l-1) + enddo + + !MAXIMALLY OVERLAPPED direct flux calculation + fddir_max(1) = amu0(i)*slr(i) + do l = 1, nlm + fd_total = amu0(i)*slr(i)*direct_s(l+1) + fddif_max(l+1) + fddir_max(l+1) = amu0(i)*slr(i)*direct_us(l+1) + fddif_max(l+1) = fd_total - fddir_max(l+1) + enddo + !END MAXIMALLY OVERLAPPED CALC + + !BEGIN RANDOMLY-OVERLAPPED CALC + direct_s(1) = 1. + direct_us(1) = 1. + do l = 1, nlm + rr_tmp(l) = cf_random(i,l)*rr_cld(l) + (1. - cf_random(i,l))*rr_clr(l) + tr_tmp(l) = cf_random(i,l)*tr_cld(l) + (1. - cf_random(i,l))*tr_clr(l) + sigu_tmp_fract(l) = cf_random(i,l)*sigu_cld_fract(l) + (1. - cf_random(i,l))*sigu_clr_fract(l) + sigd_tmp_fract(l) = cf_random(i,l)*sigd_cld_fract(l) + (1. - cf_random(i,l))*sigd_clr_fract(l) + direct_s(l+1) = (cf_random(i,l)*exptau_s_cld(l) + (1. - cf_random(i,l))*exptau_s_clr(l))*direct_s(l) + direct_us(l+1) = (cf_random(i,l)*exptau_us_cld(l) + (1. - cf_random(i,l))*exptau_us_clr(l))*direct_us(l) + enddo + !RANDOMLY-OVERLAPPED adding + re(1) = 0. + vd(1) = 0. + do l = 1, nlm + prop = 1./(1. - re(l)*rr_tmp(l)) + re(l+1) = rr_tmp(l) + tr_tmp(l)*tr_tmp(l)*re(l)*prop + vd(l+1) = sigd_tmp_fract(l)*direct_s(l) + (tr_tmp(l)*vd(l) + tr_tmp(l)*re(l)*sigu_tmp_fract(l)*direct_s(l))*prop + vu(l) = (rr_tmp(l)*vd(l) + sigu_tmp_fract(l)*direct_s(l))*prop + td(l) = prop + enddo + + !RANDOMLY-OVERLAPPED diffuse flux calculation + fddif_rndm(1) = 0. + fudif_rndm(nlm+1)= (asdif(i,ib)*vd(nlm+1) + & + asdir(i,ib)*slr(i)*amu0(i)*direct_s(nlm+1))/ & + (1. - asdif(i,ib)*re(nlm+1)) + do l = nlm+1, 2, -1 + fddif_rndm(l) = re(l)*fudif_rndm(l) + vd(l) + fudif_rndm(l-1) = tr_tmp(l-1)*fudif_rndm(l)*td(l-1) + vu(l-1) + enddo + + !RANDOMLY-OVERLAPPED direct flux calculation + fddir_rndm(1) = amu0(i)*slr(i) + do l = 1, nlm + fd_total = amu0(i)*slr(i)*direct_s(l+1) + fddif_rndm(l+1) + fddir_rndm(l+1) = amu0(i)*slr(i)*direct_us(l+1) + fddif_rndm(l+1) = fd_total - fddir_rndm(l+1) + enddo + !END RANDOMLY-OVERLAPPED CALC + !BEGIN ALL-SKY CALC + !This is the combined maximally- and randomly overlapped portions of the sky + fddif_all(i,1) = 0. + fddir_all(i,1) = amu0(i)*slr(i) + fudif_all(i,nlm+1) = (1. - c_maximal(i))*fudif_rndm(nlm+1) + c_maximal(i)*fudif_max(nlm+1) + do l = 1, nlm + fddif_all(i,l+1) = (1. - c_maximal(i))*fddif_rndm(l+1) + c_maximal(i)*fddif_max(l+1) + fddir_all(i,l+1) = (1. - c_maximal(i))*fddir_rndm(l+1) + c_maximal(i)*fddir_max(l+1) + fudif_all(i,l) = (1. - c_maximal(i))*fudif_rndm(l) + c_maximal(i)*fudif_max(l) + enddo + enddo ! Loop over columns + end subroutine diff --git a/src/6.3.02/radiate/rad_aero.f90 b/src/radiate/rad_aero.f90 similarity index 99% rename from src/6.3.02/radiate/rad_aero.f90 rename to src/radiate/rad_aero.f90 index e1cc26b..e72cc64 100644 --- a/src/6.3.02/radiate/rad_aero.f90 +++ b/src/radiate/rad_aero.f90 @@ -55,8 +55,8 @@ Subroutine aerorad (i,j,mb,nb,nrad,m1,dzl,relh,tp,omgp,gp,dn0,aodt) enddo if(iaerosol>0) then - aerotype(1) = 1 ! CCN - aerotype(2) = 1 ! GCCN + aerotype(1) = 1 ! CCN-mode-1 + aerotype(2) = 1 ! CCN-mode-2 endif if(idust>0) then aerotype(3) = 3 ! Small dust mode @@ -151,7 +151,7 @@ Subroutine aerorad (i,j,mb,nb,nrad,m1,dzl,relh,tp,omgp,gp,dn0,aodt) ! asymmetry parameter (gp) in a form to interact with cloud_opt. ! Some values of dzl may be <0; in this case set tp to 0. ! Factor in layer depth for optical depth extinction - aodt = aodt + ext + if(ib==3) aodt = aodt + ext tp(k,ib) = tp(k,ib) + ext omgp(k,ib) = omgp(k,ib) + om * ext gp(k,ib) = gp(k,ib) + gg * om * ext diff --git a/src/6.3.02/radiate/rad_ccmp.f90 b/src/radiate/rad_ccmp.f90 similarity index 100% rename from src/6.3.02/radiate/rad_ccmp.f90 rename to src/radiate/rad_ccmp.f90 diff --git a/src/6.3.02/radiate/rad_driv.f90 b/src/radiate/rad_driv.f90 similarity index 74% rename from src/6.3.02/radiate/rad_driv.f90 rename to src/radiate/rad_driv.f90 index c4b95d1..3111eb3 100644 --- a/src/6.3.02/radiate/rad_driv.f90 +++ b/src/radiate/rad_driv.f90 @@ -92,11 +92,9 @@ Subroutine radiate (mzp,mxp,myp,ia,iz,ja,jz) ,radiate_g(ngrid)%cosz (1,1) & ,radiate_g(ngrid)%rlongup (1,1)) - endif - - ! Using Harrington radiation + ! Using Harrington, BUGSRAD, or RTE+RRTMGP radiation - if (iswrtyp .eq. 3 .or. ilwrtyp .eq. 3) then + elseif (iswrtyp .ge. 3 .or. ilwrtyp .ge. 3) then ! If first call for this node, initialize several quantities & Mclatchy ! sounding data. @@ -107,20 +105,42 @@ Subroutine radiate (mzp,mxp,myp,ia,iz,ja,jz) ,exptabc,ulim,npartob,npartg,ncog,ncb & ,ocoef,bcoef,gcoef,gnu) - CALL mclatchy (1,mzp & - ,grid_g(ngrid)%glat (1,1) & - ,grid_g(ngrid)%rtgt (1,1) & - ,grid_g(ngrid)%topt (1,1) & - ,radiate_g(ngrid)%rlongup (1,1) & - ,zm,zt,vctr1,vctr2,vctr3,vctr4,vctr5,vctr6,vctr7 & - ,vctr8,vctr9,vctr10,vctr11,vctr12 & - ) - + !Adele - this call to mclatchy only requires the last two values of zt + !and the length of zt. The full profile of zt is unnecessary. As such, + !pass in the height array that defines the top of the known atmosphere. + !For most simulations, that will likely be zt, the prognostic height levels + !For horizontally homogeneous simulations, the input sounding may extend + !well beyond the model top. In this case, use the input sounding for + !radiation calculations. Even in this case, more radiation levels may be + !necessary. This call to mclatchy will determine how many additional levels + !are needed. + if ((initial == 1 .or. initorig == 1) .and. hs(nsndg)>zt(mzp)) then + CALL mclatchy (1,nsndg & + ,grid_g(ngrid)%glat (1,1) & + ,grid_g(ngrid)%rtgt (1,1) & + ,grid_g(ngrid)%topt (1,1) & + ,radiate_g(ngrid)%rlongup (1,1) & + ,hs,hs,vctr1,vctr2,vctr3,vctr4,vctr5,vctr6,vctr7 & + ,vctr8,vctr9,vctr10,vctr11,vctr12 & + ) + else + CALL mclatchy (1,mzp & + ,grid_g(ngrid)%glat (1,1) & + ,grid_g(ngrid)%rtgt (1,1) & + ,grid_g(ngrid)%topt (1,1) & + ,radiate_g(ngrid)%rlongup (1,1) & + ,zm,zt,vctr1,vctr2,vctr3,vctr4,vctr5,vctr6,vctr7 & + ,vctr8,vctr9,vctr10,vctr11,vctr12 & + ) + endif ncall = ncall + 1 endif ! For any call, interpolate the mclatchy sounding data by latitude and ! season. + ! Adele - note that this call to mclatchy does not require any variables + ! to be passed! No modifications then are necessary if we are using + ! the input sounding for radiation CALL mclatchy (2,mzp & ,grid_g(ngrid)%glat (1,1) & @@ -162,10 +182,10 @@ Subroutine radiate (mzp,mxp,myp,ia,iz,ja,jz) ,radiate_g(ngrid)%swdn (1,1,1) & ,radiate_g(ngrid)%lwup (1,1,1) & ,radiate_g(ngrid)%lwdn (1,1,1) & - ,micro_g(ngrid)%cccnp (1,1,1) & - ,micro_g(ngrid)%cccmp (1,1,1) & - ,micro_g(ngrid)%gccnp (1,1,1) & - ,micro_g(ngrid)%gccmp (1,1,1) & + ,micro_g(ngrid)%cn1np (1,1,1) & + ,micro_g(ngrid)%cn1mp (1,1,1) & + ,micro_g(ngrid)%cn2np (1,1,1) & + ,micro_g(ngrid)%cn2mp (1,1,1) & ,micro_g(ngrid)%md1np (1,1,1) & ,micro_g(ngrid)%md1mp (1,1,1) & ,micro_g(ngrid)%md2np (1,1,1) & @@ -181,7 +201,6 @@ Subroutine radiate (mzp,mxp,myp,ia,iz,ja,jz) ,micro_g(ngrid)%abc2np (1,1,1) & ,micro_g(ngrid)%abc2mp (1,1,1)) endif - endif endif @@ -463,7 +482,7 @@ Subroutine radcomp3 (m1,m2,m3,ia,iz,ja,jz & ,glat,rtgt,topt,albedt,cosz,rlongup,rshort,rlong,aodt & ,rv,dn0,fthrd,pi0,pp,theta,rcp & ,bext,swup,swdn,lwup,lwdn & - ,cccnp,cccmp,gccnp,gccmp,md1np,md1mp,md2np,md2mp & + ,cn1np,cn1mp,cn2np,cn2mp,md1np,md1mp,md2np,md2mp & ,salt_film_np,salt_film_mp,salt_jet_np,salt_jet_mp & ,salt_spum_np,salt_spum_mp,abc1np,abc1mp,abc2np,abc2mp) @@ -477,13 +496,13 @@ Subroutine radcomp3 (m1,m2,m3,ia,iz,ja,jz & implicit none -integer :: m1,m2,m3,ia,iz,ja,jz,mcat,i,j,k +integer :: m1,m2,m3,ia,iz,ja,jz,mcat,i,j,k,kk,k0 real :: cfmasi,cparmi,glg,glgm,picpi real, dimension(m2,m3) :: glat,rtgt,topt,cosz,albedt,rlongup,rshort,rlong,aodt real, dimension(m1,m2,m3) :: dn0,rv,fthrd,pi0,pp,theta,rcp real, dimension(m1,m2,m3) :: bext,swup,swdn,lwup,lwdn -real, dimension(m1,m2,m3) :: cccnp,cccmp,gccnp,gccmp,md1np,md1mp,md2np,md2mp & +real, dimension(m1,m2,m3) :: cn1np,cn1mp,cn2np,cn2mp,md1np,md1mp,md2np,md2mp & ,salt_film_np,salt_film_mp,salt_jet_np,salt_jet_mp,salt_spum_np,salt_spum_mp & ,abc1np,abc1mp,abc2np,abc2mp real, external :: gammln @@ -537,8 +556,8 @@ Subroutine radcomp3 (m1,m2,m3,ia,iz,ja,jz & ! Call the sub-driver if(iaerorad==1 .and. level .ne. 4)then CALL aero_copy (1,m1 & - ,cccnp(1,i,j),cccmp(1,i,j) & - ,gccnp(1,i,j),gccmp(1,i,j) & + ,cn1np(1,i,j),cn1mp(1,i,j) & + ,cn2np(1,i,j),cn2mp(1,i,j) & ,md1np(1,i,j),md1mp(1,i,j) & ,md2np(1,i,j),md2mp(1,i,j) & ,salt_film_np(1,i,j),salt_film_mp(1,i,j) & @@ -548,22 +567,29 @@ Subroutine radcomp3 (m1,m2,m3,ia,iz,ja,jz & ,abc2np(1,i,j),abc2mp(1,i,j)) endif - CALL radcalc3 (m1,i,j,ngrid,maxnzp,mcat,iswrtyp,ilwrtyp,zm,zt & - ,glat(i,j),rtgt(i,j),topt(i,j),rv(1,i,j) & - ,albedt(i,j) & - ,cosz(i,j) & - ,rlongup(i,j) & - ,rshort(i,j) & - ,rlong(i,j) & - ,aodt(i,j) & - ,fthrd(1,i,j) & - ,bext(1,i,j) & - ,swup(1,i,j) & - ,swdn(1,i,j) & - ,lwup(1,i,j) & - ,lwdn(1,i,j) & - ,dn0(1,i,j) & - ) + if (iswrtyp .eq. 3 .or. ilwrtyp .eq. 3) then + CALL radcalc3 (m1,i,j,ngrid,maxnzp,mcat,iswrtyp,ilwrtyp,zm,zt & + ,glat(i,j),rtgt(i,j),topt(i,j),rv(1,i,j) & + ,albedt(i,j) & + ,cosz(i,j) & + ,rlongup(i,j) & + ,rshort(i,j) & + ,rlong(i,j) & + ,aodt(i,j) & + ,fthrd(1,i,j) & + ,bext(1,i,j) & + ,swup(1,i,j) & + ,swdn(1,i,j) & + ,lwup(1,i,j) & + ,lwdn(1,i,j) & + ,dn0(1,i,j) & + ) + else + print*,'iswrtyp and/or ilwrtyp = 4 and level /=3' + print*,'this is not currently a compatible combination,' + print*,'but feel free to make the code change yourself.' + print*,'It shouldnt be too hard. See rad_driv line 569' + endif enddo enddo @@ -819,12 +845,14 @@ Subroutine radcalc3 (m1,i,j,ngrid,maxnzp,mcat,iswrtyp,ilwrtyp,zm,zt & use rrad3 use micphys use node_mod +use ref_sounding, only:nzref +use mem_grid, only:initial, initorig implicit none integer m1,maxnzp,mcat,ngrid integer :: iswrtyp,ilwrtyp -integer i,j,k +integer i,j,k,kk,k0,nzr integer, save :: ncall = 0,nradmax integer, save :: ngass(mg)=(/1, 1, 1/),ngast(mg)=(/1, 1, 1/) ! one can choose the gases of importance here, @@ -854,7 +882,12 @@ Subroutine radcalc3 (m1,i,j,ngrid,maxnzp,mcat,iswrtyp,ilwrtyp,zm,zt & if (ncall == 0) then ncall = 1 - nradmax = maxnzp + namax + if (initial == 1 .or. initorig == 1) then + nrad = nzref - 1 + narad + else + nrad = m1 - 1 + narad + endif + nradmax = nrad allocate(zml (nradmax) ,ztl (nradmax) ,dzl (nradmax) ,pl (nradmax) & ,tl (nradmax) ,dl (nradmax) ,rl (nradmax) ,o3l(nradmax) & ,vp (nradmax) ,flxus(nradmax) ,flxds(nradmax) ,tg (nradmax) & @@ -867,18 +900,9 @@ Subroutine radcalc3 (m1,i,j,ngrid,maxnzp,mcat,iswrtyp,ilwrtyp,zm,zt & tg=0. endif -nrad = m1 - 1 + narad - -! rlongup used to set tl(1): stephan*tl^4=rlongup - CALL mclatchy (3,m1 & - ,glat,rtgt,topt,rlongup & - ,zm,zt,press,tair,dn0,rv,zml,ztl,pl,tl,dl,rl,o3l,dzl & - ) - -! calculate non-dimensional pressure -do k=1,m1 - exner(k) = (press(k)*p00i)**rocp -enddo +CALL prep_atm_profiles(nrad,zml,ztl,pl,tl,dl,rl,o3l,dzl, & + m1,zm,zt,dn0,rv, & + glat,rtgt,topt,rlongup) ! zero out scratch arrays CALL azero (nrad*mg,u) @@ -913,21 +937,6 @@ Subroutine radcalc3 (m1,i,j,ngrid,maxnzp,mcat,iswrtyp,ilwrtyp,zm,zt & ! Get the path lengths for the various gases... CALL path_lengths (nrad,u,rl,dzl,dl,o3l,vp,pl,eps) -do k = 1,nrad - if (rl(k) < 0. .or. & - dl(k) < 0. .or. & - pl(k) < 0. .or. & - o3l(k) < 0.) then - print*, 'Negative value of density, vapor, pressure, or ozone' - print*, 'when calling Harrington radiation' - print*, 'at k,i,j = ',k,i+mi0(ngrid),j+mj0(ngrid) - print*, 'ngrid=',ngrid - print*, 'stopping model' - print*, 'rad: rl(k), dl(k), pl(k), o3l(k)' - print*, rv(k), dl(k), pl(k), o3l(k) - stop - endif -enddo do k = 1,nrad if (tl(k) < 160.) then print*, 'Temperature too low when calling Harrington radiation' @@ -953,6 +962,7 @@ Subroutine radcalc3 (m1,i,j,ngrid,maxnzp,mcat,iswrtyp,ilwrtyp,zm,zt & rshort = flxds(1) do k = 2,m1-1 + exner(k) = (press(k)*p00i)**rocp !divide by exner to get potential temp heating rate fthrd(k) = fthrd(k) & + (flxds(k) - flxds(k-1) + flxus(k-1) - flxus(k)) & @@ -960,6 +970,7 @@ Subroutine radcalc3 (m1,i,j,ngrid,maxnzp,mcat,iswrtyp,ilwrtyp,zm,zt & swup(k) = flxus(k) swdn(k) = flxds(k) enddo + !lower and upper boundary conditions on swup and swdn swup(1) = flxus(1) swup(m1) = flxus(nrad) ! use the top radiation value rather than m1 value @@ -1395,3 +1406,425 @@ Subroutine cloud_prep_lev4 (m1,i,j,ng) return END SUBROUTINE cloud_prep_lev4 +!############################################################################## +Subroutine radcalc4 (m1,maxnzp,mcat,iswrtyp,ilwrtyp & + ,glat,rtgt,topt,albedt,cosz,rlongup,rshort,rlong & + ,zm,zt,rv,dn0,pi0,pp,fthrd,i,j,ngrid & + ,bext,swup,swdn,lwup,lwdn) + +! BUGSRAD radiation + +use rconstants +use rrad3 +use micphys +use mem_grid, only: time +use ref_sounding, only:nzref +use mem_grid, only:initial, initorig + +implicit none + +integer m1,maxnzp,mcat,ngrid +integer :: iswrtyp,ilwrtyp +integer i,j,k,ii,printsound +integer, save :: ncall = 0,nradmax +integer, save :: ngass(mg)=(/1, 1, 1/),ngast(mg)=(/1, 1, 1/) +! one can choose the gases of importance here, +! ngas = 1 gas active +! = 0 gas not active +! +! ngas(1) = H2O +! ngas(2) = CO2 +! ngas(3) = O3 + +real, save :: eps=1.e-15 +real :: prsnz,prsnzp +real :: glat,rtgt,topt,cosz,albedt,rlongup,rshort,rlong +real :: zm(m1),zt(m1),dn0(m1),rv(m1),pi0(m1),pp(m1),fthrd(m1) +real :: bext(m1),swup(m1),swdn(m1),lwup(m1),lwdn(m1) + +real, allocatable, save, dimension(:) :: zml,ztl,dzl,pl,tl,dl,rl,o3l & + ,flxus,flxds & + ,flxul,flxdl & + ,rcl,ncl,rrl,ril,rsl & + ,fthsw,fthlw + +real :: exner(m1) ! non-dimensional pressure + +!Saleeby(2011):Variables for radiatively active aerosols +real :: relh(m1) +real, external :: rslf + +if (ncall == 0) then + ncall = 1 + if (initial == 1 .or. initorig == 1) then + nrad = nzref - 1 + narad + else + nrad = m1 - 1 + narad + endif + nradmax = nrad + + allocate(zml (nradmax) ,ztl (nradmax) ,dzl (nradmax) ,pl (nradmax) & + ,tl (nradmax) ,dl (nradmax) ,rl (nradmax) ,o3l(nradmax) & + ,fthsw (nradmax),fthlw(nradmax) & + ,flxul(nradmax),flxdl(nradmax),flxds(nradmax),flxus(nradmax) & + ,rcl(nradmax),ncl(nradmax),rrl(nradmax),ril(nradmax),rsl(nradmax)) +endif + +CALL prep_atm_profiles(nrad,zml,ztl,pl,tl,dl,rl,o3l,dzl, & + m1,zm,zt,dn0,rv, & + glat,rtgt,topt,rlongup) + +if (level.eq.4) then + CALL cloud_prep_lev4 (m1,i,j,ngrid) +endif + +rcl(1:m1)=rx(1:m1,1) +ncl(1:m1)=cx(1:m1,1) +rrl(1:m1)=rx(1:m1,2) +ril(1:m1)=rx(1:m1,3)+rx(1:m1,4) +rsl(1:m1)=rx(1:m1,5) +rcl(m1:nrad)=0. +ncl(m1:nrad)=0. +rrl(m1:nrad)=0. +ril(m1:nrad)=0. +rsl(m1:nrad)=0. + +! call shortwave and longwave schemes... + +CALL azero2 (nrad,fthsw,fthlw) +CALL azero2 (nrad,flxus,flxds) +CALL azero2 (nrad,flxul,flxdl) + +CALL bugs_driver(nrad,cosz,albedt,pl(1:nrad),tl(1:nrad),rl(1:nrad),rcl(1:nrad) & + ,ncl(1:nrad),ril(1:nrad),rrl(1:nrad),rsl(1:nrad),o3l(1:nrad) & + ,fthsw(1:nrad),fthlw(1:nrad),flxus(1:nrad),flxds(1:nrad) & + ,flxul(1:nrad),flxdl(1:nrad)) + +do k = 1,m1!2,m1-1 + exner(k) = (pi0(k)+pp(k))/cp + !divide by exner to get potential temp heating rate + fthrd(k) = fthrd(k) + (fthsw(k)+fthlw(k))/exner(k) + swup(k) = flxus(k) + swdn(k) = flxds(k) + + lwup(k) = flxul(k) + lwdn(k) = flxdl(k) +enddo + +rshort = flxds(1) + +rlong = flxdl(1) + +!not integrated with BUGSrad yet. just diagnostic anyway +bext(:)=0. + +return +END SUBROUTINE radcalc4 +!############################################################################## +Subroutine radcalc5 (m1,maxnzp,iswrtyp,ilwrtyp & + ,glat,rtgt,topt,albedt,cosz,rlongup,rshort,rlong,aodt & + ,zm,zt,rv,dn0,pi0,pp,fthrd,i,j,ngrid & + ,bext,swup,swdn,lwup,lwdn) + +! RTE+RRTMGP radiation + +use rconstants +use rrad3 +use micphys +use mem_grid, only: time +use ref_sounding, only:nzref +use mem_grid, only:initial, initorig + +implicit none + +integer m1,maxnzp,icat,ihcat,ngrid +integer :: iswrtyp,ilwrtyp +integer i,j,k,ii,printsound +integer, save :: ncall = 0,nradmax + +real :: glat,rtgt,topt,cosz,albedt,rlongup,rshort,rlong,aodt +real :: zm(m1),zt(m1),dn0(m1),rv(m1),pi0(m1),pp(m1),fthrd(m1) +real :: bext(m1),swup(m1),swdn(m1),lwup(m1),lwdn(m1) + +real, allocatable, save, dimension(:) :: zml,ztl,dzl,pl,tl,dl,rl,o3l & + ,flxus,flxds & + ,flxul,flxdl & + ,fthsw,fthlw + +real, allocatable, save, dimension(:,:) :: rrl,reff,amass,acon,arad +integer, save :: atype(aerocat) +integer, allocatable, save, dimension(:,:) :: rcat +real :: exner(m1) ! non-dimensional pressure + +!Variables for radiatively active aerosols +real, allocatable, save, dimension(:) :: relh +real, external :: rslf + +! From OLAM: +! Lookup table category RAMS/OLAM Microphysics +! ---------------------------------------------------------------- +! 1: cloud drops 1. cloud drops +! 2: drizzle 2. rain +! 3: rain 3. pristine ice columns +! 4: hail 4. snow columns +! 5: aggregates 5. aggregates +! 6: hollow columns 6. graupel +! 7: solid columns 7. hail +! 8: hexagonal plates 8. drizzle +! 9: rosettes 9. pristine ice hexagonal plates +! 10. pristine ice dendrites +! 11. pristine ice needles +! 12. pristine ice rosettes +! 13. snow hexagonal plates +! 14. snow dendrites +! 15. snow needles +! 16. snow rosettes + + ! 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 +integer, parameter :: kradcat(16) = (/1,3,6,6,5,4,4,2,8, 8, 7, 9, 8, 8, 7, 9/) + +! FIRST CALL INITIALIZATIONS + if (ncall == 0) then + ncall = 1 + if (initial == 1 .or. initorig == 1) then + nrad = nzref - 1 + narad + else + nrad = m1 - 1 + narad + endif + nradmax = nrad + allocate(zml (nradmax) ,ztl (nradmax) ,dzl (nradmax) ,pl (nradmax) & + ,tl (nradmax) ,dl (nradmax) ,rl (nradmax) ,o3l(nradmax) & + , fthsw (nradmax),fthlw(nradmax) & + ,flxul(nradmax),flxdl(nradmax),flxds(nradmax),flxus(nradmax)) + allocate(rrl(nradmax,ncat),reff(nradmax,ncat),rcat(nradmax,ncat)) + allocate(amass(nradmax,aerocat),acon(nradmax,aerocat), & + arad(nradmax,aerocat),relh(nradmax)) + + atype(:) = 0 + if(iaerosol>0) then + atype(1)=1 + atype(2)=1 + endif + if(idust>0) then + !Adele - using aerosol type to additionally include the + !R(Im) index + atype(3)=30+dust_ref_im + atype(4)=30+dust_ref_im + endif + if(isalt>0) then + atype(5)=2 + atype(6)=2 + atype(7)=2 + endif + if(iabcarb>0) then + atype(8)=4 + atype(9)=5 + endif + if(iccnlev>=2) then + atype(aerocat-1) = 1 + atype(aerocat) = 1 + endif + + call rte_rrtmgp_init() + endif +!END FIRST CALL CODE ------------------------------------------ + + +!GET ATMOSPHERE ABOVE MODEL TOP------------------------------- +CALL prep_atm_profiles(nrad,zml,ztl,pl,tl,dl,rl,o3l,dzl, & + m1,zm,zt,dn0,rv, & + glat,rtgt,topt,rlongup) + + +! PREP AEROSOLS FOR RADIATION ---------------------------------- +amass = 0. +acon = 0. +arad = 0. +relh = 0. +if(iaerorad==1 .and. level .ne. 4) then + do k=1,m1 + amass(k,:) = aeromas(k,:) + acon(k,:) = aerocon(k,:) + enddo + !Could choose to insert a static aerosol layer above the domain top + + do acat=1,aerocat + do k = 1,nrad + if(acon(k,acat)>mincon .and. amass(k,acat)>=minmas) then + arad(k,acat)=((0.23873/aero_rhosol(acat) & + *amass(k,acat)/acon(k,acat))**(1./3.))/aero_rg2rm(acat) + else + arad(k,acat)=0.005e-6 + endif + !convert acon from #/kg to #/m2 + acon(k,acat) = acon(k,acat)*dl(k)*dzl(k) + enddo + enddo + + do k=1,nrad + relh(k) = rl(k)/rslf(pl(k),tl(k)) + enddo +endif + +! PREP CLOUDS FOR RADIATION -------------------------------------- +! rl is a volume mixing ratio, not a mass mixing ratio +rrl = 0. +reff = 0. + +if (level.eq.4) then + print*,'bin microphysics not coupled to RTE-RRTMGP yet' + stop + CALL cloud_prep_lev4 (m1,i,j,ngrid) +endif + +do icat = 1,ncat + if (jnmb(icat) == 0) then + rcat(:,icat) = 0. + rrl(:,icat) = 0. + reff(:,icat) = 0. + else + do k = 2,m1-1 + ihcat = jhcat(k,icat) + rcat(k,icat) = kradcat(ihcat) + rrl(k,icat) = rx(k,icat) * dl(k) * dzl(k) * 1000. !layer water path in g/m^2 + !reff = (nu + 2) * Dn/2 + reff(k,icat) = (gnu(icat) + 2.) * 0.5 * dnfac(ihcat) * emb(k,icat) ** pwmasi(ihcat) * 1.e6 + !effective radius in microns + enddo + !reff, rrl, and rcat have nrad levels. Could insert a static cloud above the model top + endif +enddo + + +! Call RTE-RRTMGP ----------------------------------------- + +CALL azero2 (nrad,fthsw,fthlw) +CALL azero2 (nrad,flxus,flxds) +CALL azero2 (nrad,flxul,flxdl) + +CALL rte_rrtmgp_driver(nrad,ncat,aerocat,cosz,albedt,pl(2:nrad),tl(2:nrad),relh(2:nrad) & + ,ztl(2:nrad),zml(1:nrad) & + ,rl(2:nrad),tl(1), rrl(2:nrad,:),reff(2:nrad,:),rcat(2:nrad,:) & + ,acon(2:nrad,:),arad(2:nrad,:),atype,aodt & + ,o3l(2:nrad),flxus(1:nrad),flxds(1:nrad) & + ,flxul(1:nrad),flxdl(1:nrad),fthsw(2:nrad),fthlw(2:nrad)) + +! GET FLUXES and HEATING RATES ----------------------------- +! fluxes are defined on zm levels +do k = 1,m1-1 + swup(k) = flxus(k) + swdn(k) = flxds(k) + + lwup(k) = flxul(k) + lwdn(k) = flxdl(k) +enddo +!Use top of radiative atmosphere rather than top of model +swup(m1)=flxus(nrad) +swdn(m1)=flxds(nrad) +lwup(m1)=flxul(nrad) +lwdn(m1)=flxdl(nrad) + +!heating rates are defined on zt levels +do k = 2,m1 + exner(k) = (pi0(k)+pp(k))/cp + !divide by exner to get potential temp heating rate + fthrd(k) = (fthsw(k)+fthlw(k))/exner(k) +enddo + +rshort = flxds(1) + +rlong = flxdl(1) + +!not integrated with RTE+RRTMGP yet. just diagnostic anyway +bext(:)=0. + +return +END SUBROUTINE radcalc5 +! -------------------------------------------------------------------- +Subroutine prep_atm_profiles(nrad,zml,ztl,pl,tl,dl,rl,o3l,dzl, & + m1,zm,zt,dn0,rv, & + glat,rtgt,topt,rlongup) + +use ref_sounding +use micphys, only: press, tair +use mem_grid, only:zmn, ztn, ngrid, initial, initorig +use rconstants, only:rgas + +integer :: k,kk,k0,nzr,nrad,m1 +real :: dzr +real, dimension(m1) :: zm,zt,dn0,rv +real, dimension(nrad) :: zml,ztl,pl,tl,dl,rl,o3l,dzl +real,allocatable, dimension(:) :: zmt, ztt, dn0t, rvt + +!Adele - if we initialized horizontally homogeneously, then use the +!input sounding to define the atm. properties above model top +!before the call to mclatchy + +nzr = m1 +if ((initial == 1 .or. initorig == 1).and.hs(nsndg)>zm(m1)) then + k0 = 0 + do k = 1, nsndg + !If we are above the prognostic model top + if (hs(k)>zm(m1)) then + if (k0==0) then + k0=k + nzr = m1 + nsndg - k0 + 1 + allocate(ztt(nzr), zmt(nzr), rvt(nzr), dn0t(nzr)) + ztt(1:m1) = zt + zmt(1:m1) = zm + rvt(1:m1) = rv + dn0t(1:m1) = dn0 + endif + kk = m1+k-k0+1 + press(kk) = ps(k) + tair(kk) = ts(k) + rvt(kk) = rts(k) + dn0t(kk) = press(kk)/rgas/(tair(kk)*(1+0.61*rvt(kk))) + ztt(kk) = hs(k) + endif + enddo + do k = m1+1, nzr-2 + dzr = ((ztt(k+2)-ztt(k+1))/(ztt(k)-ztt(k-1)))**(0.25) + zmt(k) = ztt(k) + (ztt(k+1)-ztt(k))/(1.+dzr) + enddo + if(nzr-m1>1) zmt(nzr-1) = (ztt(nzr)+ztt(nzr-1))/2. + zmt(nzr) = zmt(nzr-1) + (ztt(nzr)-ztt(nzr-1)) +else + allocate(ztt(m1),zmt(m1),rvt(m1),dn0t(m1)) + ztt = zt + zmt = zm + rvt = rv + dn0t = dn0 +endif + +! rlongup used to set tl(1): stephan*tl^4=rlongup +CALL mclatchy (3,nzr & + ,glat,rtgt,topt,rlongup & + ,zmt,ztt,press,tair,dn0t,rvt,zml,ztl,pl,tl,dl,rl,o3l,dzl & + ) + +! Overwrite ozone profile if it is available +if ((initial == 1 .or. initorig == 1) .and. io3flg == 1) then + o3l(1:nzr) = o3ref(1:nzr,ngrid) +endif + +do k = 1,nrad + if (rl(k) < 0. .or. & + dl(k) < 0. .or. & + pl(k) < 0. .or. & + o3l(k) < 0. .or. & + tl(k) < 160.) then + + print*, 'Temperature too low or negative value of' + print*, 'density, vapor, pressure, or ozone' + print*, 'when calling Harrington radiation' + print*, 'at k,i,j = ',k,i,j,' ngrid=',ngrid + print*, 'stopping model' + print*, 'rad: k, rl(k), dl(k), pl(k), o3l(k), tl(k)' + print'(i4,5g15.6)', k, rl(k), dl(k), pl(k), o3l(k), tl(k) + stop 'stop: radiation call' + endif +enddo + +return +END SUBROUTINE diff --git a/src/6.3.02/radiate/rad_mclat.f90 b/src/radiate/rad_mclat.f90 similarity index 99% rename from src/6.3.02/radiate/rad_mclat.f90 rename to src/radiate/rad_mclat.f90 index 8de9dd1..f1accb8 100644 --- a/src/6.3.02/radiate/rad_mclat.f90 +++ b/src/radiate/rad_mclat.f90 @@ -30,6 +30,7 @@ Subroutine mclatchy (iaction,m1 & data latind/1,1,2,3,4,5,5,6,7,8,9/ data slat/-90.,-70.,-60.,-45.,-25.,-15.,15.,25.,45.,60.,70.,90./ +! hgt, press, T(K), water vap, ozone, density ! arctic winter data ((mcdat(ilev,1,ifld),ifld=1,6),ilev=1,11)/ & 0., 101350.0, 249.1, .1201E-02, .4105E-07, .1417E+01, & diff --git a/src/6.3.02/radiate/rad_stable.f90 b/src/radiate/rad_stable.f90 similarity index 100% rename from src/6.3.02/radiate/rad_stable.f90 rename to src/radiate/rad_stable.f90 diff --git a/src/6.3.02/radiate/rrad2.f90 b/src/radiate/rrad2.f90 similarity index 100% rename from src/6.3.02/radiate/rrad2.f90 rename to src/radiate/rrad2.f90 diff --git a/src/6.3.02/radiate/rrad3.f90 b/src/radiate/rrad3.f90 similarity index 100% rename from src/6.3.02/radiate/rrad3.f90 rename to src/radiate/rrad3.f90 diff --git a/src/radiate/rte-rrtmgp/.github/dependabot.yml b/src/radiate/rte-rrtmgp/.github/dependabot.yml new file mode 100644 index 0000000..f372768 --- /dev/null +++ b/src/radiate/rte-rrtmgp/.github/dependabot.yml @@ -0,0 +1,8 @@ +version: 2 +updates: + # Maintain dependencies for GitHub Actions + - package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: "daily" + target-branch: "develop" diff --git a/src/radiate/rte-rrtmgp/.github/workflows/containerized-ci.yml b/src/radiate/rte-rrtmgp/.github/workflows/containerized-ci.yml new file mode 100644 index 0000000..629b1ee --- /dev/null +++ b/src/radiate/rte-rrtmgp/.github/workflows/containerized-ci.yml @@ -0,0 +1,103 @@ +name: Continuous integration in a box +on: + push: + branches-ignore: + - documentation + pull_request: + branches-ignore: + - documentation + +jobs: + Containerized-CI: + runs-on: ubuntu-22.04 + strategy: + fail-fast: false + matrix: + fortran-compiler: [ifort, ifx, nvfortran] + rte-kernels: [default, openacc] + include: + - fortran-compiler: ifort + fcflags: "-m64 -g -traceback -heap-arrays -assume realloc_lhs -extend-source 132 -check bounds,uninit,pointers,stack -stand f08" + image: "earthsystemradiation/rte-rrtmgp-ci:ifort" + - fortran-compiler: ifx + fcflags: "-m64 -g -traceback -heap-arrays -assume realloc_lhs -extend-source 132 -check bounds,uninit,pointers,stack -stand f08" + image: "earthsystemradiation/rte-rrtmgp-ci:ifort" + - fortran-compiler: nvfortran + fcflags: "-Mallocatable=03 -Mstandard -Mbounds -Mchkptr -Kieee -Mchkstk" + image: "earthsystemradiation/rte-rrtmgp-ci:nvfortran" + container: + image: ${{ matrix.image }} + env: + # Core variables: + FC: ${{ matrix.fortran-compiler }} + FCFLAGS: ${{ matrix.fcflags }} + # Make variables: + NCHOME: /dummy + NFHOME: /opt/netcdf-fortran + RRTMGP_ROOT: ${{ github.workspace }} + RTE_KERNELS: ${{ matrix.rte-kernels }} + RUN_CMD: + # Auxiliary variables: + RFMIP_CACHEDIR: /home/runner/rfmip-files + steps: + # + # Checks-out repository under $GITHUB_WORKSPACE + # + - uses: actions/checkout@v3 + # + # Cache RFMIP files + # + - name: Cache RFMIP files + uses: actions/cache@v3 + with: + path: ${{ env.RFMIP_CACHEDIR }} + key: rfmip-files + # + # Stage RFMIP files + # + - name: Stage RFMIP files + run: | + if test ! -d "${RFMIP_CACHEDIR}"; then + mkdir -p "${RFMIP_CACHEDIR}" && cd "${RFMIP_CACHEDIR}" + python "${GITHUB_WORKSPACE}/examples/rfmip-clear-sky/stage_files.py" + fi + for file in "${RFMIP_CACHEDIR}"/*; do + if test ! -d "${file}"; then + echo "copying '${file}'..." + cp "${file}" "${GITHUB_WORKSPACE}/examples/rfmip-clear-sky/" + fi + done + # + # Build libraries, examples and tests + # + - name: Build libraries, examples and tests + run: | + $FC --version + make libs + make -C build separate-libs + # + # Run examples and tests + # + - name: Run examples and tests + run: make tests + # + # Compare the results + # + - name: Compare the results + run: make check + # + # Generate validation plots + # + - name: Generate validation plots + if: matrix.fortran-compiler == 'ifort' && matrix.rte-kernels == 'default' + working-directory: tests + run: python validation-plots.py + # + # Upload validation plots + # + - name: Upload validation plots + if: matrix.fortran-compiler == 'ifort' && matrix.rte-kernels == 'default' + uses: actions/upload-artifact@v3 + with: + name: valdiation-plot + path: tests/validation-figures.pdf diff --git a/src/radiate/rte-rrtmgp/.github/workflows/continuous-integration.yml b/src/radiate/rte-rrtmgp/.github/workflows/continuous-integration.yml new file mode 100644 index 0000000..50ab6ac --- /dev/null +++ b/src/radiate/rte-rrtmgp/.github/workflows/continuous-integration.yml @@ -0,0 +1,111 @@ +name: Continuous Integration +on: + push: + branches-ignore: + - documentation + pull_request: + branches-ignore: + - documentation + +defaults: + run: + # Enable Conda environment by using the login shell: + shell: bash -leo pipefail {0} + +jobs: + CI: + runs-on: ubuntu-22.04 + strategy: + fail-fast: false + matrix: + fortran-compiler: [gfortran-10, gfortran-11, gfortran-12] + rte-kernels: [default, openacc] + env: + # Core variables: + FC: ${{ matrix.fortran-compiler }} + FCFLAGS: "-ffree-line-length-none -m64 -std=f2008 -march=native -fbounds-check -finit-real=nan -g -DRTE_USE_CBOOL" + # Make variables: + NCHOME: /dummy + NFHOME: /usr + RRTMGP_ROOT: ${{ github.workspace }} + RTE_KERNELS: ${{ matrix.rte-kernels }} + RUN_CMD: + # Auxiliary variables: + RFMIP_CACHEDIR: /home/runner/rfmip-files + steps: + # + # Checks-out repository under $GITHUB_WORKSPACE + # + - uses: actions/checkout@v3 + # + # Synchronize the package index + # + - name: Synchronize the package index + run: sudo apt-get update + # + # Install NetCDF-Fortran (compatible with all compilers) + # + - name: Install NetCDF-Fortran + run: sudo apt-get install libnetcdff-dev + # + # Cache Conda packages + # + - name: Cache Conda packages + uses: actions/cache@v3 + with: + path: ~/conda_pkgs_dir + key: conda-pkgs + # + # Set up Conda + # + - name: Set up Conda + uses: conda-incubator/setup-miniconda@v2 + with: + miniforge-version: latest + activate-environment: rte_rrtmgp_test + environment-file: environment-noplots.yml + python-version: 3.9 + auto-activate-base: false + # Use the cache properly: + use-only-tar-bz2: true + # + # Cache RFMIP files + # + - name: Cache RFMIP files + uses: actions/cache@v3 + with: + path: ${{ env.RFMIP_CACHEDIR }} + key: rfmip-files + # + # Stage RFMIP files + # + - name: Stage RFMIP files + run: | + if test ! -d "${RFMIP_CACHEDIR}"; then + mkdir -p "${RFMIP_CACHEDIR}" && cd "${RFMIP_CACHEDIR}" + python "${GITHUB_WORKSPACE}/examples/rfmip-clear-sky/stage_files.py" + fi + for file in "${RFMIP_CACHEDIR}"/*; do + if test ! -d "${file}"; then + echo "copying '${file}'..." + cp "${file}" "${GITHUB_WORKSPACE}/examples/rfmip-clear-sky/" + fi + done + # + # Build libraries, examples and tests + # + - name: Build libraries, examples and tests + run: | + $FC --version + make libs + make -C build separate-libs + # + # Run examples and tests + # + - name: Run examples and tests + run: make tests + # + # Compare the results + # + - name: Compare the results + run: make check diff --git a/src/radiate/rte-rrtmgp/.github/workflows/doc-deployment.yml b/src/radiate/rte-rrtmgp/.github/workflows/doc-deployment.yml new file mode 100644 index 0000000..b61edd5 --- /dev/null +++ b/src/radiate/rte-rrtmgp/.github/workflows/doc-deployment.yml @@ -0,0 +1,77 @@ +name: Build and Deploy Documentation and Website +on: + push: + branches: + - main + - documentation + +jobs: + Build: + runs-on: ubuntu-22.04 + steps: + # + # Checks-out repository under $GITHUB_WORKSPACE + # + - uses: actions/checkout@v3 + # + # Synchronize the package index + # + - name: Synchronize the package index + run: sudo apt-get update + # + # Install dependencies + # + - name: Install dependencies + run: | + sudo apt-get install graphviz + sudo pip install 'markdown<3.4' ford + # + # Install Ruby + # + - name: Install Ruby + uses: ruby/setup-ruby@v1 + with: + ruby-version: 3.1 + # + # Install Jekyll + # + - name: Install Jekyll + run: | + cd doc/jekyll_site + sudo gem install bundler jekyll + bundle update + # + # Build documentation + # + - name: Build Documentation + run: | + cd doc + ./build_documentation.sh -ci + # + # Upload documentation + # + - name: Upload Documentation + uses: actions/upload-artifact@v3 + with: + name: documentation + path: public/ + if-no-files-found: error + # + # Check broken links + # + - name: Broken Link Check + if: ${{ github.ref == 'refs/heads/main'}} + uses: technote-space/broken-link-checker-action@v2 + with: + TARGET: file://${{ github.workspace }}/doc/ford_site/pages/index.html + RECURSIVE: true + ASSIGNEES: ${{ github.actor }} + # + # Deploy documentation + # + - name: Deploy API Documentation + uses: JamesIves/github-pages-deploy-action@v4.4.1 + if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/main' }} + with: + branch: gh-pages + folder: public/ diff --git a/src/radiate/rte-rrtmgp/.github/workflows/module_switcher b/src/radiate/rte-rrtmgp/.github/workflows/module_switcher new file mode 100644 index 0000000..3037308 --- /dev/null +++ b/src/radiate/rte-rrtmgp/.github/workflows/module_switcher @@ -0,0 +1,146 @@ +# +# Accepts a list of environment modules and makes sure that they are +# loaded/unloaded. The function makes it easier to manipulate modules in +# non-interactive shell mode while transparently accounting for several common +# defects in the configuration of the environment module system: +# +# 1) if a module's name is prepended with the exclamation mark ('!') on the +# argument list, the module is unloaded using the 'make unload' command +# (helps in preparing the environment using a single command); +# +# 2) if a module is already loaded, it does not get reloaded (some +# environments, e.g. Cray, are sensitive to the undocumented order of the +# loaded modules and keeping an already loaded module instead of reloading +# it is often safer); +# +# 3) if a module conflicts exactly one already loaded module, it gets loaded +# using the 'module switch' command (this is often the only tested and +# functional way to load a required module in some environments, e.g +# PrgEnv-* modules on Cray); +# +# 4) if a module is in conflict with several already loaded modules, all +# conflicting modules get unloaded first using the 'module unload' command +# and then the required module is loaded using the 'module load' command; +# +# 5) if a module's name starts with 'PrgEnv-', it is considered to be in +# conflict with any other module that has that prefix (on a Cray system, it +# is important that only one PrgEnv module is loaded at a time, which is +# normally covered with the mutual conflict statements in the respective +# module files, however, that is not always the case). +# +switch_for_module () +{ + for sfm_module in "$@"; do + case $sfm_module in + !*) + sfm_module=`echo $sfm_module | cut -c2-` + sfm_cmd="module unload $sfm_module" + echo "$sfm_cmd" + eval "$sfm_cmd" + continue ;; + esac + + sfm_module_full= + sfm_module_short= + case $sfm_module in + */*) + # The module is provided with the version part: + sfm_module_full=$sfm_module + sfm_module_short=`echo $sfm_module | sed 's%/[^/]*$%%'` ;; + *) + # Only the name of the module is provided, get the default version: + sfm_module_full=`module show $sfm_module 2>&1 | sed -n "s%^[^ \t]*/\\($sfm_module.*\\):%\\1%p"` + sfm_module_short=$sfm_module ;; + esac + + # A space-separated list of modules that are already loaded: + sfm_loaded_full=`module -t list 2>&1 | tr '\n' ' ' | sed 's/^.*Modulefiles://' | sed 's/(default)//g'` + + # Check whether the requested module if already loaded: + if test -n "$sfm_module_full"; then + case " $sfm_loaded_full " in + *" $sfm_module_full "*) + echo "module $sfm_module is already loaded" + continue ;; + esac + fi + + # A list of modules in conflict: + sfm_conflicts=`module show $sfm_module 2>&1 | sed -n 's/^conflict\(.*\)/\1/p' | tr '\n\t' ' '` + + # A list of loaded modules without version parts: + sfm_loaded_short=`echo "$sfm_loaded_full" | sed 's%\([^ ][^ ]*\)/[^ ]*%\1%g'` + + # Add the short name of the module to the list of conflicts: + sfm_conflicts="$sfm_conflicts $sfm_module_short" + + # On a Cray system, it is important that only one PrgEnv module is loaded at + # a time. This is normally covered with the mutual conflict statements in + # the respective module files. However, that is not always the case, + # therefore we introduce an additional protection against two or more PrgEnv + # modules being loaded simultaneously: if the module we are asked to switch + # for starts with PrgEnv-, each of the loaded modules that starts with + # PrgEnv- too is added to the list of conflicts: + case $sfm_module_short in + PrgEnv-*) + for sfm_loaded in $sfm_loaded_short; do + case $sfm_loaded in + PrgEnv-*) + sfm_conflicts="$sfm_conflicts $sfm_loaded" ;; + *) ;; + esac + done + ;; + *) ;; + esac + + # A list of loaded modules that are in conflict with the requested module: + sfm_loaded_conflicts= + for sfm_conflict in $sfm_conflicts""; do + sfm_loaded_list= + case $sfm_conflict in + */*) + # The conflict is specified with the version part: + sfm_loaded_list=$sfm_loaded_full ;; + *) + # The conflict is specified without the version part: + sfm_loaded_list=$sfm_loaded_short ;; + esac + + # Check that the conflicted module is loaded: + case " $sfm_loaded_list " in + *" $sfm_conflict "*) + # The conflict is loaded, check whether it is already added to the + # list: + case " $sfm_loaded_conflicts " in + *" $sfm_conflict "*) ;; + *) + # The conflict is not in the list, append: + sfm_loaded_conflicts="$sfm_loaded_conflicts $sfm_conflict" ;; + esac + ;; + esac + done + + # Calculate the number of modules that must be unloaded to before loading + # the requested module: + sfm_loaded_conflicts_count=`echo $sfm_loaded_conflicts | wc -w` + + case $sfm_loaded_conflicts_count in + 0) + # None of the conflicting modules is loaded: + sfm_cmd="module load $sfm_module" ;; + 1) + # There is only one module that must be unloaded, use switch command: + sfm_cmd="module switch $sfm_loaded_conflicts $sfm_module" ;; + *) + # There is more than one module that must be unloaded, unload all of + # them and then load the requested one: + sfm_cmd="module unload $sfm_loaded_conflicts && module load $sfm_module" ;; + esac + + echo "$sfm_cmd" + eval "$sfm_cmd" + done +} + diff --git a/src/radiate/rte-rrtmgp/.github/workflows/self-hosted-ci.yml b/src/radiate/rte-rrtmgp/.github/workflows/self-hosted-ci.yml new file mode 100644 index 0000000..5977da2 --- /dev/null +++ b/src/radiate/rte-rrtmgp/.github/workflows/self-hosted-ci.yml @@ -0,0 +1,94 @@ +name: Self-hosted CI +on: + push: + branches-ignore: + - documentation + pull_request: + branches-ignore: + - documentation + +defaults: + run: + shell: bash + +jobs: + CI: + runs-on: daint + continue-on-error: ${{ matrix.experimental }} + strategy: + fail-fast: false + matrix: + include: + - config-name: nvidia-gpu-acc + rte-kernels: openacc + compiler-modules: "PrgEnv-nvidia nvidia craype-accel-nvidia60 cdt-cuda/21.09 !cray-libsci_acc" + # Generic accelerator flag + fcflags: "-O3 -acc -Mallocatable=03 -gopt" + experimental: false + - config-name: cce-cpu-icon-production + rte-kernels: default + compiler-modules: "PrgEnv-cray" + # Production flags for Icon model + fcflags: "-hadd_paren -r am -Ktrap=divz,ovf,inv -hflex_mp=intolerant -hfp1 -hnoacc -O1,cache0" + experimental: false + - config-name: cce-gpu-openmp + rte-kernels: openacc + compiler-modules: "PrgEnv-cray craype-accel-nvidia60 cdt-cuda/22.05" + # OpenMP flags from Nichols Romero (Argonne) + fcflags: "-hnoacc -homp -O0" + experimental: true + env: + # Core variables: + FC: ftn + FCFLAGS: ${{ matrix.fcflags }} + # Make variables: + NCHOME: /dummy + NFHOME: /dummy + RRTMGP_ROOT: ${{ github.workspace }} + RTE_KERNELS: ${{ matrix.rte-kernels }} + RUN_CMD: "srun -C gpu -A d56 -p cscsci -t 15:00" + steps: + # + # Checks-out repository under $GITHUB_WORKSPACE + # + - uses: actions/checkout@v3 + # + # Finalize build environment + # + - name: Finalize build environment + run: | + # There are significant limitations on what can go into ${GITHUB_ENV}, + # therefore, we use ${BASH_ENV} but only when necessary: + BASH_ENV="${GITHUB_WORKSPACE}/.bash" + echo "source '${GITHUB_WORKSPACE}/.github/workflows/module_switcher'" >> "${BASH_ENV}" + echo "switch_for_module daint-gpu ${{ matrix.compiler-modules }} cray-netcdf cray-hdf5" >> "${BASH_ENV}" + # Use custom Python environment: + # The environment can be re-generated as follows: + # module load cray-python + # python3 -m venv /scratch/snx3000/rpincus/rte-rrtmgp-python + # /scratch/snx3000/rpincus/rte-rrtmgp-python/bin/pip3 install --upgrade pip + # /scratch/snx3000/rpincus/rte-rrtmgp-python/bin/pip3 install dask[array] netCDF4 numpy xarray + echo "PATH=\"/scratch/snx3000/rpincus/rte-rrtmgp-python/bin:\${PATH}\"" >> "${BASH_ENV}" + # Make bash run the above on startup: + echo "BASH_ENV=${BASH_ENV}" >> "${GITHUB_ENV}" + # Compiler needs more temporary space than normally available: + tmpdir='${{ github.workspace }}/tmp' + mkdir "${tmpdir}" && echo "TMPDIR=${tmpdir}" >> "${GITHUB_ENV}" + # + # Build libraries, examples and tests + # + - name: Build libraries, examples and tests + run: | + $FC --version + make libs + make -C build separate-libs + # + # Run examples and tests + # + - name: Run examples and tests + run: make tests + # + # Compare the results + # + - name: Compare the results + run: make check diff --git a/src/radiate/rte-rrtmgp/.gitignore b/src/radiate/rte-rrtmgp/.gitignore new file mode 100644 index 0000000..2ae1d6a --- /dev/null +++ b/src/radiate/rte-rrtmgp/.gitignore @@ -0,0 +1,40 @@ +# Module files +*.mod + +# Libraries +*.a + +# Object files +*.o + +# Dependency files +*.d + +# Fortran module files +*.mod +*.mod.proxy + +# Intel vectorization reports +*.optrpt + +# Netcdf file during testing +examples/*/*.nc +examples/*/*/*.nc + +# Jupyter notebooks +.ipynb_checkpoints + +# Intel code coverage +*.dyn +*.dpi +*.spi +*.spl +*.HTML +*.html +*.gif + +# gh-pages directory +public + +# Ruby stuff +**/Gemfile.lock diff --git a/src/radiate/rte-rrtmgp/Compiler-flags.md b/src/radiate/rte-rrtmgp/Compiler-flags.md new file mode 100644 index 0000000..6181ec0 --- /dev/null +++ b/src/radiate/rte-rrtmgp/Compiler-flags.md @@ -0,0 +1,36 @@ +# Compiler flag Examples + +Before using the Makefiles supplied with the `RTE+RRTMGP` repository, the environment variables `FC` and +`FCFLAGS`, identifying the Fortran compiler and flags passed to it, need to be set. Here are some examples +used during development and testing. + +To build any of the executables in `examples/` or `tests` the locations of the C and Fortran netCDF libraries +need to be set via environment variables `NCHOME` and `NFHOME`, and the variable `RRTMGP_ROOT` must be set to the +root of the RTE+RRTMGP installation. + +## Gnu Fortran +`FC: gfortran-8` or `gfortran-9` or `gfortran-10` +### Debugging flags +`FCFLAGS: "-ffree-line-length-none -m64 -std=f2008 -march=native -fbounds-check -finit-real=nan -DRTE_USE_CBOOL"` +### Even stricter debugging flags +`FCFLAGS: "-ffree-line-length-none -m64 -std=f2008 -march=native -fbounds-check -fbacktrace -finit-real=nan -DRTE_USE_CBOOL -pedantic -g -Wall"` + +## Intel Fortran +`FC: ifort` +### Debugging flags +`FCFLAGS: "-m64 -g -traceback -heap-arrays -assume realloc_lhs -extend-source 132 -check bounds,uninit,pointers,stack -stand f08"` +### Optimization flags: +`FCFLAGS:"-m64 -O3 -g -traceback -heap-arrays -assume realloc_lhs -extend-source 132"` + +## NVFortran +`FC: nvfortran` (if using the Nvidia HPC SDK) +### Debugging flags +`FCFLAGS: "-g -Minfo -Mbounds -Mchkptr -Mstandard -Kieee -Mchkstk -Mallocatable=03 -Mpreprocess"` +### Optimization flags: +`FCFLAGS: "-g -O3 -fast -Minfo -Mallocatable=03 -Mpreprocess"` + +## HPE CCE for GPU using OpenMP-acc: crayftn -- requires at least CCE 14.0.0 +`FC: crayftn` +### Debugging flags (these appear to be insufficient during the link stage) +`FCFLAGS: "-hnoacc -homp -O0"` + diff --git a/src/radiate/rte-rrtmgp/Contributing.md b/src/radiate/rte-rrtmgp/Contributing.md new file mode 100644 index 0000000..0531ed7 --- /dev/null +++ b/src/radiate/rte-rrtmgp/Contributing.md @@ -0,0 +1,19 @@ +### Contributing to RTE+RRTMGP + +Thanks for considering making a contribution to RTE+RRTMGP. + +The code in this repository is intended to work with compilers supporting the Fortran 2008 standard. It is also expected to run end-to-end on GPUs when compiled with OpenACC or OpenMP (though OpenMP is still unreliable). Commits are tested automatically against a range of compilers using Github Actions and also resources provided by the [Swiss Supercomputing Center](https://cscs.ch). The testing uses two general codes in `examples/`for which results are compared against existing implemetations, and custom codes in `tests/` intended to excercise all code options. + +##### Did you find a bug? + +Please file an issue on the [Github page](https://github.com/RobertPincus/rte-rrtmgp/issues). Please include a minimal reproducer of the bug it at all possible. + +##### Did you write a patch that fixes a bug? + +Please fork this repository, branch from `develop`, make your changes, and open a Github [pull request](https://github.com/RobertPincus/rte-rrtmgp/pulls) against branch `develop`. + +##### Did you add functionality? + +Please fork this repository, branch from `develop`, make your changes, and open a Github [pull request](https://github.com/RobertPincus/rte-rrtmgp/pulls) against branch `develop`, adding a new regression test or comparison against the reference in `tests/verification.py` or `tests/validation-plots.py` as appropriate. Add the test to the `tests` target in `tests/Makefile`. + +RTE+RRTMGP is intended to be a core that users can extend with custom code to suit their own needs. \ No newline at end of file diff --git a/src/radiate/rte-rrtmgp/LICENSE b/src/radiate/rte-rrtmgp/LICENSE new file mode 100644 index 0000000..18020cc --- /dev/null +++ b/src/radiate/rte-rrtmgp/LICENSE @@ -0,0 +1,29 @@ +BSD 3-Clause License + +Copyright (c) 2015-2018, Atmospheric and Environmental Research and Regents of the University of Colorado. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +* Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/src/radiate/rte-rrtmgp/README.md b/src/radiate/rte-rrtmgp/README.md new file mode 100644 index 0000000..58d8178 --- /dev/null +++ b/src/radiate/rte-rrtmgp/README.md @@ -0,0 +1,30 @@ +# Documentation + +[RTE+RRTMGP's GitHub Pages site](https://earth-system-radiation.github.io/rte-rrtmgp/) contains +a mix of automatically-generated documentation and hand-written descriptions. The documentation is +incomplete and evolving. Thanks to the folks at [Sourcery Institute](https://www.sourceryinstitute.org) +for help in setting this up. + +For the moment the [Wiki](https://github.com/earth-system-radiation/rte-rrtmgp/wiki) may also be useful. + +# RTE+RRTMGP + +This is the repository for RTE+RRTMGP, a set of codes for computing radiative fluxes in planetary atmospheres. RTE+RRTMGP is described in a [paper](https://doi.org/10.1029/2019MS001621) in [Journal of Advances in Modeling Earth Systems](http://james.agu.org). + +RRTMGP uses a k-distribution to provide an optical description (absorption and possibly Rayleigh optical depth) of the gaseous atmosphere, along with the relevant source functions, on a pre-determined spectral grid given temperatures, pressures, and gas concentration. The k-distribution currently distributed with this package is applicable to the Earth's atmosphere under present-day, pre-industrial, and 4xCO2 conditions. + +RTE computes fluxes given spectrally-resolved optical descriptions and source functions. The fluxes are normally summarized or reduced via a user extensible class. + + +## Building the libraries, examples, and unit-testing codes. + +1. Set environment variables `FC` (the Fortran 2003 compiler) and `FCFLAGS` (compiler flags). Examples are provided in the `Compiler-flags.md` file. +2. Set environment variables `RRTMGP_ROOT` to the top-level RTE+RRTMGP directory and `RTE_KERNELS` to `openacc` if you want the OpenACC/OpenMP kernels rather than the default. +3. `make libs` in the top-level directory will make the RTE and RRTMGP libraries. +4. The examples and testing codes use netCDF. Set the variables `NCHOME` and `NFHOME` to the roots of the C and Fortran netCDF installations, then `make tests` to build and run these. (A few files need to be downloaded for `examples/rfmip-clear-sky`. The default is to download these with `wget` but a Python script is also available.) +5. Evaluating the results of the tests requires `Python` and the packages described in `environment.yml`. Comparisons can be made with `make check` in the top level directory. +6. `make` invoked without a target in the top level attempts all three steps. + +## Examples + +Two examples are provided in `examples/`, one for clear skies and one including clouds. Directory `tests/` contains regression testing (e.g. to ensure that answers are independent of orientation) and unit testing (to be sure all the code paths are tested). See the README file and codes in each directory for further information. diff --git a/src/radiate/rte-rrtmgp/doc/build_documentation.sh b/src/radiate/rte-rrtmgp/doc/build_documentation.sh new file mode 100644 index 0000000..2bdca37 --- /dev/null +++ b/src/radiate/rte-rrtmgp/doc/build_documentation.sh @@ -0,0 +1,17 @@ +#!/bin/sh +rm -rf ../../public +mkdir ../../public +ford ford_site/rrtmgp-fortran-interface.md +ford ford_site/rrtmgp-kernels.md +ford ford_site/rte-fortran-interface.md +ford ford_site/rte-kernels.md +cd jekyll_site/ +bundle exec jekyll build +cd _site/ +if [ `uname` = "Linux" ]; then + if [ "$1" != "-ci" ]; then grep -rl --include \*.html /assets/main.css | xargs sed -i 's#/rte-rrtmgp/assets/main.css#assets/main.css#g'; fi +else + if [ "$1" != "-ci" ]; then grep -rl --include \*.html /assets/main.css | xargs sed -i '' 's#/rte-rrtmgp/assets/main.css#assets/main.css#g'; fi +fi +cd .. +cp -a _site/* ../../public diff --git a/src/radiate/rte-rrtmgp/doc/class_diagrams/mo_optical_props.puml b/src/radiate/rte-rrtmgp/doc/class_diagrams/mo_optical_props.puml new file mode 100644 index 0000000..00993d4 --- /dev/null +++ b/src/radiate/rte-rrtmgp/doc/class_diagrams/mo_optical_props.puml @@ -0,0 +1,29 @@ +@startuml +Title Classes in the Derived-Type Diagnostic Data Example + +hide empty members + +class stuff_t{ + z_ : complex + defined_ : logical + z() : complex + defined() : logical + stuff_t(z : complex) : stuff_t +} +note right: context stuff_t(z : complex)\npost: stuff_t%defined()\n\ncontext z() \npre: self%defined() + + +abstract class characterizable_t{ + {abstract} as_character() : character(len=:), allocatable +} + +class characterizable_stuff_t{ + stuff_ : stuff_t + as_character() : character(len=:), allocatable + characterizable_t(stuff_t) : characterizable_stuff_t +} + +characterizable_stuff_t *-down- stuff_t : aggregates +characterizable_stuff_t .up.|> characterizable_t : implements + +@enduml \ No newline at end of file diff --git a/src/radiate/rte-rrtmgp/doc/ford_site/rrtmgp-fortran-interface.md b/src/radiate/rte-rrtmgp/doc/ford_site/rrtmgp-fortran-interface.md new file mode 100644 index 0000000..153820d --- /dev/null +++ b/src/radiate/rte-rrtmgp/doc/ford_site/rrtmgp-fortran-interface.md @@ -0,0 +1,52 @@ +--- +project: RRTMGP-Fortran +summary: RRTMGP is a correlated k-distribution for computing fluxes in earth's atmosphere. +preprocessor: gfortran -E +display: public +sort: permission-alpha +graph: true +md_extensions: markdown.extensions.toc +author: The RTE+RRTTMGP consortium +github: https://github.com/earth-system-radiation/ +license: by +title: RRTMGP Fortran interfaces +src_dir: ../../rrtmgp +exclude_dir: ../../rrtmgp/kernels +exclude_dir: ../../rrtmgp/kernels-openacc +output_dir: ../../public/reference/rrtmgp-fortran-interface +... +These pages provide a programmer's view of the Fortran user interface to RRTMGP. + +RRTMGP provides a class [ty_gas_optics_rrtmgp](./type/ty_gas_optics_rrtmgp.html) that implements +the `gas_optics()` and other procedure(s) defined by the [ty_gas_optics](./type/ty_gas_optics.html) +abstract class. The class is used to compute the spectrally-varying optical properties of the +gaseous atmosphere given temperature, pressure, and gas concentrations. Each instance of the +variable is ["loaded"](./type/ty_gas_optics_rrtmgp.html#boundprocedure-load) with data from netCDF +files in the `rrtmgp/data` directory. Depending on the data provided the variable can be used +or radiation emitted by the atmosphere and surface ("longwave") of for for radiation emitted +by the planet's star ("shortwave"). + +The class implements both the longwave/internal sources and +shortwave/external sources versions of the +[`gas_optics`](./type/ty_gas_optics_rrtmgp.html#boundprocedure-gas_optics~2) procedure. +The longwave version reports Planck sources at layer centers and layer interfaces (levels) +while the shortwave version reports the spectrally-varying stellar radiation +Calling the longwave routine (by providing the longwave-relevant arguments) +when the variable has been initialized with shortwave data triggers a run-time error. + +The user interface uses the [ty_gas_concs](./module/mo_gas_concentrations.html) type +to represent the volume mixing ratios needed as input. Output suitable for +scattering emission, two-stream, or multi-stream calculations are provided +depending on which sub-class of RTE's +[ty_optical_props_arry](./rte-fortran-interface/module/mo_optical_props.html#type-ty_optical_props_arry) +are provided. Planck source functions, if requested, are reported in a variable +of type [ty_source_func_lw.](./rte-fortran-interface/type/ty_source_func_lw.html) + +The listings below may not be exhaustive. +To see the full listings use the links at the top of the page. +There is a search bar in the top right. + +Return to the [Documentation overview] or the [reference overview]. + +[Documentation overview]: ../../index.html +[reference overview]: ../../reference.html diff --git a/src/radiate/rte-rrtmgp/doc/ford_site/rrtmgp-kernels.md b/src/radiate/rte-rrtmgp/doc/ford_site/rrtmgp-kernels.md new file mode 100644 index 0000000..ba42776 --- /dev/null +++ b/src/radiate/rte-rrtmgp/doc/ford_site/rrtmgp-kernels.md @@ -0,0 +1,26 @@ +--- +project: RRTMGP kernels +summary: RRTMGP is a correlated k-distribution for computing fluxes in earth's atmosphere. +preprocessor: gfortran -E +display: public +sort: permission-alpha +graph: true +md_extensions: markdown.extensions.toc +author: The RTE+RRTTMGP consortium +github: https://github.com/earth-system-radiation/ +license: by +title: RRTMGP kernels +src_dir: ../../rrtmgp/kernels +output_dir: ../../public/reference/rrtmgp-kernels +... + +These pages document the low-level computational kernels used by RRTMGP. + +The listings below may not be exhaustive. +To see the full listings use the links at the top of the page. +There is a search bar in the top right. + +Return to the [Documentation overview] or the [reference overview]. + +[Documentation overview]: ../../index.html +[reference overview]: ../../reference.html diff --git a/src/radiate/rte-rrtmgp/doc/ford_site/rte-fortran-interface.md b/src/radiate/rte-rrtmgp/doc/ford_site/rte-fortran-interface.md new file mode 100644 index 0000000..20dc729 --- /dev/null +++ b/src/radiate/rte-rrtmgp/doc/ford_site/rte-fortran-interface.md @@ -0,0 +1,61 @@ +--- +project: RTE-Fortran +summary: RTE describes radiation problems in planetary atmospheres and computes radiative fluxes. +preprocessor: gfortran -E +display: public +sort: permission-alpha +graph: true +md_extensions: markdown.extensions.toc +author: The RTE+RRTTMGP consortium +github: https://github.com/earth-system-radiation/ +license: by +title: RTE Fortran interfaces +src_dir: ../../rte +exclude_dir: ../../rte/kernels +exclude_dir: ../../rte/kernels-openacc +output_dir: ../../public/reference/rte-fortran-interface +... + +These pages provide a programmer's view of the Fortran user interface to RTE. + +Procedures in the two solvers ([rte_lw](./proc/rte_lw.html), [rte_sw](./proc/rte_sw.html)) +require problems specified as sets of [optical properties](./module/mo_optical_props.html) +along with boundary conditions and/or [internal sources](./module/mo_source_functions.html) of radiation. +The reduction of spectrally- and spatially-detailed calculations that specifies the output +is defined in a [flux output type](./module/mo_fluxes.html) + +The optical properties module provides a way to specify the spectrally-dependent +optical properties of the atmosphere consistent with calculations neglecting scattering, +using two-stream scattering, or using n-stream scattering. + +- `init()` routines to specify e.g. the spectral discretization +- `load()` routines to provide data (e.g. lookup tables) needed to do a calculation +- `alloc()` routines to allocate memory once the problem size is known +- `finalize()` routines to reset variables to an un-initialized state +- Some classes have `get_ncol()` and `get_nlay()` methods to report the problem size +- Some classes have `get_subset()` methods to extract values along the column dimension + +The listings below may not be exhaustive. +To see the full listings use the links at the top of the page. +There is a search bar in the top right. + +Return to the [Documentation overview] or the [reference overview]. + +[Documentation overview]: ../../index.html +[reference overview]: ../../reference.html + + diff --git a/src/radiate/rte-rrtmgp/doc/ford_site/rte-kernels.md b/src/radiate/rte-rrtmgp/doc/ford_site/rte-kernels.md new file mode 100644 index 0000000..99cfcee --- /dev/null +++ b/src/radiate/rte-rrtmgp/doc/ford_site/rte-kernels.md @@ -0,0 +1,26 @@ +--- +project: RTE kernels +summary: RTE describes radiation problems in planetary atmospheres and computes radiative fluxes. +preprocessor: gfortran -E +display: public +sort: permission-alpha +graph: true +md_extensions: markdown.extensions.toc +author: The RTE+RRTTMGP consortium +github: https://github.com/earth-system-radiation/ +license: by +title: RTE kernels +src_dir: ../../rte/kernels +output_dir: ../../public/reference/rte-kernels +... + +These pages document the low-level computational kernels used by RRTMGP. + +The listings below are not exhaustive. +To see the full listings use the links at the top of the page. +There is a search bar in the top right. + +Return to the [Documentation overview] or the [reference overview]. + +[Documentation overview]: ../../index.html +[reference overview]: ../../reference.html diff --git a/src/radiate/rte-rrtmgp/doc/jekyll_site/.gitignore b/src/radiate/rte-rrtmgp/doc/jekyll_site/.gitignore new file mode 100644 index 0000000..d772ef7 --- /dev/null +++ b/src/radiate/rte-rrtmgp/doc/jekyll_site/.gitignore @@ -0,0 +1,7 @@ +_site +.sass-cache +.jekyll-cache +.jekyll-metadata +.bundle +vendor +Gemfile.lock diff --git a/src/radiate/rte-rrtmgp/doc/jekyll_site/Gemfile b/src/radiate/rte-rrtmgp/doc/jekyll_site/Gemfile new file mode 100644 index 0000000..743828e --- /dev/null +++ b/src/radiate/rte-rrtmgp/doc/jekyll_site/Gemfile @@ -0,0 +1,30 @@ +source "https://rubygems.org" +# Hello! This is where you manage which Jekyll version is used to run. +# When you want to use a different version, change it below, save the +# file and run `bundle install`. Run Jekyll with `bundle exec`, like so: +# +# bundle exec jekyll serve +# +# This will help ensure the proper Jekyll version is running. +# Happy Jekylling! +gem "jekyll", "~> 4.2.1" +# This is the default theme for new Jekyll sites. You may change this to anything you like. +gem "minima", "~> 2.5.1" +# If you want to use GitHub Pages, remove the "gem "jekyll"" above and +# uncomment the line below. To upgrade, run `bundle update github-pages`. +# gem "github-pages", group: :jekyll_plugins +# If you have any plugins, put them here! +group :jekyll_plugins do + gem "jekyll-feed", "~> 0.12" +end + +# Windows and JRuby does not include zoneinfo files, so bundle the tzinfo-data gem +# and associated library. +platforms :mingw, :x64_mingw, :mswin, :jruby do + gem "tzinfo", "~> 1.2" + gem "tzinfo-data" +end + +# Performance-booster for watching directories on Windows +gem "wdm", "~> 0.1.1", :platforms => [:mingw, :x64_mingw, :mswin] + diff --git a/src/radiate/rte-rrtmgp/doc/jekyll_site/_config.yml b/src/radiate/rte-rrtmgp/doc/jekyll_site/_config.yml new file mode 100644 index 0000000..ac22ff0 --- /dev/null +++ b/src/radiate/rte-rrtmgp/doc/jekyll_site/_config.yml @@ -0,0 +1,59 @@ +# Welcome to Jekyll! +# +# This config file is meant for settings that affect your whole blog, values +# which you are expected to set up once and rarely edit after that. If you find +# yourself editing this file very often, consider using Jekyll's data files +# feature for the data you need to update frequently. +# +# For technical reasons, this file is *NOT* reloaded automatically when you use +# 'bundle exec jekyll serve'. If you change this file, please restart the server process. +# +# If you need help with YAML syntax, here are some quick references for you: +# https://learn-the-web.algonquindesign.ca/topics/markdown-yaml-cheat-sheet/#yaml +# https://learnxinyminutes.com/docs/yaml/ +# +# Site settings +# These are used to personalize your new site. If you look in the HTML files, +# you will see them accessed via {{ site.title }}, {{ site.email }}, and so on. +# You can create any custom variable you would like, and they will be accessible +# in the templates via {{ site.myvariable }}. + +title: RTE-RRTMGP +email: rrtmgp@aer.com +description: >- # this means to ignore newlines until "baseurl:" + RTE+RRTMGP is a set of codes for computing radiative fluxes in + planetary atmospheres. RRTMGP uses a k-distribution to provide an optical + description (absorption and possibly Rayleigh optical depth) of the gaseous + atmosphere, along with the relevant source functions, on a pre-determined + spectral grid given temperatures, pressures, and gas concentration. + RTE computes fluxes given spectrally-resolved optical descriptions and + source functions. +baseurl: "/rte-rrtmgp" # the subpath of your site, e.g. /blog +url: "https://earth-system-radiation.github.io/" # the base hostname & protocol for your site, e.g. http://example.com +twitter_username: #jekyllrb +github_username: earth-system-radiation + +# Build settings +theme: minima +# plugins: +# - jekyll-feed + +# Exclude from processing. +# The following items will not be processed, by default. +# Any item listed under the `exclude:` key here will be automatically added to +# the internal "default list". +# +# Excluded items can be processed by explicitly listing the directories or +# their entries' file path in the `include:` list. +# +# exclude: +# - .sass-cache/ +# - .jekyll-cache/ +# - gemfiles/ +# - Gemfile +# - Gemfile.lock +# - node_modules/ +# - vendor/bundle/ +# - vendor/cache/ +# - vendor/gems/ +# - vendor/ruby/ diff --git a/src/radiate/rte-rrtmgp/doc/jekyll_site/_posts/2022-06-02-Release-notes.md b/src/radiate/rte-rrtmgp/doc/jekyll_site/_posts/2022-06-02-Release-notes.md new file mode 100644 index 0000000..83391b1 --- /dev/null +++ b/src/radiate/rte-rrtmgp/doc/jekyll_site/_posts/2022-06-02-Release-notes.md @@ -0,0 +1,16 @@ +--- +layout: post +title: "2022-06-02: Release notes" +categories: Release-notes +--- + +Commit [a4fe30c](https://github.com/earth-system-radiation/rte-rrtmgp/commit/a4fe30cf4dab2e5fd8d3ab6f11683a82ae584475) +to branch `main` makes the following changes: + +- Solar zenith angle can vary with height, allowing for calculations on a pseudo-spherical earth +- New documentation site, partly hand-written (still essentially empty) and partly auto-generated from comments in code (partly complete). +- Workaround for Intel compilers on specific AMD processors +- Python dependencies made explicit in environment.yml files +- Move from wget to Python for downloading files in testing +- Public visibility and C-bindings restricted to just a few kernels +- Assorted consistency and prettifying diff --git a/src/radiate/rte-rrtmgp/doc/jekyll_site/explanations/index.md b/src/radiate/rte-rrtmgp/doc/jekyll_site/explanations/index.md new file mode 100644 index 0000000..24ea3e6 --- /dev/null +++ b/src/radiate/rte-rrtmgp/doc/jekyll_site/explanations/index.md @@ -0,0 +1,12 @@ +--- +layout: "page" +title: "Explanations" +--- + +# Explanations will live here + +### Spectral discretization + +The spectral properties of the atmosphere and the source functions depend on electromagnetic wavelength (or frequency or wavenumber). RTE treats this spectral dependence by dividing the spectrum into one or more _bands_, each of which represents a continuous set of wavelengths/frequencies. Bands may be further sub-divided into _g-points_ (the language is borrowed from _k_-distributions). Each _g_-point is treated as a independent psudo-monchromatic calculation but there is no inherent mapping between _g_-points and wavelengths; the sum over _g_-points is the band-average value. + +The bands defined by RRTMGP cover the full spectrum of radiation emitted by the Sun and Earth: these are _broadband_ calculations. In RRTMGP the bands are continuous so that the ending wavelength of one band is the starting wavelength of the next. diff --git a/src/radiate/rte-rrtmgp/doc/jekyll_site/how-tos/index.md b/src/radiate/rte-rrtmgp/doc/jekyll_site/how-tos/index.md new file mode 100644 index 0000000..91a88b3 --- /dev/null +++ b/src/radiate/rte-rrtmgp/doc/jekyll_site/how-tos/index.md @@ -0,0 +1,34 @@ +--- +layout: "page" +title: "How-to guides" +--- +# How-to guides will live here + +## How to: build and test the libraries and examples + +### Building and testing using (Gnu) make + +1. Set environment variables `FC` (the Fortran 2003 compiler) and `FCFLAGS` (compiler flags). + Examples are provided in the `Compiler-flags.md` file. +2. Set environment variable `RRTMGP_ROOT` to the top-level RTE+RRTMGP directory. + Set the variables `NCHOME` and `NFHOME` to the roots of the C and Fortran + netCDF installations. (Building the libraries alone ) +3. Set environment variable `RTE_KERNELS` to `openacc` if you want the OpenACC/OpenMP + kernels rather than the default. +4. `make libs` in the top-level directory will make the RTE and RRTMGP libraries + and the regression tests in in `examples/` and `tests/`. Libraries and module + files are in `build/`; examples and tests are in the subdirectory containing + their source code. +5. `make tests` runs the examples and regression tests. + (A few files need to be downloaded for `examples/rfmip-clear-sky`. The default + is to download with a Python script is shell script using `wget` is also available.) +6. Comparisons can be made with `make check` in the top level directory. + Evaluating the results of the tests requires `Python` and the packages + described in `environment.yml`. One approach is to use + `conda env create -f environment.yml; conda activate rte_rrtmgp_test; make check` +7. `make` invoked without a target in the top level attempts all three steps. + +### Building and testing using (Gnu) make + +Sergey Kosukhin and his colleagues at the Max Planck Institute for Meteorology +maintain the `autoconf` branch which adds Gnu `autotools` building to `main` branch. diff --git a/src/radiate/rte-rrtmgp/doc/jekyll_site/index.markdown b/src/radiate/rte-rrtmgp/doc/jekyll_site/index.markdown new file mode 100644 index 0000000..e58a350 --- /dev/null +++ b/src/radiate/rte-rrtmgp/doc/jekyll_site/index.markdown @@ -0,0 +1,32 @@ +--- +# Feel free to add content and custom Front Matter to this file. +# To modify the layout, see https://jekyllrb.com/docs/themes/#overriding-theme-defaults +layout: "home" +title: "RTE+RRTMGP documentation" +--- +This is the documentation for RTE+RRTMGP, a set of codes for computing radiative +fluxes in planetary atmospheres. RTE+RRTMGP is described in a +[paper](https://doi.org/10.1029/2019MS001621) in +[Journal of Advances in Modeling Earth Systems](http://james.agu.org). + +RRTMGP uses a k-distribution to provide an optical description (absorption and + possibly Rayleigh optical depth) of the gaseous atmosphere, along with the + relevant source functions, on a pre-determined spectral grid given + temperatures, pressures, and gas concentration. The k-distribution currently + distributed with this package is applicable to the Earth's atmosphere under + present-day, pre-industrial, and 4xCO2 conditions. + +RTE computes fluxes given spectrally-resolved optical descriptions and source +functions. The fluxes are normally summarized or reduced via a user extensible class. + +# Work in progress + +Comprehensive documentation for RTE and RRTMGP is very much under development. + +We are planning to follow the [Diataxis](https://diataxis.fr/) framework +and produce [tutorials](./tutorials/index.html), [how-to guides](./how-tos/index.html), +[explanations](./explanations/index.html), and [reference](./reference/index.html). + +We are starting with the [reference documentation](./reference/index.html), +auto-generated from the code itself. This is provided separately for +RTE and RRTMGP and for the user-facing classes and underlying computational kernels. diff --git a/src/radiate/rte-rrtmgp/doc/jekyll_site/reference/index.md b/src/radiate/rte-rrtmgp/doc/jekyll_site/reference/index.md new file mode 100644 index 0000000..109c886 --- /dev/null +++ b/src/radiate/rte-rrtmgp/doc/jekyll_site/reference/index.md @@ -0,0 +1,28 @@ +--- +layout: page +title: Reference (technical documentation) +--- +# Reference/Technical documentation + +RTE aspires to follow a set of coding conventions: + +- Module names start with `mo_`, class/type names with `ty_`. +- Real variables are defined with working precision `wp`; logical variables with `wl`. + Both Fortran KIND parameters are set in `mo_rte_kind.F90` +- Most procedures in RTE and RRTMGP are functions which return a string. A non-empty string indicates an error of some kind. +- RTE and RRTMGP operate on multiple columns (profiles) at once. Problems are dimensioned by column, layer, + and spectral quadrature point. +- RTE and RRTMGP are agnostic to vertical ordering +- Units are MKS + +## Fortran user-facing class interfaces + +[RTE Fortran interface](./rte-fortran-interface/index.html) + +[RRTMGP Fortran interface](./rrtmgp-fortran-interface/index.html) + +## Kernel interfaces + +[RTE kernels: Fortran interface](./rte-kernels/index.html) + +[RRTMGP kernels: Fortran interface](./rrtmgp-kernels/index.html) diff --git a/src/radiate/rte-rrtmgp/doc/jekyll_site/tutorials/index.md b/src/radiate/rte-rrtmgp/doc/jekyll_site/tutorials/index.md new file mode 100644 index 0000000..1e84530 --- /dev/null +++ b/src/radiate/rte-rrtmgp/doc/jekyll_site/tutorials/index.md @@ -0,0 +1,26 @@ +--- +layout: "page" +title: "Tutorials" +--- + +# Tutorials will live here + +### Clear-sky calculation +A typical workflow for a clear-sky calculation is to +1. allocate memory +2. set gas concentration values +3. compute the optical properties of the gaseous atmosphere +4. compute radiative fluxes + +This repository contains all the pieces needed to perform a clear-sky calculation. An [example](https://github.com/RobertPincus/rte-rrtmgp/tree/master/examples/rfmip-clear-sky) is provided. + +### All-sky calculation +An all-sky calculation is a small variant +1. allocate memory +2. set gas concentration values +3. compute the optical properties of the gaseous atmosphere +4. compute the optical properties of aerosol and add these to the optical properties +5. compute the optical properties of clouds and add these to the optical properties +6. compute radiative fluxes + +An [example](https://github.com/earth-system-radiation/rte-rrtmgp/tree/main/examples/all-sky) of this workflow is available in the repository. The example also demonstrates how to complete an end-to-end calculation on a GPU using OpenACC. Users must provide methods for computing the optical properties of clouds and gases (an [example cloud optics class](https://github.com/earth-system-radiation/rte-rrtmgp/tree/main/extensions/cloud_optics) is provided). diff --git a/src/radiate/rte-rrtmgp/extensions/aerosol_optics/mo_aerosol_optics.F90 b/src/radiate/rte-rrtmgp/extensions/aerosol_optics/mo_aerosol_optics.F90 new file mode 100644 index 0000000..8628572 --- /dev/null +++ b/src/radiate/rte-rrtmgp/extensions/aerosol_optics/mo_aerosol_optics.F90 @@ -0,0 +1,404 @@ +! This code is part of Radiative Transfer for Energetics (RTE) +! +! Contacts: Robert Pincus and Eli Mlawer +! email: rrtmgp@aer.com +! +! Copyright 2015-2018, Atmospheric and Environmental Research and +! Regents of the University of Colorado. All right reserved. +! +! Use and duplication is permitted under the terms of the +! BSD 3-clause license, see http://opensource.org/licenses/BSD-3-Clause +! ------------------------------------------------------------------------------------------------- +! Provides cloud optical properties as a function of effective radius for the RRTMGP bands +! Based on Mie calculations for liquid +! and results from doi:10.1175/JAS-D-12-039.1 for ice with variable surface roughness +! Can use either look-up tables or Pade approximates according to which data has been loaded +! Mike Iacono (AER) is the original author +! +! The class can be used as-is but is also intended as an example of how to extend the RTE framework +! ------------------------------------------------------------------------------------------------- + +module mo_aerosol_optics + use mo_rte_kind, only: wp, wl + use mo_rte_config, only: check_values, check_extents + use mo_rte_util_array,only: any_vals_less_than, any_vals_outside, extents_are + use mo_optical_props, only: ty_optical_props, & + ty_optical_props_arry, & + ty_optical_props_1scl, & + ty_optical_props_2str, & + ty_optical_props_nstr + implicit none + private + ! ----------------------------------------------------------------------------------- + type, extends(ty_optical_props), public :: ty_aerosol_optics + private + ! Lookup table information + ! + ! Table size information + integer :: naerbins=17 + integer :: nrh=20 + + !Drop radius at bin center in centimeters + real(wp),dimension(:), allocatable :: rma, radlim + real(wp),dimension(:,:), allocatable :: radparam + + + ! The tables themselves. + ! + real(wp), dimension(:,:,:,:), allocatable :: lut_qext, lut_qscat, lut_gasym + real(wp), dimension(:,:,:), allocatable :: lut_qext_carb, lut_qscat_carb, lut_gasym_carb + real(wp), dimension(:,:,:), allocatable :: lut_qext_dust, lut_qscat_dust, lut_gasym_dust + real(wp), dimension(:,:,:), allocatable :: lut_growth + + contains + generic, public :: load => load_lut + ! Internal procedures + procedure, private :: load_lut + procedure, public :: aerosol_optics + end type ty_aerosol_optics + +contains + ! ------------------------------------------------------------------------------ + ! + ! Routines to load data needed for aerosol optics calculations. + ! + ! ------------------------------------------------------------------------------ + function load_lut(this, band_lims_wvn, rma, radlim, radparam, & + lut_qext, lut_qext_carb, lut_qext_dust, & + lut_qscat, lut_qscat_carb, lut_qscat_dust, & + lut_gasym, lut_gasym_carb, lut_gasym_dust, & + lut_growth) result(error_msg) + + class(ty_aerosol_optics), intent(inout) :: this + real(wp), dimension(:,:), intent(in ) :: band_lims_wvn,radparam + real(wp), dimension(:), intent(in ) :: rma, radlim + + ! LUT coefficients + ! Extinction, single-scattering albedo, and asymmetry parameter + real(wp), dimension(:,:,:,:), intent(in) :: lut_qext, lut_qscat, lut_gasym + real(wp), dimension(:,:,:), intent(in) :: lut_qext_carb, lut_qscat_carb, lut_gasym_carb + real(wp), dimension(:,:,:), intent(in) :: lut_qext_dust, lut_qscat_dust, lut_gasym_dust + real(wp), dimension(:,:,:), intent(in) :: lut_growth + character(len=128) :: error_msg + ! ------- + ! + ! Local variables + ! + integer :: nbnd, ntype, nradbins, nrh, ncarb, ndust + + error_msg = this%init(band_lims_wvn, name="RRTMGP aerosol optics") + ! + ! LUT coefficient dimensions + ! + nbnd = size(lut_qext,dim=2) + ntype = size(lut_qext,dim=1) + nradbins = size(lut_qext,dim=3) + nrh = size(lut_qext,dim=4) + ncarb = size(lut_qext_carb,dim=1) + ndust = size(lut_qext_dust,dim=1) + + allocate(this%rma(nradbins)) + this%rma = rma + + allocate(this%radlim(size(radlim))) + this%radlim = radlim + + allocate(this%radparam(size(radlim),size(rma))) + this%radparam = radparam + + ! Allocate LUT coefficients + allocate(this%lut_qext(ntype, nbnd, nradbins,nrh), & + this%lut_qext_carb(ncarb, nbnd, nradbins), & + this%lut_qext_dust(ndust, nbnd, nradbins), & + this%lut_qscat(ntype, nbnd, nradbins,nrh), & + this%lut_qscat_carb(ncarb, nbnd, nradbins), & + this%lut_qscat_dust(ndust, nbnd,nradbins), & + this%lut_gasym(ntype, nbnd, nradbins, nrh), & + this%lut_gasym_carb(ncarb, nbnd, nradbins), & + this%lut_gasym_dust(ndust, nbnd,nradbins), & + this%lut_growth(ntype, nradbins, nrh)) + + + ! Load LUT coefficients + this%lut_qext = lut_qext + this%lut_qext_carb = lut_qext_carb + this%lut_qext_dust = lut_qext_dust + this%lut_qscat = lut_qscat + this%lut_qscat_carb = lut_qscat_carb + this%lut_qscat_dust = lut_qscat_dust + this%lut_gasym = lut_gasym + this%lut_gasym_carb = lut_gasym_carb + this%lut_gasym_dust = lut_gasym_dust + this%lut_growth = lut_growth + end function load_lut + ! ------------------------------------------------------------------------------ + ! + ! Derive aerosol optical properties from provided aerosol physical properties + ! + ! ------------------------------------------------------------------------------ + ! + ! Compute single-scattering properties + ! + function aerosol_optics(this, & + aerocon, aeroradius, aerotype, rh_lay, & + optical_props, aodt) result(error_msg) + class(ty_aerosol_optics), & + intent(in ) :: this + real(wp), intent(in ) :: aeroradius (:,:,:), & ! aerosol radius (m) + aerocon (:,:,:), & ! aerosol concentration (#/m^2) + rh_lay(:,:) ! RH + integer, intent(in ) :: aerotype(:,:) + real(wp), intent(inout), optional :: aodt(:) + class(ty_optical_props_arry), & + intent(inout) :: optical_props + + character(len=128) :: error_msg + ! ------- Local ------- + ! Optical properties: tau, tau*ssa, tau*ssa*g + real(wp), dimension(size(aerocon,1), size(aerocon,2), this%get_nband()) :: & + tau, taussa, taussag + real(wp), dimension(size(aerocon,2),this%naerbins) :: rnaer + real(wp) :: tau_sum, om_sum, asym_sum, con_sum, om, gg + real(wp) :: gfact, qext, qscat, gasym, dm, pi=3.141593 + + integer :: ncol, nlay, nbnd, aerocat, nradbins, nrh + integer :: icol, ilay, ibnd, acat, atype, irh, ibns + ! scalars for total tau, tau*ssa + real(wp) :: tau_temp, taussa_temp + ! ---------------------------------------- + ! + ! Error checking + ! + ! ---------------------------------------- + + error_msg = '' + if(.not.(allocated(this%lut_qext))) then + error_msg = 'aerosol optics: no data has been initialized' + return + end if + + ncol = size(aerocon,1) + nlay = size(aerocon,2) + aerocat = size(aerocon,3) + nradbins = size(this%lut_qext,dim=3) + nrh = size(this%lut_qext,dim=4) + nbnd = this%get_nband() + + tau = 0. + taussa = 0. + taussag = 0. + + ! + ! Spectral consistency + ! + if(check_values) then + if(.not. this%bands_are_equal(optical_props)) & + error_msg = "aerosol optics: optical properties don't have the same band structure" + if(optical_props%get_nband() /= optical_props%get_ngpt() ) & + error_msg = "aerosol optics: optical properties must be requested by band not g-points" + if(error_msg /= "") return + end if + + error_msg = "" + if(error_msg == "") then + do icol=1,ncol + DO acat=1,aerocat + IF (aerotype(icol,acat).gt.0) then + atype = aerotype(icol,acat) + ! For each aerosol, the code requires a total number concentration of + ! the aerosol at each grid point, along with either a total mass at the + ! grid point or a median radius. + CALL aero_bin (nlay,nradbins,aerocon(icol,:,acat),aeroradius(icol,:,acat), & + this%radlim, this%radparam, rnaer) +!print*, aerocon(icol,10,acat),aeroradius(icol,10,acat),aerocon(icol,10,acat)/sum(rnaer(10,:)) + ! This is the routine that calculates the optical properties of the + ! aerosols within the radiation routine: + ! Doing over all vertical levels (not including radiation levels) + DO ilay = 1,nlay + ! Locate RH as a percentage for table lookup + irh=INT(100.*(rh_lay(icol,ilay)-0.80)) + 1 + irh=MAX(1,MIN(irh,nrh) ) + + ! Loop over radiation bands + DO ibnd=1,nbnd + + ! Resetting temporary storage variabes to zero for next set of calcs: + tau_sum = 0.0 + om_sum = 0.0 + asym_sum = 0.0 + con_sum = 0.0 + om = 0.0 + gg = 0.0 + + ! Calculating optical properties at each aerosol bin: + DO ibns = 1,this%naerbins + ! Retrieving values for the growth factor, the extinction coefficient, + ! the scattering coefficient and the asymmetry parameter, from their + ! appropriate look up tables: + if (atype<=2) then + gfact = this%lut_growth(atype,ibns,irh) + qext = this%lut_qext(atype,ibnd,ibns,irh) + qscat = this%lut_qscat(atype,ibnd,ibns,irh) + gasym = this%lut_gasym(atype,ibnd,ibns,irh) + elseif (atype==4 .or. atype==5) then + gfact = 1.0 + qext = this%lut_qext_carb(atype-3,ibnd,ibns) + qscat = this%lut_qscat_carb(atype-3,ibnd,ibns) + gasym = this%lut_gasym_carb(atype-3,ibnd,ibns) + elseif (atype>=31) then + gfact = 1.0 + qext = this%lut_qext_dust(atype-30,ibnd,ibns) + qscat = this%lut_qscat_dust(atype-30,ibnd,ibns) + gasym = this%lut_gasym_dust(atype-30,ibnd,ibns) + endif + + ! Determining mean diameter of bin (meters), with deliquescence growth factor + dm = 2. * this%rma(ibns) * gfact + ! Updating temporary storage variables: + if (qext>0.0 .and. rnaer(ilay,ibns)>0.0)then + tau_sum = tau_sum + (pi/4. * dm**2 * rnaer(ilay,ibns) * qext) !Bext*dz + om_sum = om_sum + (pi/4. * dm**2 * rnaer(ilay,ibns) * qscat) !Bscat*dz + asym_sum = asym_sum + (rnaer(ilay,ibns) * gasym) !Asymmetry parameter + con_sum = con_sum + rnaer(ilay,ibns) !Total aerosol number + endif + ENDDO ! Aerosol bins (ibns) + + if(tau_sum>0.0) then + om = om_sum / tau_sum !Omega = Bscat / Bext + gg = asym_sum/(con_sum+1.E-30) !normalize asym_sum by total number + else + tau_sum = 0.0 + endif + tau(icol,ilay,ibnd) = tau(icol,ilay,ibnd) + tau_sum + taussa(icol,ilay,ibnd) = taussa(icol,ilay,ibnd) + om * tau_sum + taussag(icol,ilay,ibnd) = taussag(icol,ilay,ibnd) + gg * om * tau_sum + ENDDO ! Radiation band loop + ENDDO ! Vertical level loop + ENDIF !Aerosol type if + ENDDO ! Aerotype loop + enddo + + select type(optical_props) + type is (ty_optical_props_1scl) + do ibnd = 1, nbnd + do ilay = 1, nlay + do icol = 1,ncol + ! Absorption optical depth = (1-ssa) * tau = tau - taussa + optical_props%tau(icol,ilay,ibnd) = tau(icol,ilay,ibnd) - taussa(icol,ilay,ibnd) + end do + end do + end do + type is (ty_optical_props_2str) + do ibnd = 1, nbnd + do ilay = 1, nlay + do icol = 1,ncol + tau_temp = tau(icol,ilay,ibnd) + taussa_temp = taussa(icol,ilay,ibnd) + optical_props%g (icol,ilay,ibnd) = taussag(icol,ilay,ibnd) / & + max(epsilon(tau_temp), taussa_temp) + optical_props%ssa(icol,ilay,ibnd) = taussa_temp/max(epsilon(tau_temp), tau_temp) + optical_props%tau(icol,ilay,ibnd) = tau_temp + !AOD typically reported at ~550nm (MODIS). This is 19,000 cm^-1 + if (present(aodt)) then + if (this%band_lims_wvn(1,ibnd)<19000 .and. this%band_lims_wvn(2,ibnd)>19000) then + aodt(icol)=aodt(icol)+tau_temp + endif + endif + end do + end do + end do + type is (ty_optical_props_nstr) + error_msg = "aerosol optics: n-stream calculations not yet supported" + end select + else + error_msg = "aerosol optics: no method to calculate cloud optical properties" + endif + + end function aerosol_optics +!############################################################################## +Subroutine aero_bin (m1,naerbins,numconc,medianrad,radlim,radparam,rnaer) + +! The purpose of this routine was to take a number concentration +! and median radius for any given aerosol and turn it into a binned +! distribution +! Input Variables: m1 - Integer, number of vertical levels +! naerbins - Integer number of bins used in aerosol radiation +! calculations. Set to 17 in radcalc3. +! numconc - Number concentration of aerosol (#/m^3) +! medianrad - Median radius of the given aerosol type (m) +! interp - Determines beginning point for interpolation calculations +! radlim - Radii at which aerosol distribution was explicitly +! binned (in cm) +! radparam - Percentage of aerosol mass in each of the 17 bins, +! as a func of median radius. +! rg - Median radius of aerosol (m) +! L(4) - Values used in the 3rd order Lagrangian polynomial +! interpolation scheme to determine percentage of aerosol +! within a given bin +! m - Used to define which four median radii should +! be used in interpolation +! Output variable: rnaer(m1,naerbins) - Number concentrations for +! all 17 bins at every vertical level (#/m3) +!************************************************************************** + +implicit none + +! Incoming variable declaration: + INTEGER m1,naerbins + REAL numconc(m1),medianrad(m1),dn0(m1) + REAL radlim(:),radparam(:,:) + +! Internal variable declaraion: + INTEGER bin,i,k,n,m,interp + REAL rg,L(4) + +! Outgoing variable declaration: + REAL rnaer(m1,naerbins) +! Vertical level loop: + DO k = 1,m1 + + rg = medianrad(k) + + !Determining which four points to use in the interpolation scheme + interp = 0 + DO n=1,25 + IF(rg.GE.radlim(n).AND.rg.LE.radlim(n+1)) THEN + interp = n + ENDIF + ENDDO + if(interp == 0) then + IF(rg.LT.radlim(1)) interp = 1 + IF(rg.GT.radlim(25)) interp = 25 + endif + m = interp - 1 + IF(interp.EQ.1) m = 1 + IF(interp.EQ.25) m = 23 + + ! Determining the coefficients to be used in the 3rd order + !Lagrangian polynomial interpolation scheme: + L(1) = (rg-radlim(m+3))*(rg-radlim(m+2))* & + (rg-radlim(m+1))/(radlim(m)-radlim(m+3))/ & + (radlim(m)-radlim(m+2))/(radlim(m)-radlim(m+1)) + L(2) = (rg-radlim(m+3))*(rg-radlim(m+2))* & + (rg-radlim(m))/(radlim(m+1)-radlim(m+3))/ & + (radlim(m+1)-radlim(m+2))/(radlim(m+1)-radlim(m)) + L(3) = (rg-radlim(m+3))*(rg-radlim(m+1))* & + (rg-radlim(m))/(radlim(m+2)-radlim(m+3))/ & + (radlim(m+2)-radlim(m+1))/(radlim(m+2)-radlim(m)) + L(4) = (rg-radlim(m+2))*(rg-radlim(m+1))* & + (rg-radlim(m))/(radlim(m+3)-radlim(m+2))/ & + (radlim(m+3)-radlim(m+1))/(radlim(m+3)-radlim(m)) + + !At each bin, determine the number concentration of aerosol + DO i = 1,naerbins + rnaer(k,i) = L(1)*radparam(m,i) + L(2)*radparam(m+1,i) + & + L(3)*radparam(m+2,i) + L(4)*radparam(m+3,i) + IF(rnaer(k,i).LT.0.) rnaer(k,i) = 0. + rnaer(k,i) = rnaer(k,i) * numconc(k) + ENDDO ! Bin loop (i) + + ENDDO ! Vertical level loop (k) + +return +END SUBROUTINE aero_bin +end module mo_aerosol_optics diff --git a/src/radiate/rte-rrtmgp/extensions/cloud_optics/mo_cloud_optics.F90 b/src/radiate/rte-rrtmgp/extensions/cloud_optics/mo_cloud_optics.F90 new file mode 100644 index 0000000..3cc0f55 --- /dev/null +++ b/src/radiate/rte-rrtmgp/extensions/cloud_optics/mo_cloud_optics.F90 @@ -0,0 +1,1010 @@ +! This code is part of Radiative Transfer for Energetics (RTE) +! +! Contacts: Robert Pincus and Eli Mlawer +! email: rrtmgp@aer.com +! +! Copyright 2015-2018, Atmospheric and Environmental Research and +! Regents of the University of Colorado. All right reserved. +! +! Use and duplication is permitted under the terms of the +! BSD 3-clause license, see http://opensource.org/licenses/BSD-3-Clause +! ------------------------------------------------------------------------------------------------- +! Provides cloud optical properties as a function of effective radius for the RRTMGP bands +! Based on Mie calculations for liquid +! and results from doi:10.1175/JAS-D-12-039.1 for ice with variable surface roughness +! Can use either look-up tables or Pade approximates according to which data has been loaded +! Mike Iacono (AER) is the original author +! +! The class can be used as-is but is also intended as an example of how to extend the RTE framework +! ------------------------------------------------------------------------------------------------- + +module mo_cloud_optics + use mo_rte_kind, only: wp, wl + use mo_rte_config, only: check_values, check_extents + use mo_rte_util_array,only: any_vals_less_than, any_vals_outside, extents_are + use mo_optical_props, only: ty_optical_props, & + ty_optical_props_arry, & + ty_optical_props_1scl, & + ty_optical_props_2str, & + ty_optical_props_nstr + implicit none + interface pade_eval + module procedure pade_eval_nbnd, pade_eval_1 + end interface pade_eval + private + ! ----------------------------------------------------------------------------------- + type, extends(ty_optical_props), public :: ty_cloud_optics + private + ! + ! Ice surface roughness category - needed for Yang (2013) ice optics parameterization + ! + integer :: icergh = 0 ! (1 = none, 2 = medium, 3 = high) + ! + ! Lookup table information + ! + ! Upper and lower limits of the tables + real(wp) :: radcld_lwr = 0._wp, radcld_upr = 0._wp + real(wp) :: raddrz_lwr = 0._wp, raddrz_upr = 0._wp + real(wp) :: radrain_lwr = 0._wp, radrain_upr = 0._wp + real(wp) :: radscol_lwr = 0._wp, radscol_upr = 0._wp + real(wp) :: radhcol_lwr = 0._wp, radhcol_upr = 0._wp + real(wp) :: radplate_lwr = 0._wp, radplate_upr = 0._wp + real(wp) :: radros_lwr = 0._wp, radros_upr = 0._wp + real(wp) :: radagg_lwr = 0._wp, radagg_upr = 0._wp + real(wp) :: radhail_lwr = 0._wp, radhail_upr = 0._wp + real(wp) :: radliq_lwr = 0._wp, radliq_upr = 0._wp + real(wp) :: radice_lwr = 0._wp, radice_upr = 0._wp + ! How many steps in the table? (for convenience) + integer :: cld_nsteps = 0 + integer :: drz_nsteps = 0 + integer :: rain_nsteps = 0 + integer :: scol_nsteps = 0 + integer :: hcol_nsteps = 0 + integer :: plate_nsteps = 0 + integer :: ros_nsteps = 0 + integer :: agg_nsteps = 0 + integer :: hail_nsteps = 0 + integer :: liq_nsteps = 0 + integer :: ice_nsteps = 0 + ! How big is each step in the table? + real(wp) :: cld_step_size = 0._wp + real(wp) :: drz_step_size = 0._wp + real(wp) :: rain_step_size = 0._wp + real(wp) :: scol_step_size = 0._wp + real(wp) :: hcol_step_size = 0._wp + real(wp) :: plate_step_size = 0._wp + real(wp) :: ros_step_size = 0._wp + real(wp) :: agg_step_size = 0._wp + real(wp) :: hail_step_size = 0._wp + real(wp) :: liq_step_size = 0._wp + real(wp) :: ice_step_size = 0._wp + ! + ! The tables themselves. + ! + real(wp), dimension(:,:), allocatable :: lut_extcld, lut_ssacld, lut_asycld ! (nsize_cld, nbnd) + real(wp), dimension(:,:), allocatable :: lut_extdrz, lut_ssadrz, lut_asydrz ! (nsize_drz, nbnd) + real(wp), dimension(:,:), allocatable :: lut_extrain, lut_ssarain, lut_asyrain ! (nsize_rain, nbnd) + real(wp), dimension(:,:), allocatable :: lut_extscol, lut_ssascol, lut_asyscol ! (nsize_scol, nbnd) + real(wp), dimension(:,:), allocatable :: lut_exthcol, lut_ssahcol, lut_asyhcol ! (nsize_hcol, nbnd) + real(wp), dimension(:,:), allocatable :: lut_extplate, lut_ssaplate, lut_asyplate ! (nsize_plate, nbnd) + real(wp), dimension(:,:), allocatable :: lut_extros, lut_ssaros, lut_asyros ! (nsize_ros, nbnd) + real(wp), dimension(:,:), allocatable :: lut_extagg, lut_ssaagg, lut_asyagg ! (nsize_agg, nbnd) + real(wp), dimension(:,:), allocatable :: lut_exthail, lut_ssahail, lut_asyhail ! (nsize_hail, nbnd) + real(wp), dimension(:,:), allocatable :: lut_extliq, lut_ssaliq, lut_asyliq ! (nsize_hail, nbnd) + real(wp), dimension(:,:), allocatable :: lut_extice, lut_ssaice, lut_asyice ! (nsize_hail, nbnd) + + ! + ! Pade approximant coefficients + ! + real(wp), dimension(:,:,: ), allocatable :: pade_extliq ! (nbnd, nsizereg, ncoeff_ext) + real(wp), dimension(:,:,: ), allocatable :: pade_ssaliq, pade_asyliq ! (nbnd, nsizereg, ncoeff_ssa_g) + real(wp), dimension(:,:,:,:), allocatable :: pade_extice ! (nbnd, nsizereg, ncoeff_ext, nrghice) + real(wp), dimension(:,:,:,:), allocatable :: pade_ssaice, pade_asyice ! (nbnd, nsizereg, ncoeff_ssa_g, nrghice) + ! Particle size regimes for Pade formulations + real(wp), dimension(:), allocatable :: pade_sizreg_extliq, pade_sizreg_ssaliq, pade_sizreg_asyliq ! (nbound) + real(wp), dimension(:), allocatable :: pade_sizreg_extice, pade_sizreg_ssaice, pade_sizreg_asyice ! (nbound) + ! ----- + contains + generic, public :: load => load_lut, load_pade + procedure, public :: finalize + procedure, public :: cloud_optics + procedure, public :: get_min_radius_liq + procedure, public :: get_min_radius_ice + procedure, public :: get_max_radius_liq + procedure, public :: get_max_radius_ice + procedure, public :: get_num_ice_roughness_types + procedure, public :: set_ice_roughness + ! Internal procedures + procedure, private :: load_lut + procedure, private :: load_pade + end type ty_cloud_optics + +contains + ! ------------------------------------------------------------------------------ + ! + ! Routines to load data needed for cloud optics calculations. Two routines: one to load + ! lookup-tables and one for coefficients for Pade approximates + ! + ! ------------------------------------------------------------------------------ + function load_lut(this, band_lims_wvn, & + radcld_lwr, radcld_upr, radcld_fac, & + raddrz_lwr, raddrz_upr, raddrz_fac, & + radrain_lwr, radrain_upr, radrain_fac, & + radscol_lwr, radscol_upr, radscol_fac, & + radhcol_lwr, radhcol_upr, radhcol_fac, & + radplate_lwr, radplate_upr, radplate_fac, & + radros_lwr, radros_upr, radros_fac, & + radagg_lwr, radagg_upr, radagg_fac, & + radhail_lwr, radhail_upr, radhail_fac, & + lut_extcld, lut_ssacld, lut_asycld, & + lut_extdrz, lut_ssadrz, lut_asydrz, & + lut_extrain, lut_ssarain, lut_asyrain, & + lut_extscol, lut_ssascol, lut_asyscol, & + lut_exthcol, lut_ssahcol, lut_asyhcol, & + lut_extplate, lut_ssaplate, lut_asyplate, & + lut_extros, lut_ssaros, lut_asyros, & + lut_extagg, lut_ssaagg, lut_asyagg, & + lut_exthail, lut_ssahail, lut_asyhail) result(error_msg) + + class(ty_cloud_optics), intent(inout) :: this + real(wp), dimension(:,:), intent(in ) :: band_lims_wvn ! Spectral discretization + ! Lookup table interpolation constants + ! Lower and upper bounds of the tables; also the constant for calculating interpolation indices for liquid + real(wp), intent(in ) :: radcld_lwr, radcld_upr, radcld_fac + real(wp), intent(in ) :: raddrz_lwr, raddrz_upr, raddrz_fac + real(wp), intent(in ) :: radrain_lwr, radrain_upr, radrain_fac + real(wp), intent(in ) :: radscol_lwr, radscol_upr, radscol_fac + real(wp), intent(in ) :: radhcol_lwr, radhcol_upr, radhcol_fac + real(wp), intent(in ) :: radplate_lwr, radplate_upr, radplate_fac + real(wp), intent(in ) :: radros_lwr, radros_upr, radros_fac + real(wp), intent(in ) :: radagg_lwr, radagg_upr, radagg_fac + real(wp), intent(in ) :: radhail_lwr, radhail_upr, radhail_fac + ! LUT coefficients + ! Extinction, single-scattering albedo, and asymmetry parameter for liquid and ice respectively + real(wp), dimension(:,:), intent(in) :: lut_extcld, lut_ssacld, lut_asycld + real(wp), dimension(:,:), intent(in) :: lut_extdrz, lut_ssadrz, lut_asydrz + real(wp), dimension(:,:), intent(in) :: lut_extrain, lut_ssarain, lut_asyrain + real(wp), dimension(:,:), intent(in) :: lut_extscol, lut_ssascol, lut_asyscol + real(wp), dimension(:,:), intent(in) :: lut_exthcol, lut_ssahcol, lut_asyhcol + real(wp), dimension(:,:), intent(in) :: lut_extplate, lut_ssaplate, lut_asyplate + real(wp), dimension(:,:), intent(in) :: lut_extros, lut_ssaros, lut_asyros + real(wp), dimension(:,:), intent(in) :: lut_extagg, lut_ssaagg, lut_asyagg + real(wp), dimension(:,:), intent(in) :: lut_exthail, lut_ssahail, lut_asyhail + character(len=128) :: error_msg + ! ------- + ! + ! Local variables + ! + integer :: nbnd, nsize_cld, nsize_drz, nsize_rain, nsize_scol, nsize_hcol, & + nsize_plate, nsize_ros, nsize_agg, nsize_hail + + error_msg = this%init(band_lims_wvn, name="RRTMGP cloud optics") + ! + ! LUT coefficient dimensions + ! + nsize_cld = size(lut_extcld,dim=1) + nsize_drz = size(lut_extdrz,dim=1) + nsize_rain = size(lut_extrain,dim=1) + nsize_scol = size(lut_extscol,dim=1) + nsize_hcol = size(lut_exthcol,dim=1) + nsize_plate = size(lut_extplate,dim=1) + nsize_ros = size(lut_extros,dim=1) + nsize_agg = size(lut_extagg,dim=1) + nsize_hail = size(lut_exthail,dim=1) + nbnd = size(lut_extcld,dim=2) + ! + ! Error checking + ! Can we check for consistency between table bounds and _fac? + ! +! if(nbnd /= this%get_nband()) & +! error_msg = "cloud_optics%init(): number of bands inconsistent between lookup tables, spectral discretization" +! if(size(lut_extice, 2) /= nbnd) & +! error_msg = "cloud_optics%init(): array lut_extice has the wrong number of bands" +! if(.not. extents_are(lut_ssaliq, nsize_liq, nbnd)) & +! error_msg = "cloud_optics%init(): array lut_ssaliq isn't consistently sized" +! if(.not. extents_are(lut_asyliq, nsize_liq, nbnd)) & +! error_msg = "cloud_optics%init(): array lut_asyliq isn't consistently sized" +! if(.not. extents_are(lut_ssaice, nsize_ice, nbnd, nrghice)) & +! error_msg = "cloud_optics%init(): array lut_ssaice isn't consistently sized" +! if(.not. extents_are(lut_asyice, nsize_ice, nbnd, nrghice)) & +! error_msg = "cloud_optics%init(): array lut_asyice isn't consistently sized" +! if(error_msg /= "") return + + this%cld_nsteps = nsize_cld + this%drz_nsteps = nsize_drz + this%rain_nsteps = nsize_rain + this%scol_nsteps = nsize_scol + this%hcol_nsteps = nsize_hcol + this%plate_nsteps = nsize_plate + this%ros_nsteps = nsize_ros + this%agg_nsteps = nsize_agg + this%hail_nsteps = nsize_hail + this%cld_step_size = (radcld_upr - radcld_lwr)/real(nsize_cld-1,wp) + this%drz_step_size = (raddrz_upr - raddrz_lwr)/real(nsize_drz-1,wp) + this%rain_step_size = (radrain_upr - radrain_lwr)/real(nsize_rain-1,wp) + this%scol_step_size = (radscol_upr - radscol_lwr)/real(nsize_scol-1,wp) + this%hcol_step_size = (radhcol_upr - radhcol_lwr)/real(nsize_hcol-1,wp) + this%plate_step_size = (radplate_upr - radplate_lwr)/real(nsize_plate-1,wp) + this%ros_step_size = (radros_upr - radros_lwr)/real(nsize_ros-1,wp) + this%agg_step_size = (radagg_upr - radagg_lwr)/real(nsize_agg-1,wp) + this%hail_step_size = (radhail_upr - radhail_lwr)/real(nsize_hail-1,wp) + ! Allocate LUT coefficients + allocate(this%lut_extcld(nsize_cld, nbnd), & + this%lut_ssacld(nsize_cld, nbnd), & + this%lut_asycld(nsize_cld, nbnd), & + this%lut_extdrz(nsize_drz, nbnd), & + this%lut_ssadrz(nsize_drz, nbnd), & + this%lut_asydrz(nsize_drz, nbnd), & + this%lut_extrain(nsize_rain, nbnd), & + this%lut_ssarain(nsize_rain, nbnd), & + this%lut_asyrain(nsize_rain, nbnd), & + this%lut_extscol(nsize_scol, nbnd), & + this%lut_ssascol(nsize_scol, nbnd), & + this%lut_asyscol(nsize_scol, nbnd), & + this%lut_exthcol(nsize_hcol, nbnd), & + this%lut_ssahcol(nsize_hcol, nbnd), & + this%lut_asyhcol(nsize_hcol, nbnd), & + this%lut_extplate(nsize_plate, nbnd), & + this%lut_ssaplate(nsize_plate, nbnd), & + this%lut_asyplate(nsize_plate, nbnd), & + this%lut_extros(nsize_ros, nbnd), & + this%lut_ssaros(nsize_ros, nbnd), & + this%lut_asyros(nsize_ros, nbnd), & + this%lut_extagg(nsize_agg, nbnd), & + this%lut_ssaagg(nsize_agg, nbnd), & + this%lut_asyagg(nsize_agg, nbnd), & + this%lut_exthail(nsize_hail, nbnd), & + this%lut_ssahail(nsize_hail, nbnd), & + this%lut_asyhail(nsize_hail, nbnd)) + + !$acc enter data create(this) & + !$acc create(this%lut_extliq, this%lut_ssaliq, this%lut_asyliq) & + !$acc create(this%lut_extice, this%lut_ssaice, this%lut_asyice) + !$omp target enter data & + !$omp map(alloc:this%lut_extliq, this%lut_ssaliq, this%lut_asyliq) & + !$omp map(alloc:this%lut_extice, this%lut_ssaice, this%lut_asyice) + ! Load LUT constants + this%radcld_lwr = radcld_lwr + this%radcld_upr = radcld_upr + this%raddrz_lwr = raddrz_lwr + this%raddrz_upr = raddrz_upr + this%radrain_lwr = radrain_lwr + this%radrain_upr = radrain_upr + this%radscol_lwr = radscol_lwr + this%radscol_upr = radscol_upr + this%radhcol_lwr = radhcol_lwr + this%radhcol_upr = radhcol_upr + this%radplate_lwr = radplate_lwr + this%radplate_upr = radplate_upr + this%radros_lwr = radros_lwr + this%radros_upr = radros_upr + this%radagg_lwr = radagg_lwr + this%radagg_upr = radagg_upr + this%radhail_lwr = radhail_lwr + this%radhail_upr = radhail_upr + + ! Load LUT coefficients + !$acc kernels + !$omp target + this%lut_extcld = lut_extcld + this%lut_ssacld = lut_ssacld + this%lut_asycld = lut_asycld + this%lut_extdrz = lut_extdrz + this%lut_ssadrz = lut_ssadrz + this%lut_asydrz = lut_asydrz + this%lut_extrain = lut_extrain + this%lut_ssarain = lut_ssarain + this%lut_asyrain = lut_asyrain + this%lut_extscol = lut_extscol + this%lut_ssascol = lut_ssascol + this%lut_asyscol = lut_asyscol + this%lut_exthcol = lut_exthcol + this%lut_ssahcol = lut_ssahcol + this%lut_asyhcol = lut_asyhcol + this%lut_extplate = lut_extplate + this%lut_ssaplate = lut_ssaplate + this%lut_asyplate = lut_asyplate + this%lut_extros = lut_extros + this%lut_ssaros = lut_ssaros + this%lut_asyros = lut_asyros + this%lut_extagg = lut_extagg + this%lut_ssaagg = lut_ssaagg + this%lut_asyagg = lut_asyagg + this%lut_exthail = lut_exthail + this%lut_ssahail = lut_ssahail + this%lut_asyhail = lut_asyhail + !$acc end kernels + !$omp end target + end function load_lut + ! ------------------------------------------------------------------------------ + ! + ! Cloud optics initialization function - Pade + ! + ! ------------------------------------------------------------------------------ + function load_pade(this, band_lims_wvn, & + pade_extliq, pade_ssaliq, pade_asyliq, & + pade_extice, pade_ssaice, pade_asyice, & + pade_sizreg_extliq, pade_sizreg_ssaliq, pade_sizreg_asyliq, & + pade_sizreg_extice, pade_sizreg_ssaice, pade_sizreg_asyice) & + result(error_msg) + class(ty_cloud_optics), intent(inout) :: this ! cloud specification data + real(wp), dimension(:,:), intent(in ) :: band_lims_wvn ! Spectral discretization + ! + ! Pade coefficients: extinction, single-scattering albedo, and asymmetry factor for liquid and ice + ! + real(wp), dimension(:,:,:), intent(in) :: pade_extliq, pade_ssaliq, pade_asyliq + real(wp), dimension(:,:,:,:), intent(in) :: pade_extice, pade_ssaice, pade_asyice + ! + ! Boundaries of size regimes. Liquid and ice are separate; + ! extinction is fit to different numbers of size bins than single-scattering albedo and asymmetry factor + ! + real(wp), dimension(:), intent(in) :: pade_sizreg_extliq, pade_sizreg_ssaliq, pade_sizreg_asyliq + real(wp), dimension(:), intent(in) :: pade_sizreg_extice, pade_sizreg_ssaice, pade_sizreg_asyice + character(len=128) :: error_msg + +! ------- Local ------- + + integer :: nbnd, nrghice, nsizereg, ncoeff_ext, ncoeff_ssa_g, nbound + +! ------- Definitions ------- + + ! Pade coefficient dimensions + nbnd = size(pade_extliq,dim=1) + nsizereg = size(pade_extliq,dim=2) + ncoeff_ext = size(pade_extliq,dim=3) + ncoeff_ssa_g = size(pade_ssaliq,dim=3) + nrghice = size(pade_extice,dim=4) + nbound = size(pade_sizreg_extliq) + ! The number of size regimes is assumed in the Pade evaluations + if (nsizereg /= 3) & + error_msg = "cloud optics: code assumes exactly three size regimes for Pade approximants but data is otherwise" + error_msg = this%init(band_lims_wvn, name="RRTMGP cloud optics") + ! + ! Error checking + ! + if(nbnd /= this%get_nband()) & + error_msg = "cloud_optics%init(): number of bands inconsistent between lookup tables, spectral discretization" + if(.not. extents_are(pade_ssaliq, nbnd, nsizereg, ncoeff_ssa_g)) & + error_msg = "cloud_optics%init(): array pade_ssaliq isn't consistently sized" + if(.not. extents_are(pade_asyliq, nbnd, nsizereg, ncoeff_ssa_g)) & + error_msg = "cloud_optics%init(): array pade_asyliq isn't consistently sized" + if(.not. extents_are(pade_extice, nbnd, nsizereg, ncoeff_ext, nrghice)) & + error_msg = "cloud_optics%init(): array pade_extice isn't consistently sized" + if(.not. extents_are(pade_ssaice, nbnd, nsizereg, ncoeff_ssa_g, nrghice)) & + error_msg = "cloud_optics%init(): array pade_ssaice isn't consistently sized" + if(.not. extents_are(pade_asyice, nbnd, nsizereg, ncoeff_ssa_g, nrghice)) & + error_msg = "cloud_optics%init(): array pade_asyice isn't consistently sized" + if(any([ size(pade_sizreg_ssaliq), size(pade_sizreg_asyliq), & + size(pade_sizreg_extice), size(pade_sizreg_ssaice), size(pade_sizreg_asyice)] /= nbound)) & + error_msg = "cloud_optics%init(): one or more Pade size regime arrays are inconsistently sized" + if(nsizereg /= 3) & + error_msg = "cloud_optics%init(): Expecting precisely three size regimes for Pade approximants" + if(error_msg /= "") return + ! + ! Consistency among size regimes + ! + this%radliq_lwr = pade_sizreg_extliq(1) + this%radliq_upr = pade_sizreg_extliq(nbound) + this%radice_lwr = pade_sizreg_extice(1) + this%radice_upr = pade_sizreg_extice(nbound) + if(error_msg /= "") return + + if(any([pade_sizreg_ssaliq(1), pade_sizreg_asyliq(1)] < this%radliq_lwr)) & + error_msg = "cloud_optics%init(): one or more Pade size regimes have inconsistent lowest values" + if(any([pade_sizreg_ssaice(1), pade_sizreg_asyice(1)] < this%radice_lwr)) & + error_msg = "cloud_optics%init(): one or more Pade size regimes have inconsistent lower values" + + if(any([pade_sizreg_ssaliq(nbound), pade_sizreg_asyliq(nbound)] > this%radliq_upr)) & + error_msg = "cloud_optics%init(): one or more Pade size regimes have lowest value less than radliq_upr" + if(any([pade_sizreg_ssaice(nbound), pade_sizreg_asyice(nbound)] > this%radice_upr)) & + error_msg = "cloud_optics%init(): one or more Pade size regimes have lowest value less than radice_upr" + if(error_msg /= "") return + ! + ! Allocate Pade coefficients + ! + allocate(this%pade_extliq(nbnd, nsizereg, ncoeff_ext), & + this%pade_ssaliq(nbnd, nsizereg, ncoeff_ssa_g), & + this%pade_asyliq(nbnd, nsizereg, ncoeff_ssa_g), & + this%pade_extice(nbnd, nsizereg, ncoeff_ext, nrghice), & + this%pade_ssaice(nbnd, nsizereg, ncoeff_ssa_g, nrghice), & + this%pade_asyice(nbnd, nsizereg, ncoeff_ssa_g, nrghice)) + ! + ! Allocate Pade coefficient particle size regime boundaries + ! + allocate(this%pade_sizreg_extliq(nbound), & + this%pade_sizreg_ssaliq(nbound), & + this%pade_sizreg_asyliq(nbound), & + this%pade_sizreg_extice(nbound), & + this%pade_sizreg_ssaice(nbound), & + this%pade_sizreg_asyice(nbound)) + !$acc enter data create(this) & + !$acc create(this%pade_extliq, this%pade_ssaliq, this%pade_asyliq) & + !$acc create(this%pade_extice, this%pade_ssaice, this%pade_asyice) & + !$acc create(this%pade_sizreg_extliq, this%pade_sizreg_ssaliq, this%pade_sizreg_asyliq) & + !$acc create(this%pade_sizreg_extice, this%pade_sizreg_ssaice, this%pade_sizreg_asyice) + !$omp target enter data & + !$omp map(alloc:this%pade_extliq, this%pade_ssaliq, this%pade_asyliq) & + !$omp map(alloc:this%pade_extice, this%pade_ssaice, this%pade_asyice) & + !$omp map(alloc:this%pade_sizreg_extliq, this%pade_sizreg_ssaliq, this%pade_sizreg_asyliq) & + !$omp map(alloc:this%pade_sizreg_extice, this%pade_sizreg_ssaice, this%pade_sizreg_asyice) + ! + ! Load data + ! + !$acc kernels + !$omp target + this%pade_extliq = pade_extliq + this%pade_ssaliq = pade_ssaliq + this%pade_asyliq = pade_asyliq + this%pade_extice = pade_extice + this%pade_ssaice = pade_ssaice + this%pade_asyice = pade_asyice + this%pade_sizreg_extliq = pade_sizreg_extliq + this%pade_sizreg_ssaliq = pade_sizreg_ssaliq + this%pade_sizreg_asyliq = pade_sizreg_asyliq + this%pade_sizreg_extice = pade_sizreg_extice + this%pade_sizreg_ssaice = pade_sizreg_ssaice + this%pade_sizreg_asyice = pade_sizreg_asyice + !$acc end kernels + !$omp end target + ! + ! Set default ice roughness - min values + ! + error_msg = this%set_ice_roughness(1) + end function load_pade + !-------------------------------------------------------------------------------------------------------------------- + ! + ! Finalize + ! + !-------------------------------------------------------------------------------------------------------------------- + subroutine finalize(this) + class(ty_cloud_optics), intent(inout) :: this + + this%radliq_lwr = 0._wp + this%radliq_upr = 0._wp + this%radice_lwr = 0._wp + this%radice_upr = 0._wp + + ! Lookup table cloud optics coefficients + if(allocated(this%lut_extliq)) then + + !$acc exit data delete(this%lut_extliq, this%lut_ssaliq, this%lut_asyliq) & + !$acc delete(this%lut_extice, this%lut_ssaice, this%lut_asyice) & + !$acc delete(this) + !$omp target exit data map(release:this%lut_extliq, this%lut_ssaliq, this%lut_asyliq) & + !$omp map(release:this%lut_extice, this%lut_ssaice, this%lut_asyice) + + + deallocate(this%lut_extliq, this%lut_ssaliq, this%lut_asyliq, & + this%lut_extice, this%lut_ssaice, this%lut_asyice) + this%liq_nsteps = 0 + this%ice_nsteps = 0 + this%liq_step_size = 0._wp + this%ice_step_size = 0._wp + end if + + ! Pade cloud optics coefficients + if(allocated(this%pade_extliq)) then + + !$acc exit data delete(this%pade_extliq, this%pade_ssaliq, this%pade_asyliq) & + !$acc delete(this%pade_extice, this%pade_ssaice, this%pade_asyice) & + !$acc delete(this%pade_sizreg_extliq, this%pade_sizreg_ssaliq, this%pade_sizreg_asyliq) & + !$acc delete(this%pade_sizreg_extice, this%pade_sizreg_ssaice, this%pade_sizreg_asyice) & + !$acc delete(this) + !$omp target exit data map(release:this%pade_extliq, this%pade_ssaliq, this%pade_asyliq) & + !$omp map(release:this%pade_extice, this%pade_ssaice, this%pade_asyice) & + !$omp map(release:this%pade_sizreg_extliq, this%pade_sizreg_ssaliq, this%pade_sizreg_asyliq) & + !$omp map(release:this%pade_sizreg_extice, this%pade_sizreg_ssaice, this%pade_sizreg_asyice) + + deallocate(this%pade_extliq, this%pade_ssaliq, this%pade_asyliq, & + this%pade_extice, this%pade_ssaice, this%pade_asyice, & + this%pade_sizreg_extliq, this%pade_sizreg_ssaliq, this%pade_sizreg_asyliq, & + this%pade_sizreg_extice, this%pade_sizreg_ssaice, this%pade_sizreg_asyice) + end if + end subroutine finalize + ! ------------------------------------------------------------------------------ + ! + ! Derive cloud optical properties from provided cloud physical properties + ! + ! ------------------------------------------------------------------------------ + ! + ! Compute single-scattering properties + ! + function cloud_optics(this, & + clwp, reff, rcat, & + optical_props) result(error_msg) + class(ty_cloud_optics), & + intent(in ) :: this + real(wp), intent(in ) :: clwp (:,:,:), & ! cloud water path (g/m2) + reff (:,:,:) + integer, intent(in ) :: rcat (:,:,:) + class(ty_optical_props_arry), & + intent(inout) :: optical_props + ! Dimensions: (ncol,nlay,nbnd) + + character(len=128) :: error_msg + ! ------- Local ------- + logical(wl), dimension(size(clwp,1), size(clwp,2)) :: msk, liqmsk, icemsk + real(wp), dimension(size(clwp,1), size(clwp,2), this%get_nband()) :: & + ltau, ltaussa, ltaussag, itau, itaussa, itaussag + ! Optical properties: tau, tau*ssa, tau*ssa*g + ! liquid and ice separately + real(wp), dimension(size(clwp,1), size(clwp,2), this%get_nband(),size(clwp,3)) :: & + tau, taussa, taussag + integer :: ncol, nlay, nbnd, ncat + integer :: nsizereg + integer :: icol, ilay, ibnd, icat, ircat + ! scalars for total tau, tau*ssa + real(wp) :: tau_temp, taussa_temp + ! ---------------------------------------- + ! + ! Error checking + ! + ! ---------------------------------------- + + error_msg = '' + if(.not.(allocated(this%lut_extcld) .or. allocated(this%pade_extliq))) then + error_msg = 'cloud optics: no data has been initialized' + return + end if + + ncol = size(clwp,1) + nlay = size(clwp,2) + ncat = size(clwp,3) + nbnd = this%get_nband() + ! + ! Array sizes + ! +! if (check_extents) then +! if(size(liqmsk,1) /= ncol .or. size(liqmsk,2) /= nlay) & +! error_msg = "cloud optics: liqmask has wrong extents" +! if(size(icemsk,1) /= ncol .or. size(icemsk,2) /= nlay) & +! error_msg = "cloud optics: icemsk has wrong extents" +! if(size(ciwp, 1) /= ncol .or. size(ciwp, 2) /= nlay) & +! error_msg = "cloud optics: ciwp has wrong extents" +! if(size(reliq, 1) /= ncol .or. size(reliq, 2) /= nlay) & +! error_msg = "cloud optics: reliq has wrong extents" +! if(size(reice, 1) /= ncol .or. size(reice, 2) /= nlay) & +! error_msg = "cloud optics: reice has wrong extents" +! if(optical_props%get_ncol() /= ncol .or. optical_props%get_nlay() /= nlay) & +! error_msg = "cloud optics: optical_props have wrong extents" +! if(error_msg /= "") return +! end if + + ! + ! Spectral consistency + ! + if(check_values) then + if(.not. this%bands_are_equal(optical_props)) & + error_msg = "cloud optics: optical properties don't have the same band structure" + if(optical_props%get_nband() /= optical_props%get_ngpt() ) & + error_msg = "cloud optics: optical properties must be requested by band not g-points" + if(error_msg /= "") return + end if + + !$acc data copyin(clwp, ciwp, reliq, reice) & + !$acc create(ltau, ltaussa, ltaussag, itau, itaussa, itaussag) & + !$acc create(liqmsk,icemsk) + !$omp target data map(to:clwp, ciwp, reliq, reice) & + !$omp map(alloc:ltau, ltaussa, ltaussag, itau, itaussa, itaussag) & + !$omp map(alloc:liqmsk, icemsk) + ! + ! Cloud masks; don't need value re values if there's no cloud + ! + !$acc parallel loop gang vector default(present) collapse(2) + !$omp target teams distribute parallel do simd collapse(2) + + ! + ! Particle size, liquid/ice water paths + ! +! if(check_values) then +! if(any_vals_outside(reliq, liqmsk, this%radliq_lwr, this%radliq_upr)) & +! error_msg = 'cloud optics: liquid effective radius is out of bounds' +! if(any_vals_outside(reice, icemsk, this%radice_lwr, this%radice_upr)) & +! error_msg = 'cloud optics: ice effective radius is out of bounds' +! if(any_vals_less_than(clwp, liqmsk, 0._wp) .or. any_vals_less_than(ciwp, icemsk, 0._wp)) & +! error_msg = 'cloud optics: negative clwp or ciwp where clouds are supposed to be' +! end if + error_msg = "" + if(error_msg == "") then + ! + ! + ! ---------------------------------------- + ! + ! The tables and Pade coefficients determing extinction coeffient, single-scattering albedo, + ! and asymmetry parameter g as a function of effective raduis + ! We compute the optical depth tau (=exintinction coeff * condensed water path) + ! and the products tau*ssa and tau*ssa*g for liquid and ice cloud separately. + ! These are used to determine the optical properties of ice and water cloud together. + ! We could compute the properties for liquid and ice separately and + ! use ty_optical_props_arry%increment but this involves substantially more division. + ! + if (allocated(this%lut_extcld)) then + do icat = 1,ncat + + msk(:,:) = .false. + do ilay = 1, nlay + do icol = 1, ncol + msk(icol,ilay) = clwp(icol,ilay,icat) > 0._wp + end do + end do + + if (icat == 1) then !cloud + call compute_all_from_table(ncol, nlay, nbnd, msk, clwp(:,:,icat), reff(:,:,icat),& + this%cld_nsteps,this%cld_step_size,this%radcld_lwr, & + this%lut_extcld, this%lut_ssacld, this%lut_asycld, & + ltau, ltaussa, ltaussag) + + elseif (icat == 2) then !rain + call compute_all_from_table(ncol, nlay, nbnd, msk, clwp(:,:,icat), reff(:,:,icat),& + this%rain_nsteps,this%rain_step_size,this%radrain_lwr, & + this%lut_extrain, this%lut_ssarain, this%lut_asyrain, & + ltau, ltaussa, ltaussag) + + elseif (icat == 5) then !aggregates + call compute_all_from_table(ncol, nlay, nbnd, msk, clwp(:,:,icat), reff(:,:,icat),& + this%agg_nsteps,this%agg_step_size,this%radagg_lwr, & + this%lut_extagg, this%lut_ssaagg, this%lut_asyagg, & + ltau, ltaussa, ltaussag) + + elseif (icat == 6 .or. icat == 7) then !graupel or hail + call compute_all_from_table(ncol, nlay, nbnd, msk, clwp(:,:,icat), reff(:,:,icat),& + this%hail_nsteps,this%hail_step_size,this%radhail_lwr, & + this%lut_exthail, this%lut_ssahail, this%lut_asyhail, & + ltau, ltaussa, ltaussag) + + elseif (icat == 8) then !drizzle + call compute_all_from_table(ncol, nlay, nbnd, msk, clwp(:,:,icat), reff(:,:,icat),& + this%drz_nsteps,this%drz_step_size,this%raddrz_lwr, & + this%lut_extdrz, this%lut_ssadrz, this%lut_asydrz, & + ltau, ltaussa, ltaussag) + + else !pristine ice or snow + do ircat = 6,9 !The ice habits + do ilay = 1, nlay + do icol = 1, ncol + icemsk(icol,ilay) = (msk(icol,ilay) .and. rcat(icol,ilay,icat) == ircat) + end do + end do + + if (ircat == 6) then + call compute_all_from_table(ncol, nlay, nbnd, icemsk, clwp(:,:,icat), reff(:,:,icat),& + this%hcol_nsteps,this%hcol_step_size,this%radhcol_lwr, & + this%lut_exthcol, this%lut_ssahcol, this%lut_asyhcol, & + itau, itaussa, itaussag) + + elseif (ircat == 7) then + call compute_all_from_table(ncol, nlay, nbnd, icemsk, clwp(:,:,icat), reff(:,:,icat),& + this%scol_nsteps,this%scol_step_size,this%radscol_lwr, & + this%lut_extscol, this%lut_ssascol, this%lut_asyscol, & + itau, itaussa, itaussag) + + elseif (ircat == 8) then + call compute_all_from_table(ncol, nlay, nbnd, icemsk, clwp(:,:,icat), reff(:,:,icat),& + this%plate_nsteps,this%plate_step_size,this%radplate_lwr, & + this%lut_extplate, this%lut_ssaplate, this%lut_asyplate, & + itau, itaussa, itaussag) + + elseif (ircat == 9) then + call compute_all_from_table(ncol, nlay, nbnd, icemsk, clwp(:,:,icat), reff(:,:,icat),& + this%ros_nsteps,this%ros_step_size,this%radros_lwr, & + this%lut_extros, this%lut_ssaros, this%lut_asyros, & + itau, itaussa, itaussag) + + endif + ltau = ltau + itau + ltaussa = ltaussa + itaussa + ltaussag = ltaussag + itaussag + enddo + endif + tau(:,:,:,icat) = ltau + taussa(:,:,:,icat) = ltaussa + taussag(:,:,:,icat) = ltaussag + enddo + !Adele - this isn't terribly efficient, should make this a function + ! + ! Combine liquid and ice contributions into total cloud optical properties + ! See also the increment routines in mo_optical_props_kernels + ! + select type(optical_props) + type is (ty_optical_props_1scl) + !$acc parallel loop gang vector default(present) collapse(3) & + !$acc copyin(optical_props) copyout(optical_props%tau) + !$omp target teams distribute parallel do simd collapse(3) & + !$omp map(from:optical_props%tau) + do ibnd = 1, nbnd + do ilay = 1, nlay + do icol = 1,ncol + ! Absorption optical depth = (1-ssa) * tau = tau - taussa + optical_props%tau(icol,ilay,ibnd) = sum(tau(icol,ilay,ibnd,:)) - sum(taussa(icol,ilay,ibnd,:)) + end do + end do + end do + type is (ty_optical_props_2str) + !$acc parallel loop gang vector default(present) collapse(3) & + !$acc copyin(optical_props) copyout(optical_props%tau, optical_props%ssa, optical_props%g) + !$omp target teams distribute parallel do simd collapse(3) & + !$omp map(from:optical_props%tau, optical_props%ssa, optical_props%g) + do ibnd = 1, nbnd + do ilay = 1, nlay + do icol = 1,ncol + tau_temp = sum(tau(icol,ilay,ibnd,:)) + taussa_temp = sum(taussa(icol,ilay,ibnd,:)) + optical_props%g (icol,ilay,ibnd) = sum(taussag(icol,ilay,ibnd,:)) / & + max(epsilon(tau_temp), taussa_temp) + optical_props%ssa(icol,ilay,ibnd) = taussa_temp/max(epsilon(tau_temp), tau_temp) + optical_props%tau(icol,ilay,ibnd) = tau_temp + end do + end do + end do + type is (ty_optical_props_nstr) + error_msg = "cloud optics: n-stream calculations not yet supported" + end select + else + error_msg = "cloud optics: no method to calculate cloud optical properties" +!Pade coefficient method not implemented for RAMS categories + ! + ! Cloud optical properties from Pade coefficient method + ! Hard coded assumptions: order of approximants, three size regimes + ! +! nsizereg = size(this%pade_extliq,2) +! call compute_all_from_pade(ncol, nlay, nbnd, nsizereg, & +! liqmsk, clwp, reliq, & +! 2, 3, this%pade_sizreg_extliq, this%pade_extliq, & +! 2, 2, this%pade_sizreg_ssaliq, this%pade_ssaliq, & +! 2, 2, this%pade_sizreg_asyliq, this%pade_asyliq, & +! ltau, ltaussa, ltaussag) +! call compute_all_from_pade(ncol, nlay, nbnd, nsizereg, & +! icemsk, ciwp, reice, & +! 2, 3, this%pade_sizreg_extice, this%pade_extice(:,:,:,this%icergh), & +! 2, 2, this%pade_sizreg_ssaice, this%pade_ssaice(:,:,:,this%icergh), & +! 2, 2, this%pade_sizreg_asyice, this%pade_asyice(:,:,:,this%icergh), & +! itau, itaussa, itaussag) + ! + ! Combine liquid and ice contributions into total cloud optical properties + ! See also the increment routines in mo_optical_props_kernels + ! + endif + + end if + !$acc end data + !$omp end target data + end function cloud_optics + !-------------------------------------------------------------------------------------------------------------------- + ! + ! Inquiry functions + ! + !-------------------------------------------------------------------------------------------------------------------- + function set_ice_roughness(this, icergh) result(error_msg) + class(ty_cloud_optics), intent(inout) :: this + integer, intent(in ) :: icergh + character(len=128) :: error_msg + + error_msg = "" + if(.not. allocated(this%pade_extice) .and. .not. allocated(this%lut_extice )) & + error_msg = "cloud_optics%set_ice_roughness(): can't set before initialization" + if (icergh < 1 .or. icergh > this%get_num_ice_roughness_types()) & + error_msg = 'cloud optics: cloud ice surface roughness flag is out of bounds' + if(error_msg /= "") return + + this%icergh = icergh + end function set_ice_roughness + !----------------------------------------------- + function get_num_ice_roughness_types(this) result(i) + class(ty_cloud_optics), intent(in ) :: this + integer :: i + + stop 'this function isnt used currently by RAMS' + !i = 0 + !if(allocated(this%pade_extice)) i = size(this%pade_extice, dim=4) + !if(allocated(this%lut_extice )) i = size(this%lut_extice, dim=3) + end function get_num_ice_roughness_types + !----------------------------------------------- + function get_min_radius_liq(this) result(r) + class(ty_cloud_optics), intent(in ) :: this + real(wp) :: r + + r = this%radliq_lwr + end function get_min_radius_liq + !----------------------------------------------- + function get_max_radius_liq(this) result(r) + class(ty_cloud_optics), intent(in ) :: this + real(wp) :: r + + r = this%radliq_upr + end function get_max_radius_liq + !----------------------------------------------- + function get_min_radius_ice(this) result(r) + class(ty_cloud_optics), intent(in ) :: this + real(wp) :: r + + r = this%radice_lwr + end function get_min_radius_ice + !----------------------------------------------- + function get_max_radius_ice(this) result(r) + class(ty_cloud_optics), intent(in ) :: this + real(wp) :: r + + r = this%radice_upr + end function get_max_radius_ice + !-------------------------------------------------------------------------------------------------------------------- + ! + ! Ancillary functions + ! + !-------------------------------------------------------------------------------------------------------------------- + ! + ! Linearly interpolate values from a lookup table with "nsteps" evenly-spaced + ! elements starting at "offset." The table's second dimension is band. + ! Returns 0 where the mask is false. + ! We could also try gather/scatter for efficiency + ! + subroutine compute_all_from_table(ncol, nlay, nbnd, mask, lwp, re, & + nsteps, step_size, offset, & + tau_table, ssa_table, asy_table, & + tau, taussa, taussag) + integer, intent(in) :: ncol, nlay, nbnd, nsteps + logical(wl), dimension(ncol,nlay), intent(in) :: mask + real(wp), dimension(ncol,nlay), intent(in) :: lwp, re + real(wp), intent(in) :: step_size, offset + real(wp), dimension(nsteps, nbnd), intent(in) :: tau_table, ssa_table, asy_table + real(wp), dimension(ncol,nlay,nbnd) :: tau, taussa, taussag + ! --------------------------- + integer :: icol, ilay, ibnd + integer :: index + real(wp) :: fint + real(wp) :: t, ts ! tau, tau*ssa, tau*ssa*g + ! --------------------------- + !$acc parallel loop gang vector default(present) collapse(3) + !$omp target teams distribute parallel do simd collapse(3) + do ibnd = 1, nbnd + do ilay = 1,nlay + do icol = 1, ncol + if(mask(icol,ilay)) then + index = min(floor((re(icol,ilay) - offset)/step_size)+1, nsteps-1) + fint = min((re(icol,ilay) - offset)/step_size - (index-1),1.) + t = lwp(icol,ilay) * & + (tau_table(index, ibnd) + fint * (tau_table(index+1,ibnd) - tau_table(index,ibnd))) + ts = t * & + (ssa_table(index, ibnd) + fint * (ssa_table(index+1,ibnd) - ssa_table(index,ibnd))) + taussag(icol,ilay,ibnd) = & + ts * & + (asy_table(index, ibnd) + fint * (asy_table(index+1,ibnd) - asy_table(index,ibnd))) + taussa (icol,ilay,ibnd) = ts + tau (icol,ilay,ibnd) = t + else + tau (icol,ilay,ibnd) = 0._wp + taussa (icol,ilay,ibnd) = 0._wp + taussag(icol,ilay,ibnd) = 0._wp + end if + end do + end do + end do + end subroutine compute_all_from_table + ! + ! Pade functions + ! + !--------------------------------------------------------------------------- + subroutine compute_all_from_pade(ncol, nlay, nbnd, nsizes, & + mask, lwp, re, & + m_ext, n_ext, re_bounds_ext, coeffs_ext, & + m_ssa, n_ssa, re_bounds_ssa, coeffs_ssa, & + m_asy, n_asy, re_bounds_asy, coeffs_asy, & + tau, taussa, taussag) + integer, intent(in) :: ncol, nlay, nbnd, nsizes + logical(wl), & + dimension(ncol,nlay), intent(in) :: mask + real(wp), dimension(ncol,nlay), intent(in) :: lwp, re + real(wp), dimension(nsizes+1), intent(in) :: re_bounds_ext, re_bounds_ssa, re_bounds_asy + integer, intent(in) :: m_ext, n_ext + real(wp), dimension(nbnd,nsizes,0:m_ext+n_ext), & + intent(in) :: coeffs_ext + integer, intent(in) :: m_ssa, n_ssa + real(wp), dimension(nbnd,nsizes,0:m_ssa+n_ssa), & + intent(in) :: coeffs_ssa + integer, intent(in) :: m_asy, n_asy + real(wp), dimension(nbnd,nsizes,0:m_asy+n_asy), & + intent(in) :: coeffs_asy + real(wp), dimension(ncol,nlay,nbnd) :: tau, taussa, taussag + ! --------------------------- + integer :: icol, ilay, ibnd, irad + real(wp) :: t, ts + + !$acc parallel loop gang vector default(present) collapse(3) + !$omp target teams distribute parallel do simd collapse(3) + do ibnd = 1, nbnd + do ilay = 1, nlay + do icol = 1, ncol + if(mask(icol,ilay)) then + ! + ! Finds index into size regime table + ! This works only if there are precisely three size regimes (four bounds) and it's + ! previously guaranteed that size_bounds(1) <= size <= size_bounds(4) + ! + irad = min(floor((re(icol,ilay) - re_bounds_ext(2))/re_bounds_ext(3))+2, 3) + t = lwp(icol,ilay) * & + pade_eval(ibnd, nbnd, nsizes, m_ext, n_ext, irad, re(icol,ilay), coeffs_ext) + + irad = min(floor((re(icol,ilay) - re_bounds_ssa(2))/re_bounds_ssa(3))+2, 3) + ! Pade approximants for co-albedo can sometimes be negative + ts = t * (1._wp - max(0._wp, & + pade_eval(ibnd, nbnd, nsizes, m_ssa, n_ssa, irad, re(icol,ilay), coeffs_ssa))) + + irad = min(floor((re(icol,ilay) - re_bounds_asy(2))/re_bounds_asy(3))+2, 3) + taussag(icol,ilay,ibnd) = & + ts * & + pade_eval(ibnd, nbnd, nsizes, m_asy, n_asy, irad, re(icol,ilay), coeffs_asy) + + taussa (icol,ilay,ibnd) = ts + tau (icol,ilay,ibnd) = t + else + tau (icol,ilay,ibnd) = 0._wp + taussa (icol,ilay,ibnd) = 0._wp + taussag(icol,ilay,ibnd) = 0._wp + end if + end do + end do + end do + + end subroutine compute_all_from_pade + !--------------------------------------------------------------------------- + ! + ! Evaluate Pade approximant of order [m/n] + ! + function pade_eval_nbnd(nbnd, nrads, m, n, irad, re, pade_coeffs) + integer, intent(in) :: nbnd, nrads, m, n, irad + real(wp), dimension(nbnd, nrads, 0:m+n), & + intent(in) :: pade_coeffs + real(wp), intent(in) :: re + real(wp), dimension(nbnd) :: pade_eval_nbnd + + integer :: iband + real(wp) :: numer, denom + integer :: i + + do iband = 1, nbnd + denom = pade_coeffs(iband,irad,n+m) + do i = n-1+m, 1+m, -1 + denom = pade_coeffs(iband,irad,i)+re*denom + end do + denom = 1._wp +re*denom + + numer = pade_coeffs(iband,irad,m) + do i = m-1, 1, -1 + numer = pade_coeffs(iband,irad,i)+re*numer + end do + numer = pade_coeffs(iband,irad,0) +re*numer + + pade_eval_nbnd(iband) = numer/denom + end do + end function pade_eval_nbnd + !--------------------------------------------------------------------------- + ! + ! Evaluate Pade approximant of order [m/n] + ! + function pade_eval_1(iband, nbnd, nrads, m, n, irad, re, pade_coeffs) + !$acc routine seq + !$omp declare target + ! + integer, intent(in) :: iband, nbnd, nrads, m, n, irad + real(wp), dimension(nbnd, nrads, 0:m+n), & + intent(in) :: pade_coeffs + real(wp), intent(in) :: re + real(wp) :: pade_eval_1 + + real(wp) :: numer, denom + integer :: i + + denom = pade_coeffs(iband,irad,n+m) + do i = n-1+m, 1+m, -1 + denom = pade_coeffs(iband,irad,i)+re*denom + end do + denom = 1._wp +re*denom + + numer = pade_coeffs(iband,irad,m) + do i = m-1, 1, -1 + numer = pade_coeffs(iband,irad,i)+re*numer + end do + numer = pade_coeffs(iband,irad,0) +re*numer + + pade_eval_1 = numer/denom + end function pade_eval_1 +end module mo_cloud_optics diff --git a/src/radiate/rte-rrtmgp/extensions/cloud_optics/mo_cloud_sampling.F90 b/src/radiate/rte-rrtmgp/extensions/cloud_optics/mo_cloud_sampling.F90 new file mode 100644 index 0000000..f2359b0 --- /dev/null +++ b/src/radiate/rte-rrtmgp/extensions/cloud_optics/mo_cloud_sampling.F90 @@ -0,0 +1,315 @@ +! This code is part of RRTM for GCM Applications - Parallel (RRTMGP) +! +! Contacts: Robert Pincus and Eli Mlawer +! email: rrtmgp@aer.com +! +! Copyright 2015-2019, Atmospheric and Environmental Research and +! Regents of the University of Colorado. All right reserved. +! +! Use and duplication is permitted under the terms of the +! BSD 3-clause license, see http://opensource.org/licenses/BSD-3-Clause +! ------------------------------------------------------------------------------------------------- +! +! This module provides a simple implementation of sampling for the +! Monte Carlo Independent Pixel Approximation (McICA, doi:10.1029/2002jd003322) +! Cloud optical properties, defined by band and assumed homogenous within each cell (column/layer), +! are randomly sampled to preserve the mean cloud fraction and one of several possible overlap assumptions +! Users supply random numbers with order ngpt,nlay,ncol +! These are only accessed if cloud_fraction(icol,ilay) > 0 so many values don't need to be filled in +! +! ------------------------------------------------------------------------------------------------- +module mo_cloud_sampling + use mo_rte_kind, only: wp, wl + use mo_optical_props, only: ty_optical_props_arry, & + ty_optical_props_1scl, & + ty_optical_props_2str, & + ty_optical_props_nstr + implicit none + private + public :: draw_samples, sampled_mask_max_ran, sampled_mask_exp_ran +contains + ! ------------------------------------------------------------------------------------------------- + ! + ! Apply a T/F sampled cloud mask to cloud optical properties defined by band to produce + ! McICA-sampled cloud optical properties + ! + function draw_samples(cloud_mask,clouds,clouds_sampled) result(error_msg) + logical, dimension(:,:,:), intent(in ) :: cloud_mask ! Dimensions ncol,nlay,ngpt + class(ty_optical_props_arry), intent(in ) :: clouds ! Defined by band + class(ty_optical_props_arry), intent(inout) :: clouds_sampled ! Defined by g-point + character(len=128) :: error_msg + ! ------------------------ + integer :: ncol,nlay,nbnd,ngpt + integer :: imom + ! ------------------------ + ! + ! Error checking + ! + error_msg = "" + if(.not. clouds%is_initialized()) then + error_msg = "draw_samples: cloud optical properties are not initialized" + return + end if + if(.not. clouds_sampled%is_initialized()) then + error_msg = "draw_samples: sampled cloud optical properties are not initialized" + return + end if + + ! + ! Variables clouds and clouds_sampled have to be of the same type (have the same set of fields) + ! nstr isn't supported + ! 2str is checked at assignment + ! + select type(clouds) + type is (ty_optical_props_1scl) + select type(clouds_sampled) + type is (ty_optical_props_2str) + error_msg = "draw_samples: by-band and sampled cloud properties need to be the same variable type" + return + type is (ty_optical_props_nstr) + error_msg = "draw_samples: by-band and sampled cloud properties need to be the same variable type" + return + end select + type is (ty_optical_props_nstr) + error_msg = "draw_samples: sampling isn't implemented yet for ty_optical_props_nstr" + return + end select + + ! + ! Spectral discretization + ! + if(.not. clouds%bands_are_equal(clouds_sampled)) then + error_msg = "draw_samples: by-band and sampled cloud properties spectral structure is different" + return + end if + + ! + ! Array extents + ! + ncol = clouds%get_ncol() + nlay = clouds%get_nlay() + nbnd = clouds%get_nband() + ngpt = clouds_sampled%get_ngpt() + if (any([size(cloud_mask,1), size(cloud_mask,2), size(cloud_mask,3)] /= [ncol,nlay,ngpt])) then + error_msg = "draw_samples: cloud mask and cloud optical properties have different ncol, nlay and/or ngpt" + return + end if + if (any([clouds_sampled%get_ncol(), clouds_sampled%get_nlay()] /= [ncol,nlay])) then + error_msg = "draw_samples: sampled/unsampled cloud optical properties have different ncol and/or nlay" + return + end if + ! ------------------------ + ! + ! Finally - sample fields according to the cloud mask + ! + ! Optical depth assignment works for 1scl, 2str (also nstr) + call apply_cloud_mask(ncol,nlay,nbnd,ngpt,clouds_sampled%get_band_lims_gpoint(),cloud_mask,clouds%tau,clouds_sampled%tau) + ! + ! For 2-stream + ! + select type(clouds) + type is (ty_optical_props_2str) + select type(clouds_sampled) + type is (ty_optical_props_2str) + call apply_cloud_mask(ncol,nlay,nbnd,ngpt,clouds_sampled%get_band_lims_gpoint(),cloud_mask,clouds%ssa,clouds_sampled%ssa) + call apply_cloud_mask(ncol,nlay,nbnd,ngpt,clouds_sampled%get_band_lims_gpoint(),cloud_mask,clouds%g, clouds_sampled%g ) + class default + error_msg = "draw_samples: by-band and sampled cloud properties need to be the same variable type" + end select + end select + end function draw_samples + ! ------------------------------------------------------------------------------------------------- + ! + ! Generate a McICA-sampled cloud mask for maximum-random overlap + ! + function sampled_mask_max_ran(randoms,cloud_frac,cloud_mask) result(error_msg) + real(wp), dimension(:,:,:), intent(in ) :: randoms ! ngpt,nlay,ncol + real(wp), dimension(:,:), intent(in ) :: cloud_frac ! ncol,nlay + logical, dimension(:,:,:), intent(out) :: cloud_mask ! ncol,nlay,ngpt + character(len=128) :: error_msg + ! ------------------------ + integer :: ncol, nlay, ngpt, icol, ilay, igpt + integer :: cloud_lay_fst, cloud_lay_lst + real(wp), dimension(size(randoms,1)) :: local_rands + logical, dimension(size(randoms,2)) :: cloud_mask_layer + ! ------------------------ + ! + ! Error checking + ! + error_msg = "" + ncol = size(randoms, 3) + nlay = size(randoms, 2) + ngpt = size(randoms, 1) + if(any([ncol,nlay] /= [size(cloud_frac, 1),size(cloud_frac, 2)])) then + error_msg = "sampled_mask_max_ran: sizes of randoms(ngpt,nlay,ncol) and cloud_frac(ncol,nlay) are inconsistent" + return + end if + if(any([ncol,nlay,ngpt] /= [size(cloud_mask, 1),size(cloud_mask, 2), size(cloud_mask,3)])) then + error_msg = "sampled_mask_max_ran: sizes of randoms(ngpt,nlay,ncol) and cloud_mask(ncol,nlay,ngpt) are inconsistent" + return + end if + if(any(cloud_frac > 1._wp) .or. any(cloud_frac < 0._wp)) then + error_msg = "sampled_mask_max_ran: cloud fraction values out of range [0,1]" + return + end if + ! + ! We chould check the random numbers but that would be computationally heavy + ! + ! ------------------------ + ! + ! Construct the cloud mask for each column + ! + do icol = 1, ncol + cloud_mask_layer(1:nlay) = cloud_frac(icol,1:nlay) > 0._wp + if(.not. any(cloud_mask_layer)) then + cloud_mask(icol,1:nlay,1:ngpt) = .false. + cycle + end if + cloud_lay_fst = findloc(cloud_mask_layer, .true., dim=1) + cloud_lay_lst = findloc(cloud_mask_layer, .true., dim=1, back = .true.) + cloud_mask(icol,1:cloud_lay_fst-1,1:ngpt) = .false. + + ilay = cloud_lay_fst + local_rands(1:ngpt) = randoms(1:ngpt,ilay,icol) + cloud_mask(icol,ilay,1:ngpt) = local_rands(1:ngpt) > (1._wp - cloud_frac(icol,ilay)) + do ilay = cloud_lay_fst+1, cloud_lay_lst + if(cloud_mask_layer(ilay)) then + ! + ! Max-random overlap: + ! new random deviates if the adjacent layer isn't cloudy + ! same random deviates if the adjacent layer is cloudy + ! + if(.not. cloud_mask_layer(ilay-1)) local_rands(1:ngpt) = randoms(1:ngpt,ilay,icol) + cloud_mask(icol,ilay,1:ngpt) = local_rands(1:ngpt) > (1._wp - cloud_frac(icol,ilay)) + else + cloud_mask(icol,ilay,1:ngpt) = .false. + end if + end do + + cloud_mask(icol,cloud_lay_lst+1:nlay,1:ngpt) = .false. + end do + + end function sampled_mask_max_ran + ! ------------------------------------------------------------------------------------------------- + ! + ! Generate a McICA-sampled cloud mask for exponential-random overlap. + ! The overlap parameter overlap_param is defined between pairs of layers. + ! For layer i, overlap_param(i) describes the overlap between cloud_frac(i) and cloud_frac(i+1). + ! It is a correlation coefficient in [-1,1]. E.g., + ! +1 gives perfect correlation or maximum cloud overlap between layers i & i+1; + ! 0 gives no correlation or random cloud overlap between layers i & i+1; + ! -1 gives perfect anticorrelation or minimum cloud overlap between layers i & i+1. + ! By skipping layers with zero cloud fraction the code effectively forces overlap_param(i) = 0 + ! for cloud_frac(i) = 0, leading to random cloud overlap across clear layers. + ! + function sampled_mask_exp_ran(randoms,cloud_frac,overlap_param,cloud_mask) result(error_msg) + real(wp), dimension(:,:,:), intent(in ) :: randoms ! ngpt,nlay,ncol + real(wp), dimension(:,:), intent(in ) :: cloud_frac ! ncol,nlay + real(wp), dimension(:,:), intent(in ) :: overlap_param ! ncol,nlay-1 + logical, dimension(:,:,:), intent(out) :: cloud_mask ! ncol,nlay,ngpt + character(len=128) :: error_msg + ! ------------------------ + integer :: ncol, nlay, ngpt, icol, ilay, igpt + integer :: cloud_lay_fst, cloud_lay_lst + real(wp) :: rho ! correlation coefficient + real(wp), dimension(size(randoms,1)) :: local_rands + logical, dimension(size(randoms,2)) :: cloud_mask_layer + ! ------------------------ + ! + ! Error checking + ! + error_msg = "" + ncol = size(randoms, 3) + nlay = size(randoms, 2) + ngpt = size(randoms, 1) + if(any([ncol,nlay] /= [size(cloud_frac, 1),size(cloud_frac, 2)])) then + error_msg = "sampled_mask_exp_ran: sizes of randoms(ngpt,nlay,ncol) and cloud_frac(ncol,nlay) are inconsistent" + return + end if + if(any([ncol,nlay-1] /= [size(overlap_param, 1),size(overlap_param, 2)])) then + error_msg = "sampled_mask_exp_ran: sizes of randoms(ngpt,nlay,ncol) and overlap_param(ncol,nlay-1) are inconsistent" + return + end if + if(any([ncol,nlay,ngpt] /= [size(cloud_mask, 1),size(cloud_mask, 2), size(cloud_mask,3)])) then + error_msg = "sampled_mask_exp_ran: sizes of randoms(ngpt,nlay,ncol) and cloud_mask(ncol,nlay,ngpt) are inconsistent" + return + end if + + if(any(cloud_frac > 1._wp) .or. any(cloud_frac < 0._wp)) then + error_msg = "sampled_mask_exp_ran: cloud fraction values out of range [0,1]" + return + end if + if(any(overlap_param > 1._wp) .or. any(overlap_param < -1._wp)) then + error_msg = "sampled_mask_exp_ran: overlap_param values out of range [-1,1]" + return + end if + ! + ! We chould check the random numbers but that would be computationally heavy + ! + ! ------------------------ + ! Construct the cloud mask for each column + ! + do icol = 1, ncol + cloud_mask_layer(1:nlay) = cloud_frac(icol,1:nlay) > 0._wp + if(.not. any(cloud_mask_layer)) then + cloud_mask(icol,1:nlay,1:ngpt) = .false. + cycle + end if + cloud_lay_fst = findloc(cloud_mask_layer, .true., dim=1) + cloud_lay_lst = findloc(cloud_mask_layer, .true., dim=1, back = .true.) + cloud_mask(icol,1:cloud_lay_fst-1,1:ngpt) = .false. + + ilay = cloud_lay_fst + local_rands(1:ngpt) = randoms(1:ngpt,ilay,icol) + cloud_mask(icol,ilay,1:ngpt) = local_rands(1:ngpt) > (1._wp - cloud_frac(icol,ilay)) + do ilay = cloud_lay_fst+1, cloud_lay_lst + if(cloud_mask_layer(ilay)) then + ! + ! Exponential-random overlap: + ! new random deviates if the adjacent layer isn't cloudy + ! correlated deviates if the adjacent layer is cloudy + ! + if(cloud_mask_layer(ilay-1)) then + ! + ! Create random deviates correlated between this layer and the previous layer + ! (have to remove mean value before enforcing correlation) + ! + rho = overlap_param(icol,ilay-1) + local_rands(1:ngpt) = rho*(local_rands(1:ngpt) -0.5_wp) + & + sqrt(1._wp-rho*rho)*(randoms(1:ngpt,ilay,icol)-0.5_wp) + 0.5_wp + else + local_rands(1:ngpt) = randoms(1:ngpt,ilay,icol) + end if + cloud_mask(icol,ilay,1:ngpt) = local_rands(1:ngpt) > (1._wp - cloud_frac(icol,ilay)) + else + cloud_mask(icol,ilay,1:ngpt) = .false. + end if + end do + + cloud_mask(icol,cloud_lay_lst+1:nlay,1:ngpt) = .false. + end do + + end function sampled_mask_exp_ran + ! ------------------------------------------------------------------------------------------------- + ! + ! Apply a true/false cloud mask to a homogeneous field + ! This could be a kernel + ! + subroutine apply_cloud_mask(ncol,nlay,nbnd,ngpt,band_lims_gpt,cloud_mask,input_field,sampled_field) + integer, intent(in ) :: ncol,nlay,nbnd,ngpt + integer, dimension(2,nbnd), intent(in ) :: band_lims_gpt + logical, dimension(ncol,nlay,ngpt), intent(in ) :: cloud_mask + real(wp), dimension(ncol,nlay,nbnd), intent(in ) :: input_field + real(wp), dimension(ncol,nlay,ngpt), intent(out) :: sampled_field + + integer :: icol,ilay,ibnd,igpt + + do ibnd = 1, nbnd + do igpt = band_lims_gpt(1,ibnd), band_lims_gpt(2,ibnd) + do ilay = 1, nlay + sampled_field(1:ncol,ilay,igpt) = merge(input_field(1:ncol,ilay,ibnd), 0._wp, cloud_mask(1:ncol,ilay,igpt)) + end do + end do + end do + end subroutine apply_cloud_mask +end module mo_cloud_sampling diff --git a/src/radiate/rte-rrtmgp/extensions/cloud_optics/rrtmgp-cloud-optics-coeffs-lw.nc b/src/radiate/rte-rrtmgp/extensions/cloud_optics/rrtmgp-cloud-optics-coeffs-lw.nc new file mode 100644 index 0000000..f3cb190 Binary files /dev/null and b/src/radiate/rte-rrtmgp/extensions/cloud_optics/rrtmgp-cloud-optics-coeffs-lw.nc differ diff --git a/src/radiate/rte-rrtmgp/extensions/cloud_optics/rrtmgp-cloud-optics-coeffs-reordered-sw.nc b/src/radiate/rte-rrtmgp/extensions/cloud_optics/rrtmgp-cloud-optics-coeffs-reordered-sw.nc new file mode 100644 index 0000000..2a98593 Binary files /dev/null and b/src/radiate/rte-rrtmgp/extensions/cloud_optics/rrtmgp-cloud-optics-coeffs-reordered-sw.nc differ diff --git a/src/radiate/rte-rrtmgp/extensions/mo_compute_bc.F90 b/src/radiate/rte-rrtmgp/extensions/mo_compute_bc.F90 new file mode 100644 index 0000000..f5e9d32 --- /dev/null +++ b/src/radiate/rte-rrtmgp/extensions/mo_compute_bc.F90 @@ -0,0 +1,247 @@ +module mo_compute_bc + ! This code is part of RRTM for GCM Applications - Parallel (RRTMGP) + ! + ! Contacts: Robert Pincus and Eli Mlawer + ! email: rrtmgp@aer.com + ! + ! Copyright 2018, Atmospheric and Environmental Research and + ! Regents of the University of Colorado. All right reserved. + ! + ! Use and duplication is permitted under the terms of the + ! BSD 3-clause license, see http://opensource.org/licenses/BSD-3-Clause + ! ------------------------------------------------------------------------------------------------- + ! This modules lets users determine upper boundary condition by + ! computing the spectrally-resolved fluxes at the bottom of an isothermal layer + ! extending from the lowest supplied pressure to the minimum pressure allowed by + ! RRTMGP. + ! This is only sensible if the user's domain extends nearly to the top of the atmosphere. + ! Adding this thin extra layer makes heating rates in the top-most layer more reasonable + ! especially in the longwave + ! The boundary condition is on diffuse flux in the LW and direct flux in the SW + ! ------------------------------------------------------------------------------------------------- + use mo_rte_kind, only: wp, wl + use mo_rte_config, only: check_extents + use mo_rte_util_array, only: extents_are + use mo_source_functions, only: ty_source_func_lw + use mo_gas_concentrations, only: ty_gas_concs + use mo_optical_props, only: ty_optical_props, ty_optical_props_arry, & + ty_optical_props_1scl, ty_optical_props_2str + use mo_gas_optics, only: ty_gas_optics + use mo_fluxes, only: ty_fluxes + use mo_rte_lw, only: rte_lw + use mo_rte_sw, only: rte_sw + implicit none + private + public :: compute_bc + + ! + ! Extend ty_fluxes to report spectrally-resolved downwelling flux at a single layer + ! + type, extends(ty_fluxes) :: ty_fluxes_1lev + real(wp), dimension(:,:), pointer :: gpt_flux_dn => NULL() ! (ncol, nlev, nband) + contains + procedure :: reduce => reduce_1lev + procedure :: are_desired => are_desired_1lev + end type ty_fluxes_1lev +contains + !-------------------------------------------------------------------------------------------------------------------- + ! + ! The arguments to this routine follow those to the gas_optics routines + ! + function compute_bc(k_dist, & + play, plev, tlay, gas_concs, & + flux_bc, mu0) result(error_msg) + class(ty_gas_optics), intent(in ) :: k_dist + real(wp), dimension(:,:), intent(in ) :: play, & ! layer pressures [Pa, mb]; (ncol,nlay) + plev, & ! level pressures [Pa, mb]; (ncol,nlay+1) + tlay ! layer temperatures [K]; (ncol,nlay) + type(ty_gas_concs), intent(in ) :: gas_concs ! Gas volume mixing ratios + real(wp), dimension(:,:), target, & + intent( out) :: flux_bc ! Boundary condition to be applied (ncol,ngpt) + real(wp), dimension(:), optional, & + intent(in ) :: mu0 ! Must be provided for solar problems + character(len=128) :: error_msg + ! ---------------------------------------------------------- + ! + ! Local variables + ! + integer :: top_at_1 + integer :: ncol, nlay, ngpt + + integer :: igas, ngases + character(len=32), dimension(:), allocatable :: gas_names + real(wp), dimension(size(play,1), size(play,2)) :: vmr + + integer :: top_lay + real(wp), dimension(size(play,1), 1) :: play_1lay, tlay_1lay + real(wp), dimension(size(play,1), 2) :: plev_1lay, tlev_1lay + real(wp), dimension(k_dist%get_nband(),size(play,1)) & + :: lower_bc ! emissivity or surface albedo + type(ty_gas_concs) :: gas_concs_1lay ! Gas volume mixing ratios + class(ty_optical_props_arry), & + allocatable :: optical_props_1lay + type(ty_fluxes_1lev) :: fluxes_1lev + type(ty_source_func_lw) :: lw_sources_1lay + real(wp), dimension(size(play,1),k_dist%get_ngpt()) :: solar_src + ! ---------------------------------------------------------- + ! + ! Problem extent + ! + ncol = size(play, dim=1) + nlay = size(play, dim=2) + ngpt = k_dist%get_ngpt() + if(check_extents) then + if(.not. extents_are(plev, ncol, nlay+1)) & + error_msg = "compute_bc: array plev has wrong dimensions" + if(.not. extents_are(tlay, ncol, nlay )) & + error_msg = "compute_bc: array tlay has wrong dimensions" + if(present(mu0)) then + if(size(mu0) /= ncol) & + error_msg = "compute bc: array mu0 has wrong dimensions" + end if + if(error_msg /= "") return + end if + + ! + ! Vertical ordering? + ! + top_at_1 = 0 + if(play(1, 1) < play(1, nlay)) top_at_1 = 1 + top_lay = merge(1, nlay, top_at_1==1) + if(any(plev(:,top_lay) <= & + k_dist%get_press_min() + 2._wp * spacing(k_dist%get_press_min()))) then + error_msg = "compute_bc: pressures are too close to (or less than) min in gas optics " + return + end if + ! + ! Make a single-layer isothermal atmosphere + ! + tlay_1lay(1:ncol,1) = tlay(1:ncol, top_lay) + tlev_1lay(1:ncol,1) = tlay(1:ncol, top_lay) + tlev_1lay(1:ncol,2) = tlay(1:ncol, top_lay) + plev_1lay(1:ncol,1) = k_dist%get_press_min() + plev_1lay(1:ncol,2) = plev(1:ncol, top_lay+1) + ! + ! Maybe there are better ways to interpolate pressure but the single layer + ! should be thin enough that interpolation doesn't have much impact + ! + play_1lay(1:ncol,1) = 0.5 * (plev_1lay(1:ncol,1) + plev_1lay(1:ncol,2)) + + ! + ! Gas concentrations in the single layer are the same as in the top layer + ! + ngases = gas_concs%get_num_gases() + allocate(gas_names(ngases)) + gas_names = gas_concs%get_gas_names() + do igas = 1, ngases + error_msg = gas_concs%get_vmr(gas_names(igas), vmr) + if(error_msg /= "") return + error_msg = gas_concs_1lay%set_vmr(gas_names(igas), vmr(:, top_lay)) + if(error_msg /= "") return + end do + + lower_bc(:,:) = 1._wp ! Value doesn't affect downward flux + fluxes_1lev%gpt_flux_dn => flux_bc + ! --------------------------------------------------- + if(k_dist%source_is_internal()) then + ! + ! Longwave specific variables + ! + allocate(ty_optical_props_1scl::optical_props_1lay) + select type (optical_props_1lay) + type is (ty_optical_props_1scl) + error_msg = optical_props_1lay%alloc_1scl(ncol, 1, k_dist) + if(error_msg /= "") return + end select + error_msg = lw_sources_1lay%alloc(ncol, 1, k_dist) + if(error_msg /= "") return + ! + ! Gas optics and sources + ! + error_msg = k_dist%gas_optics(play_1lay, plev_1lay, & + tlay_1lay, tlay_1lay(1:ncol,1), & + gas_concs_1lay, optical_props_1lay, & + lw_sources_1lay, tlev = tlev_1lay) + ! ! + ! Compute fluxes + ! + error_msg = rte_lw(optical_props_1lay, & + top_at_1, & + lw_sources_1lay, & + lower_bc, fluxes_1lev) + else + ! + ! Shortwave specific variables + ! + if(.not. present(mu0)) then + error_msg = "compute_bc: have to supply mu0 for solar calculations" + return + end if + allocate(ty_optical_props_2str::optical_props_1lay) + select type (optical_props_1lay) + type is (ty_optical_props_2str) + error_msg = optical_props_1lay%alloc_2str(ncol, 1, k_dist) + if(error_msg /= "") return + end select + ! + ! Gas optics and sources + ! + error_msg = k_dist%gas_optics(play_1lay, plev_1lay, & + tlay_1lay, gas_concs_1lay, & + optical_props_1lay, & + solar_src) + error_msg = rte_sw(optical_props_1lay, & + top_at_1, mu0, & + solar_src, & + lower_bc, lower_bc, fluxes_1lev) + endif + end function + ! -------------------------------------------------------------------------------------- + function reduce_1lev(this, gpt_flux_up, gpt_flux_dn, spectral_disc, top_at_1, gpt_flux_dn_dir) result(error_msg) + class(ty_fluxes_1lev), intent(inout) :: this + real(kind=wp), dimension(:,:,:), intent(in ) :: gpt_flux_up ! Fluxes by gpoint [W/m2](ncol, nlay+1, ngpt) + real(kind=wp), dimension(:,:,:), intent(in ) :: gpt_flux_dn ! Fluxes by gpoint [W/m2](ncol, nlay+1, ngpt) + class(ty_optical_props), intent(in ) :: spectral_disc !< derived type with spectral information + integer, intent(in ) :: top_at_1 + real(kind=wp), dimension(:,:,:), optional, & + intent(in ) :: gpt_flux_dn_dir! Direct flux down + character(len=128) :: error_msg + ! ------ + integer :: ncol, nlev, ngpt, bottom_lev + ! ------ + error_msg = "" + ncol = size(gpt_flux_up, DIM=1) + nlev = size(gpt_flux_up, DIM=2) + ngpt = size(gpt_flux_up, DIM=3) + if(nlev /= 2) then + error_msg = "reduce: expecting only two layers when computing boundary condition fluxes" + return + end if + bottom_lev = merge(2, 1, top_at_1==1) + ! + ! Return the g-point flux at the bottomw of a two-layer domain + ! + if(associated(this%gpt_flux_dn)) then + if(any([size(this%gpt_flux_dn, 1) /= ncol, & + size(this%gpt_flux_dn, 2) /= ngpt])) then + error_msg = "reduce: gpt_flux_dn array incorrectly sized" + else + if(present(gpt_flux_dn_dir)) then + this%gpt_flux_dn(:,:) = gpt_flux_dn_dir(:,bottom_lev,:) + else + this%gpt_flux_dn(:,:) = gpt_flux_dn (:,bottom_lev,:) + end if + end if + end if + end function reduce_1lev + ! -------------------------------------------------------------------------------------- + ! Are any fluxes desired from this set of g-point fluxes? We can tell because memory will + ! be allocated for output + ! + function are_desired_1lev(this) + class(ty_fluxes_1lev), intent(in ) :: this + logical :: are_desired_1lev + + are_desired_1lev = associated(this%gpt_flux_dn) + end function are_desired_1lev +end module mo_compute_bc diff --git a/src/radiate/rte-rrtmgp/extensions/mo_fluxes_byband.F90 b/src/radiate/rte-rrtmgp/extensions/mo_fluxes_byband.F90 new file mode 100644 index 0000000..4951210 --- /dev/null +++ b/src/radiate/rte-rrtmgp/extensions/mo_fluxes_byband.F90 @@ -0,0 +1,218 @@ +! This code is part of +! RRTM for GCM Applications - Parallel (RRTMGP) +! +! Eli Mlawer and Robert Pincus +! Andre Wehe and Jennifer Delamere +! email: rrtmgp@aer.com +! +! Copyright 2015, Atmospheric and Environmental Research and +! Regents of the University of Colorado. All right reserved. +! +! Use and duplication is permitted under the terms of the +! BSD 3-clause license, see http://opensource.org/licenses/BSD-3-Clause +! +! +! This module is for packaging output quantities from RRTMGP based on spectral flux profiles +! This implementation provides band-by-band flux profiles +! +module mo_fluxes_byband + use mo_rte_kind, only: wp + use mo_rte_config, only: check_extents + use mo_rte_util_array,only: extents_are + use mo_fluxes, only: ty_fluxes, ty_fluxes_broadband + use mo_optical_props, only: ty_optical_props + implicit none + + ! Output from radiation calculations + ! Data components are pointers so results can be written directly into memory + ! reduce() function accepts spectral flux profiles + type, extends(ty_fluxes_broadband) :: ty_fluxes_byband + real(wp), dimension(:,:,:), pointer :: bnd_flux_up => NULL(), & ! Band-by-band fluxes + bnd_flux_dn => NULL() ! (ncol, nlev, nband) + real(wp), dimension(:,:,:), pointer :: bnd_flux_net => NULL() ! Net (down - up) + real(wp), dimension(:,:,:), pointer :: bnd_flux_dn_dir => NULL() ! Direct flux down + contains + procedure :: reduce => reduce_byband + procedure :: are_desired => are_desired_byband + end type ty_fluxes_byband + + interface net_byband + module procedure net_byband_full, net_byband_precalc + end interface net_byband + +contains + ! -------------------------------------------------------------------------------------- + function reduce_byband(this, gpt_flux_up, gpt_flux_dn, spectral_disc, top_at_1, gpt_flux_dn_dir) result(error_msg) + class(ty_fluxes_byband), intent(inout) :: this + real(kind=wp), dimension(:,:,:), intent(in ) :: gpt_flux_up ! Fluxes by gpoint [W/m2](ncol, nlay+1, ngpt) + real(kind=wp), dimension(:,:,:), intent(in ) :: gpt_flux_dn ! Fluxes by gpoint [W/m2](ncol, nlay+1, ngpt) + class(ty_optical_props), intent(in ) :: spectral_disc !< derived type with spectral information + logical, intent(in ) :: top_at_1 + real(kind=wp), dimension(:,:,:), optional, & + intent(in ) :: gpt_flux_dn_dir! Direct flux down + character(len=128) :: error_msg + ! ------ + integer :: ncol, nlev, ngpt, nbnd + integer, dimension(2, spectral_disc%get_nband()) :: band_lims + ! ------ + ncol = size(gpt_flux_up, DIM=1) + nlev = size(gpt_flux_up, DIM=2) + ngpt = spectral_disc%get_ngpt() + nbnd = spectral_disc%get_nband() + band_lims(:,:) = spectral_disc%get_band_lims_gpoint() + + ! Compute broadband fluxes + ! This also checks that input arrays are consistently sized + ! + error_msg = this%ty_fluxes_broadband%reduce(gpt_flux_up, gpt_flux_dn, spectral_disc, top_at_1, gpt_flux_dn_dir) + if(error_msg /= '') return + + if(size(gpt_flux_up, 3) /= ngpt) then + error_msg = "reduce: spectral discretization and g-point flux arrays have differing number of g-points" + return + end if + + ! Check sizes of output arrays + if(check_extents) then + if(associated(this%bnd_flux_up)) then + if(.not. extents_are(this%bnd_flux_up, ncol, nlev, nbnd)) & + error_msg = "reduce: bnd_flux_up array incorrectly sized (can't compute net flux either)" + end if + if(associated(this%bnd_flux_dn)) then + if(.not. extents_are(this%bnd_flux_dn, ncol, nlev, nbnd)) & + error_msg = "reduce: bnd_flux_dn array incorrectly sized (can't compute net flux either)" + end if + if(associated(this%bnd_flux_dn_dir)) then + if(.not. extents_are(this%bnd_flux_dn_dir, ncol, nlev, nbnd)) & + error_msg = "reduce: bnd_flux_dn_dir array incorrectly sized" + end if + if(associated(this%bnd_flux_net)) then + if(.not. extents_are(this%bnd_flux_net, ncol, nlev, nbnd)) & + error_msg = "reduce: bnd_flux_net array incorrectly sized (can't compute net flux either)" + end if + if(error_msg /= "") return + end if + ! + ! Self-consistency -- shouldn't be asking for direct beam flux if it isn't supplied + if(associated(this%bnd_flux_dn_dir) .and. .not. present(gpt_flux_dn_dir)) then + error_msg = "reduce: requesting bnd_flux_dn_dir but direct flux hasn't been supplied" + return + end if + + ! ------- + !$acc enter data copyin(band_lims) + !$omp target enter data map(to:band_lims) + ! Band-by-band fluxes + ! Up flux + if(associated(this%bnd_flux_up)) then + call sum_byband(ncol, nlev, ngpt, nbnd, band_lims, gpt_flux_up, this%bnd_flux_up ) + end if + + ! ------- + ! Down flux + if(associated(this%bnd_flux_dn)) then + call sum_byband(ncol, nlev, ngpt, nbnd, band_lims, gpt_flux_dn, this%bnd_flux_dn ) + end if + + if(associated(this%bnd_flux_dn_dir)) then + call sum_byband(ncol, nlev, ngpt, nbnd, band_lims, gpt_flux_dn_dir, this%bnd_flux_dn_dir) + end if + + ! ------- + ! Net flux + ! + if(associated(this%bnd_flux_net)) then + ! + ! Reuse down and up results if possible + ! + if(associated(this%bnd_flux_dn) .and. associated(this%bnd_flux_up)) then + call net_byband(ncol, nlev, nbnd, this%bnd_flux_dn, this%bnd_flux_up, this%bnd_flux_net) + else + call net_byband(ncol, nlev, ngpt, nbnd, band_lims, gpt_flux_dn, gpt_flux_up, this%bnd_flux_net) + end if + end if + !$acc exit data delete(band_lims) + !$omp target exit data map(release:band_lims) + end function reduce_byband + ! -------------------------------------------------------------------------------------- + ! Are any fluxes desired from this set of g-point fluxes? We can tell because memory will + ! be allocated for output + ! + function are_desired_byband(this) + class(ty_fluxes_byband), intent(in ) :: this + logical :: are_desired_byband + + are_desired_byband = any([associated(this%bnd_flux_up), & + associated(this%bnd_flux_dn), & + associated(this%bnd_flux_dn_dir), & + associated(this%bnd_flux_net), & + this%ty_fluxes_broadband%are_desired()]) + end function are_desired_byband + + ! ---------------------------------------------------------------------------- + ! Kernels (private to this module) + ! ---------------------------------------------------------------------------- + ! + ! Spectral reduction over all points + ! + subroutine sum_byband(ncol, nlev, ngpt, nbnd, band_lims, spectral_flux, byband_flux) bind (C) + integer, intent(in ) :: ncol, nlev, ngpt, nbnd + integer, dimension(2, nbnd), intent(in ) :: band_lims + real(wp), dimension(ncol, nlev, ngpt), intent(in ) :: spectral_flux + real(wp), dimension(ncol, nlev, nbnd), intent(out) :: byband_flux + + integer :: icol, ilev, igpt, ibnd + !$acc parallel loop collapse(3) copyin(spectral_flux, band_lims) copyout(byband_flux) + !$omp target teams distribute parallel do collapse(3) map(to:spectral_flux, band_lims) map(from:byband_flux) + do ibnd = 1, nbnd + do ilev = 1, nlev + do icol = 1, ncol + byband_flux(icol, ilev, ibnd) = spectral_flux(icol, ilev, band_lims(1, ibnd)) + do igpt = band_lims(1,ibnd)+1, band_lims(2,ibnd) + byband_flux(icol, ilev, ibnd) = byband_flux(icol, ilev, ibnd) + & + spectral_flux(icol, ilev, igpt) + end do + end do + end do + enddo + end subroutine sum_byband + ! ---------------------------------------------------------------------------- + ! + ! Net flux: Spectral reduction over all points + ! + subroutine net_byband_full(ncol, nlev, ngpt, nbnd, band_lims, spectral_flux_dn, spectral_flux_up, byband_flux_net) bind (C) + integer, intent(in ) :: ncol, nlev, ngpt, nbnd + integer, dimension(2, nbnd), intent(in ) :: band_lims + real(wp), dimension(ncol, nlev, ngpt), intent(in ) :: spectral_flux_dn, spectral_flux_up + real(wp), dimension(ncol, nlev, nbnd), intent(out) :: byband_flux_net + + integer :: icol, ilev, igpt, ibnd + + !$acc parallel loop collapse(3) copyin(spectral_flux_dn, spectral_flux_up, band_lims) copyout(byband_flux_net) + !$omp target teams distribute parallel do collapse(3) map(to:spectral_flux_dn, spectral_flux_up, band_lims) map(from:byband_flux_net) + do ibnd = 1, nbnd + do ilev = 1, nlev + do icol = 1, ncol + igpt = band_lims(1,ibnd) + byband_flux_net(icol, ilev, ibnd) = spectral_flux_dn(icol, ilev, igpt) - & + spectral_flux_up(icol, ilev, igpt) + do igpt = band_lims(1,ibnd)+1, band_lims(2,ibnd) + byband_flux_net(icol, ilev, ibnd) = byband_flux_net(icol, ilev, ibnd) + & + spectral_flux_dn(icol, ilev, igpt) - & + spectral_flux_up(icol, ilev, igpt) + end do + end do + end do + end do + end subroutine net_byband_full + ! ---------------------------------------------------------------------------- + subroutine net_byband_precalc(ncol, nlev, nbnd, byband_flux_dn, byband_flux_up, byband_flux_net) bind (C) + integer, intent(in ) :: ncol, nlev, nbnd + real(wp), dimension(ncol, nlev, nbnd), intent(in ) :: byband_flux_dn, byband_flux_up + real(wp), dimension(ncol, nlev, nbnd), intent(out) :: byband_flux_net + + byband_flux_net(1:ncol,1:nlev,1:nbnd) = byband_flux_dn(1:ncol,1:nlev,1:nbnd) - byband_flux_up(1:ncol,1:nlev,1:nbnd) + end subroutine net_byband_precalc + ! ---------------------------------------------------------------------------- + +end module mo_fluxes_byband diff --git a/src/radiate/rte-rrtmgp/extensions/mo_fluxes_bygpoint.F90 b/src/radiate/rte-rrtmgp/extensions/mo_fluxes_bygpoint.F90 new file mode 100644 index 0000000..1109300 --- /dev/null +++ b/src/radiate/rte-rrtmgp/extensions/mo_fluxes_bygpoint.F90 @@ -0,0 +1,99 @@ +! This code is part of +! RRTM for GCM Applications - Parallel (RRTMGP) +! +! Eli Mlawer and Robert Pincus +! Andre Wehe and Jennifer Delamere +! email: rrtmgp@aer.com +! +! Copyright 2018, Atmospheric and Environmental Research and +! Regents of the University of Colorado. All right reserved. +! +! Use and duplication is permitted under the terms of the +! BSD 3-clause license, see http://opensource.org/licenses/BSD-3-Clause +! +! This module is for packaging output quantities from RRTMGP based on spectral flux profiles +! This implementation reports the g-point fluxes +! +module mo_fluxes_bygpoint + use mo_rte_kind, only: wp + use mo_rte_util_array,only: extents_are + use mo_fluxes, only: ty_fluxes + use mo_optical_props, only: ty_optical_props + implicit none + + ! Output from radiation calculations + ! Data components are pointers so results can be written directly into memory + ! reduce() function accepts spectral flux profiles + type, extends(ty_fluxes) :: ty_fluxes_bygpoint + real(wp), dimension(:,:,:), pointer :: gpt_flux_up => NULL(), & ! Band-by-band fluxes + gpt_flux_dn => NULL() ! (ncol, nlev, nband) + real(wp), dimension(:,:,:), pointer :: gpt_flux_net => NULL() ! Net (down - up) + real(wp), dimension(:,:,:), pointer :: gpt_flux_dn_dir => NULL() ! Direct flux down + contains + procedure :: reduce => reduce_bygpoint + procedure :: are_desired => are_desired_bygpoint + end type ty_fluxes_bygpoint +contains + ! -------------------------------------------------------------------------------------- + function reduce_bygpoint(this, gpt_flux_up, gpt_flux_dn, spectral_disc, top_at_1, gpt_flux_dn_dir) result(error_msg) + class(ty_fluxes_bygpoint), intent(inout) :: this + real(kind=wp), dimension(:,:,:), intent(in ) :: gpt_flux_up ! Fluxes by gpoint [W/m2](ncol, nlay+1, ngpt) + real(kind=wp), dimension(:,:,:), intent(in ) :: gpt_flux_dn ! Fluxes by gpoint [W/m2](ncol, nlay+1, ngpt) + class(ty_optical_props), intent(in ) :: spectral_disc !< derived type with spectral information + logical, intent(in ) :: top_at_1 + real(kind=wp), dimension(:,:,:), optional, & + intent(in ) :: gpt_flux_dn_dir! Direct flux down + character(len=128) :: error_msg + ! ------ + integer :: ncol, nlev, ngpt, nbnd + ! ------ + error_msg = "" + ncol = size(gpt_flux_up, DIM=1) + nlev = size(gpt_flux_up, DIM=2) + ngpt = size(gpt_flux_up, DIM=3) + + if(associated(this%gpt_flux_up)) then + if(.not. extents_are(this%gpt_flux_up, ncol, nlev, ngpt)) then + error_msg = "reduce: gpt_flux_up array incorrectly sized (can't compute net flux either)" + else + this%gpt_flux_up(:,:,:) = gpt_flux_up(:,:,:) + end if + end if + if(associated(this%gpt_flux_dn)) then + if(.not. extents_are(this%gpt_flux_dn, ncol, nlev, ngpt)) then + error_msg = "reduce: gpt_flux_dn array incorrectly sized (can't compute net flux either)" + else + this%gpt_flux_dn(:,:,:) = gpt_flux_dn(:,:,:) + end if + end if + if(associated(this%gpt_flux_net)) then + if(.not. extents_are(this%gpt_flux_net, ncol, nlev, ngpt)) then + error_msg = "reduce: gpt_flux_net array incorrectly sized (can't compute net flux either)" + else + this%gpt_flux_net(:,:,:) = gpt_flux_dn(:,:,:) - gpt_flux_up(:,:,:) + end if + end if + if(associated(this%gpt_flux_dn_dir)) then + if(.not. extents_are(this%gpt_flux_dn_dir, ncol, nlev, ngpt)) then + error_msg = "reduce: gpt_flux_dn_dir array incorrectly sized (can't compute net flux either)" + else if(present(gpt_flux_dn_dir)) then + this%gpt_flux_dn_dir(:,:,:) = gpt_flux_dn_dir(:,:,:) + end if + end if + end function reduce_bygpoint + + ! -------------------------------------------------------------------------------------- + ! Are any fluxes desired from this set of g-point fluxes? We can tell because memory will + ! be allocated for output + ! + function are_desired_bygpoint(this) + class(ty_fluxes_bygpoint), intent(in ) :: this + logical :: are_desired_bygpoint + + are_desired_bygpoint = any([associated(this%gpt_flux_up), & + associated(this%gpt_flux_dn), & + associated(this%gpt_flux_dn_dir), & + associated(this%gpt_flux_net)]) + end function are_desired_bygpoint + +end module mo_fluxes_bygpoint diff --git a/src/radiate/rte-rrtmgp/extensions/mo_heating_rates.F90 b/src/radiate/rte-rrtmgp/extensions/mo_heating_rates.F90 new file mode 100644 index 0000000..f6fe673 --- /dev/null +++ b/src/radiate/rte-rrtmgp/extensions/mo_heating_rates.F90 @@ -0,0 +1,118 @@ +! +! Eli Mlawer and Robert Pincus +! Andre Wehe and Jennifer Delamere +! email: rrtmgp@aer.com +! +! Copyright 2016- Atmospheric and Environmental Research, +! Regents of the University of Colorado, +! Trustees of Columbia University in the City of New York +! All right reserved. +! +! Use and duplication is permitted under the terms of the +! BSD 3-clause license, see http://opensource.org/licenses/BSD-3-Clause +! +! Description: Heating rate calculation + +module mo_heating_rates + use mo_rte_kind, only: wp, wl + use mo_rte_config, only: check_extents + use mo_rte_util_array, only: extents_are, any_vals_less_than + use mo_rrtmgp_constants, only: cp_dry, grav ! Only needed for heating rate calculation + implicit none + private + interface compute_heating_rate + module procedure compute_heating_rate_general, compute_heating_rate_solar_varmu0 + end interface compute_heating_rate + public :: compute_heating_rate +contains + ! Compute heating rate from fluxes + ! heating rate H [K/sec] = 1/(rho cp) d f_net/d z + ! Here use hydrostatic equation for density and heat capacity of dry air + ! -------------------------------------------------------------------------------------------------- + function compute_heating_rate_general(flux_up, flux_dn, p_lev, heating_rate) result(error_msg) + real(wp), dimension(:,:), intent(in ) :: flux_up, flux_dn, & !< fluxes at interfaces [W/m2] + p_lev !< pressure at interfaces [hPa] + real(wp), dimension(:,:), intent(out) :: heating_rate !< heating rate within layer [K/sec] + character(len=128) :: error_msg + ! --------- + integer :: ncol, nlay, ilay, icol + ! --------- + error_msg = "" + ncol = size(flux_up, 1) + nlay = size(flux_up, 2) - 1 + + if(check_extents) then + if(.not. extents_are(flux_dn, ncol, nlay+1)) & + error_msg = "heating_rate: flux_dn array inconsistently sized." + if(.not. extents_are(p_lev, ncol, nlay+1)) & + error_msg = "heating_rate: p_lev array inconsistently sized." + if(.not. extents_are(heating_rate, ncol, nlay)) & + error_msg = "heating_rate: heating_rate array inconsistently sized." + if(error_msg /= "") return + end if + + do ilay = 1, nlay + do icol = 1, ncol + heating_rate(icol,ilay) = (flux_up(icol,ilay+1) - flux_up(icol,ilay) - & + flux_dn(icol,ilay+1) + flux_dn(icol,ilay)) * & + grav / (cp_dry * (p_lev(icol,ilay+1) - p_lev(icol,ilay))) + end do + end do + end function compute_heating_rate_general + ! -------------------------------------------------------------------------------------------------- + function compute_heating_rate_solar_varmu0(flux_up, flux_dn, flux_dir, p_lev, mu0, heating_rate) result(error_msg) + real(wp), dimension(:,:), intent(in ) :: flux_up, flux_dn, flux_dir, & !< fluxes at interfaces [W/m2] + p_lev !< pressure at interfaces [Pa] + real(wp), dimension(:,:), intent(in ) :: mu0 !< solar zenith angle at layer center + real(wp), dimension(:,:), intent(out) :: heating_rate !< heating rate within layer [K/sec] + character(len=128) :: error_msg + ! --------- + integer :: ncol, nlay, icol, ilay + integer :: last_sunlight_layer(size(mu0, 1)) + logical(wl) :: top_at_1 + ! --------- + error_msg = "" + ! + ! Start with the baseline calculation + ! + error_msg = compute_heating_rate_general(flux_up, flux_dn, p_lev, heating_rate) + ! + ! If there was an error, or if the sun is everywhere over the horizon, no need to proceed + ! + if(error_msg /= "" .or. & + .not. any_vals_less_than(mu0, epsilon(mu0))) return + ncol = size(flux_up, 1) + nlay = size(flux_up, 2) - 1 + + if(check_extents) then + if(.not. extents_are(flux_dir, ncol, nlay+1)) & + error_msg = "heating_rate: flux_dir array inconsistently sized." + if(.not. extents_are(mu0, ncol, nlay)) & + error_msg = "heating_rate: mu0 array inconsistently sized." + end if + ! + ! In each column: find the layer in which mu0 transitions from non-zero to zero; + ! compute heating rates in this layer from the divergence of diffuse flux + ! (total - direct) + ! + if (any_vals_less_than(mu0(:,nlay), epsilon(mu0))) then + ! Zero mu0 values in highest index implies top at 1 + last_sunlight_layer = minloc(mu0, mask=mu0>0._wp, dim=2)+1 + else + last_sunlight_layer = maxloc(mu0, mask=mu0>0._wp, dim=2)-1 + end if + do icol = 1, ncol + ilay = last_sunlight_layer(icol) + if(ilay > 1 .and. last_sunlight_layer(icol) < nlay) then + ! + ! Heating rate with diffuse (total minus dir) net (up minus down) flux + ! + heating_rate(icol,ilay) = (flux_up (icol,ilay+1) - flux_up (icol,ilay) - & + flux_dn (icol,ilay+1) + flux_dn (icol,ilay) + & + flux_dir(icol,ilay+1) - flux_dir(icol,ilay)) * & + grav / (cp_dry * (p_lev(icol,ilay+1) - p_lev(icol,ilay))) + end if + end do + end function compute_heating_rate_solar_varmu0 + ! -------------------------------------------------------------------------------------------------- +end module mo_heating_rates diff --git a/src/radiate/rte-rrtmgp/extensions/mo_rrtmgp_clr_all_sky.F90 b/src/radiate/rte-rrtmgp/extensions/mo_rrtmgp_clr_all_sky.F90 new file mode 100644 index 0000000..026e2d1 --- /dev/null +++ b/src/radiate/rte-rrtmgp/extensions/mo_rrtmgp_clr_all_sky.F90 @@ -0,0 +1,314 @@ +! This code is part of +! RRTM for GCM Applications - Parallel (RRTMGP) +! +! Eli Mlawer and Robert Pincus +! Andre Wehe and Jennifer Delamere +! email: rrtmgp@aer.com +! +! Copyright 2017, Atmospheric and Environmental Research and +! Regents of the University of Colorado. All right reserved. +! +! Use and duplication is permitted under the terms of the +! BSD 3-clause license, see http://opensource.org/licenses/BSD-3-Clause +! + +! +! This module provides an interface to RRTMGP for a common use case -- +! users want to start from gas concentrations, pressures, and temperatures, +! and compute clear-sky (aerosol plus gases) and all-sky fluxes. +! The routines here have the same names as those in mo_rrtmgp_[ls]w; normally users +! will use either this module or the underling modules, but not both +! +module mo_rrtmgp_clr_all_sky + use mo_rte_kind, only: wp + use mo_gas_optics, & + only: ty_gas_optics + use mo_gas_concentrations, & + only: ty_gas_concs + use mo_optical_props, only: ty_optical_props, & + ty_optical_props_arry, ty_optical_props_1scl, ty_optical_props_2str, ty_optical_props_nstr + use mo_source_functions, & + only: ty_source_func_lw + use mo_fluxes, only: ty_fluxes + use mo_rte_lw, only: base_rte_lw => rte_lw + use mo_rte_sw, only: base_rte_sw => rte_sw + implicit none + private + + public :: rte_lw, rte_sw +contains + ! -------------------------------------------------- + ! + ! Interfaces using clear (gas + aerosol) and all-sky categories, starting from + ! pressures, temperatures, and gas amounts for the gas contribution + ! + ! -------------------------------------------------- + function rte_lw(k_dist, gas_concs, p_lay, t_lay, p_lev, & + t_sfc, sfc_emis, cloud_props, & + allsky_fluxes, clrsky_fluxes, & + aer_props, col_dry, t_lev, inc_flux, n_gauss_angles) result(error_msg) + class(ty_gas_optics), intent(in ) :: k_dist !< derived type with spectral information + type(ty_gas_concs), intent(in ) :: gas_concs !< derived type encapsulating gas concentrations + real(wp), dimension(:,:), intent(in ) :: p_lay, t_lay !< pressure [Pa], temperature [K] at layer centers (ncol,nlay) + real(wp), dimension(:,:), intent(in ) :: p_lev !< pressure at levels/interfaces [Pa] (ncol,nlay+1) + real(wp), dimension(:), intent(in ) :: t_sfc !< surface temperature [K] (ncol) + real(wp), dimension(:,:), intent(in ) :: sfc_emis !< emissivity at surface [] (nband, ncol) + class(ty_optical_props_arry), intent(in ) :: cloud_props !< cloud optical properties (ncol,nlay,ngpt) + class(ty_fluxes), intent(inout) :: allsky_fluxes, clrsky_fluxes + + ! Optional inputs + class(ty_optical_props_arry), & + optional, intent(in ) :: aer_props !< aerosol optical properties + real(wp), dimension(:,:), & + optional, intent(in ) :: col_dry !< Molecular number density (ncol, nlay) + real(wp), dimension(:,:), target, & + optional, intent(in ) :: t_lev !< temperature at levels [K] (ncol, nlay+1) + real(wp), dimension(:,:), target, & + optional, intent(in ) :: inc_flux !< incident flux at domain top [W/m2] (ncol, ngpts) + integer, optional, intent(in ) :: n_gauss_angles ! Number of angles used in Gaussian quadrature (no-scattering solution) + character(len=128) :: error_msg + ! -------------------------------- + ! Local variables + ! + class(ty_optical_props_arry), allocatable :: optical_props + type(ty_source_func_lw) :: sources + + integer :: ncol, nlay, ngpt, nband, nstr + integer :: top_at_1 + ! -------------------------------- + ! Problem sizes + ! + error_msg = "" + + ncol = size(p_lay, 1) + nlay = size(p_lay, 2) + ngpt = k_dist%get_ngpt() + nband = k_dist%get_nband() + + !$acc kernels copyout(top_at_1) + !$omp target map(from:top_at_1) + top_at_1 = 0 + if(p_lay(1, 1) < p_lay(1, nlay)) top_at_1 = 1 + !$acc end kernels + !$omp end target + + ! ------------------------------------------------------------------------------------ + ! Error checking + ! + if(present(aer_props)) then + if(any([aer_props%get_ncol(), & + aer_props%get_nlay()] /= [ncol, nlay])) & + error_msg = "rrtmpg_lw: aerosol properties inconsistently sized" + if(.not. any(aer_props%get_ngpt() /= [ngpt, nband])) & + error_msg = "rrtmpg_lw: aerosol properties inconsistently sized" + end if + + if(present(t_lev)) then + if(any([size(t_lev, 1), & + size(t_lev, 2)] /= [ncol, nlay+1])) & + error_msg = "rrtmpg_lw: t_lev inconsistently sized" + end if + + if(present(inc_flux)) then + if(any([size(inc_flux, 1), & + size(inc_flux, 2)] /= [ncol, ngpt])) & + error_msg = "rrtmpg_lw: incident flux inconsistently sized" + end if + if(len_trim(error_msg) > 0) return + + ! ------------------------------------------------------------------------------------ + ! Optical properties arrays + ! + select type(cloud_props) + class is (ty_optical_props_1scl) ! No scattering + allocate(ty_optical_props_1scl::optical_props) + class is (ty_optical_props_2str) + allocate(ty_optical_props_2str::optical_props) + class is (ty_optical_props_nstr) + allocate(ty_optical_props_nstr::optical_props) + nstr = size(cloud_props%tau,1) + end select + + error_msg = optical_props%init(k_dist) + if(len_trim(error_msg) > 0) return + select type (optical_props) + class is (ty_optical_props_1scl) ! No scattering + error_msg = optical_props%alloc_1scl(ncol, nlay) + class is (ty_optical_props_2str) + error_msg = optical_props%alloc_2str(ncol, nlay) + class is (ty_optical_props_nstr) + error_msg = optical_props%alloc_nstr(nstr, ncol, nlay) + end select + if (error_msg /= '') return + + ! + ! Source function + ! + error_msg = sources%init(k_dist) + error_msg = sources%alloc(ncol, nlay) + if (error_msg /= '') return + ! ------------------------------------------------------------------------------------ + ! Clear skies + ! + ! Gas optical depth -- pressure need to be expressed as Pa + ! + error_msg = k_dist%gas_optics(p_lay, p_lev, t_lay, t_sfc, gas_concs, & + optical_props, sources, & + col_dry, t_lev) + if (error_msg /= '') return + ! ---------------------------------------------------- + ! Clear sky is gases + aerosols (if they're supplied) + ! + if(present(aer_props)) error_msg = aer_props%increment(optical_props) + if(error_msg /= '') return + + error_msg = base_rte_lw(optical_props, top_at_1, sources, & + sfc_emis, clrsky_fluxes, & + inc_flux, n_gauss_angles) + if(error_msg /= '') return + ! ------------------------------------------------------------------------------------ + ! All-sky fluxes = clear skies + clouds + ! + error_msg = cloud_props%increment(optical_props) + if(error_msg /= '') return + + error_msg = base_rte_lw(optical_props, top_at_1, sources, & + sfc_emis, allsky_fluxes, & + inc_flux, n_gauss_angles) + + call sources%finalize() + call optical_props%finalize() + end function rte_lw + ! -------------------------------------------------- + function rte_sw(k_dist, gas_concs, p_lay, t_lay, p_lev, & + mu0, sfc_alb_dir, sfc_alb_dif, cloud_props, & + allsky_fluxes, clrsky_fluxes, & + aer_props, col_dry, inc_flux) result(error_msg) + class(ty_gas_optics), intent(in ) :: k_dist !< derived type with spectral information + type(ty_gas_concs), intent(in ) :: gas_concs !< derived type encapsulating gas concentrations + real(wp), dimension(:,:), intent(in ) :: p_lay, t_lay !< pressure [Pa], temperature [K] at layer centers (ncol,nlay) + real(wp), dimension(:,:), intent(in ) :: p_lev !< pressure at levels/interfaces [Pa] (ncol,nlay+1) + real(wp), dimension(: ), intent(in ) :: mu0 !< cosine of solar zenith angle + real(wp), dimension(:,:), intent(in ) :: sfc_alb_dir, sfc_alb_dif + ! surface albedo for direct and diffuse radiation (band, col) + class(ty_optical_props_arry), intent(in ) :: cloud_props !< cloud optical properties (ncol,nlay,ngpt) + class(ty_fluxes), intent(inout) :: allsky_fluxes, clrsky_fluxes + + ! Optional inputs + class(ty_optical_props_arry), target, & + optional, intent(in ) :: aer_props !< aerosol optical properties + real(wp), dimension(:,:), & + optional, intent(in ) :: col_dry, & !< Molecular number density (ncol, nlay) + inc_flux !< incident flux at domain top [W/m2] (ncol, ngpts) + + character(len=128) :: error_msg + ! -------------------------------- + ! Local variables + ! + class(ty_optical_props_arry), allocatable :: optical_props + real(wp), dimension(:,:), allocatable :: toa_flux + integer :: ncol, nlay, ngpt, nband, nstr + integer :: top_at_1 + ! -------------------------------- + ! Problem sizes + ! + error_msg = "" + + ncol = size(p_lay, 1) + nlay = size(p_lay, 2) + ngpt = k_dist%get_ngpt() + nband = k_dist%get_nband() + + !$acc kernels copyout(top_at_1) + !$omp target map(from:top_at_1) + top_at_1 = 0 + if(p_lay(1, 1) < p_lay(1, nlay)) top_at_1 = 1 + !$acc end kernels + !$omp end target + + ! ------------------------------------------------------------------------------------ + ! Error checking + ! + if(present(aer_props)) then + if(any([aer_props%get_ncol(), & + aer_props%get_nlay()] /= [ncol, nlay])) & + error_msg = "rrtmpg_sw: aerosol properties inconsistently sized" + if(.not. any(aer_props%get_ngpt() /= [ngpt, nband])) & + error_msg = "rrtmpg_sw: aerosol properties inconsistently sized" + end if + + if(present(inc_flux)) then + if(any([size(inc_flux, 1), & + size(inc_flux, 2)] /= [ncol, ngpt])) & + error_msg = "rrtmpg_sw: incident flux inconsistently sized" + end if + if(len_trim(error_msg) > 0) return + + ! ------------------------------------------------------------------------------------ + ! + ! Optical properties arrays + ! + select type(cloud_props) + class is (ty_optical_props_1scl) ! No scattering + allocate(ty_optical_props_1scl::optical_props) + class is (ty_optical_props_2str) + allocate(ty_optical_props_2str::optical_props) + class is (ty_optical_props_nstr) + allocate(ty_optical_props_nstr::optical_props) + nstr = cloud_props%get_nmom() + end select + + error_msg = optical_props%init(k_dist%get_band_lims_wavenumber(), & + k_dist%get_band_lims_gpoint()) + if(len_trim(error_msg) > 0) return + select type (optical_props) + class is (ty_optical_props_1scl) ! No scattering + error_msg = optical_props%alloc_1scl(ncol, nlay) + class is (ty_optical_props_2str) + error_msg = optical_props%alloc_2str(ncol, nlay) + class is (ty_optical_props_nstr) + error_msg = optical_props%alloc_nstr(nstr, ncol, nlay) + end select + if (error_msg /= '') return + + allocate(toa_flux(ncol, ngpt)) + ! ------------------------------------------------------------------------------------ + ! Clear skies + ! + ! Gas optical depth -- pressure need to be expressed as Pa + ! + error_msg = k_dist%gas_optics(p_lay, p_lev, t_lay, gas_concs, & + optical_props, toa_flux, & + col_dry) + if (error_msg /= '') return + ! + ! If users have supplied an incident flux, use that + ! + if(present(inc_flux)) toa_flux(:,:) = inc_flux(:,:) + ! ---------------------------------------------------- + ! Clear sky is gases + aerosols (if they're supplied) + ! + if(present(aer_props)) error_msg = aer_props%increment(optical_props) + if(error_msg /= '') return + + error_msg = base_rte_sw(optical_props, top_at_1, & + mu0, toa_flux, & + sfc_alb_dir, sfc_alb_dif, & + clrsky_fluxes) + + if(error_msg /= '') return + ! ------------------------------------------------------------------------------------ + ! All-sky fluxes = clear skies + clouds + ! + error_msg = cloud_props%increment(optical_props) + if(error_msg /= '') return + + error_msg = base_rte_sw(optical_props, top_at_1, & + mu0, toa_flux, & + sfc_alb_dir, sfc_alb_dif, & + allsky_fluxes) + + call optical_props%finalize() + end function rte_sw + +end module mo_rrtmgp_clr_all_sky diff --git a/src/radiate/rte-rrtmgp/extensions/mo_zenith_angle_spherical_correction.F90 b/src/radiate/rte-rrtmgp/extensions/mo_zenith_angle_spherical_correction.F90 new file mode 100644 index 0000000..f845e3d --- /dev/null +++ b/src/radiate/rte-rrtmgp/extensions/mo_zenith_angle_spherical_correction.F90 @@ -0,0 +1,99 @@ +! This code is part of Radiative Transfer for Energetics (RTE) +! +! Contacts: Robert Pincus and Eli Mlawer +! email: rrtmgp@aer.com +! +! Copyright 2020-, Atmospheric and Environmental Research, +! Regents of the University of Colorado, Trustees of Columbia University. All right reserved. +! +! Use and duplication is permitted under the terms of the +! BSD 3-clause license, see http://opensource.org/licenses/BSD-3-Clause +! ------------------------------------------------------------------------------------------------- +! +! Routines for solar zenith angle accounting for spherical geometry +! +! ------------------------------------------------------------------------------------------------- + +module mo_zenith_angle_spherical_correction + use mo_rte_kind, only: wp, wl + use mo_rte_config, only: check_extents, check_values + use mo_rte_util_array, only: extents_are, any_vals_outside, any_vals_less_than + implicit none + private + public :: zenith_angle_with_height + + real(wp), protected :: planet_radius = 6371.23_wp * 1.e3_wp ! Planetary radius [m] +contains + ! ------------------------------------------------------------------------------------------------- + ! + ! Compute cosine of solar zenith angle (min 0) as a function of height given value at a specified height. + ! + function zenith_angle_with_height(ref_alt, ref_mu, alt, mu) result(error_msg) + real(wp), dimension(:), intent(in ) :: ref_alt ! reference altitude at which solar zenith angle is provided [m] + real(wp), dimension(:), intent(in ) :: ref_mu ! cosine of the solar zenith angle at reference altitude + real(wp), dimension(:,:), intent(in ) :: alt ! level altitude grid [m] + real(wp), dimension(:,:), intent( out) :: mu + character(len=128) :: error_msg + + integer :: ncol, nlay, icol, ilay + real(wp) :: sin_theta2 + ! ------------------------------------ + error_msg = "" + ncol = size(alt,1) + nlay = size(alt,2) + + if(check_extents) then + if(.not. extents_are(ref_alt, ncol)) & + error_msg = "zenith_angle_with_height: ref_alt, alt have different number of columns" + if(.not. extents_are(ref_mu, ncol)) & + error_msg = "zenith_angle_with_height: ref_mu, alt have different number of columns" + if(.not. extents_are(mu, ncol, nlay)) & + error_msg = "zenith_angle_with_height: mu, alt have different number of columns" + end if + if(len_trim(error_msg) /= 0) return + + if(check_extents) then + if(any_vals_less_than(ref_alt, -planet_radius)) & + error_msg = "zenith_angle_with_height: values of ref_alt must be larger than -the planetary radius" + if(any_vals_outside(ref_mu, -1._wp, 1._wp)) & + error_msg = "zenith_angle_with_height: values of ref_mu must be in [-1, 1]" + if(any_vals_less_than(alt, -planet_radius)) & + error_msg = "zenith_angle_with_height: values of alt must be larger than -the planetary radius" + end if + if(len_trim(error_msg) /= 0) return + ! ------------------------------------ + !$acc parallel loop collapse(2) & + !$acc copyin(ref_alt, ref_mu, alt) copyout(mu) + !$omp target teams distribute parallel do simd collapse(2) & + !$omp map(to:ref_alt, ref_mu, alt) map(from:mu) + do ilay=1, nlay + do icol = 1, ncol + sin_theta2 = (1-ref_mu(icol)**2) * & + ((planet_radius + ref_alt(icol)) / & + (planet_radius + alt(icol,ilay)))**2 + if(sin_theta2 < 1._wp) then + mu(icol, ilay) = sqrt(1._wp - sin_theta2) + else + mu(icol, ilay) = 0._wp + end if + end do + end do + end function zenith_angle_with_height + ! ------------------------------------------------------------------------------------------------- + ! + ! Set the planetary radius used for computing solar zenith angle + ! + function set_planet_radius(radius) result (error_msg) + real(wp), intent(in) :: radius + character(len=128) :: error_msg + + error_msg = "" + if(radius .le. 0._wp) then + error_msg = "set_planet_radius: radius must be > 0" + return + end if + + planet_radius = radius + end function set_planet_radius + ! ------------------------------------------------------------------------------------------------- +end module mo_zenith_angle_spherical_correction diff --git a/src/radiate/rte-rrtmgp/extensions/solar_variability/mo_solar_variability.F90 b/src/radiate/rte-rrtmgp/extensions/solar_variability/mo_solar_variability.F90 new file mode 100644 index 0000000..93a126b --- /dev/null +++ b/src/radiate/rte-rrtmgp/extensions/solar_variability/mo_solar_variability.F90 @@ -0,0 +1,185 @@ +! This code is part of RRTM for GCM Applications - Parallel (RRTMGP) +! +! Contacts: Robert Pincus and Eli Mlawer +! email: rrtmgp@aer.com +! +! Copyright 2015-2020, Atmospheric and Environmental Research and +! Regents of the University of Colorado. All right reserved. +! +! Use and duplication is permitted under the terms of the +! BSD 3-clause license, see http://opensource.org/licenses/BSD-3-Clause +! ------------------------------------------------------------------------------------------------- +! Description: Optional calculation of solar variability facular and +! sunspot indices + +module mo_solar_variability + use mo_rte_kind, only: wp + + implicit none + private + type, public :: ty_solar_var + ! + ! Data + ! + real(wp), dimension(:,:), allocatable :: avgcyc_ind ! solar variabilty index lookup table + ! time-averaged over solar cycles 13-24. + ! (NRLSSI2 facular "Bremen" index and + ! sunspot "SPOT67" index) + ! (nsolarterms, nsolarfrac) -> (2,134) + contains + ! + ! Public procedures + ! + procedure, public :: solar_var_ind_interp + procedure, public :: load + procedure, public :: finalize + ! + end type ty_solar_var + +contains + ! ------------------------------------------------------------------------------ + ! + ! Routine to load mean facular and sunspot index tables + ! + ! ------------------------------------------------------------------------------ + function load(this, avgcyc_ind) result(error_msg) + class(ty_solar_var), intent(inout) :: this + ! Lookup table of mean solar cycle facular brightening and sunspot dimming indices + real(wp), dimension(:,:), intent(in ) :: avgcyc_ind + character(len=128) :: error_msg + ! ------- + ! + ! Local variables + ! + integer :: nsolarterms, nsolarfrac + + error_msg = "" + ! + ! LUT index dimensions + ! + nsolarterms= size(avgcyc_ind,dim=1) + nsolarfrac = size(avgcyc_ind,dim=2) + ! + ! Allocate LUT index array + allocate(this%avgcyc_ind(nsolarterms, nsolarfrac)) + + ! Load LUT index array + this%avgcyc_ind = avgcyc_ind + + end function load + !-------------------------------------------------------------------------------------------------------------------- + ! + ! Finalize + ! + !-------------------------------------------------------------------------------------------------------------------- + subroutine finalize(this) + class(ty_solar_var), intent(inout) :: this + + ! Lookup table solar variability indices + if(allocated(this%avgcyc_ind)) then + deallocate(this%avgcyc_ind) + end if + + end subroutine finalize + ! ------------------------------------------------------------------------------ + ! + ! Facular brightening and sunspot dimming indices are derived from the + ! averaged solar cycle, which is the mean of Solar Cycles 13-24. The user specifices + ! the solar cycle fraction (0 to 1) and the indices are interpolated to the + ! requested fractional position within the cycle, where 0 is close to solar minimum. + ! + function solar_var_ind_interp(this, & + solcycfrac, & + mg_index, sb_index) & + result(error_msg) + + class(ty_solar_var), intent(in ) :: this ! Solar variability + real(wp), intent(in ) :: solcycfrac ! solar cycle fraction + real(wp), intent(out ) :: mg_index ! Facular brightening NRLSSI2 index + ! interpolated from the mean solar cycle + ! to the provided solar cycle fraction + real(wp), intent(out ) :: sb_index ! Sunspot dimmng NRLSSI2 index + ! interpolated from the mean solar cycle + ! to the provided solar cycle fraction + character(len=128) :: error_msg + + ! ---------------------------------------------------------- + ! Local variables + ! + integer :: nsolfrac ! Number of solar fraction points in facular + ! and sunspot tables + integer :: sfid ! Solar variability solar cycle fraction index + + real(wp) :: intrvl_len ! Fractional interval length of mgavgcyc and sbavgcyc + real(wp) :: intrvl_len_hf ! Fractional half interval length of mgavgcyc and sbavgcyc + real(wp) :: fraclo, frachi, intfrac ! Solar variability interpolation factors + + ! ---------------------------------------------------------- + ! Error checking + error_msg = "" + ! + ! Check input data sizes and values + ! + if (solcycfrac .lt. 0._wp .or. solcycfrac .gt. 1._wp) & + error_msg = 'solar_var_ind_interp: solcycfrac out of range' + if(error_msg /= '') return + ! + ! Interpolate solar variability indices to requested solar cycle fraction, + ! and derive final facular and sunspot indices + ! + ! nsolfrac is the length of the time dimension of the interpolation tables + ! of facular and sunspot indices over the mean solar cycle (this%avgcyc_ind). + ! The end-points of avgcyc_ind represent the indices at solcycfrac values of + ! 0 (first day of the first year) and 1 (last day of the 11th year), while + ! the intervening values of avgcyc_ind represent the indices at the center + ! of each month over the mean 11-year solar cycle. + if (allocated (this%avgcyc_ind)) then + nsolfrac = size(this%avgcyc_ind,2) + ! Define indices for the lowest allowable value of solcycfrac + if (solcycfrac .eq. 0._wp) then + mg_index = this%avgcyc_ind(1,1) + sb_index = this%avgcyc_ind(2,1) + ! Define indices for the highest allowable value of solcycfrac + elseif (solcycfrac .eq. 1._wp) then + mg_index = this%avgcyc_ind(1,nsolfrac) + sb_index = this%avgcyc_ind(2,nsolfrac) + ! Define indices for intervening values of solcycfrac + else + intrvl_len = 1._wp / (nsolfrac-2) + intrvl_len_hf = 0.5_wp * intrvl_len + ! Define interpolation fractions for the first interval, which represents + ! the first half of the first month of the first year of the mean 11-year + ! solar cycle + if (solcycfrac .le. intrvl_len_hf) then + sfid = 1 + fraclo = 0._wp + frachi = intrvl_len_hf + endif + ! Define interpolation fractions for the intervening intervals, which represent + ! the center point of each month in each year of the mean 11-year solar cycle + if (solcycfrac .gt. intrvl_len_hf .and. solcycfrac .lt. 1._wp-intrvl_len_hf) then + sfid = floor((solcycfrac-intrvl_len_hf) * (nsolfrac-2)) + 2 + fraclo = (sfid-2) * intrvl_len + intrvl_len_hf + frachi = fraclo + intrvl_len + endif + ! Define interpolation fractions for the last interval, which represents + ! the last half of the last month of the last year of the mean 11-year + ! solar cycle + if (solcycfrac .ge. 1._wp-intrvl_len_hf) then + sfid = (nsolfrac-2) + 1 + fraclo = 1._wp - intrvl_len_hf + frachi = 1._wp + endif + ! Interpolate the facular (mg_index) and sunspot (sb_index) indices for the + ! requested value of solcycfrac + intfrac = (solcycfrac - fraclo) / (frachi - fraclo) + mg_index = this%avgcyc_ind(1,sfid) + & + intfrac * (this%avgcyc_ind(1,sfid+1) - this%avgcyc_ind(1,sfid)) + sb_index = this%avgcyc_ind(2,sfid) + & + intfrac * (this%avgcyc_ind(2,sfid+1) - this%avgcyc_ind(2,sfid)) + endif + endif + + end function solar_var_ind_interp + ! -------------------------------------------------------------------------------------- +end module mo_solar_variability diff --git a/src/radiate/rte-rrtmgp/extensions/solar_variability/rrtmgp-solar-var-tables.nc b/src/radiate/rte-rrtmgp/extensions/solar_variability/rrtmgp-solar-var-tables.nc new file mode 100644 index 0000000..3545eb2 Binary files /dev/null and b/src/radiate/rte-rrtmgp/extensions/solar_variability/rrtmgp-solar-var-tables.nc differ diff --git a/src/radiate/rte-rrtmgp/interface/README.md b/src/radiate/rte-rrtmgp/interface/README.md new file mode 100644 index 0000000..3a5e9a2 --- /dev/null +++ b/src/radiate/rte-rrtmgp/interface/README.md @@ -0,0 +1,7 @@ +# All-sky example + +This example provides a modestly more realistic setting the clear-sky problem done in the parallel `rfmip-clear-sky` directory in that it does an 'all-sky' calculation including both gases and clouds. It may be useful as a tutorial for users integrating RTE+RRTMGP into host models. We are also using it as a regression test for continuous integration and as a testbed for accelerators (currently GPUs using OpenACC). + +The example uses the first of the Garand atmosphere used for developing RRTMGP, as described in the [paper](https://doi.org/10.1029/2019MS001621) documenting the code, repeats the column a user-specified number of times, computes the optical properties of an arbitrary cloud in each column, and computes the broadband fluxes. Fractional cloudiness is not considered, and the clouds are extensive but quite boring, with uniform condensate amount and particle size everywhere (though with different values for liquid and ice). + +Note that this example is run, and the results checked automatically, when `make` is invoked in the root directory. diff --git a/src/radiate/rte-rrtmgp/interface/mo_load_aerosol_coefficients.F90 b/src/radiate/rte-rrtmgp/interface/mo_load_aerosol_coefficients.F90 new file mode 100644 index 0000000..9e11ff5 --- /dev/null +++ b/src/radiate/rte-rrtmgp/interface/mo_load_aerosol_coefficients.F90 @@ -0,0 +1,115 @@ +module mo_load_aerosol_coefficients + use mo_rte_kind, only: wp + use mo_optical_props, only: ty_optical_props, & + ty_optical_props_arry, & + ty_optical_props_1scl, & + ty_optical_props_2str, & + ty_optical_props_nstr + use mo_aerosol_optics, only: ty_aerosol_optics + use mo_simple_netcdf, only: read_field, read_string, var_exists, get_dim_size, & + write_field, create_dim, create_var + use netcdf + + implicit none + private + public :: load_aero_lutcoeff + ! ---------------------------------------------------------------------------------- + +contains + !-------------------------------------------------------------------------------------------------------------------- + ! + ! read cloud optical property LUT coefficients from NetCDF file + ! + subroutine load_aero_lutcoeff(aero_spec, aero_coeff_file) + class(ty_aerosol_optics), intent(inout) :: aero_spec + character(len=*), intent(in ) :: aero_coeff_file + ! ----------------- + ! Local variables + integer :: ncid, nband, ntype, ndust, ncarb, nbins, nradbins, nrh + + real(wp), dimension(:,:), allocatable :: band_lims_wvn, radparam + real(wp), dimension(:), allocatable :: rma, radlim + ! LUT coefficients + real(wp), dimension(:,:,:,:), allocatable :: lut_qext ! + real(wp), dimension(:,:,:), allocatable :: lut_qext_carb ! + real(wp), dimension(:,:,:), allocatable :: lut_qext_dust ! + real(wp), dimension(:,:,:,:), allocatable :: lut_qscat ! + real(wp), dimension(:,:,:), allocatable :: lut_qscat_carb ! + real(wp), dimension(:,:,:), allocatable :: lut_qscat_dust ! + real(wp), dimension(:,:,:,:), allocatable :: lut_gasym ! + real(wp), dimension(:,:,:), allocatable :: lut_gasym_carb ! + real(wp), dimension(:,:,:), allocatable :: lut_gasym_dust ! + real(wp), dimension(:,:,:), allocatable :: lut_growth ! + + ! ----------------- + ! Open aerosol optical property coefficient file + if(nf90_open(trim(aero_coeff_file), NF90_NOWRITE, ncid) /= NF90_NOERR) & + call stop_on_err("load_aero_lutcoeff(): can't open file " // trim(aero_coeff_file)) + + ! Read LUT coefficient dimensions + nband = get_dim_size(ncid,'nbands') + nrh = get_dim_size(ncid,'nrh') + nradbins = get_dim_size(ncid,'nradbins') + nbins = get_dim_size(ncid,'nbins') + ntype = get_dim_size(ncid,'ntype') + ncarb = get_dim_size(ncid,'ncarb') + ndust = get_dim_size(ncid,'ndust') + + allocate(band_lims_wvn(2, nband)) + band_lims_wvn = read_field(ncid, 'bnd_limits_wavenumber', 2, nband) + + allocate(rma(nradbins)) + rma = read_field(ncid,'rma',nradbins) + + allocate(radlim(nbins)) + radlim = read_field(ncid,'radlim',nbins) + + allocate(radparam(nbins,nradbins)) + radparam = read_field(ncid,'radparam',nbins, nradbins) + + ! Allocate aerosol property lookup table input arrays + allocate(lut_qext(ntype, nband, nradbins,nrh), & + lut_qext_carb(ncarb, nband, nradbins), & + lut_qext_dust(ndust, nband, nradbins), & + lut_qscat(ntype, nband, nradbins,nrh), & + lut_qscat_carb(ncarb, nband, nradbins), & + lut_qscat_dust(ndust, nband,nradbins), & + lut_gasym(ntype, nband, nradbins, nrh), & + lut_gasym_carb(ncarb, nband, nradbins), & + lut_gasym_dust(ndust, nband,nradbins), & + lut_growth(ntype, nradbins, nrh)) + + ! Read LUT coefficients + lut_qext = read_field(ncid, 'qext', ntype, nband, nradbins, nrh) + lut_qext_carb = read_field(ncid, 'qext_carb', ncarb, nband, nradbins) + lut_qext_dust = read_field(ncid, 'qext_dust', ndust, nband, nradbins) + lut_qscat = read_field(ncid, 'qscat', ntype, nband, nradbins, nrh) + lut_qscat_carb = read_field(ncid, 'qscat_carb', ncarb, nband, nradbins) + lut_qscat_dust = read_field(ncid, 'qscat_dust', ndust, nband, nradbins) + lut_gasym = read_field(ncid, 'gasym', ntype, nband, nradbins, nrh) + lut_gasym_carb = read_field(ncid, 'gasym_carb', ncarb, nband, nradbins) + lut_gasym_dust = read_field(ncid, 'gasym_dust', ndust, nband, nradbins) + lut_growth = read_field(ncid, 'growth',ntype,nradbins,nrh) + + ncid = nf90_close(ncid) + call stop_on_err(aero_spec%load(band_lims_wvn, rma, radlim, radparam, & + lut_qext, lut_qext_carb, lut_qext_dust, & + lut_qscat, lut_qscat_carb, lut_qscat_dust, & + lut_gasym, lut_gasym_carb, lut_gasym_dust, & + lut_growth)) + end subroutine load_aero_lutcoeff + + ! ----------------------------------------------------------------------------------- + subroutine stop_on_err(msg) + ! + ! Print error message and stop + ! + use iso_fortran_env, only : error_unit + character(len=*), intent(in) :: msg + if(len_trim(msg) > 0) then + write (error_unit,*) trim(msg) + error stop 1 + end if + end subroutine + +end module diff --git a/src/radiate/rte-rrtmgp/interface/mo_load_cloud_coefficients.F90 b/src/radiate/rte-rrtmgp/interface/mo_load_cloud_coefficients.F90 new file mode 100644 index 0000000..5a12c52 --- /dev/null +++ b/src/radiate/rte-rrtmgp/interface/mo_load_cloud_coefficients.F90 @@ -0,0 +1,314 @@ +module mo_load_cloud_coefficients + use mo_rte_kind, only: wp + use mo_optical_props, only: ty_optical_props, & + ty_optical_props_arry, & + ty_optical_props_1scl, & + ty_optical_props_2str, & + ty_optical_props_nstr + use mo_cloud_optics, only: ty_cloud_optics + use mo_simple_netcdf, only: read_field, read_string, var_exists, get_dim_size, & + write_field, create_dim, create_var + use netcdf + + implicit none + private + public :: load_cld_lutcoeff, load_cld_padecoeff + ! ---------------------------------------------------------------------------------- + +contains + !-------------------------------------------------------------------------------------------------------------------- + ! + ! read cloud optical property LUT coefficients from NetCDF file + ! + subroutine load_cld_lutcoeff(cloud_spec, cld_coeff_file) + class(ty_cloud_optics), intent(inout) :: cloud_spec + character(len=*), intent(in ) :: cld_coeff_file + ! ----------------- + ! Local variables + integer :: ncid, nband, nsize_cld, nsize_drz, nsize_rain, nsize_scol, nsize_hcol, & + nsize_plate, nsize_ros, nsize_agg, nsize_hail + + real(wp), dimension(:,:), allocatable :: band_lims_wvn + ! Lookup table interpolation constants + real(wp) :: radcld_lwr ! cloud droplet size lower bound for interpolation + real(wp) :: radcld_upr ! cloud droplet size upper bound for interpolation + real(wp) :: radcld_fac ! constant for calculating interpolation indices for droplets + real(wp) :: raddrz_lwr ! drizzle particle size lower bound for interpolation + real(wp) :: raddrz_upr ! drizzle particle size upper bound for interpolation + real(wp) :: raddrz_fac ! constant for calculating interpolation indices for drizzle + real(wp) :: radrain_lwr ! rain particle size lower bound for interpolation + real(wp) :: radrain_upr ! rain particle size upper bound for interpolation + real(wp) :: radrain_fac ! constant for calculating interpolation indices for rain + real(wp) :: radscol_lwr ! solid column size lower bound for interpolation + real(wp) :: radscol_upr ! solid column size upper bound for interpolation + real(wp) :: radscol_fac ! constant for calculating interpolation indices for solid columns + real(wp) :: radhcol_lwr ! hollow column size lower bound for interpolation + real(wp) :: radhcol_upr ! hollow column size upper bound for interpolation + real(wp) :: radhcol_fac ! constant for calculating interpolation indices for hollow columns + real(wp) :: radplate_lwr ! hexagonal plate size lower bound for interpolation + real(wp) :: radplate_upr ! hexagonal plate size upper bound for interpolation + real(wp) :: radplate_fac ! constant for calculating interpolation indices for hexagonal plates + real(wp) :: radros_lwr ! rosette size lower bound for interpolation + real(wp) :: radros_upr ! rosette size upper bound for interpolation + real(wp) :: radros_fac ! constant for calculating interpolation indices for rosettes + real(wp) :: radagg_lwr ! aggregate size lower bound for interpolation + real(wp) :: radagg_upr ! aggregate size upper bound for interpolation + real(wp) :: radagg_fac ! constant for calculating interpolation indices for aggregates + real(wp) :: radhail_lwr ! hail size lower bound for interpolation + real(wp) :: radhail_upr ! hail size upper bound for interpolation + real(wp) :: radhail_fac ! constant for calculating interpolation indices for hail + ! LUT coefficients + real(wp), dimension(:,:), allocatable :: lut_extcld ! extinction + real(wp), dimension(:,:), allocatable :: lut_ssacld ! single scattering albedo + real(wp), dimension(:,:), allocatable :: lut_asycld ! asymmetry parameter + real(wp), dimension(:,:), allocatable :: lut_extdrz ! + real(wp), dimension(:,:), allocatable :: lut_ssadrz ! + real(wp), dimension(:,:), allocatable :: lut_asydrz ! + real(wp), dimension(:,:), allocatable :: lut_extrain ! + real(wp), dimension(:,:), allocatable :: lut_ssarain ! + real(wp), dimension(:,:), allocatable :: lut_asyrain ! + real(wp), dimension(:,:), allocatable :: lut_extscol ! + real(wp), dimension(:,:), allocatable :: lut_ssascol ! + real(wp), dimension(:,:), allocatable :: lut_asyscol ! + real(wp), dimension(:,:), allocatable :: lut_exthcol ! + real(wp), dimension(:,:), allocatable :: lut_ssahcol ! + real(wp), dimension(:,:), allocatable :: lut_asyhcol ! + real(wp), dimension(:,:), allocatable :: lut_extplate ! + real(wp), dimension(:,:), allocatable :: lut_ssaplate ! + real(wp), dimension(:,:), allocatable :: lut_asyplate ! + real(wp), dimension(:,:), allocatable :: lut_extros ! + real(wp), dimension(:,:), allocatable :: lut_ssaros ! + real(wp), dimension(:,:), allocatable :: lut_asyros ! + real(wp), dimension(:,:), allocatable :: lut_extagg ! + real(wp), dimension(:,:), allocatable :: lut_ssaagg ! + real(wp), dimension(:,:), allocatable :: lut_asyagg ! + real(wp), dimension(:,:), allocatable :: lut_exthail ! + real(wp), dimension(:,:), allocatable :: lut_ssahail ! + real(wp), dimension(:,:), allocatable :: lut_asyhail ! + ! ----------------- + ! Open cloud optical property coefficient file + if(nf90_open(trim(cld_coeff_file), NF90_NOWRITE, ncid) /= NF90_NOERR) & + call stop_on_err("load_cld_lutcoeff(): can't open file " // trim(cld_coeff_file)) + + ! Read LUT coefficient dimensions + nband = get_dim_size(ncid,'nbands') + nsize_cld = get_dim_size(ncid,'ntabcld') + nsize_drz = get_dim_size(ncid,'ntabdrz') + nsize_rain = get_dim_size(ncid,'ntabrain') + nsize_scol = get_dim_size(ncid,'ntabscol') + nsize_hcol = get_dim_size(ncid,'ntabhcol') + nsize_plate = get_dim_size(ncid,'ntabplate') + nsize_ros = get_dim_size(ncid,'ntabros') + nsize_agg = get_dim_size(ncid,'ntabagg') + nsize_hail = get_dim_size(ncid,'ntabhail') + + allocate(band_lims_wvn(2, nband)) + band_lims_wvn = read_field(ncid, 'bnd_limits_wavenumber', 2, nband) + + ! Read LUT constants + ! I believe the facs aren't used + radcld_lwr = read_field(ncid, 'radcld_lwr') + radcld_upr = read_field(ncid, 'radcld_upr') + radcld_fac = 1.!read_field(ncid, 'radcld_fac') + raddrz_lwr = read_field(ncid, 'raddrz_lwr') + raddrz_upr = read_field(ncid, 'raddrz_upr') + raddrz_fac = 1.!read_field(ncid, 'raddrz_fac') + radrain_lwr = read_field(ncid, 'radrain_lwr') + radrain_upr = read_field(ncid, 'radrain_upr') + radrain_fac = 1.!read_field(ncid, 'radrain_fac') + radscol_lwr = read_field(ncid, 'radscol_lwr') + radscol_upr = read_field(ncid, 'radscol_upr') + radscol_fac = 1.!read_field(ncid, 'radscol_fac') + radhcol_lwr = read_field(ncid, 'radhcol_lwr') + radhcol_upr = read_field(ncid, 'radhcol_upr') + radhcol_fac = 1.!read_field(ncid, 'radhcol_fac') + radplate_lwr = read_field(ncid, 'radplate_lwr') + radplate_upr = read_field(ncid, 'radplate_upr') + radplate_fac = 1.!read_field(ncid, 'radplate_fac') + radros_lwr = read_field(ncid, 'radros_lwr') + radros_upr = read_field(ncid, 'radros_upr') + radros_fac = 1.!read_field(ncid, 'radros_fac') + radagg_lwr = read_field(ncid, 'radagg_lwr') + radagg_upr = read_field(ncid, 'radagg_upr') + radagg_fac = 1.!read_field(ncid, 'radagg_fac') + radhail_lwr = read_field(ncid, 'radhail_lwr') + radhail_upr = read_field(ncid, 'radhail_upr') + radhail_fac = 1.!read_field(ncid, 'radhail_fac') + + ! Allocate cloud property lookup table input arrays + allocate(lut_extcld(nsize_cld, nband), & + lut_ssacld(nsize_cld, nband), & + lut_asycld(nsize_cld, nband), & + lut_extdrz(nsize_drz, nband), & + lut_ssadrz(nsize_drz, nband), & + lut_asydrz(nsize_drz, nband), & + lut_extrain(nsize_rain, nband), & + lut_ssarain(nsize_rain, nband), & + lut_asyrain(nsize_rain, nband), & + lut_extscol(nsize_scol, nband), & + lut_ssascol(nsize_scol, nband), & + lut_asyscol(nsize_scol, nband), & + lut_exthcol(nsize_hcol, nband), & + lut_ssahcol(nsize_hcol, nband), & + lut_asyhcol(nsize_hcol, nband), & + lut_extplate(nsize_plate, nband), & + lut_ssaplate(nsize_plate, nband), & + lut_asyplate(nsize_plate, nband), & + lut_extros(nsize_ros, nband), & + lut_ssaros(nsize_ros, nband), & + lut_asyros(nsize_ros, nband), & + lut_extagg(nsize_agg, nband), & + lut_ssaagg(nsize_agg, nband), & + lut_asyagg(nsize_agg, nband), & + lut_exthail(nsize_hail, nband), & + lut_ssahail(nsize_hail, nband), & + lut_asyhail(nsize_hail, nband)) + + ! Read LUT coefficients + lut_extcld = read_field(ncid, 'lut_extcld', nsize_cld, nband) + lut_ssacld = read_field(ncid, 'lut_ssacld', nsize_cld, nband) + lut_asycld = read_field(ncid, 'lut_asycld', nsize_cld, nband) + lut_extdrz = read_field(ncid, 'lut_extdrz', nsize_drz, nband) + lut_ssadrz = read_field(ncid, 'lut_ssadrz', nsize_drz, nband) + lut_asydrz = read_field(ncid, 'lut_asydrz', nsize_drz, nband) + lut_extrain = read_field(ncid, 'lut_extrain', nsize_rain, nband) + lut_ssarain = read_field(ncid, 'lut_ssarain', nsize_rain, nband) + lut_asyrain = read_field(ncid, 'lut_asyrain', nsize_rain, nband) + lut_extscol = read_field(ncid, 'lut_extscol', nsize_scol, nband) + lut_ssascol = read_field(ncid, 'lut_ssascol', nsize_scol, nband) + lut_asyscol = read_field(ncid, 'lut_asyscol', nsize_scol, nband) + lut_exthcol = read_field(ncid, 'lut_exthcol', nsize_hcol, nband) + lut_ssahcol = read_field(ncid, 'lut_ssahcol', nsize_hcol, nband) + lut_asyhcol = read_field(ncid, 'lut_asyhcol', nsize_hcol, nband) + lut_extplate = read_field(ncid, 'lut_extplate', nsize_plate, nband) + lut_ssaplate = read_field(ncid, 'lut_ssaplate', nsize_plate, nband) + lut_asyplate = read_field(ncid, 'lut_asyplate', nsize_plate, nband) + lut_extros = read_field(ncid, 'lut_extros', nsize_ros, nband) + lut_ssaros = read_field(ncid, 'lut_ssaros', nsize_ros, nband) + lut_asyros = read_field(ncid, 'lut_asyros', nsize_ros, nband) + lut_extagg = read_field(ncid, 'lut_extagg', nsize_agg, nband) + lut_ssaagg = read_field(ncid, 'lut_ssaagg', nsize_agg, nband) + lut_asyagg = read_field(ncid, 'lut_asyagg', nsize_agg, nband) + lut_exthail = read_field(ncid, 'lut_exthail', nsize_hail, nband) + lut_ssahail = read_field(ncid, 'lut_ssahail', nsize_hail, nband) + lut_asyhail = read_field(ncid, 'lut_asyhail', nsize_hail, nband) + + ncid = nf90_close(ncid) + call stop_on_err(cloud_spec%load(band_lims_wvn, & + radcld_lwr, radcld_upr, radcld_fac, & + raddrz_lwr, raddrz_upr, raddrz_fac, & + radrain_lwr, radrain_upr, radrain_fac, & + radscol_lwr, radscol_upr, radscol_fac, & + radhcol_lwr, radhcol_upr, radhcol_fac, & + radplate_lwr, radplate_upr, radplate_fac, & + radros_lwr, radros_upr, radros_fac, & + radagg_lwr, radagg_upr, radagg_fac, & + radhail_lwr, radhail_upr, radhail_fac, & + lut_extcld, lut_ssacld, lut_asycld, & + lut_extdrz, lut_ssadrz, lut_asydrz, & + lut_extrain, lut_ssarain, lut_asyrain, & + lut_extscol, lut_ssascol, lut_asyscol, & + lut_exthcol, lut_ssahcol, lut_asyhcol, & + lut_extplate, lut_ssaplate, lut_asyplate, & + lut_extros, lut_ssaros, lut_asyros, & + lut_extagg, lut_ssaagg, lut_asyagg, & + lut_exthail, lut_ssahail, lut_asyhail)) + end subroutine load_cld_lutcoeff + !-------------------------------------------------------------------------------------------------------------------- + ! read cloud optical property Pade coefficients from NetCDF file + ! + subroutine load_cld_padecoeff(cloud_spec, cld_coeff_file) + class(ty_cloud_optics), intent(inout) :: cloud_spec + character(len=*), intent(in ) :: cld_coeff_file + ! ----------------- + ! Local variables + integer :: ncid, nband, nrghice, nsizereg, ncoeff_ext, ncoeff_ssa_g, nbound + + ! Spectral discretization + real(wp), dimension(:,:), allocatable :: band_lims_wvn + + ! Pade coefficients + real(wp), dimension(:,:,:), allocatable :: pade_extliq ! extinction: liquid + real(wp), dimension(:,:,:), allocatable :: pade_ssaliq ! single scattering albedo: liquid + real(wp), dimension(:,:,:), allocatable :: pade_asyliq ! asymmetry parameter: liquid + real(wp), dimension(:,:,:,:), allocatable :: pade_extice ! extinction: ice + real(wp), dimension(:,:,:,:), allocatable :: pade_ssaice ! single scattering albedo: ice + real(wp), dimension(:,:,:,:), allocatable :: pade_asyice ! asymmetry parameter: ice + + ! Pade particle size regime boundaries + real(wp), dimension(:), allocatable :: pade_sizreg_extliq + real(wp), dimension(:), allocatable :: pade_sizreg_ssaliq + real(wp), dimension(:), allocatable :: pade_sizreg_asyliq + real(wp), dimension(:), allocatable :: pade_sizreg_extice + real(wp), dimension(:), allocatable :: pade_sizreg_ssaice + real(wp), dimension(:), allocatable :: pade_sizreg_asyice + ! ----------------- + ! Open cloud optical property coefficient file + if(nf90_open(trim(cld_coeff_file), NF90_NOWRITE, ncid) /= NF90_NOERR) & + call stop_on_err("load_cld_padecoeff(): can't open file " // trim(cld_coeff_file)) + + ! Read Pade coefficient dimensions + nband = get_dim_size(ncid,'nband') + nrghice = get_dim_size(ncid,'nrghice') + nsizereg = get_dim_size(ncid,'nsizereg') + ncoeff_ext = get_dim_size(ncid,'ncoeff_ext') + ncoeff_ssa_g = get_dim_size(ncid,'ncoeff_ssa_g') + nbound = get_dim_size(ncid,'nbound') + + ! + allocate(band_lims_wvn(2, nband)) + band_lims_wvn = read_field(ncid, 'bnd_limits_wavenumber', 2, nband) + + ! Allocate cloud property Pade coefficient input arrays + allocate(pade_extliq(nband, nsizereg, ncoeff_ext), & + pade_ssaliq(nband, nsizereg, ncoeff_ssa_g), & + pade_asyliq(nband, nsizereg, ncoeff_ssa_g), & + pade_extice(nband, nsizereg, ncoeff_ext, nrghice), & + pade_ssaice(nband, nsizereg, ncoeff_ssa_g, nrghice), & + pade_asyice(nband, nsizereg, ncoeff_ssa_g, nrghice)) + + pade_extliq = read_field(ncid, 'pade_extliq', nband, nsizereg, ncoeff_ext) + pade_ssaliq = read_field(ncid, 'pade_ssaliq', nband, nsizereg, ncoeff_ssa_g) + pade_asyliq = read_field(ncid, 'pade_asyliq', nband, nsizereg, ncoeff_ssa_g) + pade_extice = read_field(ncid, 'pade_extice', nband, nsizereg, ncoeff_ext, nrghice) + pade_ssaice = read_field(ncid, 'pade_ssaice', nband, nsizereg, ncoeff_ssa_g, nrghice) + pade_asyice = read_field(ncid, 'pade_asyice', nband, nsizereg, ncoeff_ssa_g, nrghice) + + ! Allocate cloud property Pade coefficient particle size boundary input arrays + allocate(pade_sizreg_extliq(nbound), & + pade_sizreg_ssaliq(nbound), & + pade_sizreg_asyliq(nbound), & + pade_sizreg_extice(nbound), & + pade_sizreg_ssaice(nbound), & + pade_sizreg_asyice(nbound)) + + pade_sizreg_extliq = read_field(ncid, 'pade_sizreg_extliq', nbound) + pade_sizreg_ssaliq = read_field(ncid, 'pade_sizreg_ssaliq', nbound) + pade_sizreg_asyliq = read_field(ncid, 'pade_sizreg_asyliq', nbound) + pade_sizreg_extice = read_field(ncid, 'pade_sizreg_extice', nbound) + pade_sizreg_ssaice = read_field(ncid, 'pade_sizreg_ssaice', nbound) + pade_sizreg_asyice = read_field(ncid, 'pade_sizreg_asyice', nbound) + + ncid = nf90_close(ncid) + + call stop_on_err(cloud_spec%load(band_lims_wvn, & + pade_extliq, pade_ssaliq, pade_asyliq, & + pade_extice, pade_ssaice, pade_asyice, & + pade_sizreg_extliq, pade_sizreg_ssaliq, pade_sizreg_asyliq, & + pade_sizreg_extice, pade_sizreg_ssaice, pade_sizreg_asyice)) + end subroutine load_cld_padecoeff + + ! ----------------------------------------------------------------------------------- + subroutine stop_on_err(msg) + ! + ! Print error message and stop + ! + use iso_fortran_env, only : error_unit + character(len=*), intent(in) :: msg + if(len_trim(msg) > 0) then + write (error_unit,*) trim(msg) + error stop 1 + end if + end subroutine + +end module diff --git a/src/radiate/rte-rrtmgp/interface/mo_load_coefficients.F90 b/src/radiate/rte-rrtmgp/interface/mo_load_coefficients.F90 new file mode 100644 index 0000000..dfef370 --- /dev/null +++ b/src/radiate/rte-rrtmgp/interface/mo_load_coefficients.F90 @@ -0,0 +1,252 @@ +! This code is part of RRTM for GCM Applications - Parallel (RRTMGP) +! +! Contacts: Robert Pincus and Eli Mlawer +! email: rrtmgp@aer.com +! +! Copyright 2015-2018, Atmospheric and Environmental Research and +! Regents of the University of Colorado. All right reserved. +! +! Use and duplication is permitted under the terms of the +! BSD 3-clause license, see http://opensource.org/licenses/BSD-3-Clause +! ------------------------------------------------------------------------------------------------- +! +! The gas optics class used by RRMTGP needs to be initialized with data stored in a netCDF file. +! RRTMGP itself doesn't include methods for reading the data so we don't conflict with users' +! local environment. This module provides a straight-forward implementation of reading the data +! and calling gas_optics%load(). +! +! ------------------------------------------------------------------------------------------------- +module mo_load_coefficients + ! + ! Modules for working with rte and rrtmgp + ! + use mo_rte_kind, only: wp, wl + use mo_gas_concentrations, only: ty_gas_concs + use mo_gas_optics_rrtmgp, only: ty_gas_optics_rrtmgp + ! -------------------------------------------------- + use mo_simple_netcdf, only: read_field, read_char_vec, read_logical_vec, var_exists, get_dim_size + use netcdf + implicit none + private + public :: load_and_init + +contains + subroutine stop_on_err(msg) + use iso_fortran_env, only : error_unit + character(len=*), intent(in) :: msg + + + if(msg /= "") then + write(error_unit, *) msg + error stop 1 + end if + end subroutine + !-------------------------------------------------------------------------------------------------------------------- + ! read optical coefficients from NetCDF file + subroutine load_and_init(kdist, filename, available_gases) + class(ty_gas_optics_rrtmgp), intent(inout) :: kdist + character(len=*), intent(in ) :: filename + class(ty_gas_concs), intent(in ) :: available_gases ! Which gases does the host model have available? + ! -------------------------------------------------- + ! + ! Variables that will be passed to gas_optics%load() + ! + character(len=32), dimension(:), allocatable :: gas_names + integer, dimension(:,:,:), allocatable :: key_species + integer, dimension(:,: ), allocatable :: band2gpt + real(wp), dimension(:,: ), allocatable :: band_lims + real(wp) :: press_ref_trop, temp_ref_p, temp_ref_t + real(wp), dimension(: ), allocatable :: press_ref + real(wp), dimension(: ), allocatable :: temp_ref + real(wp), dimension(:,:,: ), allocatable :: vmr_ref + real(wp), dimension(:,:,:,:), allocatable :: kmajor + + character(len=32), dimension(:), allocatable :: gas_minor, identifier_minor + character(len=32), dimension(:), allocatable :: minor_gases_lower, minor_gases_upper + integer, dimension(:,:), allocatable :: minor_limits_gpt_lower, minor_limits_gpt_upper + integer, dimension(:), allocatable :: minor_scales_with_density_lower, minor_scales_with_density_upper + character(len=32), dimension(:), allocatable :: scaling_gas_lower, scaling_gas_upper + integer, dimension(:), allocatable :: scale_by_complement_lower, scale_by_complement_upper + integer, dimension(:), allocatable :: kminor_start_lower, kminor_start_upper + real(wp), dimension(:,:,:), allocatable :: kminor_lower, kminor_upper + + real(wp), dimension(:,:,: ), allocatable :: rayl_lower, rayl_upper + real(wp), dimension(: ), allocatable :: solar_quiet, solar_facular, solar_sunspot + real(wp) :: tsi_default, mg_default, sb_default + real(wp), dimension(:,: ), allocatable :: totplnk + real(wp), dimension(:,:,:,:), allocatable :: planck_frac + real(wp), dimension(:,:) , allocatable :: optimal_angle_fit + + ! ----------------- + ! + ! Book-keeping variables + ! + integer :: ncid + integer :: ntemps, & + npress, & + nabsorbers, & + nextabsorbers, & + nminorabsorbers, & + nmixingfracs, & + nlayers, & + nbnds, & + ngpts, & + npairs, & + nminor_absorber_intervals_lower, & + nminor_absorber_intervals_upper, & + ncontributors_lower, & + ncontributors_upper, & + ninternalSourcetemps, & + nfit_coeffs + ! -------------------------------------------------- + ! + ! How big are the various arrays? + ! + if(nf90_open(trim(fileName), NF90_NOWRITE, ncid) /= NF90_NOERR) & + call stop_on_err("load_and_init(): can't open file " // trim(fileName)) + ntemps = get_dim_size(ncid,'temperature') + npress = get_dim_size(ncid,'pressure') + nabsorbers = get_dim_size(ncid,'absorber') + nminorabsorbers = get_dim_size(ncid,'minor_absorber') + nextabsorbers = get_dim_size(ncid,'absorber_ext') + nmixingfracs = get_dim_size(ncid,'mixing_fraction') + nlayers = get_dim_size(ncid,'atmos_layer') + nbnds = get_dim_size(ncid,'bnd') + ngpts = get_dim_size(ncid,'gpt') + npairs = get_dim_size(ncid,'pair') + nminor_absorber_intervals_lower & + = get_dim_size(ncid,'minor_absorber_intervals_lower') + nminor_absorber_intervals_upper & + = get_dim_size(ncid,'minor_absorber_intervals_upper') + ninternalSourcetemps & + = get_dim_size(ncid,'temperature_Planck') + ncontributors_lower = get_dim_size(ncid,'contributors_lower') + ncontributors_upper = get_dim_size(ncid,'contributors_upper') + nfit_coeffs = get_dim_size(ncid,'fit_coeffs') ! Will be 0 for SW + + ! ----------------- + ! + ! Read the many arrays + ! + gas_names = read_char_vec(ncid, 'gas_names', nabsorbers) + key_species = int(read_field(ncid, 'key_species', 2, nlayers, nbnds)) + band_lims = read_field(ncid, 'bnd_limits_wavenumber', 2, nbnds) + band2gpt = int(read_field(ncid, 'bnd_limits_gpt', 2, nbnds)) + press_ref = read_field(ncid, 'press_ref', npress) + temp_ref = read_field(ncid, 'temp_ref', ntemps) + temp_ref_p = read_field(ncid, 'absorption_coefficient_ref_P') + temp_ref_t = read_field(ncid, 'absorption_coefficient_ref_T') + press_ref_trop = read_field(ncid, 'press_ref_trop') + kminor_lower = read_field(ncid, 'kminor_lower', & + ncontributors_lower, nmixingfracs, ntemps) + kminor_upper = read_field(ncid, 'kminor_upper', & + ncontributors_upper, nmixingfracs, ntemps) + gas_minor = read_char_vec(ncid, 'gas_minor', nminorabsorbers) + identifier_minor = read_char_vec(ncid, 'identifier_minor', nminorabsorbers) + minor_gases_lower = read_char_vec(ncid, 'minor_gases_lower', nminor_absorber_intervals_lower) + minor_gases_upper = read_char_vec(ncid, 'minor_gases_upper', nminor_absorber_intervals_upper) + minor_limits_gpt_lower & + = int(read_field(ncid, 'minor_limits_gpt_lower', npairs,nminor_absorber_intervals_lower)) + minor_limits_gpt_upper & + = int(read_field(ncid, 'minor_limits_gpt_upper', npairs,nminor_absorber_intervals_upper)) + minor_scales_with_density_lower & + = read_field(ncid, 'minor_scales_with_density_lower', nminor_absorber_intervals_lower) + minor_scales_with_density_upper & + = read_field(ncid, 'minor_scales_with_density_upper', nminor_absorber_intervals_upper) + scale_by_complement_lower & + = read_field(ncid, 'scale_by_complement_lower', nminor_absorber_intervals_lower) + scale_by_complement_upper & + = read_field(ncid, 'scale_by_complement_upper', nminor_absorber_intervals_upper) + scaling_gas_lower & + = read_char_vec(ncid, 'scaling_gas_lower', nminor_absorber_intervals_lower) + scaling_gas_upper & + = read_char_vec(ncid, 'scaling_gas_upper', nminor_absorber_intervals_upper) + kminor_start_lower & + = int(read_field(ncid, 'kminor_start_lower', nminor_absorber_intervals_lower)) + kminor_start_upper & + = int(read_field(ncid, 'kminor_start_upper', nminor_absorber_intervals_upper)) + vmr_ref = read_field(ncid, 'vmr_ref', nlayers, nextabsorbers, ntemps) + + kmajor = read_field(ncid, 'kmajor', ngpts, nmixingfracs, npress+1, ntemps) + if(var_exists(ncid, 'rayl_lower')) then + rayl_lower = read_field(ncid, 'rayl_lower', ngpts, nmixingfracs, ntemps) + rayl_upper = read_field(ncid, 'rayl_upper', ngpts, nmixingfracs, ntemps) + end if + ! -------------------------------------------------- + ! + ! Initialize the gas optics class with data. The calls look slightly different depending + ! on whether the radiation sources are internal to the atmosphere (longwave) or external (shortwave) + ! gas_optics%load() returns a string; a non-empty string indicates an error. + ! + if(var_exists(ncid, 'totplnk')) then + ! + ! If there's a totplnk variable in the file it's a longwave (internal sources) type + ! + totplnk = read_field(ncid, 'totplnk', ninternalSourcetemps, nbnds) + planck_frac = read_field(ncid, 'plank_fraction', ngpts, nmixingfracs, npress+1, ntemps) + optimal_angle_fit = read_field(ncid, 'optimal_angle_fit', nfit_coeffs, nbnds) + call stop_on_err(kdist%load(available_gases, & + gas_names, & + key_species, & + band2gpt, & + band_lims, & + press_ref, & + press_ref_trop, & + temp_ref, & + temp_ref_p, temp_ref_t, & + vmr_ref, kmajor, & + kminor_lower, kminor_upper, & + gas_minor,identifier_minor, & + minor_gases_lower, minor_gases_upper, & + minor_limits_gpt_lower, & + minor_limits_gpt_upper, & + minor_scales_with_density_lower, & + minor_scales_with_density_upper, & + scaling_gas_lower, scaling_gas_upper, & + scale_by_complement_lower, & + scale_by_complement_upper, & + kminor_start_lower, & + kminor_start_upper, & + totplnk, planck_frac, & + rayl_lower, rayl_upper, & + optimal_angle_fit)) + else + ! + ! Solar source doesn't have an dependencies yet + ! + solar_quiet = read_field(ncid, 'solar_source_quiet', ngpts) + solar_facular = read_field(ncid, 'solar_source_facular', ngpts) + solar_sunspot = read_field(ncid, 'solar_source_sunspot', ngpts) + tsi_default = read_field(ncid, 'tsi_default') + mg_default = read_field(ncid, 'mg_default') + sb_default = read_field(ncid, 'sb_default') + call stop_on_err(kdist%load(available_gases, & + gas_names, & + key_species, & + band2gpt, & + band_lims, & + press_ref, & + press_ref_trop, & + temp_ref, & + temp_ref_p, temp_ref_t, & + vmr_ref, kmajor, & + kminor_lower, kminor_upper, & + gas_minor,identifier_minor,& + minor_gases_lower, minor_gases_upper, & + minor_limits_gpt_lower, & + minor_limits_gpt_upper, & + minor_scales_with_density_lower, & + minor_scales_with_density_upper, & + scaling_gas_lower, scaling_gas_upper, & + scale_by_complement_lower, & + scale_by_complement_upper, & + kminor_start_lower, & + kminor_start_upper, & + solar_quiet, solar_facular, solar_sunspot, & + tsi_default, mg_default, sb_default, & + rayl_lower, rayl_upper)) + end if + ! -------------------------------------------------- + ncid = nf90_close(ncid) + end subroutine load_and_init +end module diff --git a/src/radiate/rte-rrtmgp/interface/mo_simple_netcdf.F90 b/src/radiate/rte-rrtmgp/interface/mo_simple_netcdf.F90 new file mode 100644 index 0000000..3ca1ec4 --- /dev/null +++ b/src/radiate/rte-rrtmgp/interface/mo_simple_netcdf.F90 @@ -0,0 +1,413 @@ +module mo_simple_netcdf + use mo_rte_kind, only: wp, wl + use netcdf + implicit none + private + + interface read_field + module procedure read_scalar, read_1d_field, read_2d_field, read_3d_field, read_4d_field + end interface + interface write_field + module procedure write_1d_int_field, write_2d_int_field, & + write_1d_field, write_2d_field, write_3d_field, write_4d_field + end interface + + public :: dim_exists, get_dim_size, create_dim, & + var_exists, get_var_size, create_var, & + read_field, read_string, read_char_vec, read_logical_vec, write_field +contains + !-------------------------------------------------------------------------------------------------------------------- + function read_scalar(ncid, varName) + integer, intent(in) :: ncid + character(len=*), intent(in) :: varName + real(wp) :: read_scalar + + integer :: varid + + if(nf90_inq_varid(ncid, trim(varName), varid) /= NF90_NOERR) & + call stop_on_err("read_field: can't find variable " // trim(varName)) + if(nf90_get_var(ncid, varid, read_scalar) /= NF90_NOERR) & + call stop_on_err("read_field: can't read variable " // trim(varName)) + + end function read_scalar + !-------------------------------------------------------------------------------------------------------------------- + function read_1d_field(ncid, varName, nx) + integer, intent(in) :: ncid + character(len=*), intent(in) :: varName + integer, intent(in) :: nx + real(wp), dimension(nx) :: read_1d_field + + integer :: varid + + if(nf90_inq_varid(ncid, trim(varName), varid) /= NF90_NOERR) & + call stop_on_err("read_field: can't find variable " // trim(varName)) + if(nf90_get_var(ncid, varid, read_1d_field) /= NF90_NOERR) & + call stop_on_err("read_field: can't read variable " // trim(varName)) + + end function read_1d_field + !-------------------------------------------------------------------------------------------------------------------- + function read_2d_field(ncid, varName, nx, ny) + integer, intent(in) :: ncid + character(len=*), intent(in) :: varName + integer, intent(in) :: nx, ny + real(wp), dimension(nx, ny) :: read_2d_field + + integer :: varid + + if(nf90_inq_varid(ncid, trim(varName), varid) /= NF90_NOERR) & + call stop_on_err("read_field: can't find variable " // trim(varName)) + if(nf90_get_var(ncid, varid, read_2d_field) /= NF90_NOERR) & + call stop_on_err("read_field: can't read variable " // trim(varName)) + + end function read_2d_field + !-------------------------------------------------------------------------------------------------------------------- + function read_3d_field(ncid, varName, nx, ny, nz) + integer, intent(in) :: ncid + character(len=*), intent(in) :: varName + integer, intent(in) :: nx, ny, nz + real(wp), dimension(nx, ny, nz) :: read_3d_field + + integer :: varid + + if(nf90_inq_varid(ncid, trim(varName), varid) /= NF90_NOERR) & + call stop_on_err("read_field: can't find variable " // trim(varName)) + if(nf90_get_var(ncid, varid, read_3d_field) /= NF90_NOERR) & + call stop_on_err("read_field: can't read variable " // trim(varName)) + + end function read_3d_field + !-------------------------------------------------------------------------------------------------------------------- + function read_4d_field(ncid, varName, nw, nx, ny, nz) + integer, intent(in) :: ncid + character(len=*), intent(in) :: varName + integer, intent(in) :: nw, nx, ny, nz + real(wp), dimension(nw, nx, ny, nz) :: read_4d_field + + integer :: varid + + if(nf90_inq_varid(ncid, trim(varName), varid) /= NF90_NOERR) & + call stop_on_err("read_field: can't find variable " // trim(varName)) + if(nf90_get_var(ncid, varid, read_4d_field) /= NF90_NOERR) & + call stop_on_err("read_field: can't read variable " // trim(varName)) + + end function read_4d_field + !-------------------------------------------------------------------------------------------------------------------- + function read_string(ncid, varName, nc) + integer, intent(in) :: ncid + character(len=*), intent(in) :: varName + integer, intent(in) :: nc + character(len=nc) :: read_string + + integer :: varid + + if(nf90_inq_varid(ncid, trim(varName), varid) /= NF90_NOERR) then + read_string = "" + return + end if + if(nf90_get_var(ncid, varid, read_string) /= NF90_NOERR) & + call stop_on_err("read_field: can't read variable " // trim(varName)) + end function read_string + !-------------------------------------------------------------------------------------------------------------------- + ! Writing functions + !-------------------------------------------------------------------------------------------------------------------- + function write_1d_int_field(ncid, varName, var) result(err_msg) + integer, intent(in) :: ncid + character(len=*), intent(in) :: varName + integer, dimension(:), intent(in) :: var + character(len=128) :: err_msg + + integer :: varid + + err_msg = "" + if(nf90_inq_varid(ncid, trim(varName), varid) /= NF90_NOERR) then + err_msg = "write_field: can't find variable " // trim(varName) + return + end if + if(nf90_put_var(ncid, varid, var) /= NF90_NOERR) & + err_msg = "write_field: can't write variable " // trim(varName) + + end function write_1d_int_field + !-------------------------------------------------------------------------------------------------------------------- + function write_2d_int_field(ncid, varName, var) result(err_msg) + integer, intent(in) :: ncid + character(len=*), intent(in) :: varName + integer, dimension(:,:), intent(in) :: var + character(len=128) :: err_msg + + integer :: varid + + err_msg = "" + if(nf90_inq_varid(ncid, trim(varName), varid) /= NF90_NOERR) then + err_msg = "write_field: can't find variable " // trim(varName) + return + end if + if(nf90_put_var(ncid, varid, var) /= NF90_NOERR) & + err_msg = "write_field: can't write variable " // trim(varName) + + end function write_2d_int_field + !-------------------------------------------------------------------------------------------------------------------- + function write_1d_field(ncid, varName, var) result(err_msg) + integer, intent(in) :: ncid + character(len=*), intent(in) :: varName + real(wp), dimension(:), intent(in) :: var + character(len=128) :: err_msg + + integer :: varid + + err_msg = "" + if(nf90_inq_varid(ncid, trim(varName), varid) /= NF90_NOERR) then + err_msg = "write_field: can't find variable " // trim(varName) + return + end if + if(nf90_put_var(ncid, varid, var) /= NF90_NOERR) & + err_msg = "write_field: can't write variable " // trim(varName) + + end function write_1d_field + !-------------------------------------------------------------------------------------------------------------------- + function write_2d_field(ncid, varName, var) result(err_msg) + integer, intent(in) :: ncid + character(len=*), intent(in) :: varName + real(wp), dimension(:,:), intent(in) :: var + character(len=128) :: err_msg + + integer :: varid + integer :: stat + + err_msg = "" + if(nf90_inq_varid(ncid, trim(varName), varid) /= NF90_NOERR) then + err_msg = "write_field: can't find variable " // trim(varName) + return + end if + stat = nf90_put_var(ncid, varid, var) + if(stat /= NF90_NOERR) & + err_msg = "write_field: can't write variable " // trim(varName) // & + " netcdf err: " // nf90_strerror(stat) + + end function write_2d_field + !-------------------------------------------------------------------------------------------------------------------- + function write_3d_field(ncid, varName, var) result(err_msg) + integer, intent(in) :: ncid + character(len=*), intent(in) :: varName + real(wp), dimension(:,:,:), intent(in) :: var + character(len=128) :: err_msg + + integer :: varid + integer :: stat + + err_msg = "" + if(nf90_inq_varid(ncid, trim(varName), varid) /= NF90_NOERR) then + err_msg = "write_field: can't find variable " // trim(varName) + return + end if + stat = nf90_put_var(ncid, varid, var) + if(stat /= NF90_NOERR) & + err_msg = "write_field: can't write variable " // trim(varName) // & + " netcdf err: " // nf90_strerror(stat) + + end function write_3d_field + !-------------------------------------------------------------------------------------------------------------------- + function write_4d_field(ncid, varName, var) result(err_msg) + integer, intent(in) :: ncid + character(len=*), intent(in) :: varName + real(wp), dimension(:,:,:,:), intent(in) :: var + character(len=128) :: err_msg + + integer :: varid + integer :: stat + + err_msg = "" + if(nf90_inq_varid(ncid, trim(varName), varid) /= NF90_NOERR) then + err_msg = "write_field: can't find variable " // trim(varName) + return + end if + stat = nf90_put_var(ncid, varid, var) + if(stat /= NF90_NOERR) & + err_msg = "write_field: can't write variable " // trim(varName) // & + " netcdf err: " // nf90_strerror(stat) + + end function write_4d_field + !-------------------------------------------------------------------------------------------------------------------- + function read_logical_vec(ncid, varName, nx) + integer, intent(in) :: ncid + character(len=*), intent(in) :: varName + integer, intent(in) :: nx + integer, dimension(nx) :: read_logical_tmp + logical(wl), dimension(nx) :: read_logical_vec + + integer :: varid + integer :: ix + + if(nf90_inq_varid(ncid, trim(varName), varid) /= NF90_NOERR) & + call stop_on_err("read_logical_vec: can't find variable " // trim(varName)) + if(nf90_get_var(ncid, varid, read_logical_tmp) /= NF90_NOERR) & + call stop_on_err("read_logical_vec: can't read variable " // trim(varName)) + do ix = 1, nx + if (read_logical_tmp(ix) .eq. 0) then + read_logical_vec(ix) = .false. + else + read_logical_vec(ix) = .true. + endif + enddo + + end function read_logical_vec + !-------------------------------------------------------------------------------------------------------------------- + function read_char_vec(ncid, varName, nx) + integer, intent(in) :: ncid + character(len=*), intent(in) :: varName + integer, intent(in) :: nx + character(len=32), dimension(nx) :: read_char_vec + + integer :: varid + + if(nf90_inq_varid(ncid, trim(varName), varid) /= NF90_NOERR) & + call stop_on_err("read_char_vec: can't find variable " // trim(varName)) + if(nf90_get_var(ncid, varid, read_char_vec) /= NF90_NOERR) & + call stop_on_err("read_char_vec: can't read variable " // trim(varName)) + + end function read_char_vec + !-------------------------------------------------------------------------------------------------------------------- + function dim_exists(ncid, dimName) + ! + ! Does this dimension exist (have a valid dim_id) in the open netCDF file? + ! + integer, intent(in) :: ncid + character(len=*), intent(in) :: dimName + logical :: dim_exists + + integer :: dimid + dim_exists = nf90_inq_dimid(ncid, trim(dimName), dimid) == NF90_NOERR + end function dim_exists + !-------------------------------------------------------------------------------------------------------------------- + function var_exists(ncid, varName) + ! + ! Does this variable exist (have a valid var_id) in the open netCDF file? + ! + integer, intent(in) :: ncid + character(len=*), intent(in) :: varName + logical :: var_exists + + integer :: varId + var_exists = nf90_inq_varid(ncid, trim(varName), varid) == NF90_NOERR + end function var_exists + !-------------------------------------------------------------------------------------------------------------------- + subroutine create_dim(ncid, dimName, dimLength) + ! + ! Check to see if a dimiable with this name exists in the file + ! If so, check against current size + ! If not, create with specified dimensions + ! + integer, intent(in) :: ncid + character(len=*), intent(in) :: dimName + integer, intent(in) :: dimLength + + integer :: dimid + + if(dim_exists(ncid, dimName)) then + if (dimLength /= get_dim_size(ncid, trim(dimName))) & + call stop_on_err("dim " // trim(dimName) // " is present but incorrectly sized.") + else + if(nf90_redef(ncid) /= NF90_NOERR) & + call stop_on_err("create_dim: can't put file into redefine mode") + if(nf90_def_dim(ncid, dimName, dimLength, dimid) /= NF90_NOERR) & + call stop_on_err("create_dim: can't define dimension " // trim(dimName)) + if(nf90_enddef(ncid) /= NF90_NOERR) & + call stop_on_err("create_dim: can't end redefinition??") + end if + end subroutine create_dim + !-------------------------------------------------------------------------------------------------------------------- + subroutine create_var(ncid, varName, dimNames, dimLengths, dataType) + ! + ! Check to see if a variable with this name exists in the file + ! If so, check against current size + ! If not, create with specified dimensions + ! datatype: NF90_DOUBLE, NF90_FLOAT, NF90_INT, etc. + ! + integer, intent(in) :: ncid + character(len=*), intent(in) :: varName + character(len=*), intent(in) :: dimNames(:) + integer, intent(in) :: dimLengths(:) + integer, optional, intent(in) :: dataType + + integer :: i, varid, xtype + integer :: dimIds(size(dimNames)) + + if(var_exists(ncid, varName)) then + do i = 1, size(dimNames) + if (dimLengths(i) /= get_dim_size(ncid, trim(dimNames(i)))) & + call stop_on_err("Variable " // trim(varName) // " is present but incorrectly sized.") + end do + else + do i = 1, size(dimNames) + if(nf90_inq_dimid(ncid, trim(dimNames(i)), dimIds(i)) /= NF90_NOERR) & + call stop_on_err("create_var: Can't get id for dimension " // trim(dimnames(i))) + end do + if(nf90_redef(ncid) /= NF90_NOERR) & + call stop_on_err("create_var: can't put file into redefine mode") + xtype = NF90_DOUBLE + if(present(dataType)) xtype = dataType + if(nf90_def_var(ncid, varName, xtype, dimIds, varid) /= NF90_NOERR) & + call stop_on_err("create_var: can't define variable " // trim(varName)) + if(nf90_enddef(ncid) /= NF90_NOERR) & + call stop_on_err("create_dim: can't end redefinition??") + end if + end subroutine create_var + !-------------------------------------------------------------------------------------------------------------------- + function get_dim_size(ncid, dimname) + ! + ! Get the length of a dimension from an open netCDF file + ! This is unfortunately a two-step process + ! + integer, intent(in) :: ncid + character(len=*), intent(in) :: dimname + integer :: get_dim_size + + integer :: dimid + + if(nf90_inq_dimid(ncid, trim(dimname), dimid) == NF90_NOERR) then + if(nf90_inquire_dimension(ncid, dimid, len=get_dim_size) /= NF90_NOERR) get_dim_size = 0 + else + get_dim_size = 0 + end if + + end function get_dim_size + !-------------------------------------------------------------------------------------------------------------------- + function get_var_size(ncid, varName, n) + ! + ! Returns the extents of a netcdf variable on disk + ! + integer, intent(in) :: ncid + character(len=*), intent(in) :: varName + integer, intent(in) :: n + integer :: get_var_size(n) + + integer :: i + integer :: varid, ndims, dimids(n) + + get_var_size(n) = -1 + if(nf90_inq_varid(ncid, trim(varName), varid) /= NF90_NOERR) & + call stop_on_err("get_var_size: can't find variable " // trim(varName)) + if(nf90_inquire_variable(ncid, varid, ndims = ndims) /= NF90_NOERR) & + call stop_on_err("get_var_size: can't get information for variable " // trim(varName)) + if(ndims /= n) & + call stop_on_err("get_var_size: variable " // trim(varName) // " has the wrong number of dimensions" ) + if(nf90_inquire_variable(ncid, varid, dimids = dimids) /= NF90_NOERR) & + call stop_on_err("get_var_size: can't read dimension ids for variable " // trim(varName)) + do i = 1, n + if(nf90_inquire_dimension(ncid, dimids(i), len = get_var_size(i)) /= NF90_NOERR) & + call stop_on_err("get_var_size: can't get dimension lengths for variable " // trim(varName)) + end do + + end function get_var_size + !-------------------------------------------------------------------------------------------------------------------- + subroutine stop_on_err(msg) + ! + ! Print error message and stop + ! + use iso_fortran_env, only : error_unit + character(len=*), intent(in) :: msg + if(len_trim(msg) > 0) then + write(error_unit,*) trim(msg) + error stop 1 + end if + end subroutine + !-------------------------------------------------------------------------------------------------------------------- +end module mo_simple_netcdf diff --git a/src/radiate/rte-rrtmgp/interface/rams_rrtmgp_driver.F90 b/src/radiate/rte-rrtmgp/interface/rams_rrtmgp_driver.F90 new file mode 100644 index 0000000..c1b3621 --- /dev/null +++ b/src/radiate/rte-rrtmgp/interface/rams_rrtmgp_driver.F90 @@ -0,0 +1,355 @@ +subroutine stop_on_err(error_msg) + use iso_fortran_env, only : error_unit + character(len=*), intent(in) :: error_msg + + if(error_msg /= "") then + write (error_unit,*) trim(error_msg) + write (error_unit,*) "rte_rrtmgp_clouds stopping" + error stop 1 + end if +end subroutine stop_on_err + +! ---------------------------------------------------------------------------------- +subroutine rte_rrtmgp_init() + + use rte_rrtmgp_rams + use micro_prm, only:hucmfile + use micphys, only:iaerorad + use mo_load_cloud_coefficients, & + only: load_cld_lutcoeff + use mo_load_aerosol_coefficients, & + only: load_aero_lutcoeff + use mo_load_coefficients, only: load_and_init + use mo_cloud_optics, only: ty_cloud_optics + use mo_aerosol_optics, only: ty_aerosol_optics + + implicit none + + CHARACTER(80) :: filename + + call stop_on_err(gas_concs%init(gas_names)) + !Initialize some gas concentrations that don't change in time + !If you want them to change in time, they can easily be set along + !with water vapor in the driver below. + !ch4 and n2o are required by the code. + call stop_on_err(gas_concs%set_vmr('ch4', 0.0)) + call stop_on_err(gas_concs%set_vmr('n2o', 0.0)) + call stop_on_err(gas_concs%set_vmr('o2 ', 0.209)) + call stop_on_err(gas_concs%set_vmr('co2', 400.e-6)) + + filename = trim(hucmfile)//'/../RTE-RRTMGP/rrtmgp-data-lw-g128-210809.nc' + call load_and_init(k_dist_lw, filename, gas_concs) + filename = trim(hucmfile)//'/../RTE-RRTMGP/rrtmgp-data-sw-g112-210809.nc' + call load_and_init(k_dist_sw, filename, gas_concs) + + filename = trim(hucmfile)//'/../RTE-RRTMGP/mic2rrtmgp_lw.nc' + call load_cld_lutcoeff (cloud_optics_lw, filename) + filename = trim(hucmfile)//'/../RTE-RRTMGP/mic2rrtmgp_sw.nc' + call load_cld_lutcoeff (cloud_optics_sw, filename) + + if (iaerorad == 1) then + filename = trim(hucmfile)//'/../RTE-RRTMGP/aero2rrtmgp_lw.nc' + call load_aero_lutcoeff (aerosol_optics_lw, filename) + filename = trim(hucmfile)//'/../RTE-RRTMGP/aero2rrtmgp_sw.nc' + call load_aero_lutcoeff (aerosol_optics_sw, filename) + endif + +end subroutine rte_rrtmgp_init +! ---------------------------------------------------------------------------------- +subroutine rte_rrtmgp_driver(nrad,ncat,aerocat,mu0,alb,p_lay,t_lay,rh_lay, & + z_lay,z_lev, & + rv_lay,t_sfc,wat_path,reff,rcat, & + acon,arad,atype,aodt, & + o3_lay,flux_up_sw,flux_dn_sw,flux_up_lw,flux_dn_lw,fthsw,fthlw) + use micphys, only:iaerorad + use rte_rrtmgp_rams !cloud_optics, k_dist + use mo_rte_kind, only: wp, i8, wl + use mo_optical_props, only: ty_optical_props, & + ty_optical_props_arry, ty_optical_props_1scl, ty_optical_props_2str + use mo_gas_optics_rrtmgp, only: ty_gas_optics_rrtmgp + use mo_cloud_optics, only: ty_cloud_optics + use mo_aerosol_optics, only: ty_aerosol_optics + use mo_gas_concentrations, only: ty_gas_concs + use mo_source_functions, only: ty_source_func_lw + use mo_fluxes, only: ty_fluxes_broadband + use mo_heating_rates, only: compute_heating_rate + use mo_rte_lw, only: rte_lw + use mo_rte_sw, only: rte_sw + use mo_rte_config, only: rte_config_checks + implicit none + ! ---------------------------------------------------------------------------------- + ! Variables + ! ---------------------------------------------------------------------------------- + ! Arrays: dimensions (col, lay) + integer :: nrad, ncat, aerocat + integer, parameter :: ncol=1 + real(wp), dimension(ncol,nrad) :: p_lev, t_lev + real(wp), dimension(ncol,nrad-1) :: p_lay, t_lay, rv_lay, o3_lay, co2_lay, ch4_lay, n2o_lay, o2_lay + real(wp), dimension(nrad) :: z_lev + real(wp), dimension(nrad-1) :: z_lay + real(wp), dimension(ncol,nrad-1,ncat) :: wat_path, reff + integer, dimension(ncol,nrad-1,ncat) :: rcat + + ! Aerosol only + real(wp), dimension(ncol,nrad-1) :: rh_lay + real(wp), dimension(ncol,nrad-1,aerocat) :: acon, arad + integer, dimension(ncol,aerocat) :: atype + real(wp), dimension(ncol) :: aodt + + ! + ! Longwave only + ! + real(wp), dimension(ncol) :: t_sfc + real(wp), dimension(:,:), allocatable :: emis_sfc ! First dimension is band + ! + ! Shortwave only + ! + real(wp), dimension(ncol) :: mu0,alb + real(wp), dimension(:,:), allocatable :: sfc_alb_dir, sfc_alb_dif ! First dimension is band + ! + ! Source functions + ! + ! Longwave + type(ty_source_func_lw), save :: lw_sources + ! Shortwave + real(wp), dimension(:,:), allocatable :: toa_flux + ! + ! Output variables + ! + real(wp), dimension(ncol,nrad), target :: flux_up, flux_dn, flux_dir + real, dimension(nrad) :: flux_up_sw, flux_up_lw, flux_dn_sw, flux_dn_lw + real, dimension(nrad-1) :: fthsw, fthlw + ! + ! Derived types from the RTE and RRTMGP libraries + ! + class(ty_optical_props_arry), & + allocatable :: atmos, clouds, aerosols + type(ty_fluxes_broadband) :: fluxes + + ! + ! Inputs to RRTMGP + ! + integer :: k,top_at_1,iswlw + logical :: is_sw, is_lw + + integer :: nlay, nbnd, ngpt + integer :: icol, ilay, ibnd, iloop, igas + + logical :: use_luts = .true. + + ! Local variables + integer :: nlm + real(wp) :: H,dz,dzl + real(wp), dimension(ncol,nrad-1) :: hrate,temp + real :: start, finish + ! NAR OpenMP CPU directives in compatible with OpenMP GPU directives + !!$omp threadprivate( lw_sources, toa_flux, flux_up, flux_dn, flux_dir ) + ! ---------------------------------------------------------------------------------- + ! Code + ! ---------------------------------------------------------------------------------- + ! + + nlay = nrad - 1 + + ! Calculate level pressure and temperature + do k = 2,nrad-1 + !Assuming exponential decrease between layers + dzl = z_lay(k)-z_lay(k-1) + H = dzl/log(p_lay(1,k-1)/p_lay(1,k)) + dz = z_lev(k)-z_lay(k-1) + p_lev(1,k) = p_lay(1,k-1)*exp(-dz/H) + + !Assuming linear changes between layers + t_lev(1,k) = t_lay(1,k-1) + (t_lay(1,k)-t_lay(1,k-1))/dzl*dz + enddo + ! Set surface values + dzl = z_lay(2)-z_lay(1) + dz = z_lev(1)-z_lay(1) + H = dzl/log(p_lay(1,1)/p_lay(1,2)) + p_lev(1,1) = p_lay(1,1)*exp(-dz/H) + t_lev(1,1) = t_sfc(1) + ! Set top of atmosphere values + dzl = z_lay(nlay) - z_lay(nlay-1) + dz = z_lev(nrad)-z_lay(nlay) + H = dzl/log(p_lay(1,nlay-1)/p_lay(1,nlay)) + p_lev(1,nrad) = p_lay(1,nlay)*exp(-dz/H) + t_lev(1,nrad) = t_lay(1,nlay) + (t_lay(1,nlay)-t_lay(1,nlay-1))/dzl*dz + + !NEED VOLUME MIXING RATIO - Adele, yes, rv_lay is a volume mixing ratio + call stop_on_err(gas_concs%set_vmr('h2o', rv_lay)) + call stop_on_err(gas_concs%set_vmr('o3', o3_lay)) + + ! ---------------------------------------------------------------------------- + ! load data into classes + ! don't need gas_concentrations, just the list of available gases + do iswlw = 1,2 + if (iswlw==1) then + is_sw = .true. + is_lw = .false. + else + is_sw = .false. + is_lw = .true. + endif + + ! + ! ---------------------------------------------------------------------------- + ! + ! Problem sizes + ! + if (is_sw) then + nbnd = k_dist_sw%get_nband() + ngpt = k_dist_sw%get_ngpt() + else + nbnd = k_dist_lw%get_nband() + ngpt = k_dist_lw%get_ngpt() + endif + + top_at_1 = 0 + if(p_lay(1,1) < p_lay(1,nlay)) top_at_1 = 1 + + ! ---------------------------------------------------------------------------- + ! LW calculations neglect scattering; SW calculations use the 2-stream approximation + ! Here we choose the right variant of optical_props. + ! + if(allocated(atmos)) deallocate(atmos) + if(allocated(clouds)) deallocate(clouds) + if(allocated(aerosols)) deallocate(aerosols) + + if(is_sw) then + allocate(ty_optical_props_2str::atmos) + allocate(ty_optical_props_2str::clouds) + if(iaerorad==1) allocate(ty_optical_props_2str::aerosols) + else + allocate(ty_optical_props_1scl::atmos) + allocate(ty_optical_props_1scl::clouds) + if(iaerorad==1) allocate(ty_optical_props_1scl::aerosols) + end if + + ! Clouds optical props are defined by band + if(is_sw) call stop_on_err(clouds%init(k_dist_sw%get_band_lims_wavenumber())) + if(is_lw) call stop_on_err(clouds%init(k_dist_lw%get_band_lims_wavenumber())) + ! Aerosols optical props are defined by band + if (iaerorad==1) then + if(is_sw) call stop_on_err(aerosols%init(k_dist_sw%get_band_lims_wavenumber())) + if(is_lw) call stop_on_err(aerosols%init(k_dist_lw%get_band_lims_wavenumber())) + endif + ! + ! Allocate arrays for the optical properties themselves. + ! + select type(atmos) + !I've hard coded here that LW is 1scl and SW is 2str + class is (ty_optical_props_1scl) + !$acc enter data copyin(atmos) + call stop_on_err(atmos%alloc_1scl(ncol, nlay, k_dist_lw)) + class is (ty_optical_props_2str) + call stop_on_err(atmos%alloc_2str( ncol, nlay, k_dist_sw)) + class default + call stop_on_err("rte_rrtmgp_clouds: Don't recognize the kind of optical properties ") + end select + select type(clouds) + class is (ty_optical_props_1scl) + call stop_on_err(clouds%alloc_1scl(ncol, nlay)) + class is (ty_optical_props_2str) + call stop_on_err(clouds%alloc_2str(ncol, nlay)) + class default + call stop_on_err("rte_rrtmgp_clouds: Don't recognize the kind of optical properties ") + end select + if (iaerorad==1) then + select type(aerosols) + class is (ty_optical_props_1scl) + call stop_on_err(aerosols%alloc_1scl(ncol, nlay)) + class is (ty_optical_props_2str) + call stop_on_err(aerosols%alloc_2str(ncol, nlay)) + class default + call stop_on_err("rte_rrtmgp_clouds: Don't recognize the kind of optical properties ") + end select + endif + ! ---------------------------------------------------------------------------- + ! Boundary conditions depending on whether the k-distribution being supplied + ! is LW or SW + if(is_sw) then + ! toa_flux is threadprivate + allocate(toa_flux(ncol, ngpt)) + allocate(sfc_alb_dir(nbnd,ncol), sfc_alb_dif(nbnd,ncol)) + !Adele - we can do better + sfc_alb_dir = alb(1) + sfc_alb_dif = alb(1) + else + ! lw_sources is threadprivate + call stop_on_err(lw_sources%alloc(ncol, nlay, k_dist_lw)) + allocate(emis_sfc(nbnd, ncol)) + !Adele - couple with surface scheme here + t_sfc = t_lev(1, merge(nlay+1, 1, top_at_1==1)) + emis_sfc = 1._wp!0.98_wp + end if + ! ---------------------------------------------------------------------------- + ! Multiple iterations for big problem sizes, and to help identify data movement + ! For CPUs we can introduce OpenMP threading over loop iterations + ! + ! +! call rte_config_checks(logical(.false., wl)) + + if(is_sw)call stop_on_err( & + cloud_optics_sw%cloud_optics(wat_path, reff, rcat, clouds)) + if(is_lw)call stop_on_err( & + cloud_optics_lw%cloud_optics(wat_path, reff, rcat, clouds)) + + aodt = 0. + if(is_sw .and. iaerorad.eq.1)call stop_on_err( & + aerosol_optics_sw%aerosol_optics(acon, arad, atype, rh_lay, aerosols, aodt)) + if(is_lw .and. iaerorad.eq.1)call stop_on_err( & + aerosol_optics_lw%aerosol_optics(acon, arad, atype, rh_lay, aerosols)) + ! + ! Solvers + ! + fluxes%flux_up => flux_up(:,:) + fluxes%flux_dn => flux_dn(:,:) + if(is_lw) then + call stop_on_err(k_dist_lw%gas_optics(p_lay, p_lev, & + t_lay, t_sfc, & + gas_concs, & + atmos, & + lw_sources, & + tlev = t_lev)) + call stop_on_err(clouds%increment(atmos)) + if(iaerorad.eq.1)call stop_on_err(aerosols%increment(atmos)) + call stop_on_err(rte_lw(atmos, top_at_1, & + lw_sources, & + emis_sfc, & + fluxes)) + + flux_up_lw = flux_up(1,:) + flux_dn_lw = flux_dn(1,:) + + call stop_on_err(compute_heating_rate(fluxes%flux_up,fluxes%flux_dn,p_lev,hrate)) + fthlw = hrate(1,:) + + else + !even though we're not using flux_dir, this statement also serves to allocate + !fluxes%flux_dn_dir. Do not remove. + fluxes%flux_dn_dir => flux_dir(:,:) + + call stop_on_err(k_dist_sw%gas_optics(p_lay, p_lev, & + t_lay, & + gas_concs, & + atmos, & + toa_flux)) + call stop_on_err(clouds%delta_scale()) + call stop_on_err(clouds%increment(atmos)) + if (iaerorad.eq.1) then + call stop_on_err(aerosols%delta_scale()) + call stop_on_err(aerosols%increment(atmos)) + endif + call stop_on_err(rte_sw(atmos, top_at_1, & + mu0, toa_flux, & + sfc_alb_dir, sfc_alb_dif, & + fluxes)) + flux_up_sw = flux_up(1,:) + flux_dn_sw = flux_dn(1,:) + + call stop_on_err(compute_heating_rate(fluxes%flux_up,fluxes%flux_dn,p_lev,hrate)) + fthsw = hrate(1,:) + end if + enddo + deallocate(toa_flux) +end subroutine rte_rrtmgp_driver diff --git a/src/radiate/rte-rrtmgp/interface/rte_rrtmgp_rams.F90 b/src/radiate/rte-rrtmgp/interface/rte_rrtmgp_rams.F90 new file mode 100644 index 0000000..52bc6e8 --- /dev/null +++ b/src/radiate/rte-rrtmgp/interface/rte_rrtmgp_rams.F90 @@ -0,0 +1,22 @@ +module rte_rrtmgp_rams + + ! use mo_optical_props, only: ty_optical_props, & + ! ty_optical_props_arry, ty_optical_props_1scl, ty_optical_props_2str + use mo_gas_optics_rrtmgp, only: ty_gas_optics_rrtmgp + use mo_cloud_optics, only: ty_cloud_optics + use mo_aerosol_optics, only: ty_aerosol_optics + use mo_gas_concentrations, only: ty_gas_concs +! use mo_fluxes, only: ty_fluxes_broadband + + integer, parameter :: ngas = 6 + !These 6 gases are "required". I've set ch4 and n2o to 0 and o2 to .209 + !You can turn off the strict requirement for these by modifying key_species in the rrtmgp data files in etc + character(len=3), dimension(ngas) & + :: gas_names = ['h2o', 'co2', 'o3 ','ch4','n2o','o2 '] + type(ty_gas_optics_rrtmgp) :: k_dist_lw, k_dist_sw + type(ty_aerosol_optics) :: aerosol_optics_lw, aerosol_optics_sw + type(ty_cloud_optics) :: cloud_optics_lw, cloud_optics_sw + type(ty_gas_concs) :: gas_concs, gas_concs_garand, gas_concs_1col +! class(ty_optical_props_arry), & +! allocatable :: atmos_sw, atmos_lw, clouds_sw, clouds_lw +end module diff --git a/src/radiate/rte-rrtmgp/netcdf.inc b/src/radiate/rte-rrtmgp/netcdf.inc new file mode 100644 index 0000000..7b0c353 --- /dev/null +++ b/src/radiate/rte-rrtmgp/netcdf.inc @@ -0,0 +1,1836 @@ +! NetCDF-3. +! +! netcdf version 3 fortran interface: +! + +! +! external netcdf data types: +! + integer nf_byte + integer nf_int1 + integer nf_char + integer nf_short + integer nf_int2 + integer nf_int + integer nf_float + integer nf_real + integer nf_double + integer nf_ubyte + integer nf_ushort + integer nf_uint + integer nf_int64 + integer nf_uint64 + + parameter (nf_byte = 1) + parameter (nf_int1 = nf_byte) + parameter (nf_char = 2) + parameter (nf_short = 3) + parameter (nf_int2 = nf_short) + parameter (nf_int = 4) + parameter (nf_float = 5) + parameter (nf_real = nf_float) + parameter (nf_double = 6) + parameter (nf_ubyte = 7) + parameter (nf_ushort = 8) + parameter (nf_uint = 9) + parameter (nf_int64 = 10) + parameter (nf_uint64 = 11) + +! +! default fill values: +! + integer nf_fill_byte + integer nf_fill_int1 + integer nf_fill_char + integer nf_fill_short + integer nf_fill_int2 + integer nf_fill_int + real nf_fill_float + real nf_fill_real + doubleprecision nf_fill_double + + parameter (nf_fill_byte = -127) + parameter (nf_fill_int1 = nf_fill_byte) + parameter (nf_fill_char = 0) + parameter (nf_fill_short = -32767) + parameter (nf_fill_int2 = nf_fill_short) + parameter (nf_fill_int = -2147483647) + parameter (nf_fill_float = 9.9692099683868690e+36) + parameter (nf_fill_real = nf_fill_float) + parameter (nf_fill_double = 9.9692099683868690d+36) + +! +! mode flags for opening and creating a netcdf dataset: +! + integer nf_nowrite + integer nf_write + integer nf_clobber + integer nf_noclobber + integer nf_fill + integer nf_nofill + integer nf_lock + integer nf_share + integer nf_64bit_offset + integer nf_64bit_data + integer nf_cdf5 + integer nf_sizehint_default + integer nf_align_chunk + integer nf_format_classic + integer nf_format_64bit + integer nf_format_64bit_offset + integer nf_format_64bit_data + integer nf_format_cdf5 + integer nf_diskless + integer nf_mmap + + parameter (nf_nowrite = 0) + parameter (nf_write = 1) + parameter (nf_clobber = 0) + parameter (nf_noclobber = 4) + parameter (nf_fill = 0) + parameter (nf_nofill = 256) + parameter (nf_lock = 1024) + parameter (nf_share = 2048) + parameter (nf_64bit_offset = 512) + parameter (nf_64bit_data = 32) + parameter (nf_cdf5 = nf_64bit_data) + parameter (nf_sizehint_default = 0) + parameter (nf_align_chunk = -1) + parameter (nf_format_classic = 1) + parameter (nf_format_64bit = 2) + parameter (nf_format_64bit_offset = nf_format_64bit) + parameter (nf_format_64bit_data = 5) + parameter (nf_format_cdf5 = nf_format_64bit_data) + parameter (nf_diskless = 8) + parameter (nf_mmap = 16) + +! +! size argument for defining an unlimited dimension: +! + integer nf_unlimited + parameter (nf_unlimited = 0) + +! +! global attribute id: +! + integer nf_global + parameter (nf_global = 0) + +! +! implementation limits: +! + integer nf_max_dims + integer nf_max_attrs + integer nf_max_vars + integer nf_max_name + integer nf_max_var_dims + + parameter (nf_max_dims = 1024) + parameter (nf_max_attrs = 8192) + parameter (nf_max_vars = 8192) + parameter (nf_max_name = 256) + parameter (nf_max_var_dims = nf_max_dims) + +! +! error codes: +! + integer nf_noerr + integer nf_ebadid + integer nf_eexist + integer nf_einval + integer nf_eperm + integer nf_enotindefine + integer nf_eindefine + integer nf_einvalcoords + integer nf_emaxdims + integer nf_enameinuse + integer nf_enotatt + integer nf_emaxatts + integer nf_ebadtype + integer nf_ebaddim + integer nf_eunlimpos + integer nf_emaxvars + integer nf_enotvar + integer nf_eglobal + integer nf_enotnc + integer nf_ests + integer nf_emaxname + integer nf_eunlimit + integer nf_enorecvars + integer nf_echar + integer nf_eedge + integer nf_estride + integer nf_ebadname + integer nf_erange + integer nf_enomem + integer nf_evarsize + integer nf_edimsize + integer nf_etrunc + + parameter (nf_noerr = 0) + parameter (nf_ebadid = -33) + parameter (nf_eexist = -35) + parameter (nf_einval = -36) + parameter (nf_eperm = -37) + parameter (nf_enotindefine = -38) + parameter (nf_eindefine = -39) + parameter (nf_einvalcoords = -40) + parameter (nf_emaxdims = -41) + parameter (nf_enameinuse = -42) + parameter (nf_enotatt = -43) + parameter (nf_emaxatts = -44) + parameter (nf_ebadtype = -45) + parameter (nf_ebaddim = -46) + parameter (nf_eunlimpos = -47) + parameter (nf_emaxvars = -48) + parameter (nf_enotvar = -49) + parameter (nf_eglobal = -50) + parameter (nf_enotnc = -51) + parameter (nf_ests = -52) + parameter (nf_emaxname = -53) + parameter (nf_eunlimit = -54) + parameter (nf_enorecvars = -55) + parameter (nf_echar = -56) + parameter (nf_eedge = -57) + parameter (nf_estride = -58) + parameter (nf_ebadname = -59) + parameter (nf_erange = -60) + parameter (nf_enomem = -61) + parameter (nf_evarsize = -62) + parameter (nf_edimsize = -63) + parameter (nf_etrunc = -64) +! +! error handling modes: +! + integer nf_fatal + integer nf_verbose + + parameter (nf_fatal = 1) + parameter (nf_verbose = 2) + +! +! miscellaneous routines: +! + character*80 nf_inq_libvers + external nf_inq_libvers + + character*80 nf_strerror +! (integer ncerr) + external nf_strerror + + logical nf_issyserr +! (integer ncerr) + external nf_issyserr + +! +! control routines: +! + integer nf_inq_base_pe +! (integer ncid, +! integer pe) + external nf_inq_base_pe + + integer nf_set_base_pe +! (integer ncid, +! integer pe) + external nf_set_base_pe + + integer nf_create +! (character*(*) path, +! integer cmode, +! integer ncid) + external nf_create + + integer nf__create +! (character*(*) path, +! integer cmode, +! integer initialsz, +! integer chunksizehint, +! integer ncid) + external nf__create + + integer nf__create_mp +! (character*(*) path, +! integer cmode, +! integer initialsz, +! integer basepe, +! integer chunksizehint, +! integer ncid) + external nf__create_mp + + integer nf_open +! (character*(*) path, +! integer mode, +! integer ncid) + external nf_open + + integer nf__open +! (character*(*) path, +! integer mode, +! integer chunksizehint, +! integer ncid) + external nf__open + + integer nf__open_mp +! (character*(*) path, +! integer mode, +! integer basepe, +! integer chunksizehint, +! integer ncid) + external nf__open_mp + + integer nf_set_fill +! (integer ncid, +! integer fillmode, +! integer old_mode) + external nf_set_fill + + integer nf_set_default_format +! (integer format, +! integer old_format) + external nf_set_default_format + + integer nf_redef +! (integer ncid) + external nf_redef + + integer nf_enddef +! (integer ncid) + external nf_enddef + + integer nf__enddef +! (integer ncid, +! integer h_minfree, +! integer v_align, +! integer v_minfree, +! integer r_align) + external nf__enddef + + integer nf_sync +! (integer ncid) + external nf_sync + + integer nf_abort +! (integer ncid) + external nf_abort + + integer nf_close +! (integer ncid) + external nf_close + + integer nf_delete +! (character*(*) ncid) + external nf_delete + +! +! general inquiry routines: +! + + integer nf_inq +! (integer ncid, +! integer ndims, +! integer nvars, +! integer ngatts, +! integer unlimdimid) + external nf_inq + +! new inquire path + + integer nf_inq_path + external nf_inq_path + + integer nf_inq_ndims +! (integer ncid, +! integer ndims) + external nf_inq_ndims + + integer nf_inq_nvars +! (integer ncid, +! integer nvars) + external nf_inq_nvars + + integer nf_inq_natts +! (integer ncid, +! integer ngatts) + external nf_inq_natts + + integer nf_inq_unlimdim +! (integer ncid, +! integer unlimdimid) + external nf_inq_unlimdim + + integer nf_inq_format +! (integer ncid, +! integer format) + external nf_inq_format + +! +! dimension routines: +! + + integer nf_def_dim +! (integer ncid, +! character(*) name, +! integer len, +! integer dimid) + external nf_def_dim + + integer nf_inq_dimid +! (integer ncid, +! character(*) name, +! integer dimid) + external nf_inq_dimid + + integer nf_inq_dim +! (integer ncid, +! integer dimid, +! character(*) name, +! integer len) + external nf_inq_dim + + integer nf_inq_dimname +! (integer ncid, +! integer dimid, +! character(*) name) + external nf_inq_dimname + + integer nf_inq_dimlen +! (integer ncid, +! integer dimid, +! integer len) + external nf_inq_dimlen + + integer nf_rename_dim +! (integer ncid, +! integer dimid, +! character(*) name) + external nf_rename_dim + +! +! general attribute routines: +! + + integer nf_inq_att +! (integer ncid, +! integer varid, +! character(*) name, +! integer xtype, +! integer len) + external nf_inq_att + + integer nf_inq_attid +! (integer ncid, +! integer varid, +! character(*) name, +! integer attnum) + external nf_inq_attid + + integer nf_inq_atttype +! (integer ncid, +! integer varid, +! character(*) name, +! integer xtype) + external nf_inq_atttype + + integer nf_inq_attlen +! (integer ncid, +! integer varid, +! character(*) name, +! integer len) + external nf_inq_attlen + + integer nf_inq_attname +! (integer ncid, +! integer varid, +! integer attnum, +! character(*) name) + external nf_inq_attname + + integer nf_copy_att +! (integer ncid_in, +! integer varid_in, +! character(*) name, +! integer ncid_out, +! integer varid_out) + external nf_copy_att + + integer nf_rename_att +! (integer ncid, +! integer varid, +! character(*) curname, +! character(*) newname) + external nf_rename_att + + integer nf_del_att +! (integer ncid, +! integer varid, +! character(*) name) + external nf_del_att + +! +! attribute put/get routines: +! + + integer nf_put_att_text +! (integer ncid, +! integer varid, +! character(*) name, +! integer len, +! character(*) text) + external nf_put_att_text + + integer nf_get_att_text +! (integer ncid, +! integer varid, +! character(*) name, +! character(*) text) + external nf_get_att_text + + integer nf_put_att_int1 +! (integer ncid, +! integer varid, +! character(*) name, +! integer xtype, +! integer len, +! nf_int1_t i1vals(1)) + external nf_put_att_int1 + + integer nf_get_att_int1 +! (integer ncid, +! integer varid, +! character(*) name, +! nf_int1_t i1vals(1)) + external nf_get_att_int1 + + integer nf_put_att_int2 +! (integer ncid, +! integer varid, +! character(*) name, +! integer xtype, +! integer len, +! nf_int2_t i2vals(1)) + external nf_put_att_int2 + + integer nf_get_att_int2 +! (integer ncid, +! integer varid, +! character(*) name, +! nf_int2_t i2vals(1)) + external nf_get_att_int2 + + integer nf_put_att_int +! (integer ncid, +! integer varid, +! character(*) name, +! integer xtype, +! integer len, +! integer ivals(1)) + external nf_put_att_int + + integer nf_get_att_int +! (integer ncid, +! integer varid, +! character(*) name, +! integer ivals(1)) + external nf_get_att_int + + integer nf_put_att_int64 +! (integer ncid, +! integer varid, +! character(*) name, +! integer xtype, +! integer len, +! nf_int8_t i8vals(1)) + external nf_put_att_int64 + + integer nf_get_att_int64 +! (integer ncid, +! integer varid, +! character(*) name, +! nf_int8_t i8vals(1)) + external nf_get_att_int64 + + integer nf_put_att_real +! (integer ncid, +! integer varid, +! character(*) name, +! integer xtype, +! integer len, +! real rvals(1)) + external nf_put_att_real + + integer nf_get_att_real +! (integer ncid, +! integer varid, +! character(*) name, +! real rvals(1)) + external nf_get_att_real + + integer nf_put_att_double +! (integer ncid, +! integer varid, +! character(*) name, +! integer xtype, +! integer len, +! double dvals(1)) + external nf_put_att_double + + integer nf_get_att_double +! (integer ncid, +! integer varid, +! character(*) name, +! double dvals(1)) + external nf_get_att_double + +! +! general variable routines: +! + + integer nf_def_var +! (integer ncid, +! character(*) name, +! integer datatype, +! integer ndims, +! integer dimids(1), +! integer varid) + external nf_def_var + + integer nf_inq_var +! (integer ncid, +! integer varid, +! character(*) name, +! integer datatype, +! integer ndims, +! integer dimids(1), +! integer natts) + external nf_inq_var + + integer nf_inq_varid +! (integer ncid, +! character(*) name, +! integer varid) + external nf_inq_varid + + integer nf_inq_varname +! (integer ncid, +! integer varid, +! character(*) name) + external nf_inq_varname + + integer nf_inq_vartype +! (integer ncid, +! integer varid, +! integer xtype) + external nf_inq_vartype + + integer nf_inq_varndims +! (integer ncid, +! integer varid, +! integer ndims) + external nf_inq_varndims + + integer nf_inq_vardimid +! (integer ncid, +! integer varid, +! integer dimids(1)) + external nf_inq_vardimid + + integer nf_inq_varnatts +! (integer ncid, +! integer varid, +! integer natts) + external nf_inq_varnatts + + integer nf_rename_var +! (integer ncid, +! integer varid, +! character(*) name) + external nf_rename_var + + integer nf_copy_var +! (integer ncid_in, +! integer varid, +! integer ncid_out) + external nf_copy_var + +! +! entire variable put/get routines: +! + + integer nf_put_var_text +! (integer ncid, +! integer varid, +! character(*) text) + external nf_put_var_text + + integer nf_get_var_text +! (integer ncid, +! integer varid, +! character(*) text) + external nf_get_var_text + + integer nf_put_var_int1 +! (integer ncid, +! integer varid, +! nf_int1_t i1vals(1)) + external nf_put_var_int1 + + integer nf_get_var_int1 +! (integer ncid, +! integer varid, +! nf_int1_t i1vals(1)) + external nf_get_var_int1 + + integer nf_put_var_int2 +! (integer ncid, +! integer varid, +! nf_int2_t i2vals(1)) + external nf_put_var_int2 + + integer nf_get_var_int2 +! (integer ncid, +! integer varid, +! nf_int2_t i2vals(1)) + external nf_get_var_int2 + + integer nf_put_var_int +! (integer ncid, +! integer varid, +! integer ivals(1)) + external nf_put_var_int + + integer nf_get_var_int +! (integer ncid, +! integer varid, +! integer ivals(1)) + external nf_get_var_int + + integer nf_put_var_real +! (integer ncid, +! integer varid, +! real rvals(1)) + external nf_put_var_real + + integer nf_get_var_real +! (integer ncid, +! integer varid, +! real rvals(1)) + external nf_get_var_real + + integer nf_put_var_double +! (integer ncid, +! integer varid, +! doubleprecision dvals(1)) + external nf_put_var_double + + integer nf_get_var_double +! (integer ncid, +! integer varid, +! doubleprecision dvals(1)) + external nf_get_var_double + +! +! single variable put/get routines: +! + + integer nf_put_var1_text +! (integer ncid, +! integer varid, +! integer index(1), +! character*1 text) + external nf_put_var1_text + + integer nf_get_var1_text +! (integer ncid, +! integer varid, +! integer index(1), +! character*1 text) + external nf_get_var1_text + + integer nf_put_var1_int1 +! (integer ncid, +! integer varid, +! integer index(1), +! nf_int1_t i1val) + external nf_put_var1_int1 + + integer nf_get_var1_int1 +! (integer ncid, +! integer varid, +! integer index(1), +! nf_int1_t i1val) + external nf_get_var1_int1 + + integer nf_put_var1_int2 +! (integer ncid, +! integer varid, +! integer index(1), +! nf_int2_t i2val) + external nf_put_var1_int2 + + integer nf_get_var1_int2 +! (integer ncid, +! integer varid, +! integer index(1), +! nf_int2_t i2val) + external nf_get_var1_int2 + + integer nf_put_var1_int +! (integer ncid, +! integer varid, +! integer index(1), +! integer ival) + external nf_put_var1_int + + integer nf_get_var1_int +! (integer ncid, +! integer varid, +! integer index(1), +! integer ival) + external nf_get_var1_int + + integer nf_put_var1_real +! (integer ncid, +! integer varid, +! integer index(1), +! real rval) + external nf_put_var1_real + + integer nf_get_var1_real +! (integer ncid, +! integer varid, +! integer index(1), +! real rval) + external nf_get_var1_real + + integer nf_put_var1_double +! (integer ncid, +! integer varid, +! integer index(1), +! doubleprecision dval) + external nf_put_var1_double + + integer nf_get_var1_double +! (integer ncid, +! integer varid, +! integer index(1), +! doubleprecision dval) + external nf_get_var1_double + +! +! variable array put/get routines: +! + + integer nf_put_vara_text +! (integer ncid, +! integer varid, +! integer start(1), +! integer count(1), +! character(*) text) + external nf_put_vara_text + + integer nf_get_vara_text +! (integer ncid, +! integer varid, +! integer start(1), +! integer count(1), +! character(*) text) + external nf_get_vara_text + + integer nf_put_vara_int1 +! (integer ncid, +! integer varid, +! integer start(1), +! integer count(1), +! nf_int1_t i1vals(1)) + external nf_put_vara_int1 + + integer nf_get_vara_int1 +! (integer ncid, +! integer varid, +! integer start(1), +! integer count(1), +! nf_int1_t i1vals(1)) + external nf_get_vara_int1 + + integer nf_put_vara_int2 +! (integer ncid, +! integer varid, +! integer start(1), +! integer count(1), +! nf_int2_t i2vals(1)) + external nf_put_vara_int2 + + integer nf_get_vara_int2 +! (integer ncid, +! integer varid, +! integer start(1), +! integer count(1), +! nf_int2_t i2vals(1)) + external nf_get_vara_int2 + + integer nf_put_vara_int +! (integer ncid, +! integer varid, +! integer start(1), +! integer count(1), +! integer ivals(1)) + external nf_put_vara_int + + integer nf_get_vara_int +! (integer ncid, +! integer varid, +! integer start(1), +! integer count(1), +! integer ivals(1)) + external nf_get_vara_int + + integer nf_put_vara_real +! (integer ncid, +! integer varid, +! integer start(1), +! integer count(1), +! real rvals(1)) + external nf_put_vara_real + + integer nf_get_vara_real +! (integer ncid, +! integer varid, +! integer start(1), +! integer count(1), +! real rvals(1)) + external nf_get_vara_real + + integer nf_put_vara_double +! (integer ncid, +! integer varid, +! integer start(1), +! integer count(1), +! doubleprecision dvals(1)) + external nf_put_vara_double + + integer nf_get_vara_double +! (integer ncid, +! integer varid, +! integer start(1), +! integer count(1), +! doubleprecision dvals(1)) + external nf_get_vara_double + +! +! strided variable put/get routines: +! + + integer nf_put_vars_text +! (integer ncid, +! integer varid, +! integer start(1), +! integer count(1), +! integer stride(1), +! character(*) text) + external nf_put_vars_text + + integer nf_get_vars_text +! (integer ncid, +! integer varid, +! integer start(1), +! integer count(1), +! integer stride(1), +! character(*) text) + external nf_get_vars_text + + integer nf_put_vars_int1 +! (integer ncid, +! integer varid, +! integer start(1), +! integer count(1), +! integer stride(1), +! nf_int1_t i1vals(1)) + external nf_put_vars_int1 + + integer nf_get_vars_int1 +! (integer ncid, +! integer varid, +! integer start(1), +! integer count(1), +! integer stride(1), +! nf_int1_t i1vals(1)) + external nf_get_vars_int1 + + integer nf_put_vars_int2 +! (integer ncid, +! integer varid, +! integer start(1), +! integer count(1), +! integer stride(1), +! nf_int2_t i2vals(1)) + external nf_put_vars_int2 + + integer nf_get_vars_int2 +! (integer ncid, +! integer varid, +! integer start(1), +! integer count(1), +! integer stride(1), +! nf_int2_t i2vals(1)) + external nf_get_vars_int2 + + integer nf_put_vars_int +! (integer ncid, +! integer varid, +! integer start(1), +! integer count(1), +! integer stride(1), +! integer ivals(1)) + external nf_put_vars_int + + integer nf_get_vars_int +! (integer ncid, +! integer varid, +! integer start(1), +! integer count(1), +! integer stride(1), +! integer ivals(1)) + external nf_get_vars_int + + integer nf_put_vars_real +! (integer ncid, +! integer varid, +! integer start(1), +! integer count(1), +! integer stride(1), +! real rvals(1)) + external nf_put_vars_real + + integer nf_get_vars_real +! (integer ncid, +! integer varid, +! integer start(1), +! integer count(1), +! integer stride(1), +! real rvals(1)) + external nf_get_vars_real + + integer nf_put_vars_double +! (integer ncid, +! integer varid, +! integer start(1), +! integer count(1), +! integer stride(1), +! doubleprecision dvals(1)) + external nf_put_vars_double + + integer nf_get_vars_double +! (integer ncid, +! integer varid, +! integer start(1), +! integer count(1), +! integer stride(1), +! doubleprecision dvals(1)) + external nf_get_vars_double + +! +! mapped variable put/get routines: +! + + integer nf_put_varm_text +! (integer ncid, +! integer varid, +! integer start(1), +! integer count(1), +! integer stride(1), +! integer imap(1), +! character(*) text) + external nf_put_varm_text + + integer nf_get_varm_text +! (integer ncid, +! integer varid, +! integer start(1), +! integer count(1), +! integer stride(1), +! integer imap(1), +! character(*) text) + external nf_get_varm_text + + integer nf_put_varm_int1 +! (integer ncid, +! integer varid, +! integer start(1), +! integer count(1), +! integer stride(1), +! integer imap(1), +! nf_int1_t i1vals(1)) + external nf_put_varm_int1 + + integer nf_get_varm_int1 +! (integer ncid, +! integer varid, +! integer start(1), +! integer count(1), +! integer stride(1), +! integer imap(1), +! nf_int1_t i1vals(1)) + external nf_get_varm_int1 + + integer nf_put_varm_int2 +! (integer ncid, +! integer varid, +! integer start(1), +! integer count(1), +! integer stride(1), +! integer imap(1), +! nf_int2_t i2vals(1)) + external nf_put_varm_int2 + + integer nf_get_varm_int2 +! (integer ncid, +! integer varid, +! integer start(1), +! integer count(1), +! integer stride(1), +! integer imap(1), +! nf_int2_t i2vals(1)) + external nf_get_varm_int2 + + integer nf_put_varm_int +! (integer ncid, +! integer varid, +! integer start(1), +! integer count(1), +! integer stride(1), +! integer imap(1), +! integer ivals(1)) + external nf_put_varm_int + + integer nf_get_varm_int +! (integer ncid, +! integer varid, +! integer start(1), +! integer count(1), +! integer stride(1), +! integer imap(1), +! integer ivals(1)) + external nf_get_varm_int + + integer nf_put_varm_real +! (integer ncid, +! integer varid, +! integer start(1), +! integer count(1), +! integer stride(1), +! integer imap(1), +! real rvals(1)) + external nf_put_varm_real + + integer nf_get_varm_real +! (integer ncid, +! integer varid, +! integer start(1), +! integer count(1), +! integer stride(1), +! integer imap(1), +! real rvals(1)) + external nf_get_varm_real + + integer nf_put_varm_double +! (integer ncid, +! integer varid, +! integer start(1), +! integer count(1), +! integer stride(1), +! integer imap(1), +! doubleprecision dvals(1)) + external nf_put_varm_double + + integer nf_get_varm_double +! (integer ncid, +! integer varid, +! integer start(1), +! integer count(1), +! integer stride(1), +! integer imap(1), +! doubleprecision dvals(1)) + external nf_get_varm_double + +! 64-bit int functions. + integer nf_put_var1_int64 + external nf_put_var1_int64 + integer nf_put_vara_int64 + external nf_put_vara_int64 + integer nf_put_vars_int64 + external nf_put_vars_int64 + integer nf_put_varm_int64 + external nf_put_varm_int64 + integer nf_put_var_int64 + external nf_put_var_int64 + integer nf_get_var1_int64 + external nf_get_var1_int64 + integer nf_get_vara_int64 + external nf_get_vara_int64 + integer nf_get_vars_int64 + external nf_get_vars_int64 + integer nf_get_varm_int64 + external nf_get_varm_int64 + integer nf_get_var_int64 + external nf_get_var_int64 + + +! NetCDF-4. +! This is part of netCDF-4. Copyright 2006, UCAR, See COPYRIGHT +! file for distribution information. + +! Netcdf version 4 fortran interface. + +! $Id: netcdf4.inc,v 1.28 2010/05/25 13:53:02 ed Exp $ + +! New netCDF-4 types. + integer nf_string + integer nf_vlen + integer nf_opaque + integer nf_enum + integer nf_compound + + parameter (nf_string = 12) + parameter (nf_vlen = 13) + parameter (nf_opaque = 14) + parameter (nf_enum = 15) + parameter (nf_compound = 16) + +! New netCDF-4 fill values. + integer nf_fill_ubyte + integer nf_fill_ushort +! real nf_fill_uint +! real nf_fill_int64 +! real nf_fill_uint64 + parameter (nf_fill_ubyte = 255) + parameter (nf_fill_ushort = 65535) + +! New constants. + integer nf_format_netcdf4 + parameter (nf_format_netcdf4 = 3) + + integer nf_format_netcdf4_classic + parameter (nf_format_netcdf4_classic = 4) + + integer nf_netcdf4 + parameter (nf_netcdf4 = 4096) + + integer nf_classic_model + parameter (nf_classic_model = 256) + + integer nf_chunk_seq + parameter (nf_chunk_seq = 0) + integer nf_chunk_sub + parameter (nf_chunk_sub = 1) + integer nf_chunk_sizes + parameter (nf_chunk_sizes = 2) + + integer nf_endian_native + parameter (nf_endian_native = 0) + integer nf_endian_little + parameter (nf_endian_little = 1) + integer nf_endian_big + parameter (nf_endian_big = 2) + +! For NF_DEF_VAR_CHUNKING + integer nf_chunked + parameter (nf_chunked = 0) + integer nf_contiguous + parameter (nf_contiguous = 1) + integer nf_compact + parameter (nf_compact = 2) + +! For NF_DEF_VAR_FLETCHER32 + integer nf_nochecksum + parameter (nf_nochecksum = 0) + integer nf_fletcher32 + parameter (nf_fletcher32 = 1) + +! For NF_DEF_VAR_DEFLATE + integer nf_noshuffle + parameter (nf_noshuffle = 0) + integer nf_shuffle + parameter (nf_shuffle = 1) + +! For NF_DEF_VAR_SZIP + integer nf_szip_ec_option_mask + parameter (nf_szip_ec_option_mask = 4) + integer nf_szip_nn_option_mask + parameter (nf_szip_nn_option_mask = 32) + +! For parallel I/O. + integer nf_mpiio + parameter (nf_mpiio = 8192) + integer nf_mpiposix + parameter (nf_mpiposix = 16384) + integer nf_pnetcdf + parameter (nf_pnetcdf = 32768) + +! For NF_VAR_PAR_ACCESS. + integer nf_independent + parameter (nf_independent = 0) + integer nf_collective + parameter (nf_collective = 1) + +! For NF_DEF_VAR_QUANTIZE. + integer nf_noquantize + parameter (nf_noquantize = 0) + integer nf_quantize_bitgroom + parameter (nf_quantize_bitgroom = 1) + +! New error codes. + integer nf_ehdferr ! Error at HDF5 layer. + parameter (nf_ehdferr = -101) + integer nf_ecantread ! Can't read. + parameter (nf_ecantread = -102) + integer nf_ecantwrite ! Can't write. + parameter (nf_ecantwrite = -103) + integer nf_ecantcreate ! Can't create. + parameter (nf_ecantcreate = -104) + integer nf_efilemeta ! Problem with file metadata. + parameter (nf_efilemeta = -105) + integer nf_edimmeta ! Problem with dimension metadata. + parameter (nf_edimmeta = -106) + integer nf_eattmeta ! Problem with attribute metadata. + parameter (nf_eattmeta = -107) + integer nf_evarmeta ! Problem with variable metadata. + parameter (nf_evarmeta = -108) + integer nf_enocompound ! Not a compound type. + parameter (nf_enocompound = -109) + integer nf_eattexists ! Attribute already exists. + parameter (nf_eattexists = -110) + integer nf_enotnc4 ! Attempting netcdf-4 operation on netcdf-3 file. + parameter (nf_enotnc4 = -111) + integer nf_estrictnc3 ! Attempting netcdf-4 operation on strict nc3 netcdf-4 file. + parameter (nf_estrictnc3 = -112) + integer nf_enotnc3 ! Attempting netcdf-3 operation on netcdf-4 file. + parameter (nf_enotnc3 = -113) + integer nf_enopar ! Parallel operation on file opened for non-parallel access. + parameter (nf_enopar = -114) + integer nf_eparinit ! Error initializing for parallel access. + parameter (nf_eparinit = -115) + integer nf_ebadgrpid ! Bad group ID. + parameter (nf_ebadgrpid = -116) + integer nf_ebadtypid ! Bad type ID. + parameter (nf_ebadtypid = -117) + integer nf_etypdefined ! Type has already been defined and may not be edited. + parameter (nf_etypdefined = -118) + integer nf_ebadfield ! Bad field ID. + parameter (nf_ebadfield = -119) + integer nf_ebadclass ! Bad class. + parameter (nf_ebadclass = -120) + integer nf_emaptype ! Mapped access for atomic types only. + parameter (nf_emaptype = -121) + integer nf_elatefill ! Attempt to define fill value when data already exists. + parameter (nf_elatefill = -122) + integer nf_elatedef ! Attempt to define var properties, like deflate, after enddef. + parameter (nf_elatedef = -123) + integer nf_edimscale ! Probem with HDF5 dimscales. + parameter (nf_edimscale = -124) + integer nf_enogrp ! No group found. + parameter (nf_enogrp = -125) + integer nf_estorage ! Can't specify both contiguous and chunking. + parameter (nf_estorage = -126) + integer nf_ebadchunk ! Bad chunksize. + parameter (nf_ebadchunk = -127) + integer nf_enotbuilt ! NetCDF feature not built. + parameter (nf_enotbuilt = -128) + integer nf_ediskless ! Error in using diskless access. + parameter (nf_ediskless = -129) + integer nf_ecantextend ! Attempt to extend dataset during ind. I/O operation. + parameter (nf_ecantextend = -130) + integer nf_empi ! MPI operation failed. + parameter (nf_empi = -131) + integer nf_efilter ! Filter operation failed. + parameter (nf_efilter = -132) + integer nf_ercfile ! RC file failure + parameter (nf_ercfile = -133) + integer nf_enullpad ! Header Bytes not Null-Byte padded + parameter (nf_enullpad = -134) + integer nf_einmemory ! In-memory file error + parameter (nf_einmemory = -135) + integer nf_enofilter ! Filter not defined on variable. + parameter (nf_enofilter = -136) + integer nf_enczarr ! Error at NCZarr layer. + parameter (nf_enczarr = -137) + integer nf_es3 ! Generic S3 error + parameter (nf_es3 = -138) + integer nf_eempty ! Attempt to read empty NCZarr map key + parameter (nf_eempty = -139) + integer nf_eobject ! Some object exists when it should not + parameter (nf_eobject = -140) + integer nf_enoobject ! Some object not found + parameter (nf_enoobject = -141) + integer nf_eplugin ! Unclassified failure in accessing a dynamically loaded plugin> + parameter (nf_eplugin = -142) + + +! New functions. + +! Parallel I/O. + integer nf_create_par + external nf_create_par + + integer nf_open_par + external nf_open_par + + integer nf_var_par_access + external nf_var_par_access + +! Functions to handle groups. + integer nf_inq_ncid + external nf_inq_ncid + + integer nf_inq_grps + external nf_inq_grps + + integer nf_inq_grpname + external nf_inq_grpname + + integer nf_inq_grpname_full + external nf_inq_grpname_full + + integer nf_inq_grpname_len + external nf_inq_grpname_len + + integer nf_inq_grp_parent + external nf_inq_grp_parent + + integer nf_inq_grp_ncid + external nf_inq_grp_ncid + + integer nf_inq_grp_full_ncid + external nf_inq_grp_full_ncid + + integer nf_inq_varids + external nf_inq_varids + + integer nf_inq_dimids + external nf_inq_dimids + + integer nf_def_grp + external nf_def_grp + +! New rename grp function + + integer nf_rename_grp + external nf_rename_grp + +! New options for netCDF variables. + integer nf_def_var_deflate + external nf_def_var_deflate + + integer nf_inq_var_deflate + external nf_inq_var_deflate + + integer nf_def_var_zstandard + external nf_def_var_zstandard + + integer nf_inq_var_zstandard + external nf_inq_var_zstandard + + integer nf_def_var_szip + external nf_def_var_szip + + integer nf_inq_var_szip + external nf_inq_var_szip + + integer nf_def_var_quantize + external nf_def_var_quantize + + integer nf_inq_var_quantize + external nf_inq_var_quantize + + integer nf_def_var_fletcher32 + external nf_def_var_fletcher32 + + integer nf_inq_var_fletcher32 + external nf_inq_var_fletcher32 + + integer nf_def_var_chunking + external nf_def_var_chunking + + integer nf_inq_var_chunking + external nf_inq_var_chunking + + integer nf_def_var_fill + external nf_def_var_fill + + integer nf_inq_var_fill + external nf_inq_var_fill + + integer nf_def_var_endian + external nf_def_var_endian + + integer nf_inq_var_endian + external nf_inq_var_endian + + integer nf_def_var_filter + external nf_def_var_filter + + integer nf_inq_var_filter + external nf_inq_var_filter + +! User defined types. + integer nf_inq_typeids + external nf_inq_typeids + + integer nf_inq_typeid + external nf_inq_typeid + + integer nf_inq_type + external nf_inq_type + + integer nf_inq_user_type + external nf_inq_user_type + +! User defined types - compound types. + integer nf_def_compound + external nf_def_compound + + integer nf_insert_compound + external nf_insert_compound + + integer nf_insert_array_compound + external nf_insert_array_compound + + integer nf_inq_compound + external nf_inq_compound + + integer nf_inq_compound_name + external nf_inq_compound_name + + integer nf_inq_compound_size + external nf_inq_compound_size + + integer nf_inq_compound_nfields + external nf_inq_compound_nfields + + integer nf_inq_compound_field + external nf_inq_compound_field + + integer nf_inq_compound_fieldname + external nf_inq_compound_fieldname + + integer nf_inq_compound_fieldindex + external nf_inq_compound_fieldindex + + integer nf_inq_compound_fieldoffset + external nf_inq_compound_fieldoffset + + integer nf_inq_compound_fieldtype + external nf_inq_compound_fieldtype + + integer nf_inq_compound_fieldndims + external nf_inq_compound_fieldndims + + integer nf_inq_compound_fielddim_sizes + external nf_inq_compound_fielddim_sizes + +! User defined types - variable length arrays. + integer nf_def_vlen + external nf_def_vlen + + integer nf_inq_vlen + external nf_inq_vlen + + integer nf_free_vlen + external nf_free_vlen + +! User defined types - enums. + integer nf_def_enum + external nf_def_enum + + integer nf_insert_enum + external nf_insert_enum + + integer nf_inq_enum + external nf_inq_enum + + integer nf_inq_enum_member + external nf_inq_enum_member + + integer nf_inq_enum_ident + external nf_inq_enum_ident + +! User defined types - opaque. + integer nf_def_opaque + external nf_def_opaque + + integer nf_inq_opaque + external nf_inq_opaque + +! Write and read attributes of any type, including user defined +! types. + integer nf_put_att + external nf_put_att + integer nf_get_att + external nf_get_att + +! Write and read variables of any type, including user defined +! types. + integer nf_put_var + external nf_put_var + integer nf_put_var1 + external nf_put_var1 + integer nf_put_vara + external nf_put_vara + integer nf_put_vars + external nf_put_vars + integer nf_get_var + external nf_get_var + integer nf_get_var1 + external nf_get_var1 + integer nf_get_vara + external nf_get_vara + integer nf_get_vars + external nf_get_vars + +! For helping F77 users with VLENs. + integer nf_get_vlen_element + external nf_get_vlen_element + integer nf_put_vlen_element + external nf_put_vlen_element + +! For dealing with file level chunk cache. + integer nf_set_chunk_cache + external nf_set_chunk_cache + integer nf_get_chunk_cache + external nf_get_chunk_cache + +! For dealing with per variable chunk cache. + integer nf_set_var_chunk_cache + external nf_set_var_chunk_cache + integer nf_get_var_chunk_cache + external nf_get_var_chunk_cache + +! NetCDF-2. +!ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +! begin netcdf 2.4 backward compatibility: +! + +! +! functions in the fortran interface +! + integer nccre + integer ncopn + integer ncddef + integer ncdid + integer ncvdef + integer ncvid + integer nctlen + integer ncsfil + + external nccre + external ncopn + external ncddef + external ncdid + external ncvdef + external ncvid + external nctlen + external ncsfil + + + integer ncrdwr + integer nccreat + integer ncexcl + integer ncindef + integer ncnsync + integer nchsync + integer ncndirty + integer nchdirty + integer nclink + integer ncnowrit + integer ncwrite + integer ncclob + integer ncnoclob + integer ncglobal + integer ncfill + integer ncnofill + integer maxncop + integer maxncdim + integer maxncatt + integer maxncvar + integer maxncnam + integer maxvdims + integer ncnoerr + integer ncebadid + integer ncenfile + integer nceexist + integer nceinval + integer nceperm + integer ncenotin + integer nceindef + integer ncecoord + integer ncemaxds + integer ncename + integer ncenoatt + integer ncemaxat + integer ncebadty + integer ncebadd + integer ncests + integer nceunlim + integer ncemaxvs + integer ncenotvr + integer nceglob + integer ncenotnc + integer ncfoobar + integer ncsyserr + integer ncfatal + integer ncverbos + integer ncentool + + +! +! netcdf data types: +! + integer ncbyte + integer ncchar + integer ncshort + integer nclong + integer ncfloat + integer ncdouble + + parameter(ncbyte = 1) + parameter(ncchar = 2) + parameter(ncshort = 3) + parameter(nclong = 4) + parameter(ncfloat = 5) + parameter(ncdouble = 6) + +! +! masks for the struct nc flag field; passed in as 'mode' arg to +! nccreate and ncopen. +! + +! read/write, 0 => readonly + parameter(ncrdwr = 1) +! in create phase, cleared by ncendef + parameter(nccreat = 2) +! on create destroy existing file + parameter(ncexcl = 4) +! in define mode, cleared by ncendef + parameter(ncindef = 8) +! synchronise numrecs on change (x'10') + parameter(ncnsync = 16) +! synchronise whole header on change (x'20') + parameter(nchsync = 32) +! numrecs has changed (x'40') + parameter(ncndirty = 64) +! header info has changed (x'80') + parameter(nchdirty = 128) +! prefill vars on endef and increase of record, the default behavior + parameter(ncfill = 0) +! do not fill vars on endef and increase of record (x'100') + parameter(ncnofill = 256) +! isa link (x'8000') + parameter(nclink = 32768) + +! +! 'mode' arguments for nccreate and ncopen +! + parameter(ncnowrit = 0) + parameter(ncwrite = ncrdwr) + parameter(ncclob = nf_clobber) + parameter(ncnoclob = nf_noclobber) + +! +! 'size' argument to ncdimdef for an unlimited dimension +! + integer ncunlim + parameter(ncunlim = 0) + +! +! attribute id to put/get a global attribute +! + parameter(ncglobal = 0) + +! +! advisory maximums: +! + parameter(maxncop = 64) + parameter(maxncdim = 1024) + parameter(maxncatt = 8192) + parameter(maxncvar = 8192) +! not enforced + parameter(maxncnam = 256) + parameter(maxvdims = maxncdim) + +! +! global netcdf error status variable +! initialized in error.c +! + +! no error + parameter(ncnoerr = nf_noerr) +! not a netcdf id + parameter(ncebadid = nf_ebadid) +! too many netcdfs open + parameter(ncenfile = -31) ! nc_syserr +! netcdf file exists && ncnoclob + parameter(nceexist = nf_eexist) +! invalid argument + parameter(nceinval = nf_einval) +! write to read only + parameter(nceperm = nf_eperm) +! operation not allowed in data mode + parameter(ncenotin = nf_enotindefine ) +! operation not allowed in define mode + parameter(nceindef = nf_eindefine) +! coordinates out of domain + parameter(ncecoord = nf_einvalcoords) +! maxncdims exceeded + parameter(ncemaxds = nf_emaxdims) +! string match to name in use + parameter(ncename = nf_enameinuse) +! attribute not found + parameter(ncenoatt = nf_enotatt) +! maxncattrs exceeded + parameter(ncemaxat = nf_emaxatts) +! not a netcdf data type + parameter(ncebadty = nf_ebadtype) +! invalid dimension id + parameter(ncebadd = nf_ebaddim) +! ncunlimited in the wrong index + parameter(nceunlim = nf_eunlimpos) +! maxncvars exceeded + parameter(ncemaxvs = nf_emaxvars) +! variable not found + parameter(ncenotvr = nf_enotvar) +! action prohibited on ncglobal varid + parameter(nceglob = nf_eglobal) +! not a netcdf file + parameter(ncenotnc = nf_enotnc) + parameter(ncests = nf_ests) + parameter (ncentool = nf_emaxname) + parameter(ncfoobar = 32) + parameter(ncsyserr = -31) + +! +! global options variable. used to determine behavior of error handler. +! initialized in lerror.c +! + parameter(ncfatal = 1) + parameter(ncverbos = 2) + +! +! default fill values. these must be the same as in the c interface. +! + integer filbyte + integer filchar + integer filshort + integer fillong + real filfloat + doubleprecision fildoub + + parameter (filbyte = -127) + parameter (filchar = 0) + parameter (filshort = -32767) + parameter (fillong = -2147483647) + parameter (filfloat = 9.9692099683868690e+36) + parameter (fildoub = 9.9692099683868690e+36) + +! This is to turn on netCDF internal logging. + integer nf_set_log_level + external nf_set_log_level diff --git a/src/radiate/rte-rrtmgp/rrtmgp/data/README.md b/src/radiate/rte-rrtmgp/rrtmgp/data/README.md new file mode 100644 index 0000000..98057d7 --- /dev/null +++ b/src/radiate/rte-rrtmgp/rrtmgp/data/README.md @@ -0,0 +1,5 @@ +# About spectral data + +This directory contains _k_-distributions for use with RRTMGP. Files with names ending in `2018-12-04` use the full spectral resolution of 16 g-points in each band. Files ending with +`210809` have half the spectral resolution (and hence take roughly half as much time to execute) but have somewhat larger errors. A more complete description of how the spectral +resolution was reduced and what the error characteristics are is included in a forthcoming manuscript. diff --git a/src/radiate/rte-rrtmgp/rrtmgp/data/rrtmgp-data-lw-g128-210809.nc b/src/radiate/rte-rrtmgp/rrtmgp/data/rrtmgp-data-lw-g128-210809.nc new file mode 100644 index 0000000..cf117a3 Binary files /dev/null and b/src/radiate/rte-rrtmgp/rrtmgp/data/rrtmgp-data-lw-g128-210809.nc differ diff --git a/src/radiate/rte-rrtmgp/rrtmgp/data/rrtmgp-data-lw-g256-2018-12-04.nc b/src/radiate/rte-rrtmgp/rrtmgp/data/rrtmgp-data-lw-g256-2018-12-04.nc new file mode 100644 index 0000000..c66d3a5 Binary files /dev/null and b/src/radiate/rte-rrtmgp/rrtmgp/data/rrtmgp-data-lw-g256-2018-12-04.nc differ diff --git a/src/radiate/rte-rrtmgp/rrtmgp/data/rrtmgp-data-sw-g112-210809.nc b/src/radiate/rte-rrtmgp/rrtmgp/data/rrtmgp-data-sw-g112-210809.nc new file mode 100644 index 0000000..84f7bd8 Binary files /dev/null and b/src/radiate/rte-rrtmgp/rrtmgp/data/rrtmgp-data-sw-g112-210809.nc differ diff --git a/src/radiate/rte-rrtmgp/rrtmgp/data/rrtmgp-data-sw-g224-2018-12-04.nc b/src/radiate/rte-rrtmgp/rrtmgp/data/rrtmgp-data-sw-g224-2018-12-04.nc new file mode 100644 index 0000000..2ed67d1 Binary files /dev/null and b/src/radiate/rte-rrtmgp/rrtmgp/data/rrtmgp-data-sw-g224-2018-12-04.nc differ diff --git a/src/radiate/rte-rrtmgp/rrtmgp/kernels-openacc/mo_gas_optics_kernels.F90 b/src/radiate/rte-rrtmgp/rrtmgp/kernels-openacc/mo_gas_optics_kernels.F90 new file mode 100644 index 0000000..449c02c --- /dev/null +++ b/src/radiate/rte-rrtmgp/rrtmgp/kernels-openacc/mo_gas_optics_kernels.F90 @@ -0,0 +1,751 @@ +! This code is part of +! RRTM for GCM Applications - Parallel (RRTMGP) +! +! Eli Mlawer and Robert Pincus +! Andre Wehe and Jennifer Delamere +! email: rrtmgp@aer.com +! +! Copyright 2015, Atmospheric and Environmental Research and +! Regents of the University of Colorado. All right reserved. +! +! Use and duplication is permitted under the terms of the +! BSD 3-clause license, see http://opensource.org/licenses/BSD-3-Clause +! +! Description: Numeric calculations for gas optics. Absorption and Rayleigh optical depths, +! source functions. + +module mo_gas_optics_kernels + use mo_rte_kind, only: wp, wl + use mo_rte_util_array,only: zero_array + implicit none + private + public :: interpolation, compute_tau_absorption, compute_tau_rayleigh, compute_Planck_source +contains + ! -------------------------------------------------------------------------------------- + ! Compute interpolation coefficients + ! for calculations of major optical depths, minor optical depths, Rayleigh, + ! and Planck fractions + subroutine interpolation( & + ncol,nlay,ngas,nflav,neta, npres, ntemp, & + flavor, & + press_ref_log, temp_ref,press_ref_log_delta, & + temp_ref_min,temp_ref_delta,press_ref_trop_log, & + vmr_ref, & + play,tlay,col_gas, & + jtemp,fmajor,fminor,col_mix,tropo,jeta,jpress) bind(C, name="rrtmgp_interpolation") + ! input dimensions + integer, intent(in) :: ncol,nlay + integer, intent(in) :: ngas,nflav,neta,npres,ntemp + integer, dimension(2,nflav), intent(in) :: flavor + real(wp), dimension(npres), intent(in) :: press_ref_log + real(wp), dimension(ntemp), intent(in) :: temp_ref + real(wp), intent(in) :: press_ref_log_delta, & + temp_ref_min, temp_ref_delta, & + press_ref_trop_log + real(wp), dimension(2,0:ngas,ntemp), intent(in) :: vmr_ref + + ! inputs from profile or parent function + real(wp), dimension(ncol,nlay), intent(in) :: play, tlay + real(wp), dimension(ncol,nlay,0:ngas), intent(in) :: col_gas + + ! outputs + integer, dimension(ncol,nlay), intent(out) :: jtemp, jpress + logical(wl), dimension(ncol,nlay), intent(out) :: tropo + integer, dimension(2, ncol,nlay,nflav), intent(out) :: jeta + real(wp), dimension(2, ncol,nlay,nflav), intent(out) :: col_mix + real(wp), dimension(2,2,2,ncol,nlay,nflav), intent(out) :: fmajor + real(wp), dimension(2,2, ncol,nlay,nflav), intent(out) :: fminor + ! ----------------- + ! local + real(wp), dimension(ncol,nlay) :: ftemp, fpress ! interpolation fraction for temperature, pressure + real(wp) :: locpress ! needed to find location in pressure grid + real(wp) :: ratio_eta_half ! ratio of vmrs of major species that defines eta=0.5 + ! for given flavor and reference temperature level + real(wp) :: eta, feta ! binary_species_parameter, interpolation variable for eta + real(wp) :: loceta ! needed to find location in eta grid + real(wp) :: ftemp_term + ! ----------------- + ! local indexes + integer :: icol, ilay, iflav, igases(2), itropo, itemp + + !$acc data copyin(flavor,press_ref_log,temp_ref,vmr_ref,play,tlay,col_gas) & + !$acc copyout(jtemp,jpress,tropo,jeta,col_mix,fmajor,fminor) & + !$acc create(ftemp,fpress) + !$omp target data map(to:flavor, press_ref_log, temp_ref, vmr_ref, play, tlay, col_gas) & + !$omp map(alloc:jtemp, jpress, tropo, jeta, col_mix, fmajor, fminor) & + !$omp map(alloc:ftemp, fpress) + + !$acc parallel loop gang vector collapse(2) default(present) + !$omp target teams distribute parallel do simd collapse(2) + do ilay = 1, nlay + do icol = 1, ncol + ! index and factor for temperature interpolation + jtemp(icol,ilay) = int((tlay(icol,ilay) - (temp_ref_min - temp_ref_delta)) / temp_ref_delta) + jtemp(icol,ilay) = min(ntemp - 1, max(1, jtemp(icol,ilay))) ! limit the index range + ftemp(icol,ilay) = (tlay(icol,ilay) - temp_ref(jtemp(icol,ilay))) / temp_ref_delta + + ! index and factor for pressure interpolation + locpress = 1._wp + (log(play(icol,ilay)) - press_ref_log(1)) / press_ref_log_delta + jpress(icol,ilay) = min(npres-1, max(1, int(locpress))) + fpress(icol,ilay) = locpress - float(jpress(icol,ilay)) + + ! determine if in lower or upper part of atmosphere + tropo(icol,ilay) = log(play(icol,ilay)) > press_ref_trop_log + end do + end do + + ! loop over implemented combinations of major species + ! PGI BUG WORKAROUND: if present(vmr_ref) isn't there, OpenACC runtime + ! thinks it isn't present. + !$acc parallel loop gang vector collapse(4) default(present) private(igases) + !$omp target teams distribute parallel do simd collapse(4) private(igases) + do iflav = 1, nflav + do ilay = 1, nlay + ! loop over implemented combinations of major species + do icol = 1, ncol + do itemp = 1, 2 + igases(:) = flavor(:,iflav) + ! itropo = 1 lower atmosphere; itropo = 2 upper atmosphere + itropo = merge(1,2,tropo(icol,ilay)) + ! compute interpolation fractions needed for lower, then upper reference temperature level + ! compute binary species parameter (eta) for flavor and temperature and + ! associated interpolation index and factors + ratio_eta_half = vmr_ref(itropo,igases(1),(jtemp(icol,ilay)+itemp-1)) / & + vmr_ref(itropo,igases(2),(jtemp(icol,ilay)+itemp-1)) + col_mix(itemp,icol,ilay,iflav) = col_gas(icol,ilay,igases(1)) + ratio_eta_half * col_gas(icol,ilay,igases(2)) + eta = merge(col_gas(icol,ilay,igases(1)) / col_mix(itemp,icol,ilay,iflav), 0.5_wp, & + col_mix(itemp,icol,ilay,iflav) > 2._wp * tiny(col_mix)) + loceta = eta * float(neta-1) + jeta(itemp,icol,ilay,iflav) = min(int(loceta)+1, neta-1) + feta = mod(loceta, 1.0_wp) + ! compute interpolation fractions needed for minor species + ! ftemp_term = (1._wp-ftemp(icol,ilay)) for itemp = 1, ftemp(icol,ilay) for itemp=2 + ftemp_term = (real(2-itemp, wp) + real(2*itemp-3, wp) * ftemp(icol,ilay)) + fminor(1,itemp,icol,ilay,iflav) = (1._wp-feta) * ftemp_term + fminor(2,itemp,icol,ilay,iflav) = feta * ftemp_term + ! compute interpolation fractions needed for major species + fmajor(1,1,itemp,icol,ilay,iflav) = (1._wp-fpress(icol,ilay)) * fminor(1,itemp,icol,ilay,iflav) + fmajor(2,1,itemp,icol,ilay,iflav) = (1._wp-fpress(icol,ilay)) * fminor(2,itemp,icol,ilay,iflav) + fmajor(1,2,itemp,icol,ilay,iflav) = fpress(icol,ilay) * fminor(1,itemp,icol,ilay,iflav) + fmajor(2,2,itemp,icol,ilay,iflav) = fpress(icol,ilay) * fminor(2,itemp,icol,ilay,iflav) + end do ! reference temperatures + end do ! icol + end do ! ilay + end do ! iflav + + !$acc end data + !$omp end target data + + end subroutine interpolation + ! -------------------------------------------------------------------------------------- + ! + ! Compute minor and major species opitcal depth from pre-computed interpolation coefficients + ! (jeta,jtemp,jpress) + ! + subroutine compute_tau_absorption( & + ncol,nlay,nbnd,ngpt, & ! dimensions + ngas,nflav,neta,npres,ntemp, & + nminorlower, nminorklower, & ! number of minor contributors, total num absorption coeffs + nminorupper, nminorkupper, & + idx_h2o, & + gpoint_flavor, & + band_lims_gpt, & + kmajor, & + kminor_lower, & + kminor_upper, & + minor_limits_gpt_lower, & + minor_limits_gpt_upper, & + minor_scales_with_density_lower, & + minor_scales_with_density_upper, & + scale_by_complement_lower, & + scale_by_complement_upper, & + idx_minor_lower, & + idx_minor_upper, & + idx_minor_scaling_lower, & + idx_minor_scaling_upper, & + kminor_start_lower, & + kminor_start_upper, & + tropo, & + col_mix,fmajor,fminor, & + play,tlay,col_gas, & + jeta,jtemp,jpress, & + tau) bind(C, name="rrtmgp_compute_tau_absorption") + ! --------------------- + ! input dimensions + integer, intent(in) :: ncol,nlay,nbnd,ngpt + integer, intent(in) :: ngas,nflav,neta,npres,ntemp + integer, intent(in) :: nminorlower, nminorklower,nminorupper, nminorkupper + integer, intent(in) :: idx_h2o + ! --------------------- + ! inputs from object + integer, dimension(2,ngpt), intent(in) :: gpoint_flavor + integer, dimension(2,nbnd), intent(in) :: band_lims_gpt + real(wp), dimension(ntemp,neta,npres+1,ngpt), intent(in) :: kmajor + real(wp), dimension(ntemp,neta,nminorklower), intent(in) :: kminor_lower + real(wp), dimension(ntemp,neta,nminorkupper), intent(in) :: kminor_upper + integer, dimension(2,nminorlower), intent(in) :: minor_limits_gpt_lower + integer, dimension(2,nminorupper), intent(in) :: minor_limits_gpt_upper + logical(wl), dimension( nminorlower), intent(in) :: minor_scales_with_density_lower + logical(wl), dimension( nminorupper), intent(in) :: minor_scales_with_density_upper + logical(wl), dimension( nminorlower), intent(in) :: scale_by_complement_lower + logical(wl), dimension( nminorupper), intent(in) :: scale_by_complement_upper + integer, dimension( nminorlower), intent(in) :: idx_minor_lower + integer, dimension( nminorupper), intent(in) :: idx_minor_upper + integer, dimension( nminorlower), intent(in) :: idx_minor_scaling_lower + integer, dimension( nminorupper), intent(in) :: idx_minor_scaling_upper + integer, dimension( nminorlower), intent(in) :: kminor_start_lower + integer, dimension( nminorupper), intent(in) :: kminor_start_upper + logical(wl), dimension(ncol,nlay), intent(in) :: tropo + ! --------------------- + ! inputs from profile or parent function + real(wp), dimension(2, ncol,nlay,nflav ), intent(in) :: col_mix + real(wp), dimension(2,2,2,ncol,nlay,nflav ), intent(in) :: fmajor + real(wp), dimension(2,2, ncol,nlay,nflav ), intent(in) :: fminor + real(wp), dimension( ncol,nlay ), intent(in) :: play, tlay ! pressure and temperature + real(wp), dimension( ncol,nlay,0:ngas), intent(in) :: col_gas + integer, dimension(2, ncol,nlay,nflav ), intent(in) :: jeta + integer, dimension( ncol,nlay ), intent(in) :: jtemp + integer, dimension( ncol,nlay ), intent(in) :: jpress + ! --------------------- + ! output - optical depth + real(wp), dimension(ncol,nlay,ngpt), intent(inout) :: tau + ! --------------------- + ! Local variables + ! + logical(wl) :: top_at_1 + integer, dimension(ncol,2) :: itropo_lower, itropo_upper + integer :: icol, idx_tropo + + ! ---------------------------------------------------------------- + + !$acc enter data create(itropo_lower, itropo_upper) + !$omp target enter data map(alloc:itropo_lower, itropo_upper) + !$acc enter data copyin(play, tlay, tropo, gpoint_flavor, jeta, jtemp, col_gas, fminor, tau) + !$omp target enter data map(to:play, tlay, tropo, gpoint_flavor, jeta, jtemp, col_gas, fminor, tau) + + ! --------------------- + ! Layer limits of upper, lower atmospheres + ! --------------------- + + !$acc kernels copyout(top_at_1) + !$omp target map(from:top_at_1) + top_at_1 = play(1,1) < play(1, nlay) + !$acc end kernels + !$omp end target + + if(top_at_1) then + !$acc parallel loop + !$omp target teams distribute parallel do simd + do icol = 1,ncol + itropo_lower(icol,2) = nlay +#if defined(_CRAYFTN) || defined(__NVCOMPILER) + itropo_upper(icol,1) = 1 + call minmaxloc(icol, tropo, play, itropo_lower(icol,1), itropo_upper(icol,2)) +#else + itropo_lower(icol,1) = minloc(play(icol,:), dim=1, mask=tropo(icol,:)) + itropo_upper(icol,1) = 1 + itropo_upper(icol,2) = maxloc(play(icol,:), dim=1, mask=(.not. tropo(icol,:))) +#endif + end do + else + !$acc parallel loop + !$omp target teams distribute parallel do simd + do icol = 1,ncol + itropo_lower(icol,1) = 1 +#if defined(_CRAYFTN) || defined(__NVCOMPILER) + itropo_upper(icol,2) = nlay + call minmaxloc(icol, tropo, play, itropo_lower(icol,2), itropo_upper(icol,1)) +#else + itropo_lower(icol,2) = minloc(play(icol,:), dim=1, mask=tropo(icol,:)) + itropo_upper(icol,2) = nlay + itropo_upper(icol,1) = maxloc(play(icol,:), dim=1, mask=(.not.tropo(icol,:))) +#endif + end do + end if + ! --------------------- + ! Major Species + ! --------------------- + call gas_optical_depths_major( & + ncol,nlay,nbnd,ngpt, & ! dimensions + nflav,neta,npres,ntemp, & + gpoint_flavor, & + band_lims_gpt, & + kmajor, & + col_mix,fmajor, & + jeta,tropo,jtemp,jpress, & + tau) + ! --------------------- + ! Minor Species - lower + ! --------------------- + idx_tropo = 1 + call gas_optical_depths_minor( & + ncol,nlay,ngpt, & ! dimensions + ngas,nflav,ntemp,neta, & + nminorlower,nminorklower, & + idx_h2o,idx_tropo, & + gpoint_flavor, & + kminor_lower, & + minor_limits_gpt_lower, & + minor_scales_with_density_lower, & + scale_by_complement_lower, & + idx_minor_lower, & + idx_minor_scaling_lower, & + kminor_start_lower, & + play, tlay, & + col_gas,fminor,jeta, & + itropo_lower,jtemp, & + tau) + ! --------------------- + ! Minor Species - upper + ! --------------------- + idx_tropo = 2 + call gas_optical_depths_minor( & + ncol,nlay,ngpt, & ! dimensions + ngas,nflav,ntemp,neta, & + nminorupper,nminorkupper, & + idx_h2o,idx_tropo, & + gpoint_flavor, & + kminor_upper, & + minor_limits_gpt_upper, & + minor_scales_with_density_upper, & + scale_by_complement_upper, & + idx_minor_upper, & + idx_minor_scaling_upper, & + kminor_start_upper, & + play, tlay, & + col_gas,fminor,jeta, & + itropo_upper,jtemp, & + tau) + + !$acc exit data delete(itropo_lower,itropo_upper) + !$omp target exit data map(release:itropo_lower, itropo_upper) + !$acc exit data delete(play, tlay, tropo, gpoint_flavor, jeta, jtemp, col_gas, fminor) + !$omp target exit data map(release:play, tlay, tropo, gpoint_flavor, jeta, jtemp, col_gas, fminor) + !$acc exit data copyout(tau) + !$omp target exit data map(from:tau) + + end subroutine compute_tau_absorption + ! -------------------------------------------------------------------------------------- + + ! -------------------------------------------------------------------------------------- + ! + ! compute minor species optical depths + ! + subroutine gas_optical_depths_major(ncol,nlay,nbnd,ngpt,& + nflav,neta,npres,ntemp, & ! dimensions + gpoint_flavor, band_lims_gpt, & ! inputs from object + kmajor, & + col_mix,fmajor, & + jeta,tropo,jtemp,jpress, & ! local input + tau) + ! input dimensions + integer, intent(in) :: ncol, nlay, nbnd, ngpt, nflav,neta,npres,ntemp ! dimensions + + ! inputs from object + integer, dimension(2,ngpt), intent(in) :: gpoint_flavor + integer, dimension(2,nbnd), intent(in) :: band_lims_gpt ! start and end g-point for each band + real(wp), dimension(ntemp,neta,npres+1,ngpt), intent(in) :: kmajor + + ! inputs from profile or parent function + real(wp), dimension(2, ncol,nlay,nflav), intent(in) :: col_mix + real(wp), dimension(2,2,2,ncol,nlay,nflav), intent(in) :: fmajor + integer, dimension(2, ncol,nlay,nflav), intent(in) :: jeta + logical(wl), dimension(ncol,nlay), intent(in) :: tropo + integer, dimension(ncol,nlay), intent(in) :: jtemp, jpress + + ! outputs + real(wp), dimension(ncol,nlay,ngpt), intent(inout) :: tau + ! ----------------- + ! local variables + real(wp) :: tau_major ! major species optical depth + ! local index + integer :: icol, ilay, iflav, igpt, itropo + + ! ----------------- + + ! ----------------- + + ! optical depth calculation for major species + !$acc parallel loop collapse(2) + !$omp target teams distribute parallel do simd collapse(2) + do ilay = 1, nlay + do icol = 1, ncol + + !$acc loop seq + do igpt = 1, ngpt + ! itropo = 1 lower atmosphere; itropo = 2 upper atmosphere + itropo = merge(1,2,tropo(icol,ilay)) ! WS: moved inside innermost loop + + ! binary species parameter (eta) and col_mix depend on band flavor + iflav = gpoint_flavor(itropo, igpt) + tau_major = & + ! interpolation in temperature, pressure, and eta + interpolate3D(col_mix(:,icol,ilay,iflav), & + fmajor(:,:,:,icol,ilay,iflav), kmajor, & + igpt, jeta(:,icol,ilay,iflav), jtemp(icol,ilay),jpress(icol,ilay)+itropo) + tau(icol,ilay,igpt) = tau(icol,ilay,igpt) + tau_major + end do ! igpt + + end do + end do ! ilay + end subroutine gas_optical_depths_major + + ! ---------------------------------------------------------- + ! + ! compute minor species optical depths + ! + subroutine gas_optical_depths_minor(ncol,nlay,ngpt, & + ngas,nflav,ntemp,neta, & + nminor,nminork, & + idx_h2o,idx_tropo, & + gpt_flv, & + kminor, & + minor_limits_gpt, & + minor_scales_with_density, & + scale_by_complement, & + idx_minor, idx_minor_scaling, & + kminor_start, & + play, tlay, & + col_gas,fminor,jeta, & + layer_limits,jtemp, & + tau) + integer, intent(in ) :: ncol,nlay,ngpt + integer, intent(in ) :: ngas,nflav + integer, intent(in ) :: ntemp,neta,nminor,nminork + integer, intent(in ) :: idx_h2o, idx_tropo + integer, dimension(2, ngpt), intent(in ) :: gpt_flv + real(wp), dimension(ntemp,neta,nminork), intent(in ) :: kminor + integer, dimension(2,nminor), intent(in ) :: minor_limits_gpt + logical(wl), dimension( nminor), intent(in ) :: minor_scales_with_density + logical(wl), dimension( nminor), intent(in ) :: scale_by_complement + integer, dimension( nminor), intent(in ) :: kminor_start + integer, dimension( nminor), intent(in ) :: idx_minor, idx_minor_scaling + real(wp), dimension(ncol,nlay), intent(in ) :: play, tlay + real(wp), dimension(ncol,nlay,0:ngas), intent(in ) :: col_gas + real(wp), dimension(2,2,ncol,nlay,nflav), intent(in ) :: fminor + integer, dimension(2, ncol,nlay,nflav), intent(in ) :: jeta + integer, dimension(ncol, 2), intent(in ) :: layer_limits + integer, dimension(ncol,nlay), intent(in ) :: jtemp + real(wp), dimension(ncol,nlay,ngpt), intent(inout) :: tau + ! ----------------- + ! local variables + real(wp), parameter :: PaTohPa = 0.01_wp + real(wp) :: vmr_fact, dry_fact ! conversion from column abundance to dry vol. mixing ratio; + real(wp) :: scaling, kminor_loc, tau_minor ! minor species absorption coefficient, optical depth + integer :: icol, ilay, iflav, igpt, imnr + integer :: minor_start, minor_loc, extent + + real(wp) :: myplay, mytlay, mycol_gas_h2o, mycol_gas_imnr, mycol_gas_0 + real(wp) :: myfminor(2,2) + integer :: myjtemp, myjeta(2) + ! ----------------- + + extent = size(scale_by_complement,dim=1) + + !$acc parallel loop gang vector collapse(2) + !$omp target teams distribute parallel do simd collapse(2) + do ilay = 1 , nlay + do icol = 1, ncol + ! + ! This check skips individual columns with no pressures in range + ! + if ( layer_limits(icol,1) <= 0 .or. ilay < layer_limits(icol,1) .or. ilay > layer_limits(icol,2) ) cycle + + myplay = play (icol,ilay) + mytlay = tlay (icol,ilay) + myjtemp = jtemp(icol,ilay) + mycol_gas_h2o = col_gas(icol,ilay,idx_h2o) + mycol_gas_0 = col_gas(icol,ilay,0) + + !$acc loop seq + do imnr = 1, extent + ! What is the starting point in the stored array of minor absorption coefficients? + minor_start = kminor_start(imnr) + + !$acc loop seq + do igpt = minor_limits_gpt(1,imnr), minor_limits_gpt(2,imnr) + + scaling = col_gas(icol,ilay,idx_minor(imnr)) + if (minor_scales_with_density(imnr)) then + ! + ! NOTE: P needed in hPa to properly handle density scaling. + ! + scaling = scaling * (PaTohPa * myplay/mytlay) + + if(idx_minor_scaling(imnr) > 0) then ! there is a second gas that affects this gas's absorption + mycol_gas_imnr = col_gas(icol,ilay,idx_minor_scaling(imnr)) + vmr_fact = 1._wp / mycol_gas_0 + dry_fact = 1._wp / (1._wp + mycol_gas_h2o * vmr_fact) + ! scale by density of special gas + if (scale_by_complement(imnr)) then ! scale by densities of all gases but the special one + scaling = scaling * (1._wp - mycol_gas_imnr * vmr_fact * dry_fact) + else + scaling = scaling * (mycol_gas_imnr * vmr_fact * dry_fact) + endif + endif + endif + + ! + ! Interpolation of absorption coefficient and calculation of optical depth + ! + tau_minor = 0._wp + iflav = gpt_flv(idx_tropo,igpt) ! eta interpolation depends on flavor + minor_loc = minor_start + (igpt - minor_limits_gpt(1,imnr)) ! add offset to starting point + kminor_loc = interpolate2D(fminor(:,:,icol,ilay,iflav), kminor, minor_loc, & + jeta(:,icol,ilay,iflav), myjtemp) + tau_minor = kminor_loc * scaling + tau(icol,ilay,igpt) = tau(icol,ilay,igpt) + tau_minor + enddo + enddo + + enddo + enddo + + end subroutine gas_optical_depths_minor + ! ---------------------------------------------------------- + ! + ! compute Rayleigh scattering optical depths + ! + subroutine compute_tau_rayleigh(ncol,nlay,nbnd,ngpt, & + ngas,nflav,neta,npres,ntemp, & + gpoint_flavor,band_lims_gpt, & + krayl, & + idx_h2o, col_dry,col_gas, & + fminor,jeta,tropo,jtemp, & + tau_rayleigh) bind(C, name="rrtmgp_compute_tau_rayleigh") + integer, intent(in ) :: ncol,nlay,nbnd,ngpt + integer, intent(in ) :: ngas,nflav,neta,npres,ntemp + integer, dimension(2,ngpt), intent(in ) :: gpoint_flavor + integer, dimension(2,nbnd), intent(in ) :: band_lims_gpt ! start and end g-point for each band + real(wp), dimension(ntemp,neta,ngpt,2), intent(in ) :: krayl + integer, intent(in ) :: idx_h2o + real(wp), dimension(ncol,nlay), intent(in ) :: col_dry + real(wp), dimension(ncol,nlay,0:ngas), intent(in ) :: col_gas + real(wp), dimension(2,2,ncol,nlay,nflav), intent(in ) :: fminor + integer, dimension(2, ncol,nlay,nflav), intent(in ) :: jeta + logical(wl), dimension(ncol,nlay), intent(in ) :: tropo + integer, dimension(ncol,nlay), intent(in ) :: jtemp + ! outputs + real(wp), dimension(ncol,nlay,ngpt), intent(out) :: tau_rayleigh + ! ----------------- + ! local variables + real(wp) :: k ! rayleigh scattering coefficient + integer :: icol, ilay, iflav, igpt + integer :: itropo + ! ----------------- + + !$acc parallel loop collapse(2) + !$omp target teams distribute parallel do simd collapse(2) + do ilay = 1, nlay + do icol = 1, ncol + !$acc loop seq + do igpt = 1, ngpt + itropo = merge(1,2,tropo(icol,ilay)) ! itropo = 1 lower atmosphere; itropo = 2 upper atmosphere + iflav = gpoint_flavor(itropo, igpt) + k = interpolate2D(fminor(:,:,icol,ilay,iflav), & + krayl(:,:,:,itropo), & + igpt, jeta(:,icol,ilay,iflav), jtemp(icol,ilay)) + tau_rayleigh(icol,ilay,igpt) = k * (col_gas(icol,ilay,idx_h2o)+col_dry(icol,ilay)) + end do + end do + end do + end subroutine compute_tau_rayleigh + + ! ---------------------------------------------------------- + subroutine compute_Planck_source( & + ncol, nlay, nbnd, ngpt, & + nflav, neta, npres, ntemp, nPlanckTemp,& + tlay, tlev, tsfc, sfc_lay, & + fmajor, jeta, tropo, jtemp, jpress, & + gpoint_bands, band_lims_gpt, & + pfracin, temp_ref_min, totplnk_delta, totplnk, gpoint_flavor, & + sfc_src, lay_src, lev_src_inc, lev_src_dec, sfc_source_Jac) bind(C, name="rrtmgp_compute_Planck_source") + integer, intent(in) :: ncol, nlay, nbnd, ngpt + integer, intent(in) :: nflav, neta, npres, ntemp, nPlanckTemp + real(wp), dimension(ncol,nlay ), intent(in) :: tlay + real(wp), dimension(ncol,nlay+1), intent(in) :: tlev + real(wp), dimension(ncol ), intent(in) :: tsfc + integer, intent(in) :: sfc_lay + ! Interpolation variables + real(wp), dimension(2,2,2,ncol,nlay,nflav), intent(in) :: fmajor + integer, dimension(2, ncol,nlay,nflav), intent(in) :: jeta + logical(wl), dimension( ncol,nlay), intent(in) :: tropo + integer, dimension( ncol,nlay), intent(in) :: jtemp, jpress + ! Table-specific + integer, dimension(ngpt), intent(in) :: gpoint_bands ! start and end g-point for each band + integer, dimension(2, nbnd), intent(in) :: band_lims_gpt ! start and end g-point for each band + real(wp), intent(in) :: temp_ref_min, totplnk_delta + real(wp), dimension(ntemp,neta,npres+1,ngpt), intent(in) :: pfracin + real(wp), dimension(nPlanckTemp,nbnd), intent(in) :: totplnk + integer, dimension(2,ngpt), intent(in) :: gpoint_flavor + + real(wp), dimension(ncol, ngpt), intent(out) :: sfc_src + real(wp), dimension(ncol,nlay,ngpt), intent(out) :: lay_src + real(wp), dimension(ncol,nlay,ngpt), intent(out) :: lev_src_inc, lev_src_dec + real(wp), dimension(ncol, ngpt), intent(out) :: sfc_source_Jac + ! ----------------- + ! local + real(wp), parameter :: delta_Tsurf = 1.0_wp + + integer :: ilay, icol, igpt, ibnd, itropo, iflav + integer :: gptS, gptE + real(wp), dimension(2), parameter :: one = [1._wp, 1._wp] + real(wp) :: pfrac + real(wp) :: planck_function_1, planck_function_2 + ! ----------------- + + !$acc data copyin( tlay,tlev,tsfc,fmajor,jeta,tropo,jtemp,jpress,gpoint_bands,pfracin,totplnk,gpoint_flavor) & + !$acc copyout( sfc_src,lay_src,lev_src_inc,lev_src_dec,sfc_source_Jac) + !$omp target data map( to:tlay,tlev,tsfc,fmajor,jeta,tropo,jtemp,jpress,gpoint_bands,pfracin,totplnk,gpoint_flavor) & + !$omp map(from: sfc_src,lay_src,lev_src_inc,lev_src_dec,sfc_source_Jac) + + ! Calculation of fraction of band's Planck irradiance associated with each g-point + !$acc parallel loop tile(128,2) + !$omp target teams distribute parallel do simd collapse(2) + do ilay = 1, nlay + do icol = 1, ncol + + !$acc loop seq + do igpt = 1, ngpt + ibnd = gpoint_bands(igpt) + ! itropo = 1 lower atmosphere; itropo = 2 upper atmosphere + itropo = merge(1,2,tropo(icol,ilay)) !WS moved itropo inside loop for GPU + iflav = gpoint_flavor(itropo, igpt) !eta interpolation depends on band's flavor + pfrac = & + ! interpolation in temperature, pressure, and eta + interpolate3D(one, fmajor(:,:,:,icol,ilay,iflav), pfracin, & + igpt, jeta(:,icol,ilay,iflav), jtemp(icol,ilay),jpress(icol,ilay)+itropo) + ! Compute layer source irradiance for g-point, equals band irradiance x fraction for g-point + planck_function_1 = interpolate1D(tlay(icol,ilay), temp_ref_min, totplnk_delta, totplnk(:,ibnd)) + lay_src(icol,ilay,igpt) = pfrac * planck_function_1 + ! Compute layer source irradiance for g-point, equals band irradiance x fraction for g-point + planck_function_1 = interpolate1D(tlev(icol,ilay), temp_ref_min, totplnk_delta, totplnk(:,ibnd)) + planck_function_2 = interpolate1D(tlev(icol,ilay+1), temp_ref_min, totplnk_delta, totplnk(:,ibnd)) + lev_src_dec(icol,ilay,igpt) = pfrac * planck_function_1 + lev_src_inc(icol,ilay,igpt) = pfrac * planck_function_2 + + if (ilay == sfc_lay) then + planck_function_1 = interpolate1D(tsfc(icol) , temp_ref_min, totplnk_delta, totplnk(:,ibnd)) + planck_function_2 = interpolate1D(tsfc(icol) + delta_Tsurf, temp_ref_min, totplnk_delta, totplnk(:,ibnd)) + sfc_src (icol,igpt) = pfrac * planck_function_1 + sfc_source_Jac(icol,igpt) = pfrac * (planck_function_2 - planck_function_1) + end if + end do ! igpt + + end do ! icol + end do ! ilay + + !$acc end data + !$omp end target data + end subroutine compute_Planck_source + ! ---------------------------------------------------------- + ! + ! One dimensional interpolation + ! + function interpolate1D(val, offset, delta, table) result(res) + !$acc routine seq + !$omp declare target + ! input + real(wp), intent(in) :: val, & ! axis value at which to evaluate table + offset, & ! minimum of table axis + delta ! step size of table axis + real(wp), dimension(:), & + intent(in) :: table ! dimensions (axis, values) + ! output + real(wp) :: res + + ! local + real(wp) :: val0 ! fraction index adjusted by offset and delta + integer :: index ! index term + real(wp) :: frac ! fractional term + ! ------------------------------------- + val0 = (val - offset) / delta + frac = val0 - int(val0) ! get fractional part + index = min(size(table,dim=1)-1, max(1, int(val0)+1)) ! limit the index range + res = table(index) + frac * (table(index+1) - table(index)) + end function interpolate1D + ! ------------ + ! This function returns a single value from a subset (in gpoint) of the k table + ! + function interpolate2D(fminor, k, igpt, jeta, jtemp) result(res) + !$acc routine seq + !$omp declare target + real(wp), dimension(2,2), intent(in) :: fminor ! interpolation fractions for minor species + ! index(1) : reference eta level (temperature dependent) + ! index(2) : reference temperature level + real(wp), dimension(:,:,:), intent(in) :: k ! (g-point, eta, temp) + integer, intent(in) :: igpt, jtemp ! interpolation index for temperature + integer, dimension(2), intent(in) :: jeta ! interpolation index for binary species parameter (eta) + real(wp) :: res ! the result + + res = & + fminor(1,1) * k(jtemp , jeta(1) , igpt) + & + fminor(2,1) * k(jtemp , jeta(1)+1, igpt) + & + fminor(1,2) * k(jtemp+1, jeta(2) , igpt) + & + fminor(2,2) * k(jtemp+1, jeta(2)+1, igpt) + end function interpolate2D + + ! ---------------------------------------------------------- + ! interpolation in temperature, pressure, and eta + function interpolate3D(scaling, fmajor, k, igpt, jeta, jtemp, jpress) result(res) + !$acc routine seq + !$omp declare target + real(wp), dimension(2), intent(in) :: scaling + real(wp), dimension(2,2,2), intent(in) :: fmajor ! interpolation fractions for major species + ! index(1) : reference eta level (temperature dependent) + ! index(2) : reference pressure level + ! index(3) : reference temperature level + real(wp), dimension(:,:,:,:),intent(in) :: k ! (gpt, eta,temp,press) + integer, intent(in) :: igpt + integer, dimension(2), intent(in) :: jeta ! interpolation index for binary species parameter (eta) + integer, intent(in) :: jtemp ! interpolation index for temperature + integer, intent(in) :: jpress ! interpolation index for pressure + real(wp) :: res ! the result + ! each code block is for a different reference temperature + res = & + scaling(1) * & + ( fmajor(1,1,1) * k(jtemp, jeta(1) , jpress-1, igpt ) + & + fmajor(2,1,1) * k(jtemp, jeta(1)+1, jpress-1, igpt ) + & + fmajor(1,2,1) * k(jtemp, jeta(1) , jpress , igpt ) + & + fmajor(2,2,1) * k(jtemp, jeta(1)+1, jpress , igpt ) ) + & + scaling(2) * & + ( fmajor(1,1,2) * k(jtemp+1, jeta(2) , jpress-1, igpt) + & + fmajor(2,1,2) * k(jtemp+1, jeta(2)+1, jpress-1, igpt) + & + fmajor(1,2,2) * k(jtemp+1, jeta(2) , jpress , igpt) + & + fmajor(2,2,2) * k(jtemp+1, jeta(2)+1, jpress , igpt) ) + end function interpolate3D + ! ---------------------------------------------------------- + ! + ! In-house subroutine for handling minloc and maxloc for + ! compilers which do not support GPU versions + ! + subroutine minmaxloc(i, mask, a, minl, maxl) + implicit none + !$acc routine seq + !$omp declare target + integer :: i, minl, maxl + logical(wl) :: mask(:,:) + real(wp) :: a(:,:) + integer :: j, n + real(wp) :: aij, amax, amin + n = size(a,2) + amax = -huge(amax) + amin = huge(amin) + do j = 1, n + aij = a(i,j) + if (mask(i,j)) then + if (aij.lt.amin) then + amin = aij + minl = j + end if + else + if (aij.gt.amax) then + amax = aij + maxl = j + end if + end if + end do + end subroutine + ! ---------------------------------------------------------- + +end module mo_gas_optics_kernels diff --git a/src/radiate/rte-rrtmgp/rrtmgp/kernels/mo_gas_optics_kernels.F90 b/src/radiate/rte-rrtmgp/rrtmgp/kernels/mo_gas_optics_kernels.F90 new file mode 100644 index 0000000..1ba0c1a --- /dev/null +++ b/src/radiate/rte-rrtmgp/rrtmgp/kernels/mo_gas_optics_kernels.F90 @@ -0,0 +1,780 @@ +! This code is part of +! RRTM for GCM Applications - Parallel (RRTMGP) +! +! Eli Mlawer and Robert Pincus +! Andre Wehe and Jennifer Delamere +! email: rrtmgp@aer.com +! +! Copyright 2015-, Atmospheric and Environmental Research, +! Regents of the University of Colorado, Trustees of Columbia University. All right reserved. +! +! Use and duplication is permitted under the terms of the +! BSD 3-clause license, see http://opensource.org/licenses/BSD-3-Clause +! ------------------------------------------------------------------------------------------------- +!> +!> ## Numeric calculations for gas optics. Absorption and Rayleigh optical depths, Planck source functions. +!> +!> - Interpolation coefficients are computed, then used in subsequent routines. +!> - All applications will call compute_tau_absorption(); +!> compute_tau_rayleigh() and/or compute_Planck_source() will be called depending on the +!> configuration of the k-distribution. +!> - The details of the interpolation scheme are not particaulrly important as long as arrays including +!> tables are passed consisently between kernels. +!> +! ------------------------------------------------------------------------------------------------- + +module mo_gas_optics_kernels + use mo_rte_kind, only : wp, wl + use mo_rte_util_array,only : zero_array + implicit none + private + public :: interpolation, compute_tau_absorption, compute_tau_rayleigh, compute_Planck_source +contains + ! -------------------------------------------------------------------------------------- + !> Compute interpolation coefficients + !> for calculations of major optical depths, minor optical depths, Rayleigh, + !> and Planck fractions + subroutine interpolation( & + ncol,nlay,ngas,nflav,neta, npres, ntemp, & + flavor, & + press_ref_log, temp_ref,press_ref_log_delta, & + temp_ref_min,temp_ref_delta,press_ref_trop_log, & + vmr_ref, & + play,tlay,col_gas, & + jtemp,fmajor,fminor,col_mix,tropo,jeta,jpress) bind(C, name="rrtmgp_interpolation") + ! input dimensions + integer, intent(in) :: ncol,nlay + !! physical domain size + integer, intent(in) :: ngas,nflav,neta,npres,ntemp + !! k-distribution table dimensions + integer, dimension(2,nflav), intent(in) :: flavor + !! index into vmr_ref of major gases for each flavor + real(wp), dimension(npres), intent(in) :: press_ref_log + !! log of pressure dimension in RRTMGP tables + real(wp), dimension(ntemp), intent(in) :: temp_ref + !! temperature dimension in RRTMGP tables + real(wp), intent(in) :: press_ref_log_delta, & + temp_ref_min, temp_ref_delta, & + press_ref_trop_log + !! constants related to RRTMGP tables + real(wp), dimension(2,0:ngas,ntemp), intent(in) :: vmr_ref + !! reference volume mixing ratios used in compute "binary species parameter" eta + + ! inputs from profile or parent function + real(wp), dimension(ncol,nlay), intent(in) :: play, tlay + !! input pressure (Pa?) and temperature (K) + real(wp), dimension(ncol,nlay,0:ngas), intent(in) :: col_gas + !! input column gas amount - molecules/cm^2 + ! outputs + integer, dimension(ncol,nlay), intent(out) :: jtemp, jpress + !! temperature and pressure interpolation indexes + integer, dimension(ncol,nlay), intent(out) :: tropo + !! use lower (or upper) atmosphere tables + integer, dimension(2, ncol,nlay,nflav), intent(out) :: jeta + !! Index for binary species interpolation +#if !defined(__INTEL_LLVM_COMPILER) && __INTEL_COMPILER >= 2021 + ! A performance-hitting workaround for the vectorization problem reported in + ! https://github.com/earth-system-radiation/rte-rrtmgp/issues/159 + ! The known affected compilers are Intel Fortran Compiler Classic + ! 2021.4, 2021.5 and 2022.1. We do not limit the workaround to these + ! versions because it is not clear when the compiler bug will be fixed, see + ! https://community.intel.com/t5/Intel-Fortran-Compiler/Compiler-vectorization-bug/m-p/1362591. + ! We, however, limit the workaround to the Classic versions only since the + ! problem is not confirmed for the Intel Fortran Compiler oneAPI (a.k.a + ! 'ifx'), which does not mean there is none though. + real(wp), dimension(:, :, :, :), intent(out) :: col_mix +#else + real(wp), dimension(2, ncol,nlay,nflav), intent(out) :: col_mix + !! combination of major species's column amounts (first index is strat/trop) +#endif + real(wp), dimension(2,2,2,ncol,nlay,nflav), intent(out) :: fmajor + !! Interpolation weights in pressure, eta, strat/trop + real(wp), dimension(2,2, ncol,nlay,nflav), intent(out) :: fminor + !! Interpolation fraction in eta, strat/trop + ! ----------------- + ! local + real(wp), dimension(ncol,nlay) :: ftemp, fpress ! interpolation fraction for temperature, pressure + real(wp) :: locpress ! needed to find location in pressure grid + real(wp) :: ratio_eta_half ! ratio of vmrs of major species that defines eta=0.5 + ! for given flavor and reference temperature level + real(wp) :: eta, feta ! binary_species_parameter, interpolation variable for eta + real(wp) :: loceta ! needed to find location in eta grid + real(wp) :: ftemp_term + ! ----------------- + ! local indexes + integer :: icol, ilay, iflav, igases(2), itropo, itemp + + do ilay = 1, nlay + do icol = 1, ncol + ! index and factor for temperature interpolation + jtemp(icol,ilay) = int((tlay(icol,ilay) - (temp_ref_min - temp_ref_delta)) / temp_ref_delta) + jtemp(icol,ilay) = min(ntemp - 1, max(1, jtemp(icol,ilay))) ! limit the index range + ftemp(icol,ilay) = (tlay(icol,ilay) - temp_ref(jtemp(icol,ilay))) / temp_ref_delta + + ! index and factor for pressure interpolation + locpress = 1._wp + (log(play(icol,ilay)) - press_ref_log(1)) / press_ref_log_delta + jpress(icol,ilay) = min(npres-1, max(1, int(locpress))) + fpress(icol,ilay) = locpress - float(jpress(icol,ilay)) + + ! determine if in lower or upper part of atmosphere + if (log(play(icol,ilay)) > press_ref_trop_log) then + tropo(icol,ilay)=1 + else + tropo(icol,ilay)=0 + endif + !tropo(icol,ilay) = log(play(icol,ilay)) > press_ref_trop_log + end do + end do + + do iflav = 1, nflav + igases(:) = flavor(:,iflav) + do ilay = 1, nlay + do icol = 1, ncol + ! itropo = 1 lower atmosphere; itropo = 2 upper atmosphere + ! itropo = merge(1,2,tropo(icol,ilay)) + itropo = 1*tropo(icol,ilay) + 2*(1-tropo(icol,ilay)) + ! loop over implemented combinations of major species + do itemp = 1, 2 + ! compute interpolation fractions needed for lower, then upper reference temperature level + ! compute binary species parameter (eta) for flavor and temperature and + ! associated interpolation index and factors + ratio_eta_half = vmr_ref(itropo,igases(1),(jtemp(icol,ilay)+itemp-1)) / & + vmr_ref(itropo,igases(2),(jtemp(icol,ilay)+itemp-1)) + col_mix(itemp,icol,ilay,iflav) = col_gas(icol,ilay,igases(1)) + ratio_eta_half * col_gas(icol,ilay,igases(2)) + eta = merge(col_gas(icol,ilay,igases(1)) / col_mix(itemp,icol,ilay,iflav), 0.5_wp, & + col_mix(itemp,icol,ilay,iflav) > 2._wp * tiny(col_mix)) + loceta = eta * float(neta-1) + jeta(itemp,icol,ilay,iflav) = min(int(loceta)+1, neta-1) + feta = mod(loceta, 1.0_wp) + ! compute interpolation fractions needed for minor species + ! ftemp_term = (1._wp-ftemp(icol,ilay)) for itemp = 1, ftemp(icol,ilay) for itemp=2 + ftemp_term = (real(2-itemp, wp) + real(2*itemp-3, wp) * ftemp(icol,ilay)) + fminor(1,itemp,icol,ilay,iflav) = (1._wp-feta) * ftemp_term + fminor(2,itemp,icol,ilay,iflav) = feta * ftemp_term + ! compute interpolation fractions needed for major species + fmajor(1,1,itemp,icol,ilay,iflav) = (1._wp-fpress(icol,ilay)) * fminor(1,itemp,icol,ilay,iflav) + fmajor(2,1,itemp,icol,ilay,iflav) = (1._wp-fpress(icol,ilay)) * fminor(2,itemp,icol,ilay,iflav) + fmajor(1,2,itemp,icol,ilay,iflav) = fpress(icol,ilay) * fminor(1,itemp,icol,ilay,iflav) + fmajor(2,2,itemp,icol,ilay,iflav) = fpress(icol,ilay) * fminor(2,itemp,icol,ilay,iflav) + end do ! reference temperatures + end do ! icol + end do ! ilay + end do ! iflav + + end subroutine interpolation + ! -------------------------------------------------------------------------------------- + ! + !> Compute minor and major species optical depth using pre-computed interpolation coefficients + !> (jeta,jtemp,jpress) and weights (fmajor, fminor) + ! + subroutine compute_tau_absorption( & + ncol,nlay,nbnd,ngpt, & ! dimensions + ngas,nflav,neta,npres,ntemp, & + nminorlower, nminorklower, & ! number of minor contributors, total num absorption coeffs + nminorupper, nminorkupper, & + idx_h2o, & + gpoint_flavor, & + band_lims_gpt, & + kmajor, & + kminor_lower, & + kminor_upper, & + minor_limits_gpt_lower, & + minor_limits_gpt_upper, & + minor_scales_with_density_lower, & + minor_scales_with_density_upper, & + scale_by_complement_lower, & + scale_by_complement_upper, & + idx_minor_lower, & + idx_minor_upper, & + idx_minor_scaling_lower, & + idx_minor_scaling_upper, & + kminor_start_lower, & + kminor_start_upper, & + tropo, & + col_mix,fmajor,fminor, & + play,tlay,col_gas, & + jeta,jtemp,jpress, & + tau) bind(C, name="rrtmgp_compute_tau_absorption") + ! --------------------- + ! input dimensions + integer, intent(in) :: ncol,nlay,nbnd,ngpt !! array sizes + integer, intent(in) :: ngas,nflav,neta,npres,ntemp !! tables sizes + integer, intent(in) :: nminorlower, nminorklower,nminorupper, nminorkupper + !! table sizes + integer, intent(in) :: idx_h2o !! index of water vapor in col_gas + ! --------------------- + ! inputs from object + integer, dimension(2,ngpt), intent(in) :: gpoint_flavor + !! major gas flavor (pair) by upper/lower, g-point + integer, dimension(2,nbnd), intent(in) :: band_lims_gpt + !! beginning and ending g-point for each band + real(wp), dimension(ntemp,neta,npres+1,ngpt), intent(in) :: kmajor + !! absorption coefficient table - major gases + real(wp), dimension(ntemp,neta,nminorklower), intent(in) :: kminor_lower + !! absorption coefficient table - minor gases, lower atmosphere + real(wp), dimension(ntemp,neta,nminorkupper), intent(in) :: kminor_upper + !! absorption coefficient table - minor gases, upper atmosphere + integer, dimension(2,nminorlower), intent(in) :: minor_limits_gpt_lower + !! beginning and ending g-point for each minor gas + integer, dimension(2,nminorupper), intent(in) :: minor_limits_gpt_upper + integer, dimension( nminorlower), intent(in) :: minor_scales_with_density_lower + !! generic treatment of minor gases - scales with density (e.g. continuum, collision-induced absorption)? + integer, dimension( nminorupper), intent(in) :: minor_scales_with_density_upper + integer, dimension( nminorlower), intent(in) :: scale_by_complement_lower + !! generic treatment of minor gases - scale by density (e.g. self-continuum) or complement? + integer, dimension( nminorupper), intent(in) :: scale_by_complement_upper + integer, dimension( nminorlower), intent(in) :: idx_minor_lower + !! index of each minor gas in col_gas + integer, dimension( nminorupper), intent(in) :: idx_minor_upper + integer, dimension( nminorlower), intent(in) :: idx_minor_scaling_lower + !! for this minor gas, index of the "scaling gas" in col_gas + integer, dimension( nminorupper), intent(in) :: idx_minor_scaling_upper + integer, dimension( nminorlower), intent(in) :: kminor_start_lower + !! starting g-point index in minor gas absorption table + integer, dimension( nminorupper), intent(in) :: kminor_start_upper + integer, dimension(ncol,nlay), intent(in) :: tropo + !! use upper- or lower-atmospheric tables? + ! --------------------- + ! inputs from profile or parent function + real(wp), dimension(2, ncol,nlay,nflav ), intent(in) :: col_mix + !! combination of major species's column amounts - computed in interpolation() + real(wp), dimension(2,2,2,ncol,nlay,nflav ), intent(in) :: fmajor + !! interpolation weights for major gases - computed in interpolation() + real(wp), dimension(2,2, ncol,nlay,nflav ), intent(in) :: fminor + !! interpolation weights for minor gases - computed in interpolation() + real(wp), dimension( ncol,nlay ), intent(in) :: play, tlay + !! input temperature and pressure + real(wp), dimension( ncol,nlay,0:ngas), intent(in) :: col_gas + !! input column gas amount (molecules/cm^2) + integer, dimension(2, ncol,nlay,nflav ), intent(in) :: jeta + !! interpolation indexes in eta - computed in interpolation() + integer, dimension( ncol,nlay ), intent(in) :: jtemp + !! interpolation indexes in temperature - computed in interpolation() + integer, dimension( ncol,nlay ), intent(in) :: jpress + !! interpolation indexes in pressure - computed in interpolation() + ! --------------------- + ! output - optical depth + real(wp), dimension(ncol,nlay,ngpt), intent(inout) :: tau !! aborption optional depth + ! --------------------- + ! Local variables + ! + logical :: top_at_1 + integer, dimension(ncol,2) :: itropo_lower, itropo_upper + ! ---------------------------------------------------------------- + + ! --------------------- + ! Layer limits of upper, lower atmospheres + ! --------------------- + top_at_1 = play(1,1) < play(1, nlay) + if(top_at_1) then + itropo_lower(:, 1) = minloc(play, dim=2, mask=(tropo==1)) + itropo_lower(:, 2) = nlay + itropo_upper(:, 1) = 1 + !itropo_upper(:, 2) = maxloc(play, dim=2, mask=(.not. tropo)) + itropo_upper(:, 2) = maxloc(play, dim=2, mask=(tropo==0)) + else + itropo_lower(:, 1) = 1 + itropo_lower(:, 2) = minloc(play, dim=2, mask=(tropo==1)) + itropo_upper(:, 1) = maxloc(play, dim=2, mask=(tropo==0)) + itropo_upper(:, 2) = nlay + end if + ! --------------------- + ! Major Species + ! --------------------- + call gas_optical_depths_major( & + ncol,nlay,nbnd,ngpt, & ! dimensions + nflav,neta,npres,ntemp, & + gpoint_flavor, & + band_lims_gpt, & + kmajor, & + col_mix,fmajor, & + jeta,tropo,jtemp,jpress, & + tau) + ! --------------------- + ! Minor Species - lower + ! --------------------- + call gas_optical_depths_minor( & + ncol,nlay,ngpt, & ! dimensions + ngas,nflav,ntemp,neta, & + nminorlower,nminorklower, & + idx_h2o, & + gpoint_flavor(1,:), & + kminor_lower, & + minor_limits_gpt_lower, & + minor_scales_with_density_lower, & + scale_by_complement_lower, & + idx_minor_lower, & + idx_minor_scaling_lower, & + kminor_start_lower, & + play, tlay, & + col_gas,fminor,jeta, & + itropo_lower,jtemp, & + tau) + ! --------------------- + ! Minor Species - upper + ! --------------------- + call gas_optical_depths_minor( & + ncol,nlay,ngpt, & ! dimensions + ngas,nflav,ntemp,neta, & + nminorupper,nminorkupper, & + idx_h2o, & + gpoint_flavor(2,:), & + kminor_upper, & + minor_limits_gpt_upper, & + minor_scales_with_density_upper, & + scale_by_complement_upper, & + idx_minor_upper, & + idx_minor_scaling_upper, & + kminor_start_upper, & + play, tlay, & + col_gas,fminor,jeta, & + itropo_upper,jtemp, & + tau) + end subroutine compute_tau_absorption + ! -------------------------------------------------------------------------------------- + + ! -------------------------------------------------------------------------------------- + ! + ! compute minor species optical depths + ! + subroutine gas_optical_depths_major(ncol,nlay,nbnd,ngpt,& + nflav,neta,npres,ntemp, & ! dimensions + gpoint_flavor, band_lims_gpt, & ! inputs from object + kmajor, & + col_mix,fmajor, & + jeta,tropo,jtemp,jpress, & ! local input + tau) + ! input dimensions + integer, intent(in) :: ncol, nlay, nbnd, ngpt, nflav,neta,npres,ntemp ! dimensions + + ! inputs from object + integer, dimension(2,ngpt), intent(in) :: gpoint_flavor + integer, dimension(2,nbnd), intent(in) :: band_lims_gpt ! start and end g-point for each band + real(wp), dimension(ntemp,neta,npres+1,ngpt), intent(in) :: kmajor + + ! inputs from profile or parent function + real(wp), dimension(2, ncol,nlay,nflav), intent(in) :: col_mix + real(wp), dimension(2,2,2,ncol,nlay,nflav), intent(in) :: fmajor + integer, dimension(2, ncol,nlay,nflav), intent(in) :: jeta + integer, dimension(ncol,nlay), intent(in) :: tropo + integer, dimension(ncol,nlay), intent(in) :: jtemp, jpress + + ! outputs + real(wp), dimension(ncol,nlay,ngpt), intent(inout) :: tau + ! ----------------- + ! local variables + real(wp) :: tau_major(ngpt) ! major species optical depth + ! local index + integer :: icol, ilay, iflav, ibnd, itropo + integer :: gptS, gptE + + ! optical depth calculation for major species + do ibnd = 1, nbnd + gptS = band_lims_gpt(1, ibnd) + gptE = band_lims_gpt(2, ibnd) + do ilay = 1, nlay + do icol = 1, ncol + ! itropo = 1 lower atmosphere; itropo = 2 upper atmosphere + itropo = 1*tropo(icol,ilay) + 2*(1-tropo(icol,ilay)) + !itropo = merge(1,2,tropo(icol,ilay)) + iflav = gpoint_flavor(itropo, gptS) !eta interpolation depends on band's flavor + tau_major(gptS:gptE) = & + ! interpolation in temperature, pressure, and eta + interpolate3D_byflav(col_mix(:,icol,ilay,iflav), & + fmajor(:,:,:,icol,ilay,iflav), kmajor, & + band_lims_gpt(1, ibnd), band_lims_gpt(2, ibnd), & + jeta(:,icol,ilay,iflav), jtemp(icol,ilay),jpress(icol,ilay)+itropo) + tau(icol,ilay,gptS:gptE) = tau(icol,ilay,gptS:gptE) + tau_major(gptS:gptE) + end do + end do + end do + + end subroutine gas_optical_depths_major + + ! ---------------------------------------------------------- + ! + ! compute minor species optical depths + ! + subroutine gas_optical_depths_minor(ncol,nlay,ngpt, & + ngas,nflav,ntemp,neta, & + nminor,nminork, & + idx_h2o, & + gpt_flv, & + kminor, & + minor_limits_gpt, & + minor_scales_with_density, & + scale_by_complement, & + idx_minor, idx_minor_scaling, & + kminor_start, & + play, tlay, & + col_gas,fminor,jeta, & + layer_limits,jtemp, & + tau) + integer, intent(in ) :: ncol,nlay,ngpt + integer, intent(in ) :: ngas,nflav + integer, intent(in ) :: ntemp,neta,nminor,nminork + integer, intent(in ) :: idx_h2o + integer, dimension(ngpt), intent(in ) :: gpt_flv + real(wp), dimension(ntemp,neta,nminork), intent(in ) :: kminor + integer, dimension(2,nminor), intent(in ) :: minor_limits_gpt + integer, dimension( nminor), intent(in ) :: minor_scales_with_density + integer, dimension( nminor), intent(in ) :: scale_by_complement + integer, dimension( nminor), intent(in ) :: kminor_start + integer, dimension( nminor), intent(in ) :: idx_minor, idx_minor_scaling + real(wp), dimension(ncol,nlay), intent(in ) :: play, tlay + real(wp), dimension(ncol,nlay,0:ngas), intent(in ) :: col_gas + real(wp), dimension(2,2,ncol,nlay,nflav), intent(in ) :: fminor + integer, dimension(2, ncol,nlay,nflav), intent(in ) :: jeta + integer, dimension(ncol, 2), intent(in ) :: layer_limits + integer, dimension(ncol,nlay), intent(in ) :: jtemp + real(wp), dimension(ncol,nlay,ngpt), intent(inout) :: tau + ! ----------------- + ! local variables + real(wp), parameter :: PaTohPa = 0.01_wp + real(wp) :: vmr_fact, dry_fact ! conversion from column abundance to dry vol. mixing ratio; + real(wp) :: scaling ! optical depth + integer :: icol, ilay, iflav, imnr + integer :: gptS, gptE + real(wp), dimension(ngpt) :: tau_minor + ! ----------------- + ! + ! Guard against layer limits being 0 -- that means don't do anything i.e. there are no + ! layers with pressures in the upper or lower atmosphere respectively + ! First check skips the routine entirely if all columns are out of bounds... + ! + + if(any(layer_limits(:,1) > 0)) then + do imnr = 1, size(scale_by_complement,dim=1) ! loop over minor absorbers in each band + do icol = 1, ncol + ! + ! This check skips individual columns with no pressures in range + ! + if(layer_limits(icol,1) > 0) then + do ilay = layer_limits(icol,1), layer_limits(icol,2) + ! + ! Scaling of minor gas absortion coefficient begins with column amount of minor gas + ! + scaling = col_gas(icol,ilay,idx_minor(imnr)) + ! + ! Density scaling (e.g. for h2o continuum, collision-induced absorption) + ! + if (minor_scales_with_density(imnr)==1) then + ! + ! NOTE: P needed in hPa to properly handle density scaling. + ! + scaling = scaling * (PaTohPa*play(icol,ilay)/tlay(icol,ilay)) + if(idx_minor_scaling(imnr) > 0) then ! there is a second gas that affects this gas's absorption + vmr_fact = 1._wp / col_gas(icol,ilay,0) + dry_fact = 1._wp / (1._wp + col_gas(icol,ilay,idx_h2o) * vmr_fact) + ! scale by density of special gas + if (scale_by_complement(imnr)==1) then ! scale by densities of all gases but the special one + scaling = scaling * (1._wp - col_gas(icol,ilay,idx_minor_scaling(imnr)) * vmr_fact * dry_fact) + else + scaling = scaling * (col_gas(icol,ilay,idx_minor_scaling(imnr)) * vmr_fact * dry_fact) + endif + endif + endif + ! + ! Interpolation of absorption coefficient and calculation of optical depth + ! + ! Which gpoint range does this minor gas affect? + gptS = minor_limits_gpt(1,imnr) + gptE = minor_limits_gpt(2,imnr) + iflav = gpt_flv(gptS) + tau_minor(gptS:gptE) = scaling * & + interpolate2D_byflav(fminor(:,:,icol,ilay,iflav), & + kminor, & + kminor_start(imnr), kminor_start(imnr)+(gptE-gptS), & + jeta(:,icol,ilay,iflav), jtemp(icol,ilay)) + tau(icol,ilay,gptS:gptE) = tau(icol,ilay,gptS:gptE) + tau_minor(gptS:gptE) + enddo + end if + enddo + enddo + end if + + end subroutine gas_optical_depths_minor + ! ---------------------------------------------------------- + ! + ! compute Rayleigh scattering optical depths + ! + subroutine compute_tau_rayleigh(ncol,nlay,nbnd,ngpt, & + ngas,nflav,neta,npres,ntemp, & + gpoint_flavor,band_lims_gpt, & + krayl, & + idx_h2o, col_dry,col_gas, & + fminor,jeta,tropo,jtemp, & + tau_rayleigh) bind(C, name="rrtmgp_compute_tau_rayleigh") + integer, intent(in ) :: ncol,nlay,nbnd,ngpt + !! input dimensions + integer, intent(in ) :: ngas,nflav,neta,npres,ntemp + !! table dimensions + integer, dimension(2,ngpt), intent(in ) :: gpoint_flavor + !! major gas flavor (pair) by upper/lower, g-point + integer, dimension(2,nbnd), intent(in ) :: band_lims_gpt + !! start and end g-point for each band + real(wp), dimension(ntemp,neta,ngpt,2), intent(in ) :: krayl + !! Rayleigh scattering coefficients + integer, intent(in ) :: idx_h2o + !! index of water vapor in col_gas + real(wp), dimension(ncol,nlay), intent(in ) :: col_dry + !! column amount of dry air + real(wp), dimension(ncol,nlay,0:ngas), intent(in ) :: col_gas + !! input column gas amount (molecules/cm^2) + real(wp), dimension(2,2,ncol,nlay,nflav), intent(in ) :: fminor + !! interpolation weights for major gases - computed in interpolation() + integer, dimension(2, ncol,nlay,nflav), intent(in ) :: jeta + !! interpolation indexes in eta - computed in interpolation() + integer, dimension(ncol,nlay), intent(in ) :: tropo + !! use upper- or lower-atmospheric tables? + integer, dimension(ncol,nlay), intent(in ) :: jtemp + !! interpolation indexes in temperature - computed in interpolation() + ! outputs + real(wp), dimension(ncol,nlay,ngpt), intent(out) :: tau_rayleigh + !! Rayleigh optical depth + ! ----------------- + ! local variables + real(wp) :: k(ngpt) ! rayleigh scattering coefficient + integer :: icol, ilay, iflav, ibnd, gptS, gptE + integer :: itropo + ! ----------------- + + do ibnd = 1, nbnd + gptS = band_lims_gpt(1, ibnd) + gptE = band_lims_gpt(2, ibnd) + do ilay = 1, nlay + do icol = 1, ncol + itropo = 1*tropo(icol,ilay) + 2*(1-tropo(icol,ilay)) + !itropo = merge(1,2,tropo(icol,ilay)) ! itropo = 1 lower atmosphere;itropo = 2 upper atmosphere + iflav = gpoint_flavor(itropo, gptS) !eta interpolation depends on band's flavor + k(gptS:gptE) = interpolate2D_byflav(fminor(:,:,icol,ilay,iflav), & + krayl(:,:,:,itropo), & + gptS, gptE, jeta(:,icol,ilay,iflav), jtemp(icol,ilay)) + tau_rayleigh(icol,ilay,gptS:gptE) = k(gptS:gptE) * & + (col_gas(icol,ilay,idx_h2o)+col_dry(icol,ilay)) + end do + end do + end do + + end subroutine compute_tau_rayleigh + + ! ---------------------------------------------------------- + subroutine compute_Planck_source( & + ncol, nlay, nbnd, ngpt, & + nflav, neta, npres, ntemp, nPlanckTemp,& + tlay, tlev, tsfc, sfc_lay, & + fmajor, jeta, tropo, jtemp, jpress, & + gpoint_bands, band_lims_gpt, & + pfracin, temp_ref_min, totplnk_delta, totplnk, gpoint_flavor, & + sfc_src, lay_src, lev_src_inc, lev_src_dec, sfc_source_Jac) bind(C, name="rrtmgp_compute_Planck_source") + integer, intent(in) :: ncol, nlay, nbnd, ngpt + !! input dimensions + integer, intent(in) :: nflav, neta, npres, ntemp, nPlanckTemp + !! table dimensions + real(wp), dimension(ncol,nlay ), intent(in) :: tlay !! temperature at layer centers (K) + real(wp), dimension(ncol,nlay+1), intent(in) :: tlev !! temperature at interfaces (K) + real(wp), dimension(ncol ), intent(in) :: tsfc !! surface temperture + integer, intent(in) :: sfc_lay !! index into surface layer + ! Interpolation variables + real(wp), dimension(2,2,2,ncol,nlay,nflav), intent(in) :: fmajor + !! interpolation weights for major gases - computed in interpolation() + integer, dimension(2, ncol,nlay,nflav), intent(in) :: jeta + !! interpolation indexes in eta - computed in interpolation() + integer, dimension( ncol,nlay), intent(in) :: tropo + !! use upper- or lower-atmospheric tables? + integer, dimension( ncol,nlay), intent(in) :: jtemp, jpress + !! interpolation indexes in temperature and pressure - computed in interpolation() + ! Table-specific + integer, dimension(ngpt), intent(in) :: gpoint_bands !! band to which each g-point belongs + integer, dimension(2, nbnd), intent(in) :: band_lims_gpt !! start and end g-point for each band + real(wp), intent(in) :: temp_ref_min, totplnk_delta !! interpolation constants + real(wp), dimension(ntemp,neta,npres+1,ngpt), intent(in) :: pfracin !! Fraction of the Planck function in each g-point + real(wp), dimension(nPlanckTemp,nbnd), intent(in) :: totplnk !! Total Planck function by band at each temperature + integer, dimension(2,ngpt), intent(in) :: gpoint_flavor !! major gas flavor (pair) by upper/lower, g-point + + real(wp), dimension(ncol, ngpt), intent(out) :: sfc_src !! Planck emssion from the surface + real(wp), dimension(ncol,nlay,ngpt), intent(out) :: lay_src !! Planck emssion from layer centers + real(wp), dimension(ncol,nlay,ngpt), intent(out) :: lev_src_inc, lev_src_dec + !! Planck emission at layer boundaries, using spectral mapping in the direction of propagation + real(wp), dimension(ncol, ngpt), intent(out) :: sfc_source_Jac + !! Jacobian (derivative) of the surface Planck source with respect to surface temperature + ! ----------------- + ! local + real(wp), parameter :: delta_Tsurf = 1.0_wp + + integer :: ilay, icol, igpt, ibnd, itropo, iflav + integer :: gptS, gptE + real(wp), dimension(2), parameter :: one = [1._wp, 1._wp] + real(wp) :: pfrac (ncol,nlay ,ngpt) + real(wp) :: planck_function(ncol,nlay+1,nbnd) + ! ----------------- + + ! Calculation of fraction of band's Planck irradiance associated with each g-point + do ibnd = 1, nbnd + gptS = band_lims_gpt(1, ibnd) + gptE = band_lims_gpt(2, ibnd) + do ilay = 1, nlay + do icol = 1, ncol + ! itropo = 1 lower atmosphere; itropo = 2 upper atmosphere + itropo = 1*tropo(icol,ilay) + 2*(1-tropo(icol,ilay)) + !itropo = merge(1,2,tropo(icol,ilay)) + iflav = gpoint_flavor(itropo, gptS) !eta interpolation depends on band's flavor + pfrac(icol,ilay,gptS:gptE) = & + ! interpolation in temperature, pressure, and eta + interpolate3D_byflav(one, fmajor(:,:,:,icol,ilay,iflav), pfracin, & + band_lims_gpt(1, ibnd), band_lims_gpt(2, ibnd), & + jeta(:,icol,ilay,iflav), jtemp(icol,ilay),jpress(icol,ilay)+itropo) + end do ! column + end do ! layer + end do ! band + + ! + ! Planck function by band for the surface + ! Compute surface source irradiance for g-point, equals band irradiance x fraction for g-point + ! + do icol = 1, ncol + planck_function(icol,1,1:nbnd) = interpolate1D(tsfc(icol), temp_ref_min, totplnk_delta, totplnk) + planck_function(icol,2,1:nbnd) = interpolate1D(tsfc(icol) + delta_Tsurf, temp_ref_min, totplnk_delta, totplnk) + ! + ! Map to g-points + ! + do ibnd = 1, nbnd + gptS = band_lims_gpt(1, ibnd) + gptE = band_lims_gpt(2, ibnd) + do igpt = gptS, gptE + sfc_src(icol,igpt) = pfrac(icol,sfc_lay,igpt) * planck_function(icol,1,ibnd) + sfc_source_Jac(icol, igpt) = pfrac(icol,sfc_lay,igpt) * & + (planck_function(icol, 2, ibnd) - planck_function(icol,1,ibnd)) + end do + end do + end do !icol + + do ilay = 1, nlay + do icol = 1, ncol + ! Compute layer source irradiance for g-point, equals band irradiance x fraction for g-point + planck_function(icol,ilay,1:nbnd) = interpolate1D(tlay(icol,ilay), temp_ref_min, totplnk_delta, totplnk) + end do + end do + + ! + ! Map to g-points + ! + do ibnd = 1, nbnd + gptS = band_lims_gpt(1, ibnd) + gptE = band_lims_gpt(2, ibnd) + do igpt = gptS, gptE + do ilay = 1, nlay + do icol = 1, ncol + lay_src(icol,ilay,igpt) = pfrac(icol,ilay,igpt) * planck_function(icol,ilay,ibnd) + end do + end do + end do + end do + + ! compute level source irradiances for each g-point, one each for upward and downward paths + do ilay = 1, nlay + do icol = 1, ncol + planck_function(icol, 1,1:nbnd) = interpolate1D(tlev(icol, 1),temp_ref_min, totplnk_delta, totplnk) + planck_function(icol,ilay+1,1:nbnd) = interpolate1D(tlev(icol,ilay+1),temp_ref_min, totplnk_delta, totplnk) + end do + end do + + ! + ! Map to g-points + ! + do ibnd = 1, nbnd + gptS = band_lims_gpt(1, ibnd) + gptE = band_lims_gpt(2, ibnd) + do igpt = gptS, gptE + do ilay = 1, nlay + do icol = 1, ncol + lev_src_inc(icol,ilay,igpt) = pfrac(icol,ilay,igpt) *planck_function(icol,ilay+1,ibnd) + lev_src_dec(icol,ilay,igpt) = pfrac(icol,ilay,igpt) *planck_function(icol,ilay ,ibnd) + end do + end do + end do + end do + + end subroutine compute_Planck_source + ! ---------------------------------------------------------- + ! + ! One dimensional interpolation -- return all values along second table dimension + ! + pure function interpolate1D(val, offset, delta, table) result(res) + ! input + real(wp), intent(in) :: val, & ! axis value at which to evaluate table + offset, & ! minimum of table axis + delta ! step size of table axis + real(wp), dimension(:,:), & + intent(in) :: table ! dimensions (axis, values) + ! output + real(wp), dimension(size(table,dim=2)) :: res + + ! local + real(wp) :: val0 ! fraction index adjusted by offset and delta + integer :: index ! index term + real(wp) :: frac ! fractional term + ! ------------------------------------- + val0 = (val - offset) / delta + frac = val0 - int(val0) ! get fractional part + index = min(size(table,dim=1)-1, max(1, int(val0)+1)) ! limit the index range + res(:) = table(index,:) + frac * (table(index+1,:) - table(index,:)) + end function interpolate1D + ! ---------------------------------------------------------- + ! This function returns a range of values from a subset (in gpoint) of the k table + ! + pure function interpolate2D_byflav(fminor, k, gptS, gptE, jeta, jtemp) result(res) + real(wp), dimension(2,2), intent(in) :: fminor ! interpolation fractions for minor species + ! index(1) : reference eta level (temperature dependent) + ! index(2) : reference temperature level + real(wp), dimension(:,:,:), intent(in) :: k ! (g-point, eta, temp) + integer, intent(in) :: gptS, gptE, jtemp ! interpolation index for temperature + integer, dimension(2), intent(in) :: jeta ! interpolation index for binary species parameter (eta) + real(wp), dimension(gptE-gptS+1) :: res ! the result + + ! Local variable + integer :: igpt + ! each code block is for a different reference temperature + + do igpt = 1, gptE-gptS+1 + res(igpt) = fminor(1,1) * k(jtemp , jeta(1) , gptS+igpt-1) + & + fminor(2,1) * k(jtemp , jeta(1)+1, gptS+igpt-1) + & + fminor(1,2) * k(jtemp+1, jeta(2) , gptS+igpt-1) + & + fminor(2,2) * k(jtemp+1, jeta(2)+1, gptS+igpt-1) + end do + + end function interpolate2D_byflav + ! ---------------------------------------------------------- + pure function interpolate3D_byflav(scaling, fmajor, k, gptS, gptE, jeta, jtemp, jpress) result(res) + real(wp), dimension(2), intent(in) :: scaling + real(wp), dimension(2,2,2), intent(in) :: fmajor ! interpolation fractions for major species + ! index(1) : reference eta level (temperature dependent) + ! index(2) : reference pressure level + ! index(3) : reference temperature level + real(wp), dimension(:,:,:,:),intent(in) :: k ! (temp,eta,press,gpt) + integer, intent(in) :: gptS, gptE + integer, dimension(2), intent(in) :: jeta ! interpolation index for binary species parameter (eta) + integer, intent(in) :: jtemp ! interpolation index for temperature + integer, intent(in) :: jpress ! interpolation index for pressure + real(wp), dimension(gptS:gptE) :: res ! the result + + ! Local variable + integer :: igpt + ! each code block is for a different reference temperature + + do igpt = gptS, gptE + res(igpt) = & + scaling(1) * & + ( fmajor(1,1,1) * k(jtemp, jeta(1) , jpress-1, igpt) + & + fmajor(2,1,1) * k(jtemp, jeta(1)+1, jpress-1, igpt) + & + fmajor(1,2,1) * k(jtemp, jeta(1) , jpress , igpt) + & + fmajor(2,2,1) * k(jtemp, jeta(1)+1, jpress , igpt) ) + & + scaling(2) * & + ( fmajor(1,1,2) * k(jtemp+1, jeta(2) , jpress-1, igpt) + & + fmajor(2,1,2) * k(jtemp+1, jeta(2)+1, jpress-1, igpt) + & + fmajor(1,2,2) * k(jtemp+1, jeta(2) , jpress , igpt) + & + fmajor(2,2,2) * k(jtemp+1, jeta(2)+1, jpress , igpt) ) + end do + end function interpolate3D_byflav + +end module mo_gas_optics_kernels diff --git a/src/radiate/rte-rrtmgp/rrtmgp/mo_gas_concentrations.F90 b/src/radiate/rte-rrtmgp/rrtmgp/mo_gas_concentrations.F90 new file mode 100644 index 0000000..1ae863e --- /dev/null +++ b/src/radiate/rte-rrtmgp/rrtmgp/mo_gas_concentrations.F90 @@ -0,0 +1,595 @@ +! This code is part of RRTM for GCM Applications - Parallel (RRTMGP) +! +! Contacts: Robert Pincus and Eli Mlawer +! email: rrtmgp@aer.com +! +! Copyright 2015-, Atmospheric and Environmental Research, +! Regents of the University of Colorado, Trustees of Columbia University. All right reserved. +! +! Use and duplication is permitted under the terms of the +! BSD 3-clause license, see http://opensource.org/licenses/BSD-3-Clause +! ------------------------------------------------------------------------------------------------- +!> ## Fortran class for representing gas concentrations +!> +!> Encapsulates a collection of volume (molar) mixing ratios (concentrations) of gases. +!> Each concentration is associated with a name, normally the chemical formula. +! +!> Values may be provided as scalars, 1-dimensional profiles (nlay), or 2-D fields (ncol,nlay). +!> `nlay` and `ncol` are determined from the input arrays; self-consistency is enforced. +!> No bounds are enforced on the sum of the mixing ratios. +!> +!> For example: +!> ``` +!> error_msg = gas_concs%set_vmr('h2o', values(:,:)) +!> error_msg = gas_concs%set_vmr('o3' , values(:) ) +!> error_msg = gas_concs%set_vmr('co2', value ) +!> ``` +! +!> Values can be requested as profiles (valid only if there are no 2D fields present in the object) +!> or as 2D fields. Values for all columns are returned although the entire collection +!> can be subsetted in the column dimension +!> +!> Subsets can be extracted in the column dimension. +!> +!> Functions return strings. Non-empty strings indicate an error. +!> +! ------------------------------------------------------------------------------------------------- + +module mo_gas_concentrations + use mo_rte_kind, only: wp + use mo_rte_config, only: check_values + use mo_rrtmgp_util_string, only: lower_case + use mo_rte_util_array, only: any_vals_outside + implicit none + integer, parameter, private :: GAS_NOT_IN_LIST = -1 + private + + type, private :: conc_field + real(wp), dimension(:,:), pointer :: conc => NULL() + end type conc_field + + type, public :: ty_gas_concs + ! + ! Data + ! + character(len=32), dimension(:), allocatable, public :: gas_names ! Should make this private + type(conc_field), dimension(:), allocatable, private :: concs + integer, private :: ncol = 0, nlay = 0 + contains + ! + ! Procedures + ! + procedure, private :: find_gas + procedure, private :: set_vmr_scalar + procedure, private :: set_vmr_1d + procedure, private :: set_vmr_2d + procedure, private :: get_vmr_1d + procedure, private :: get_vmr_2d + procedure, private :: get_subset_range + final :: del + ! + ! public interface + ! + procedure, public :: init + procedure, public :: reset + generic, public :: set_vmr => set_vmr_scalar, & + set_vmr_1d, & + set_vmr_2d !! ### Set concentration values + generic, public :: get_vmr => get_vmr_1d, & + get_vmr_2d !! ### Get concentration values + generic, public :: get_subset => get_subset_range + !! ### Extract a subset of columns + procedure, public :: get_num_gases + procedure, public :: get_gas_names + end type ty_gas_concs +contains + ! ------------------------------------------------------------------------------------- + !> ### Initialize the object + function init(this, gas_names) result(error_msg) + class(ty_gas_concs), intent(inout) :: this + character(len=*), dimension(:), intent(in ) :: gas_names !! names of all gases which might be provided + character(len=128) :: error_msg !! error string, empty when successful + ! --------- + integer :: i, j, ngas + ! --------- + error_msg = '' + ngas = size(gas_names) + ! + ! Check for no duplicate gas names, no empty names + ! + if(any(len_trim(gas_names) == 0)) & + error_msg = "ty_gas_concs%init(): must provide non-empty gas names" + + do i = 1, ngas-1 + do j = i+1, ngas + if (lower_case(trim(gas_names(i))) == lower_case(trim(gas_names(j)))) then + error_msg = "ty_gas_concs%init(): duplicate gas names aren't allowed" + exit + end if + end do + end do + if(error_msg /= "") return + ! + ! Allocate fixed-size arrays + ! + call this%reset() + allocate(this%gas_names(ngas), this%concs(ngas)) + !$acc enter data copyin(this) + !$acc enter data copyin(this%concs) + !$omp target enter data map(to:this%concs) + + this%gas_names(:) = gas_names(:) + end function + ! ------------------------------------------------------------------------------------- + ! + ! Set concentrations --- scalar, 1D, 2D + ! + ! ------------------------------------------------------------------------------------- + !> ### Set scalar concentrations + function set_vmr_scalar(this, gas, w) result(error_msg) + ! In OpenACC context scalar w always assumed to be on the CPU + class(ty_gas_concs), intent(inout) :: this + character(len=*), intent(in ) :: gas !! Name of the gas being provided + real(wp), intent(in ) :: w !! volume (molar) mixing ratio + character(len=128) :: error_msg !! error string, empty when successful + ! --------- + real(wp), dimension(:,:), pointer :: p + integer :: igas + ! --------- + error_msg = '' + if (w < 0._wp .or. w > 1._wp) then + error_msg = 'ty_gas_concs%set_vmr(): concentrations should be >= 0, <= 1' + return + endif + + igas = this%find_gas(gas) + if (igas == GAS_NOT_IN_LIST) then + error_msg = 'ty_gas_concs%set_vmr(): trying to set ' // trim(gas) // ' but name not provided at initialization' + return + end if + ! + ! Deallocate anything existing -- could be more efficient to test if it's already the correct size + ! + ! This cannot be made a function, because we need all the hierarchy for the correct OpenACC attach + if (associated(this%concs(igas)%conc)) then + if ( any(shape(this%concs(igas)%conc) /= [1, 1]) ) then + !$acc exit data delete(this%concs(igas)%conc) + !$omp target exit data map(release:this%concs(igas)%conc) + deallocate(this%concs(igas)%conc) + nullify (this%concs(igas)%conc) + end if + end if + if (.not. associated(this%concs(igas)%conc)) then + allocate(this%concs(igas)%conc(1,1)) + !$acc enter data create(this%concs(igas)%conc) + !$omp target enter data map(alloc:this%concs(igas)%conc) + end if + + p => this%concs(igas)%conc(:,:) + !$acc kernels + !$omp target map(to:w) +#ifdef _CRAYFTN + p(:,:) = w +#else + this%concs(igas)%conc(:,:) = w +#endif + !$acc end kernels + !$omp end target + end function set_vmr_scalar + ! ------------------------------------------------------------------------------------- + !> ### Set 1d (function of level) concentrations + function set_vmr_1d(this, gas, w) result(error_msg) + ! In OpenACC context w assumed to be either on the CPU or on the GPU + class(ty_gas_concs), intent(inout) :: this + character(len=*), intent(in ) :: gas !! Name of the gas being provided + real(wp), dimension(:), & + intent(in ) :: w !! volume (molar) mixing ratio + character(len=128) :: error_msg !! error string, empty when successful + ! --------- + real(wp), dimension(:,:), pointer :: p + integer :: igas + ! --------- + error_msg = '' + + if (check_values) then + if (any_vals_outside(w, 0._wp, 1._wp)) & + error_msg = 'ty_gas_concs%set_vmr: concentrations should be >= 0, <= 1' + end if + if(this%nlay > 0) then + if(size(w) /= this%nlay) error_msg = 'ty_gas_concs%set_vmr: different dimension (nlay)' + else + this%nlay = size(w) + end if + if(error_msg /= "") return + + igas = this%find_gas(gas) + if (igas == GAS_NOT_IN_LIST) then + error_msg = 'ty_gas_concs%set_vmr(): trying to set ' // trim(gas) // ' but name not provided at initialization' + return + end if + ! + ! Deallocate anything existing -- could be more efficient to test if it's already the correct size + ! + ! This cannot be made a function, because we need all the hierarchy for the correct OpenACC attach + if (associated(this%concs(igas)%conc)) then + if ( any(shape(this%concs(igas)%conc) /= [1, this%nlay]) ) then + !$acc exit data delete(this%concs(igas)%conc) + !$omp target exit data map(release:this%concs(igas)%conc) + deallocate(this%concs(igas)%conc) + nullify (this%concs(igas)%conc) + end if + end if + if (.not. associated(this%concs(igas)%conc)) then + allocate(this%concs(igas)%conc(1,this%nlay)) + !$acc enter data create(this%concs(igas)%conc) + !$omp target enter data map(alloc:this%concs(igas)%conc) + end if + + p => this%concs(igas)%conc(:,:) + !$acc kernels copyin(w) + !$omp target map(to:w) +#ifdef _CRAYFTN + p(1,:) = w +#else + this%concs(igas)%conc(1,:) = w +#endif + !$acc end kernels + !$omp end target + + !$acc exit data delete(w) + end function set_vmr_1d + ! ------------------------------------------------------------------------------------- + !> ### Set 2d concentrations + function set_vmr_2d(this, gas, w) result(error_msg) + ! In OpenACC context w assumed to be either on the CPU or on the GPU + class(ty_gas_concs), intent(inout) :: this + character(len=*), intent(in ) :: gas !! Name of the gas being provided + real(wp), dimension(:,:), & + intent(in ) :: w !! volume (molar) mixing ratio + character(len=128) :: error_msg + !! error string, empty when successful + ! --------- + real(wp), dimension(:,:), pointer :: p + integer :: igas + ! --------- + error_msg = '' + + if (check_values) then + if (any_vals_outside(w, 0._wp, 1._wp)) & + error_msg = 'ty_gas_concs%set_vmr: concentrations should be >= 0, <= 1' + end if + + if(this%ncol > 0 .and. size(w, 1) /= this%ncol) then + error_msg = 'ty_gas_concs%set_vmr: different dimension (ncol)' + else + this%ncol = size(w, 1) + end if + + if(this%nlay > 0 .and. size(w, 2) /= this%nlay) then + error_msg = 'ty_gas_concs%set_vmr: different dimension (nlay)' + else + this%nlay = size(w, 2) + end if + if(error_msg /= "") return + + igas = this%find_gas(gas) + if (igas == GAS_NOT_IN_LIST) then + error_msg = 'ty_gas_concs%set_vmr(): trying to set ' // trim(gas) // ' but name not provided at initialization' + return + end if + ! + ! Deallocate anything existing -- could be more efficient to test if it's already the correct size + ! + ! This cannot be made a function, because we need all the hierarchy for the correct OpenACC attach + if (associated(this%concs(igas)%conc)) then + if ( any(shape(this%concs(igas)%conc) /= [this%ncol,this%nlay]) ) then + !$acc exit data delete(this%concs(igas)%conc) + !$omp target exit data map(release:this%concs(igas)%conc) + deallocate(this%concs(igas)%conc) + nullify (this%concs(igas)%conc) + end if + end if + if (.not. associated(this%concs(igas)%conc)) then + allocate(this%concs(igas)%conc(this%ncol,this%nlay)) + !$acc enter data create(this%concs(igas)%conc) + !$omp target enter data map(alloc:this%concs(igas)%conc) + end if + + p => this%concs(igas)%conc(:,:) + !$acc kernels copyin(w) + !$omp target map(to:w) +#ifdef _CRAYFTN + p(:,:) = w(:,:) +#else + this%concs(igas)%conc(:,:) = w(:,:) +#endif + !$acc end kernels + !$omp end target + end function set_vmr_2d + ! ------------------------------------------------------------------------------------- + ! + ! Return volume mixing ratio as 1D or 2D array + ! + ! ------------------------------------------------------------------------------------- + ! + !> ### Return volume mixing ratios as 1D array (lay depdendence only) + ! + function get_vmr_1d(this, gas, array) result(error_msg) + class(ty_gas_concs) :: this + character(len=*), intent(in ) :: gas !! Name of the gas + real(wp), dimension(:), intent(out) :: array !! Volume mixing ratio + character(len=128) :: error_msg !! Error string, empty if successful + ! --------------------- + real(wp), dimension(:,:), pointer :: p + integer :: igas + ! --------------------- + error_msg = '' + + igas = this%find_gas(gas) + if (igas == GAS_NOT_IN_LIST) then + error_msg = 'ty_gas_concs%get_vmr; gas ' // trim(gas) // ' not found' + else if(.not. associated(this%concs(igas)%conc)) then + error_msg = 'ty_gas_concs%get_vmr; gas ' // trim(gas) // " concentration hasn't been set" + else if(size(this%concs(igas)%conc, 1) > 1) then ! Are we requesting a single profile when many are present? + error_msg = 'ty_gas_concs%get_vmr; gas ' // trim(gas) // ' requesting single profile but many are available' + end if + + if(this%nlay > 0 .and. this%nlay /= size(array)) then + error_msg = 'ty_gas_concs%get_vmr; gas ' // trim(gas) // ' array is wrong size (nlay)' + end if + if(error_msg /= "") return + + p => this%concs(igas)%conc(:,:) + !$acc data copyout (array) present(this) + !$omp target data map(from:array) + if(size(this%concs(igas)%conc, 2) > 1) then + !$acc kernels default(none) present(p) + !$omp target +#ifdef _CRAYFTN + array(:) = p(1,:) +#else + array(:) = this%concs(igas)%conc(1,:) +#endif + !$acc end kernels + !$omp end target + else + !$acc kernels default(none) present(p) + !$omp target +#ifdef _CRAYFTN + array(:) = p(1,1) +#else + array(:) = this%concs(igas)%conc(1,1) +#endif + !$acc end kernels + !$omp end target + end if + !$acc end data + !$omp end target data + + end function get_vmr_1d + ! ------------------------------------------------------------------------------------- + ! + ! 2D array (col, lay) + ! + function get_vmr_2d(this, gas, array) result(error_msg) + class(ty_gas_concs) :: this + character(len=*), intent(in ) :: gas !! Name of the gas + real(wp), dimension(:,:), intent(out) :: array !! Volume mixing ratio + character(len=128) :: error_msg !! Error string, empty if successful + ! --------------------- + real(wp), dimension(:,:), pointer :: p + integer :: icol, ilay, igas + ! --------------------- + error_msg = '' + + igas = this%find_gas(gas) + if (igas == GAS_NOT_IN_LIST) then + error_msg = 'ty_gas_concs%get_vmr; gas ' // trim(gas) // ' not found' + else if(.not. associated(this%concs(igas)%conc)) then + error_msg = 'ty_gas_concs%get_vmr; gas ' // trim(gas) // " concentration hasn't been set" + end if + ! + ! Is the requested array the correct size? + ! + if(this%ncol > 0 .and. this%ncol /= size(array,1)) then + error_msg = 'ty_gas_concs%get_vmr; gas ' // trim(gas) // ' array is wrong size (ncol)' + end if + if(this%nlay > 0 .and. this%nlay /= size(array,2)) then + error_msg = 'ty_gas_concs%get_vmr; gas ' // trim(gas) // ' array is wrong size (nlay)' + end if + if(error_msg /= "") return + + p => this%concs(igas)%conc(:,:) + !$acc data copyout (array) present(this, this%concs) + !$omp target data map(from:array) + if(size(this%concs(igas)%conc, 1) > 1) then ! Concentration stored as 2D + !$acc parallel loop collapse(2) default(none) present(p) + !$omp target teams distribute parallel do simd + do ilay = 1, size(array,2) + do icol = 1, size(array,1) + !print *, (size(this%concs)) +#ifdef _CRAYFTN + array(icol,ilay) = p(icol,ilay) +#else + array(icol,ilay) = this%concs(igas)%conc(icol,ilay) +#endif + end do + end do + else if(size(this%concs(igas)%conc, 2) > 1) then ! Concentration stored as 1D + !$acc parallel loop collapse(2) default(none) present(p) + !$omp target teams distribute parallel do simd + do ilay = 1, size(array,2) + do icol = 1, size(array,1) +#ifdef _CRAYFTN + array(icol,ilay) = p(1,ilay) +#else + array(icol, ilay) = this%concs(igas)%conc(1,ilay) +#endif + end do + end do + else ! Concentration stored as scalar + !$acc parallel loop collapse(2) default(none) present(p) + !$omp target teams distribute parallel do simd + do ilay = 1, size(array,2) + do icol = 1, size(array,1) +#ifdef _CRAYFTN + array(icol,ilay) = p(1,1) +#else + array(icol,ilay) = this%concs(igas)%conc(1,1) +#endif + end do + end do + end if + !$acc end data + !$omp end target data + + end function get_vmr_2d + ! ------------------------------------------------------------------------------------- + ! + !> Extract a subset of n columns starting with column `start` + ! + ! ------------------------------------------------------------------------------------- + function get_subset_range(this, start, n, subset) result(error_msg) + class(ty_gas_concs), intent(in ) :: this + integer, intent(in ) :: start, n !! Index of first column, number of columns to extract + class(ty_gas_concs), intent(inout) :: subset !! Object to hold the subset of columns + character(len=128) :: error_msg !! Error string, empty if successful + ! --------------------- + real(wp), dimension(:,:), pointer :: p1, p2 + integer :: i + ! --------------------- + error_msg = '' + if(n <= 0) & + error_msg = "gas_concs%get_vmr: Asking for 0 or fewer columns " + if(start < 1 ) & + error_msg = "gas_concs%get_vmr: Asking for columns outside range" + if(this%ncol > 0 .and. start > this%ncol .or. start+n-1 > this%ncol ) & + error_msg = "gas_concs%get_vmr: Asking for columns outside range" + if(error_msg /= "") return + + call subset%reset() + allocate(subset%gas_names(size(this%gas_names)), & + subset%concs (size(this%concs))) ! These two arrays should be the same length + !$acc enter data create(subset, subset%concs) + !$omp target enter data map(alloc:subset%concs) + subset%nlay = this%nlay + subset%ncol = merge(n, 0, this%ncol > 0) + subset%gas_names(:) = this%gas_names(:) + + do i = 1, size(this%gas_names) + ! + ! Preserve scalar/1D/2D representation in subset, + ! but need to ensure at least extent 1 in col dimension (ncol = 0 means no gas exploits this dimension) + ! + allocate(subset%concs(i)%conc(min(max(subset%ncol,1), size(this%concs(i)%conc, 1)), & + min( subset%nlay, size(this%concs(i)%conc, 2)))) + p1 => subset%concs(i)%conc(:,:) + p2 => this%concs(i)%conc(:,:) + !$acc enter data create(subset%concs(i)%conc) + !$omp target enter data map(alloc:subset%concs(i)%conc) + if(size(this%concs(i)%conc, 1) > 1) then ! Concentration stored as 2D + !$acc kernels + !$omp target +#ifdef _CRAYFTN + p1(:,:) = p2(start:(start+n-1),:) +#else + subset%concs(i)%conc(:,:) = this%concs(i)%conc(start:(start+n-1),:) +#endif + !$acc end kernels + !$omp end target + else + !$acc kernels + !$omp target +#ifdef _CRAYFTN + p1(:,:) = p2(:,:) +#else + subset%concs(i)%conc(:,:) = this%concs(i)%conc(:,:) +#endif + !$acc end kernels + !$omp end target + end if + end do + + end function get_subset_range + ! ------------------------------------------------------------------------------------- + ! + !> Free memory and reset the object to an unititialzed state + ! + ! ------------------------------------------------------------------------------------- + subroutine reset(this) + class(ty_gas_concs), intent(inout) :: this + ! ----------------- + integer :: i + ! ----------------- + this%nlay = 0 + this%ncol = 0 + if(allocated(this%gas_names)) deallocate(this%gas_names) + if (allocated(this%concs)) then + do i = 1, size(this%concs) + if(associated(this%concs(i)%conc)) then + !$acc exit data delete(this%concs(i)%conc) + !$omp target exit data map(release:this%concs(i)%conc) + deallocate(this%concs(i)%conc) + nullify(this%concs(i)%conc) + end if + end do + !$acc exit data delete(this%concs) + !$omp target exit data map(release:this%concs) + deallocate(this%concs) + end if + end subroutine reset + ! ------------------------------------------------------------------------------------- + ! + ! Inquiry functions + ! + ! ------------------------------------------------------------------------------------- + !> Inquire function - how many gases are known? (Not all concentrations need be set) + pure function get_num_gases(this) + class(ty_gas_concs), intent(in) :: this + integer :: get_num_gases + + get_num_gases = size(this%gas_names) + return + end function get_num_gases + ! ------------------------------------------------------------------------------------- + !> Inquire function - what are the names of the known gases? (Not all concentrations need be set) + pure function get_gas_names(this) + class(ty_gas_concs), intent(in) :: this + character(len=32), dimension(this%get_num_gases()) :: get_gas_names !! names of the known gases + + get_gas_names(:) = this%gas_names(:) + return + end function get_gas_names + ! ------------------------------------------------------------------------------------- + ! + ! Private procedures + ! + ! ------------------------------------------------------------------------------------- + ! + ! find gas in list; GAS_NOT_IN_LIST if not found + ! + function find_gas(this, gas) + character(len=*), intent(in) :: gas + class(ty_gas_concs), intent(in) :: this + integer :: find_gas + ! ----------------- + integer :: igas + ! ----------------- + find_gas = GAS_NOT_IN_LIST + if(.not. allocated(this%gas_names)) return + ! search gases using a loop. Fortran intrinsic findloc would be faster, but only supported since gfortran 9 + do igas = 1, size(this%gas_names) + if (lower_case(trim(this%gas_names(igas))) == lower_case(trim(gas))) then + find_gas = igas + end if + end do + end function + ! ------------------------------------------------------------------------------------- + !> Finalization - free all memory when the object goes out of scope + subroutine del(this) + type(ty_gas_concs), intent(inout) :: this + call this%reset() + !$acc exit data delete(this) + end subroutine del + ! ------------------------------------------------------------------------------------- +end module mo_gas_concentrations diff --git a/src/radiate/rte-rrtmgp/rrtmgp/mo_gas_optics.F90 b/src/radiate/rte-rrtmgp/rrtmgp/mo_gas_optics.F90 new file mode 100644 index 0000000..baa17d1 --- /dev/null +++ b/src/radiate/rte-rrtmgp/rrtmgp/mo_gas_optics.F90 @@ -0,0 +1,127 @@ +! This code is part of RRTM for GCM Applications - Parallel (RRTMGP) +! +! Contacts: Robert Pincus and Eli Mlawer +! email: rrtmgp@aer.com +! +! Copyright 2015-, Atmospheric and Environmental Research, +! Regents of the University of Colorado, Trustees of Columbia University. All right reserved. +! +! Use and duplication is permitted under the terms of the +! BSD 3-clause license, see http://opensource.org/licenses/BSD-3-Clause +! ------------------------------------------------------------------------------------------------- +!> +!> ## Generic Fortran interface for gas optics +!> +!> Defines an interface for gas optics parameterizations: +!> +!> - inquiry functions for the pressure and temperature limits +!> - inquiry functions for the source of radiation (internal or planetary radiation vs. +!> external or stellar radiation) +!> - Method for computing gas optical optical properties and incident stellar radiation +!> given pressure, temperature, and gas concentrations +!> - Method for computing gas optical optical properties and internal Planck sources +!> given pressure, temperature, and gas concentrations +!> +!> This (abstract) class is a sub-classes of `ty_optical_props` in the RTE module `mo_optical_props` +!> and inherits the procedures related to spectral discratization from that class. +!> Optical properties are returned in any variable of `ty_optical_props_arry` (that is, +!> an array of values with dimensions ncol, nlay, ngpt) in the same module. +!> Internal sources of radiation are provided in a variable of type +!> `ty_source_func_lw` in RTE module `ty_source_func_lw`. +!> The module also makes use of [[mo_gas_concentrations(module):ty_gas_concs(type)]] from +!> module [[mo_gas_concentrations]]. +! +! ------------------------------------------------------------------------------------------------- +module mo_gas_optics + use mo_rte_kind, only: wp + use mo_source_functions, only: ty_source_func_lw + use mo_gas_concentrations, only: ty_gas_concs + use mo_optical_props, only: ty_optical_props, ty_optical_props_arry + + type, abstract, extends(ty_optical_props), public :: ty_gas_optics + contains + generic, public :: gas_optics => gas_optics_int, gas_optics_ext + ! + ! Deferred procedures -- each must be implemented in each child class with + ! arguments following the abstract interface (defined below) + ! + ! gas_optics_int and gas_optics_ext should be declared private in concrete classes + ! but need to be visible in the abstract type or the interfaces won't be inherited + ! See https://software.intel.com/en-us/forums/intel-fortran-compiler-for-linux-and-mac-os-x/topic/681705 + ! + procedure(gas_optics_int_abstract), deferred :: gas_optics_int + procedure(gas_optics_ext_abstract), deferred :: gas_optics_ext + + procedure(logical_abstract), deferred, public :: source_is_internal + procedure(logical_abstract), deferred, public :: source_is_external + procedure(real_abstract), deferred, public :: get_press_min + procedure(real_abstract), deferred, public :: get_press_max + procedure(real_abstract), deferred, public :: get_temp_min + procedure(real_abstract), deferred, public :: get_temp_max + end type ty_gas_optics + ! + ! Interfaces for the methods to be implemented + ! + abstract interface + !-------------------------------------------------------------------------------------------------------------------- + ! + ! Compute gas optical depth given temperature, pressure, and composition + ! + function gas_optics_ext_abstract(this, & + play, plev, tlay, gas_desc, & ! mandatory inputs + optical_props, toa_src, & ! mandatory outputs + col_dry) result(error_msg) ! optional input + import ty_gas_optics, wp, ty_gas_concs, ty_optical_props_arry + class(ty_gas_optics), intent(in) :: this + real(wp), dimension(:,:), intent(in ) :: play, & !! layer pressures [Pa, mb]; (ncol,nlay) + plev, & !! level pressures [Pa, mb]; (ncol,nlay+1) + tlay !! layer temperatures [K]; (ncol,nlay) + type(ty_gas_concs), intent(in ) :: gas_desc !! Gas volume mixing ratios + class(ty_optical_props_arry), & + intent(inout) :: optical_props !! + real(wp), dimension(:,:), intent( out) :: toa_src !! Incoming solar irradiance(ncol,ngpt) + character(len=128) :: error_msg !! Empty if successful + ! Optional inputs + real(wp), dimension(:,:), intent(in ), & + optional, target :: col_dry !! Column dry amount (molecules/cm^2); dim(ncol,nlay) + end function gas_optics_ext_abstract + !-------------------------------------------------------------------------------------------------------------------- + ! + ! Compute gas optical depth and Planck source functions, + ! given temperature, pressure, and composition + ! + function gas_optics_int_abstract(this, & + play, plev, tlay, tsfc, gas_desc, & + optical_props, sources, & + col_dry, tlev) result(error_msg) + import ty_gas_optics, wp, ty_gas_concs, ty_optical_props_arry, ty_source_func_lw + class(ty_gas_optics), intent(in ) :: this + real(wp), dimension(:,:), intent(in ) :: play, & !! layer pressures [Pa, mb]; (ncol,nlay) + plev, & !! level pressures [Pa, mb]; (ncol,nlay+1) + tlay !! layer temperatures [K]; (ncol,nlay) + real(wp), dimension(:), intent(in ) :: tsfc !! surface skin temperatures [K]; (ncol) + type(ty_gas_concs), intent(in ) :: gas_desc !! Gas volume mixing ratios + class(ty_optical_props_arry), & + intent(inout) :: optical_props !! Optical properties + class(ty_source_func_lw ), & + intent(inout) :: sources !! Planck sources + character(len=128) :: error_msg !! Empty if successful + real(wp), dimension(:,:), intent(in ), & + optional, target :: col_dry, & !! Column dry amount (molecules/cm^2); dim(ncol,nlay) + tlev !! level temperatures [K]l (ncol,nlay+1) + end function gas_optics_int_abstract + !-------------------------------------------------------------------------------------------------------------------- + function logical_abstract(this) + import ty_gas_optics + class(ty_gas_optics), intent(in ) :: this + logical :: logical_abstract + end function logical_abstract + !-------------------------------------------------------------------------------------------------------------------- + function real_abstract(this) + import ty_gas_optics, wp + class(ty_gas_optics), intent(in ) :: this + real(wp) :: real_abstract + end function real_abstract + !-------------------------------------------------------------------------------------------------------------------- + end interface +end module mo_gas_optics diff --git a/src/radiate/rte-rrtmgp/rrtmgp/mo_gas_optics_rrtmgp.F90 b/src/radiate/rte-rrtmgp/rrtmgp/mo_gas_optics_rrtmgp.F90 new file mode 100644 index 0000000..1f000b3 --- /dev/null +++ b/src/radiate/rte-rrtmgp/rrtmgp/mo_gas_optics_rrtmgp.F90 @@ -0,0 +1,2121 @@ +! This code is part of RRTM for GCM Applications - Parallel (RRTMGP) +! +! Contacts: Robert Pincus and Eli Mlawer +! email: rrtmgp@aer.com +! +! Copyright 2015-, Atmospheric and Environmental Research, +! Regents of the University of Colorado, Trustees of Columbia University. All right reserved. +! +! Use and duplication is permitted under the terms of the +! BSD 3-clause license, see http://opensource.org/licenses/BSD-3-Clause +! ------------------------------------------------------------------------------------------------- +! +!> ## Class implementing the RRTMGP correlated-_k_ distribution +!> +!> Implements a class for computing spectrally-resolved gas optical properties and source functions +!> given atmopsheric physical properties (profiles of temperature, pressure, and gas concentrations) +!> The class must be initialized with data (provided as a netCDF file) before being used. +!> +!> Two variants apply to internal Planck sources (longwave radiation in the Earth's atmosphere) and to +!> external stellar radiation (shortwave radiation in the Earth's atmosphere). +!> The variant is chosen based on what information is supplied during initialization. +! (It might make more sense to define two sub-classes) +! +! ------------------------------------------------------------------------------------------------- +module mo_gas_optics_rrtmgp + use mo_rte_kind, only: wp, wl + use mo_rte_config, only: check_extents, check_values + use mo_rte_util_array, only: zero_array, any_vals_less_than, any_vals_outside, extents_are + use mo_optical_props, only: ty_optical_props + use mo_source_functions, only: ty_source_func_lw + use mo_gas_optics_kernels, only: interpolation, & + compute_tau_absorption, compute_tau_rayleigh, compute_Planck_source + use mo_rrtmgp_constants, only: avogad, m_dry, m_h2o, grav + use mo_rrtmgp_util_string, only: lower_case, string_in_array, string_loc_in_array + use mo_gas_concentrations, only: ty_gas_concs + use mo_optical_props, only: ty_optical_props_arry, ty_optical_props_1scl, ty_optical_props_2str, ty_optical_props_nstr + use mo_gas_optics, only: ty_gas_optics + implicit none + private + real(wp), parameter :: pi = acos(-1._wp) + + ! ------------------------------------------------------------------------------------------------- + type, extends(ty_gas_optics), public :: ty_gas_optics_rrtmgp + private + ! + ! RRTMGP computes absorption in each band arising from + ! two major species in each band, which are combined to make + ! a relative mixing ratio eta and a total column amount (col_mix) + ! contributions from zero or more minor species whose concentrations + ! may be scaled by other components of the atmosphere + ! + ! Absorption coefficients are interpolated from tables on a pressure/temperature/(eta) grid + ! + ! ------------------------------------ + ! Interpolation variables: Temperature and pressure grids + ! + real(wp), dimension(:), allocatable :: press_ref, press_ref_log, temp_ref + ! + ! Derived and stored for convenience: + ! Min and max for temperature and pressure intepolation grids + ! difference in ln pressure between consecutive reference levels + ! log of reference pressure separating the lower and upper atmosphere + ! + real(wp) :: press_ref_min, press_ref_max, & + temp_ref_min, temp_ref_max + real(wp) :: press_ref_log_delta, temp_ref_delta, press_ref_trop_log + ! ------------------------------------ + ! Major absorbers ("key species") + ! Each unique set of major species is called a flavor. + ! + ! Names and reference volume mixing ratios of major gases + ! + character(32), dimension(:), allocatable :: gas_names ! gas names + real(wp), dimension(:,:,:), allocatable :: vmr_ref ! vmr_ref(lower or upper atmosphere, gas, temp) + ! + ! Which two gases are in each flavor? By index + ! + integer, dimension(:,:), allocatable :: flavor ! major species pair; (2,nflav) + ! + ! Which flavor for each g-point? One each for lower, upper atmosphere + ! + integer, dimension(:,:), allocatable :: gpoint_flavor ! flavor = gpoint_flavor(2, g-point) + ! + ! Major gas absorption coefficients + ! + real(wp), dimension(:,:,:,:), allocatable :: kmajor ! kmajor(g-point,eta,pressure,temperature) + ! + ! ------------------------------------ + ! Minor species, independently for upper and lower atmospheres + ! Array extents in the n_minor dimension will differ between upper and lower atmospheres + ! Each contribution has starting and ending g-points + ! + integer, dimension(:,:), allocatable :: minor_limits_gpt_lower, & + minor_limits_gpt_upper + ! + ! Minor gas contributions might be scaled by other gas amounts; if so we need to know + ! the total density and whether the contribution is scaled by the partner gas + ! or its complement (i.e. all other gases) + ! Water vapor self- and foreign continua work like this, as do + ! all collision-induced abosption pairs + ! + integer, dimension(:), allocatable :: minor_scales_with_density_lower, & + minor_scales_with_density_upper + integer, dimension(:), allocatable :: scale_by_complement_lower, scale_by_complement_upper + integer, dimension(:), allocatable :: idx_minor_lower, idx_minor_upper + integer, dimension(:), allocatable :: idx_minor_scaling_lower, idx_minor_scaling_upper + ! + ! Index into table of absorption coefficients + ! + integer, dimension(:), allocatable :: kminor_start_lower, kminor_start_upper + ! + ! The absorption coefficients themselves + ! + real(wp), dimension(:,:,:), allocatable :: kminor_lower, kminor_upper ! kminor_lower(n_minor,eta,temperature) + ! + ! ----------------------------------------------------------------------------------- + ! + ! Rayleigh scattering coefficients + ! + real(wp), dimension(:,:,:,:), allocatable :: krayl ! krayl(g-point,eta,temperature,upper/lower atmosphere) + ! + ! ----------------------------------------------------------------------------------- + ! Planck function spectral mapping + ! Allocated only when gas optics object is internal-source + ! + real(wp), dimension(:,:,:,:), allocatable :: planck_frac ! stored fraction of Planck irradiance in band for given g-point + ! planck_frac(g-point, eta, pressure, temperature) + real(wp), dimension(:,:), allocatable :: totplnk ! integrated Planck irradiance by band; (Planck temperatures,band) + real(wp) :: totplnk_delta ! temperature steps in totplnk + real(wp), dimension(:,:), allocatable :: optimal_angle_fit ! coefficients of linear function + ! of vertical path clear-sky transmittance that is used to + ! determine the secant of single angle used for the + ! no-scattering calculation, + ! optimal_angle_fit(coefficient, band) + ! ----------------------------------------------------------------------------------- + ! Solar source function spectral mapping with solar variability capability + ! Allocated when gas optics object is external-source + ! n-solar-terms: quiet sun, facular brightening and sunspot dimming components + ! following the NRLSSI2 model of Coddington et al. 2016, doi:10.1175/BAMS-D-14-00265.1. + ! + real(wp), dimension(:), allocatable :: solar_source ! incoming solar irradiance, computed from other three terms (g-point) + real(wp), dimension(:), allocatable :: solar_source_quiet ! incoming solar irradiance, quiet sun term (g-point) + real(wp), dimension(:), allocatable :: solar_source_facular ! incoming solar irradiance, facular term (g-point) + real(wp), dimension(:), allocatable :: solar_source_sunspot ! incoming solar irradiance, sunspot term (g-point) + + ! + ! ----------------------------------------------------------------------------------- + ! Ancillary + ! ----------------------------------------------------------------------------------- + ! Index into %gas_names -- is this a key species in any band? + logical, dimension(:), allocatable :: is_key + ! ----------------------------------------------------------------------------------- + + contains + ! Type-bound procedures + ! Public procedures + ! public interface + generic, public :: load => load_int, load_ext + procedure, public :: source_is_internal + procedure, public :: source_is_external + procedure, public :: is_loaded + procedure, public :: finalize + procedure, public :: get_ngas + procedure, public :: get_gases + procedure, public :: get_press_min + procedure, public :: get_press_max + procedure, public :: get_temp_min + procedure, public :: get_temp_max + procedure, public :: compute_optimal_angles + procedure, public :: set_solar_variability + procedure, public :: set_tsi + ! Internal procedures + procedure, private :: load_int + procedure, private :: load_ext + procedure, public :: gas_optics_int + procedure, public :: gas_optics_ext + procedure, private :: check_key_species_present + ! Interpolation table dimensions + procedure, private :: get_nflav + procedure, private :: get_neta + procedure, private :: get_npres + procedure, private :: get_ntemp + procedure, private :: get_nPlanckTemp + end type ty_gas_optics_rrtmgp + ! ------------------------------------------------------------------------------------------------- + ! + !> col_dry is the number of molecules per cm-2 of dry air + ! + public :: get_col_dry ! Utility function, not type-bound + +contains + ! -------------------------------------------------------------------------------------- + ! + ! Public procedures + ! + ! -------------------------------------------------------------------------------------- + ! + !> Two functions to define array sizes needed by gas_optics() + ! + pure function get_ngas(this) + ! return the number of gases registered in the spectral configuration + class(ty_gas_optics_rrtmgp), intent(in) :: this + integer :: get_ngas + + get_ngas = size(this%gas_names) + end function get_ngas + !-------------------------------------------------------------------------------------------------------------------- + ! + !> return the number of distinct major gas pairs in the spectral bands (referred to as + !> "flavors" - all bands have a flavor even if there is one or no major gas) + ! + pure function get_nflav(this) + class(ty_gas_optics_rrtmgp), intent(in) :: this + integer :: get_nflav + + get_nflav = size(this%flavor,dim=2) + end function get_nflav + !-------------------------------------------------------------------------------------------------------------------- + ! + !> Compute gas optical depth and Planck source functions, + !> given temperature, pressure, and composition + ! + function gas_optics_int(this, & + play, plev, tlay, tsfc, gas_desc, & + optical_props, sources, & + col_dry, tlev) result(error_msg) + ! inputs + class(ty_gas_optics_rrtmgp), intent(in) :: this + real(wp), dimension(:,:), intent(in ) :: play, & !! layer pressures [Pa, mb]; (ncol,nlay) + plev, & !! level pressures [Pa, mb]; (ncol,nlay+1) + tlay !! layer temperatures [K]; (ncol,nlay) + real(wp), dimension(:), intent(in ) :: tsfc !! surface skin temperatures [K]; (ncol) + type(ty_gas_concs), intent(in ) :: gas_desc !! Gas volume mixing ratios + ! output + class(ty_optical_props_arry), & + intent(inout) :: optical_props !! Optical properties + class(ty_source_func_lw ), & + intent(inout) :: sources !! Planck sources + character(len=128) :: error_msg !! Empty if succssful + ! Optional inputs + real(wp), dimension(:,:), intent(in ), & + optional, target :: col_dry, & !! Column dry amount; dim(ncol,nlay) + tlev !! level temperatures [K]; (ncol,nlay+1) + ! ---------------------------------------------------------- + ! Local variables + ! Interpolation coefficients for use in source function + integer, dimension(size(play,dim=1), size(play,dim=2)) :: jtemp, jpress + integer, dimension(size(play,dim=1), size(play,dim=2)) :: tropo + real(wp), dimension(2,2,2,size(play,dim=1),size(play,dim=2), get_nflav(this)) :: fmajor + integer, dimension(2, size(play,dim=1),size(play,dim=2), get_nflav(this)) :: jeta + + integer :: ncol, nlay, ngpt, nband + ! ---------------------------------------------------------- + ncol = size(play,dim=1) + nlay = size(play,dim=2) + ngpt = this%get_ngpt() + nband = this%get_nband() + ! + ! Gas optics + ! + !$acc enter data create(jtemp, jpress, tropo, fmajor, jeta) + !$omp target enter data map(alloc:jtemp, jpress, tropo, fmajor, jeta) + error_msg = compute_gas_taus(this, & + ncol, nlay, ngpt, nband, & + play, plev, tlay, gas_desc, & + optical_props, & + jtemp, jpress, jeta, tropo, fmajor, & + col_dry) + if(error_msg /= '') return + ! ---------------------------------------------------------- + ! + ! External source -- check arrays sizes and values + ! input data sizes and values + ! + !$acc enter data copyin(tsfc, tlev) ! Should be fine even if tlev is not supplied + !$omp target enter data map(to:tsfc, tlev) + + if(check_extents) then + if(.not. extents_are(tsfc, ncol)) & + error_msg = "gas_optics(): array tsfc has wrong size" + if(present(tlev)) then + if(.not. extents_are(tlev, ncol, nlay+1)) & + error_msg = "gas_optics(): array tlev has wrong size" + end if + ! + ! output extents + ! + if(any([sources%get_ncol(), sources%get_nlay(), sources%get_ngpt()] /= [ncol, nlay, ngpt])) & + error_msg = "gas_optics%gas_optics: source function arrays inconsistently sized" + end if + if(error_msg /= '') return + + if(check_values) then + if(any_vals_outside(tsfc, this%temp_ref_min, this%temp_ref_max)) & + error_msg = "gas_optics(): array tsfc has values outside range" + if(present(tlev)) then + if(any_vals_outside(tlev, this%temp_ref_min, this%temp_ref_max)) & + error_msg = "gas_optics(): array tlev has values outside range" + end if + end if + if(error_msg /= '') return + + ! + ! Interpolate source function + ! + if(present(tlev)) then + ! + ! present status of optional argument should be passed to source() + ! but isn't with PGI 19.10 + ! + error_msg = source(this, & + ncol, nlay, nband, ngpt, & + play, plev, tlay, tsfc, & + jtemp, jpress, jeta, tropo, fmajor, & + sources, & + tlev) + !$acc exit data delete(tlev) + !$omp target exit data map(release:tlev) + else + error_msg = source(this, & + ncol, nlay, nband, ngpt, & + play, plev, tlay, tsfc, & + jtemp, jpress, jeta, tropo, fmajor, & + sources) + end if + !$acc exit data delete(tsfc) + !$omp target exit data map(release:tsfc) + !$acc exit data delete(jtemp, jpress, tropo, fmajor, jeta) + !$omp target exit data map(release:jtemp, jpress, tropo, fmajor, jeta) + end function gas_optics_int + !------------------------------------------------------------------------------------------ + ! + !> Compute gas optical depth given temperature, pressure, and composition + !> Top-of-atmosphere stellar insolation is also reported + ! + function gas_optics_ext(this, & + play, plev, tlay, gas_desc, & ! mandatory inputs + optical_props, toa_src, & ! mandatory outputs + col_dry) result(error_msg) ! optional input + + class(ty_gas_optics_rrtmgp), intent(in) :: this + real(wp), dimension(:,:), intent(in ) :: play, & !! layer pressures [Pa, mb]; (ncol,nlay) + plev, & !! level pressures [Pa, mb]; (ncol,nlay+1) + tlay !! layer temperatures [K]; (ncol,nlay) + type(ty_gas_concs), intent(in ) :: gas_desc !! Gas volume mixing ratios + ! output + class(ty_optical_props_arry), & + intent(inout) :: optical_props + real(wp), dimension(:,:), intent( out) :: toa_src !! Incoming solar irradiance(ncol,ngpt) + character(len=128) :: error_msg !! Empty if successful + + ! Optional inputs + real(wp), dimension(:,:), intent(in ), & + optional, target :: col_dry ! Column dry amount; dim(ncol,nlay) + ! ---------------------------------------------------------- + ! Local variables + ! Interpolation coefficients for use in source function + integer, dimension(size(play,dim=1), size(play,dim=2)) :: jtemp, jpress + integer, dimension(size(play,dim=1), size(play,dim=2)) :: tropo + real(wp), dimension(2,2,2,size(play,dim=1),size(play,dim=2), get_nflav(this)) :: fmajor + integer, dimension(2, size(play,dim=1),size(play,dim=2), get_nflav(this)) :: jeta + + integer :: ncol, nlay, ngpt, nband, ngas, nflav + integer :: igpt, icol + ! ---------------------------------------------------------- + ncol = size(play,dim=1) + nlay = size(play,dim=2) + ngpt = this%get_ngpt() + nband = this%get_nband() + ngas = this%get_ngas() + nflav = get_nflav(this) + ! + ! Gas optics + ! + !$acc enter data create(jtemp, jpress, tropo, fmajor, jeta) + !$omp target enter data map(alloc:jtemp, jpress, tropo, fmajor, jeta) + error_msg = compute_gas_taus(this, & + ncol, nlay, ngpt, nband, & + play, plev, tlay, gas_desc, & + optical_props, & + jtemp, jpress, jeta, tropo, fmajor, & + col_dry) + !$acc exit data delete(jtemp, jpress, tropo, fmajor, jeta) + !$omp target exit data map(release:jtemp, jpress, tropo, fmajor, jeta) + if(error_msg /= '') return + + ! ---------------------------------------------------------- + ! + ! External source function is constant + ! + !$acc enter data create(toa_src) + !$omp target enter data map(alloc:toa_src) + if(check_extents) then + if(.not. extents_are(toa_src, ncol, ngpt)) & + error_msg = "gas_optics(): array toa_src has wrong size" + end if + if(error_msg /= '') return + + !$acc parallel loop collapse(2) + !$omp target teams distribute parallel do simd collapse(2) + do igpt = 1,ngpt + do icol = 1,ncol + toa_src(icol,igpt) = this%solar_source(igpt) + end do + end do + !$acc exit data copyout(toa_src) + !$omp target exit data map(from:toa_src) + end function gas_optics_ext + !------------------------------------------------------------------------------------------ + ! + ! Returns optical properties and interpolation coefficients + ! + function compute_gas_taus(this, & + ncol, nlay, ngpt, nband, & + play, plev, tlay, gas_desc, & + optical_props, & + jtemp, jpress, jeta, tropo, fmajor, & + col_dry) result(error_msg) + + class(ty_gas_optics_rrtmgp), & + intent(in ) :: this + integer, intent(in ) :: ncol, nlay, ngpt, nband + real(wp), dimension(:,:), intent(in ) :: play, & ! layer pressures [Pa, mb]; (ncol,nlay) + plev, & ! level pressures [Pa, mb]; (ncol,nlay+1) + tlay ! layer temperatures [K]; (ncol,nlay) + type(ty_gas_concs), intent(in ) :: gas_desc ! Gas volume mixing ratios + class(ty_optical_props_arry), intent(inout) :: optical_props !inout because components are allocated + ! Interpolation coefficients for use in internal source function + integer, dimension( ncol, nlay), intent( out) :: jtemp, jpress + integer, dimension(2, ncol, nlay,get_nflav(this)), intent( out) :: jeta + integer, dimension( ncol, nlay), intent( out) :: tropo + real(wp), dimension(2,2,2,ncol, nlay,get_nflav(this)), intent( out) :: fmajor + character(len=128) :: error_msg + + ! Optional inputs + real(wp), dimension(:,:), intent(in ), & + optional, target :: col_dry ! Column dry amount; dim(ncol,nlay) + ! ---------------------------------------------------------- + ! Local variables + real(wp), dimension(ncol,nlay,ngpt) :: tau, tau_rayleigh ! absorption, Rayleigh scattering optical depths + ! Number of molecules per cm^2 + real(wp), dimension(ncol,nlay), target :: col_dry_arr + real(wp), dimension(:,:), pointer :: col_dry_wk + ! + ! Interpolation variables used in major gas but not elsewhere, so don't need exporting + ! + real(wp), dimension(ncol,nlay, this%get_ngas()) :: vmr ! volume mixing ratios + real(wp), dimension(ncol,nlay,0:this%get_ngas()) :: col_gas ! column amounts for each gas, plus col_dry + real(wp), dimension(2, ncol,nlay,get_nflav(this)) :: col_mix ! combination of major species's column amounts + ! index(1) : reference temperature level + ! index(2) : flavor + ! index(3) : layer + real(wp), dimension(2,2, ncol,nlay,get_nflav(this)) :: fminor ! interpolation fractions for minor species + ! index(1) : reference eta level (temperature dependent) + ! index(2) : reference temperature level + ! index(3) : flavor + ! index(4) : layer + integer :: ngas, nflav, neta, npres, ntemp + integer :: icol, ilay, igas + integer :: idx_h2o ! index of water vapor + integer :: nminorlower, nminorklower,nminorupper, nminorkupper + logical :: use_rayl + ! ---------------------------------------------------------- + ! + ! Error checking + ! + use_rayl = allocated(this%krayl) + error_msg = '' + ! Check for initialization + if (.not. this%is_loaded()) then + error_msg = 'ERROR: spectral configuration not loaded' + return + end if + ! + ! Check for presence of key species in ty_gas_concs; return error if any key species are not present + ! + error_msg = this%check_key_species_present(gas_desc) + if (error_msg /= '') return + + ! + ! Check input data sizes and values + ! + !$acc data copyin(play,plev,tlay) create( vmr,col_gas) + !$omp target data map(to:play,plev,tlay) map(alloc:vmr,col_gas) + if(check_extents) then + if(.not. extents_are(play, ncol, nlay )) & + error_msg = "gas_optics(): array play has wrong size" + if(.not. extents_are(tlay, ncol, nlay )) & + error_msg = "gas_optics(): array tlay has wrong size" + if(.not. extents_are(plev, ncol, nlay+1)) & + error_msg = "gas_optics(): array plev has wrong size" + if(optical_props%get_ncol() /= ncol .or. & + optical_props%get_nlay() /= nlay .or. & + optical_props%get_ngpt() /= ngpt) & + error_msg = "gas_optics(): optical properties have the wrong extents" + if(present(col_dry)) then + if(.not. extents_are(col_dry, ncol, nlay)) & + error_msg = "gas_optics(): array col_dry has wrong size" + end if + end if + + if(error_msg == '') then + if(check_values) then + if(any_vals_outside(play, this%press_ref_min,this%press_ref_max)) & + error_msg = "gas_optics(): array play has values outside range" + if(any_vals_less_than(plev, 0._wp)) & + error_msg = "gas_optics(): array plev has values outside range" + if(any_vals_outside(tlay, this%temp_ref_min, this%temp_ref_max)) & + error_msg = "gas_optics(): array tlay has values outside range" + if(present(col_dry)) then + if(any_vals_less_than(col_dry, 0._wp)) & + error_msg = "gas_optics(): array col_dry has values outside range" + end if + end if + end if + + ! ---------------------------------------------------------- + if(error_msg == '') then + ngas = this%get_ngas() + nflav = get_nflav(this) + neta = this%get_neta() + npres = this%get_npres() + ntemp = this%get_ntemp() + ! number of minor contributors, total num absorption coeffs + nminorlower = size(this%minor_scales_with_density_lower) + nminorklower = size(this%kminor_lower, 3) + nminorupper = size(this%minor_scales_with_density_upper) + nminorkupper = size(this%kminor_upper, 3) + ! + ! Fill out the array of volume mixing ratios + ! + do igas = 1, ngas + ! + ! Get vmr if gas is provided in ty_gas_concs + ! + if (any (lower_case(this%gas_names(igas)) == gas_desc%get_gas_names())) then + error_msg = gas_desc%get_vmr(this%gas_names(igas), vmr(:,:,igas)) + endif + end do + end if + + if(error_msg == '') then + +! +! Painful hacks to get code to compile with both the CCE-14 and Nvidia 21.3 compiler +! +#ifdef _CRAYFTN + !$acc enter data copyin(optical_props) +#endif + select type(optical_props) + type is (ty_optical_props_1scl) +#ifndef _CRAYFTN + !$acc enter data copyin(optical_props) +#endif + !$acc enter data create( optical_props%tau) + !$omp target enter data map(alloc:optical_props%tau) + type is (ty_optical_props_2str) +#ifndef _CRAYFTN + !$acc enter data copyin(optical_props) +#endif + !$acc enter data create( optical_props%tau, optical_props%ssa, optical_props%g) + !$omp target enter data map(alloc:optical_props%tau, optical_props%ssa, optical_props%g) + type is (ty_optical_props_nstr) +#ifndef _CRAYFTN + !$acc enter data copyin(optical_props) +#endif + !$acc enter data create( optical_props%tau, optical_props%ssa, optical_props%p) + !$omp target enter data map(alloc:optical_props%tau, optical_props%ssa, optical_props%p) + end select + + ! + ! Compute dry air column amounts (number of molecule per cm^2) if user hasn't provided them + ! + idx_h2o = string_loc_in_array('h2o', this%gas_names) + if (present(col_dry)) then + !$acc enter data copyin(col_dry) + !$omp target enter data map(to:col_dry) + col_dry_wk => col_dry + else + !$acc enter data create( col_dry_arr) + !$omp target enter data map(alloc:col_dry_arr) + col_dry_arr = get_col_dry(vmr(:,:,idx_h2o), plev) ! dry air column amounts computation + col_dry_wk => col_dry_arr + end if + ! + ! compute column gas amounts [molec/cm^2] + ! + !$acc parallel loop gang vector collapse(2) + !$omp target teams distribute parallel do simd collapse(2) + do ilay = 1, nlay + do icol = 1, ncol + col_gas(icol,ilay,0) = col_dry_wk(icol,ilay) + end do + end do + !$acc parallel loop gang vector collapse(3) + !$omp target teams distribute parallel do simd collapse(3) + do igas = 1, ngas + do ilay = 1, nlay + do icol = 1, ncol + col_gas(icol,ilay,igas) = vmr(icol,ilay,igas) * col_dry_wk(icol,ilay) + end do + end do + end do + ! + ! ---- calculate gas optical depths ---- + ! + !$acc data copyout( jtemp, jpress, jeta, tropo, fmajor) create( col_mix, fminor) + !$omp target data map(from:jtemp, jpress, jeta, tropo, fmajor) map(alloc:col_mix, fminor) + call interpolation( & + ncol,nlay, & ! problem dimensions + ngas, nflav, neta, npres, ntemp, & ! interpolation dimensions + this%flavor, & + this%press_ref_log, & + this%temp_ref, & + this%press_ref_log_delta, & + this%temp_ref_min, & + this%temp_ref_delta, & + this%press_ref_trop_log, & + this%vmr_ref, & + play, & + tlay, & + col_gas, & + jtemp, & ! outputs + fmajor,fminor,& + col_mix, & + tropo, & + jeta,jpress) + if (allocated(this%krayl)) then + !$acc data copyin(this%gpoint_flavor, this%krayl) create(tau, tau_rayleigh) + !$omp target data map(to:this%gpoint_flavor, this%krayl) map(alloc:tau, tau_rayleigh) + call zero_array(ncol, nlay, ngpt, tau) + call compute_tau_absorption( & + ncol,nlay,nband,ngpt, & ! dimensions + ngas,nflav,neta,npres,ntemp, & + nminorlower, nminorklower, & ! number of minor contributors, total num absorption coeffs + nminorupper, nminorkupper, & + idx_h2o, & + this%gpoint_flavor, & + this%get_band_lims_gpoint(), & + this%kmajor, & + this%kminor_lower, & + this%kminor_upper, & + this%minor_limits_gpt_lower, & + this%minor_limits_gpt_upper, & + this%minor_scales_with_density_lower, & + this%minor_scales_with_density_upper, & + this%scale_by_complement_lower, & + this%scale_by_complement_upper, & + this%idx_minor_lower, & + this%idx_minor_upper, & + this%idx_minor_scaling_lower, & + this%idx_minor_scaling_upper, & + this%kminor_start_lower, & + this%kminor_start_upper, & + tropo, & + col_mix,fmajor,fminor, & + play,tlay,col_gas, & + jeta,jtemp,jpress, & + tau) + call compute_tau_rayleigh( & !Rayleigh scattering optical depths + ncol,nlay,nband,ngpt, & + ngas,nflav,neta,npres,ntemp, & ! dimensions + this%gpoint_flavor, & + this%get_band_lims_gpoint(), & + this%krayl, & ! inputs from object + idx_h2o, col_dry_wk,col_gas, & + fminor,jeta,tropo,jtemp, & ! local input + tau_rayleigh) + call combine_abs_and_rayleigh(tau, tau_rayleigh, optical_props) + !$acc end data + !$omp end target data + else + call zero_array(ncol, nlay, ngpt, optical_props%tau) + call compute_tau_absorption( & + ncol,nlay,nband,ngpt, & ! dimensions + ngas,nflav,neta,npres,ntemp, & + nminorlower, nminorklower, & ! number of minor contributors, total num absorption coeffs + nminorupper, nminorkupper, & + idx_h2o, & + this%gpoint_flavor, & + this%get_band_lims_gpoint(), & + this%kmajor, & + this%kminor_lower, & + this%kminor_upper, & + this%minor_limits_gpt_lower, & + this%minor_limits_gpt_upper, & + this%minor_scales_with_density_lower, & + this%minor_scales_with_density_upper, & + this%scale_by_complement_lower, & + this%scale_by_complement_upper, & + this%idx_minor_lower, & + this%idx_minor_upper, & + this%idx_minor_scaling_lower, & + this%idx_minor_scaling_upper, & + this%kminor_start_lower, & + this%kminor_start_upper, & + tropo, & + col_mix,fmajor,fminor, & + play,tlay,col_gas, & + jeta,jtemp,jpress, & + optical_props%tau) ! + select type(optical_props) + type is (ty_optical_props_2str) + call zero_array(ncol, nlay, ngpt, optical_props%ssa) + call zero_array(ncol, nlay, ngpt, optical_props%g) + type is (ty_optical_props_nstr) + call zero_array(ncol, nlay, ngpt, optical_props%ssa) + call zero_array(optical_props%get_nmom(), & + ncol, nlay, ngpt, optical_props%p) + end select + end if + !$acc end data + !$omp end target data + if (present(col_dry)) then + !$acc exit data delete( col_dry) + !$omp target exit data map(release:col_dry) + else + !$acc exit data delete( col_dry_arr) + !$omp target exit data map(release:col_dry_arr) + end if + + select type(optical_props) + type is (ty_optical_props_1scl) + !$acc exit data copyout( optical_props%tau) + !$omp target exit data map(from:optical_props%tau) + type is (ty_optical_props_2str) + !$acc exit data copyout( optical_props%tau, optical_props%ssa, optical_props%g) + !$omp target exit data map(from:optical_props%tau, optical_props%ssa, optical_props%g) + type is (ty_optical_props_nstr) + !$acc exit data copyout( optical_props%tau, optical_props%ssa, optical_props%p) + !$omp target exit data map(from:optical_props%tau, optical_props%ssa, optical_props%p) + end select + !$acc exit data delete(optical_props) + + end if + !$acc end data + !$omp end target data + + end function compute_gas_taus + !------------------------------------------------------------------------------------------ + ! + !> Compute the spectral solar source function adjusted to account for solar variability + !> following the NRLSSI2 model of Coddington et al. 2016, doi:10.1175/BAMS-D-14-00265.1. + !> as specified by the facular brightening (mg_index) and sunspot dimming (sb_index) + !> indices provided as input. + !> + !> Users provide the NRLSSI2 facular ("Bremen") index and sunspot ("SPOT67") index. + !> Changing either of these indicies will change the total solar irradiance (TSI) + !> Code in extensions/mo_solar_variability may be used to compute the value of these + !> indices through an average solar cycle + !> Users may also specify the TSI, either alone or in conjunction with the facular and sunspot indices + ! + !------------------------------------------------------------------------------------------ + function set_solar_variability(this, & + mg_index, sb_index, tsi) & + result(error_msg) + ! + !! Updates the spectral distribution and, optionally, + !! the integrated value of the solar source function + !! Modifying either index will change the total solar irradiance + ! + class(ty_gas_optics_rrtmgp), intent(inout) :: this + ! + real(wp), intent(in) :: mg_index !! facular brightening index (NRLSSI2 facular "Bremen" index) + real(wp), intent(in) :: sb_index !! sunspot dimming index (NRLSSI2 sunspot "SPOT67" index) + real(wp), optional, intent(in) :: tsi !! total solar irradiance + character(len=128) :: error_msg !! Empty if successful + ! ---------------------------------------------------------- + integer :: igpt + real(wp), parameter :: a_offset = 0.1495954_wp + real(wp), parameter :: b_offset = 0.00066696_wp + ! ---------------------------------------------------------- + error_msg = "" + if(mg_index < 0._wp) error_msg = 'mg_index out of range' + if(sb_index < 0._wp) error_msg = 'sb_index out of range' + if(error_msg /= "") return + ! + ! Calculate solar source function for provided facular and sunspot indices + ! + !$acc parallel loop + !$omp target teams distribute parallel do simd + do igpt = 1, size(this%solar_source_quiet) + this%solar_source(igpt) = this%solar_source_quiet(igpt) + & + (mg_index - a_offset) * this%solar_source_facular(igpt) + & + (sb_index - b_offset) * this%solar_source_sunspot(igpt) + end do + ! + ! Scale solar source to input TSI value + ! + if (present(tsi)) error_msg = this%set_tsi(tsi) + + end function set_solar_variability + !------------------------------------------------------------------------------------------ + function set_tsi(this, tsi) result(error_msg) + ! + !> Scale the solar source function without changing the spectral distribution + ! + class(ty_gas_optics_rrtmgp), intent(inout) :: this + real(wp), intent(in ) :: tsi !! user-specified total solar irradiance; + character(len=128) :: error_msg !! Empty if successful + + real(wp) :: norm + ! ---------------------------------------------------------- + error_msg = "" + if(tsi < 0._wp) then + error_msg = 'tsi out of range' + else + ! + ! Scale the solar source function to the input tsi + ! + !$acc kernels + !$omp target + norm = 1._wp/sum(this%solar_source(:)) + this%solar_source(:) = this%solar_source(:) * tsi * norm + !$acc end kernels + !$omp end target + end if + + end function set_tsi + !------------------------------------------------------------------------------------------ + ! + ! Compute Planck source functions at layer centers and levels + ! + function source(this, & + ncol, nlay, nbnd, ngpt, & + play, plev, tlay, tsfc, & + jtemp, jpress, jeta, tropo, fmajor, & + sources, & ! Planck sources + tlev) & ! optional input + result(error_msg) + ! inputs + class(ty_gas_optics_rrtmgp), intent(in ) :: this + integer, intent(in ) :: ncol, nlay, nbnd, ngpt + real(wp), dimension(ncol,nlay), intent(in ) :: play ! layer pressures [Pa, mb] + real(wp), dimension(ncol,nlay+1), intent(in ) :: plev ! level pressures [Pa, mb] + real(wp), dimension(ncol,nlay), intent(in ) :: tlay ! layer temperatures [K] + real(wp), dimension(ncol), intent(in ) :: tsfc ! surface skin temperatures [K] + ! Interplation coefficients + integer, dimension(ncol,nlay), intent(in ) :: jtemp, jpress + integer, dimension(ncol,nlay), intent(in ) :: tropo + real(wp), dimension(2,2,2,ncol,nlay,get_nflav(this)), & + intent(in ) :: fmajor + integer, dimension(2, ncol,nlay,get_nflav(this)), & + intent(in ) :: jeta + class(ty_source_func_lw ), intent(inout) :: sources + real(wp), dimension(ncol,nlay+1), intent(in ), & + optional, target :: tlev ! level temperatures [K] + character(len=128) :: error_msg + ! ---------------------------------------------------------- + logical(wl) :: top_at_1 + integer :: icol, ilay + ! Variables for temperature at layer edges [K] (ncol, nlay+1) + real(wp), dimension( ncol,nlay+1), target :: tlev_arr + real(wp), dimension(:,:), pointer :: tlev_wk + ! ---------------------------------------------------------- + error_msg = "" + ! + ! Source function needs temperature at interfaces/levels and at layer centers + ! + if (present(tlev)) then + ! Users might have provided these + tlev_wk => tlev + else + tlev_wk => tlev_arr + ! + ! Interpolate temperature to levels if not provided + ! Interpolation and extrapolation at boundaries is weighted by pressure + ! + do icol = 1, ncol + tlev_arr(icol,1) = tlay(icol,1) & + + (plev(icol,1)-play(icol,1))*(tlay(icol,2)-tlay(icol,1)) & + & / (play(icol,2)-play(icol,1)) + end do + do ilay = 2, nlay + do icol = 1, ncol + tlev_arr(icol,ilay) = (play(icol,ilay-1)*tlay(icol,ilay-1)*(plev(icol,ilay )-play(icol,ilay)) & + + play(icol,ilay )*tlay(icol,ilay )*(play(icol,ilay-1)-plev(icol,ilay))) / & + (plev(icol,ilay)*(play(icol,ilay-1) - play(icol,ilay))) + end do + end do + do icol = 1, ncol + tlev_arr(icol,nlay+1) = tlay(icol,nlay) & + + (plev(icol,nlay+1)-play(icol,nlay))*(tlay(icol,nlay)-tlay(icol,nlay-1)) & + / (play(icol,nlay)-play(icol,nlay-1)) + end do + end if + + !------------------------------------------------------------------- + ! Compute internal (Planck) source functions at layers and levels, + ! which depend on mapping from spectral space that creates k-distribution. + !$acc data copyin(sources) copyout( sources%lay_source, sources%lev_source_inc, sources%lev_source_dec) & + !$acc copyout( sources%sfc_source, sources%sfc_source_Jac) + !$omp target data map(from:sources%lay_source, sources%lev_source_inc, sources%lev_source_dec) & + !$omp map(from:sources%sfc_source, sources%sfc_source_Jac) + + !$acc kernels copyout(top_at_1) + !$omp target map(from:top_at_1) + top_at_1 = play(1,1) < play(1, nlay) + !$acc end kernels + !$omp end target + + call compute_Planck_source(ncol, nlay, nbnd, ngpt, & + get_nflav(this), this%get_neta(), this%get_npres(), this%get_ntemp(), this%get_nPlanckTemp(), & + tlay, tlev_wk, tsfc, merge(nlay, 1, top_at_1), & + fmajor, jeta, tropo, jtemp, jpress, & + this%get_gpoint_bands(), this%get_band_lims_gpoint(), this%planck_frac, this%temp_ref_min,& + this%totplnk_delta, this%totplnk, this%gpoint_flavor, & + sources%sfc_source, sources%lay_source, sources%lev_source_inc, sources%lev_source_dec, & + sources%sfc_source_Jac) + !$acc end data + !$omp end target data + end function source + !-------------------------------------------------------------------------------------------------------------------- + ! + ! Initialization + ! + !-------------------------------------------------------------------------------------------------------------------- + ! Initialize object based on data read from netCDF file however the user desires. + ! Rayleigh scattering tables may or may not be present; this is indicated with allocation status + ! This interface is for the internal-sources object -- includes Plank functions and fractions + ! + function load_int(this, available_gases, gas_names, key_species, & + band2gpt, band_lims_wavenum, & + press_ref, press_ref_trop, temp_ref, & + temp_ref_p, temp_ref_t, vmr_ref, & + kmajor, kminor_lower, kminor_upper, & + gas_minor,identifier_minor, & + minor_gases_lower, minor_gases_upper, & + minor_limits_gpt_lower, minor_limits_gpt_upper, & + minor_scales_with_density_lower, & + minor_scales_with_density_upper, & + scaling_gas_lower, scaling_gas_upper, & + scale_by_complement_lower, & + scale_by_complement_upper, & + kminor_start_lower, & + kminor_start_upper, & + totplnk, planck_frac, & + rayl_lower, rayl_upper, & + optimal_angle_fit) result(err_message) + class(ty_gas_optics_rrtmgp), intent(inout) :: this + class(ty_gas_concs), intent(in ) :: available_gases ! Which gases does the host model have available? + character(len=*), dimension(:), intent(in ) :: gas_names + integer, dimension(:,:,:), intent(in ) :: key_species + integer, dimension(:,:), intent(in ) :: band2gpt + real(wp), dimension(:,:), intent(in ) :: band_lims_wavenum + real(wp), dimension(:), intent(in ) :: press_ref, temp_ref + real(wp), intent(in ) :: press_ref_trop, temp_ref_p, temp_ref_t + real(wp), dimension(:,:,:), intent(in ) :: vmr_ref + real(wp), dimension(:,:,:,:), intent(in ) :: kmajor + real(wp), dimension(:,:,:), intent(in ) :: kminor_lower, kminor_upper + real(wp), dimension(:,:), intent(in ) :: totplnk + real(wp), dimension(:,:,:,:), intent(in ) :: planck_frac + real(wp), dimension(:,:,:), intent(in ), & + allocatable :: rayl_lower, rayl_upper + real(wp), dimension(:,:), intent(in ) :: optimal_angle_fit + character(len=*), dimension(:), intent(in ) :: gas_minor,identifier_minor + character(len=*), dimension(:), intent(in ) :: minor_gases_lower, & + minor_gases_upper + integer, dimension(:,:), intent(in ) :: minor_limits_gpt_lower, & + minor_limits_gpt_upper + integer, dimension(:), intent(in ) :: minor_scales_with_density_lower, & + minor_scales_with_density_upper + character(len=*), dimension(:), intent(in ) :: scaling_gas_lower, & + scaling_gas_upper + integer, dimension(:), intent(in ) :: scale_by_complement_lower,& + scale_by_complement_upper + integer, dimension(:), intent(in ) :: kminor_start_lower,& + kminor_start_upper + character(len = 128) :: err_message + ! ---- + !$acc enter data copyin(this) + call this%finalize() + err_message = init_abs_coeffs(this, & + available_gases, & + gas_names, key_species, & + band2gpt, band_lims_wavenum, & + press_ref, temp_ref, & + press_ref_trop, temp_ref_p, temp_ref_t, & + vmr_ref, & + kmajor, kminor_lower, kminor_upper, & + gas_minor,identifier_minor,& + minor_gases_lower, minor_gases_upper, & + minor_limits_gpt_lower, & + minor_limits_gpt_upper, & + minor_scales_with_density_lower, & + minor_scales_with_density_upper, & + scaling_gas_lower, scaling_gas_upper, & + scale_by_complement_lower, & + scale_by_complement_upper, & + kminor_start_lower, & + kminor_start_upper, & + rayl_lower, rayl_upper) + ! Planck function tables + ! + allocate(this%totplnk (size(totplnk, 1), size(totplnk, 2)), & + this%planck_frac (size(planck_frac,4), size(planck_frac,2),size(planck_frac,3), size(planck_frac,1)), & + this%optimal_angle_fit(size(optimal_angle_fit, 1), size(optimal_angle_fit, 2))) + this%totplnk = totplnk +! this%planck_frac = planck_frac + this%planck_frac = RESHAPE(planck_frac,(/size(planck_frac,4), size(planck_frac,2), & + size(planck_frac,3), size(planck_frac,1)/),ORDER =(/4,2,3,1/)) + this%optimal_angle_fit = optimal_angle_fit + !$acc enter data copyin(this%totplnk, this%planck_frac, this%optimal_angle_fit) + !$omp target enter data map(to:this%totplnk, this%planck_frac, this%optimal_angle_fit) + + ! Temperature steps for Planck function interpolation + ! Assumes that temperature minimum and max are the same for the absorption coefficient grid and the + ! Planck grid and the Planck grid is equally spaced + this%totplnk_delta = (this%temp_ref_max-this%temp_ref_min) / (size(this%totplnk,dim=1)-1) + end function load_int + + !-------------------------------------------------------------------------------------------------------------------- + ! + ! Initialize object based on data read from netCDF file however the user desires. + ! Rayleigh scattering tables may or may not be present; this is indicated with allocation status + ! This interface is for the external-sources object -- includes TOA source function table + ! + function load_ext(this, available_gases, gas_names, key_species, & + band2gpt, band_lims_wavenum, & + press_ref, press_ref_trop, temp_ref, & + temp_ref_p, temp_ref_t, vmr_ref, & + kmajor, kminor_lower, kminor_upper, & + gas_minor,identifier_minor, & + minor_gases_lower, minor_gases_upper, & + minor_limits_gpt_lower, minor_limits_gpt_upper, & + minor_scales_with_density_lower, & + minor_scales_with_density_upper, & + scaling_gas_lower, scaling_gas_upper, & + scale_by_complement_lower, & + scale_by_complement_upper, & + kminor_start_lower, & + kminor_start_upper, & + solar_quiet, solar_facular, solar_sunspot, & + tsi_default, mg_default, sb_default, & + rayl_lower, rayl_upper) result(err_message) + + use mem_radiate, only:irce,rce_solc + + class(ty_gas_optics_rrtmgp), intent(inout) :: this + class(ty_gas_concs), intent(in ) :: available_gases ! Which gases does the host model have available? + character(len=*), & + dimension(:), intent(in) :: gas_names + integer, dimension(:,:,:), intent(in) :: key_species + integer, dimension(:,:), intent(in) :: band2gpt + real(wp), dimension(:,:), intent(in) :: band_lims_wavenum + real(wp), dimension(:), intent(in) :: press_ref, temp_ref + real(wp), intent(in) :: press_ref_trop, temp_ref_p, temp_ref_t + real(wp), dimension(:,:,:), intent(in) :: vmr_ref + real(wp), dimension(:,:,:,:), intent(in) :: kmajor + real(wp), dimension(:,:,:), intent(in) :: kminor_lower, kminor_upper + character(len=*), dimension(:), & + intent(in) :: gas_minor, & + identifier_minor + character(len=*), dimension(:), & + intent(in) :: minor_gases_lower, & + minor_gases_upper + integer, dimension(:,:), intent(in) :: & + minor_limits_gpt_lower, & + minor_limits_gpt_upper + integer, dimension(:), intent(in) :: & + minor_scales_with_density_lower, & + minor_scales_with_density_upper + character(len=*),dimension(:),intent(in) :: & + scaling_gas_lower, & + scaling_gas_upper + integer, dimension(:), intent(in) :: & + scale_by_complement_lower, & + scale_by_complement_upper + integer, dimension(:), intent(in) :: & + kminor_start_lower, & + kminor_start_upper + real(wp), dimension(:), intent(in) :: solar_quiet, & + solar_facular, & + solar_sunspot + real(wp), intent(in) :: tsi_default, & + mg_default, sb_default + real(wp), dimension(:,:,:), intent(in), & + allocatable :: rayl_lower, rayl_upper + character(len = 128) err_message + + integer :: ngpt + ! ---- + !$acc enter data copyin(this) + call this%finalize() + err_message = init_abs_coeffs(this, & + available_gases, & + gas_names, key_species, & + band2gpt, band_lims_wavenum, & + press_ref, temp_ref, & + press_ref_trop, temp_ref_p, temp_ref_t, & + vmr_ref, & + kmajor, kminor_lower, kminor_upper, & + gas_minor,identifier_minor, & + minor_gases_lower, minor_gases_upper, & + minor_limits_gpt_lower, & + minor_limits_gpt_upper, & + minor_scales_with_density_lower, & + minor_scales_with_density_upper, & + scaling_gas_lower, scaling_gas_upper, & + scale_by_complement_lower, & + scale_by_complement_upper, & + kminor_start_lower, & + kminor_start_upper, & + rayl_lower, rayl_upper) + if(err_message == "") then + ! + ! Spectral solar irradiance terms init + ! + ngpt = size(solar_quiet) + allocate(this%solar_source_quiet(ngpt), this%solar_source_facular(ngpt), & + this%solar_source_sunspot(ngpt), this%solar_source(ngpt)) + !$acc enter data create( this%solar_source_quiet, this%solar_source_facular, this%solar_source_sunspot, this%solar_source) + !$omp target enter data map(alloc:this%solar_source_quiet, this%solar_source_facular, this%solar_source_sunspot, this%solar_source) + !$acc kernels + !$omp target + this%solar_source_quiet = solar_quiet + this%solar_source_facular = solar_facular + this%solar_source_sunspot = solar_sunspot + !$acc end kernels + !$omp end target + + if (irce == 1) then + err_message = this%set_solar_variability(mg_default, sb_default, rce_solc) + else + err_message = this%set_solar_variability(mg_default, sb_default) + endif + + endif + end function load_ext + !-------------------------------------------------------------------------------------------------------------------- + ! + ! Initialize absorption coefficient arrays, + ! including Rayleigh scattering tables if provided (allocated) + ! + function init_abs_coeffs(this, & + available_gases, & + gas_names, key_species, & + band2gpt, band_lims_wavenum, & + press_ref, temp_ref, & + press_ref_trop, temp_ref_p, temp_ref_t, & + vmr_ref, & + kmajor, kminor_lower, kminor_upper, & + gas_minor,identifier_minor,& + minor_gases_lower, minor_gases_upper, & + minor_limits_gpt_lower, & + minor_limits_gpt_upper, & + minor_scales_with_density_lower, & + minor_scales_with_density_upper, & + scaling_gas_lower, scaling_gas_upper, & + scale_by_complement_lower, & + scale_by_complement_upper, & + kminor_start_lower, & + kminor_start_upper, & + rayl_lower, rayl_upper) result(err_message) + class(ty_gas_optics_rrtmgp), intent(inout) :: this + class(ty_gas_concs), intent(in ) :: available_gases + character(len=*), & + dimension(:), intent(in) :: gas_names + integer, dimension(:,:,:), intent(in) :: key_species + integer, dimension(:,:), intent(in) :: band2gpt + real(wp), dimension(:,:), intent(in) :: band_lims_wavenum + real(wp), dimension(:), intent(in) :: press_ref, temp_ref + real(wp), intent(in) :: press_ref_trop, temp_ref_p, temp_ref_t + real(wp), dimension(:,:,:), intent(in) :: vmr_ref + real(wp), dimension(:,:,:,:), intent(in) :: kmajor + real(wp), dimension(:,:,:), intent(in) :: kminor_lower, kminor_upper + character(len=*), dimension(:), & + intent(in) :: gas_minor, & + identifier_minor + character(len=*), dimension(:), & + intent(in) :: minor_gases_lower, & + minor_gases_upper + integer, dimension(:,:), intent(in) :: minor_limits_gpt_lower, & + minor_limits_gpt_upper + integer, dimension(:), intent(in) :: minor_scales_with_density_lower, & + minor_scales_with_density_upper + character(len=*), dimension(:),& + intent(in) :: scaling_gas_lower, & + scaling_gas_upper + integer, dimension(:), intent(in) :: scale_by_complement_lower, & + scale_by_complement_upper + integer, dimension(:), intent(in) :: kminor_start_lower, & + kminor_start_upper + real(wp), dimension(:,:,:), intent(in), & + allocatable :: rayl_lower, rayl_upper + character(len=128) :: err_message + ! -------------------------------------------------------------------------- + logical, dimension(:), allocatable :: gas_is_present + logical, dimension(:), allocatable :: key_species_present_init + integer, dimension(:,:,:), allocatable :: key_species_red + real(wp), dimension(:,:,:), allocatable :: vmr_ref_red + character(len=256), & + dimension(:), allocatable :: minor_gases_lower_red, & + minor_gases_upper_red + character(len=256), & + dimension(:), allocatable :: scaling_gas_lower_red, & + scaling_gas_upper_red + integer :: i, j, idx + integer :: ngas + ! -------------------------------------- + err_message = this%ty_optical_props%init(band_lims_wavenum, band2gpt) + if(len_trim(err_message) /= 0) return + ! + ! Which gases known to the gas optics are present in the host model (available_gases)? + ! + ngas = size(gas_names) + allocate(gas_is_present(ngas)) + do i = 1, ngas + ! Next line causes a compiler bug in gfortran 11.0.1 on Mac ARM + ! Should replace gas_names with get_gas_names() and make gas_names private in ty_gas_concs + gas_is_present(i) = string_in_array(gas_names(i), available_gases%gas_names) + end do + ! + ! Now the number of gases is the union of those known to the k-distribution and provided + ! by the host model + ! + ngas = count(gas_is_present) + ! + ! Initialize the gas optics object, keeping only those gases known to the + ! gas optics and also present in the host model + ! + this%gas_names = pack(gas_names,mask=gas_is_present) + ! Copy-ins below + + allocate(vmr_ref_red(size(vmr_ref,dim=1),0:ngas, & + size(vmr_ref,dim=3))) + ! Gas 0 is used in single-key species method, set to 1.0 (col_dry) + vmr_ref_red(:,0,:) = vmr_ref(:,1,:) + do i = 1, ngas + idx = string_loc_in_array(this%gas_names(i), gas_names) + vmr_ref_red(:,i,:) = vmr_ref(:,idx+1,:) + enddo + call move_alloc(vmr_ref_red, this%vmr_ref) + !$acc enter data copyin(this%vmr_ref, this%gas_names) + !$omp target enter data map(to:this%vmr_ref, this%gas_names) + ! + ! Reduce minor arrays so variables only contain minor gases that are available + ! Reduce size of minor Arrays + ! + call reduce_minor_arrays(available_gases, & + gas_minor,identifier_minor, & + kminor_lower, & + minor_gases_lower, & + minor_limits_gpt_lower, & + minor_scales_with_density_lower, & + scaling_gas_lower, & + scale_by_complement_lower, & + kminor_start_lower, & + this%kminor_lower, & + minor_gases_lower_red, & + this%minor_limits_gpt_lower, & + this%minor_scales_with_density_lower, & + scaling_gas_lower_red, & + this%scale_by_complement_lower, & + this%kminor_start_lower) + call reduce_minor_arrays(available_gases, & + gas_minor,identifier_minor,& + kminor_upper, & + minor_gases_upper, & + minor_limits_gpt_upper, & + minor_scales_with_density_upper, & + scaling_gas_upper, & + scale_by_complement_upper, & + kminor_start_upper, & + this%kminor_upper, & + minor_gases_upper_red, & + this%minor_limits_gpt_upper, & + this%minor_scales_with_density_upper, & + scaling_gas_upper_red, & + this%scale_by_complement_upper, & + this%kminor_start_upper) + !$acc enter data copyin(this%minor_limits_gpt_lower, this%minor_limits_gpt_upper) + !$omp target enter data map(to:this%minor_limits_gpt_lower, this%minor_limits_gpt_upper) + !$acc enter data copyin(this%minor_scales_with_density_lower, this%minor_scales_with_density_upper) + !$omp target enter data map(to:this%minor_scales_with_density_lower, this%minor_scales_with_density_upper) + !$acc enter data copyin(this%scale_by_complement_lower, this%scale_by_complement_upper) + !$omp target enter data map(to:this%scale_by_complement_lower, this%scale_by_complement_upper) + !$acc enter data copyin(this%kminor_start_lower, this%kminor_start_upper) + !$omp target enter data map(to:this%kminor_start_lower, this%kminor_start_upper) + !$acc enter data copyin(this%kminor_lower, this%kminor_upper) + !$omp target enter data map(to:this%kminor_lower, this%kminor_upper) + + ! Arrays not reduced by the presence, or lack thereof, of a gas + allocate(this%press_ref(size(press_ref)), this%temp_ref(size(temp_ref)), & + this%kmajor(size(kmajor,4),size(kmajor,2),size(kmajor,3),size(kmajor,1))) + this%press_ref(:) = press_ref(:) + this%temp_ref(:) = temp_ref(:) + this%kmajor = RESHAPE(kmajor,(/size(kmajor,4),size(kmajor,2),size(kmajor,3),size(kmajor,1)/), ORDER= (/4,2,3,1/)) + !$acc enter data copyin(this%press_ref, this%temp_ref, this%kmajor) + !$omp target enter data map(to:this%press_ref, this%temp_ref, this%kmajor) + + + if(allocated(rayl_lower) .neqv. allocated(rayl_upper)) then + err_message = "rayl_lower and rayl_upper must have the same allocation status" + return + end if + if (allocated(rayl_lower)) then + allocate(this%krayl(size(rayl_lower,dim=3),size(rayl_lower,dim=2),size(rayl_lower,dim=1),2)) + this%krayl(:,:,:,1) = RESHAPE(rayl_lower,(/size(rayl_lower,dim=3),size(rayl_lower,dim=2), & + size(rayl_lower,dim=1)/),ORDER =(/3,2,1/)) + this%krayl(:,:,:,2) = RESHAPE(rayl_upper,(/size(rayl_lower,dim=3),size(rayl_lower,dim=2), & + size(rayl_lower,dim=1)/),ORDER =(/3,2,1/)) + !$acc enter data copyin(this%krayl) + !$omp target enter data map(to:this%krayl) + end if + + ! ---- post processing ---- + ! creates log reference pressure + allocate(this%press_ref_log(size(this%press_ref))) + this%press_ref_log(:) = log(this%press_ref(:)) + !$acc enter data copyin(this%press_ref_log) + !$omp target enter data map(to:this%press_ref_log) + + ! log scale of reference pressure + this%press_ref_trop_log = log(press_ref_trop) + + ! Get index of gas (if present) for determining col_gas + call create_idx_minor(this%gas_names, gas_minor, identifier_minor, minor_gases_lower_red, this%idx_minor_lower) + call create_idx_minor(this%gas_names, gas_minor, identifier_minor, minor_gases_upper_red, this%idx_minor_upper) + ! Get index of gas (if present) that has special treatment in density scaling + call create_idx_minor_scaling(this%gas_names, scaling_gas_lower_red, this%idx_minor_scaling_lower) + call create_idx_minor_scaling(this%gas_names, scaling_gas_upper_red, this%idx_minor_scaling_upper) + !$acc enter data copyin(this%idx_minor_lower, this%idx_minor_upper) + !$omp target enter data map(to:this%idx_minor_lower, this%idx_minor_upper) + !$acc enter data copyin(this%idx_minor_scaling_lower, this%idx_minor_scaling_upper) + !$omp target enter data map(to:this%idx_minor_scaling_lower, this%idx_minor_scaling_upper) + + ! create flavor list + ! Reduce (remap) key_species list; checks that all key gases are present in incoming + call create_key_species_reduce(gas_names,this%gas_names, & + key_species,key_species_red,key_species_present_init) + err_message = check_key_species_present_init(gas_names,key_species_present_init) + if(len_trim(err_message) /= 0) return + ! create flavor list + call create_flavor(key_species_red, this%flavor) + ! create gpoint_flavor list + call create_gpoint_flavor(key_species_red, this%get_gpoint_bands(), this%flavor, this%gpoint_flavor) + !Copy-ins at end of subroutine + + ! minimum, maximum reference temperature, pressure -- assumes low-to-high ordering + ! for T, high-to-low ordering for p + this%temp_ref_min = this%temp_ref (1) + this%temp_ref_max = this%temp_ref (size(this%temp_ref)) + this%press_ref_min = this%press_ref(size(this%press_ref)) + this%press_ref_max = this%press_ref(1) + + ! creates press_ref_log, temp_ref_delta + this%press_ref_log_delta = (log(this%press_ref_min)-log(this%press_ref_max))/(size(this%press_ref)-1) + this%temp_ref_delta = (this%temp_ref_max-this%temp_ref_min)/(size(this%temp_ref)-1) + + ! Which species are key in one or more bands? + ! this%flavor is an index into this%gas_names + ! + if (allocated(this%is_key)) deallocate(this%is_key) ! Shouldn't ever happen... + allocate(this%is_key(this%get_ngas())) + this%is_key(:) = .False. + do j = 1, size(this%flavor, 2) + do i = 1, size(this%flavor, 1) ! extents should be 2 + if (this%flavor(i,j) /= 0) this%is_key(this%flavor(i,j)) = .true. + end do + end do + !$acc enter data copyin(this%flavor, this%gpoint_flavor, this%is_key) + !$omp target enter data map(to:this%flavor, this%gpoint_flavor, this%is_key) + + end function init_abs_coeffs + ! ---------------------------------------------------------------------------------------------------- + function check_key_species_present_init(gas_names, key_species_present_init) result(err_message) + logical, dimension(:), intent(in) :: key_species_present_init + character(len=*), dimension(:), intent(in) :: gas_names + character(len=128) :: err_message + + integer :: i + + err_message='' + do i = 1, size(key_species_present_init) + if(.not. key_species_present_init(i)) & + err_message = ' ' // trim(gas_names(i)) // trim(err_message) + end do + if(len_trim(err_message) > 0) err_message = "gas_optics: required gases" // trim(err_message) // " are not provided" + + end function check_key_species_present_init + !------------------------------------------------------------------------------------------ + ! + ! Ensure that every key gas required by the k-distribution is + ! present in the gas concentration object + ! + function check_key_species_present(this, gas_desc) result(error_msg) + class(ty_gas_optics_rrtmgp), intent(in) :: this + class(ty_gas_concs), intent(in) :: gas_desc + character(len=128) :: error_msg + + ! Local variables + character(len=32), dimension(count(this%is_key(:) )) :: key_gas_names + integer :: igas + ! -------------------------------------- + error_msg = "" + key_gas_names = pack(this%gas_names, mask=this%is_key) + do igas = 1, size(key_gas_names) + ! Next line causes a compiler bug in gfortran 11.0.1 on Mac ARM + ! Should replace gas_names with get_gas_names() and make gas_names private in ty_gas_concs + if(.not. string_in_array(key_gas_names(igas), gas_desc%gas_names)) & + error_msg = ' ' // trim(lower_case(key_gas_names(igas))) // trim(error_msg) + end do + if(len_trim(error_msg) > 0) error_msg = "gas_optics: required gases" // trim(error_msg) // " are not provided" + + end function check_key_species_present + !-------------------------------------------------------------------------------------------------------------------- + ! + ! Inquiry functions + ! + !-------------------------------------------------------------------------------------------------------------------- + ! + !> return true if initialized for internal sources/longwave, false otherwise + ! + pure function source_is_internal(this) + class(ty_gas_optics_rrtmgp), intent(in) :: this + logical :: source_is_internal + source_is_internal = allocated(this%totplnk) .and. allocated(this%planck_frac) + end function source_is_internal + !-------------------------------------------------------------------------------------------------------------------- + ! + !> return true if initialized for external sources/shortwave, false otherwise + ! + pure function source_is_external(this) + class(ty_gas_optics_rrtmgp), intent(in) :: this + logical :: source_is_external + source_is_external = allocated(this%solar_source) + end function source_is_external + + !-------------------------------------------------------------------------------------------------------------------- + ! + !> return the names of the gases known to the k-distributions + ! + pure function get_gases(this) + class(ty_gas_optics_rrtmgp), intent(in) :: this + character(32), dimension(get_ngas(this)) :: get_gases !! names of the gases known to the k-distributions + + get_gases = this%gas_names + end function get_gases + !-------------------------------------------------------------------------------------------------------------------- + ! + !> return the minimum pressure on the interpolation grids + ! + pure function get_press_min(this) + class(ty_gas_optics_rrtmgp), intent(in) :: this + real(wp) :: get_press_min !! minimum pressure for which the k-dsitribution is valid + + get_press_min = this%press_ref_min + end function get_press_min + + !-------------------------------------------------------------------------------------------------------------------- + ! + !> return the maximum pressure on the interpolation grids + ! + pure function get_press_max(this) + class(ty_gas_optics_rrtmgp), intent(in) :: this + real(wp) :: get_press_max !! maximum pressure for which the k-dsitribution is valid + + get_press_max = this%press_ref_max + end function get_press_max + + !-------------------------------------------------------------------------------------------------------------------- + ! + !> return the minimum temparature on the interpolation grids + ! + pure function get_temp_min(this) + class(ty_gas_optics_rrtmgp), intent(in) :: this + real(wp) :: get_temp_min !! minimum temperature for which the k-dsitribution is valid + + get_temp_min = this%temp_ref_min + end function get_temp_min + + !-------------------------------------------------------------------------------------------------------------------- + ! + !> return the maximum temparature on the interpolation grids + ! + pure function get_temp_max(this) + class(ty_gas_optics_rrtmgp), intent(in) :: this + real(wp) :: get_temp_max !! maximum temperature for which the k-dsitribution is valid + + get_temp_max = this%temp_ref_max + end function get_temp_max + !-------------------------------------------------------------------------------------------------------------------- + ! + !> Utility function, provided for user convenience + !> computes column amounts of dry air using hydrostatic equation + ! + function get_col_dry(vmr_h2o, plev, latitude) result(col_dry) + ! input + real(wp), dimension(:,:), intent(in) :: vmr_h2o ! volume mixing ratio of water vapor to dry air; (ncol,nlay) + real(wp), dimension(:,:), intent(in) :: plev ! Layer boundary pressures [Pa] (ncol,nlay+1) + real(wp), dimension(:), optional, & + intent(in) :: latitude ! Latitude [degrees] (ncol) + ! output + real(wp), dimension(size(plev,dim=1),size(plev,dim=2)-1) :: col_dry ! Column dry amount (ncol,nlay) + ! ------------------------------------------------ + ! first and second term of Helmert formula + real(wp), parameter :: helmert1 = 9.80665_wp + real(wp), parameter :: helmert2 = 0.02586_wp + ! local variables + real(wp), dimension(size(plev,dim=1)) :: g0 ! (ncol) + real(wp):: delta_plev, m_air, fact + integer :: ncol, nlev + integer :: icol, ilev ! nlay = nlev-1 + ! ------------------------------------------------ + ncol = size(plev, dim=1) + nlev = size(plev, dim=2) + !$acc data create(g0) + !$omp target data map(alloc:g0) + if(present(latitude)) then + ! A purely OpenACC implementation would probably compute g0 within the kernel below + !$acc parallel loop + !$omp target teams distribute parallel do simd + do icol = 1, ncol + g0(icol) = helmert1 - helmert2 * cos(2.0_wp * pi * latitude(icol) / 180.0_wp) ! acceleration due to gravity [m/s^2] + end do + else + !$acc parallel loop + !$omp target teams distribute parallel do simd + do icol = 1, ncol + g0(icol) = grav + end do + end if + + !$acc parallel loop gang vector collapse(2) copyin(plev,vmr_h2o) copyout(col_dry) + !$omp target teams distribute parallel do simd collapse(2) map(to:plev,vmr_h2o) map(from:col_dry) + do ilev = 1, nlev-1 + do icol = 1, ncol + delta_plev = abs(plev(icol,ilev) - plev(icol,ilev+1)) + ! Get average mass of moist air per mole of moist air + fact = 1._wp / (1.+vmr_h2o(icol,ilev)) + m_air = (m_dry + m_h2o * vmr_h2o(icol,ilev)) * fact + col_dry(icol,ilev) = 10._wp * delta_plev * avogad * fact/(1000._wp*m_air*100._wp*g0(icol)) + end do + end do + !$acc end data + !$omp end target data + end function get_col_dry + !-------------------------------------------------------------------------------------------------------------------- + ! + !> Compute a transport angle that minimizes flux errors at surface and TOA based on empirical fits + ! + function compute_optimal_angles(this, optical_props, optimal_angles) result(err_msg) + ! input + class(ty_gas_optics_rrtmgp), intent(in ) :: this + class(ty_optical_props_arry), intent(in ) :: optical_props !! Optical properties + real(wp), dimension(:,:), intent( out) :: optimal_angles !! Secant of optical transport angle + character(len=128) :: err_msg !! Empty if successful + !---------------------------- + integer :: ncol, nlay, ngpt + integer :: icol, ilay, igpt, bnd + real(wp) :: t, trans_total +#if defined _CRAYFTN && _RELEASE_MAJOR == 14 && _RELEASE_MINOR == 0 && _RELEASE_PATCHLEVEL == 3 +# define CRAY_WORKAROUND +#endif +#ifdef CRAY_WORKAROUND + integer, allocatable :: bands(:) +#else + integer :: bands(optical_props%get_ngpt()) +#endif + !---------------------------- + ncol = optical_props%get_ncol() + nlay = optical_props%get_nlay() + ngpt = optical_props%get_ngpt() +#ifdef CRAY_WORKAROUND + allocate( bands(ngpt) ) ! In order to work with CCE 14 (it is also better software) +#endif + + err_msg="" + if(.not. this%gpoints_are_equal(optical_props)) & + err_msg = "gas_optics%compute_optimal_angles: optical_props has different spectral discretization than gas_optics" + if(.not. extents_are(optimal_angles, ncol, ngpt)) & + err_msg = "gas_optics%compute_optimal_angles: optimal_angles different dimension (ncol)" + if (err_msg /= "") return + + do igpt = 1, ngpt + bands(igpt) = optical_props%convert_gpt2band(igpt) + enddo + ! + ! column transmissivity + ! + !$acc parallel loop gang vector collapse(2) copyin(bands, optical_props, optical_props%tau) copyout(optimal_angles) + !$omp target teams distribute parallel do simd collapse(2) map(to:bands, optical_props%tau) map(from:optimal_angles) + do icol = 1, ncol + do igpt = 1, ngpt + ! + ! Column transmissivity + ! + t = 0._wp + trans_total = 0._wp + do ilay = 1, nlay + t = t + optical_props%tau(icol,ilay,igpt) + end do + trans_total = exp(-t) + ! + ! Optimal transport angle is a linear fit to column transmissivity + ! + optimal_angles(icol,igpt) = this%optimal_angle_fit(1,bands(igpt))*trans_total + & + this%optimal_angle_fit(2,bands(igpt)) + end do + end do + end function compute_optimal_angles + !-------------------------------------------------------------------------------------------------------------------- + ! + ! Internal procedures + ! + !-------------------------------------------------------------------------------------------------------------------- + pure function rewrite_key_species_pair(key_species_pair) + ! (0,0) becomes (2,2) -- because absorption coefficients for these g-points will be 0. + integer, dimension(2) :: rewrite_key_species_pair + integer, dimension(2), intent(in) :: key_species_pair + rewrite_key_species_pair = key_species_pair + if (all(key_species_pair(:).eq.(/0,0/))) then + rewrite_key_species_pair(:) = (/2,2/) + end if + end function + + ! --------------------------------------------------------------------------------------- + ! true is key_species_pair exists in key_species_list + pure function key_species_pair_exists(key_species_list, key_species_pair) + logical :: key_species_pair_exists + integer, dimension(:,:), intent(in) :: key_species_list + integer, dimension(2), intent(in) :: key_species_pair + integer :: i + do i=1,size(key_species_list,dim=2) + if (all(key_species_list(:,i).eq.key_species_pair(:))) then + key_species_pair_exists = .true. + return + end if + end do + key_species_pair_exists = .false. + end function key_species_pair_exists + ! --------------------------------------------------------------------------------------- + ! create flavor list -- + ! an unordered array of extent (2,:) containing all possible pairs of key species + ! used in either upper or lower atmos + ! + subroutine create_flavor(key_species, flavor) + integer, dimension(:,:,:), intent(in) :: key_species + integer, dimension(:,:), allocatable, intent(out) :: flavor + integer, dimension(2,size(key_species,3)*2) :: key_species_list + + integer :: ibnd, iatm, i, iflavor + ! prepare list of key_species + i = 1 + do ibnd=1,size(key_species,3) ! bands + do iatm=1,size(key_species,2) ! upper/lower atmosphere + key_species_list(:,i) = key_species(:,iatm,ibnd) + i = i + 1 + end do + end do + ! rewrite single key_species pairs + do i=1,size(key_species_list,2) + key_species_list(:,i) = rewrite_key_species_pair(key_species_list(:,i)) + end do + ! count unique key species pairs + iflavor = 0 + do i=1,size(key_species_list,2) + if (.not.key_species_pair_exists(key_species_list(:,1:i-1),key_species_list(:,i))) then + iflavor = iflavor + 1 + end if + end do + ! fill flavors + allocate(flavor(2,iflavor)) + iflavor = 0 + do i=1,size(key_species_list,2) + if (.not.key_species_pair_exists(key_species_list(:,1:i-1),key_species_list(:,i))) then + iflavor = iflavor + 1 + flavor(:,iflavor) = key_species_list(:,i) + end if + end do + end subroutine create_flavor + ! --------------------------------------------------------------------------------------- + ! + ! create index list for extracting col_gas needed for minor gas optical depth calculations + ! + subroutine create_idx_minor(gas_names, & + gas_minor, identifier_minor, minor_gases_atm, idx_minor_atm) + character(len=*), dimension(:), intent(in) :: gas_names + character(len=*), dimension(:), intent(in) :: & + gas_minor, & + identifier_minor + character(len=*), dimension(:), intent(in) :: minor_gases_atm + integer, dimension(:), allocatable, & + intent(out) :: idx_minor_atm + + ! local + integer :: imnr + integer :: idx_mnr + allocate(idx_minor_atm(size(minor_gases_atm,dim=1))) + do imnr = 1, size(minor_gases_atm,dim=1) ! loop over minor absorbers in each band + ! Find identifying string for minor species in list of possible identifiers (e.g. h2o_slf) + idx_mnr = string_loc_in_array(minor_gases_atm(imnr), identifier_minor) + ! Find name of gas associated with minor species identifier (e.g. h2o) + idx_minor_atm(imnr) = string_loc_in_array(gas_minor(idx_mnr), gas_names) + enddo + end subroutine create_idx_minor + + ! --------------------------------------------------------------------------------------- + ! + ! create index for special treatment in density scaling of minor gases + ! + subroutine create_idx_minor_scaling(gas_names, & + scaling_gas_atm, idx_minor_scaling_atm) + character(len=*), dimension(:), intent(in) :: gas_names + character(len=*), dimension(:), intent(in) :: scaling_gas_atm + integer, dimension(:), allocatable, & + intent(out) :: idx_minor_scaling_atm + + ! local + integer :: imnr + allocate(idx_minor_scaling_atm(size(scaling_gas_atm,dim=1))) + do imnr = 1, size(scaling_gas_atm,dim=1) ! loop over minor absorbers in each band + ! This will be -1 if there's no interacting gas + idx_minor_scaling_atm(imnr) = string_loc_in_array(scaling_gas_atm(imnr), gas_names) + enddo + end subroutine create_idx_minor_scaling + !-------------------------------------------------------------------------------------------------------------------- + ! Is the object ready to use? + ! + pure function is_loaded(this) + class(ty_gas_optics_rrtmgp), intent(in) :: this + logical(wl) :: is_loaded + + is_loaded = allocated(this%kmajor) + end function is_loaded + !-------------------------------------------------------------------------------------------------------------------- + ! + ! Reset the object to un-initialized state + ! + subroutine finalize(this) + class(ty_gas_optics_rrtmgp), intent(inout) :: this + real(wp), dimension(:), allocatable :: press_ref, press_ref_log, temp_ref + + if(this%is_loaded()) then + !$acc exit data delete(this%gas_names, this%vmr_ref, this%flavor) & + !$acc delete(this%gpoint_flavor, this%kmajor) & + !$acc delete(this%minor_limits_gpt_lower) & + !$acc delete(this%minor_scales_with_density_lower, this%scale_by_complement_lower) & + !$acc delete(this%idx_minor_lower, this%idx_minor_scaling_lower) & + !$acc delete(this%kminor_start_lower, this%kminor_lower) & + !$acc delete(this%minor_limits_gpt_upper) & + !$acc delete(this%minor_scales_with_density_upper, this%scale_by_complement_upper) & + !$acc delete(this%idx_minor_upper, this%idx_minor_scaling_upper) & + !$acc delete(this%kminor_start_upper, this%kminor_upper) + !$omp target exit data map(release:this%gas_names, this%vmr_ref, this%flavor) & + !$omp map(release:this%gpoint_flavor, this%kmajor) & + !$omp map(release:this%minor_limits_gpt_lower) & + !$omp map(release:this%minor_scales_with_density_lower, this%scale_by_complement_lower) & + !$omp map(release:this%idx_minor_lower, this%idx_minor_scaling_lower) & + !$omp map(release:this%kminor_start_lower, this%kminor_lower) & + !$omp map(release:this%minor_limits_gpt_upper) & + !$omp map(release:this%minor_scales_with_density_upper, this%scale_by_complement_upper) & + !$omp map(release:this%idx_minor_upper, this%idx_minor_scaling_upper) & + !$omp map(release:this%kminor_start_upper, this%kminor_upper) + deallocate(this%gas_names, this%vmr_ref, this%flavor, this%gpoint_flavor, this%kmajor) + deallocate(this%minor_limits_gpt_lower, & + this%minor_scales_with_density_lower, this%scale_by_complement_lower, & + this%idx_minor_lower, this%idx_minor_scaling_lower, this%kminor_start_lower, this%kminor_lower) + deallocate(this%minor_limits_gpt_upper, & + this%minor_scales_with_density_upper, this%scale_by_complement_upper, & + this%idx_minor_upper, this%idx_minor_scaling_upper, this%kminor_start_upper, this%kminor_upper) + + if(allocated(this%krayl)) then + !$acc exit data delete(this%krayl) + !$omp target exit data map(release:this%krayl) + deallocate(this%krayl) + end if + + if(allocated(this%planck_frac)) then + !$acc exit data delete(this%planck_frac, this%totplnk, this%optimal_angle_fit) + !$omp target exit data map(release:this%planck_frac, this%totplnk, this%optimal_angle_fit) + deallocate(this%planck_frac, this%totplnk, this%optimal_angle_fit) + end if + + if(allocated(this%solar_source)) then + !$acc exit data delete(this%solar_source, this%solar_source_quiet) & + !$acc delete(this%solar_source_facular,this%solar_source_sunspot) + !$omp target exit data map(release:this%solar_source, this%solar_source_quiet) + !$omp map(release:this%solar_source_facular,this%solar_source_sunspot) + deallocate(this%solar_source, & + this%solar_source_quiet, this%solar_source_facular, this%solar_source_sunspot) + end if + !$acc exit data delete(this) + !$omp target exit data map(release:this) + end if + + end subroutine finalize + ! --------------------------------------------------------------------------------------- + subroutine create_key_species_reduce(gas_names,gas_names_red, & + key_species,key_species_red,key_species_present_init) + character(len=*), & + dimension(:), intent(in) :: gas_names + character(len=*), & + dimension(:), intent(in) :: gas_names_red + integer, dimension(:,:,:), intent(in) :: key_species + integer, dimension(:,:,:), allocatable, intent(out) :: key_species_red + + logical, dimension(:), allocatable, intent(out) :: key_species_present_init + integer :: ip, ia, it, np, na, nt + + np = size(key_species,dim=1) + na = size(key_species,dim=2) + nt = size(key_species,dim=3) + allocate(key_species_red(size(key_species,dim=1), & + size(key_species,dim=2), & + size(key_species,dim=3))) + allocate(key_species_present_init(size(gas_names))) + key_species_present_init = .true. + + do ip = 1, np + do ia = 1, na + do it = 1, nt + if (key_species(ip,ia,it) .ne. 0) then + key_species_red(ip,ia,it) = string_loc_in_array(gas_names(key_species(ip,ia,it)),gas_names_red) + if (key_species_red(ip,ia,it) .eq. -1) key_species_present_init(key_species(ip,ia,it)) = .false. + else + key_species_red(ip,ia,it) = key_species(ip,ia,it) + endif + enddo + end do + enddo + + end subroutine create_key_species_reduce + +! --------------------------------------------------------------------------------------- + + subroutine reduce_minor_arrays(available_gases, & + gas_minor,identifier_minor,& + kminor_atm, & + minor_gases_atm, & + minor_limits_gpt_atm, & + minor_scales_with_density_atm, & + scaling_gas_atm, & + scale_by_complement_atm, & + kminor_start_atm, & + kminor_atm_red, & + minor_gases_atm_red, & + minor_limits_gpt_atm_red, & + minor_scales_with_density_atm_red, & + scaling_gas_atm_red, & + scale_by_complement_atm_red, & + kminor_start_atm_red) + + class(ty_gas_concs), intent(in) :: available_gases + real(wp), dimension(:,:,:), intent(in) :: kminor_atm + character(len=*), dimension(:), intent(in) :: gas_minor, & + identifier_minor + character(len=*), dimension(:), intent(in) :: minor_gases_atm + integer, dimension(:,:), intent(in) :: minor_limits_gpt_atm + integer, dimension(:), intent(in) :: minor_scales_with_density_atm + character(len=*), dimension(:), intent(in) :: scaling_gas_atm + integer, dimension(:), intent(in) :: scale_by_complement_atm + integer, dimension(:), intent(in) :: kminor_start_atm + real(wp), dimension(:,:,:), allocatable, & + intent(out) :: kminor_atm_red + character(len=*), dimension(:), allocatable, & + intent(out) :: minor_gases_atm_red + integer, dimension(:,:), allocatable, & + intent(out) :: minor_limits_gpt_atm_red + integer, dimension(:), allocatable, & + intent(out) ::minor_scales_with_density_atm_red + character(len=*), dimension(:), allocatable, & + intent(out) ::scaling_gas_atm_red + integer, dimension(:), allocatable, intent(out) :: & + scale_by_complement_atm_red + integer, dimension(:), allocatable, intent(out) :: & + kminor_start_atm_red + + ! Local variables + integer :: i, j, ks + integer :: idx_mnr, nm, tot_g, red_nm + integer :: icnt, n_elim, ng + logical, dimension(:), allocatable :: gas_is_present + integer, dimension(:), allocatable :: indexes + real(wp), dimension(:,:,:), allocatable :: kminor_atm_red_t + + nm = size(minor_gases_atm) + tot_g=0 + allocate(gas_is_present(nm)) + do i = 1, size(minor_gases_atm) + idx_mnr = string_loc_in_array(minor_gases_atm(i), identifier_minor) + ! Next line causes a compiler bug in gfortran 11.0.1 on Mac ARM + ! Should replace gas_names with get_gas_names() and make gas_names private in ty_gas_concs + gas_is_present(i) = string_in_array(gas_minor(idx_mnr),available_gases%gas_names) + if(gas_is_present(i)) then + tot_g = tot_g + (minor_limits_gpt_atm(2,i)-minor_limits_gpt_atm(1,i)+1) + endif + enddo + red_nm = count(gas_is_present) + + allocate(minor_gases_atm_red (red_nm),& + minor_scales_with_density_atm_red(red_nm), & + scaling_gas_atm_red (red_nm), & + scale_by_complement_atm_red (red_nm), & + kminor_start_atm_red (red_nm)) + allocate(minor_limits_gpt_atm_red(2, red_nm)) + allocate(kminor_atm_red_t(tot_g, size(kminor_atm,2), size(kminor_atm,3))) + allocate(kminor_atm_red(size(kminor_atm,3),size(kminor_atm,2),tot_g)) + + if ((red_nm .eq. nm)) then + ! Character data not allowed in OpenACC regions? + minor_gases_atm_red = minor_gases_atm + scaling_gas_atm_red = scaling_gas_atm + kminor_atm_red_t = kminor_atm + minor_limits_gpt_atm_red = minor_limits_gpt_atm + minor_scales_with_density_atm_red = minor_scales_with_density_atm + scale_by_complement_atm_red = scale_by_complement_atm + kminor_start_atm_red = kminor_start_atm + else + allocate(indexes(red_nm)) + ! Find the integer indexes for the gases that are present + indexes = pack([(i, i = 1, size(minor_gases_atm))], mask=gas_is_present) + + minor_gases_atm_red = minor_gases_atm (indexes) + scaling_gas_atm_red = scaling_gas_atm (indexes) + minor_scales_with_density_atm_red = & + minor_scales_with_density_atm(indexes) + scale_by_complement_atm_red = & + scale_by_complement_atm(indexes) + kminor_start_atm_red = kminor_start_atm (indexes) + + icnt = 0 + n_elim = 0 + do i = 1, nm + ng = minor_limits_gpt_atm(2,i)-minor_limits_gpt_atm(1,i)+1 + if(gas_is_present(i)) then + icnt = icnt + 1 + minor_limits_gpt_atm_red(1:2,icnt) = minor_limits_gpt_atm(1:2,i) + kminor_start_atm_red(icnt) = kminor_start_atm(i)-n_elim + ks = kminor_start_atm_red(icnt) + do j = 1, ng + kminor_atm_red_t(kminor_start_atm_red(icnt)+j-1,:,:) = & + kminor_atm(kminor_start_atm(i)+j-1,:,:) + enddo + else + n_elim = n_elim + ng + endif + enddo + endif + + kminor_atm_red = RESHAPE(kminor_atm_red_t,(/size(kminor_atm_red_t,dim=3), & + size(kminor_atm_red_t,dim=2),size(kminor_atm_red_t,dim=1)/), ORDER=(/3,2,1/)) + deallocate(kminor_atm_red_t) + end subroutine reduce_minor_arrays + +! --------------------------------------------------------------------------------------- + ! returns flavor index; -1 if not found + pure function key_species_pair2flavor(flavor, key_species_pair) + integer :: key_species_pair2flavor + integer, dimension(:,:), intent(in) :: flavor + integer, dimension(2), intent(in) :: key_species_pair + integer :: iflav + do iflav=1,size(flavor,2) + if (all(key_species_pair(:).eq.flavor(:,iflav))) then + key_species_pair2flavor = iflav + return + end if + end do + key_species_pair2flavor = -1 + end function key_species_pair2flavor + + ! --------------------------------------------------------------------------------------- + ! + ! create gpoint_flavor list + ! a map pointing from each g-point to the corresponding entry in the "flavor list" + ! + subroutine create_gpoint_flavor(key_species, gpt2band, flavor, gpoint_flavor) + integer, dimension(:,:,:), intent(in) :: key_species + integer, dimension(:), intent(in) :: gpt2band + integer, dimension(:,:), intent(in) :: flavor + integer, dimension(:,:), intent(out), allocatable :: gpoint_flavor + integer :: ngpt, igpt, iatm + ngpt = size(gpt2band) + allocate(gpoint_flavor(2,ngpt)) + do igpt=1,ngpt + do iatm=1,2 + gpoint_flavor(iatm,igpt) = key_species_pair2flavor( & + flavor, & + rewrite_key_species_pair(key_species(:,iatm,gpt2band(igpt))) & + ) + end do + end do + end subroutine create_gpoint_flavor + + !-------------------------------------------------------------------------------------------------------------------- + ! + ! Utility function to combine optical depths from gas absorption and Rayleigh scattering + ! (and reorder them for convenience, while we're at it) + ! + subroutine combine_abs_and_rayleigh(tau, tau_rayleigh, optical_props) + real(wp), dimension(:,:,:), intent(in ) :: tau + real(wp), dimension(:,:,:), intent(in ) :: tau_rayleigh + class(ty_optical_props_arry), intent(inout) :: optical_props + + integer :: icol, ilay, igpt, ncol, nlay, ngpt, nmom + real(wp) :: t + + ncol = size(tau, 1) + nlay = size(tau, 2) + ngpt = size(tau, 3) + select type(optical_props) + type is (ty_optical_props_1scl) + ! + ! Extinction optical depth + ! + !$acc parallel loop gang vector collapse(3) default(present) + !$omp target teams distribute parallel do simd collapse(3) + do igpt = 1, ngpt + do ilay = 1, nlay + do icol = 1, ncol + optical_props%tau(icol,ilay,igpt) = tau(icol,ilay,igpt) + & + tau_rayleigh(icol,ilay,igpt) + end do + end do + end do + ! + ! asymmetry factor or phase function moments + ! + type is (ty_optical_props_2str) + ! + ! Extinction optical depth and single scattering albedo + ! + !$acc parallel loop gang vector collapse(3) default(present) + !$omp target teams distribute parallel do simd collapse(3) + do igpt = 1, ngpt + do ilay = 1, nlay + do icol = 1, ncol + t = tau(icol,ilay,igpt) + tau_rayleigh(icol,ilay,igpt) + if(t > 2._wp * tiny(t)) then + optical_props%ssa(icol,ilay,igpt) = tau_rayleigh(icol,ilay,igpt) / t + else + optical_props%ssa(icol,ilay,igpt) = 0._wp + end if + optical_props%tau(icol,ilay,igpt) = t + end do + end do + end do + call zero_array(ncol, nlay, ngpt, optical_props%g) + type is (ty_optical_props_nstr) + ! + ! Extinction optical depth and single scattering albedo + ! + !$acc parallel loop gang vector collapse(3) default(present) + !$omp target teams distribute parallel do simd collapse(3) + do igpt = 1, ngpt + do ilay = 1, nlay + do icol = 1, ncol + t = tau(icol,ilay,igpt) + tau_rayleigh(icol,ilay,igpt) + if(t > 2._wp * tiny(t)) then + optical_props%ssa(icol,ilay,igpt) = tau_rayleigh(icol,ilay,igpt) / t + else + optical_props%ssa(icol,ilay,igpt) = 0._wp + end if + optical_props%tau(icol,ilay,igpt) = t + end do + end do + end do + nmom = size(optical_props%p, 1) + call zero_array(nmom, ncol, nlay, ngpt, optical_props%p) + if(nmom >= 2) then + !$acc parallel loop gang vector collapse(3) default(present) + !$omp target teams distribute parallel do simd collapse(3) + do igpt = 1, ngpt + do ilay = 1, nlay + do icol = 1, ncol + optical_props%p(2,icol,ilay,igpt) = 0.1_wp + end do + end do + end do + end if + end select + end subroutine combine_abs_and_rayleigh + + !-------------------------------------------------------------------------------------------------------------------- + ! Sizes of tables: pressure, temperate, eta (mixing fraction) + ! Equivalent routines for the number of gases and flavors (get_ngas(), get_nflav()) are defined above because they're + ! used in function defintions + ! Table kmajor has dimensions (ngpt, neta, npres, ntemp) + !-------------------------------------------------------------------------------------------------------------------- + ! + ! return extent of eta dimension + ! + pure function get_neta(this) + class(ty_gas_optics_rrtmgp), intent(in) :: this + integer :: get_neta + + get_neta = size(this%kmajor,dim=2) + end function + ! -------------------------------------------------------------------------------------- + ! + ! return the number of pressures in reference profile + ! absorption coefficient table is one bigger since a pressure is repeated in upper/lower atmos + ! + pure function get_npres(this) + class(ty_gas_optics_rrtmgp), intent(in) :: this + integer :: get_npres + + get_npres = size(this%kmajor,dim=3)-1 + end function get_npres + ! -------------------------------------------------------------------------------------- + ! + ! return the number of temperatures + ! + pure function get_ntemp(this) + class(ty_gas_optics_rrtmgp), intent(in) :: this + integer :: get_ntemp + + get_ntemp = size(this%kmajor,dim=1) + end function get_ntemp + ! -------------------------------------------------------------------------------------- + ! + ! return the number of temperatures for Planck function + ! + pure function get_nPlanckTemp(this) + class(ty_gas_optics_rrtmgp), intent(in) :: this + integer :: get_nPlanckTemp + + get_nPlanckTemp = size(this%totplnk,dim=1) ! dimensions are Planck-temperature, band + end function get_nPlanckTemp +end module mo_gas_optics_rrtmgp diff --git a/src/radiate/rte-rrtmgp/rrtmgp/mo_rrtmgp_constants.F90 b/src/radiate/rte-rrtmgp/rrtmgp/mo_rrtmgp_constants.F90 new file mode 100644 index 0000000..2e8547b --- /dev/null +++ b/src/radiate/rte-rrtmgp/rrtmgp/mo_rrtmgp_constants.F90 @@ -0,0 +1,69 @@ +! This code is part of RRTM for GCM Applications - Parallel (RRTMGP) +! +! Contacts: Robert Pincus and Eli Mlawer +! email: rrtmgp@aer.com +! +! Copyright 2015-, Atmospheric and Environmental Research, +! Regents of the University of Colorado, Trustees of Columbia University. All right reserved. +! +! Use and duplication is permitted under the terms of the +! BSD 3-clause license, see http://opensource.org/licenses/BSD-3-Clause +! ------------------------------------------------------------------------------------------------- +!> ## Physical and mathematical constants used in RRTMGP gas optics calculation +!> +!> If the host model in which RRTGMP is embedded has defined these constants elsewhere +!> the model definitions can be used instead by renaming. For example, +!> ```use mo_model_constants, only k_boltz => boltzman_k, ...``` +!> where the syntax is local_name => original_name +!> and all the local names need to be defined +! +!> "Constants" specific to the earth's atmosphere should also be made consistent with the +!> host model but may be changed in a call to init_constants(), normally at initialization +! ------------------------------------------------------------------------------------------------- +module mo_rrtmgp_constants + use mo_rte_kind, only: wp + public + + ! ----------------------------------------- + ! Physical constants, 2018 SI defintion of metric system + ! doi:10.1088/1681-7575/aa950a (see also https://www.nist.gov/si-redefinition/meet-constants) + ! Boltzmann constant [J/K] = [(kg m^2)/(K s^2)] + real(wp), parameter :: k_boltz = 1.380649e-23_wp + + ! molecular weight of water [kg/mol] + real(wp), parameter :: m_h2o = 0.018016_wp + + ! Avogadro's number [molec/mol] + real(wp), parameter :: avogad = 6.02214076e23_wp + + ! Universal gas constant [J/(mol K)] + real(wp), parameter :: R_univ_gconst = avogad * k_boltz + + ! ----------------------------------------- + ! + ! Constants specific to the earth's atmosphere -- changeable in init() because they + ! might be different on e.g. other planets + + ! molecular weight of dry air [kg/mol] + real(wp), protected :: m_dry = 0.028964_wp + + ! Gravity at Earth's surface [m/s2] + real(wp), protected :: grav = 9.80665_wp + + ! Specific heat at constant pressure for dry air [J/(K kg)] + real(wp), protected :: cp_dry = 1004.64_wp + +contains + ! ----------------------------------------- + subroutine init_constants(gravity, mol_weight_dry_air, heat_capacity_dry_air) + real(wp), optional, intent(in) :: gravity, mol_weight_dry_air, heat_capacity_dry_air + !! Planetary and atmospheric values used by RRTMGP in computing gas optical properties + !! Default values reflect modern Earth but these can be changed using this routine + + if(present(gravity)) grav = gravity + if(present(mol_weight_dry_air)) m_dry = mol_weight_dry_air + if(present(heat_capacity_dry_air)) cp_dry = heat_capacity_dry_air + + end subroutine init_constants + ! ----------------------------------------- +end module mo_rrtmgp_constants diff --git a/src/radiate/rte-rrtmgp/rrtmgp/mo_rrtmgp_util_string.F90 b/src/radiate/rte-rrtmgp/rrtmgp/mo_rrtmgp_util_string.F90 new file mode 100644 index 0000000..69bf97a --- /dev/null +++ b/src/radiate/rte-rrtmgp/rrtmgp/mo_rrtmgp_util_string.F90 @@ -0,0 +1,89 @@ +! This code is part of RRTM for GCM Applications - Parallel (RRTMGP) +! +! Contacts: Robert Pincus and Eli Mlawer +! email: rrtmgp@aer.com +! +! Copyright 2015-, Atmospheric and Environmental Research, +! Regents of the University of Colorado, Trustees of Columbia University. All right reserved. +! +! Use and duplication is permitted under the terms of the +! BSD 3-clause license, see http://opensource.org/licenses/BSD-3-Clause +! ------------------------------------------------------------------------------------------------- +!> +!> Routines for handling strings: +!> +!> - convert to lower case +!> - does a string exist within an array of strings? +!> - what is the location of a string with an array? +!> +! ------------------------------------------------------------------------------------------------- +module mo_rrtmgp_util_string + implicit none + private + public :: lower_case, string_in_array, string_loc_in_array + + ! List of character for case conversion + character(len=26), parameter :: LOWER_CASE_CHARS = 'abcdefghijklmnopqrstuvwxyz' + character(len=26), parameter :: UPPER_CASE_CHARS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' + +contains + ! ------------------------------------------------------------------------------------------------- + !> Convert stringo to lower case + pure function lower_case( input_string ) result( output_string ) + character(len=*), intent(in) :: input_string + character(len=len(input_string)) :: output_string + integer :: i, n + + ! Copy input string + output_string = input_string + + ! Convert case character by character + do i = 1, len(output_string) + n = index(UPPER_CASE_CHARS, output_string(i:i)) + if ( n /= 0 ) output_string(i:i) = LOWER_CASE_CHARS(n:n) + end do + end function + ! -------------------------------------------------------------------------------------- + ! + !> Is string somewhere in array? + ! + pure function string_in_array(string, array) + character(len=*), intent(in) :: string + character(len=*), dimension(:), intent(in) :: array + logical :: string_in_array + + integer :: i + character(len=len_trim(string)) :: lc_string + + string_in_array = .false. + lc_string = lower_case(trim(string)) + do i = 1, size(array) + if(lc_string == lower_case(trim(array(i)))) then + string_in_array = .true. + exit + end if + end do + end function string_in_array + ! -------------------------------------------------------------------------------------- + ! + !> what is the location of a string in an array + ! + pure function string_loc_in_array(string, array) + character(len=*), intent(in) :: string + character(len=*), dimension(:), intent(in) :: array + integer :: string_loc_in_array + + integer :: i + character(len=len_trim(string)) :: lc_string + + string_loc_in_array = -1 + lc_string = lower_case(trim(string)) + do i = 1, size(array) + if(lc_string == lower_case(trim(array(i)))) then + string_loc_in_array = i + exit + end if + end do + end function string_loc_in_array + ! -------------------------------------------------------------------------------------- +end module diff --git a/src/radiate/rte-rrtmgp/rte/kernels-openacc/mo_optical_props_kernels.F90 b/src/radiate/rte-rrtmgp/rte/kernels-openacc/mo_optical_props_kernels.F90 new file mode 100644 index 0000000..99045b4 --- /dev/null +++ b/src/radiate/rte-rrtmgp/rte/kernels-openacc/mo_optical_props_kernels.F90 @@ -0,0 +1,971 @@ +! This code is part of +! RRTM for GCM Applications - Parallel (RRTMGP) +! +! Eli Mlawer and Robert Pincus +! Andre Wehe and Jennifer Delamere +! email: rrtmgp@aer.com +! +! Copyright 2015-2016, Atmospheric and Environmental Research and +! Regents of the University of Colorado. All right reserved. +! +! Use and duplication is permitted under the terms of the +! BSD 3-clause license, see http://opensource.org/licenses/BSD-3-Clause +! ------------------------------------------------------------------------------------------------- +! +! Description: Addition of optical properties -- the first set are incremented by the second set. +! There are three possible representations of optical properties (scalar = optical depth only; +! two-stream = tau, single-scattering albedo, and asymmetry factor g, and +! n-stream = tau, ssa, and phase function moments p.) Thus we need nine routines, three for +! each choice of representation on the left hand side times three representations of the +! optical properties to be added. +! There are two sets of these nine routines. In the first the two sets of optical +! properties are defined at the same spectral resolution. There is also a set of routines +! to add properties defined at lower spectral resolution to a set defined at higher spectral +! resolution (adding properties defined by band to those defined by g-point) + +module mo_optical_props_kernels + use, intrinsic :: iso_c_binding + use mo_rte_kind, only: wp, wl + implicit none + + public + interface delta_scale_2str_kernel + module procedure delta_scale_2str_f_k, delta_scale_2str_k + end interface + + interface extract_subset + module procedure extract_subset_dim1_3d, extract_subset_dim2_4d + module procedure extract_subset_absorption_tau + end interface extract_subset + + real(wp), parameter, private :: eps = 3.0_wp*tiny(1.0_wp) +contains + ! ------------------------------------------------------------------------------------------------- + ! + ! Delta-scaling, provided only for two-stream properties at present + ! + ! ------------------------------------------------------------------------------------------------- + ! Delta-scale + ! user-provided value of f (forward scattering) + ! + subroutine delta_scale_2str_f_k(ncol, nlay, ngpt, tau, ssa, g, f) & + bind(C, name="rte_delta_scale_2str_f_k") + integer, intent(in ) :: ncol, nlay, ngpt + real(wp), dimension(ncol, nlay, ngpt), intent(inout) :: tau, ssa, g + real(wp), dimension(ncol, nlay, ngpt), intent(in ) :: f + + real(wp) :: wf + integer :: icol, ilay, igpt + ! -------------- + ! -------------- + + !$acc parallel loop collapse(3) & + !$acc& copy(ssa(:ncol,:nlay,:ngpt),tau(:ncol,:nlay,:ngpt)) & + !$acc& copyin(f(:ncol,:nlay,:ngpt)) & + !$acc& copy(g(:ncol,:nlay,:ngpt)) + !$omp target teams distribute parallel do simd collapse(3) & + !$omp& map(tofrom:ssa, tau) & + !$omp& map(to:f) & + !$omp& map(tofrom:g) + do igpt = 1, ngpt + do ilay = 1, nlay + do icol = 1, ncol + if(tau(icol,ilay,igpt) > eps) then + wf = ssa(icol,ilay,igpt) * f(icol,ilay,igpt) + tau(icol,ilay,igpt) = (1._wp - wf) * tau(icol,ilay,igpt) + ssa(icol,ilay,igpt) = (ssa(icol,ilay,igpt) - wf) / (1.0_wp - wf) + g (icol,ilay,igpt) = (g (icol,ilay,igpt) - f(icol,ilay,igpt)) / (1._wp - f(icol,ilay,igpt)) + end if + end do + end do + end do + end subroutine delta_scale_2str_f_k + ! --------------------------------- + ! Delta-scale + ! f = g*g + ! + subroutine delta_scale_2str_k(ncol, nlay, ngpt, tau, ssa, g) & + bind(C, name="rte_delta_scale_2str_k") + integer, intent(in ) :: ncol, nlay, ngpt + real(wp), dimension(ncol, nlay, ngpt), intent(inout) :: tau, ssa, g + + real(wp) :: f, wf + integer :: icol, ilay, igpt + ! -------------- + ! -------------- + + !$acc parallel loop collapse(3) & + !$acc& copy(tau(:ncol,:nlay,:ngpt),ssa(:ncol,:nlay,:ngpt),g(:ncol,:nlay,:ngpt)) + !$omp target teams distribute parallel do simd collapse(3) & + !$omp& map(tofrom:tau, ssa, g) + do igpt = 1, ngpt + do ilay = 1, nlay + do icol = 1, ncol + if(tau(icol,ilay,igpt) > eps) then + f = g (icol,ilay,igpt) * g (icol,ilay,igpt) + wf = ssa(icol,ilay,igpt) * f + tau(icol,ilay,igpt) = (1._wp - wf) * tau(icol,ilay,igpt) + ssa(icol,ilay,igpt) = (ssa(icol,ilay,igpt) - wf) / (1.0_wp - wf) + g (icol,ilay,igpt) = (g (icol,ilay,igpt) - f) / (1.0_wp - f) + end if + end do + end do + end do + + end subroutine delta_scale_2str_k + ! ------------------------------------------------------------------------------------------------- + ! + ! Addition of optical properties: the first set are incremented by the second set. + ! + ! There are three possible representations of optical properties (scalar = optical depth only; + ! two-stream = tau, single-scattering albedo, and asymmetry factor g, and + ! n-stream = tau, ssa, and phase function moments p.) Thus we need nine routines, three for + ! each choice of representation on the left hand side times three representations of the + ! optical properties to be added. + ! + ! There are two sets of these nine routines. In the first the two sets of optical + ! properties are defined at the same spectral resolution. There is also a set of routines + ! to add properties defined at lower spectral resolution to a set defined at higher spectral + ! resolution (adding properties defined by band to those defined by g-point) + ! + ! ------------------------------------------------------------------------------------------------- + subroutine increment_1scalar_by_1scalar(ncol, nlay, ngpt, & + tau1, & + tau2) bind(C, name="rte_increment_1scalar_by_1scalar") + integer, intent(in ) :: ncol, nlay, ngpt + real(wp), dimension(ncol,nlay,ngpt), intent(inout) :: tau1 + real(wp), dimension(ncol,nlay,ngpt), intent(in ) :: tau2 + + integer :: icol, ilay, igpt + ! -------------- + ! -------------- + + !$acc parallel loop collapse(3) & + !$acc& copyin(tau2(:ncol,:nlay,:ngpt)) & + !$acc& copy(tau1(:ncol,:nlay,:ngpt)) + !$omp target teams distribute parallel do simd collapse(3) & + !$omp& map(to:tau2) & + !$omp& map(tofrom:tau1) + do igpt = 1, ngpt + do ilay = 1, nlay + do icol = 1, ncol + tau1(icol,ilay,igpt) = tau1(icol,ilay,igpt) + tau2(icol,ilay,igpt) + end do + end do + end do + end subroutine increment_1scalar_by_1scalar + ! --------------------------------- + ! increment 1scalar by 2stream + subroutine increment_1scalar_by_2stream(ncol, nlay, ngpt, & + tau1, & + tau2, ssa2) bind(C, name="rte_increment_1scalar_by_2stream") + integer, intent(in ) :: ncol, nlay, ngpt + real(wp), dimension(ncol,nlay,ngpt), intent(inout) :: tau1 + real(wp), dimension(ncol,nlay,ngpt), intent(in ) :: tau2, ssa2 + + integer :: icol, ilay, igpt + ! -------------- + ! -------------- + + !$acc parallel loop collapse(3) & + !$acc& copyin(tau2(:ncol,:nlay,:ngpt)) & + !$acc& copy(tau1(:ncol,:nlay,:ngpt)) & + !$acc& copyin(ssa2(:ncol,:nlay,:ngpt)) + !$omp target teams distribute parallel do simd collapse(3) & + !$omp& map(to:tau2) & + !$omp& map(tofrom:tau1) & + !$omp& map(to:ssa2) + do igpt = 1, ngpt + do ilay = 1, nlay + do icol = 1, ncol + tau1(icol,ilay,igpt) = tau1(icol,ilay,igpt) + & + tau2(icol,ilay,igpt) * (1._wp - ssa2(icol,ilay,igpt)) + end do + end do + end do + end subroutine increment_1scalar_by_2stream + ! --------------------------------- + ! increment 1scalar by nstream + subroutine increment_1scalar_by_nstream(ncol, nlay, ngpt, & + tau1, & + tau2, ssa2) bind(C, name="rte_increment_1scalar_by_nstream") + integer, intent(in ) :: ncol, nlay, ngpt + real(wp), dimension(ncol,nlay,ngpt), intent(inout) :: tau1 + real(wp), dimension(ncol,nlay,ngpt), intent(in ) :: tau2, ssa2 + + integer :: icol, ilay, igpt + ! -------------- + ! -------------- + + !$acc parallel loop collapse(3) & + !$acc& copyin(tau2(:ncol,:nlay,:ngpt)) & + !$acc& copy(tau1(:ncol,:nlay,:ngpt)) & + !$acc& copyin(ssa2(:ncol,:nlay,:ngpt)) + !$omp target teams distribute parallel do simd collapse(3) & + !$omp& map(to:tau2) & + !$omp& map(tofrom:tau1) & + !$omp& map(to:ssa2) + do igpt = 1, ngpt + do ilay = 1, nlay + do icol = 1, ncol + tau1(icol,ilay,igpt) = tau1(icol,ilay,igpt) + & + tau2(icol,ilay,igpt) * (1._wp - ssa2(icol,ilay,igpt)) + end do + end do + end do + end subroutine increment_1scalar_by_nstream + ! --------------------------------- + ! --------------------------------- + ! increment 2stream by 1scalar + subroutine increment_2stream_by_1scalar(ncol, nlay, ngpt, & + tau1, ssa1, & + tau2) bind(C, name="rte_increment_2stream_by_1scalar") + integer, intent(in ) :: ncol, nlay, ngpt + real(wp), dimension(ncol,nlay,ngpt), intent(inout) :: tau1, ssa1 + real(wp), dimension(ncol,nlay,ngpt), intent(in ) :: tau2 + + integer :: icol, ilay, igpt + real(wp) :: tau12 + ! -------------- + ! -------------- + + !$acc parallel loop collapse(3) & + !$acc& copy(ssa1(:ncol,:nlay,:ngpt)) & + !$acc& copyin(tau2(:ncol,:nlay,:ngpt)) & + !$acc& copy(tau1(:ncol,:nlay,:ngpt)) + !$omp target teams distribute parallel do simd collapse(3) & + !$omp& map(tofrom:ssa1) & + !$omp& map(to:tau2) & + !$omp& map(tofrom:tau1) + do igpt = 1, ngpt + do ilay = 1, nlay + do icol = 1, ncol + tau12 = tau1(icol,ilay,igpt) + tau2(icol,ilay,igpt) + if(tau12 > eps) then + ssa1(icol,ilay,igpt) = tau1(icol,ilay,igpt) * ssa1(icol,ilay,igpt) / tau12 + tau1(icol,ilay,igpt) = tau12 + ! g is unchanged + end if + end do + end do + end do + end subroutine increment_2stream_by_1scalar + ! --------------------------------- + ! increment 2stream by 2stream + subroutine increment_2stream_by_2stream(ncol, nlay, ngpt, & + tau1, ssa1, g1, & + tau2, ssa2, g2) bind(C, name="rte_increment_2stream_by_2stream") + integer, intent(in ) :: ncol, nlay, ngpt + real(wp), dimension(ncol,nlay,ngpt), intent(inout) :: tau1, ssa1, g1 + real(wp), dimension(ncol,nlay,ngpt), intent(in ) :: tau2, ssa2, g2 + + integer :: icol, ilay, igpt + real(wp) :: tau12, tauscat12 + ! -------------- + ! -------------- + + !$acc parallel loop collapse(3) & + !$acc& copyin(g2(:ncol,:nlay,:ngpt)) & + !$acc& copy(ssa1(:ncol,:nlay,:ngpt)) & + !$acc& copyin(ssa2(:ncol,:nlay,:ngpt),tau2(:ncol,:nlay,:ngpt)) & + !$acc& copy(tau1(:ncol,:nlay,:ngpt),g1(:ncol,:nlay,:ngpt)) + !$omp target teams distribute parallel do simd collapse(3) & + !$omp& map(to:g2) & + !$omp& map(tofrom:ssa1) & + !$omp& map(to:ssa2, tau2) & + !$omp& map(tofrom:tau1, g1) + do igpt = 1, ngpt + do ilay = 1, nlay + do icol = 1, ncol + ! t=tau1 + tau2 + tau12 = tau1(icol,ilay,igpt) + tau2(icol,ilay,igpt) + ! w=(tau1*ssa1 + tau2*ssa2) / t + tauscat12 = tau1(icol,ilay,igpt) * ssa1(icol,ilay,igpt) + & + tau2(icol,ilay,igpt) * ssa2(icol,ilay,igpt) + if(tauscat12 > eps) then + g1(icol,ilay,igpt) = & + (tau1(icol,ilay,igpt) * ssa1(icol,ilay,igpt) * g1(icol,ilay,igpt) + & + tau2(icol,ilay,igpt) * ssa2(icol,ilay,igpt) * g2(icol,ilay,igpt)) & + / tauscat12 + ssa1(icol,ilay,igpt) = tauscat12 / tau12 + tau1(icol,ilay,igpt) = tau12 + end if + end do + end do + end do + end subroutine increment_2stream_by_2stream + ! --------------------------------- + ! increment 2stream by nstream + subroutine increment_2stream_by_nstream(ncol, nlay, ngpt, nmom2, & + tau1, ssa1, g1, & + tau2, ssa2, p2) bind(C, name="rte_increment_2stream_by_nstream") + integer, intent(in ) :: ncol, nlay, ngpt, nmom2 + real(wp), dimension(ncol,nlay,ngpt), intent(inout) :: tau1, ssa1, g1 + real(wp), dimension(ncol,nlay,ngpt), intent(in ) :: tau2, ssa2 + real(wp), dimension(nmom2, & + ncol,nlay,ngpt), intent(in ) :: p2 + + integer :: icol, ilay, igpt + real(wp) :: tau12, tauscat12 + ! -------------- + ! -------------- + + !$acc parallel loop collapse(3) & + !$acc& copyin(p2(:1,:ncol,:nlay,:ngpt)) & + !$acc& copy(ssa1(:ncol,:nlay,:ngpt)) & + !$acc& copyin(ssa2(:ncol,:nlay,:ngpt),tau2(:ncol,:nlay,:ngpt)) & + !$acc& copy(tau1(:ncol,:nlay,:ngpt),g1(:ncol,:nlay,:ngpt)) + !$omp target teams distribute parallel do simd collapse(3) & + !$omp& map(to:p2) & + !$omp& map(tofrom:ssa1) & + !$omp& map(to:ssa2, tau2) & + !$omp& map(tofrom:tau1, g1) + do igpt = 1, ngpt + do ilay = 1, nlay + do icol = 1, ncol + ! t=tau1 + tau2 + tau12 = tau1(icol,ilay,igpt) + tau2(icol,ilay,igpt) + ! w=(tau1*ssa1 + tau2*ssa2) / t + tauscat12 = & + tau1(icol,ilay,igpt) * ssa1(icol,ilay,igpt) + & + tau2(icol,ilay,igpt) * ssa2(icol,ilay,igpt) + if(tauscat12 > eps) then + g1(icol,ilay,igpt) = & + (tau1(icol,ilay,igpt) * ssa1(icol,ilay,igpt) * g1( icol,ilay,igpt)+ & + tau2(icol,ilay,igpt) * ssa2(icol,ilay,igpt) * p2(1, icol,ilay,igpt)) / tauscat12 + ssa1(icol,ilay,igpt) = tauscat12 / tau12 + tau1(icol,ilay,igpt) = tau12 + end if + end do + end do + end do + end subroutine increment_2stream_by_nstream + ! --------------------------------- + ! --------------------------------- + ! increment nstream by 1scalar + subroutine increment_nstream_by_1scalar(ncol, nlay, ngpt, & + tau1, ssa1, & + tau2) bind(C, name="rte_increment_nstream_by_1scalar") + integer, intent(in ) :: ncol, nlay, ngpt + real(wp), dimension(ncol,nlay,ngpt), intent(inout) :: tau1, ssa1 + real(wp), dimension(ncol,nlay,ngpt), intent(in ) :: tau2 + + integer :: icol, ilay, igpt + real(wp) :: tau12 + ! -------------- + ! -------------- + + !$acc parallel loop collapse(3) & + !$acc& copy(ssa1(:ncol,:nlay,:ngpt)) & + !$acc& copyin(tau2(:ncol,:nlay,:ngpt)) & + !$acc& copy(tau1(:ncol,:nlay,:ngpt)) + !$omp target teams distribute parallel do simd collapse(3) & + !$omp& map(tofrom:ssa1) & + !$omp& map(to:tau2) & + !$omp& map(tofrom:tau1) + do igpt = 1, ngpt + do ilay = 1, nlay + do icol = 1, ncol + tau12 = tau1(icol,ilay,igpt) + tau2(icol,ilay,igpt) + if(tau12 > eps) then + ssa1(icol,ilay,igpt) = tau1(icol,ilay,igpt) * ssa1(icol,ilay,igpt) / tau12 + tau1(icol,ilay,igpt) = tau12 + ! p is unchanged + end if + end do + end do + end do + end subroutine increment_nstream_by_1scalar + ! --------------------------------- + ! increment nstream by 2stream + subroutine increment_nstream_by_2stream(ncol, nlay, ngpt, nmom1, & + tau1, ssa1, p1, & + tau2, ssa2, g2) bind(C, name="rte_increment_nstream_by_2stream") + integer, intent(in ) :: ncol, nlay, ngpt, nmom1 + real(wp), dimension(ncol,nlay,ngpt), intent(inout) :: tau1, ssa1 + real(wp), dimension(nmom1, & + ncol,nlay,ngpt), intent(inout) :: p1 + real(wp), dimension(ncol,nlay,ngpt), intent(in ) :: tau2, ssa2, g2 + + integer :: icol, ilay, igpt + real(wp) :: tau12, tauscat12 + real(wp) :: temp_mom ! TK + integer :: imom !TK + ! -------------- + ! -------------- + + !$acc parallel loop collapse(3) & + !$acc& copy(p1(:nmom1,:ncol,:nlay,:ngpt),ssa1(:ncol,:nlay,:ngpt)) & + !$acc& copyin(ssa2(:ncol,:nlay,:ngpt)) & + !$acc& copy(tau1(:ncol,:nlay,:ngpt)) & + !$acc& copyin(g2(:ncol,:nlay,:ngpt)) & + !$acc& copyin(tau2(:ncol,:nlay,:ngpt)) + !$omp target teams distribute parallel do simd collapse(3) & + !$omp& map(tofrom:p1, ssa1) & + !$omp& map(to:ssa2) & + !$omp& map(tofrom:tau1) & + !$omp& map(to:g2) & + !$omp& map(to:tau2) + do igpt = 1, ngpt + do ilay = 1, nlay + do icol = 1, ncol + tau12 = tau1(icol,ilay,igpt) + tau2(icol,ilay,igpt) + tauscat12 = & + tau1(icol,ilay,igpt) * ssa1(icol,ilay,igpt) + & + tau2(icol,ilay,igpt) * ssa2(icol,ilay,igpt) + ! + ! Here assume Henyey-Greenstein + ! + if(tauscat12 > eps) then + temp_mom = g2(icol,ilay,igpt) + do imom = 1, nmom1 + p1(imom, icol,ilay,igpt) = & + (tau1(icol,ilay,igpt) * ssa1(icol,ilay,igpt) * p1(imom, icol,ilay,igpt) + & + tau2(icol,ilay,igpt) * ssa2(icol,ilay,igpt) * temp_mom) / tauscat12 + temp_mom = temp_mom * g2(icol,ilay,igpt) + end do + ssa1(icol,ilay,igpt) = tauscat12 / tau12 + tau1(icol,ilay,igpt) = tau12 + end if + end do + end do + end do + end subroutine increment_nstream_by_2stream + ! --------------------------------- + ! increment nstream by nstream + subroutine increment_nstream_by_nstream(ncol, nlay, ngpt, nmom1, nmom2, & + tau1, ssa1, p1, & + tau2, ssa2, p2) bind(C, name="rte_increment_nstream_by_nstream") + integer, intent(in ) :: ncol, nlay, ngpt, nmom1, nmom2 + real(wp), dimension(ncol,nlay,ngpt), intent(inout) :: tau1, ssa1 + real(wp), dimension(nmom1, & + ncol,nlay,ngpt), intent(inout) :: p1 + real(wp), dimension(ncol,nlay,ngpt), intent(in ) :: tau2, ssa2 + real(wp), dimension(nmom2, & + ncol,nlay,ngpt), intent(in ) :: p2 + + integer :: icol, ilay, igpt, mom_lim + real(wp) :: tau12, tauscat12 + ! -------------- + ! -------------- + mom_lim = min(nmom1, nmom2) + + !$acc parallel loop collapse(3) & + !$acc& copyin(p2(:mom_lim,:ncol,:nlay,:ngpt)) & + !$acc& copy(ssa1(:ncol,:nlay,:ngpt)) & + !$acc& copyin(ssa2(:ncol,:nlay,:ngpt),tau2(:ncol,:nlay,:ngpt)) & + !$acc& copy(tau1(:ncol,:nlay,:ngpt),p1(:mom_lim,:ncol,:nlay,:ngpt)) + !$omp target teams distribute parallel do simd collapse(3) & + !$omp& map(to:p2) & + !$omp& map(tofrom:ssa1) & + !$omp& map(to:ssa2, tau2) & + !$omp& map(tofrom:tau1, p1) + do igpt = 1, ngpt + do ilay = 1, nlay + do icol = 1, ncol + tau12 = tau1(icol,ilay,igpt) + tau2(icol,ilay,igpt) + tauscat12 = & + tau1(icol,ilay,igpt) * ssa1(icol,ilay,igpt) + & + tau2(icol,ilay,igpt) * ssa2(icol,ilay,igpt) + if(tauscat12 > eps) then + ! + ! If op2 has more moments than op1 these are ignored; + ! if it has fewer moments the higher orders are assumed to be 0 + ! + p1(1:mom_lim, icol,ilay,igpt) = & + (tau1(icol,ilay,igpt) * ssa1(icol,ilay,igpt) * p1(1:mom_lim, icol,ilay,igpt) + & + tau2(icol,ilay,igpt) * ssa2(icol,ilay,igpt) * p2(1:mom_lim, icol,ilay,igpt)) / max(eps,tauscat12) + ssa1(icol,ilay,igpt) = tauscat12 / max(eps,tau12) + tau1(icol,ilay,igpt) = tau12 + end if + end do + end do + end do + end subroutine increment_nstream_by_nstream + ! --------------------------------- + ! + ! Incrementing when the second set of optical properties is defined at lower spectral resolution + ! (e.g. by band instead of by gpoint) + ! + ! --------------------------------- + subroutine inc_1scalar_by_1scalar_bybnd(ncol, nlay, ngpt, & + tau1, & + tau2, & + nbnd, gpt_lims) bind(C, name="rte_inc_1scalar_by_1scalar_bybnd") + integer, intent(in ) :: ncol, nlay, ngpt, nbnd + real(wp), dimension(ncol,nlay,ngpt), intent(inout) :: tau1 + real(wp), dimension(ncol,nlay,nbnd), intent(in ) :: tau2 + integer, dimension(2,nbnd), intent(in ) :: gpt_lims ! Starting and ending gpoint for each band + integer :: ibnd, igpt, icol, ilay + + !$acc parallel loop collapse(3) & + !$acc& copyin(tau2(:ncol,:nlay,:nbnd)) & + !$acc& copy(tau1(:ncol,:nlay,:ngpt)) & + !$acc& copyin(gpt_lims(:,:nbnd)) + !$omp target teams distribute parallel do simd collapse(3) & + !$omp& map(to:tau2) & + !$omp& map(tofrom:tau1) & + !$omp& map(to:gpt_lims) + do igpt = 1 , ngpt + do ilay = 1 , nlay + do icol = 1 , ncol + do ibnd = 1, nbnd + if (igpt >= gpt_lims(1, ibnd) .and. igpt <= gpt_lims(2, ibnd) ) then + tau1(icol,ilay,igpt) = tau1(icol,ilay,igpt) + tau2(icol,ilay,ibnd) + endif + end do + end do + end do + end do + end subroutine inc_1scalar_by_1scalar_bybnd + ! --------------------------------- + ! increment 1scalar by 2stream + subroutine inc_1scalar_by_2stream_bybnd(ncol, nlay, ngpt, & + tau1, & + tau2, ssa2, & + nbnd, gpt_lims) bind(C, name="rte_inc_1scalar_by_2stream_bybnd") + integer, intent(in ) :: ncol, nlay, ngpt, nbnd + real(wp), dimension(ncol,nlay,ngpt), intent(inout) :: tau1 + real(wp), dimension(ncol,nlay,nbnd), intent(in ) :: tau2, ssa2 + integer, dimension(2,nbnd), intent(in ) :: gpt_lims ! Starting and ending gpoint for each band + integer :: ibnd, igpt, icol, ilay + + !$acc parallel loop collapse(3) & + !$acc& copyin(tau2(:ncol,:nlay,:nbnd),ssa2(:ncol,:nlay,:nbnd)) & + !$acc& copy(tau1(:ncol,:nlay,:ngpt)) & + !$acc& copyin(gpt_lims(:,:nbnd)) + !$omp target teams distribute parallel do simd collapse(3) & + !$omp& map(to:tau2, ssa2) & + !$omp& map(tofrom:tau1) & + !$omp& map(to:gpt_lims) + do igpt = 1 , ngpt + do ilay = 1 , nlay + do icol = 1 , ncol + do ibnd = 1, nbnd + if (igpt >= gpt_lims(1, ibnd) .and. igpt <= gpt_lims(2, ibnd) ) then + tau1(icol,ilay,igpt) = tau1(icol,ilay,igpt) + tau2(icol,ilay,ibnd) * (1._wp - ssa2(icol,ilay,ibnd)) + endif + end do + end do + end do + end do + end subroutine inc_1scalar_by_2stream_bybnd + ! --------------------------------- + ! increment 1scalar by nstream + subroutine inc_1scalar_by_nstream_bybnd(ncol, nlay, ngpt, & + tau1, & + tau2, ssa2, & + nbnd, gpt_lims) bind(C, name="rte_inc_1scalar_by_nstream_bybnd") + integer, intent(in ) :: ncol, nlay, ngpt, nbnd + real(wp), dimension(ncol,nlay,ngpt), intent(inout) :: tau1 + real(wp), dimension(ncol,nlay,nbnd), intent(in ) :: tau2, ssa2 + integer, dimension(2,nbnd), intent(in ) :: gpt_lims ! Starting and ending gpoint for each band + integer :: ibnd, igpt, icol, ilay + + !$acc parallel loop collapse(3) & + !$acc& copyin(gpt_lims(:,:nbnd),tau2(:ncol,:nlay,:nbnd)) & + !$acc& copy(tau1(:ncol,:nlay,:ngpt)) & + !$acc& copyin(ssa2(:ncol,:nlay,:nbnd)) + !$omp target teams distribute parallel do simd collapse(3) & + !$omp& map(to:gpt_lims, tau2) & + !$omp& map(tofrom:tau1) & + !$omp& map(to:ssa2) + do igpt = 1 , ngpt + do ilay = 1 , nlay + do icol = 1 , ncol + do ibnd = 1, nbnd + if (igpt >= gpt_lims(1, ibnd) .and. igpt <= gpt_lims(2, ibnd) ) then + tau1(icol,ilay,igpt) = tau1(icol,ilay,igpt) + tau2(icol,ilay,ibnd) * (1._wp - ssa2(icol,ilay,ibnd)) + endif + end do + end do + end do + end do + end subroutine inc_1scalar_by_nstream_bybnd + + ! --------------------------------- + ! increment 2stream by 1scalar + subroutine inc_2stream_by_1scalar_bybnd(ncol, nlay, ngpt, & + tau1, ssa1, & + tau2, & + nbnd, gpt_lims) bind(C, name="rte_inc_2stream_by_1scalar_bybnd") + integer, intent(in ) :: ncol, nlay, ngpt, nbnd + real(wp), dimension(ncol,nlay,ngpt), intent(inout) :: tau1, ssa1 + real(wp), dimension(ncol,nlay,nbnd), intent(in ) :: tau2 + integer, dimension(2,nbnd), intent(in ) :: gpt_lims ! Starting and ending gpoint for each band + + integer :: icol, ilay, igpt, ibnd + real(wp) :: tau12 + + !$acc parallel loop collapse(3) & + !$acc& copy(tau1(:ncol,:nlay,:ngpt)) & + !$acc& copyin(tau2(:ncol,:nlay,:nbnd)) & + !$acc& copy(ssa1(:ncol,:nlay,:ngpt)) & + !$acc& copyin(gpt_lims(:,:nbnd)) + !$omp target teams distribute parallel do simd collapse(3) & + !$omp& map(tofrom:tau1) & + !$omp& map(to:tau2) & + !$omp& map(tofrom:ssa1) & + !$omp& map(to:gpt_lims) + do igpt = 1 , ngpt + do ilay = 1, nlay + do icol = 1, ncol + do ibnd = 1, nbnd + if (igpt >= gpt_lims(1, ibnd) .and. igpt <= gpt_lims(2, ibnd) ) then + tau12 = tau1(icol,ilay,igpt) + tau2(icol,ilay,ibnd) + ssa1(icol,ilay,igpt) = tau1(icol,ilay,igpt) * ssa1(icol,ilay,igpt) / max(eps,tau12) + tau1(icol,ilay,igpt) = tau12 + ! g is unchanged + endif + end do + end do + end do + end do + end subroutine inc_2stream_by_1scalar_bybnd + ! --------------------------------- + ! increment 2stream by 2stream + subroutine inc_2stream_by_2stream_bybnd(ncol, nlay, ngpt, & + tau1, ssa1, g1, & + tau2, ssa2, g2, & + nbnd, gpt_lims) bind(C, name="rte_inc_2stream_by_2stream_bybnd") + integer, intent(in ) :: ncol, nlay, ngpt, nbnd + real(wp), dimension(ncol,nlay,ngpt), intent(inout) :: tau1, ssa1, g1 + real(wp), dimension(ncol,nlay,nbnd), intent(in ) :: tau2, ssa2, g2 + integer, dimension(2,nbnd), intent(in ) :: gpt_lims ! Starting and ending gpoint for each band + integer :: icol, ilay, igpt, ibnd + real(wp) :: tau12, tauscat12 + + !$acc parallel loop collapse(3) & + !$acc& copy(tau1(:ncol,:nlay,:ngpt)) & + !$acc& copyin(tau2(:ncol,:nlay,:nbnd),ssa2(:ncol,:nlay,:nbnd)) & + !$acc& copy(ssa1(:ncol,:nlay,:ngpt)) & + !$acc& copyin(gpt_lims(:,:nbnd)) & + !$acc& copy(g1(:ncol,:nlay,:ngpt)) & + !$acc& copyin(g2(:ncol,:nlay,:nbnd)) + !$omp target teams distribute parallel do simd collapse(3) & + !$omp& map(tofrom:tau1) & + !$omp& map(to:tau2, ssa2) & + !$omp& map(tofrom:ssa1) & + !$omp& map(to:gpt_lims) & + !$omp& map(tofrom:g1) & + !$omp& map(to:g2) + do igpt = 1 , ngpt + do ilay = 1, nlay + do icol = 1, ncol + do ibnd = 1, nbnd + if (igpt >= gpt_lims(1, ibnd) .and. igpt <= gpt_lims(2, ibnd) ) then + ! t=tau1 + tau2 + tau12 = tau1(icol,ilay,igpt) + tau2(icol,ilay,ibnd) + ! w=(tau1*ssa1 + tau2*ssa2) / t + tauscat12 = & + tau1(icol,ilay,igpt) * ssa1(icol,ilay,igpt) + & + tau2(icol,ilay,ibnd) * ssa2(icol,ilay,ibnd) + g1(icol,ilay,igpt) = & + (tau1(icol,ilay,igpt) * ssa1(icol,ilay,igpt) * g1(icol,ilay,igpt) + & + tau2(icol,ilay,ibnd) * ssa2(icol,ilay,ibnd) * g2(icol,ilay,ibnd)) / max(eps,tauscat12) + ssa1(icol,ilay,igpt) = tauscat12 / max(eps,tau12) + tau1(icol,ilay,igpt) = tau12 + endif + end do + end do + end do + end do + end subroutine inc_2stream_by_2stream_bybnd + ! --------------------------------- + ! increment 2stream by nstream + subroutine inc_2stream_by_nstream_bybnd(ncol, nlay, ngpt, nmom2, & + tau1, ssa1, g1, & + tau2, ssa2, p2, & + nbnd, gpt_lims) bind(C, name="rte_inc_2stream_by_nstream_bybnd") + integer, intent(in ) :: ncol, nlay, ngpt, nmom2, nbnd + real(wp), dimension(ncol,nlay,ngpt), intent(inout) :: tau1, ssa1, g1 + real(wp), dimension(ncol,nlay,nbnd), intent(in ) :: tau2, ssa2 + real(wp), dimension(nmom2, & + ncol,nlay,nbnd), intent(in ) :: p2 + integer, dimension(2,nbnd), intent(in ) :: gpt_lims ! Starting and ending gpoint for each band + + integer :: icol, ilay, igpt, ibnd + real(wp) :: tau12, tauscat12 + + !$acc parallel loop collapse(3) & + !$acc& copy(tau1(:ncol,:nlay,:ngpt)) & + !$acc& copyin(tau2(:ncol,:nlay,:nbnd),ssa2(:ncol,:nlay,:nbnd)) & + !$acc& copy(ssa1(:ncol,:nlay,:ngpt)) & + !$acc& copyin(p2(:1,:ncol,:nlay,:nbnd),gpt_lims(:,:nbnd)) & + !$acc& copy(g1(:ncol,:nlay,:ngpt)) + !$omp target teams distribute parallel do simd collapse(3) & + !$omp& map(tofrom:tau1) & + !$omp& map(to:tau2, ssa2) & + !$omp& map(tofrom:ssa1) & + !$omp& map(to:p2, gpt_lims) & + !$omp& map(tofrom:g1) + do igpt = 1 , ngpt + do ilay = 1, nlay + do icol = 1, ncol + do ibnd = 1, nbnd + if (igpt >= gpt_lims(1, ibnd) .and. igpt <= gpt_lims(2, ibnd) ) then + ! t=tau1 + tau2 + tau12 = tau1(icol,ilay,igpt) + tau2(icol,ilay,ibnd) + ! w=(tau1*ssa1 + tau2*ssa2) / t + tauscat12 = & + tau1(icol,ilay,igpt) * ssa1(icol,ilay,igpt) + & + tau2(icol,ilay,ibnd) * ssa2(icol,ilay,ibnd) + g1(icol,ilay,igpt) = & + (tau1(icol,ilay,igpt) * ssa1(icol,ilay,igpt) * g1( icol,ilay,igpt)+ & + tau2(icol,ilay,ibnd) * ssa2(icol,ilay,ibnd) * p2(1, icol,ilay,ibnd)) / max(eps,tauscat12) + ssa1(icol,ilay,igpt) = tauscat12 / max(eps,tau12) + tau1(icol,ilay,igpt) = tau12 + endif + end do + end do + end do + end do + end subroutine inc_2stream_by_nstream_bybnd + ! --------------------------------- + ! --------------------------------- + ! increment nstream by 1scalar + subroutine inc_nstream_by_1scalar_bybnd(ncol, nlay, ngpt, & + tau1, ssa1, & + tau2, & + nbnd, gpt_lims) bind(C, name="rte_inc_nstream_by_1scalar_bybnd") + integer, intent(in ) :: ncol, nlay, ngpt, nbnd + real(wp), dimension(ncol,nlay,ngpt), intent(inout) :: tau1, ssa1 + real(wp), dimension(ncol,nlay,nbnd), intent(in ) :: tau2 + integer, dimension(2,nbnd), intent(in ) :: gpt_lims ! Starting and ending gpoint for each band + + integer :: icol, ilay, igpt, ibnd + real(wp) :: tau12 + + !$acc parallel loop collapse(3) & + !$acc& copy(tau1(:ncol,:nlay,:ngpt)) & + !$acc& copyin(tau2(:ncol,:nlay,:nbnd)) & + !$acc& copy(ssa1(:ncol,:nlay,:ngpt)) & + !$acc& copyin(gpt_lims(:,:nbnd)) + !$omp target teams distribute parallel do simd collapse(3) & + !$omp& map(tofrom:tau1) & + !$omp& map(to:tau2) & + !$omp& map(tofrom:ssa1) & + !$omp& map(to:gpt_lims) + do igpt = 1 , ngpt + do ilay = 1, nlay + do icol = 1, ncol + do ibnd = 1, nbnd + if (igpt >= gpt_lims(1, ibnd) .and. igpt <= gpt_lims(2, ibnd) ) then + tau12 = tau1(icol,ilay,igpt) + tau2(icol,ilay,ibnd) + ssa1(icol,ilay,igpt) = tau1(icol,ilay,igpt) * ssa1(icol,ilay,igpt) / max(eps,tau12) + tau1(icol,ilay,igpt) = tau12 + ! p is unchanged + endif + end do + end do + end do + end do + end subroutine inc_nstream_by_1scalar_bybnd + ! --------------------------------- + ! increment nstream by 2stream + subroutine inc_nstream_by_2stream_bybnd(ncol, nlay, ngpt, nmom1, & + tau1, ssa1, p1, & + tau2, ssa2, g2, & + nbnd, gpt_lims) bind(C, name="rte_inc_nstream_by_2stream_bybnd") + integer, intent(in ) :: ncol, nlay, ngpt, nmom1, nbnd + real(wp), dimension(ncol,nlay,ngpt), intent(inout) :: tau1, ssa1 + real(wp), dimension(nmom1, & + ncol,nlay,ngpt), intent(inout) :: p1 + real(wp), dimension(ncol,nlay,nbnd), intent(in ) :: tau2, ssa2, g2 + integer, dimension(2,nbnd), intent(in ) :: gpt_lims ! Starting and ending gpoint for each band + + integer :: icol, ilay, igpt, ibnd + real(wp) :: tau12, tauscat12 + real(wp) :: temp_mom ! TK + integer :: imom !TK + + !$acc parallel loop collapse(3) & + !$acc& copy(tau1(:ncol,:nlay,:ngpt)) & + !$acc& copyin(ssa2(:ncol,:nlay,:nbnd)) & + !$acc& copy(ssa1(:ncol,:nlay,:ngpt),p1(:nmom1,:ncol,:nlay,:ngpt)) & + !$acc& copyin(tau2(:ncol,:nlay,:nbnd)) & + !$acc& copyin(gpt_lims(:,:nbnd),g2(:ncol,:nlay,:nbnd)) + !$omp target teams distribute parallel do simd collapse(3) & + !$omp& map(tofrom:tau1) & + !$omp& map(to:ssa2) & + !$omp& map(tofrom:ssa1, p1) & + !$omp& map(to:tau2) & + !$omp& map(to:gpt_lims, g2) + do igpt = 1 , ngpt + do ilay = 1, nlay + do icol = 1, ncol + do ibnd = 1, nbnd + if (igpt >= gpt_lims(1, ibnd) .and. igpt <= gpt_lims(2, ibnd) ) then + tau12 = tau1(icol,ilay,igpt) + tau2(icol,ilay,ibnd) + tauscat12 = & + tau1(icol,ilay,igpt) * ssa1(icol,ilay,igpt) + & + tau2(icol,ilay,ibnd) * ssa2(icol,ilay,ibnd) + ! + ! Here assume Henyey-Greenstein + ! + temp_mom = g2(icol,ilay,ibnd) + do imom = 1, nmom1 + p1(imom, icol,ilay,igpt) = & + (tau1(icol,ilay,igpt) * ssa1(icol,ilay,igpt) * p1(imom, icol,ilay,igpt) + & + tau2(icol,ilay,ibnd) * ssa2(icol,ilay,ibnd) * temp_mom ) / max(eps,tauscat12) + temp_mom = temp_mom * g2(icol,ilay,igpt) + end do + ssa1(icol,ilay,igpt) = tauscat12 / max(eps,tau12) + tau1(icol,ilay,igpt) = tau12 + endif + end do + end do + end do + end do + end subroutine inc_nstream_by_2stream_bybnd + ! --------------------------------- + ! increment nstream by nstream + subroutine inc_nstream_by_nstream_bybnd(ncol, nlay, ngpt, nmom1, nmom2, & + tau1, ssa1, p1, & + tau2, ssa2, p2, & + nbnd, gpt_lims) bind(C, name="rte_inc_nstream_by_nstream_bybnd") + integer, intent(in ) :: ncol, nlay, ngpt, nmom1, nmom2, nbnd + real(wp), dimension(ncol,nlay,ngpt), intent(inout) :: tau1, ssa1 + real(wp), dimension(nmom1, & + ncol,nlay,ngpt), intent(inout) :: p1 + real(wp), dimension(ncol,nlay,nbnd), intent(in ) :: tau2, ssa2 + real(wp), dimension(nmom2, & + ncol,nlay,nbnd), intent(in ) :: p2 + integer, dimension(2,nbnd), intent(in ) :: gpt_lims ! Starting and ending gpoint for each band + + integer :: icol, ilay, igpt, ibnd, mom_lim + real(wp) :: tau12, tauscat12 + + mom_lim = min(nmom1, nmom2) + !$acc parallel loop collapse(3) & + !$acc& copyin(p2(:mom_lim,:ncol,:nlay,:nbnd)) & + !$acc& copy(ssa1(:ncol,:nlay,:ngpt)) & + !$acc& copyin(ssa2(:ncol,:nlay,:nbnd)) & + !$acc& copy(tau1(:ncol,:nlay,:ngpt)) & + !$acc& copyin(tau2(:ncol,:nlay,:nbnd)) & + !$acc& copy(p1(:mom_lim,:ncol,:nlay,:ngpt)) & + !$acc& copyin(gpt_lims(:,:nbnd)) + !$omp target teams distribute parallel do simd collapse(3) & + !$omp& map(to:p2) & + !$omp& map(tofrom:ssa1) & + !$omp& map(to:ssa2) & + !$omp& map(tofrom:tau1) & + !$omp& map(to:tau2) & + !$omp& map(tofrom:p1) & + !$omp& map(to:gpt_lims) + do igpt = 1 , ngpt + do ilay = 1, nlay + do icol = 1, ncol + do ibnd = 1, nbnd + if (igpt >= gpt_lims(1, ibnd) .and. igpt <= gpt_lims(2, ibnd) ) then + tau12 = tau1(icol,ilay,igpt) + tau2(icol,ilay,ibnd) + tauscat12 = & + tau1(icol,ilay,igpt) * ssa1(icol,ilay,igpt) + & + tau2(icol,ilay,ibnd) * ssa2(icol,ilay,ibnd) + ! + ! If op2 has more moments than op1 these are ignored; + ! if it has fewer moments the higher orders are assumed to be 0 + ! + p1(1:mom_lim, icol,ilay,igpt) = & + (tau1(icol,ilay,igpt) * ssa1(icol,ilay,igpt) * p1(1:mom_lim, icol,ilay,igpt) + & + tau2(icol,ilay,ibnd) * ssa2(icol,ilay,ibnd) * p2(1:mom_lim, icol,ilay,ibnd)) / max(eps,tauscat12) + ssa1(icol,ilay,igpt) = tauscat12 / max(eps,tau12) + tau1(icol,ilay,igpt) = tau12 + endif + end do + end do + end do + end do + end subroutine inc_nstream_by_nstream_bybnd + ! --------------------------------- + ! ------------------------------------------------------------------------------------------------- + ! + ! Subsetting, meaning extracting some portion of the 3D domain + ! + ! ------------------------------------------------------------------------------------------------- + subroutine extract_subset_dim1_3d(ncol, nlay, ngpt, array_in, colS, colE, array_out) & + bind (C, name="rte_extract_subset_dim1_3d") + integer, intent(in ) :: ncol, nlay, ngpt + real(wp), dimension(ncol,nlay,ngpt), intent(in ) :: array_in + integer, intent(in ) :: colS, colE + real(wp), dimension(colE-colS+1,& + nlay,ngpt), intent(out) :: array_out + integer :: icol, ilay, igpt + + !$acc parallel loop collapse(3) & + !$acc& copyout(array_out(:cole-cols+1,:nlay,:ngpt)) & + !$acc& copyin(array_in(cols:cole,:nlay,:ngpt)) + !$omp target teams distribute parallel do simd collapse(3) & + !$omp& map(from:array_out) & + !$omp& map(to:array_in) + do igpt = 1, ngpt + do ilay = 1, nlay + do icol = colS, colE + array_out(icol-colS+1, ilay, igpt) = array_in(icol, ilay, igpt) + end do + end do + end do + + end subroutine extract_subset_dim1_3d + ! --------------------------------- + subroutine extract_subset_dim2_4d(nmom, ncol, nlay, ngpt, array_in, colS, colE, array_out) & + bind (C, name="rte_extract_subset_dim2_4d") + integer, intent(in ) :: nmom, ncol, nlay, ngpt + real(wp), dimension(nmom,ncol,nlay,ngpt), intent(in ) :: array_in + integer, intent(in ) :: colS, colE + real(wp), dimension(nmom,colE-colS+1,& + nlay,ngpt), intent(out) :: array_out + + integer :: icol, ilay, igpt, imom + + !$acc parallel loop collapse(4) & + !$acc& copyout(array_out(:nmom,:cole-cols+1,:nlay,:ngpt)) & + !$acc& copyin(array_in(:nmom,cols:cole,:nlay,:ngpt)) + !$omp target teams distribute parallel do simd collapse(4) & + !$omp& map(from:array_out) & + !$omp& map(to:array_in) + do igpt = 1, ngpt + do ilay = 1, nlay + do icol = colS, colE + do imom = 1, nmom + array_out(imom, icol-colS+1, ilay, igpt) = array_in(imom, icol, ilay, igpt) + end do + end do + end do + end do + + end subroutine extract_subset_dim2_4d + ! --------------------------------- + ! + ! Extract the absorption optical thickness which requires mulitplying by 1 - ssa + ! + subroutine extract_subset_absorption_tau(ncol, nlay, ngpt, tau_in, ssa_in, & + colS, colE, tau_out) & + bind (C, name="rte_extract_subset_absorption_tau") + integer, intent(in ) :: ncol, nlay, ngpt + real(wp), dimension(ncol,nlay,ngpt), intent(in ) :: tau_in, ssa_in + integer, intent(in ) :: colS, colE + real(wp), dimension(colE-colS+1,& + nlay,ngpt), intent(out) :: tau_out + + integer :: icol, ilay, igpt + + !$acc parallel loop collapse(3) & + !$acc& copyin(ssa_in(cols:cole,:nlay,:ngpt)) & + !$acc& copyout(tau_out(:cole-cols+1,:nlay,:ngpt)) & + !$acc& copyin(tau_in(cols:cole,:nlay,:ngpt)) + !$omp target teams distribute parallel do simd collapse(3) & + !$omp& map(to:ssa_in) & + !$omp& map(from:tau_out) & + !$omp& map(to:tau_in) + do igpt = 1, ngpt + do ilay = 1, nlay + do icol = colS, colE + tau_out(icol-colS+1, ilay, igpt) = & + tau_in(icol, ilay, igpt) * (1._wp - ssa_in(icol, ilay, igpt)) + end do + end do + end do + + end subroutine extract_subset_absorption_tau +end module mo_optical_props_kernels diff --git a/src/radiate/rte-rrtmgp/rte/kernels-openacc/mo_rte_solver_kernels.F90 b/src/radiate/rte-rrtmgp/rte/kernels-openacc/mo_rte_solver_kernels.F90 new file mode 100644 index 0000000..3edc638 --- /dev/null +++ b/src/radiate/rte-rrtmgp/rte/kernels-openacc/mo_rte_solver_kernels.F90 @@ -0,0 +1,1561 @@ +! This code is part of Radiative Transfer for Energetics (RTE) +! +! Contacts: Robert Pincus and Eli Mlawer +! email: rrtmgp@aer.com +! +! Copyright 2015-2021, Atmospheric and Environmental Research, +! Regents of the University of Colorado, Trustees of Columbia University. All right reserved. +! +! Use and duplication is permitted under the terms of the +! BSD 3-clause license, see http://opensource.org/licenses/BSD-3-Clause +! ------------------------------------------------------------------------------------------------- +! +! Numeric calculations for radiative transfer solvers. +! Emission/absorption (no-scattering) calculations +! solver for multi-angle Gaussian quadrature +! solver for a single angle, calling +! source function computation (linear-in-tau) +! transport +! Extinction-only calculation (direct solar beam) +! Two-stream calculations +! solvers for LW and SW with different boundary conditions and source functions +! source function calculation for LW, SW +! two-stream calculations for LW, SW (using different assumtions about phase function) +! transport (adding) +! Application of boundary conditions +! +! ------------------------------------------------------------------------------------------------- +module mo_rte_solver_kernels + use, intrinsic :: iso_c_binding + use mo_rte_kind, only: wp, wl + use mo_rte_util_array, only: zero_array + implicit none + private + + public :: lw_solver_noscat, lw_solver_2stream, & + sw_solver_noscat, sw_solver_2stream + + interface add_arrays + module procedure add_arrays_2D, add_arrays_3D + end interface + + real(wp), parameter :: pi = acos(-1._wp) +contains + ! ------------------------------------------------------------------------------------------------- + ! + ! Top-level longwave kernels + ! + ! ------------------------------------------------------------------------------------------------- + ! + ! LW fluxes, no scattering, mu (cosine of integration angle) specified by column + ! Does radiation calculation at user-supplied angles; converts radiances to flux + ! using user-supplied weights + ! + ! --------------------------------------------------------------- + subroutine lw_solver_noscat_oneangle(ncol, nlay, ngpt, top_at_1, D, weight, & + tau, lay_source, lev_source_inc, lev_source_dec, sfc_emis, sfc_src, & + incident_flux, & + flux_up, flux_dn, & + do_broadband, broadband_up, broadband_dn, & + do_Jacobians, sfc_srcJac, flux_upJac, & + do_rescaling, ssa, g) + integer, intent(in ) :: ncol, nlay, ngpt ! Number of columns, layers, g-points + logical(wl), intent(in ) :: top_at_1 + real(wp), dimension(ncol, ngpt), intent(in ) :: D ! secant of propagation angle [] + real(wp), intent(in ) :: weight ! quadrature weight + real(wp), dimension(ncol,nlay, ngpt), intent(in ) :: tau ! Absorption optical thickness [] + real(wp), dimension(ncol,nlay, ngpt), intent(in ) :: lay_source ! Planck source at layer average temperature [W/m2] + ! Planck source at layer edge for radiation in increasing/decreasing ilay direction + ! lev_source_dec applies the mapping in layer i to the Planck function at layer i + ! lev_source_inc applies the mapping in layer i to the Planck function at layer i+1 + real(wp), dimension(ncol,nlay, ngpt), target, & + intent(in ) :: lev_source_inc, lev_source_dec + real(wp), dimension(ncol, ngpt), intent(in ) :: sfc_emis ! Surface emissivity [] + real(wp), dimension(ncol, ngpt), intent(in ) :: sfc_src ! Surface source function [W/m2] + real(wp), dimension(ncol, ngpt), intent(in ) :: incident_flux! Boundary condition for flux [W/m2] + real(wp), dimension(ncol,nlay+1,ngpt), target, & + intent( out) :: flux_up, flux_dn + ! Fluxes [W/m2] + + ! + ! Optional variables - arrays aren't referenced if corresponding logical == False + ! + logical(wl), intent(in ) :: do_broadband + real(wp), dimension(ncol,nlay+1 ), intent( out) :: broadband_up, broadband_dn ! Spectrally-integrated fluxes [W/m2] + logical(wl), intent(in ) :: do_Jacobians + real(wp), dimension(ncol ,ngpt), intent(in ) :: sfc_srcJac ! surface temperature Jacobian of surface source function [W/m2/K] + real(wp), dimension(ncol,nlay+1 ), intent( out) :: flux_upJac ! surface temperature Jacobian of Radiances [W/m2-str / K] + logical(wl), intent(in ) :: do_rescaling + real(wp), dimension(ncol,nlay ,ngpt), intent(in ) :: ssa, g ! single-scattering albedo, asymmetry parameter + ! ------------------------------------------------------------------------------------------------- + ! Local variables + integer :: icol, ilay, ilev, igpt + integer :: top_level, sfc_level + real(wp), dimension(ncol,nlay,ngpt) :: tau_loc, & ! path length (tau/mu) + trans ! transmissivity = exp(-tau) + real(wp), dimension(ncol,nlay,ngpt) :: source_dn, source_up + + real(wp), dimension(:,:,:), pointer :: lev_source_up, lev_source_dn ! Mapping increasing/decreasing indicies to up/down + + real(wp), parameter :: pi = acos(-1._wp) + + ! + ! For Jacobians + ! + real(wp), dimension(ncol,nlay+1,ngpt) :: gpt_Jac + ! + ! Used when approximating scattering + ! + real(wp) :: ssal, wb, scaleTau, scaling + real(wp), dimension(ncol,nlay,ngpt) :: An, Cn + ! ------------------------------------ + ! Which way is up? + ! Level Planck sources for upward and downward radiation + ! When top_at_1, lev_source_up => lev_source_dec + ! lev_source_dn => lev_source_inc, and vice-versa + + if(top_at_1) then + top_level = 1 + sfc_level = nlay+1 + lev_source_up => lev_source_dec + lev_source_dn => lev_source_inc + else + top_level = nlay+1 + sfc_level = 1 + lev_source_up => lev_source_inc + lev_source_dn => lev_source_dec + end if + + !$acc data create( tau_loc,trans,source_dn,source_up ) & + !$acc copyin( D, tau,lev_source_up,lev_source_dn) + !$omp target data map(alloc:tau_loc,trans,source_dn,source_up ) & + !$omp map(to: D, tau,lev_source_up,lev_source_dn) + + !$acc enter data create( flux_dn,flux_up) + !$omp target enter data map(alloc:flux_dn,flux_up) + + !$acc parallel loop collapse(2) + !$omp target teams distribute parallel do simd collapse(2) + do igpt = 1, ngpt + do icol = 1, ncol + ! + ! Transport is for intensity + ! convert flux at top of domain to intensity assuming azimuthal isotropy + ! + flux_dn(icol,top_level,igpt) = incident_flux(icol,igpt)/(2._wp * pi * weight) + end do + end do + + !$acc data create( An, Cn) copyin(g) if(do_rescaling) + !$omp target data map(alloc:An, Cn) map(to:g) if(do_rescaling) + !$acc data copyin(sfc_srcJac) create( gpt_Jac) if(do_Jacobians) + !$omp target data map(to:sfc_srcJac) map(alloc:gpt_Jac) if(do_Jacobians) + +#ifdef _CRAYFTN + !$acc parallel loop present(An, Cn, gpt_Jac, g) collapse(3) +#else + !$acc parallel loop no_create(An, Cn, gpt_Jac, g) collapse(3) +#endif + !$omp target teams distribute parallel do simd collapse(3) + do igpt = 1, ngpt + do ilay = 1, nlay + do icol = 1, ncol + ! + ! The wb and scaleTau terms are independent of propagation + ! angle D and could be pre-computed if several values of D are used + ! We re-compute them here to keep not have to localize memory use + ! + if(do_rescaling) then + ssal = ssa(icol, ilay, igpt) + wb = ssal*(1._wp - g(icol, ilay, igpt)) * 0.5_wp + scaleTau = (1._wp - ssal + wb) + ! here wb/scaleTau is parameter wb/(1-w(1-b)) of Eq.21 of the Tang paper + ! actually it is in line of parameter rescaling defined in Eq.7 + ! potentialy if g=ssa=1 then wb/scaleTau = NaN + ! it should not happen because g is never 1 in atmospheres + ! explanation of factor 0.4 note A of Table + Cn(icol,ilay,igpt) = 0.4_wp*wb/scaleTau + ! Eq.15 of the paper, multiplied by path length + tau_loc(icol,ilay,igpt) = tau(icol,ilay,igpt)*D(icol,igpt)*scaleTau + trans (icol,ilay,igpt) = exp(-tau_loc(icol,ilay,igpt)) + An (icol,ilay,igpt) = (1._wp-trans(icol,ilay,igpt)**2) + else + ! + ! Optical path and transmission, used in source function and transport calculations + ! + tau_loc(icol,ilay,igpt) = tau(icol,ilay,igpt)*D(icol,igpt) + trans (icol,ilay,igpt) = exp(-tau_loc(icol,ilay,igpt)) + end if + call lw_source_noscat(lay_source (icol,ilay,igpt), & + lev_source_up(icol,ilay,igpt), lev_source_dn(icol,ilay,igpt), & + tau_loc (icol,ilay,igpt), trans (icol,ilay,igpt), & + source_dn (icol,ilay,igpt), source_up (icol,ilay,igpt)) + end do + end do + end do + ! + ! Transport down + ! + call lw_transport_noscat_dn(ncol, nlay, ngpt, top_at_1, trans, source_dn, flux_dn) + ! + ! Surface reflection and emission + ! +#ifdef _CRAYFTN + !$acc parallel loop collapse(2) present(gpt_Jac, sfc_srcJac) +#else + !$acc parallel loop collapse(2) no_create(gpt_Jac, sfc_srcJac) +#endif + !$omp target teams distribute parallel do simd collapse(2) + do igpt = 1, ngpt + do icol = 1, ncol + ! + ! Surface albedo, surface source function + ! + flux_up (icol,sfc_level,igpt) = flux_dn (icol,sfc_level,igpt)*(1._wp - sfc_emis(icol,igpt)) + & + sfc_src (icol, igpt)* sfc_emis(icol,igpt) + if(do_Jacobians) & + gpt_Jac(icol,sfc_level,igpt) = sfc_srcJac(icol, igpt)* sfc_emis(icol,igpt) + end do + end do + ! + ! Transport up, or up and down again if using rescaling + ! + if(do_rescaling) then + call lw_transport_1rescl(ncol, nlay, ngpt, top_at_1, trans, & + source_dn, source_up, & + flux_up, flux_dn, An, Cn, & + do_Jacobians, gpt_Jac) + else + call lw_transport_noscat_up(ncol, nlay, ngpt, top_at_1, trans, source_up, flux_up, & + do_Jacobians, gpt_Jac) + end if + + if(do_broadband) then + ! + ! Broadband reduction including + ! conversion from intensity to flux assuming azimuthal isotropy and quadrature weight + ! + call sum_broadband_factor(ncol, nlay+1, ngpt, 2._wp * pi * weight, flux_dn, broadband_dn) + call sum_broadband_factor(ncol, nlay+1, ngpt, 2._wp * pi * weight, flux_up, broadband_up) + !$acc exit data delete( flux_dn,flux_up) + !$omp target exit data map(release:flux_dn,flux_up) + else + ! + ! Convert intensity to flux assuming azimuthal isotropy and quadrature weight + ! + call apply_factor_3D(ncol, nlay+1, ngpt, 2._wp*pi*weight, flux_dn) + call apply_factor_3D(ncol, nlay+1, ngpt, 2._wp*pi*weight, flux_up) + !$acc exit data copyout( flux_dn,flux_up) + !$omp target exit data map(from:flux_dn,flux_up) + end if + ! + ! Only broadband-integrated Jacobians are provided + ! + if (do_Jacobians) then + call sum_broadband_factor(ncol, nlay+1, ngpt, 2._wp * pi * weight, gpt_Jac, flux_upJac) + end if + + !$acc end data + !$omp end target data + !$acc end data + !$omp end target data + !$acc end data + !$omp end target data + end subroutine lw_solver_noscat_oneangle + ! --------------------------------------------------------------- + ! + ! LW transport, no scattering, multi-angle quadrature + ! Users provide a set of weights and quadrature angles + ! Routine sums over single-angle solutions for each sets of angles/weights + ! + ! --------------------------------------------------------------- + subroutine lw_solver_noscat(ncol, nlay, ngpt, top_at_1, & + nmus, Ds, weights, & + tau, & + lay_source, lev_source_inc, lev_source_dec, & + sfc_emis, sfc_src, & + inc_flux, & + flux_up, flux_dn, & + do_broadband, broadband_up, broadband_dn, & + do_Jacobians, sfc_srcJac, flux_upJac, & + do_rescaling, ssa, g) bind(C, name="rte_lw_solver_noscat") + integer, intent(in ) :: ncol, nlay, ngpt ! Number of columns, layers, g-points + logical(wl), intent(in ) :: top_at_1 + integer, intent(in ) :: nmus ! number of quadrature angles + real(wp), dimension (ncol, ngpt, & + nmus), intent(in ) :: Ds + real(wp), dimension(nmus), intent(in ) :: weights ! quadrature secants, weights + real(wp), dimension(ncol,nlay, ngpt), intent(in ) :: tau ! Absorption optical thickness [] + real(wp), dimension(ncol,nlay, ngpt), intent(in ) :: lay_source ! Planck source at layer average temperature [W/m2] + real(wp), dimension(ncol,nlay, ngpt), intent(in ) :: lev_source_inc + ! Planck source at layer edge for radiation in increasing ilay direction [W/m2] + ! Includes spectral weighting that accounts for state-dependent frequency to g-space mapping + real(wp), dimension(ncol,nlay, ngpt), intent(in ) :: lev_source_dec + ! Planck source at layer edge for radiation in decreasing ilay direction [W/m2] + real(wp), dimension(ncol, ngpt), intent(in ) :: sfc_emis ! Surface emissivity [] + real(wp), dimension(ncol, ngpt), intent(in ) :: sfc_src ! Surface source function [W/m2] + real(wp), dimension(ncol, ngpt), intent(in ) :: inc_flux ! Incident diffuse flux, probably 0 [W/m2] + real(wp), dimension(ncol,nlay+1,ngpt), target, & + intent( out) :: flux_up, flux_dn ! Fluxes [W/m2] + ! + ! Optional variables - arrays aren't referenced if corresponding logical == False + ! + logical(wl), intent(in ) :: do_broadband + real(wp), dimension(ncol,nlay+1 ), target, & + intent(inout) :: broadband_up, broadband_dn + ! Spectrally-integrated fluxes [W/m2] + logical(wl), intent(in ) :: do_Jacobians + real(wp), dimension(ncol ,ngpt), intent(in ) :: sfc_srcJac + ! surface temperature Jacobian of surface source function [W/m2/K] + real(wp), dimension(ncol,nlay+1 ), target, & + intent( out) :: flux_upJac + ! surface temperature Jacobian of Radiances [W/m2-str / K] + logical(wl), intent(in ) :: do_rescaling + real(wp), dimension(ncol,nlay ,ngpt), intent(in ) :: ssa, g ! single-scattering albedo, asymmetry parameter + ! ------------------------------------ + ! + ! Local variables + ! + real(wp), dimension(:,:,:), pointer :: this_flux_up, this_flux_dn + real(wp), dimension(:,:), pointer :: this_broadband_up, this_broadband_dn, this_flux_upJac + integer :: icol, ilev, igpt, imu + ! ------------------------------------ + + !$acc data copyin(Ds, tau, lay_source, lev_source_inc, lev_source_dec, sfc_emis, sfc_src) + !$omp target data map(to:Ds, tau, lay_source, lev_source_inc, lev_source_dec, sfc_emis, sfc_src) + !$acc data copyout( flux_up, flux_dn) if (.not. do_broadband) + !$omp target data map(from:flux_up, flux_dn) if (.not. do_broadband) + !$acc data copyout( broadband_up, broadband_dn) if ( do_broadband) + !$omp target data map(from:broadband_up, broadband_dn) if ( do_broadband) + !$acc data copyin(sfc_srcJac) copyout(flux_upJac) if (do_Jacobians) + !$omp target data map(to:sfc_srcJac), map(from:flux_upJac) if (do_Jacobians) + + if(do_broadband) then + this_broadband_up => broadband_up + this_broadband_dn => broadband_dn + allocate(this_flux_up(ncol, nlay+1, ngpt), this_flux_dn(ncol, nlay+1, ngpt)) + else + this_flux_up => flux_up + this_flux_dn => flux_dn + ! Spectrally-integrated fluxes won't be filled in + allocate(this_broadband_up(ncol,nlay+1), this_broadband_dn(ncol,nlay+1)) + end if + + !$acc data create( this_broadband_up, this_broadband_dn, this_flux_up, this_flux_dn) + !$omp target data map(alloc:this_broadband_up, this_broadband_dn, this_flux_up, this_flux_dn) + call lw_solver_noscat_oneangle(ncol, nlay, ngpt, & + top_at_1, Ds(:,:,1), weights(1), tau, & + lay_source, lev_source_inc, lev_source_dec, sfc_emis, sfc_src, & + inc_flux, & + this_flux_up, this_flux_dn, & + do_broadband, this_broadband_up, this_broadband_dn, & + do_Jacobians, sfc_srcJac, flux_upJac, & + do_rescaling, ssa, g) + !$acc end data + !$omp end target data + + if(nmus > 1) then + ! + ! For more than one angle use local arrays + ! + if(do_broadband) then + nullify( this_broadband_up, this_broadband_dn) + allocate(this_broadband_up(ncol,nlay+1), this_broadband_dn(ncol,nlay+1)) + else + nullify( this_flux_up, this_flux_dn) + allocate(this_flux_up(ncol,nlay+1,ngpt), this_flux_dn(ncol,nlay+1,ngpt)) + end if + + if(do_Jacobians) then + allocate(this_flux_upJac(ncol,nlay+1)) + else + this_flux_upJac => flux_upJac + end if + ! + ! For more than one angle use local arrays + ! + !$acc data create( this_broadband_up, this_broadband_dn, this_flux_up, this_flux_dn) + !$omp target data map(alloc:this_broadband_up, this_broadband_dn, this_flux_up, this_flux_dn) + do imu = 2, nmus + call lw_solver_noscat_oneangle(ncol, nlay, ngpt, & + top_at_1, Ds(:,:,imu), weights(imu), tau, & + lay_source, lev_source_inc, lev_source_dec, sfc_emis, sfc_src, & + inc_flux, & + this_flux_up, this_flux_dn, & + do_broadband, this_broadband_up, this_broadband_dn, & + do_Jacobians, sfc_srcJac, this_flux_upJac, & + do_rescaling, ssa, g) + if(do_broadband) then + call add_arrays(ncol, nlay+1, this_broadband_up, broadband_up) + call add_arrays(ncol, nlay+1, this_broadband_dn, broadband_dn) + else + call add_arrays(ncol, nlay+1, ngpt, flux_up, this_flux_up) + call add_arrays(ncol, nlay+1, ngpt, flux_dn, this_flux_dn) + end if + if (do_Jacobians) then + call add_arrays(ncol, nlay+1, this_flux_upJac, flux_upJac) + end if + end do + !$acc end data + !$omp end target data + end if + + !$acc end data + !$omp end target data + !$acc end data + !$omp end target data + !$acc end data + !$omp end target data + !$acc end data + !$omp end target data + + ! Cleanup + if (.not. associated(this_broadband_up, broadband_up)) then + deallocate(this_broadband_up, this_broadband_dn) + end if + if (.not. associated(this_flux_up, flux_up)) then + deallocate(this_flux_up, this_flux_dn) + end if + if (nmus > 1 .and. do_Jacobians) then + deallocate(this_flux_upJac) + end if + end subroutine lw_solver_noscat + ! ------------------------------------------------------------------------------------------------- + ! + ! Longwave two-stream calculation: + ! combine RRTMGP-specific sources at levels + ! compute layer reflectance, transmittance + ! compute total source function at levels using linear-in-tau + ! transport + ! + ! ------------------------------------------------------------------------------------------------- + subroutine lw_solver_2stream (ncol, nlay, ngpt, top_at_1, & + tau, ssa, g, & + lay_source, lev_source_inc, lev_source_dec, sfc_emis, sfc_src, & + inc_flux, & + flux_up, flux_dn) bind(C, name="rte_lw_solver_2stream") + integer, intent(in ) :: ncol, nlay, ngpt ! Number of columns, layers, g-points + logical(wl), intent(in ) :: top_at_1 + real(wp), dimension(ncol,nlay, ngpt), intent(in ) :: tau, & ! Optical thickness, + ssa, & ! single-scattering albedo, + g ! asymmetry parameter [] + real(wp), dimension(ncol,nlay,ngpt), intent(in ) :: lay_source ! Planck source at layer average temperature [W/m2] + real(wp), dimension(ncol,nlay,ngpt), target, & + intent(in ) :: lev_source_inc, lev_source_dec + ! Planck source at layer edge for radiation in increasing/decreasing ilay direction [W/m2] + ! Includes spectral weighting that accounts for state-dependent frequency to g-space mapping + real(wp), dimension(ncol, ngpt), intent(in ) :: sfc_emis ! Surface emissivity [] + real(wp), dimension(ncol, ngpt), intent(in ) :: sfc_src ! Surface source function [W/m2] + real(wp), dimension(ncol, ngpt), intent(in ) :: inc_flux ! Incident diffuse flux, probably 0 [W/m2] + real(wp), dimension(ncol,nlay+1,ngpt), intent( out) :: flux_up, flux_dn ! Fluxes [W/m2] + ! ---------------------------------------------------------------------- + integer :: icol, igpt, top_level + real(wp), dimension(ncol,nlay ,ngpt) :: Rdif, Tdif, gamma1, gamma2 + real(wp), dimension(ncol ,ngpt) :: sfc_albedo + real(wp), dimension(ncol,nlay+1,ngpt) :: lev_source + real(wp), dimension(ncol,nlay ,ngpt) :: source_dn, source_up + real(wp), dimension(ncol ,ngpt) :: source_sfc + ! ------------------------------------ + ! ------------------------------------ + !$acc enter data copyin(tau, ssa, g, lay_source, lev_source_inc, lev_source_dec, sfc_emis, sfc_src, flux_dn) + !$omp target enter data map(to:tau, ssa, g, lay_source, lev_source_inc, lev_source_dec, sfc_emis, sfc_src, flux_dn) + !$acc enter data create(flux_up, Rdif, Tdif, gamma1, gamma2, sfc_albedo, lev_source, source_dn, source_up, source_sfc) + !$omp target enter data map(alloc:flux_up, Rdif, Tdif, gamma1, gamma2, sfc_albedo, lev_source, source_dn, source_up, source_sfc) + ! + ! RRTMGP provides source functions at each level using the spectral mapping + ! of each adjacent layer. Combine these for two-stream calculations + ! + top_level = nlay+1 + if(top_at_1) top_level = 1 + call lw_combine_sources(ncol, nlay, ngpt, top_at_1, & + lev_source_inc, lev_source_dec, & + lev_source) + ! + ! Cell properties: reflection, transmission for diffuse radiation + ! Coupling coefficients needed for source function + ! + call lw_two_stream(ncol, nlay, ngpt, & + tau , ssa, g, & + gamma1, gamma2, Rdif, Tdif) + + ! + ! Source function for diffuse radiation + ! + call lw_source_2str(ncol, nlay, ngpt, top_at_1, & + sfc_emis, sfc_src, & + lay_source, lev_source, & + gamma1, gamma2, Rdif, Tdif, tau, & + source_dn, source_up, source_sfc) + + !$acc parallel loop collapse(2) + !$omp target teams distribute parallel do simd collapse(2) + do igpt = 1, ngpt + do icol = 1, ncol + sfc_albedo(icol, igpt) = 1._wp - sfc_emis(icol,igpt) + flux_dn (icol,top_level,igpt) = inc_flux(icol,igpt) + end do + end do + ! + ! Transport + ! + call adding(ncol, nlay, ngpt, top_at_1, & + sfc_albedo, & + Rdif, Tdif, & + source_dn, source_up, source_sfc, & + flux_up, flux_dn) + !$acc exit data delete(tau, ssa, g, lay_source, lev_source_inc, lev_source_dec, sfc_emis, sfc_src) + !$omp target exit data map(release:tau, ssa, g, lay_source, lev_source_inc, lev_source_dec, sfc_emis, sfc_src) + !$acc exit data delete(Rdif, Tdif, gamma1, gamma2, sfc_albedo, lev_source, source_dn, source_up, source_sfc) + !$omp target exit data map(release:Rdif, Tdif, gamma1, gamma2, sfc_albedo, lev_source, source_dn, source_up, source_sfc) + !$acc exit data copyout(flux_up, flux_dn) + !$omp target exit data map(from:flux_up, flux_dn) + end subroutine lw_solver_2stream + ! ------------------------------------------------------------------------------------------------- + ! + ! Top-level shortwave kernels + ! + ! ------------------------------------------------------------------------------------------------- + ! + ! Extinction-only i.e. solar direct beam + ! + ! ------------------------------------------------------------------------------------------------- + subroutine sw_solver_noscat(ncol, nlay, ngpt, top_at_1, & + tau, mu0, inc_flux_dir, flux_dir) bind(C, name="rte_sw_solver_noscat") + integer, intent(in ) :: ncol, nlay, ngpt ! Number of columns, layers, g-points + logical(wl), intent(in ) :: top_at_1 + real(wp), dimension(ncol,nlay, ngpt), intent(in ) :: tau ! Absorption optical thickness [] + real(wp), dimension(ncol,nlay ), intent(in ) :: mu0 ! cosine of solar zenith angle + real(wp), dimension(ncol, ngpt), intent(in ) :: inc_flux_dir ! Direct beam incident flux + real(wp), dimension(ncol,nlay+1,ngpt), intent(out) :: flux_dir ! Direct-beam flux, spectral [W/m2] + + integer :: icol, ilev, igpt + ! ------------------------------------ + ! ------------------------------------ + !$acc enter data copyin(tau, mu0) create(flux_dir) + !$omp target enter data map(to:tau, mu0) map(alloc:flux_dir) + ! Indexing into arrays for upward and downward propagation depends on the vertical + ! orientation of the arrays (whether the domain top is at the first or last index) + ! We write the loops out explicitly so compilers will have no trouble optimizing them. + + ! Downward propagation + if(top_at_1) then + ! For the flux at this level, what was the previous level, and which layer has the + ! radiation just passed through? + ! layer index = level index - 1 + ! previous level is up (-1) + !$acc parallel loop collapse(2) + !$omp target teams distribute parallel do simd collapse(2) + do igpt = 1, ngpt + do icol = 1, ncol + flux_dir(icol, 1,igpt) = inc_flux_dir(icol, igpt) * mu0(icol, 1) + do ilev = 2, nlay+1 + flux_dir(icol,ilev,igpt) = flux_dir(icol,ilev-1,igpt) * exp(-tau(icol,ilev,igpt)/mu0(icol, ilev-1)) + end do + end do + end do + else + ! layer index = level index + ! previous level is up (+1) + !$acc parallel loop collapse(2) + !$omp target teams distribute parallel do simd collapse(2) + do igpt = 1, ngpt + do icol = 1, ncol + flux_dir(icol,nlay+1,igpt) = inc_flux_dir(icol, igpt) * mu0(icol, nlay) + do ilev = nlay, 1, -1 + flux_dir(icol,ilev,igpt) = flux_dir(icol,ilev+1,igpt) * exp(-tau(icol,ilev,igpt)/mu0(icol, ilev)) + end do + end do + end do + end if + !$acc exit data delete(tau, mu0) copyout(flux_dir) + !$omp target exit data map(release:tau, mu0) map(from:flux_dir) + end subroutine sw_solver_noscat + ! ------------------------------------------------------------------------------------------------- + ! + ! Shortwave two-stream calculation: + ! compute layer reflectance, transmittance + ! compute solar source function for diffuse radiation + ! transport + ! + ! ------------------------------------------------------------------------------------------------- + subroutine sw_solver_2stream (ncol, nlay, ngpt, top_at_1, & + tau, ssa, g, mu0, & + sfc_alb_dir, sfc_alb_dif, & + inc_flux_dir, & + flux_up, flux_dn, flux_dir, & + has_dif_bc, inc_flux_dif, & + do_broadband, broadband_up, & + broadband_dn, broadband_dir) bind(C, name="rte_sw_solver_2stream") + integer, intent(in ) :: ncol, nlay, ngpt ! Number of columns, layers, g-points + logical(wl), intent(in ) :: top_at_1 + real(wp), dimension(ncol,nlay, ngpt), intent(in ) :: tau, & ! Optical thickness, + ssa, & ! single-scattering albedo, + g ! asymmetry parameter [] + real(wp), dimension(ncol,nlay ), intent(in ) :: mu0 ! cosine of solar zenith angle + ! Spectral albedo of surface to direct and diffuse radiation + real(wp), dimension(ncol, ngpt), intent(in ) :: sfc_alb_dir, sfc_alb_dif, & + inc_flux_dir ! Direct beam incident flux + real(wp), dimension(ncol,nlay+1,ngpt), target, & + intent(out) :: flux_up, flux_dn, flux_dir! Fluxes [W/m2] + logical(wl), intent(in ) :: has_dif_bc ! Is a boundary condition for diffuse flux supplied? + real(wp), dimension(ncol, ngpt), intent(in ) :: inc_flux_dif ! Boundary condition for diffuse flux + logical(wl), intent(in ) :: do_broadband ! Provide broadband-integrated, not spectrally-resolved, fluxes? + real(wp), dimension(ncol,nlay+1 ), intent(out) :: broadband_up, broadband_dn, broadband_dir + ! ------------------------------------------- + integer :: icol, ilay, igpt, top_level, top_layer + real(wp) :: bb_flux_s, bb_dir_s + real(wp), dimension(ncol,nlay,ngpt) :: Rdif, Tdif + real(wp), dimension(ncol,nlay,ngpt) :: source_up, source_dn + real(wp), dimension(ncol ,ngpt) :: source_srf + real(wp), dimension(:,:,:), pointer :: gpt_flux_up, gpt_flux_dn, gpt_flux_dir + ! ------------------------------------ + if(do_broadband) then + allocate(gpt_flux_up (ncol,nlay+1,ngpt), & + gpt_flux_dn (ncol,nlay+1,ngpt), & + gpt_flux_dir(ncol,nlay+1,ngpt)) + else + gpt_flux_up => flux_up + gpt_flux_dn => flux_dn + gpt_flux_dir => flux_dir + end if + if(top_at_1) then + top_level = 1 + top_layer = 1 + else + top_level = nlay+1 + top_layer = nlay + end if + ! + ! Boundary conditions direct beam... + ! + !$acc data create( gpt_flux_up, gpt_flux_dn, gpt_flux_dir) & + !$acc copyin( mu0) + !$omp target data map(alloc:gpt_flux_up, gpt_flux_dn, gpt_flux_dir) & + !$omp map(to: mu0) + + !$acc data copyout(flux_up, flux_dn, flux_dir) if (.not. do_broadband) + !$omp target data map(to: flux_up, flux_dn, flux_dir) if (.not. do_broadband) + + !$acc parallel loop collapse(2) + !$omp target teams distribute parallel do simd collapse(2) + do igpt = 1, ngpt + do icol = 1, ncol + gpt_flux_dir(icol, top_level, igpt) = inc_flux_dir(icol,igpt) * mu0(icol, top_layer) + end do + end do + + ! + ! ... and diffuse field, using 0 if no BC is provided + ! + if(has_dif_bc) then + !$acc parallel loop collapse(2) + !$omp target teams distribute parallel do simd collapse(2) + do igpt = 1, ngpt + do icol = 1, ncol + gpt_flux_dn(icol, top_level, igpt) = inc_flux_dif(icol,igpt) + end do + end do + else + !$acc parallel loop collapse(2) + !$omp target teams distribute parallel do simd collapse(2) + do igpt = 1, ngpt + do icol = 1, ncol + gpt_flux_dn(icol, top_level, igpt) = 0._wp + end do + end do + end if + ! + ! Cell properties: transmittance and reflectance for diffuse radiation + ! Direct-beam radiation and source for diffuse radiation + ! + !$acc data create( Rdif, Tdif, source_up, source_dn, source_srf) + !$omp target data map(alloc:Rdif, Tdif, source_up, source_dn, source_srf) + call sw_dif_and_source(ncol, nlay, ngpt, top_at_1, mu0, sfc_alb_dif, & + tau, ssa, g, & + Rdif, Tdif, source_dn, source_up, source_srf, gpt_flux_dir) + + call adding(ncol, nlay, ngpt, top_at_1, & + sfc_alb_dif, Rdif, Tdif, & + source_dn, source_up, source_srf, gpt_flux_up, gpt_flux_dn) + !$acc end data + !$omp end target data + + if(do_broadband) then + ! + ! Broadband integration + ! + !$acc data copyout( broadband_up, broadband_dn, broadband_dir) + !$omp target data map(from:broadband_up, broadband_dn, broadband_dir) + call sum_broadband_factor(ncol, nlay+1, ngpt, 1._wp, gpt_flux_up, broadband_up) + call sum_broadband_factor(ncol, nlay+1, ngpt, 1._wp, gpt_flux_dn, broadband_dn) + call sum_broadband_factor(ncol, nlay+1, ngpt, 1._wp, gpt_flux_dir, broadband_dir) + ! + ! adding computes only diffuse flux; flux_dn is total + ! + call add_arrays (ncol, nlay+1, broadband_dir, broadband_dn) + !$acc end data + !$omp end target data + else + ! + ! adding computes only diffuse flux; flux_dn is total + ! + call add_arrays(ncol, nlay+1, ngpt, flux_dir, flux_dn) + end if + + !$acc end data + !$omp end target data + !$acc end data + !$omp end target data + + if (do_broadband) then + deallocate(gpt_flux_up, gpt_flux_dn, gpt_flux_dir) + end if + end subroutine sw_solver_2stream + ! ------------------------------------------------------------------------------------------------- + ! + ! Lower-level longwave kernels + ! + ! --------------------------------------------------------------- + ! + ! Compute LW source function for upward and downward emission at levels using linear-in-tau assumption + ! See Clough et al., 1992, doi: 10.1029/92JD01419, Eq 13 + ! This routine implements point-wise stencil, and has to be called in a loop + ! + ! --------------------------------------------------------------- + subroutine lw_source_noscat(lay_source, lev_source_up, lev_source_dn, tau, trans, & + source_dn, source_up) + !$acc routine seq + !$omp declare target + ! + real(wp), intent(in) :: lay_source, & ! Planck source at layer center + lev_source_up, & ! Planck source at levels (layer edges), + lev_source_dn, & ! increasing/decreasing layer index + tau, & ! Optical path (tau/mu) + trans ! Transmissivity (exp(-tau)) + real(wp), intent(inout):: source_dn, source_up + ! Source function at layer edges + ! Down at the bottom of the layer, up at the top + ! -------------------------------- + real(wp), parameter :: tau_thresh = sqrt(epsilon(tau)) + real(wp) :: fact + ! --------------------------------------------------------------- + ! + ! Weighting factor. Use 2nd order series expansion when rounding error (~tau^2) + ! is of order epsilon (smallest difference from 1. in working precision) + ! Thanks to Peter Blossey + ! + if(tau > tau_thresh) then + fact = (1._wp - trans)/tau - trans + else + fact = tau * (0.5_wp - 1._wp/3._wp*tau) + end if + ! + ! Equation below is developed in Clough et al., 1992, doi:10.1029/92JD01419, Eq 13 + ! + source_dn = (1._wp - trans) * lev_source_dn + & + 2._wp * fact * (lay_source - lev_source_dn) + source_up = (1._wp - trans) * lev_source_up + & + 2._wp * fact * (lay_source - lev_source_up) + + end subroutine lw_source_noscat + ! --------------------------------------------------------------- + ! + ! Longwave no-scattering transport + ! + ! --------------------------------------------------------------- + subroutine lw_transport_noscat_dn(ncol, nlay, ngpt, top_at_1, & + trans, source_dn,radn_dn) + !dir$ optimize(-O0) + integer, intent(in ) :: ncol, nlay, ngpt ! Number of columns, layers, g-points + logical(wl), intent(in ) :: top_at_1 ! + real(wp), dimension(ncol,nlay ,ngpt), intent(in ) :: trans ! transmissivity = exp(-tau) + real(wp), dimension(ncol,nlay ,ngpt), intent(in ) :: source_dn ! Diffuse radiation emitted by the layer + real(wp), dimension(ncol,nlay+1,ngpt), intent(inout) :: radn_dn ! Radiances [W/m2-str] + ! Top level must contain incident flux boundary condition + ! Local variables + integer :: igpt, ilev, icol + ! --------------------------------------------------- + ! --------------------------------------------------- + if(top_at_1) then + ! + ! Top of domain is index 1 + ! + !$acc parallel loop collapse(2) + !$omp target teams distribute parallel do simd collapse(2) + do igpt = 1, ngpt + do icol = 1, ncol + do ilev = 2, nlay+1 + radn_dn(icol,ilev,igpt) = trans(icol,ilev-1,igpt)*radn_dn(icol,ilev-1,igpt) + source_dn(icol,ilev-1,igpt) + end do + end do + end do + else + ! + ! Top of domain is index nlay+1 + ! + !$acc parallel loop collapse(2) + !$omp target teams distribute parallel do simd collapse(2) + do igpt = 1, ngpt + do icol = 1, ncol + do ilev = nlay, 1, -1 + radn_dn(icol,ilev,igpt) = trans(icol,ilev ,igpt)*radn_dn(icol,ilev+1,igpt) + source_dn(icol,ilev,igpt) + end do + end do + end do + end if + + end subroutine lw_transport_noscat_dn + ! ------------------------------------------------------------------------------------------------- + subroutine lw_transport_noscat_up(ncol, nlay, ngpt, & + top_at_1, trans, source_up, radn_up, do_Jacobians, radn_upJac) + !dir$ optimize(-O0) + integer, intent(in ) :: ncol, nlay, ngpt ! Number of columns, layers, g-points + logical(wl), intent(in ) :: top_at_1 ! + real(wp), dimension(ncol,nlay ,ngpt), intent(in ) :: trans ! transmissivity = exp(-tau) + real(wp), dimension(ncol,nlay ,ngpt), intent(in ) :: source_up ! Diffuse radiation emitted by the layer + real(wp), dimension(ncol,nlay+1,ngpt), intent( out) :: radn_up ! Radiances [W/m2-str] + logical(wl), intent(in ) :: do_Jacobians + real(wp), dimension(ncol,nlay+1,ngpt), intent(inout) :: radn_upJac ! surface temperature Jacobian of Radiances [W/m2-str / K] + ! Local variables + integer :: igpt, ilev, icol + ! --------------------------------------------------- + ! --------------------------------------------------- + if(top_at_1) then + ! + ! Top of domain is index 1 + ! +#ifdef _CRAYFTN + !$acc parallel loop collapse(2) present(radn_upJac) +#else + !$acc parallel loop collapse(2) no_create(radn_upJac) +#endif + !$omp target teams distribute parallel do simd collapse(2) + do igpt = 1, ngpt + do icol = 1, ncol + do ilev = nlay, 1, -1 + radn_up (icol,ilev,igpt) = trans(icol,ilev,igpt)*radn_up (icol,ilev+1,igpt) + source_up(icol,ilev,igpt) + end do + if(do_Jacobians) then + do ilev = nlay, 1, -1 + radn_upJac(icol,ilev,igpt) = trans(icol,ilev,igpt)*radn_upJac(icol,ilev+1,igpt) + end do + end if + end do + end do + + else + ! + ! Top of domain is index nlay+1 + ! +#ifdef _CRAYFTN + !$acc parallel loop collapse(2) present(radn_upJac) +#else + !$acc parallel loop collapse(2) no_create(radn_upJac) +#endif + !$omp target teams distribute parallel do simd collapse(2) + do igpt = 1, ngpt + do icol = 1, ncol + do ilev = 2, nlay+1 + radn_up (icol,ilev,igpt) = trans(icol,ilev-1,igpt) * radn_up (icol,ilev-1,igpt) + source_up(icol,ilev-1,igpt) + end do + if(do_Jacobians) then + do ilev = nlay, 1, -1 + radn_upJac(icol,ilev,igpt) = trans(icol,ilev-1,igpt) * radn_upJac(icol,ilev-1,igpt) + end do + end if + end do + end do + end if + + end subroutine lw_transport_noscat_up + ! ------------------------------------------------------------------------------------------------- + ! + ! Longwave two-stream solutions to diffuse reflectance and transmittance for a layer + ! with optical depth tau, single scattering albedo w0, and asymmetery parameter g. + ! + ! Equations are developed in Meador and Weaver, 1980, + ! doi:10.1175/1520-0469(1980)037<0630:TSATRT>2.0.CO;2 + ! + subroutine lw_two_stream(ncol, nlay, ngpt, tau, w0, g, & + gamma1, gamma2, Rdif, Tdif) + integer, intent(in) :: ncol, nlay, ngpt + real(wp), dimension(ncol,nlay,ngpt), intent(in) :: tau, w0, g + real(wp), dimension(ncol,nlay,ngpt), intent(out) :: gamma1, gamma2, Rdif, Tdif + + ! ----------------------- + integer :: icol, ilay, igpt + + ! Variables used in Meador and Weaver + real(wp) :: k + + ! Ancillary variables + real(wp) :: RT_term + real(wp) :: exp_minusktau, exp_minus2ktau + + real(wp), parameter :: LW_diff_sec = 1.66 ! 1./cos(diffusivity angle) + ! --------------------------------- + ! --------------------------------- + !$acc enter data copyin(tau, w0, g) + !$omp target enter data map(to:tau, w0, g) + !$acc enter data create(gamma1, gamma2, Rdif, Tdif) + !$omp target enter data map(alloc:gamma1, gamma2, Rdif, Tdif) + + !$acc parallel loop collapse(3) + !$omp target teams distribute parallel do simd collapse(3) + do igpt = 1, ngpt + do ilay = 1, nlay + do icol = 1, ncol + ! + ! Coefficients differ from SW implementation because the phase function is more isotropic + ! Here we follow Fu et al. 1997, doi:10.1175/1520-0469(1997)054<2799:MSPITI>2.0.CO;2 + ! and use a diffusivity sec of 1.66 + ! + gamma1(icol,ilay,igpt)= LW_diff_sec * (1._wp - 0.5_wp * w0(icol,ilay,igpt) * (1._wp + g(icol,ilay,igpt))) ! Fu et al. Eq 2.9 + gamma2(icol,ilay,igpt)= LW_diff_sec * 0.5_wp * w0(icol,ilay,igpt) * (1._wp - g(icol,ilay,igpt)) ! Fu et al. Eq 2.10 + + ! Written to encourage vectorization of exponential, square root + ! Eq 18; k = SQRT(gamma1**2 - gamma2**2), limited below to avoid div by 0. + ! k = 0 for isotropic, conservative scattering; this lower limit on k + ! gives relative error with respect to conservative solution + ! of < 0.1% in Rdif down to tau = 10^-9 + k = sqrt(max((gamma1(icol,ilay,igpt) - gamma2(icol,ilay,igpt)) * & + (gamma1(icol,ilay,igpt) + gamma2(icol,ilay,igpt)), & + 1.e-12_wp)) + exp_minusktau = exp(-tau(icol,ilay,igpt)*k) + + ! + ! Diffuse reflection and transmission + ! + exp_minus2ktau = exp_minusktau * exp_minusktau + + ! Refactored to avoid rounding errors when k, gamma1 are of very different magnitudes + RT_term = 1._wp / (k * (1._wp + exp_minus2ktau) + & + gamma1(icol,ilay,igpt) * (1._wp - exp_minus2ktau) ) + + ! Equation 25 + Rdif(icol,ilay,igpt) = RT_term * gamma2(icol,ilay,igpt) * (1._wp - exp_minus2ktau) + + ! Equation 26 + Tdif(icol,ilay,igpt) = RT_term * 2._wp * k * exp_minusktau + end do + end do + end do + !$acc exit data delete (tau, w0, g) + !$omp target exit data map(release:tau, w0, g) + !$acc exit data copyout(gamma1, gamma2, Rdif, Tdif) + !$omp target exit data map(from:gamma1, gamma2, Rdif, Tdif) + end subroutine lw_two_stream + ! ------------------------------------------------------------------------------------------------- + ! + ! Source function combination + ! RRTMGP provides two source functions at each level + ! using the spectral mapping from each of the adjascent layers. + ! Need to combine these for use in two-stream calculation. + ! + ! ------------------------------------------------------------------------------------------------- + subroutine lw_combine_sources(ncol, nlay, ngpt, top_at_1, & + lev_src_inc, lev_src_dec, lev_source) + integer, intent(in ) :: ncol, nlay, ngpt + logical(wl), intent(in ) :: top_at_1 + real(wp), dimension(ncol, nlay , ngpt), intent(in ) :: lev_src_inc, lev_src_dec + real(wp), dimension(ncol, nlay+1, ngpt), intent(out) :: lev_source + + integer :: icol, ilay, igpt + ! --------------------------------------------------------------- + ! --------------------------------- + !$acc enter data copyin(lev_src_inc, lev_src_dec) + !$omp target enter data map(to:lev_src_inc, lev_src_dec) + !$acc enter data create(lev_source) + !$omp target enter data map(alloc:lev_source) + + !$acc parallel loop collapse(3) + !$omp target teams distribute parallel do simd collapse(3) + do igpt = 1, ngpt + do ilay = 1, nlay+1 + do icol = 1,ncol + if(ilay == 1) then + lev_source(icol, ilay, igpt) = lev_src_dec(icol, ilay, igpt) + else if (ilay == nlay+1) then + lev_source(icol, ilay, igpt) = lev_src_inc(icol, ilay-1, igpt) + else + lev_source(icol, ilay, igpt) = sqrt(lev_src_dec(icol, ilay, igpt) * & + lev_src_inc(icol, ilay-1, igpt)) + end if + end do + end do + end do + !$acc exit data delete (lev_src_inc, lev_src_dec) + !$omp target exit data map(release:lev_src_inc, lev_src_dec) + !$acc exit data copyout(lev_source) + !$omp target exit data map(from:lev_source) + end subroutine lw_combine_sources + ! --------------------------------------------------------------- + ! + ! Compute LW source function for upward and downward emission at levels using linear-in-tau assumption + ! This version straight from ECRAD + ! Source is provided as W/m2-str; factor of pi converts to flux units + ! + ! --------------------------------------------------------------- + subroutine lw_source_2str(ncol, nlay, ngpt, top_at_1, & + sfc_emis, sfc_src, & + lay_source, lev_source, & + gamma1, gamma2, rdif, tdif, tau, source_dn, source_up, source_sfc) & + bind (C, name="rte_lw_source_2str") + integer, intent(in) :: ncol, nlay, ngpt + logical(wl), intent(in) :: top_at_1 + real(wp), dimension(ncol , ngpt), intent(in) :: sfc_emis, sfc_src + real(wp), dimension(ncol, nlay, ngpt), intent(in) :: lay_source, & ! Planck source at layer center + tau, & ! Optical depth (tau) + gamma1, gamma2,& ! Coupling coefficients + rdif, tdif ! Layer reflectance and transmittance + real(wp), dimension(ncol, nlay+1, ngpt), target, & + intent(in) :: lev_source ! Planck source at layer edges + real(wp), dimension(ncol, nlay, ngpt), intent(out) :: source_dn, source_up + real(wp), dimension(ncol , ngpt), intent(out) :: source_sfc ! Source function for upward radation at surface + + integer :: icol, ilay, igpt + real(wp) :: Z, Zup_top, Zup_bottom, Zdn_top, Zdn_bottom + real(wp) :: lev_source_bot, lev_source_top + ! --------------------------------------------------------------- + ! --------------------------------- + !$acc enter data copyin(sfc_emis, sfc_src, lay_source, tau, gamma1, gamma2, rdif, tdif, lev_source) + !$omp target enter data map(to:sfc_emis, sfc_src, lay_source, tau, gamma1, gamma2, rdif, tdif, lev_source) + !$acc enter data create(source_dn, source_up, source_sfc) + !$omp target enter data map(alloc:source_dn, source_up, source_sfc) + + !$acc parallel loop collapse(3) + !$omp target teams distribute parallel do simd collapse(3) + do igpt = 1, ngpt + do ilay = 1, nlay + do icol = 1, ncol + if (tau(icol,ilay,igpt) > 1.0e-8_wp) then + if(top_at_1) then + lev_source_top = lev_source(icol,ilay ,igpt) + lev_source_bot = lev_source(icol,ilay+1,igpt) + else + lev_source_top = lev_source(icol,ilay+1,igpt) + lev_source_bot = lev_source(icol,ilay ,igpt) + end if + ! + ! Toon et al. (JGR 1989) Eqs 26-27 + ! + Z = (lev_source_bot-lev_source_top) / (tau(icol,ilay,igpt)*(gamma1(icol,ilay,igpt)+gamma2(icol,ilay,igpt))) + Zup_top = Z + lev_source_top + Zup_bottom = Z + lev_source_bot + Zdn_top = -Z + lev_source_top + Zdn_bottom = -Z + lev_source_bot + source_up(icol,ilay,igpt) = pi * (Zup_top - rdif(icol,ilay,igpt) * Zdn_top - tdif(icol,ilay,igpt) * Zup_bottom) + source_dn(icol,ilay,igpt) = pi * (Zdn_bottom - rdif(icol,ilay,igpt) * Zup_bottom - tdif(icol,ilay,igpt) * Zdn_top) + else + source_up(icol,ilay,igpt) = 0._wp + source_dn(icol,ilay,igpt) = 0._wp + end if + if(ilay == 1) source_sfc(icol,igpt) = pi * sfc_emis(icol,igpt) * sfc_src(icol,igpt) + end do + end do + end do + !$acc exit data delete(sfc_emis, sfc_src, lay_source, tau, gamma1, gamma2, rdif, tdif, lev_source) + !$omp target exit data map(release:sfc_emis, sfc_src, lay_source, tau, gamma1, gamma2, rdif, tdif, lev_source) + !$acc exit data copyout(source_dn, source_up, source_sfc) + !$omp target exit data map(from:source_dn, source_up, source_sfc) + + end subroutine lw_source_2str + ! ------------------------------------------------------------------------------------------------- + ! + ! Lower-level shortwave kernels + ! + ! ------------------------------------------------------------------------------------------------- + ! ------------------------------------------------------------------------------------------------- + ! + ! Two-stream solutions to direct and diffuse reflectance and transmittance for a layer + ! with optical depth tau, single scattering albedo w0, and asymmetery parameter g. + ! + ! Equations are developed in Meador and Weaver, 1980, + ! doi:10.1175/1520-0469(1980)037<0630:TSATRT>2.0.CO;2 + ! + ! --------------------------------------------------------------- + ! + ! Direct beam source for diffuse radiation in layers and at surface; + ! report direct beam as a byproduct + ! + ! ------------------------------------------------------------------------------------------------- + subroutine sw_dif_and_source(ncol, nlay, ngpt, top_at_1, mu0, sfc_albedo, & + tau, w0, g, & + Rdif, Tdif, source_dn, source_up, source_sfc, & + flux_dn_dir) bind (C, name="rte_sw_source_dir") + integer, intent(in ) :: ncol, nlay, ngpt + logical(wl), intent(in ) :: top_at_1 + real(wp), dimension(ncol,nlay ), intent(in ) :: mu0 + real(wp), dimension(ncol, ngpt), intent(in ) :: sfc_albedo ! surface albedo for direct radiation + real(wp), dimension(ncol,nlay, ngpt), intent(in ) :: tau, w0, g + real(wp), dimension(ncol,nlay, ngpt), target, & + intent( out) :: Rdif, Tdif, source_dn, source_up + real(wp), dimension(ncol, ngpt), intent( out) :: source_sfc ! Source function for upward radation at surface + real(wp), dimension(ncol,nlay+1,ngpt), target, & + intent(inout) :: flux_dn_dir ! Direct beam flux + + ! ----------------------- + integer :: icol, ilay, igpt + + ! Variables used in Meador and Weaver + real(wp) :: gamma1, gamma2, gamma3, gamma4, alpha1, alpha2 + + + ! Ancillary variables + real(wp) :: k, exp_minusktau, k_mu, k_gamma3, k_gamma4 + real(wp) :: RT_term, exp_minus2ktau + real(wp) :: Rdir, Tdir, Tnoscat, inc_flux + integer :: lay_index, inc_index, trans_index + real(wp) :: tau_s, w0_s, g_s, mu0_s + ! --------------------------------- + !$acc parallel loop collapse(2) + !$omp target teams distribute parallel do simd collapse(2) + do igpt = 1, ngpt + do icol = 1, ncol + do ilay = 1, nlay + if(top_at_1) then + lay_index = ilay + inc_index = lay_index + trans_index = lay_index+1 + else + lay_index = nlay-ilay+1 + inc_index = lay_index+1 + trans_index = lay_index + end if + inc_flux = flux_dn_dir(icol,inc_index,igpt) + ! + ! Scalars + ! + tau_s = tau(icol,lay_index,igpt) + w0_s = w0 (icol,lay_index,igpt) + g_s = g (icol,lay_index,igpt) + mu0_s = mu0(icol,lay_index) + ! + ! Zdunkowski Practical Improved Flux Method "PIFM" + ! (Zdunkowski et al., 1980; Contributions to Atmospheric Physics 53, 147-66) + ! + gamma1 = (8._wp - w0_s * (5._wp + 3._wp * g_s)) * .25_wp + gamma2 = 3._wp *(w0_s * (1._wp - g_s)) * .25_wp + ! + ! Direct reflect and transmission + ! + ! Eq 18; k = SQRT(gamma1**2 - gamma2**2), limited below to avoid div by 0. + ! k = 0 for isotropic, conservative scattering; this lower limit on k + ! gives relative error with respect to conservative solution + ! of < 0.1% in Rdif down to tau = 10^-9 + k = sqrt(max((gamma1 - gamma2) * (gamma1 + gamma2), 1.e-12_wp)) + k_mu = k * mu0_s + exp_minusktau = exp(-tau_s*k) + exp_minus2ktau = exp_minusktau * exp_minusktau + + ! Refactored to avoid rounding errors when k, gamma1 are of very different magnitudes + RT_term = 1._wp / (k * (1._wp + exp_minus2ktau) + & + gamma1 * (1._wp - exp_minus2ktau) ) + ! Equation 25 + Rdif(icol,lay_index,igpt) = RT_term * gamma2 * (1._wp - exp_minus2ktau) + + ! Equation 26 + Tdif(icol,lay_index,igpt) = RT_term * 2._wp * k * exp_minusktau + + ! + ! On a round earth, where mu0 can increase with depth in the atmosphere, + ! levels with mu0 <= 0 have no direct beam and hence no source for diffuse light + ! + if(mu0_s > 0._wp) then + ! + ! Equation 14, multiplying top and bottom by exp(-k*tau) + ! and rearranging to avoid div by 0. + ! + RT_term = w0_s * RT_term/merge(1._wp - k_mu*k_mu, & + epsilon(1._wp), & + abs(1._wp - k_mu*k_mu) >= epsilon(1._wp)) + ! + ! Zdunkowski Practical Improved Flux Method "PIFM" + ! (Zdunkowski et al., 1980; Contributions to Atmospheric Physics 53, 147-66) + ! + gamma3 = (2._wp - 3._wp * mu0_s * g_s ) * .25_wp + gamma4 = 1._wp - gamma3 + alpha1 = gamma1 * gamma4 + gamma2 * gamma3 ! Eq. 16 + alpha2 = gamma1 * gamma3 + gamma2 * gamma4 ! Eq. 17 + + ! + ! Transmittance of direct, unscattered beam. + ! + k_gamma3 = k * gamma3 + k_gamma4 = k * gamma4 + Tnoscat = exp(-tau_s/mu0_s) + Rdir = RT_term * & + ((1._wp - k_mu) * (alpha2 + k_gamma3) - & + (1._wp + k_mu) * (alpha2 - k_gamma3) * exp_minus2ktau - & + 2.0_wp * (k_gamma3 - alpha2 * k_mu) * exp_minusktau * Tnoscat) + ! + ! Equation 15, multiplying top and bottom by exp(-k*tau), + ! multiplying through by exp(-tau/mu0) to + ! prefer underflow to overflow + ! Omitting direct transmittance + ! + Tdir = -RT_term * & + ((1._wp + k_mu) * (alpha1 + k_gamma4) * Tnoscat - & + (1._wp - k_mu) * (alpha1 - k_gamma4) * exp_minus2ktau * Tnoscat - & + 2.0_wp * (k_gamma4 + alpha1 * k_mu) * exp_minusktau) + source_up (icol,lay_index, igpt) = Rdir * inc_flux + source_dn (icol,lay_index, igpt) = Tdir * inc_flux + flux_dn_dir(icol,trans_index,igpt) = Tnoscat * inc_flux + else + source_up (icol,lay_index, igpt) = 0._wp + source_dn (icol,lay_index, igpt) = 0._wp + flux_dn_dir(icol,trans_index,igpt) = 0._wp + end if + end do + source_sfc(icol,igpt) = flux_dn_dir(icol,trans_index,igpt)*sfc_albedo(icol,igpt) + end do + end do + end subroutine sw_dif_and_source +! --------------------------------------------------------------- +! +! Transport of diffuse radiation through a vertically layered atmosphere. +! Equations are after Shonk and Hogan 2008, doi:10.1175/2007JCLI1940.1 (SH08) +! This routine is shared by longwave and shortwave +! +! ------------------------------------------------------------------------------------------------- + subroutine adding(ncol, nlay, ngpt, top_at_1, & + albedo_sfc, & + rdif, tdif, & + src_dn, src_up, src_sfc, & + flux_up, flux_dn) + !dir$ optimize(-O0) + integer, intent(in ) :: ncol, nlay, ngpt + logical(wl), intent(in ) :: top_at_1 + real(wp), dimension(ncol ,ngpt), intent(in ) :: albedo_sfc + real(wp), dimension(ncol,nlay ,ngpt), intent(in ) :: rdif, tdif + real(wp), dimension(ncol,nlay ,ngpt), intent(in ) :: src_dn, src_up + real(wp), dimension(ncol ,ngpt), intent(in ) :: src_sfc + real(wp), dimension(ncol,nlay+1,ngpt), intent( out) :: flux_up + ! intent(inout) because top layer includes incident flux + real(wp), dimension(ncol,nlay+1,ngpt), intent(inout) :: flux_dn + ! ------------------ + integer :: icol, ilev, igpt + + ! These arrays could be private per thread in OpenACC, with 1 dimension of size nlay (or nlay+1) + ! However, current PGI (19.4) has a bug preventing it from properly handling such private arrays. + ! So we explicitly create the temporary arrays of size nlay(+1) per each of the ncol*ngpt elements + ! + real(wp), dimension(ncol,nlay+1,ngpt) :: albedo, & ! reflectivity to diffuse radiation below this level + ! alpha in SH08 + src ! source of diffuse upwelling radiation from emission or + ! scattering of direct beam + ! G in SH08 + real(wp), dimension(ncol,nlay ,ngpt) :: denom ! beta in SH08 + ! ------------------ + ! --------------------------------- + ! + ! Indexing into arrays for upward and downward propagation depends on the vertical + ! orientation of the arrays (whether the domain top is at the first or last index) + ! We write the loops out explicitly so compilers will have no trouble optimizing them. + ! + !$acc enter data copyin(albedo_sfc, rdif, tdif, src_dn, src_up, src_sfc, flux_dn) + !$omp target enter data map(to:albedo_sfc, rdif, tdif, src_dn, src_up, src_sfc, flux_dn) + !$acc enter data create(flux_up, albedo, src, denom) + !$omp target enter data map(alloc:flux_up, albedo, src, denom) + + if(top_at_1) then + !$acc parallel loop gang vector collapse(2) + !$omp target teams distribute parallel do simd collapse(2) + do igpt = 1, ngpt + do icol = 1, ncol + ilev = nlay + 1 + ! Albedo of lowest level is the surface albedo... + albedo(icol,ilev,igpt) = albedo_sfc(icol,igpt) + ! ... and source of diffuse radiation is surface emission + src(icol,ilev,igpt) = src_sfc(icol,igpt) + + ! + ! From bottom to top of atmosphere -- + ! compute albedo and source of upward radiation + ! + do ilev = nlay, 1, -1 + denom(icol,ilev,igpt) = 1._wp/(1._wp - rdif(icol,ilev,igpt)*albedo(icol,ilev+1,igpt)) ! Eq 10 + albedo(icol,ilev,igpt) = rdif(icol,ilev,igpt) + & + tdif(icol,ilev,igpt)*tdif(icol,ilev,igpt) * albedo(icol,ilev+1,igpt) * denom(icol,ilev,igpt) ! Equation 9 + ! + ! Equation 11 -- source is emitted upward radiation at top of layer plus + ! radiation emitted at bottom of layer, + ! transmitted through the layer and reflected from layers below (tdiff*src*albedo) + ! + src(icol,ilev,igpt) = src_up(icol, ilev, igpt) + & + tdif(icol,ilev,igpt) * denom(icol,ilev,igpt) * & + (src(icol,ilev+1,igpt) + albedo(icol,ilev+1,igpt)*src_dn(icol,ilev,igpt)) + end do + + ! Eq 12, at the top of the domain upwelling diffuse is due to ... + ilev = 1 + flux_up(icol,ilev,igpt) = flux_dn(icol,ilev,igpt) * albedo(icol,ilev,igpt) + & ! ... reflection of incident diffuse and + src(icol,ilev,igpt) ! emission from below + + ! + ! From the top of the atmosphere downward -- compute fluxes + ! + do ilev = 2, nlay+1 + flux_dn(icol,ilev,igpt) = (tdif(icol,ilev-1,igpt)*flux_dn(icol,ilev-1,igpt) + & ! Equation 13 + rdif(icol,ilev-1,igpt)*src(icol,ilev,igpt) + & + src_dn(icol,ilev-1,igpt)) * denom(icol,ilev-1,igpt) + flux_up(icol,ilev,igpt) = flux_dn(icol,ilev,igpt) * albedo(icol,ilev,igpt) + & ! Equation 12 + src(icol,ilev,igpt) + end do + end do + end do + + else + + !$acc parallel loop collapse(2) + !$omp target teams distribute parallel do simd collapse(2) + do igpt = 1, ngpt + do icol = 1, ncol + ilev = 1 + ! Albedo of lowest level is the surface albedo... + albedo(icol,ilev,igpt) = albedo_sfc(icol,igpt) + ! ... and source of diffuse radiation is surface emission + src(icol,ilev,igpt) = src_sfc(icol,igpt) + + ! + ! From bottom to top of atmosphere -- + ! compute albedo and source of upward radiation + ! + do ilev = 1, nlay + denom (icol,ilev ,igpt) = 1._wp/(1._wp - rdif(icol,ilev,igpt)*albedo(icol,ilev,igpt)) ! Eq 10 + albedo(icol,ilev+1,igpt) = rdif(icol,ilev,igpt) + & + tdif(icol,ilev,igpt)*tdif(icol,ilev,igpt) * albedo(icol,ilev,igpt) * denom(icol,ilev,igpt) ! Equation 9 + ! + ! Equation 11 -- source is emitted upward radiation at top of layer plus + ! radiation emitted at bottom of layer, + ! transmitted through the layer and reflected from layers below (tdiff*src*albedo) + ! + src(icol,ilev+1,igpt) = src_up(icol, ilev, igpt) + & + tdif(icol,ilev,igpt) * denom(icol,ilev,igpt) * & + (src(icol,ilev,igpt) + albedo(icol,ilev,igpt)*src_dn(icol,ilev,igpt)) + end do + + ! Eq 12, at the top of the domain upwelling diffuse is due to ... + ilev = nlay+1 + flux_up(icol,ilev,igpt) = flux_dn(icol,ilev,igpt) * albedo(icol,ilev,igpt) + & ! ... reflection of incident diffuse and + src(icol,ilev,igpt) ! scattering by the direct beam below + + ! + ! From the top of the atmosphere downward -- compute fluxes + ! + do ilev = nlay, 1, -1 + flux_dn(icol,ilev,igpt) = (tdif(icol,ilev,igpt)*flux_dn(icol,ilev+1,igpt) + & ! Equation 13 + rdif(icol,ilev,igpt)*src(icol,ilev,igpt) + & + src_dn(icol, ilev, igpt)) * denom(icol,ilev,igpt) + flux_up(icol,ilev,igpt) = flux_dn(icol,ilev,igpt) * albedo(icol,ilev,igpt) + & ! Equation 12 + src(icol,ilev,igpt) + + end do + end do + end do + end if + !$acc exit data delete(albedo_sfc, rdif, tdif, src_dn, src_up, src_sfc, albedo, src, denom) + !$omp target exit data map(release:albedo_sfc, rdif, tdif, src_dn, src_up, src_sfc, albedo, src, denom) + !$acc exit data copyout(flux_up, flux_dn) + !$omp target exit data map(from:flux_up, flux_dn) + end subroutine adding +! ------------------------------------------------------------------------------------------------- +! +! Similar to Longwave no-scattering tarnsport (lw_transport_noscat) +! a) adds adjustment factor based on cloud properties +! +! implementation notice: +! the adjustmentFactor computation can be skipped where Cn <= epsilon +! +! ------------------------------------------------------------------------------------------------- +subroutine lw_transport_1rescl(ncol, nlay, ngpt, top_at_1, & + trans, source_dn, source_up, & + radn_up, radn_dn, An, Cn, & + do_Jacobians, radn_up_Jac) + integer, intent(in ) :: ncol, nlay, ngpt ! Number of columns, layers, g-points + logical(wl), intent(in ) :: top_at_1 ! + real(wp), dimension(ncol,nlay ,ngpt), intent(in ) :: trans ! transmissivity = exp(-tau) + real(wp), dimension(ncol,nlay ,ngpt), intent(in ) :: source_dn, & + source_up ! Diffuse radiation emitted by the layer + real(wp), dimension(ncol,nlay+1,ngpt), intent(inout) :: radn_up ! Radiances [W/m2-str] + real(wp), dimension(ncol,nlay+1,ngpt), intent(inout) :: radn_dn !Top level must contain incident flux boundary condition + real(wp), dimension(ncol,nlay ,ngpt), intent(in ) :: An, Cn + logical(wl), intent(in ) :: do_Jacobians + real(wp), dimension(ncol,nlay+1,ngpt), intent(inout) :: radn_up_Jac ! Radiances [W/m2-str] + ! --------------------------------------------------- + ! Local variables + integer :: ilev, icol, igpt + real(wp) :: adjustmentFactor + ! --------------------------------------------------- + if(top_at_1) then + ! + ! Top of domain is index 1 + ! + ! Downward propagation +#ifdef _CRAYFTN + !$acc parallel loop collapse(2) present(radn_up_Jac) +#else + !$acc parallel loop collapse(2) no_create(radn_up_Jac) +#endif + !$omp target teams distribute parallel do simd collapse(2) + do igpt = 1, ngpt + do icol = 1, ncol + ! Upward propagation + do ilev = nlay, 1, -1 + adjustmentFactor = Cn(icol,ilev,igpt) * & + ( An(icol,ilev,igpt)*radn_dn(icol,ilev,igpt) - & + source_dn(icol,ilev,igpt)*trans(icol,ilev,igpt ) - & + source_up(icol,ilev,igpt)) + radn_up(icol,ilev,igpt) = trans(icol,ilev,igpt)*radn_up (icol,ilev+1,igpt) + & + source_up(icol,ilev,igpt) + adjustmentFactor + enddo + if(do_Jacobians) then + do ilev = nlay, 1, -1 + radn_up_Jac(icol,ilev,igpt) = trans(icol,ilev,igpt)*radn_up_Jac(icol,ilev+1,igpt) + end do + end if + + ! radn_dn_Jac(icol,1,igpt) = 0._wp + ! 2nd Downward propagation + do ilev = 1, nlay + ! radn_dn_Jac(icol,ilev+1,igpt) = trans(icol,ilev,igpt)*radn_dn_Jac(icol,ilev,igpt) + adjustmentFactor = Cn(icol,ilev,igpt)*( & + An(icol,ilev,igpt)*radn_up(icol,ilev,igpt) - & + source_up(icol,ilev,igpt)*trans(icol,ilev,igpt) - & + source_dn(icol,ilev,igpt) ) + radn_dn(icol,ilev+1,igpt) = trans(icol,ilev,igpt)*radn_dn (icol,ilev, igpt) + & + source_dn(icol,ilev,igpt) + adjustmentFactor + ! adjustmentFactor = Cn(icol,ilev,igpt)*An(icol,ilev,igpt)*radn_up_Jac(icol,ilev,igpt) + ! radn_dn_Jac(icol,ilev+1,igpt) = radn_dn_Jac(icol,ilev+1,igpt) + adjustmentFactor + enddo + enddo + enddo + else +#ifdef _CRAYFTN + !$acc parallel loop collapse(2) present(radn_up_Jac) +#else + !$acc parallel loop collapse(2) no_create(radn_up_Jac) +#endif + !$omp target teams distribute parallel do simd collapse(2) + do igpt = 1, ngpt + do icol = 1, ncol + ! Upward propagation + do ilev = 1, nlay + adjustmentFactor = Cn(icol,ilev,igpt)*& + ( An(icol,ilev,igpt)*radn_dn(icol,ilev+1,igpt) - & + source_dn(icol,ilev,igpt) *trans(icol,ilev ,igpt) - & + source_up(icol,ilev,igpt)) + radn_up(icol,ilev+1,igpt) = trans(icol,ilev,igpt)*radn_up (icol,ilev,igpt) + & + source_up(icol,ilev,igpt) + adjustmentFactor + end do + if(do_Jacobians) then + do ilev = 1, nlay + radn_up_Jac(icol,ilev+1,igpt) = trans(icol,ilev,igpt)*radn_up_Jac(icol,ilev,igpt) + end do + end if + + ! 2st Downward propagation + ! radn_dn_Jac(icol,nlay+1,igpt) = 0._wp + do ilev = nlay, 1, -1 + ! radn_dn_Jac(icol,ilev,igpt) = trans(icol,ilev,igpt)*radn_dn_Jac(icol,ilev+1,igpt) + adjustmentFactor = Cn(icol,ilev,igpt)*( & + An(icol,ilev,igpt)*radn_up(icol,ilev,igpt) - & + source_up(icol,ilev,igpt)*trans(icol,ilev ,igpt ) - & + source_dn(icol,ilev,igpt) ) + radn_dn(icol,ilev,igpt) = trans(icol,ilev,igpt)*radn_dn (icol,ilev+1,igpt) + & + source_dn(icol,ilev,igpt) + adjustmentFactor + ! adjustmentFactor = Cn(icol,ilev,igpt)*An(icol,ilev,igpt)*radn_up_Jac(icol,ilev,igpt) + ! radn_dn_Jac(icol,ilev,igpt) = radn_dn_Jac(icol,ilev,igpt) + adjustmentFactor + end do + enddo + enddo + end if + end subroutine lw_transport_1rescl + ! ------------------------------------------------------------------------------------------------- + ! + ! Spectral reduction over all points + ! + subroutine sum_broadband_factor(ncol, nlev, ngpt, factor, spectral_flux, broadband_flux) + integer, intent(in ) :: ncol, nlev, ngpt + real(wp), intent(in ) :: factor + real(wp), dimension(ncol, nlev, ngpt), intent(in ) :: spectral_flux + real(wp), dimension(ncol, nlev), intent(out) :: broadband_flux + + integer :: icol, ilev, igpt + real(wp) :: scalar ! local scalar version + + !$acc parallel loop gang vector collapse(2) + !$omp target teams distribute parallel do simd collapse(2) + do ilev = 1, nlev + do icol = 1, ncol + + scalar = 0.0_wp + + do igpt = 1, ngpt + scalar = scalar + spectral_flux(icol, ilev, igpt) + end do + + broadband_flux(icol, ilev) = factor * scalar + end do + end do + end subroutine sum_broadband_factor + ! ------------------------------------------------------------------------------------------------- + ! + ! Apply a scalar weight to every element of an array + ! + subroutine apply_factor_3D(ncol, nlev, ngpt, factor, array) + integer, intent(in ) :: ncol, nlev, ngpt + real(wp), intent(in ) :: factor + real(wp), dimension(ncol, nlev, ngpt), intent(inout) :: array + + integer :: icol, ilev, igpt + + !$acc parallel loop gang vector collapse(3) + !$omp target teams distribute parallel do simd collapse(3) + do igpt = 1, ngpt + do ilev = 1, nlev + do icol = 1, ncol + array(icol, ilev, igpt) = factor * array(icol, ilev, igpt) + end do + end do + end do + end subroutine apply_factor_3D + ! ------------------------------------------------------------------------------------------------- + ! + ! Add an array to an existing array + ! + subroutine add_arrays_3D(ncol, nlev, ngpt, increment, array) + integer, intent(in ) :: ncol, nlev, ngpt + real(wp), dimension(ncol, nlev, ngpt), intent(in ) :: increment + real(wp), dimension(ncol, nlev, ngpt), intent(inout) :: array + + integer :: icol, ilev, igpt + + !$acc parallel loop gang vector collapse(3) + !$omp target teams distribute parallel do simd collapse(3) + do igpt = 1, ngpt + do ilev = 1, nlev + do icol = 1, ncol + array(icol, ilev, igpt) = array(icol, ilev, igpt) + increment(icol, ilev, igpt) + end do + end do + end do + end subroutine add_arrays_3D + ! ------------------------------------------------------------------------------------------------- + subroutine add_arrays_2D(ncol, nlev, increment, array) + integer, intent(in ) :: ncol, nlev + real(wp), dimension(ncol, nlev), intent(in ) :: increment + real(wp), dimension(ncol, nlev), intent(inout) :: array + + integer :: icol, ilev + + !$acc parallel loop gang vector collapse(2) + !$omp target teams distribute parallel do simd collapse(2) + do ilev = 1, nlev + do icol = 1, ncol + array(icol, ilev) = array(icol, ilev) + increment(icol, ilev) + end do + end do + end subroutine add_arrays_2D + ! ------------------------------------------------------------------------------------------------- +end module mo_rte_solver_kernels diff --git a/src/radiate/rte-rrtmgp/rte/kernels/mo_fluxes_broadband_kernels.F90 b/src/radiate/rte-rrtmgp/rte/kernels/mo_fluxes_broadband_kernels.F90 new file mode 100644 index 0000000..8437dfb --- /dev/null +++ b/src/radiate/rte-rrtmgp/rte/kernels/mo_fluxes_broadband_kernels.F90 @@ -0,0 +1,130 @@ +! This code is part of Radiative Transfer for Energetics (RTE) +! +! Contacts: Robert Pincus and Eli Mlawer +! email: rrtmgp@aer.com +! +! Copyright 2015-, Atmospheric and Environmental Research, +! Regents of the University of Colorado, Trustees of Columbia University. All right reserved. +! +! Use and duplication is permitted under the terms of the +! BSD 3-clause license, see http://opensource.org/licenses/BSD-3-Clause +! ------------------------------------------------------------------------------------------------- +!> +!> ## Kernels for computing broadband fluxes +!> +! ------------------------------------------------------------------------------------------------- +module mo_fluxes_broadband_kernels + use, intrinsic :: iso_c_binding + use mo_rte_kind, only: wp + implicit none + private + public :: sum_broadband, net_broadband + + interface net_broadband + !! Interface for computing net flux + module procedure net_broadband_full, net_broadband_precalc + end interface net_broadband +contains + ! ---------------------------------------------------------------------------- + !> + !> Spectral reduction over all points + !> + subroutine sum_broadband(ncol, nlev, ngpt, spectral_flux, broadband_flux) bind(C, name="rte_sum_broadband") + integer, intent(in ) :: ncol, nlev, ngpt + !! Array sizes + real(wp), dimension(ncol, nlev, ngpt), intent(in ) :: spectral_flux + !! Spectrally-resolved flux + real(wp), dimension(ncol, nlev), intent(out) :: broadband_flux + !! Sum of spectrally-resolved flux over `ngpt` + + integer :: icol, ilev, igpt + real(wp) :: bb_flux_s ! local scalar version + + !$acc enter data copyin(spectral_flux) create(broadband_flux) + !$omp target enter data map(to:spectral_flux) map(alloc:broadband_flux) + !$acc parallel loop gang vector collapse(2) + !$omp target teams distribute parallel do simd collapse(2) + do ilev = 1, nlev + do icol = 1, ncol + + bb_flux_s = 0.0_wp + + do igpt = 1, ngpt + bb_flux_s = bb_flux_s + spectral_flux(icol, ilev, igpt) + end do + + broadband_flux(icol, ilev) = bb_flux_s + end do + end do + !$acc exit data delete(spectral_flux) copyout(broadband_flux) + !$omp target exit data map(release:spectral_flux) map(from:broadband_flux) + end subroutine sum_broadband + ! ---------------------------------------------------------------------------- + !> + !> Spectral reduction over all points for net flux + !> + subroutine net_broadband_full(ncol, nlev, ngpt, spectral_flux_dn, spectral_flux_up, broadband_flux_net) & + bind(C, name="rte_net_broadband_full") + integer, intent(in ) :: ncol, nlev, ngpt + !! Array sizes + real(wp), dimension(ncol, nlev, ngpt), intent(in ) :: spectral_flux_dn, spectral_flux_up + !! Spectrally-resolved flux up and down + real(wp), dimension(ncol, nlev), intent(out) :: broadband_flux_net + !! Net (down minus up) summed over `ngpt` + + integer :: icol, ilev, igpt + real(wp) :: diff + + !$acc enter data copyin(spectral_flux_dn, spectral_flux_up) create(broadband_flux_net) + !$omp target enter data map(to:spectral_flux_dn, spectral_flux_up) map(alloc:broadband_flux_net) + !$acc parallel loop collapse(2) + !$omp target teams distribute parallel do simd collapse(2) + do ilev = 1, nlev + do icol = 1, ncol + diff = spectral_flux_dn(icol, ilev, 1 ) - spectral_flux_up(icol, ilev, 1) + broadband_flux_net(icol, ilev) = diff + end do + end do + !$acc parallel loop collapse(3) + !$omp target teams distribute parallel do simd collapse(3) + do igpt = 2, ngpt + do ilev = 1, nlev + do icol = 1, ncol + diff = spectral_flux_dn(icol, ilev, igpt) - spectral_flux_up(icol, ilev, igpt) + !$acc atomic update + !$omp atomic update + broadband_flux_net(icol, ilev) = broadband_flux_net(icol, ilev) + diff + end do + end do + end do + !$acc exit data delete(spectral_flux_dn, spectral_flux_up) copyout(broadband_flux_net) + !$omp target exit data map(release:spectral_flux_dn, spectral_flux_up) map(from:broadband_flux_net) + end subroutine net_broadband_full + ! ---------------------------------------------------------------------------- + !> + !> Net flux when bradband flux up and down are already available + !> + subroutine net_broadband_precalc(ncol, nlev, flux_dn, flux_up, broadband_flux_net) & + bind(C, name="rte_net_broadband_precalc") + integer, intent(in ) :: ncol, nlev + !! Array sizes + real(wp), dimension(ncol, nlev), intent(in ) :: flux_dn, flux_up + !! Broadband downward and upward fluxes + real(wp), dimension(ncol, nlev), intent(out) :: broadband_flux_net + !! Net (down minus up) + + integer :: icol, ilev + !$acc enter data copyin(flux_dn, flux_up) create(broadband_flux_net) + !$omp target enter data map(to:flux_dn, flux_up) map(alloc:broadband_flux_net) + !$acc parallel loop collapse(2) + !$omp target teams distribute parallel do simd collapse(2) + do ilev = 1, nlev + do icol = 1, ncol + broadband_flux_net(icol,ilev) = flux_dn(icol,ilev) - flux_up(icol,ilev) + end do + end do + !$acc exit data delete(flux_dn, flux_up) copyout(broadband_flux_net) + !$omp target exit data map(release:flux_dn, flux_up) map(from:broadband_flux_net) + end subroutine net_broadband_precalc + ! ---------------------------------------------------------------------------- +end module mo_fluxes_broadband_kernels diff --git a/src/radiate/rte-rrtmgp/rte/kernels/mo_optical_props_kernels.F90 b/src/radiate/rte-rrtmgp/rte/kernels/mo_optical_props_kernels.F90 new file mode 100644 index 0000000..9c971bd --- /dev/null +++ b/src/radiate/rte-rrtmgp/rte/kernels/mo_optical_props_kernels.F90 @@ -0,0 +1,707 @@ +! This code is part of Radiative Transfer for Energetics (RTE) +! +! Contacts: Robert Pincus and Eli Mlawer +! email: rrtmgp@aer.com +! +! Copyright 2015-, Atmospheric and Environmental Research, +! Regents of the University of Colorado, Trustees of Columbia University. All right reserved. +! +! Use and duplication is permitted under the terms of the +! BSD 3-clause license, see http://opensource.org/licenses/BSD-3-Clause +! ------------------------------------------------------------------------------------------------- +! +!> ## Kernels for arrays of optical properties: +!> - delta-scaling +!> - adding two sets of properties +!> - extracting subsets along the column dimension +! +! ------------------------------------------------------------------------------------------------- + +module mo_optical_props_kernels + use, intrinsic :: iso_c_binding + use mo_rte_kind, only: wp, wl + implicit none + + public + + !> Delta-scale two-stream optical properties + interface delta_scale_2str_kernel + module procedure delta_scale_2str_f_k, delta_scale_2str_k + end interface + + !> Subsetting, meaning extracting some portion of the 3D domain + interface extract_subset + module procedure extract_subset_dim1_3d, extract_subset_dim2_4d + module procedure extract_subset_absorption_tau + end interface extract_subset + + real(wp), parameter, private :: eps = 3.0_wp*tiny(1.0_wp) +contains + ! ------------------------------------------------------------------------------------------------- + ! + ! Delta-scaling is provided only for two-stream properties at present + ! + ! ------------------------------------------------------------------------------------------------- + !> Delta-scale two-stream optical properties given user-provided value of \(f\) (forward scattering) + ! + pure subroutine delta_scale_2str_f_k(ncol, nlay, ngpt, tau, ssa, g, f) & + bind(C, name="rte_delta_scale_2str_f_k") + integer, intent(in ) :: ncol, nlay, ngpt + !! Array sizes + real(wp), dimension(ncol, nlay, ngpt), intent(inout) :: tau, ssa, g + !! Optical depth, single-scattering albedo, asymmetry parameter + real(wp), dimension(ncol, nlay, ngpt), intent(in ) :: f + !! User-provided forward-scattering fraction + + real(wp) :: wf + integer :: icol, ilay, igpt + + do igpt = 1, ngpt + do ilay = 1, nlay + do icol = 1, ncol + wf = ssa(icol,ilay,igpt) * f(icol,ilay,igpt) + tau(icol,ilay,igpt) = (1._wp - wf) * tau(icol,ilay,igpt) + ssa(icol,ilay,igpt) = (ssa(icol,ilay,igpt) - wf) / max(eps,(1.0_wp - wf)) + g (icol,ilay,igpt) = (g (icol,ilay,igpt) - f(icol,ilay,igpt)) / & + max(eps,(1._wp - f(icol,ilay,igpt))) + end do + end do + end do + + end subroutine delta_scale_2str_f_k + ! --------------------------------- + !> Delta-scale assuming forward-scatternig fraction is the square of the asymmetry parameter + !> i.e. \(f = g^2\) + ! + pure subroutine delta_scale_2str_k(ncol, nlay, ngpt, tau, ssa, g) & + bind(C, name="rte_delta_scale_2str_k") + integer, intent(in ) :: ncol, nlay, ngpt + !! Array sizes + real(wp), dimension(ncol, nlay, ngpt), intent(inout) :: tau, ssa, g + !! Optical depth, single-scattering albedo, asymmetry parameter + + real(wp) :: f, wf + integer :: icol, ilay, igpt + + do igpt = 1, ngpt + do ilay = 1, nlay + do icol = 1, ncol + f = g (icol,ilay,igpt) * g (icol,ilay,igpt) + wf = ssa(icol,ilay,igpt) * f + tau(icol,ilay,igpt) = (1._wp - wf) * tau(icol,ilay,igpt) + ssa(icol,ilay,igpt) = (ssa(icol,ilay,igpt) - wf) / max(eps,(1.0_wp - wf)) + g (icol,ilay,igpt) = (g (icol,ilay,igpt) - f) / max(eps,(1.0_wp - f)) + end do + end do + end do + + end subroutine delta_scale_2str_k + ! ------------------------------------------------------------------------------------------------- + ! + ! Addition of optical properties: the first set are incremented by the second set. + ! + ! There are three possible representations of optical properties (scalar = optical depth only; + ! two-stream = tau, single-scattering albedo, and asymmetry factor g, and + ! n-stream = tau, ssa, and phase function moments p.) Thus we need nine routines, three for + ! each choice of representation on the left hand side times three representations of the + ! optical properties to be added. + ! + ! There are two sets of these nine routines. In the first the two sets of optical + ! properties are defined at the same spectral resolution. There is also a set of routines + ! to add properties defined at lower spectral resolution to a set defined at higher spectral + ! resolution (adding properties defined by band to those defined by g-point) + ! + ! ------------------------------------------------------------------------------------------------- + !> increase one absorption optical depth by a second value + pure subroutine increment_1scalar_by_1scalar(ncol, nlay, ngpt, & + tau1, & + tau2) bind(C, name="rte_increment_1scalar_by_1scalar") + integer, intent(in ) :: ncol, nlay, ngpt !! array sizes + real(wp), dimension(ncol,nlay,ngpt), intent(inout) :: tau1 !! optical properties to be modified + real(wp), dimension(ncol,nlay,ngpt), intent(in ) :: tau2 !! optical properties to be added to original + + integer :: icol, ilay, igpt + + do igpt = 1, ngpt + do ilay = 1, nlay + do icol = 1, ncol + tau1(icol,ilay,igpt) = tau1(icol,ilay,igpt) + tau2(icol,ilay,igpt) + end do + end do + end do + end subroutine increment_1scalar_by_1scalar + ! --------------------------------- + !> increase absorption optical depth with extinction optical depth (2-stream form) + pure subroutine increment_1scalar_by_2stream(ncol, nlay, ngpt, & + tau1, & + tau2, ssa2) bind(C, name="rte_increment_1scalar_by_2stream") + integer, intent(in ) :: ncol, nlay, ngpt !! array sizes + real(wp), dimension(ncol,nlay,ngpt), intent(inout) :: tau1 !! optical properties to be modified + real(wp), dimension(ncol,nlay,ngpt), intent(in ) :: tau2, ssa2 !! optical properties to be added to original + + integer :: icol, ilay, igpt + + do igpt = 1, ngpt + do ilay = 1, nlay + do icol = 1, ncol + tau1(icol,ilay,igpt) = tau1(icol,ilay,igpt) + & + tau2(icol,ilay,igpt) * (1._wp - ssa2(icol,ilay,igpt)) + end do + end do + end do + end subroutine increment_1scalar_by_2stream + ! --------------------------------- + !> increase absorption optical depth with extinction optical depth (n-stream form) + pure subroutine increment_1scalar_by_nstream(ncol, nlay, ngpt, & + tau1, & + tau2, ssa2) bind(C, name="rte_increment_1scalar_by_nstream") + integer, intent(in ) :: ncol, nlay, ngpt !! array sizes + real(wp), dimension(ncol,nlay,ngpt), intent(inout) :: tau1 !! optical properties to be modified + real(wp), dimension(ncol,nlay,ngpt), intent(in ) :: tau2, ssa2 !! optical properties to be added to original + + integer :: icol, ilay, igpt + + do igpt = 1, ngpt + do ilay = 1, nlay + do icol = 1, ncol + tau1(icol,ilay,igpt) = tau1(icol,ilay,igpt) + & + tau2(icol,ilay,igpt) * (1._wp - ssa2(icol,ilay,igpt)) + end do + end do + end do + end subroutine increment_1scalar_by_nstream + ! --------------------------------- + ! --------------------------------- + !> increment two-stream optical properties \(\tau, \omega_0, g\) with absorption optical depth + pure subroutine increment_2stream_by_1scalar(ncol, nlay, ngpt, & + tau1, ssa1, & + tau2) bind(C, name="rte_increment_2stream_by_1scalar") + integer, intent(in ) :: ncol, nlay, ngpt !! array sizes + real(wp), dimension(ncol,nlay,ngpt), intent(inout) :: tau1, ssa1 !! optical properties to be modified + real(wp), dimension(ncol,nlay,ngpt), intent(in ) :: tau2 !! optical properties to be added to original + + integer :: icol, ilay, igpt + real(wp) :: tau12 + + do igpt = 1, ngpt + do ilay = 1, nlay + do icol = 1, ncol + tau12 = tau1(icol,ilay,igpt) + tau2(icol,ilay,igpt) + ssa1(icol,ilay,igpt) = tau1(icol,ilay,igpt) * ssa1(icol,ilay,igpt) / max(eps,tau12) + tau1(icol,ilay,igpt) = tau12 + ! g is unchanged + end do + end do + end do + end subroutine increment_2stream_by_1scalar + ! --------------------------------- + !> increment two-stream optical properties \(\tau, \omega_0, g\) with a second set + pure subroutine increment_2stream_by_2stream(ncol, nlay, ngpt, & + tau1, ssa1, g1, & + tau2, ssa2, g2) bind(C, name="rte_increment_2stream_by_2stream") + integer, intent(in ) :: ncol, nlay, ngpt !! array sizes + real(wp), dimension(ncol,nlay,ngpt), intent(inout) :: tau1, ssa1, g1 !! optical properties to be modified + real(wp), dimension(ncol,nlay,ngpt), intent(in ) :: tau2, ssa2, g2 !! optical properties to be added to original + + integer :: icol, ilay, igpt + real(wp) :: tau12, tauscat12 + + do igpt = 1, ngpt + do ilay = 1, nlay + do icol = 1, ncol + ! t=tau1 + tau2 + tau12 = tau1(icol,ilay,igpt) + tau2(icol,ilay,igpt) + ! w=(tau1*ssa1 + tau2*ssa2) / t + tauscat12 = tau1(icol,ilay,igpt) * ssa1(icol,ilay,igpt) + & + tau2(icol,ilay,igpt) * ssa2(icol,ilay,igpt) + g1(icol,ilay,igpt) = & + (tau1(icol,ilay,igpt) * ssa1(icol,ilay,igpt) * g1(icol,ilay,igpt) + & + tau2(icol,ilay,igpt) * ssa2(icol,ilay,igpt) * g2(icol,ilay,igpt)) & + / max(eps,tauscat12) + ssa1(icol,ilay,igpt) = tauscat12 / max(eps,tau12) + tau1(icol,ilay,igpt) = tau12 + end do + end do + end do + end subroutine increment_2stream_by_2stream + ! --------------------------------- + !> increment two-stream optical properties \(\tau, \omega_0, g\) with _n_-stream + pure subroutine increment_2stream_by_nstream(ncol, nlay, ngpt, nmom2, & + tau1, ssa1, g1, & + tau2, ssa2, p2) bind(C, name="rte_increment_2stream_by_nstream") + integer, intent(in ) :: ncol, nlay, ngpt, nmom2 !! array sizes + real(wp), dimension(ncol,nlay,ngpt), intent(inout) :: tau1, ssa1, g1 !! optical properties to be modified + real(wp), dimension(ncol,nlay,ngpt), intent(in ) :: tau2, ssa2 !! optical properties to be added to original + real(wp), dimension(nmom2, & + ncol,nlay,ngpt), intent(in ) :: p2 !! moments of the phase function to be added + + integer :: icol, ilay, igpt + real(wp) :: tau12, tauscat12 + + do igpt = 1, ngpt + do ilay = 1, nlay + do icol = 1, ncol + ! t=tau1 + tau2 + tau12 = tau1(icol,ilay,igpt) + tau2(icol,ilay,igpt) + ! w=(tau1*ssa1 + tau2*ssa2) / t + tauscat12 = & + tau1(icol,ilay,igpt) * ssa1(icol,ilay,igpt) + & + tau2(icol,ilay,igpt) * ssa2(icol,ilay,igpt) + g1(icol,ilay,igpt) = & + (tau1(icol,ilay,igpt) * ssa1(icol,ilay,igpt) * g1( icol,ilay,igpt)+ & + tau2(icol,ilay,igpt) * ssa2(icol,ilay,igpt) * p2(1, icol,ilay,igpt)) / max(eps,tauscat12) + ssa1(icol,ilay,igpt) = tauscat12 / max(eps,tau12) + tau1(icol,ilay,igpt) = tau12 + end do + end do + end do + end subroutine increment_2stream_by_nstream + ! --------------------------------- + ! --------------------------------- + !> increment _n_-stream optical properties \(\tau, \omega_0, p\) with absorption optical depth + pure subroutine increment_nstream_by_1scalar(ncol, nlay, ngpt, & + tau1, ssa1, & + tau2) bind(C, name="rte_increment_nstream_by_1scalar") + integer, intent(in ) :: ncol, nlay, ngpt !! array sizes + real(wp), dimension(ncol,nlay,ngpt), intent(inout) :: tau1, ssa1 !! optical properties to be modified + real(wp), dimension(ncol,nlay,ngpt), intent(in ) :: tau2 !! optical properties to be added to original + + integer :: icol, ilay, igpt + real(wp) :: tau12 + + do igpt = 1, ngpt + do ilay = 1, nlay + do icol = 1, ncol + tau12 = tau1(icol,ilay,igpt) + tau2(icol,ilay,igpt) + ssa1(icol,ilay,igpt) = tau1(icol,ilay,igpt) * ssa1(icol,ilay,igpt) / max(eps,tau12) + tau1(icol,ilay,igpt) = tau12 + ! p is unchanged + end do + end do + end do + end subroutine increment_nstream_by_1scalar + ! --------------------------------- + !> increment _n_-stream optical properties \(\tau, \omega_0, p\) with two-stream values + pure subroutine increment_nstream_by_2stream(ncol, nlay, ngpt, nmom1, & + tau1, ssa1, p1, & + tau2, ssa2, g2) bind(C, name="rte_increment_nstream_by_2stream") + integer, intent(in ) :: ncol, nlay, ngpt, nmom1 !! array sizes + real(wp), dimension(ncol,nlay,ngpt), intent(inout) :: tau1, ssa1 !! optical properties to be modified + real(wp), dimension(nmom1, & + ncol,nlay,ngpt), intent(inout) :: p1 !! moments of the phase function be modified + real(wp), dimension(ncol,nlay,ngpt), intent(in ) :: tau2, ssa2, g2 !! optical properties to be added to original + + integer :: icol, ilay, igpt + real(wp) :: tau12, tauscat12 + real(wp), dimension(nmom1) :: temp_moms ! TK + integer :: imom !TK + + do igpt = 1, ngpt + do ilay = 1, nlay + do icol = 1, ncol + tau12 = tau1(icol,ilay,igpt) + tau2(icol,ilay,igpt) + tauscat12 = & + tau1(icol,ilay,igpt) * ssa1(icol,ilay,igpt) + & + tau2(icol,ilay,igpt) * ssa2(icol,ilay,igpt) + ! + ! Here assume Henyey-Greenstein + ! + temp_moms(1) = g2(icol,ilay,igpt) + do imom = 2, nmom1 + temp_moms(imom) = temp_moms(imom-1) * g2(icol,ilay,igpt) + end do + p1(1:nmom1, icol,ilay,igpt) = & + (tau1(icol,ilay,igpt) * ssa1(icol,ilay,igpt) * p1(1:nmom1, icol,ilay,igpt) + & + tau2(icol,ilay,igpt) * ssa2(icol,ilay,igpt) * temp_moms(1:nmom1) ) / max(eps,tauscat12) + ssa1(icol,ilay,igpt) = tauscat12 / max(eps,tau12) + tau1(icol,ilay,igpt) = tau12 + end do + end do + end do + end subroutine increment_nstream_by_2stream + ! --------------------------------- + !> increment one set of _n_-stream optical properties with another set + pure subroutine increment_nstream_by_nstream(ncol, nlay, ngpt, nmom1, nmom2, & + tau1, ssa1, p1, & + tau2, ssa2, p2) bind(C, name="rte_increment_nstream_by_nstream") + integer, intent(in ) :: ncol, nlay, ngpt, nmom1, nmom2 !! array sizes + real(wp), dimension(ncol,nlay,ngpt), intent(inout) :: tau1, ssa1 !! optical properties to be modified + real(wp), dimension(nmom1, & + ncol,nlay,ngpt), intent(inout) :: p1 !! moments of the phase function be modified + real(wp), dimension(ncol,nlay,ngpt), intent(in ) :: tau2, ssa2 !! optical properties to be added to original + real(wp), dimension(nmom2, & + ncol,nlay,ngpt), intent(in ) :: p2 !! moments of the phase function to be added + + integer :: icol, ilay, igpt, mom_lim + real(wp) :: tau12, tauscat12 + + mom_lim = min(nmom1, nmom2) + do igpt = 1, ngpt + do ilay = 1, nlay + do icol = 1, ncol + tau12 = tau1(icol,ilay,igpt) + tau2(icol,ilay,igpt) + tauscat12 = & + tau1(icol,ilay,igpt) * ssa1(icol,ilay,igpt) + & + tau2(icol,ilay,igpt) * ssa2(icol,ilay,igpt) + ! + ! If op2 has more moments than op1 these are ignored; + ! if it has fewer moments the higher orders are assumed to be 0 + ! + p1(1:mom_lim, icol,ilay,igpt) = & + (tau1(icol,ilay,igpt) * ssa1(icol,ilay,igpt) * p1(1:mom_lim, icol,ilay,igpt) + & + tau2(icol,ilay,igpt) * ssa2(icol,ilay,igpt) * p2(1:mom_lim, icol,ilay,igpt)) / max(eps,tauscat12) + ssa1(icol,ilay,igpt) = tauscat12 / max(eps,tau12) + tau1(icol,ilay,igpt) = tau12 + end do + end do + end do + end subroutine increment_nstream_by_nstream + ! ------------------------------------------------------------------------------------------------- + ! + ! Incrementing when the second set of optical properties is defined at lower spectral resolution + ! (e.g. by band instead of by gpoint) + ! + ! ------------------------------------------------------------------------------------------------- + !> increase one absorption optical depth defined on g-points by a second value defined on bands + pure subroutine inc_1scalar_by_1scalar_bybnd(ncol, nlay, ngpt, & + tau1, & + tau2, & + nbnd, gpt_lims) bind(C, name="rte_inc_1scalar_by_1scalar_bybnd") + integer, intent(in ) :: ncol, nlay, ngpt, nbnd !! array sizes + real(wp), dimension(ncol,nlay,ngpt), intent(inout) :: tau1 !! optical properties to be modified (defined on g-points) + real(wp), dimension(ncol,nlay,nbnd), intent(in ) :: tau2 !! optical properties to be added to original (defined on bands) + integer, dimension(2,nbnd), intent(in ) :: gpt_lims !! Starting and ending gpoint for each band + + integer :: ibnd, igpt + + do ibnd = 1, nbnd + do igpt = gpt_lims(1, ibnd), gpt_lims(2, ibnd) + tau1(:,:,igpt) = tau1(:,:,igpt) + tau2(:,:,ibnd) + end do + end do + end subroutine inc_1scalar_by_1scalar_bybnd + ! --------------------------------- + !> increase absorption optical depth defined on g-points with extinction optical depth (2-stream form) defined on bands + pure subroutine inc_1scalar_by_2stream_bybnd(ncol, nlay, ngpt, & + tau1, & + tau2, ssa2, & + nbnd, gpt_lims) bind(C, name="rte_inc_1scalar_by_2stream_bybnd") + integer, intent(in ) :: ncol, nlay, ngpt, nbnd !! array sizes + real(wp), dimension(ncol,nlay,ngpt), intent(inout) :: tau1 !! optical properties to be modified (defined on g-points) + real(wp), dimension(ncol,nlay,nbnd), intent(in ) :: tau2, ssa2 !! optical properties to be added to original (defined on bands) + integer, dimension(2,nbnd), intent(in ) :: gpt_lims !! Starting and ending gpoint for each band + + integer :: ibnd, igpt + + do ibnd = 1, nbnd + do igpt = gpt_lims(1, ibnd), gpt_lims(2, ibnd) + tau1(:,:,igpt) = tau1(:,:,igpt) + tau2(:,:,ibnd) * (1._wp - ssa2(:,:,ibnd)) + end do + end do + end subroutine inc_1scalar_by_2stream_bybnd + ! --------------------------------- + !> increase absorption optical depth defined on g-points with extinction optical depth (n-stream form) defined on bands + pure subroutine inc_1scalar_by_nstream_bybnd(ncol, nlay, ngpt, & + tau1, & + tau2, ssa2, & + nbnd, gpt_lims) bind(C, name="rte_inc_1scalar_by_nstream_bybnd") + integer, intent(in ) :: ncol, nlay, ngpt, nbnd !! array sizes + real(wp), dimension(ncol,nlay,ngpt), intent(inout) :: tau1 !! optical properties to be modified (defined on g-points) + real(wp), dimension(ncol,nlay,nbnd), intent(in ) :: tau2, ssa2 !! optical properties to be added to original (defined on bands) + integer, dimension(2,nbnd), intent(in ) :: gpt_lims !! Starting and ending gpoint for each band + + integer :: ibnd, igpt + + do ibnd = 1, nbnd + do igpt = gpt_lims(1, ibnd), gpt_lims(2, ibnd) + tau1(:,:,igpt) = tau1(:,:,igpt) + tau2(:,:,ibnd) * (1._wp - ssa2(:,:,ibnd)) + end do + end do + end subroutine inc_1scalar_by_nstream_bybnd + + ! --------------------------------- + !> increment two-stream optical properties \(\tau, \omega_0, g\) defined on g-points with absorption optical depth defined on bands + pure subroutine inc_2stream_by_1scalar_bybnd(ncol, nlay, ngpt, & + tau1, ssa1, & + tau2, & + nbnd, gpt_lims) bind(C, name="rte_inc_2stream_by_1scalar_bybnd") + integer, intent(in ) :: ncol, nlay, ngpt, nbnd !! array sizes + real(wp), dimension(ncol,nlay,ngpt), intent(inout) :: tau1, ssa1 !! optical properties to be modified (defined on g-points) + real(wp), dimension(ncol,nlay,nbnd), intent(in ) :: tau2 !! optical properties to be added to original (defined on bands) + integer, dimension(2,nbnd), intent(in ) :: gpt_lims !! Starting and ending gpoint for each band + + integer :: icol, ilay, igpt, ibnd + real(wp) :: tau12 + + do ibnd = 1, nbnd + do igpt = gpt_lims(1, ibnd), gpt_lims(2, ibnd) + do ilay = 1, nlay + do icol = 1, ncol + tau12 = tau1(icol,ilay,igpt) + tau2(icol,ilay,ibnd) + ssa1(icol,ilay,igpt) = tau1(icol,ilay,igpt) * ssa1(icol,ilay,igpt) / max(eps,tau12) + tau1(icol,ilay,igpt) = tau12 + ! g is unchanged + end do + end do + end do + end do + end subroutine inc_2stream_by_1scalar_bybnd + ! --------------------------------- + !> increment 2-stream optical properties defined on g-points with another set defined on bands + pure subroutine inc_2stream_by_2stream_bybnd(ncol, nlay, ngpt, & + tau1, ssa1, g1, & + tau2, ssa2, g2, & + nbnd, gpt_lims) bind(C, name="rte_inc_2stream_by_2stream_bybnd") + integer, intent(in ) :: ncol, nlay, ngpt, nbnd !! array sizes + real(wp), dimension(ncol,nlay,ngpt), intent(inout) :: tau1, ssa1, g1 !! optical properties to be modified (defined on g-points) + real(wp), dimension(ncol,nlay,nbnd), intent(in ) :: tau2, ssa2, g2 !! optical properties to be added to original (defined on bands) + integer, dimension(2,nbnd), intent(in ) :: gpt_lims !! Starting and ending gpoint for each band + + integer :: icol, ilay, igpt, ibnd + real(wp) :: tau12, tauscat12 + + do ibnd = 1, nbnd + do igpt = gpt_lims(1, ibnd), gpt_lims(2, ibnd) + do ilay = 1, nlay + do icol = 1, ncol + ! t=tau1 + tau2 + tau12 = tau1(icol,ilay,igpt) + tau2(icol,ilay,ibnd) + ! w=(tau1*ssa1 + tau2*ssa2) / t + tauscat12 = & + tau1(icol,ilay,igpt) * ssa1(icol,ilay,igpt) + & + tau2(icol,ilay,ibnd) * ssa2(icol,ilay,ibnd) + g1(icol,ilay,igpt) = & + (tau1(icol,ilay,igpt) * ssa1(icol,ilay,igpt) * g1(icol,ilay,igpt) + & + tau2(icol,ilay,ibnd) * ssa2(icol,ilay,ibnd) * g2(icol,ilay,ibnd)) / max(eps,tauscat12) + ssa1(icol,ilay,igpt) = tauscat12 / max(eps,tau12) + tau1(icol,ilay,igpt) = tau12 + end do + end do + end do + end do + end subroutine inc_2stream_by_2stream_bybnd + ! --------------------------------- + !> increment 2-stream optical properties defined on g-points with _n_-stream properties set defined on bands + pure subroutine inc_2stream_by_nstream_bybnd(ncol, nlay, ngpt, nmom2, & + tau1, ssa1, g1, & + tau2, ssa2, p2, & + nbnd, gpt_lims) bind(C, name="rte_inc_2stream_by_nstream_bybnd") + integer, intent(in ) :: ncol, nlay, ngpt, nmom2, nbnd !! array sizes + real(wp), dimension(ncol,nlay,ngpt), intent(inout) :: tau1, ssa1, g1 !! optical properties to be modified (defined on g-points) + real(wp), dimension(ncol,nlay,nbnd), intent(in ) :: tau2, ssa2 !! optical properties to be added to original (defined on bands) + real(wp), dimension(nmom2, & + ncol,nlay,nbnd), intent(in ) :: p2 !! moments of the phase function to be added + integer, dimension(2,nbnd), intent(in ) :: gpt_lims !! Starting and ending gpoint for each band + + integer :: icol, ilay, igpt, ibnd + real(wp) :: tau12, tauscat12 + + do ibnd = 1, nbnd + do igpt = gpt_lims(1, ibnd), gpt_lims(2, ibnd) + do ilay = 1, nlay + do icol = 1, ncol + ! t=tau1 + tau2 + tau12 = tau1(icol,ilay,igpt) + tau2(icol,ilay,ibnd) + ! w=(tau1*ssa1 + tau2*ssa2) / t + tauscat12 = & + tau1(icol,ilay,igpt) * ssa1(icol,ilay,igpt) + & + tau2(icol,ilay,ibnd) * ssa2(icol,ilay,ibnd) + g1(icol,ilay,igpt) = & + (tau1(icol,ilay,igpt) * ssa1(icol,ilay,igpt) * g1( icol,ilay,igpt)+ & + tau2(icol,ilay,ibnd) * ssa2(icol,ilay,ibnd) * p2(1, icol,ilay,ibnd)) / max(eps,tauscat12) + ssa1(icol,ilay,igpt) = tauscat12 / max(eps,tau12) + tau1(icol,ilay,igpt) = tau12 + end do + end do + end do + end do + end subroutine inc_2stream_by_nstream_bybnd + ! --------------------------------- + ! --------------------------------- + !> increment _n_-stream optical properties defined on g-points with absorption optical depth defined on bands + pure subroutine inc_nstream_by_1scalar_bybnd(ncol, nlay, ngpt, & + tau1, ssa1, & + tau2, & + nbnd, gpt_lims) bind(C, name="rte_inc_nstream_by_1scalar_bybnd") + integer, intent(in ) :: ncol, nlay, ngpt, nbnd !! array sizes + real(wp), dimension(ncol,nlay,ngpt), intent(inout) :: tau1, ssa1 !! optical properties to be modified (defined on g-points) + real(wp), dimension(ncol,nlay,nbnd), intent(in ) :: tau2 !! optical properties to be added to original (defined on bands) + integer, dimension(2,nbnd), intent(in ) :: gpt_lims !! Starting and ending gpoint for each band + + integer :: icol, ilay, igpt, ibnd + real(wp) :: tau12 + + do ibnd = 1, nbnd + do igpt = gpt_lims(1, ibnd), gpt_lims(2, ibnd) + do ilay = 1, nlay + do icol = 1, ncol + tau12 = tau1(icol,ilay,igpt) + tau2(icol,ilay,ibnd) + ssa1(icol,ilay,igpt) = tau1(icol,ilay,igpt) * ssa1(icol,ilay,igpt) / max(eps,tau12) + tau1(icol,ilay,igpt) = tau12 + ! p is unchanged + end do + end do + end do + end do + end subroutine inc_nstream_by_1scalar_bybnd + ! --------------------------------- + !> increment n-stream optical properties defined on g-points with 2-stream properties set defined on bands + pure subroutine inc_nstream_by_2stream_bybnd(ncol, nlay, ngpt, nmom1, & + tau1, ssa1, p1, & + tau2, ssa2, g2, & + nbnd, gpt_lims) bind(C, name="rte_inc_nstream_by_2stream_bybnd") + integer, intent(in ) :: ncol, nlay, ngpt, nmom1, nbnd !! array sizes + real(wp), dimension(ncol,nlay,ngpt), intent(inout) :: tau1, ssa1 !! optical properties to be modified (defined on g-points) + real(wp), dimension(nmom1, & + ncol,nlay,ngpt), intent(inout) :: p1 !! moments of the phase function be modified + real(wp), dimension(ncol,nlay,nbnd), intent(in ) :: tau2, ssa2, g2 !! optical properties to be added to original (defined on bands) + integer, dimension(2,nbnd), intent(in ) :: gpt_lims !! Starting and ending gpoint for each band + + integer :: icol, ilay, igpt, ibnd + real(wp) :: tau12, tauscat12 + real(wp), dimension(nmom1) :: temp_moms ! TK + integer :: imom !TK + + do ibnd = 1, nbnd + do igpt = gpt_lims(1, ibnd), gpt_lims(2, ibnd) + do ilay = 1, nlay + do icol = 1, ncol + tau12 = tau1(icol,ilay,igpt) + tau2(icol,ilay,ibnd) + tauscat12 = & + tau1(icol,ilay,igpt) * ssa1(icol,ilay,igpt) + & + tau2(icol,ilay,ibnd) * ssa2(icol,ilay,ibnd) + ! + ! Here assume Henyey-Greenstein + ! + temp_moms(1) = g2(icol,ilay,ibnd) + do imom = 2, nmom1 + temp_moms(imom) = temp_moms(imom-1) * g2(icol,ilay,ibnd) + end do + p1(1:nmom1, icol,ilay,igpt) = & + (tau1(icol,ilay,igpt) * ssa1(icol,ilay,igpt) * p1(1:nmom1, icol,ilay,igpt) + & + tau2(icol,ilay,ibnd) * ssa2(icol,ilay,ibnd) * temp_moms(1:nmom1) ) / max(eps,tauscat12) + ssa1(icol,ilay,igpt) = tauscat12 / max(eps,tau12) + tau1(icol,ilay,igpt) = tau12 + end do + end do + end do + end do + end subroutine inc_nstream_by_2stream_bybnd + ! --------------------------------- + !> increment _n_-stream optical properties defined on g-points with a second set defined on bands + pure subroutine inc_nstream_by_nstream_bybnd(ncol, nlay, ngpt, nmom1, nmom2, & + tau1, ssa1, p1, & + tau2, ssa2, p2, & + nbnd, gpt_lims) bind(C, name="rte_inc_nstream_by_nstream_bybnd") + integer, intent(in ) :: ncol, nlay, ngpt, nmom1, nmom2, nbnd !! array sizes + real(wp), dimension(ncol,nlay,ngpt), intent(inout) :: tau1, ssa1 !! optical properties to be modified (defined on g-points) + real(wp), dimension(nmom1, & + ncol,nlay,ngpt), intent(inout) :: p1 !! moments of the phase function be modified + real(wp), dimension(ncol,nlay,nbnd), intent(in ) :: tau2, ssa2 !! optical properties to be added to original (defined on bands) + real(wp), dimension(nmom2, & + ncol,nlay,nbnd), intent(in ) :: p2 !! moments of the phase function to be added + integer, dimension(2,nbnd), intent(in ) :: gpt_lims !! Starting and ending gpoint for each band + + integer :: icol, ilay, igpt, ibnd, mom_lim + real(wp) :: tau12, tauscat12 + + mom_lim = min(nmom1, nmom2) + do ibnd = 1, nbnd + do igpt = gpt_lims(1, ibnd), gpt_lims(2, ibnd) + do ilay = 1, nlay + do icol = 1, ncol + tau12 = tau1(icol,ilay,igpt) + tau2(icol,ilay,ibnd) + tauscat12 = & + tau1(icol,ilay,igpt) * ssa1(icol,ilay,igpt) + & + tau2(icol,ilay,ibnd) * ssa2(icol,ilay,ibnd) + ! + ! If op2 has more moments than op1 these are ignored; + ! if it has fewer moments the higher orders are assumed to be 0 + ! + p1(1:mom_lim, icol,ilay,igpt) = & + (tau1(icol,ilay,igpt) * ssa1(icol,ilay,igpt) * p1(1:mom_lim, icol,ilay,igpt) + & + tau2(icol,ilay,ibnd) * ssa2(icol,ilay,ibnd) * p2(1:mom_lim, icol,ilay,ibnd)) / max(eps,tauscat12) + ssa1(icol,ilay,igpt) = tauscat12 / max(eps,tau12) + tau1(icol,ilay,igpt) = tau12 + end do + end do + end do + end do + end subroutine inc_nstream_by_nstream_bybnd + ! ------------------------------------------------------------------------------------------------- + ! + ! Subsetting, meaning extracting some portion of the 3D domain + ! + ! ------------------------------------------------------------------------------------------------- + !> + !> Extract a subset from the first dimension (normally columns) of a 3D field. + !> Applicable to most variables e.g. tau, ssa, g + !> + pure subroutine extract_subset_dim1_3d(ncol, nlay, ngpt, array_in, colS, colE, array_out) & + bind (C, name="rte_extract_subset_dim1_3d") + integer, intent(in ) :: ncol, nlay, ngpt !! Array sizes + real(wp), dimension(ncol,nlay,ngpt), intent(in ) :: array_in !! Array to subset + integer, intent(in ) :: colS, colE !! Starting and ending index + real(wp), dimension(colE-colS+1,& + nlay,ngpt), intent(out) :: array_out !! subset of the input array + + integer :: icol, ilay, igpt + do igpt = 1, ngpt + do ilay = 1, nlay + do icol = colS, colE + array_out(icol-colS+1, ilay, igpt) = array_in(icol, ilay, igpt) + end do + end do + end do + + end subroutine extract_subset_dim1_3d + ! --------------------------------- + !> Extract a subset from the second dimension (normally columns) of a 4D field. + !> Applicable to phase function moments, where the first dimension is the moment + pure subroutine extract_subset_dim2_4d(nmom, ncol, nlay, ngpt, array_in, colS, colE, array_out) & + bind (C, name="rte_extract_subset_dim2_4d") + integer, intent(in ) :: nmom, ncol, nlay, ngpt !! Array sizes + real(wp), dimension(nmom,ncol,nlay,ngpt), intent(in ) :: array_in !! Array to subset + integer, intent(in ) :: colS, colE !! Starting and ending index + real(wp), dimension(nmom,colE-colS+1,& + nlay,ngpt), intent(out) :: array_out !! subset of the input array + + integer :: icol, ilay, igpt, imom + + do igpt = 1, ngpt + do ilay = 1, nlay + do icol = colS, colE + do imom = 1, nmom + array_out(imom, icol-colS+1, ilay, igpt) = array_in(imom, icol, ilay, igpt) + end do + end do + end do + end do + + end subroutine extract_subset_dim2_4d + ! --------------------------------- + ! + !> Extract the absorption optical thickness \(\tau_{abs} = 1 - \omega_0 \tau_{ext}\) + ! + pure subroutine extract_subset_absorption_tau(ncol, nlay, ngpt, tau_in, ssa_in, & + colS, colE, tau_out) & + bind (C, name="rte_extract_subset_absorption_tau") + integer, intent(in ) :: ncol, nlay, ngpt !! Array sizes + real(wp), dimension(ncol,nlay,ngpt), intent(in ) :: tau_in, ssa_in !! Optical thickness, single scattering albedo + integer, intent(in ) :: colS, colE !! Starting and ending index + real(wp), dimension(colE-colS+1,& + nlay,ngpt), intent(out) :: tau_out !! absorption optical thickness subset + + integer :: icol, ilay, igpt + + do igpt = 1, ngpt + do ilay = 1, nlay + do icol = colS, colE + tau_out(icol-colS+1, ilay, igpt) = & + tau_in(icol, ilay, igpt) * (1._wp - ssa_in(icol, ilay, igpt)) + end do + end do + end do + + end subroutine extract_subset_absorption_tau +end module mo_optical_props_kernels diff --git a/src/radiate/rte-rrtmgp/rte/kernels/mo_rte_solver_kernels.F90 b/src/radiate/rte-rrtmgp/rte/kernels/mo_rte_solver_kernels.F90 new file mode 100644 index 0000000..7e82fa7 --- /dev/null +++ b/src/radiate/rte-rrtmgp/rte/kernels/mo_rte_solver_kernels.F90 @@ -0,0 +1,1281 @@ +! This code is part of Radiative Transfer for Energetics (RTE) +! +! Contacts: Robert Pincus and Eli Mlawer +! email: rrtmgp@aer.com +! +! Copyright 2015-, Atmospheric and Environmental Research, +! Regents of the University of Colorado, Trustees of Columbia University. All right reserved. +! +! Use and duplication is permitted under the terms of the +! BSD 3-clause license, see http://opensource.org/licenses/BSD-3-Clause +! ------------------------------------------------------------------------------------------------- +! +!>## Numeric calculations for radiative transfer solvers +!> - Emission/absorption (no-scattering) calculations +!> - solver for multi-angle Gaussian quadrature +!> - solver for a single angle, calling +!> - source function computation (linear-in-tau) +!> - transport +!> - Extinction-only calculation (direct solar beam) +!> - Two-stream calculations: +!> solvers for LW and SW with different boundary conditions and source functions +!> - source function calculation for LW, SW +!> - two-stream calculations for LW, SW (using different assumtions about phase function) +!> - transport (adding) +!> - Application of boundary conditions +! +! ------------------------------------------------------------------------------------------------- +module mo_rte_solver_kernels + use, intrinsic :: iso_c_binding + use mo_rte_kind, only: wp, wl + use mo_rte_util_array,only: zero_array + implicit none + private + + public :: lw_solver_noscat, lw_solver_2stream, & + sw_solver_noscat, sw_solver_2stream + + real(wp), parameter :: pi = acos(-1._wp) +contains + ! ------------------------------------------------------------------------------------------------- + ! + ! Top-level longwave kernels + ! + ! ------------------------------------------------------------------------------------------------- + ! + !> LW fluxes, no scattering, mu (cosine of integration angle) specified by column + !> Does radiation calculation at user-supplied angles; converts radiances to flux + !> using user-supplied weights + ! + ! --------------------------------------------------------------- + subroutine lw_solver_noscat_oneangle(ncol, nlay, ngpt, top_at_1, D, weight, & + tau, lay_source, lev_source_inc, lev_source_dec, sfc_emis, sfc_src, & + incident_flux, & + flux_up, flux_dn, & + do_broadband, broadband_up, broadband_dn, & + do_Jacobians, sfc_srcJac, flux_upJac, & + do_rescaling, ssa, g) + integer, intent(in ) :: ncol, nlay, ngpt ! Number of columns, layers, g-points + integer, intent(in ) :: top_at_1 + real(wp), dimension(ncol, ngpt), intent(in ) :: D ! secant of propagation angle [] + real(wp), intent(in ) :: weight ! quadrature weight + real(wp), dimension(ncol,nlay, ngpt), intent(in ) :: tau ! Absorption optical thickness [] + real(wp), dimension(ncol,nlay, ngpt), intent(in ) :: lay_source ! Planck source at layer average temperature [W/m2] + ! Planck source at layer edge for radiation in increasing/decreasing ilay direction + ! lev_source_dec applies the mapping in layer i to the Planck function at layer i + ! lev_source_inc applies the mapping in layer i to the Planck function at layer i+1 + real(wp), dimension(ncol,nlay, ngpt), target, & + intent(in ) :: lev_source_inc, lev_source_dec + real(wp), dimension(ncol, ngpt), intent(in ) :: sfc_emis ! Surface emissivity [] + real(wp), dimension(ncol, ngpt), intent(in ) :: sfc_src ! Surface source function [W/m2] + real(wp), dimension(ncol, ngpt), intent(in ) :: incident_flux! Boundary condition for flux [W/m2] + real(wp), dimension(ncol,nlay+1,ngpt), target, & ! Fluxes [W/m2] + intent( out) :: flux_up, flux_dn + ! + ! Optional variables - arrays aren't referenced if corresponding logical == False + ! + integer, intent(in ) :: do_broadband + real(wp), dimension(ncol,nlay+1 ), intent( out) :: broadband_up, broadband_dn ! Spectrally-integrated fluxes [W/m2] + integer, intent(in ) :: do_Jacobians + real(wp), dimension(ncol ,ngpt), intent(in ) :: sfc_srcJac ! surface temperature Jacobian of surface source function [W/m2/K] + real(wp), dimension(ncol,nlay+1 ), intent( out) :: flux_upJac ! surface temperature Jacobian of Radiances [W/m2-str / K] + integer, intent(in ) :: do_rescaling + real(wp), dimension(ncol,nlay ,ngpt), intent(in ) :: ssa, g ! single-scattering albedo, asymmetry parameter + ! ------------------------------------ + ! Local variables, no g-point dependency + ! + integer :: icol, ilay, igpt + integer :: top_level, sfc_level + real(wp), dimension(ncol,nlay) :: tau_loc, & ! path length (tau/mu) + trans ! transmissivity = exp(-tau) + real(wp), dimension(ncol,nlay) :: source_dn, source_up + real(wp), dimension(ncol ) :: sfc_albedo + + real(wp), dimension(:,:,:), pointer :: lev_source_up, lev_source_dn ! Mapping increasing/decreasing indicies to up/down + + real(wp), parameter :: pi = acos(-1._wp) + ! loc_fluxes hold a single g-point flux if fluxes are being integrated instead of returned + ! with spectral detail + real(wp), dimension(ncol,nlay+1), & + target :: loc_flux_up, loc_flux_dn + ! gpt_fluxes point to calculations for the current g-point + real(wp), dimension(:,:), pointer :: gpt_flux_up, gpt_flux_dn + ! ------------------------------------------------------------------------------------------------- + ! Optionally, use an approximate treatment of scattering using rescaling + ! Implemented based on the paper + ! Tang G, et al, 2018: https://doi.org/10.1175/JAS-D-18-0014.1 + ! a) relies on rescaling of the optical parameters based on asymetry factor and single scattering albedo + ! scaling can be computed by scaling_1rescl + ! b) adds adustment term based on cloud properties (lw_transport_1rescl) + ! adustment terms is computed based on solution of the Tang equations + ! for "linear-in-tau" internal source (not in the paper) + ! + ! Used when approximating scattering + ! + real(wp) :: ssal, wb, scaleTau + real(wp), dimension(ncol,nlay ) :: An, Cn + real(wp), dimension(ncol,nlay+1) :: gpt_flux_Jac + ! ------------------------------------ + ! Which way is up? + ! Level Planck sources for upward and downward radiation + ! When top_at_1, lev_source_up => lev_source_dec + ! lev_source_dn => lev_source_inc, and vice-versa + if(top_at_1==1) then + top_level = 1 + sfc_level = nlay+1 + lev_source_up => lev_source_dec + lev_source_dn => lev_source_inc + else + top_level = nlay+1 + sfc_level = 1 + lev_source_up => lev_source_inc + lev_source_dn => lev_source_dec + end if + + ! + ! Integrated fluxes need zeroing + ! + if(do_broadband==1) then + call zero_array(ncol, nlay+1, broadband_up ) + call zero_array(ncol, nlay+1, broadband_dn ) + end if + if(do_Jacobians==1) & + call zero_array(ncol, nlay+1, flux_upJac ) + + do igpt = 1, ngpt + if(do_broadband==1) then + gpt_flux_up => loc_flux_up + gpt_flux_dn => loc_flux_dn + else + gpt_flux_up => flux_up (:,:,igpt) + gpt_flux_dn => flux_dn (:,:,igpt) + end if + ! + ! Transport is for intensity + ! convert flux at top of domain to intensity assuming azimuthal isotropy + ! + gpt_flux_dn(:,top_level) = incident_flux(:,igpt)/(2._wp * pi * weight) + ! + ! Optical path and transmission, used in source function and transport calculations + ! + if (do_rescaling==1) then + ! + ! The scaling and scaleTau terms are independent of propagation + ! angle D and could be pre-computed if several values of D are used + ! We re-compute them here to keep not have to localize memory use + ! + do ilay = 1, nlay + do icol = 1, ncol + ssal = ssa(icol, ilay, igpt) + + ! w is the layer single scattering albedo + ! b is phase function parameter (Eq.13 of the paper) + ! for the similarity principle scaling scheme + ! b = (1-g)/2 (where g is phase function avergae cosine) + wb = ssal*(1._wp - g(icol, ilay, igpt)) * 0.5_wp + + ! scaleTau=1-w(1-b) is a scaling factor of the optical thickness representing + ! the radiative transfer equation in a nonscattering form Eq(14) of the paper + scaleTau = (1._wp - ssal + wb) + + ! Cn = 0.5*wb/(1-w(1-b)) is parameter of Eq.21-22 of the Tang paper + ! Tang paper, p.2222 advises to replace 0.5 with 0.4 based on simulations + Cn(icol,ilay) = 0.4_wp*wb/scaleTau + + ! Eqs.15, 18ab and 19 of the paper, + ! rescaling of the optical depth multiplied by path length + tau_loc(icol,ilay) = tau(icol,ilay,igpt)*D(icol,igpt)*scaleTau + end do + trans (:,ilay) = exp(-tau_loc(:,ilay)) + An(:,ilay) = (1._wp-trans(:,ilay)**2) + end do + else + do ilay = 1, nlay + tau_loc(:,ilay) = tau(:,ilay,igpt)*D(:,igpt) + trans (:,ilay) = exp(-tau_loc(:,ilay)) + end do + end if + ! + ! Source function for diffuse radiation + ! + call lw_source_noscat(ncol, nlay, & + lay_source(:,:,igpt), lev_source_up(:,:,igpt), lev_source_dn(:,:,igpt), & + tau_loc, trans, source_dn, source_up) + ! + ! Transport down + ! + call lw_transport_noscat_dn(ncol, nlay, top_at_1, trans, source_dn, gpt_flux_dn) + ! + ! Surface albedo, surface source function, reflection and emission + ! + sfc_albedo(:) = 1._wp - sfc_emis(:,igpt) + gpt_flux_up (:,sfc_level) = gpt_flux_dn(:,sfc_level)*sfc_albedo(:) + & + sfc_emis(:,igpt) * sfc_src (:,igpt) + if(do_Jacobians==1) & + gpt_flux_Jac(:,sfc_level) = sfc_emis(:,igpt) * sfc_srcJac(:,igpt) + ! + ! Transport up, or up and down again if using rescaling + ! + if(do_rescaling==1) then + call lw_transport_1rescl(ncol, nlay, top_at_1, trans, & + source_dn, source_up, & + gpt_flux_up, gpt_flux_dn, An, Cn, & + do_Jacobians, gpt_flux_Jac) ! Standing in for Jacobian, i.e. rad_up_Jac(:,:,igpt), rad_dn_Jac(:,:,igpt)) + else + call lw_transport_noscat_up(ncol, nlay, top_at_1, trans, source_up, gpt_flux_up, & + do_Jacobians, gpt_flux_Jac) + end if + + if(do_broadband==1) then + broadband_up(:,:) = broadband_up(:,:) + gpt_flux_up(:,:) + broadband_dn(:,:) = broadband_dn(:,:) + gpt_flux_dn(:,:) + else + ! + ! Convert intensity to flux assuming azimuthal isotropy and quadrature weight + ! + gpt_flux_dn(:,:) = 2._wp * pi * weight * gpt_flux_dn(:,:) + gpt_flux_up(:,:) = 2._wp * pi * weight * gpt_flux_up(:,:) + end if + ! + ! Only broadband-integrated Jacobians are provided + ! + if(do_Jacobians==1) & + flux_upJac(:,:) = flux_upJac(:,:) + gpt_flux_Jac(:,:) + end do ! g point loop + + if(do_broadband==1) then + broadband_up(:,:) = 2._wp * pi * weight* broadband_up(:,:) + broadband_dn(:,:) = 2._wp * pi * weight* broadband_dn(:,:) + end if + if(do_Jacobians==1) & + flux_upJac(:,:) = 2._wp * pi * weight * flux_upJac(:,:) + + end subroutine lw_solver_noscat_oneangle + ! ------------------------------------------------------------------------------------------------- + ! + !> LW transport, no scattering, multi-angle quadrature + !> Users provide a set of weights and quadrature angles + !> Routine sums over single-angle solutions for each sets of angles/weights + ! + ! --------------------------------------------------------------- + subroutine lw_solver_noscat(ncol, nlay, ngpt, top_at_1, & + nmus, Ds, weights, & + tau, & + lay_source, lev_source_inc, lev_source_dec, & + sfc_emis, sfc_src, & + inc_flux, & + flux_up, flux_dn, & + do_broadband, broadband_up, broadband_dn, & + do_Jacobians, sfc_srcJac, flux_upJac, & + do_rescaling, ssa, g) bind(C, name="rte_lw_solver_noscat") + integer, intent(in ) :: ncol, nlay, ngpt + !! Number of columns, layers, g-points + integer, intent(in ) :: top_at_1 + !! ilay = 1 is the top of the atmosphere? + integer, intent(in ) :: nmus + !! number of quadrature angles + real(wp), dimension (ncol, ngpt, & + nmus), intent(in ) :: Ds + !! quadrature secants + real(wp), dimension(nmus), intent(in ) :: weights + !! quadrature weights + real(wp), dimension(ncol,nlay, ngpt), intent(in ) :: tau + !! Absorption optical thickness [] + real(wp), dimension(ncol,nlay, ngpt), intent(in ) :: lay_source + !! Planck source at layer average temperature [W/m2] + real(wp), dimension(ncol,nlay, ngpt), intent(in ) :: lev_source_inc + !! Planck source at layer edge for radiation in increasing ilay direction [W/m2] + real(wp), dimension(ncol,nlay, ngpt), intent(in ) :: lev_source_dec + !! Planck source at layer edge for radiation in decreasing ilay direction [W/m2] + real(wp), dimension(ncol, ngpt), intent(in ) :: sfc_emis + !! Surface emissivity [] + real(wp), dimension(ncol, ngpt), intent(in ) :: sfc_src + !! Surface source function [W/m2] + real(wp), dimension(ncol, ngpt), intent(in ) :: inc_flux + !! Incident diffuse flux, probably 0 [W/m2] + real(wp), dimension(ncol,nlay+1,ngpt), target, & + intent( out) :: flux_up, flux_dn + !! Fluxes [W/m2] + ! + ! Optional variables - arrays aren't referenced if corresponding logical == False + ! + integer, intent(in ) :: do_broadband + real(wp), dimension(ncol,nlay+1 ), target, & + intent( out) :: broadband_up, broadband_dn + !! Spectrally-integrated fluxes [W/m2] + integer, intent(in ) :: do_Jacobians + !! compute Jacobian with respect to surface temeprature? + real(wp), dimension(ncol ,ngpt), intent(in ) :: sfc_srcJac + !! surface temperature Jacobian of surface source function [W/m2/K] + real(wp), dimension(ncol,nlay+1 ), target, & + intent( out) :: flux_upJac + !! surface temperature Jacobian of Radiances [W/m2-str / K] + integer, intent(in ) :: do_rescaling + !! Approximate treatment of scattering (10.1175/JAS-D-18-0014.1) + real(wp), dimension(ncol,nlay ,ngpt), intent(in ) :: ssa, g + !! single-scattering albedo, asymmetry parameter + ! ------------------------------------ + ! + ! Local variables - used for a single quadrature angle + ! + real(wp), dimension(:,:,:), pointer :: this_flux_up, this_flux_dn + real(wp), dimension(:,:), pointer :: this_broadband_up, this_broadband_dn, this_flux_upJac + + integer :: imu + ! ------------------------------------ + ! + ! For the first angle output arrays store total flux + ! + call lw_solver_noscat_oneangle(ncol, nlay, ngpt, & + top_at_1, Ds(:,:,1), weights(1), tau, & + lay_source, lev_source_inc, lev_source_dec, sfc_emis, sfc_src, & + inc_flux, & + flux_up, flux_dn, & + do_broadband, broadband_up, broadband_dn, & + do_Jacobians, sfc_srcJac, flux_upJac, & + do_rescaling, ssa, g) + ! + ! For more than one angle use local arrays + ! + if(nmus > 1) then + if(do_broadband==1) then + allocate(this_broadband_up(ncol,nlay+1), this_broadband_dn(ncol,nlay+1)) + ! Spectrally-resolved fluxes won't be filled in so can point to caller-supplied memory + this_flux_up => flux_up + this_flux_dn => flux_dn + else + allocate(this_flux_up(ncol,nlay+1,ngpt), this_flux_dn(ncol,nlay+1,ngpt)) + ! Spectrally-integrated fluxes won't be filled in so can point to caller-supplied memory + this_broadband_up => broadband_up + this_broadband_dn => broadband_dn + end if + if(do_Jacobians==1) then + allocate(this_flux_upJac(ncol,nlay+1)) + else + this_flux_upJac => flux_upJac + end if + end if + do imu = 2, nmus + call lw_solver_noscat_oneangle(ncol, nlay, ngpt, & + top_at_1, Ds(:,:,imu), weights(imu), tau, & + lay_source, lev_source_inc, lev_source_dec, sfc_emis, sfc_src, & + inc_flux, & + this_flux_up, this_flux_dn, & + do_broadband, this_broadband_up, this_broadband_dn, & + do_Jacobians, sfc_srcJac, this_flux_upJac, & + do_rescaling, ssa, g) + if(do_broadband==1) then + broadband_up(:,:) = broadband_up(:,:) + this_broadband_up(:,:) + broadband_dn(:,:) = broadband_dn(:,:) + this_broadband_dn(:,:) + else + flux_up (:,:,:) = flux_up (:,:,:) + this_flux_up (:,:,:) + flux_dn (:,:,:) = flux_dn (:,:,:) + this_flux_dn (:,:,:) + end if + if (do_Jacobians==1) & + flux_upJac(:,:) = flux_upJac(:,: ) + this_flux_upJac(:,: ) + end do + if(nmus > 1) then + if( do_broadband==1) deallocate(this_broadband_up, this_broadband_dn) + if( do_broadband==0) deallocate(this_flux_up, this_flux_dn) + if( do_Jacobians==1) deallocate(this_flux_upJac) + end if + end subroutine lw_solver_noscat + ! ------------------------------------------------------------------------------------------------- + ! + !> Longwave two-stream calculation: + !> - combine RRTMGP-specific sources at levels + !> - compute layer reflectance, transmittance + !> - compute total source function at levels using linear-in-tau + !> - transport + ! + ! ------------------------------------------------------------------------------------------------- + subroutine lw_solver_2stream (ncol, nlay, ngpt, top_at_1, & + tau, ssa, g, & + lay_source, lev_source_inc, lev_source_dec, sfc_emis, sfc_src, & + inc_flux, & + flux_up, flux_dn) bind(C, name="rte_lw_solver_2stream") + integer, intent(in ) :: ncol, nlay, ngpt + !! Number of columns, layers, g-points + integer, intent(in ) :: top_at_1 + !! ilay = 1 is the top of the atmosphere? + real(wp), dimension(ncol,nlay, ngpt), intent(in ) :: tau, ssa, g + !! Optical thickness, single-scattering albedo, asymmetry parameter [] + real(wp), dimension(ncol,nlay, ngpt), intent(in ) :: lay_source + !! Planck source at layer average temperature [W/m2] + real(wp), dimension(ncol,nlay, ngpt), intent(in ) :: lev_source_inc + !! Planck source at layer edge for radiation in increasing ilay direction [W/m2] + real(wp), dimension(ncol,nlay, ngpt), intent(in ) :: lev_source_dec + !! Planck source at layer edge for radiation in decreasing ilay direction [W/m2] + real(wp), dimension(ncol, ngpt), intent(in ) :: sfc_emis + !! Surface emissivity [] + real(wp), dimension(ncol, ngpt), intent(in ) :: sfc_src + !! Surface source function [W/m2] + real(wp), dimension(ncol, ngpt), intent(in ) :: inc_flux + !! Incident diffuse flux, probably 0 [W/m2] + real(wp), dimension(ncol,nlay+1,ngpt), intent( out) :: flux_up, flux_dn + !! Fluxes [W/m2] + ! ---------------------------------------------------------------------- + integer :: igpt, top_level + real(wp), dimension(ncol,nlay ) :: Rdif, Tdif, gamma1, gamma2 + real(wp), dimension(ncol ) :: sfc_albedo + real(wp), dimension(ncol,nlay+1) :: lev_source + real(wp), dimension(ncol,nlay ) :: source_dn, source_up + real(wp), dimension(ncol ) :: source_sfc + ! ------------------------------------ + top_level = nlay+1 + if(top_at_1==1) top_level = 1 + do igpt = 1, ngpt + ! + ! RRTMGP provides source functions at each level using the spectral mapping + ! of each adjacent layer. Combine these for two-stream calculations + ! + call lw_combine_sources(ncol, nlay, top_at_1, & + lev_source_inc(:,:,igpt), lev_source_dec(:,:,igpt), & + lev_source) + ! + ! Cell properties: reflection, transmission for diffuse radiation + ! Coupling coefficients needed for source function + ! + call lw_two_stream(ncol, nlay, & + tau (:,:,igpt), ssa(:,:,igpt), g(:,:,igpt), & + gamma1, gamma2, Rdif, Tdif) + ! + ! Source function for diffuse radiation + ! + call lw_source_2str(ncol, nlay, top_at_1, & + sfc_emis(:,igpt), sfc_src(:,igpt), & + lay_source(:,:,igpt), lev_source, & + gamma1, gamma2, Rdif, Tdif, tau(:,:,igpt), & + source_dn, source_up, source_sfc) + ! + ! Transport + ! + sfc_albedo(1:ncol) = 1._wp - sfc_emis(:,igpt) + ! + ! Boundary condition + ! + flux_dn(:,top_level,igpt) = inc_flux(:,igpt) + call adding(ncol, nlay, top_at_1, & + sfc_albedo, & + Rdif, Tdif, & + source_dn, source_up, source_sfc, & + flux_up(:,:,igpt), flux_dn(:,:,igpt)) + end do + + end subroutine lw_solver_2stream + ! ------------------------------------------------------------------------------------------------- + ! + ! Top-level shortwave kernels + ! + ! ------------------------------------------------------------------------------------------------- + ! + ! !> Extinction-only shortwave solver i.e. solar direct beam + ! + ! ------------------------------------------------------------------------------------------------- + pure subroutine sw_solver_noscat(ncol, nlay, ngpt, top_at_1, & + tau, mu0, inc_flux_dir, flux_dir) bind(C, name="rte_sw_solver_noscat") + integer, intent(in ) :: ncol, nlay, ngpt ! Number of columns, layers, g-points + !! Number of columns, layers, g-points + integer, intent(in ) :: top_at_1 + !! ilay = 1 is the top of the atmosphere? + real(wp), dimension(ncol,nlay, ngpt), intent(in ) :: tau + !! Absorption optical thickness [] + real(wp), dimension(ncol,nlay ), intent(in ) :: mu0 + !! cosine of solar zenith angle + real(wp), dimension(ncol, ngpt), intent(in ) :: inc_flux_dir + !! Direct beam incident flux [W/m2] + real(wp), dimension(ncol,nlay+1,ngpt), intent(out) :: flux_dir + !! Direct-beam flux, spectral [W/m2] + + integer :: ilev, igpt + + ! ------------------------------------ + ! Indexing into arrays for upward and downward propagation depends on the vertical + ! orientation of the arrays (whether the domain top is at the first or last index) + ! We write the loops out explicitly so compilers will have no trouble optimizing them. + + ! Downward propagation + if(top_at_1==1) then + ! For the flux at this level, what was the previous level, and which layer has the + ! radiation just passed through? + ! layer index = level index - 1 + ! previous level is up (-1) + do igpt = 1, ngpt + flux_dir(:, 1,igpt) = inc_flux_dir(:,igpt) * mu0(:,1) + do ilev = 2, nlay+1 + flux_dir(:,ilev,igpt) = flux_dir(:,ilev-1,igpt) * exp(-tau(:,ilev-1,igpt)/mu0(:,ilev-1)) + end do + end do + else + ! layer index = level index + ! previous level is up (+1) + do igpt = 1, ngpt + flux_dir(:,nlay+1,igpt) = inc_flux_dir(:,igpt) * mu0(:,nlay) + do ilev = nlay, 1, -1 + flux_dir(:,ilev,igpt) = flux_dir(:,ilev+1,igpt) * exp(-tau(:,ilev,igpt)/mu0(:,ilev)) + end do + end do + end if + end subroutine sw_solver_noscat + ! ------------------------------------------------------------------------------------------------- + ! + !> Shortwave two-stream calculation: + !> compute layer reflectance, transmittance + !> compute solar source function for diffuse radiation + !> transport + ! + ! ------------------------------------------------------------------------------------------------- + subroutine sw_solver_2stream (ncol, nlay, ngpt, top_at_1, & + tau, ssa, g, mu0, & + sfc_alb_dir, sfc_alb_dif, & + inc_flux_dir, & + flux_up, flux_dn, flux_dir, & + has_dif_bc, inc_flux_dif, & + do_broadband, broadband_up, & + broadband_dn, broadband_dir) bind(C, name="rte_sw_solver_2stream") + integer, intent(in ) :: ncol, nlay, ngpt + !! Number of columns, layers, g-points + integer, intent(in ) :: top_at_1 + !! ilay = 1 is the top of the atmosphere? + real(wp), dimension(ncol,nlay, ngpt), intent(in ) :: tau, ssa, g + !! Optical thickness, single-scattering albedo, asymmetry parameter [] + real(wp), dimension(ncol,nlay ), intent(in ) :: mu0 + !! cosine of solar zenith angle + real(wp), dimension(ncol, ngpt), intent(in ) :: sfc_alb_dir, sfc_alb_dif + !! Spectral surface albedo for direct and diffuse radiation + real(wp), dimension(ncol, ngpt), intent(in ) :: inc_flux_dir + !! Direct beam incident flux + real(wp), dimension(ncol,nlay+1,ngpt), target, & + intent( out) :: flux_up, flux_dn, flux_dir + !! Fluxes [W/m2] + integer, intent(in ) :: has_dif_bc + !! Is a boundary condition for diffuse flux supplied? + real(wp), dimension(ncol, ngpt), intent(in ) :: inc_flux_dif + !! Boundary condition for diffuse flux [W/m2] + integer, intent(in ) :: do_broadband + !! Provide broadband-integrated, not spectrally-resolved, fluxes? + real(wp), dimension(ncol,nlay+1 ), intent( out) :: broadband_up, broadband_dn, broadband_dir + !! Broadband integrated fluxes + ! ------------------------------------------- + real(wp), dimension(ncol,nlay ) :: broadband_sup, broadband_sdn, broadband_sdir + integer :: igpt, top_level, top_layer + real(wp), dimension(ncol,nlay ) :: Rdif, Tdif + real(wp), dimension(ncol,nlay ) :: source_up, source_dn + real(wp), dimension(ncol ) :: source_srf + ! loc_fluxes hold a single g-point flux if fluxes are being integrated instead of returned + ! with spectral detail + real(wp), dimension(ncol,nlay+1), & + target :: loc_flux_up, loc_flux_dn, loc_flux_dir + ! gpt_fluxes point to calculations for the current g-point + real(wp), dimension(:,:), pointer :: gpt_flux_up, gpt_flux_dn, gpt_flux_dir + ! ------------------------------------ + if(top_at_1==1) then + top_level = 1 + top_layer = 1 + else + top_level = nlay+1 + top_layer = nlay + end if + ! + ! Integrated fluxes need zeroing + ! + if(do_broadband==1) then + call zero_array(ncol, nlay+1, broadband_up ) + call zero_array(ncol, nlay+1, broadband_dn ) + call zero_array(ncol, nlay+1, broadband_dir) + call zero_array(ncol, nlay, broadband_sup) + call zero_array(ncol, nlay, broadband_sdn) + end if + + do igpt = 1, ngpt + if(do_broadband==1) then + gpt_flux_up => loc_flux_up + gpt_flux_dn => loc_flux_dn + gpt_flux_dir => loc_flux_dir + else + gpt_flux_up => flux_up (:,:,igpt) + gpt_flux_dn => flux_dn (:,:,igpt) + gpt_flux_dir => flux_dir(:,:,igpt) + end if + ! + ! Boundary conditions direct beam... + ! + gpt_flux_dir(:,top_level) = inc_flux_dir(:,igpt) * mu0(:,top_layer) + ! + ! ... and diffuse field, using 0 if no BC is provided + ! + if(has_dif_bc==1) then + gpt_flux_dn(:,top_level) = inc_flux_dif(:,igpt) + else + gpt_flux_dn(:,top_level) = 0._wp + end if + ! + ! Cell properties: transmittance and reflectance for diffuse radiation + ! Direct-beam and source for diffuse radiation + ! + call sw_dif_and_source(ncol, nlay, top_at_1, mu0, sfc_alb_dir(:,igpt), & + tau(:,:,igpt), ssa(:,:,igpt), g(:,:,igpt), & + Rdif, Tdif, source_dn, source_up, source_srf, & + gpt_flux_dir) + ! + ! Transport + ! + call adding(ncol, nlay, top_at_1, & + sfc_alb_dif(:,igpt), Rdif, Tdif, & + source_dn, source_up, source_srf, gpt_flux_up, gpt_flux_dn) + ! + ! adding() computes only diffuse flux; flux_dn is total + ! + if(do_broadband==1) then + broadband_up (:,:) = broadband_up (:,:) + gpt_flux_up (:,:) + broadband_dn (:,:) = broadband_dn (:,:) + gpt_flux_dn (:,:) + gpt_flux_dir(:,:) + broadband_dir(:,:) = broadband_dir(:,:) + gpt_flux_dir(:,:) + + broadband_sup (:,:) = broadband_sup (:,:) + source_up (:,:) + broadband_sdn (:,:) = broadband_sdn (:,:) + source_dn (:,:) + else + gpt_flux_dn(:,:) = gpt_flux_dn (:,:) + gpt_flux_dir(:,:) + end if + end do + end subroutine sw_solver_2stream + ! ------------------------------------------------------------------------------------------------- + ! + ! Lower-level longwave kernels + ! + ! ------------------------------------------------------------------------------------------------- + ! + ! Compute LW source function for upward and downward emission at levels using linear-in-tau assumption + ! See Clough et al., 1992, doi: 10.1029/92JD01419, Eq 13 + ! + ! --------------------------------------------------------------- + subroutine lw_source_noscat(ncol, nlay, lay_source, lev_source_up, lev_source_dn, tau, trans, & + source_dn, source_up) + integer, intent(in) :: ncol, nlay + real(wp), dimension(ncol, nlay), intent(in) :: lay_source, & ! Planck source at layer center + lev_source_up, & ! Planck source at levels (layer edges), + lev_source_dn, & ! increasing/decreasing layer index + tau, & ! Optical path (tau/mu) + trans ! Transmissivity (exp(-tau)) + real(wp), dimension(ncol, nlay), intent(out):: source_dn, source_up + ! Source function at layer edges + ! Down at the bottom of the layer, up at the top + ! -------------------------------- + integer :: icol, ilay + real(wp) :: fact + real(wp), parameter :: tau_thresh = sqrt(epsilon(tau)) + ! --------------------------------------------------------------- + do ilay = 1, nlay + do icol = 1, ncol + ! + ! Weighting factor. Use 2nd order series expansion when rounding error (~tau^2) + ! is of order epsilon (smallest difference from 1. in working precision) + ! Thanks to Peter Blossey + ! + if(tau(icol, ilay) > tau_thresh) then + fact = (1._wp - trans(icol,ilay))/tau(icol,ilay) - trans(icol,ilay) + else + fact = tau(icol, ilay) * (0.5_wp - 1._wp/3._wp*tau(icol, ilay)) + end if + ! + ! Equation below is developed in Clough et al., 1992, doi:10.1029/92JD01419, Eq 13 + ! + source_dn(icol,ilay) = (1._wp - trans(icol,ilay)) * lev_source_dn(icol,ilay) + & + 2._wp * fact * (lay_source(icol,ilay) - lev_source_dn(icol,ilay)) + source_up(icol,ilay) = (1._wp - trans(icol,ilay)) * lev_source_up(icol,ilay ) + & + 2._wp * fact * (lay_source(icol,ilay) - lev_source_up(icol,ilay)) + end do + end do + end subroutine lw_source_noscat + ! ------------------------------------------------------------------------------------------------- + ! + ! Longwave no-scattering transport - separate routines for up and down + ! + ! ------------------------------------------------------------------------------------------------- + subroutine lw_transport_noscat_dn(ncol, nlay, top_at_1, & + trans, source_dn, radn_dn) + integer, intent(in ) :: ncol, nlay ! Number of columns, layers, g-points + integer, intent(in ) :: top_at_1 ! + real(wp), dimension(ncol,nlay ), intent(in ) :: trans ! transmissivity = exp(-tau) + real(wp), dimension(ncol,nlay ), intent(in ) :: source_dn ! Diffuse radiation emitted by the layer + real(wp), dimension(ncol,nlay+1), intent(inout) :: radn_dn ! Radiances [W/m2-str] Top level must contain incident flux boundary condition + + ! --------------------------------------------------- + ! Local variables + integer :: ilev + ! --------------------------------------------------- + if(top_at_1==1) then + ! + ! Top of domain is index 1 + ! + do ilev = 2, nlay+1 + radn_dn(:,ilev) = trans(:,ilev-1)*radn_dn(:,ilev-1) + source_dn(:,ilev-1) + end do + else + ! + ! Top of domain is index nlay+1 + ! + do ilev = nlay, 1, -1 + radn_dn(:,ilev) = trans(:,ilev )*radn_dn(:,ilev+1) + source_dn(:,ilev) + end do + end if + end subroutine lw_transport_noscat_dn + ! ------------------------------------------------------------------------------------------------- + subroutine lw_transport_noscat_up(ncol, nlay, top_at_1, & + trans, source_up, radn_up, do_Jacobians, radn_upJac) + integer, intent(in ) :: ncol, nlay ! Number of columns, layers, g-points + integer, intent(in ) :: top_at_1 ! + real(wp), dimension(ncol,nlay ), intent(in ) :: trans ! transmissivity = exp(-tau) + real(wp), dimension(ncol,nlay ), intent(in ) :: source_up ! Diffuse radiation emitted by the layer + real(wp), dimension(ncol,nlay+1), intent(inout) :: radn_up ! Radiances [W/m2-str] Top level must contain incident flux boundary condition + integer, intent(in ) :: do_Jacobians + real(wp), dimension(ncol,nlay+1), intent(inout) :: radn_upJac ! surface temperature Jacobian of Radiances [W/m2-str / K] + + ! --------------------------------------------------- + ! Local variables + integer :: ilev + ! --------------------------------------------------- + if(top_at_1==1) then + ! + ! Top of domain is index 1 + ! + ! Upward propagation + do ilev = nlay, 1, -1 + radn_up (:,ilev) = trans(:,ilev )*radn_up (:,ilev+1) + source_up(:,ilev) + if(do_Jacobians==1) & + radn_upJac(:,ilev) = trans(:,ilev )*radn_upJac(:,ilev+1) + end do + else + ! + ! Top of domain is index nlay+1 + ! + ! Upward propagation + do ilev = 2, nlay+1 + radn_up (:,ilev) = trans(:,ilev-1) * radn_up (:,ilev-1) + source_up(:,ilev-1) + if(do_Jacobians==1) & + radn_upJac(:,ilev) = trans(:,ilev-1) * radn_upJac(:,ilev-1) + end do + end if + end subroutine lw_transport_noscat_up + ! ------------------------------------------------------------------------------------------------- + ! Upward and (second) downward transport for re-scaled longwave solution + ! adds adjustment factor based on cloud properties + ! + ! implementation notice: + ! the adjustmentFactor computation can be skipped where Cn <= epsilon + ! ------------------------------------------------------------------------------------------------- + subroutine lw_transport_1rescl(ncol, nlay, top_at_1, & + trans, source_dn, source_up, & + radn_up, radn_dn, An, Cn,& + do_Jacobians, radn_up_Jac) + integer, intent(in ) :: ncol, nlay ! Number of columns, layers, g-points + integer, intent(in ) :: top_at_1 ! + real(wp), dimension(ncol,nlay ), intent(in ) :: trans ! transmissivity = exp(-tau) + real(wp), dimension(ncol,nlay ), intent(in ) :: source_dn, & + source_up ! Diffuse radiation emitted by the layer + real(wp), dimension(ncol,nlay+1), intent(inout) :: radn_up ! Radiances [W/m2-str] + real(wp), dimension(ncol,nlay+1), intent(inout) :: radn_dn !Top level must contain incident flux boundary condition + real(wp), dimension(ncol,nlay), intent(in ) :: An, Cn + integer, intent(in ) :: do_Jacobians + real(wp), dimension(ncol,nlay+1), intent(inout) :: radn_up_Jac ! Surface temperature Jacobians [W/m2-str/K] + ! + ! We could in principle compute a downwelling Jacobian too, but it's small + ! (only a small proportion of LW is scattered) and it complicates code and the API, + ! so we will not + ! + + ! Local variables + integer :: ilev, icol + ! --------------------------------------------------- + real(wp) :: adjustmentFactor + if(top_at_1==1) then + ! + ! Top of domain is index 1 + ! + ! Upward propagation + ! adjustment factor is obtained as a solution of 18b of the Tang paper + ! eqvivalent to Eq.20 of the Tang paper but for linear-in-tau source + do ilev = nlay, 1, -1 + do icol=1,ncol + adjustmentFactor = Cn(icol,ilev)*( An(icol,ilev)*radn_dn(icol,ilev) - & + trans(icol,ilev)*source_dn(icol,ilev) - source_up(icol,ilev) ) + radn_up (icol,ilev) = trans(icol,ilev)*radn_up(icol,ilev+1) + source_up(icol,ilev) + & + adjustmentFactor + end do + if(do_Jacobians==1) & + radn_up_Jac(:,ilev) = trans(:,ilev)*radn_up_Jac(:,ilev+1) + end do + ! Downward propagation + ! radn_dn_Jac(:,1) = 0._wp + ! adjustment factor is obtained as a solution of 19 of the Tang paper + ! eqvivalent to Eq.21 of the Tang paper but for linear-in-tau source + do ilev = 1, nlay + ! radn_dn_Jac(:,ilev+1) = trans(:,ilev)*radn_dn_Jac(:,ilev) + do icol=1,ncol + adjustmentFactor = Cn(icol,ilev)*( An(icol,ilev)*radn_up(icol,ilev) - & + trans(icol,ilev)*source_up(icol,ilev) - source_dn(icol,ilev) ) + radn_dn(icol,ilev+1) = trans(icol,ilev)*radn_dn(icol,ilev) + source_dn(icol,ilev) + & + adjustmentFactor + ! adjustmentFactor = Cn(icol,ilev)*An(icol,ilev)*radn_up_Jac(icol,ilev) + ! radn_dn_Jac(icol,ilev+1) = radn_dn_Jac(icol,ilev+1) + adjustmentFactor + enddo + end do + else + ! + ! Top of domain is index nlay+1 + ! + ! Upward propagation + ! adjustment factor is obtained as a solution of 18b of the Tang paper + ! eqvivalent to Eq.20 of the Tang paper but for linear-in-tau source + do ilev = 1, nlay + radn_up (:,ilev+1) = trans(:,ilev) * radn_up (:,ilev) + source_up(:,ilev) + do icol=1,ncol + adjustmentFactor = Cn(icol,ilev)*( An(icol,ilev)*radn_dn(icol,ilev+1) - & + trans(icol,ilev)*source_dn(icol,ilev) - source_up(icol,ilev) ) + radn_up(icol,ilev+1) = trans(icol,ilev)*radn_up(icol,ilev) + source_up(icol,ilev) + & + adjustmentFactor + enddo + if(do_Jacobians==1) & + radn_up_Jac(:,ilev+1) = trans(:,ilev) * radn_up_Jac(:,ilev) + end do + + ! Downward propagation + ! adjustment factor is obtained as a solution of 19 of the Tang paper + ! eqvivalent to Eq.21 of the Tang paper but for linear-in-tau source + ! radn_dn_Jac(:,nlay+1) = 0._wp + do ilev = nlay, 1, -1 + ! radn_dn_Jac(:,ilev) = trans(:,ilev)*radn_dn_Jac(:,ilev+1) + do icol=1,ncol + adjustmentFactor = Cn(icol,ilev)*( An(icol,ilev)*radn_up(icol,ilev) - & + trans(icol,ilev)*source_up(icol,ilev) - source_dn(icol,ilev) ) + radn_dn(icol,ilev) = trans(icol,ilev)*radn_dn(icol,ilev+1) + source_dn(icol,ilev) + & + adjustmentFactor + ! adjustmentFactor = Cn(icol,ilev)*An(icol,ilev)*radn_up_Jac(icol,ilev) + ! radn_dn_Jac(icol,ilev) = radn_dn_Jac(icol,ilev) + adjustmentFactor + enddo + end do + end if + end subroutine lw_transport_1rescl +! ------------------------------------------------------------------------------------------------- + ! + ! Longwave two-stream solutions to diffuse reflectance and transmittance for a layer + ! with optical depth tau, single scattering albedo w0, and asymmetery parameter g. + ! + ! Equations are developed in Meador and Weaver, 1980, + ! doi:10.1175/1520-0469(1980)037<0630:TSATRT>2.0.CO;2 + ! + ! ------------------------------------------------------------------------------------------------- + pure subroutine lw_two_stream(ncol, nlay, tau, w0, g, & + gamma1, gamma2, Rdif, Tdif) + integer, intent(in) :: ncol, nlay + real(wp), dimension(ncol,nlay), intent(in) :: tau, w0, g + real(wp), dimension(ncol,nlay), intent(out) :: gamma1, gamma2, Rdif, Tdif + + ! ----------------------- + integer :: i, j + + ! Variables used in Meador and Weaver + real(wp) :: k(ncol) + + ! Ancillary variables + real(wp) :: RT_term(ncol) + real(wp) :: exp_minusktau(ncol), exp_minus2ktau(ncol) + + real(wp), parameter :: LW_diff_sec = 1.66 ! 1./cos(diffusivity angle) + ! --------------------------------- + do j = 1, nlay + do i = 1, ncol + ! + ! Coefficients differ from SW implementation because the phase function is more isotropic + ! Here we follow Fu et al. 1997, doi:10.1175/1520-0469(1997)054<2799:MSPITI>2.0.CO;2 + ! and use a diffusivity sec of 1.66 + ! + gamma1(i,j)= LW_diff_sec * (1._wp - 0.5_wp * w0(i,j) * (1._wp + g(i,j))) ! Fu et al. Eq 2.9 + gamma2(i,j)= LW_diff_sec * 0.5_wp * w0(i,j) * (1._wp - g(i,j)) ! Fu et al. Eq 2.10 + ! Eq 18; k = SQRT(gamma1**2 - gamma2**2), limited below to avoid div by 0. + ! k = 0 for isotropic, conservative scattering; this lower limit on k + ! gives relative error with respect to conservative solution + ! of < 0.1% in Rdif down to tau = 10^-9 + k(i) = sqrt(max((gamma1(i,j) - gamma2(i,j)) * (gamma1(i,j) + gamma2(i,j)), 1.e-12_wp)) + end do + + ! Written to encourage vectorization of exponential + exp_minusktau(1:ncol) = exp(-tau(1:ncol,j)*k(1:ncol)) + + ! + ! Diffuse reflection and transmission + ! + do i = 1, ncol + exp_minus2ktau(i) = exp_minusktau(i) * exp_minusktau(i) + + ! Refactored to avoid rounding errors when k, gamma1 are of very different magnitudes + RT_term(i) = 1._wp / (k (i ) * (1._wp + exp_minus2ktau(i)) + & + gamma1(i,j) * (1._wp - exp_minus2ktau(i)) ) + + ! Equation 25 + Rdif(i,j) = RT_term(i) * gamma2(i,j) * (1._wp - exp_minus2ktau(i)) + + ! Equation 26 + Tdif(i,j) = RT_term(i) * 2._wp * k(i) * exp_minusktau(i) + end do + + end do + end subroutine lw_two_stream + ! ------------------------------------------------------------------------------------------------- + ! + ! Source function combination + ! RRTMGP provides two source functions at each level + ! using the spectral mapping from each of the adjascent layers. + ! Need to combine these for use in two-stream calculation. + ! + ! ------------------------------------------------------------------------------------------------- + subroutine lw_combine_sources(ncol, nlay, top_at_1, & + lev_src_inc, lev_src_dec, lev_source) + integer, intent(in ) :: ncol, nlay + integer, intent(in ) :: top_at_1 + real(wp), dimension(ncol, nlay ), intent(in ) :: lev_src_inc, lev_src_dec + real(wp), dimension(ncol, nlay+1), intent(out) :: lev_source + + integer :: icol, ilay + ! --------------------------------------------------------------- + ilay = 1 + do icol = 1,ncol + lev_source(icol, ilay) = lev_src_dec(icol, ilay) + end do + do ilay = 2, nlay + do icol = 1,ncol + lev_source(icol, ilay) = sqrt(lev_src_dec(icol, ilay) * & + lev_src_inc(icol, ilay-1)) + end do + end do + ilay = nlay+1 + do icol = 1,ncol + lev_source(icol, ilay) = lev_src_inc(icol, ilay-1) + end do + + end subroutine lw_combine_sources + ! --------------------------------------------------------------- + ! + ! Compute LW source function for upward and downward emission at levels using linear-in-tau assumption + ! This version straight from ECRAD + ! Source is provided as W/m2-str; factor of pi converts to flux units + ! + ! --------------------------------------------------------------- + subroutine lw_source_2str(ncol, nlay, top_at_1, & + sfc_emis, sfc_src, & + lay_source, lev_source, & + gamma1, gamma2, rdif, tdif, tau, source_dn, source_up, source_sfc) & + bind (C, name="rte_lw_source_2str") + integer, intent(in) :: ncol, nlay + integer, intent(in) :: top_at_1 + real(wp), dimension(ncol ), intent(in) :: sfc_emis, sfc_src + real(wp), dimension(ncol, nlay), intent(in) :: lay_source, & ! Planck source at layer center + tau, & ! Optical depth (tau) + gamma1, gamma2,& ! Coupling coefficients + rdif, tdif ! Layer reflectance and transmittance + real(wp), dimension(ncol, nlay+1), target, & + intent(in) :: lev_source ! Planck source at layer edges + real(wp), dimension(ncol, nlay), intent(out) :: source_dn, source_up + real(wp), dimension(ncol ), intent(out) :: source_sfc ! Source function for upward radation at surface + + integer :: icol, ilay + real(wp) :: Z, Zup_top, Zup_bottom, Zdn_top, Zdn_bottom + real(wp), dimension(:), pointer :: lev_source_bot, lev_source_top + ! --------------------------------------------------------------- + do ilay = 1, nlay + if(top_at_1==1) then + lev_source_top => lev_source(:,ilay) + lev_source_bot => lev_source(:,ilay+1) + else + lev_source_top => lev_source(:,ilay+1) + lev_source_bot => lev_source(:,ilay) + end if + do icol = 1, ncol + if (tau(icol,ilay) > 1.0e-8_wp) then + ! + ! Toon et al. (JGR 1989) Eqs 26-27 + ! + Z = (lev_source_bot(icol)-lev_source_top(icol)) / (tau(icol,ilay)*(gamma1(icol,ilay)+gamma2(icol,ilay))) + Zup_top = Z + lev_source_top(icol) + Zup_bottom = Z + lev_source_bot(icol) + Zdn_top = -Z + lev_source_top(icol) + Zdn_bottom = -Z + lev_source_bot(icol) + source_up(icol,ilay) = pi * (Zup_top - rdif(icol,ilay) * Zdn_top - tdif(icol,ilay) * Zup_bottom) + source_dn(icol,ilay) = pi * (Zdn_bottom - rdif(icol,ilay) * Zup_bottom - tdif(icol,ilay) * Zdn_top) + else + source_up(icol,ilay) = 0._wp + source_dn(icol,ilay) = 0._wp + end if + end do + end do + do icol = 1, ncol + source_sfc(icol) = pi * sfc_emis(icol) * sfc_src(icol) + end do + end subroutine lw_source_2str + ! ------------------------------------------------------------------------------------------------- + ! + ! Lower-level shortwave kernels + ! + ! ------------------------------------------------------------------------------------------------- + ! + ! Two-stream solutions to diffuse reflectance and transmittance for a layer + ! with optical depth tau, single scattering albedo w0, and asymmetery parameter g. + ! Direct reflectance and transmittance used to compute direct beam source for diffuse radiation + ! in layers and at surface; report direct beam as a byproduct + ! Computing the direct-beam source for diffuse radiation at the same time as R and T for + ! direct radiation reduces memory traffic and use. + ! + ! Equations are developed in Meador and Weaver, 1980, + ! doi:10.1175/1520-0469(1980)037<0630:TSATRT>2.0.CO;2 + ! + ! ------------------------------------------------------------------------------------------------- + pure subroutine sw_dif_and_source(ncol, nlay, top_at_1, mu0, sfc_albedo, & +! subroutine sw_dif_and_source(ncol, nlay, top_at_1, mu0, sfc_albedo, & + tau, w0, g, & + Rdif, Tdif, source_dn, source_up, source_sfc, flux_dn_dir) bind (C, name="rte_sw_source_dir") + integer, intent(in ) :: ncol, nlay + integer, intent(in ) :: top_at_1 + real(wp), dimension(ncol ), intent(in ) :: sfc_albedo ! surface albedo for direct radiation + real(wp), dimension(ncol,nlay ), intent(in ) :: tau, w0, g, mu0 + real(wp), dimension(ncol,nlay ), intent( out) :: Rdif, Tdif, source_dn, source_up + real(wp), dimension(ncol ), intent( out) :: source_sfc ! Source function for upward radation at surface + real(wp), dimension(ncol,nlay+1), target, & + intent(inout) :: flux_dn_dir ! Direct beam flux + + ! ----------------------- + integer :: i, j + + ! Variables used in Meador and Weaver + real(wp) :: gamma1, gamma2, gamma3, gamma4, alpha1, alpha2 + + + ! Ancillary variables + real(wp) :: k, exp_minusktau, k_mu, k_gamma3, k_gamma4 + real(wp) :: RT_term, exp_minus2ktau + real(wp) :: Rdir, Tdir, Tnoscat + real(wp), pointer, dimension(:) :: dir_flux_inc, dir_flux_trans + integer :: lay_index + real(wp) :: tau_s, w0_s, g_s, mu0_s + ! --------------------------------- + + do j = 1, nlay + if(top_at_1==1) then + lay_index = j + dir_flux_inc => flux_dn_dir(:,lay_index ) + dir_flux_trans => flux_dn_dir(:,lay_index+1) + else + lay_index = nlay-j+1 + dir_flux_inc => flux_dn_dir(:,lay_index+1) + dir_flux_trans => flux_dn_dir(:,lay_index ) + end if + + do i = 1, ncol + ! + ! Scalars + ! + tau_s = tau(i, lay_index) + w0_s = w0 (i, lay_index) + g_s = g (i, lay_index) + mu0_s = mu0(i, lay_index) + ! + ! Zdunkowski Practical Improved Flux Method "PIFM" + ! (Zdunkowski et al., 1980; Contributions to Atmospheric Physics 53, 147-66) + ! + gamma1 = (8._wp - w0_s * (5._wp + 3._wp * g_s)) * .25_wp + gamma2 = 3._wp *(w0_s * (1._wp - g_s)) * .25_wp + ! + ! Direct reflect and transmission + ! + ! Eq 18; k = SQRT(gamma1**2 - gamma2**2), limited below to avoid div by 0. + ! k = 0 for isotropic, conservative scattering; this lower limit on k + ! gives relative error with respect to conservative solution + ! of < 0.1% in Rdif down to tau = 10^-9 + !k = sqrt(max((gamma1 - gamma2) * (gamma1 + gamma2), 1.e-12_wp)) + !Adele - increased limiting value because it was causing very large errors ... + !not sure exactly why. May need to be increased again. + k = sqrt(max((gamma1 - gamma2) * (gamma1 + gamma2), 1.e-10_wp)) + k_mu = k * mu0_s + exp_minusktau = exp(-tau_s*k) + exp_minus2ktau = exp_minusktau * exp_minusktau + + ! Refactored to avoid rounding errors when k, gamma1 are of very different magnitudes + RT_term = 1._wp / (k * (1._wp + exp_minus2ktau) + & + gamma1 * (1._wp - exp_minus2ktau) ) + ! Equation 25 + Rdif(i,lay_index) = RT_term * gamma2 * (1._wp - exp_minus2ktau) + + ! Equation 26 + Tdif(i,lay_index) = RT_term * 2._wp * k * exp_minusktau + + ! + ! On a round earth, where mu0 can increase with depth in the atmosphere, + ! levels with mu0 <= 0 have no direct beam and hence no source for diffuse light + ! + if(mu0_s > 0._wp) then + ! + ! Equation 14, multiplying top and bottom by exp(-k*tau) + ! and rearranging to avoid div by 0. + ! + RT_term = w0_s * RT_term/merge(1._wp - k_mu*k_mu, & + epsilon(1._wp), & + abs(1._wp - k_mu*k_mu) >= epsilon(1._wp)) + ! + ! Zdunkowski Practical Improved Flux Method "PIFM" + ! (Zdunkowski et al., 1980; Contributions to Atmospheric Physics 53, 147-66) + ! + gamma3 = (2._wp - 3._wp * mu0_s * g_s ) * .25_wp + gamma4 = 1._wp - gamma3 + alpha1 = gamma1 * gamma4 + gamma2 * gamma3 ! Eq. 16 + alpha2 = gamma1 * gamma3 + gamma2 * gamma4 ! Eq. 17 + + ! + ! Transmittance of direct, unscattered beam. + ! + k_gamma3 = k * gamma3 + k_gamma4 = k * gamma4 + Tnoscat = exp(-tau_s/mu0_s) + Rdir = RT_term * & + ((1._wp - k_mu) * (alpha2 + k_gamma3) - & + (1._wp + k_mu) * (alpha2 - k_gamma3) * exp_minus2ktau - & + 2.0_wp * (k_gamma3 - alpha2 * k_mu) * exp_minusktau * Tnoscat) + ! + ! Equation 15, multiplying top and bottom by exp(-k*tau), + ! multiplying through by exp(-tau/mu0) to + ! prefer underflow to overflow + ! Omitting direct transmittance + ! + Tdir = -RT_term * & + ((1._wp + k_mu) * (alpha1 + k_gamma4) * Tnoscat - & + (1._wp - k_mu) * (alpha1 - k_gamma4) * exp_minus2ktau * Tnoscat - & + 2.0_wp * (k_gamma4 + alpha1 * k_mu) * exp_minusktau) + source_up(i,lay_index) = Rdir * dir_flux_inc(i) + source_dn(i,lay_index) = Tdir * dir_flux_inc(i) + dir_flux_trans(i) = Tnoscat * dir_flux_inc(i) + else + source_up(i,lay_index) = 0._wp + source_dn(i,lay_index) = 0._wp + dir_flux_trans(i) = 0._wp + end if + end do + end do + source_sfc(:) = dir_flux_trans(:)*sfc_albedo(:) + + end subroutine sw_dif_and_source +! --------------------------------------------------------------- +! +! Transport of diffuse radiation through a vertically layered atmosphere. +! Equations are after Shonk and Hogan 2008, doi:10.1175/2007JCLI1940.1 (SH08) +! This routine is shared by longwave and shortwave +! +! ------------------------------------------------------------------------------------------------- +subroutine adding(ncol, nlay, top_at_1, & + albedo_sfc, & + rdif, tdif, & + src_dn, src_up, src_sfc, & + flux_up, flux_dn) + integer, intent(in ) :: ncol, nlay + integer, intent(in ) :: top_at_1 + real(wp), dimension(ncol ), intent(in ) :: albedo_sfc + real(wp), dimension(ncol,nlay ), intent(in ) :: rdif, tdif + real(wp), dimension(ncol,nlay ), intent(in ) :: src_dn, src_up + real(wp), dimension(ncol ), intent(in ) :: src_sfc + real(wp), dimension(ncol,nlay+1), intent( out) :: flux_up + ! intent(inout) because top layer includes incident flux + real(wp), dimension(ncol,nlay+1), intent(inout) :: flux_dn + ! ------------------ + integer :: ilev + real(wp), dimension(ncol,nlay+1) :: albedo, & ! reflectivity to diffuse radiation below this level + ! alpha in SH08 + src ! source of diffuse upwelling radiation from emission or + ! scattering of direct beam + ! G in SH08 + real(wp), dimension(ncol,nlay ) :: denom ! beta in SH08 + ! ------------------ + ! + ! Indexing into arrays for upward and downward propagation depends on the vertical + ! orientation of the arrays (whether the domain top is at the first or last index) + ! We write the loops out explicitly so compilers will have no trouble optimizing them. + ! + if(top_at_1==1) then + ilev = nlay + 1 + ! Albedo of lowest level is the surface albedo... + albedo(:,ilev) = albedo_sfc(:) + ! ... and source of diffuse radiation is surface emission + src(:,ilev) = src_sfc(:) + + ! + ! From bottom to top of atmosphere -- + ! compute albedo and source of upward radiation + ! + do ilev = nlay, 1, -1 + denom(:, ilev) = 1._wp/(1._wp - rdif(:,ilev)*albedo(:,ilev+1)) ! Eq 10 + albedo(:,ilev) = rdif(:,ilev) + & + tdif(:,ilev)*tdif(:,ilev) * albedo(:,ilev+1) * denom(:,ilev) ! Equation 9 + ! + ! Equation 11 -- source is emitted upward radiation at top of layer plus + ! radiation emitted at bottom of layer, + ! transmitted through the layer and reflected from layers below (tdiff*src*albedo) + ! + src(:,ilev) = src_up(:, ilev) + & + tdif(:,ilev) * denom(:,ilev) * & + (src(:,ilev+1) + albedo(:,ilev+1)*src_dn(:,ilev)) + end do + + ! Eq 12, at the top of the domain upwelling diffuse is due to ... + ilev = 1 + flux_up(:,ilev) = flux_dn(:,ilev) * albedo(:,ilev) + & ! ... reflection of incident diffuse and + src(:,ilev) ! emission from below + + ! + ! From the top of the atmosphere downward -- compute fluxes + ! + do ilev = 2, nlay+1 + flux_dn(:,ilev) = (tdif(:,ilev-1)*flux_dn(:,ilev-1) + & ! Equation 13 + rdif(:,ilev-1)*src(:,ilev) + & + src_dn(:,ilev-1)) * denom(:,ilev-1) + flux_up(:,ilev) = flux_dn(:,ilev) * albedo(:,ilev) + & ! Equation 12 + src(:,ilev) + end do + else + ilev = 1 + ! Albedo of lowest level is the surface albedo... + albedo(:,ilev) = albedo_sfc(:) + ! ... and source of diffuse radiation is surface emission + src(:,ilev) = src_sfc(:) + + ! + ! From bottom to top of atmosphere -- + ! compute albedo and source of upward radiation + ! + do ilev = 1, nlay + denom(:, ilev ) = 1._wp/(1._wp - rdif(:,ilev)*albedo(:,ilev)) ! Eq 10 + albedo(:,ilev+1) = rdif(:,ilev) + & + tdif(:,ilev)*tdif(:,ilev) * albedo(:,ilev) * denom(:,ilev) ! Equation 9 + ! + ! Equation 11 -- source is emitted upward radiation at top of layer plus + ! radiation emitted at bottom of layer, + ! transmitted through the layer and reflected from layers below (tdiff*src*albedo) + ! + src(:,ilev+1) = src_up(:, ilev) + & + tdif(:,ilev) * denom(:,ilev) * & + (src(:,ilev) + albedo(:,ilev)*src_dn(:,ilev)) + end do + + ! Eq 12, at the top of the domain upwelling diffuse is due to ... + ilev = nlay+1 + flux_up(:,ilev) = flux_dn(:,ilev) * albedo(:,ilev) + & ! ... reflection of incident diffuse and + src(:,ilev) ! scattering by the direct beam below + + ! + ! From the top of the atmosphere downward -- compute fluxes + ! + do ilev = nlay, 1, -1 + flux_dn(:,ilev) = (tdif(:,ilev)*flux_dn(:,ilev+1) + & ! Equation 13 + rdif(:,ilev)*src(:,ilev) + & + src_dn(:, ilev)) * denom(:,ilev) + flux_up(:,ilev) = flux_dn(:,ilev) * albedo(:,ilev) + & ! Equation 12 + src(:,ilev) + + end do + end if +end subroutine adding +end module mo_rte_solver_kernels diff --git a/src/radiate/rte-rrtmgp/rte/mo_fluxes.F90 b/src/radiate/rte-rrtmgp/rte/mo_fluxes.F90 new file mode 100644 index 0000000..4afc790 --- /dev/null +++ b/src/radiate/rte-rrtmgp/rte/mo_fluxes.F90 @@ -0,0 +1,194 @@ +! This code is part of Radiative Transfer for Energetics (RTE) +! +! Contacts: Robert Pincus and Eli Mlawer +! email: rrtmgp@aer.com +! +! Copyright 2015- Atmospheric and Environmental Research and +! Regents of the University of Colorado. All right reserved. +! +! Use and duplication is permitted under the terms of the +! BSD 3-clause license, see http://opensource.org/licenses/BSD-3-Clause +! ------------------------------------------------------------------------------------------------- +! +!> ## Compute output quantities from spectrally-resolved flux profiles +!> +!> This module contains an abstract class and a broadband implmentation that sums over all spectral points +!> The abstract base class defines the routines that extenstions must implement: `reduce()` and `are_desired()` +!> The intent is for users to extend it as required, using mo_flxues_broadband as an example +! +! ------------------------------------------------------------------------------------------------- +module mo_fluxes + use mo_rte_kind, only: wp + use mo_rte_config, only: check_extents + use mo_rte_util_array, only: extents_are + use mo_optical_props, only: ty_optical_props + use mo_fluxes_broadband_kernels, & + only: sum_broadband, net_broadband + implicit none + private + ! ----------------------------------------------------------------------------------------------- + ! + !> Abstract base class: + !> `reduce()` function accepts spectral flux profiles, computes desired outputs + !> `are_desired()` returns a logical + ! + ! ----------------------------------------------------------------------------------------------- + type, abstract, public :: ty_fluxes + contains + procedure(reduce_abstract), deferred, public :: reduce + procedure(are_desired_abstract), deferred, public :: are_desired + end type ty_fluxes + ! ----------------------------------------------------------------------------------------------- + ! + !> Class implementing broadband integration for the complete flux profile. + !> Data components are pointers so results can be written directly into memory + ! + ! ----------------------------------------------------------------------------------------------- + type, extends(ty_fluxes), public :: ty_fluxes_broadband + real(wp), dimension(:,:), pointer :: flux_up => NULL(), flux_dn => NULL() + real(wp), dimension(:,:), pointer :: flux_net => NULL() ! Net (down - up) + real(wp), dimension(:,:), pointer :: flux_dn_dir => NULL() ! Direct flux down + contains + procedure, public :: reduce => reduce_broadband + procedure, public :: are_desired => are_desired_broadband + end type ty_fluxes_broadband + ! ----------------------------------------------------------------------------------------------- + + ! ----------------------------------------------------------------------------------------------- + ! + ! Abstract interfaces: any implemntation has to provide routines with these interfaces + ! + abstract interface + ! ------------------- + ! + !> This routine takes the fully resolved calculation (detailed in spectral and vertical dimensions) and + !> computes desired outputs. Output values will normally be data components of the derived type. + ! + function reduce_abstract(this, gpt_flux_up, gpt_flux_dn, spectral_disc, top_at_1, gpt_flux_dn_dir) result(error_msg) + import ty_fluxes, ty_optical_props + import wp + class(ty_fluxes), intent(inout) :: this + real(kind=wp), dimension(:,:,:), intent(in ) :: gpt_flux_up ! Fluxes by gpoint [W/m2](ncol, nlay+1, ngpt) + real(kind=wp), dimension(:,:,:), intent(in ) :: gpt_flux_dn ! Fluxes by gpoint [W/m2](ncol, nlay+1, ngpt) + class(ty_optical_props), intent(in ) :: spectral_disc !< derived type with spectral information + integer, intent(in ) :: top_at_1 + real(kind=wp), dimension(:,:,:), optional, & + intent(in ) :: gpt_flux_dn_dir! Direct flux down + character(len=128) :: error_msg + end function reduce_abstract + ! ------------------- + ! + ! This routine determines if the reduction should proceed - it's useful in ensuring + ! that space has been allocated for the results, for example. + ! + function are_desired_abstract(this) + import ty_fluxes + class(ty_fluxes), intent(in ) :: this + logical :: are_desired_abstract + end function are_desired_abstract + ! ---------------------- + end interface +contains + ! -------------------------------------------------------------------------------------- + ! + !> Broadband fluxes -- simply sum over the spectral dimension and report the whole profile + ! + ! -------------------------------------------------------------------------------------- + function reduce_broadband(this, gpt_flux_up, gpt_flux_dn, spectral_disc, top_at_1, gpt_flux_dn_dir) result(error_msg) + class(ty_fluxes_broadband), intent(inout) :: this + real(kind=wp), dimension(:,:,:), intent(in ) :: gpt_flux_up ! Fluxes by gpoint [W/m2](ncol, nlay+1, ngpt) + real(kind=wp), dimension(:,:,:), intent(in ) :: gpt_flux_dn ! Fluxes by gpoint [W/m2](ncol, nlay+1, ngpt) + class(ty_optical_props), intent(in ) :: spectral_disc !< derived type with spectral information + integer, intent(in ) :: top_at_1 + real(kind=wp), dimension(:,:,:), optional, & + intent(in ) :: gpt_flux_dn_dir! Direct flux down + character(len=128) :: error_msg + ! ------ + integer :: ncol, nlev, ngpt + + ! ------ + ncol = size(gpt_flux_up, DIM=1) + nlev = size(gpt_flux_up, DIM=2) + ngpt = size(gpt_flux_up, DIM=3) + error_msg = "" + + if(check_extents) then + ! + ! Check array sizes + ! Input arrays + ! + if(.not. extents_are(gpt_flux_dn, ncol, nlev, ngpt)) & + error_msg = "reduce: gpt_flux_dn array incorrectly sized" + + if(present(gpt_flux_dn_dir)) then + if(.not. extents_are(gpt_flux_dn_dir, ncol, nlev, ngpt)) & + error_msg = "reduce: gpt_flux_dn_dir array incorrectly sized" + end if + ! + ! Output arrays + ! + if(associated(this%flux_up)) then + if(.not. extents_are(this%flux_up, ncol, nlev)) & + error_msg = 'reduce: flux_up array incorrectly sized' + end if + if(associated(this%flux_dn)) then + if(.not. extents_are(this%flux_dn, ncol, nlev)) & + error_msg = 'reduce: flux_dn array incorrectly sized' + end if + if(associated(this%flux_net)) then + if(.not. extents_are(this%flux_net, ncol, nlev)) & + error_msg = 'reduce: flux_net array incorrectly sized' + end if + if(associated(this%flux_dn_dir)) then + if(.not. extents_are(this%flux_dn_dir, ncol, nlev)) & + error_msg = 'reduce: flux_dn_dir array incorrectly sized' + end if + + if(error_msg /= "") return + end if + ! + ! Self-consistency -- shouldn't be asking for direct beam flux if it isn't supplied + ! + if(associated(this%flux_dn_dir) .and. .not. present(gpt_flux_dn_dir)) then + error_msg = "reduce: requesting direct downward flux but this hasn't been supplied" + return + end if + + ! + ! Broadband fluxes - call the kernels + ! + if(associated(this%flux_up )) & + call sum_broadband(ncol, nlev, ngpt, gpt_flux_up, this%flux_up) + if(associated(this%flux_dn )) & + call sum_broadband(ncol, nlev, ngpt, gpt_flux_dn, this%flux_dn) + if(associated(this%flux_dn_dir)) & + call sum_broadband(ncol, nlev, ngpt, gpt_flux_dn_dir, this%flux_dn_dir) + + if(associated(this%flux_net)) then + ! + ! Reuse down and up results if possible + ! + if(associated(this%flux_dn) .and. associated(this%flux_up)) then + call net_broadband(ncol, nlev, this%flux_dn, this%flux_up, this%flux_net) + else + call net_broadband(ncol, nlev, ngpt, gpt_flux_dn, gpt_flux_up, this%flux_net) + end if + end if + end function reduce_broadband + ! -------------------------------------------------------------------------------------- + ! + !> Are any fluxes desired from this set of g-point fluxes? We can tell because memory will + !> be allocated for output + ! + ! -------------------------------------------------------------------------------------- + function are_desired_broadband(this) + class(ty_fluxes_broadband), intent(in ) :: this + logical :: are_desired_broadband + + are_desired_broadband = any( [associated(this%flux_up), & + associated(this%flux_dn), & + associated(this%flux_dn_dir), & + associated(this%flux_net)] ) + end function are_desired_broadband + ! -------------------------------------------------------------------------------------- +end module mo_fluxes diff --git a/src/radiate/rte-rrtmgp/rte/mo_optical_props.F90 b/src/radiate/rte-rrtmgp/rte/mo_optical_props.F90 new file mode 100644 index 0000000..372e2e5 --- /dev/null +++ b/src/radiate/rte-rrtmgp/rte/mo_optical_props.F90 @@ -0,0 +1,1244 @@ +! This code is part of Radiative Transfer for Energetics (RTE) +! +! Contacts: Robert Pincus and Eli Mlawer +! email: rrtmgp@aer.com +! +! Copyright 2015- Atmospheric and Environmental Research, +! Regents of the University of Colorado, +! Trustees of Columbia University in the City of New York +! All right reserved. +! +! Use and duplication is permitted under the terms of the +! BSD 3-clause license, see http://opensource.org/licenses/BSD-3-Clause +! ------------------------------------------------------------------------------------------------- +!> +!> ## Encapsulate optical properties defined on a spectral grid of N bands. +!> +!> The bands are described by their limiting wavenumbers. They need not be contiguous or complete. +!> A band may contain more than one spectral sub-point (g-point) in which case a mapping must be supplied. +!> A name may be provided and will be prepended to error messages. +!> The base class (ty_optical_props) encapsulates only this spectral discretization and must be initialized +!> with the spectral information before use. +!> +!> Optical properties may be represented as arrays with dimensions ncol, nlay, ngpt +!> (abstract class ty_optical_props_arry). +!> The type holds arrays depending on how much information is needed +!> There are three possibilites +!> +!> - ty_optical_props_1scl holds absorption optical depth tau, used in calculations accounting for extinction and emission +!> - ty_optical_props_2str holds extincion optical depth tau, single-scattering albedo ssa, and +!> asymmetry parameter g. These fields are what's needed for two-stream calculations. +!> - ty_optical_props_nstr holds extincion optical depth tau, single-scattering albedo ssa, and +!> phase function moments p with leading dimension nmom. These fields are what's needed for multi-stream calculations. +!> +!> These classes must be allocated before use. Initialization and allocation can be combined. +!> The classes have a validate() function that checks all arrays for valid values (e.g. tau > 0.) +!> +!> Optical properties can be delta-scaled (though this is currently implemented only for two-stream arrays) +!> +!> Optical properties can increment or "add themselves to" a set of properties represented with arrays +!> as long as both sets have the same underlying band structure. Properties defined by band +!> may be added to properties defined by g-point; the same value is assumed for all g-points with each band. +!> +!> Subsets of optical properties held as arrays may be extracted along the column dimension. +!> +! Making the documentation below visible in ford, by replace ! with !>, messes up Markdown parsing above +!@note +!example of a note with links to other modules and variables +! +! 1. [[mo_rte_config(module):check_extents(variable)]] in module [[mo_rte_config]] +!> +!@endnote +!> ------------------------------------------------------------------------------------------------- +module mo_optical_props + use mo_rte_kind, only: wp + use mo_rte_config, only: check_extents, check_values + use mo_rte_util_array, only: any_vals_less_than, any_vals_outside, extents_are + use mo_optical_props_kernels, only: & + increment_1scalar_by_1scalar, increment_1scalar_by_2stream, increment_1scalar_by_nstream, & + increment_2stream_by_1scalar, increment_2stream_by_2stream, increment_2stream_by_nstream, & + increment_nstream_by_1scalar, increment_nstream_by_2stream, increment_nstream_by_nstream, & + inc_1scalar_by_1scalar_bybnd, inc_1scalar_by_2stream_bybnd, inc_1scalar_by_nstream_bybnd, & + inc_2stream_by_1scalar_bybnd, inc_2stream_by_2stream_bybnd, inc_2stream_by_nstream_bybnd, & + inc_nstream_by_1scalar_bybnd, inc_nstream_by_2stream_bybnd, inc_nstream_by_nstream_bybnd, & + delta_scale_2str_kernel, & + extract_subset + implicit none + private + integer, parameter, public :: name_len = 32 + ! ------------------------------------------------------------------------------------------------- + ! + !> ### Base class for optical properties + !> Describes the spectral discretization including the wavenumber limits + !> of each band (spectral region) and the mapping between g-points and bands + ! + ! ------------------------------------------------------------------------------------------------- + type, public :: ty_optical_props + integer, dimension(:,:), allocatable, private :: band2gpt ! (begin g-point, end g-point) = band2gpt(2,band) + integer, dimension(:), allocatable, private :: gpt2band ! band = gpt2band(g-point) + real(wp), dimension(:,:), allocatable, public :: band_lims_wvn ! (upper and lower wavenumber by band) = band_lims_wvn(2,band) + character(len=name_len), private :: name = "" + contains + generic, public :: init => init_base, init_base_from_copy + procedure, private :: init_base + procedure, private :: init_base_from_copy + procedure, public :: is_initialized => is_initialized_base + procedure, private :: is_initialized_base + procedure, public :: finalize => finalize_base + procedure, private :: finalize_base + procedure, public :: get_nband + procedure, public :: get_ngpt + procedure, public :: get_gpoint_bands + procedure, public :: convert_band2gpt + procedure, public :: convert_gpt2band + procedure, public :: get_band_lims_gpoint + procedure, public :: get_band_lims_wavenumber + procedure, public :: get_band_lims_wavelength + procedure, public :: bands_are_equal + procedure, public :: gpoints_are_equal + procedure, public :: expand + procedure, public :: set_name + procedure, public :: get_name + end type ty_optical_props + !---------------------------------------------------------------------------------------- + ! + !>### Optical properties as arrays, normally dimensioned ncol, nlay, ngpt/nbnd + !> The abstract base class for arrays defines what procedures will be available + ! + ! ------------------------------------------------------------------------------------------------- + type, extends(ty_optical_props), abstract, public :: ty_optical_props_arry + real(wp), dimension(:,:,:), allocatable :: tau !! optical depth (ncol, nlay, ngpt) + contains + procedure, public :: get_ncol + procedure, public :: get_nlay + !> + !> Increment another set of values + !> + procedure, public :: increment + + !> + !> Deferred procedures -- each must be implemented in each child class with + !> arguments following the abstract interface (defined below) + !> + procedure(validate_abstract), deferred, public :: validate + procedure(delta_scale_abstract), deferred, public :: delta_scale + procedure(subset_range_abstract), deferred, public :: get_subset + end type ty_optical_props_arry + ! + ! Interfaces for the methods to be implemented + ! + abstract interface + !> + !> Validation function looks only at internal data + !> + function validate_abstract(this) result(err_message) + import ty_optical_props_arry + class(ty_optical_props_arry), intent(in) :: this + character(len=128) :: err_message + end function validate_abstract + + !> + !> Delta-scaling + !> + function delta_scale_abstract(this, for) result(err_message) + import ty_optical_props_arry + import wp + class(ty_optical_props_arry), intent(inout) :: this + real(wp), dimension(:,:,:), optional, & + intent(in ) :: for + !> Forward scattering fraction; g**2 if not provided + character(len=128) :: err_message + end function delta_scale_abstract + + !> + !> Subsetting -- currently there are only routines with start col and count + !> + function subset_range_abstract(full, start, n, subset) result(err_message) + import ty_optical_props_arry + class(ty_optical_props_arry), intent(inout) :: full + integer, intent(in ) :: start, n + class(ty_optical_props_arry), intent(inout) :: subset + character(128) :: err_message + end function subset_range_abstract + end interface + !>---------------------------------------------------------------------------------------- + !> + !> ty_optical_props_arry represents optical properties as arrays with dimensions + !> column, height, spectral point + !> - Class 1-scalar only (extinction) optical depth + !> - Class two-stream adds arrays for single scattering albedo ssa and + !> asymmetry parameter needed in two-stream methods + !> - Class n-stream adds arrays for single scattering albedo ssa and + !> phase function moments (index 1 = g) for use with discrete ordinate methods + !> + !> ------------------------------------------------------------------------------------------------- + type, public, extends(ty_optical_props_arry) :: ty_optical_props_1scl + contains + procedure, public :: validate => validate_1scalar + procedure, public :: get_subset => subset_1scl_range + procedure, public :: delta_scale => delta_scale_1scl + procedure, public :: finalize_1scl + + procedure, private :: alloc_only_1scl + procedure, private :: init_and_alloc_1scl + procedure, private :: copy_and_alloc_1scl + generic, public :: alloc_1scl => alloc_only_1scl, init_and_alloc_1scl, copy_and_alloc_1scl + end type ty_optical_props_1scl + + ! --- 2 stream ------------------------------------------------------------------------ + type, public, extends(ty_optical_props_arry) :: ty_optical_props_2str + real(wp), dimension(:,:,:), allocatable :: ssa !! single-scattering albedo (ncol, nlay, ngpt) + real(wp), dimension(:,:,:), allocatable :: g !! asymmetry parameter (ncol, nlay, ngpt) + contains + procedure, public :: validate => validate_2stream + procedure, public :: get_subset => subset_2str_range + procedure, public :: delta_scale => delta_scale_2str + procedure, public :: finalize_2str + + procedure, private :: alloc_only_2str + procedure, private :: init_and_alloc_2str + procedure, private :: copy_and_alloc_2str + generic, public :: alloc_2str => alloc_only_2str, init_and_alloc_2str, copy_and_alloc_2str + end type ty_optical_props_2str + + ! --- n stream ------------------------------------------------------------------------ + type, public, extends(ty_optical_props_arry) :: ty_optical_props_nstr + real(wp), dimension(:,:,:), allocatable :: ssa !! single-scattering albedo (ncol, nlay, ngpt) + real(wp), dimension(:,:,:,:), allocatable :: p !! phase-function moments (nmom, ncol, nlay, ngpt) + contains + procedure, public :: validate => validate_nstream + procedure, public :: get_subset => subset_nstr_range + procedure, public :: delta_scale => delta_scale_nstr + procedure, public :: get_nmom + procedure, public :: finalize_nstr + + procedure, private :: alloc_only_nstr + procedure, private :: init_and_alloc_nstr + procedure, private :: copy_and_alloc_nstr + generic, public :: alloc_nstr => alloc_only_nstr, init_and_alloc_nstr, copy_and_alloc_nstr + end type ty_optical_props_nstr + ! ------------------------------------------------------------------------------------------------- +contains + ! ------------------------------------------------------------------------------------------------- + ! + ! Routines for the base class: initialization, validity checking, finalization + ! + !> ------------------------------------------------------------------------------------------------- + !> + !> Base class: Initialization + !> Values are assumed to be defined in bands a mapping between bands and g-points is provided + !> + !> ------------------------------------------------------------------------------------------------- + function init_base(this, band_lims_wvn, band_lims_gpt, name) result(err_message) + class(ty_optical_props), intent(inout) :: this + real(wp), dimension(:,:), intent(in ) :: band_lims_wvn + integer, dimension(:,:), & + optional, intent(in ) :: band_lims_gpt + character(len=*), optional, intent(in ) :: name + character(len = 128) :: err_message + + integer :: iband + integer, dimension(2, size(band_lims_wvn, 2)) :: band_lims_gpt_lcl + ! ------------------------- + ! + ! Error checking -- are the arrays the size we expect, contain positive values? + ! + err_message = "" + if(size(band_lims_wvn,1) /= 2) & + err_message = "optical_props%init(): band_lims_wvn 1st dim should be 2" + if (check_values) then + if(any_vals_less_than(band_lims_wvn, 0._wp) ) & + err_message = "optical_props%init(): band_lims_wvn has values < 0., respectively" + end if + if(err_message /="") return + if(present(band_lims_gpt)) then + if (check_extents) then + if(.not. extents_are(band_lims_gpt, 2, size(band_lims_wvn,2))) & + err_message = "optical_props%init(): band_lims_gpt size inconsistent with band_lims_wvn" + end if + if (check_values) then + if(any(band_lims_gpt < 1) ) & + err_message = "optical_props%init(): band_lims_gpt has values < 1" + end if + if(err_message /= "") return + + band_lims_gpt_lcl(:,:) = band_lims_gpt(:,:) + else + ! + ! Assume that values are defined by band, one g-point per band + ! + do iband = 1, size(band_lims_wvn, 2) + band_lims_gpt_lcl(1:2,iband) = iband + end do + end if + ! + ! Assignment + ! + if(allocated(this%band2gpt )) deallocate(this%band2gpt) + if(allocated(this%band_lims_wvn)) deallocate(this%band_lims_wvn) + allocate(this%band2gpt (2,size(band_lims_wvn,2)), & + this%band_lims_wvn(2,size(band_lims_wvn,2))) + this%band2gpt = band_lims_gpt_lcl + this%band_lims_wvn = band_lims_wvn + if(present(name)) this%name = trim(name) + + ! + ! Make a map between g-points and bands + ! Efficient only when g-point indexes start at 1 and are contiguous. + ! + if(allocated(this%gpt2band)) deallocate(this%gpt2band) + allocate(this%gpt2band(maxval(band_lims_gpt_lcl))) + do iband=1,size(band_lims_gpt_lcl,dim=2) + this%gpt2band(band_lims_gpt_lcl(1,iband):band_lims_gpt_lcl(2,iband)) = iband + end do + end function init_base + !------------------------------------------------------------------------------------------------- + function init_base_from_copy(this, spectral_desc) result(err_message) + class(ty_optical_props), intent(inout) :: this + class(ty_optical_props), intent(in ) :: spectral_desc + character(len = 128) :: err_message + + if(.not. spectral_desc%is_initialized()) then + err_message = "optical_props%init(): can't initialize based on un-initialized input" + return + else + err_message = this%init(spectral_desc%get_band_lims_wavenumber(), & + spectral_desc%get_band_lims_gpoint()) + end if + end function init_base_from_copy + !>------------------------------------------------------------------------------------------------- + !> + !> Base class: return true if initialized, false otherwise + !> + !> ------------------------------------------------------------------------------------------------- + pure function is_initialized_base(this) + class(ty_optical_props), intent(in) :: this + logical :: is_initialized_base + + is_initialized_base = allocated(this%band2gpt) + end function is_initialized_base + !>------------------------------------------------------------------------------------------------- + !> + !> Base class: finalize (deallocate memory) + !> + !> ------------------------------------------------------------------------------------------------- + subroutine finalize_base(this) + class(ty_optical_props), intent(inout) :: this + + if(allocated(this%band2gpt)) deallocate(this%band2gpt) + if(allocated(this%gpt2band)) deallocate(this%gpt2band) + if(allocated(this%band_lims_wvn)) & + deallocate(this%band_lims_wvn) + this%name = "" + end subroutine finalize_base + ! ------------------------------------------------------------------------------------------ + ! + ! Routines for array classes: initialization, allocation, and finalization + ! Initialization and allocation can be combined by supplying either + ! + !> ------------------------------------------------------------------------------------------ + !> + !> Straight allocation routines + !> + !> --- 1 scalar ------------------------------------------------------------------------ + function alloc_only_1scl(this, ncol, nlay) result(err_message) + class(ty_optical_props_1scl) :: this + integer, intent(in) :: ncol, nlay + character(len=128) :: err_message + + err_message = "" + if(.not. this%is_initialized()) then + err_message = "optical_props%alloc: spectral discretization hasn't been provided" + return + end if + if(any([ncol, nlay] <= 0)) then + err_message = "optical_props%alloc: must provide positive extents for ncol, nlay" + else + if(allocated(this%tau)) deallocate(this%tau) + allocate(this%tau(ncol,nlay,this%get_ngpt())) + end if + end function alloc_only_1scl + + !> --- 2 stream ------------------------------------------------------------------------ + function alloc_only_2str(this, ncol, nlay) result(err_message) + class(ty_optical_props_2str) :: this + integer, intent(in) :: ncol, nlay + character(len=128) :: err_message + + err_message = "" + if(.not. this%is_initialized()) & + err_message = "optical_props%alloc: spectral discretization hasn't been provided" + if(any([ncol, nlay] <= 0)) & + err_message = "optical_props%alloc: must provide positive extents for ncol, nlay" + if(err_message /= "") return + + if(allocated(this%tau)) deallocate(this%tau) + allocate(this%tau(ncol,nlay,this%get_ngpt())) + if(allocated(this%ssa)) deallocate(this%ssa) + if(allocated(this%g )) deallocate(this%g ) + allocate(this%ssa(ncol,nlay,this%get_ngpt()), this%g(ncol,nlay,this%get_ngpt())) + end function alloc_only_2str + + !> --- n stream ------------------------------------------------------------------------ + function alloc_only_nstr(this, nmom, ncol, nlay) result(err_message) + class(ty_optical_props_nstr) :: this + integer, intent(in) :: nmom ! number of moments + integer, intent(in) :: ncol, nlay + character(len=128) :: err_message + + err_message = "" + if(.not. this%is_initialized()) & + err_message = "optical_props%alloc: spectral discretization hasn't been provided" + if(any([ncol, nlay] <= 0)) & + err_message = "optical_props%alloc: must provide positive extents for ncol, nlay" + if(err_message /= "") return + + if(allocated(this%tau)) deallocate(this%tau) + allocate(this%tau(ncol,nlay,this%get_ngpt())) + if(allocated(this%ssa)) deallocate(this%ssa) + if(allocated(this%p )) deallocate(this%p ) + allocate(this%ssa(ncol,nlay,this%get_ngpt()), this%p(nmom,ncol,nlay,this%get_ngpt())) + end function alloc_only_nstr + ! ------------------------------------------------------------------------------------------ + ! + ! Combined allocation/initialization routines + ! + !> ------------------------------------------------------------------------------------------ + !> + !> Initialization by specifying band limits and possibly g-point/band mapping + !> + !> --------------------------------------------------------------------------- + function init_and_alloc_1scl(this, ncol, nlay, band_lims_wvn, band_lims_gpt, name) result(err_message) + class(ty_optical_props_1scl) :: this + integer, intent(in) :: ncol, nlay + real(wp), dimension(:,:), intent(in) :: band_lims_wvn + integer, dimension(:,:), & + optional, intent(in) :: band_lims_gpt + character(len=*), optional, intent(in) :: name + character(len=128) :: err_message + + err_message = this%ty_optical_props%init(band_lims_wvn, & + band_lims_gpt, name) + if(err_message /= "") return + err_message = this%alloc_1scl(ncol, nlay) + end function init_and_alloc_1scl + ! --------------------------------------------------------------------------- + function init_and_alloc_2str(this, ncol, nlay, band_lims_wvn, band_lims_gpt, name) result(err_message) + class(ty_optical_props_2str) :: this + integer, intent(in) :: ncol, nlay + real(wp), dimension(:,:), intent(in) :: band_lims_wvn + integer, dimension(:,:), & + optional, intent(in) :: band_lims_gpt + character(len=*), optional, intent(in) :: name + character(len=128) :: err_message + + err_message = this%ty_optical_props%init(band_lims_wvn, & + band_lims_gpt, name) + if(err_message /= "") return + err_message = this%alloc_2str(ncol, nlay) + end function init_and_alloc_2str + ! --------------------------------------------------------------------------- + function init_and_alloc_nstr(this, nmom, ncol, nlay, band_lims_wvn, band_lims_gpt, name) result(err_message) + class(ty_optical_props_nstr) :: this + integer, intent(in) :: nmom, ncol, nlay + real(wp), dimension(:,:), intent(in) :: band_lims_wvn + integer, dimension(:,:), & + optional, intent(in) :: band_lims_gpt + character(len=*), optional, intent(in) :: name + character(len=128) :: err_message + + err_message = this%ty_optical_props%init(band_lims_wvn, & + band_lims_gpt, name) + if(err_message /= "") return + err_message = this%alloc_nstr(nmom, ncol, nlay) + end function init_and_alloc_nstr + !>------------------------------------------------------------------------------------------------- + !> + !> Initialization from an existing spectral discretization/ty_optical_props + !> + !>------------------------------------------------------------------------------------------------- + function copy_and_alloc_1scl(this, ncol, nlay, spectral_desc, name) result(err_message) + class(ty_optical_props_1scl) :: this + integer, intent(in) :: ncol, nlay + class(ty_optical_props ), intent(in) :: spectral_desc + character(len=*), optional, intent(in) :: name + character(len=128) :: err_message + + err_message = "" + if(this%ty_optical_props%is_initialized()) call this%ty_optical_props%finalize() + err_message = this%ty_optical_props%init(spectral_desc%get_band_lims_wavenumber(), & + spectral_desc%get_band_lims_gpoint(), name) + if(err_message /= "") return + err_message = this%alloc_1scl(ncol, nlay) + end function copy_and_alloc_1scl + ! --------------------------------------------------------------------------- + function copy_and_alloc_2str(this, ncol, nlay, spectral_desc, name) result(err_message) + class(ty_optical_props_2str) :: this + integer, intent(in) :: ncol, nlay + class(ty_optical_props ), intent(in) :: spectral_desc + character(len=*), optional, intent(in) :: name + character(len=128) :: err_message + + err_message = "" + if(this%ty_optical_props%is_initialized()) call this%ty_optical_props%finalize() + err_message = this%ty_optical_props%init(spectral_desc%get_band_lims_wavenumber(), & + spectral_desc%get_band_lims_gpoint(), name) + if(err_message /= "") return + err_message = this%alloc_2str(ncol, nlay) + end function copy_and_alloc_2str + ! --------------------------------------------------------------------------- + function copy_and_alloc_nstr(this, nmom, ncol, nlay, spectral_desc, name) result(err_message) + class(ty_optical_props_nstr) :: this + integer, intent(in) :: nmom, ncol, nlay + class(ty_optical_props ), intent(in) :: spectral_desc + character(len=*), optional, intent(in) :: name + character(len=128) :: err_message + + err_message = "" + if(this%ty_optical_props%is_initialized()) call this%ty_optical_props%finalize() + err_message = this%ty_optical_props%init(spectral_desc%get_band_lims_wavenumber(), & + spectral_desc%get_band_lims_gpoint(), name) + if(err_message /= "") return + err_message = this%alloc_nstr(nmom, ncol, nlay) + end function copy_and_alloc_nstr + !> ------------------------------------------------------------------------------------------ + !> + !> Finalize routines + !> + !> ------------------------------------------------------------------------------------------ + function finalize_1scl(this) result(err_message) + class(ty_optical_props_1scl) :: this + character(len=128) :: err_message + + if(allocated(this%tau)) deallocate(this%tau) + err_message = "" + end function finalize_1scl + ! --------------------------------------------------------------------------- + function finalize_2str(this) result(err_message) + class(ty_optical_props_2str) :: this + character(len=128) :: err_message + + if(allocated(this%tau)) deallocate(this%tau) + if(allocated(this%ssa)) deallocate(this%ssa) + if(allocated(this%g )) deallocate(this%g ) + err_message = "" + end function finalize_2str + ! --------------------------------------------------------------------------- + function finalize_nstr(this) result(err_message) + class(ty_optical_props_nstr) :: this + character(len=128) :: err_message + + if(allocated(this%tau)) deallocate(this%tau) + if(allocated(this%ssa)) deallocate(this%ssa) + if(allocated(this%p )) deallocate(this%p ) + err_message = "" + end function finalize_nstr + ! ------------------------------------------------------------------------------------------ + ! + ! Routines for array classes: delta-scaling, validation (ensuring all values can be used ) + ! + !> ------------------------------------------------------------------------------------------ + !> --- delta scaling + !> ------------------------------------------------------------------------------------------ + function delta_scale_1scl(this, for) result(err_message) + class(ty_optical_props_1scl), intent(inout) :: this + real(wp), dimension(:,:,:), optional, & + intent(in ) :: for + character(128) :: err_message + ! + ! Nothing to do + ! + err_message = "" + end function delta_scale_1scl + ! ------------------------------------------------------------------------------------------ + function delta_scale_2str(this, for) result(err_message) + class(ty_optical_props_2str), intent(inout) :: this + real(wp), dimension(:,:,:), optional, & + intent(in ) :: for + !! Forward scattering fraction; g**2 if not provided + character(128) :: err_message + + integer :: ncol, nlay, ngpt + ! -------------------------------- + ncol = this%get_ncol() + nlay = this%get_nlay() + ngpt = this%get_ngpt() + err_message = "" + + if(present(for)) then + if (check_extents) then + if(.not. extents_are(for, ncol, nlay, ngpt)) then + err_message = "delta_scale: dimension of 'for' don't match optical properties arrays" + return + end if + end if + if (check_values) then + if(any_vals_outside(for, 0._wp, 1._wp)) then + err_message = "delta_scale: values of 'for' out of bounds [0,1]" + return + end if + end if + call delta_scale_2str_kernel(ncol, nlay, ngpt, this%tau, this%ssa, this%g, for) + else + call delta_scale_2str_kernel(ncol, nlay, ngpt, this%tau, this%ssa, this%g) + end if + + end function delta_scale_2str + ! ------------------------------------------------------------------------------------------ + function delta_scale_nstr(this, for) result(err_message) + class(ty_optical_props_nstr), intent(inout) :: this + real(wp), dimension(:,:,:), optional, & + intent(in ) :: for + character(128) :: err_message + + err_message = 'delta_scale_nstr: Not yet implemented' + end function delta_scale_nstr + !> ------------------------------------------------------------------------------------------ + !> + !> --- Validation + !> + !> ------------------------------------------------------------------------------------------ + function validate_1scalar(this) result(err_message) + class(ty_optical_props_1scl), intent(in) :: this + character(len=128) :: err_message + + err_message = '' + if(.not. allocated(this%tau)) then + err_message = "validate: tau not allocated/initialized" + return + end if + if (check_values) then + if(any_vals_less_than(this%tau, 0._wp)) & + err_message = "validate: tau values out of range" + end if + if(len_trim(err_message) > 0 .and. len_trim(this%get_name()) > 0) & + err_message = trim(this%get_name()) // ': ' // trim(err_message) + + end function validate_1scalar + ! ------------------------------------------------------------------------------------------ + function validate_2stream(this) result(err_message) + class(ty_optical_props_2str), intent(in) :: this + character(len=128) :: err_message + + integer :: d1, d2, d3 + + err_message = '' + ! + ! Array allocation status, sizing + ! + if(check_extents) then + if(.not. all([allocated(this%tau), allocated(this%ssa), allocated(this%g)])) then + err_message = "validate: arrays not allocated/initialized" + return + end if + d1 = size(this%tau, 1) + d2 = size(this%tau, 2) + d3 = size(this%tau, 3) + if(.not. extents_are(this%ssa, d1, d2, d3) .or. & + .not. extents_are(this%g , d1, d2, d3)) & + err_message = "validate: arrays not sized consistently" + end if + ! + ! Valid values + ! + if (check_values) then + if(any_vals_less_than(this%tau, 0._wp)) & + err_message = "validate: tau values out of range" + if(any_vals_outside (this%ssa, 0._wp, 1._wp)) & + err_message = "validate: ssa values out of range" + if(any_vals_outside (this%g , -1._wp, 1._wp)) & + err_message = "validate: g values out of range" + end if + + if(len_trim(err_message) > 0 .and. len_trim(this%get_name()) > 0) & + err_message = trim(this%get_name()) // ': ' // trim(err_message) + + end function validate_2stream + + ! ------------------------------------------------------------------------------------------ + function validate_nstream(this) result(err_message) + class(ty_optical_props_nstr), intent(in) :: this + character(len=128) :: err_message + + integer :: d1, d2, d3, d4 + + err_message = '' + ! + ! Array allocation status, sizing + ! + if(.not. all([allocated(this%tau), allocated(this%ssa), allocated(this%p)])) then + err_message = "validate: arrays not allocated/initialized" + return + end if + d1 = size(this%tau, 1) + d2 = size(this%tau, 2) + d3 = size(this%tau, 3) + d4 = size(this%p, 1) + if (check_extents) then + if(.not. extents_are(this%ssa, d1, d2, d3) .or. & + .not. extents_are(this%p , d4, d1, d2, d3)) & + err_message = "validate: arrays not sized consistently" + end if + ! + ! Valid values + ! + if (check_values) then + if(any_vals_less_than(this%tau, 0._wp)) & + err_message = "validate: tau values out of range" + if(any_vals_outside (this%ssa, 0._wp, 1._wp)) & + err_message = "validate: ssa values out of range" + if(any_vals_outside (this%p(1,:,:,:), -1._wp, 1._wp)) & + err_message = "validate: p(1,:,:,:) = g values out of range" + end if + + if(len_trim(err_message) > 0 .and. len_trim(this%get_name()) > 0) & + err_message = trim(this%get_name()) // ': ' // trim(err_message) + end function validate_nstream + + ! ------------------------------------------------------------------------------------------ + ! + ! Routines for array classes: subsetting of optical properties arrays along x (col) direction + ! + ! Allocate class, then arrays; copy. Could probably be more efficient if + ! classes used pointers internally. + ! + ! This set takes start position and number as scalars + ! + ! ------------------------------------------------------------------------------------------ + + function subset_1scl_range(full, start, n, subset) result(err_message) + class(ty_optical_props_1scl), intent(inout) :: full + integer, intent(in ) :: start, n + class(ty_optical_props_arry), intent(inout) :: subset + character(128) :: err_message + + integer :: ncol, nlay, ngpt, nmom + + err_message = "" + if(.not. full%is_initialized()) then + err_message = "optical_props%subset: Asking for a subset of uninitialized data" + return + end if + ncol = full%get_ncol() + nlay = full%get_nlay() + ngpt = full%get_ngpt() + if(start < 1 .or. start + n-1 > full%get_ncol()) & + err_message = "optical_props%subset: Asking for columns outside range" + if(err_message /= "") return + + if(subset%is_initialized()) call subset%finalize() + err_message = subset%init(full) + ! Seems like the deallocation statements should be needed under Fortran 2003 + ! but Intel compiler doesn't run without them + if(allocated(subset%tau)) deallocate(subset%tau) + select type (subset) + class is (ty_optical_props_1scl) + err_message = subset%alloc_1scl(n, nlay) + if(err_message /= "") return + class is (ty_optical_props_2str) + if(allocated(subset%ssa)) deallocate(subset%ssa) + if(allocated(subset%g )) deallocate(subset%g ) + err_message = subset%alloc_2str(n, nlay) + if(err_message /= "") return + subset%ssa(1:n,:,:) = 0._wp + subset%g (1:n,:,:) = 0._wp + class is (ty_optical_props_nstr) + if(allocated(subset%ssa)) deallocate(subset%ssa) + if(allocated(subset%p )) then + nmom = subset%get_nmom() + deallocate(subset%p ) + else + nmom = 1 + end if + err_message = subset%alloc_nstr(nmom, n, nlay) + if(err_message /= "") return + subset%ssa(1:n,:,:) = 0._wp + subset%p(:,1:n,:,:) = 0._wp + end select + call extract_subset(ncol, nlay, ngpt, full%tau, start, start+n-1, subset%tau) + + end function subset_1scl_range + ! ------------------------------------------------------------------------------------------ + function subset_2str_range(full, start, n, subset) result(err_message) + class(ty_optical_props_2str), intent(inout) :: full + integer, intent(in ) :: start, n + class(ty_optical_props_arry), intent(inout) :: subset + character(128) :: err_message + + integer :: ncol, nlay, ngpt, nmom + + err_message = "" + if(.not. full%is_initialized()) then + err_message = "optical_props%subset: Asking for a subset of uninitialized data" + return + end if + ncol = full%get_ncol() + nlay = full%get_nlay() + ngpt = full%get_ngpt() + if(start < 1 .or. start + n-1 > full%get_ncol()) & + err_message = "optical_props%subset: Asking for columns outside range" + if(err_message /= "") return + + if(subset%is_initialized()) call subset%finalize() + err_message = subset%init(full) + select type (subset) + class is (ty_optical_props_1scl) + err_message = subset%alloc_1scl(n, nlay) + if(err_message /= "") return + call extract_subset(ncol, nlay, ngpt, full%tau, full%ssa, start, start+n-1, subset%tau) + class is (ty_optical_props_2str) + if(allocated(subset%ssa)) deallocate(subset%ssa) + if(allocated(subset%g )) deallocate(subset%g ) + err_message = subset%alloc_2str(n, nlay) + if(err_message /= "") return + call extract_subset(ncol, nlay, ngpt, full%tau, start, start+n-1, subset%tau) + call extract_subset(ncol, nlay, ngpt, full%ssa, start, start+n-1, subset%ssa) + call extract_subset(ncol, nlay, ngpt, full%g , start, start+n-1, subset%g ) + class is (ty_optical_props_nstr) + if(allocated(subset%ssa)) deallocate(subset%ssa) + if(allocated(subset%p )) then + nmom = subset%get_nmom() + deallocate(subset%p ) + else + nmom = 1 + end if + err_message = subset%alloc_nstr(nmom, n, nlay) + if(err_message /= "") return + call extract_subset(ncol, nlay, ngpt, full%tau, start, start+n-1, subset%tau) + call extract_subset(ncol, nlay, ngpt, full%ssa, start, start+n-1, subset%ssa) + subset%p(1,1:n,:,:) = full%g (start:start+n-1,:,:) + subset%p(2:,:, :,:) = 0._wp + end select + + end function subset_2str_range + ! ------------------------------------------------------------------------------------------ + function subset_nstr_range(full, start, n, subset) result(err_message) + class(ty_optical_props_nstr), intent(inout) :: full + integer, intent(in ) :: start, n + class(ty_optical_props_arry), intent(inout) :: subset + character(128) :: err_message + + integer :: ncol, nlay, ngpt, nmom + + err_message = "" + if(.not. full%is_initialized()) then + err_message = "optical_props%subset: Asking for a subset of uninitialized data" + return + end if + ncol = full%get_ncol() + nlay = full%get_nlay() + ngpt = full%get_ngpt() + if(start < 1 .or. start + n-1 > full%get_ncol()) & + err_message = "optical_props%subset: Asking for columns outside range" + if(err_message /= "") return + + if(subset%is_initialized()) call subset%finalize() + err_message = subset%init(full) + if(allocated(subset%tau)) deallocate(subset%tau) + select type (subset) + class is (ty_optical_props_1scl) + err_message = subset%alloc_1scl(n, nlay) + if(err_message /= "") return + call extract_subset(ncol, nlay, ngpt, full%tau, full%ssa, start, start+n-1, subset%tau) + class is (ty_optical_props_2str) + if(allocated(subset%ssa)) deallocate(subset%ssa) + if(allocated(subset%g )) deallocate(subset%g ) + err_message = subset%alloc_2str(n, nlay) + if(err_message /= "") return + call extract_subset(ncol, nlay, ngpt, full%tau, start, start+n-1, subset%tau) + call extract_subset(ncol, nlay, ngpt, full%ssa, start, start+n-1, subset%ssa) + subset%g (1:n,:,:) = full%p(1,start:start+n-1,:,:) + class is (ty_optical_props_nstr) + if(allocated(subset%ssa)) deallocate(subset%ssa) + if(allocated(subset%p )) deallocate(subset%p ) + err_message = subset%alloc_nstr(nmom, n, nlay) + if(err_message /= "") return + call extract_subset( ncol, nlay, ngpt, full%tau, start, start+n-1, subset%tau) + call extract_subset( ncol, nlay, ngpt, full%ssa, start, start+n-1, subset%ssa) + call extract_subset(nmom, ncol, nlay, ngpt, full%p , start, start+n-1, subset%p ) + end select + end function subset_nstr_range + + !> ------------------------------------------------------------------------------------------ + !> + !> Routines for array classes: incrementing + !> a%increment(b) adds the values of a to b, changing b and leaving a untouched + !> + !> ----------------------------------------------------------------------------------------- + function increment(op_in, op_io) result(err_message) + class(ty_optical_props_arry), intent(in ) :: op_in + class(ty_optical_props_arry), intent(inout) :: op_io + character(128) :: err_message + ! ----- + integer :: ncol, nlay, ngpt + ! ----- + err_message = "" + if(.not. op_in%is_initialized()) & + err_message = "ty_optical_props%increment: Incrementing optical properties aren't initialized" + if(.not. op_in%is_initialized()) & + err_message = "ty_optical_props%increment: optical properties to be incremented aren't initialized" + if(err_message /= "") return + + ncol = op_io%get_ncol() + nlay = op_io%get_nlay() + ngpt = op_io%get_ngpt() + if(.not. op_in%bands_are_equal(op_io)) & + err_message = "ty_optical_props%increment: optical properties objects have different band structures" + if(.not. all([op_in%get_ncol(), op_in%get_nlay()] == [ncol, nlay])) & + err_message = "ty_optical_props%increment: optical properties objects have different ncol and/or nlay" + if(err_message /= "") return + + if(op_in%gpoints_are_equal(op_io)) then + ! + ! Increment by gpoint + ! (or by band if both op_in and op_io are defined that way) + ! + select type (op_io) + class is (ty_optical_props_1scl) + select type (op_in) + class is (ty_optical_props_1scl) + call increment_1scalar_by_1scalar(ncol, nlay, ngpt, & + op_io%tau, & + op_in%tau) + class is (ty_optical_props_2str) + call increment_1scalar_by_2stream(ncol, nlay, ngpt, & + op_io%tau, & + op_in%tau, op_in%ssa) + + class is (ty_optical_props_nstr) + call increment_1scalar_by_nstream(ncol, nlay, ngpt, & + op_io%tau, & + op_in%tau, op_in%ssa) + end select + class is (ty_optical_props_2str) + select type (op_in) + class is (ty_optical_props_1scl) + call increment_2stream_by_1scalar(ncol, nlay, ngpt, & + op_io%tau, op_io%ssa,& + op_in%tau) + class is (ty_optical_props_2str) + call increment_2stream_by_2stream(ncol, nlay, ngpt, & + op_io%tau, op_io%ssa, op_io%g, & + op_in%tau, op_in%ssa, op_in%g) + class is (ty_optical_props_nstr) + call increment_2stream_by_nstream(ncol, nlay, ngpt, op_in%get_nmom(), & + op_io%tau, op_io%ssa, op_io%g, & + op_in%tau, op_in%ssa, op_in%p) + end select + + class is (ty_optical_props_nstr) + select type (op_in) + class is (ty_optical_props_1scl) + call increment_nstream_by_1scalar(ncol, nlay, ngpt, & + op_io%tau, op_io%ssa, & + op_in%tau) + class is (ty_optical_props_2str) + call increment_nstream_by_2stream(ncol, nlay, ngpt, op_io%get_nmom(), & + op_io%tau, op_io%ssa, op_io%p, & + op_in%tau, op_in%ssa, op_in%g) + class is (ty_optical_props_nstr) + call increment_nstream_by_nstream(ncol, nlay, ngpt, op_io%get_nmom(), op_in%get_nmom(), & + op_io%tau, op_io%ssa, op_io%p, & + op_in%tau, op_in%ssa, op_in%p) + end select + end select + else + ! + ! Values defined by-band will have ngpt() = nband() + ! We can use values by band in op_in to increment op_io + ! Anything else is an error + ! + if(op_in%get_ngpt() /= op_io%get_nband()) then + err_message = "ty_optical_props%increment: optical properties objects have incompatible g-point structures" + return + end if + ! + ! Increment by band + ! + select type (op_io) + class is (ty_optical_props_1scl) + select type (op_in) + class is (ty_optical_props_1scl) + call inc_1scalar_by_1scalar_bybnd(ncol, nlay, ngpt, & + op_io%tau, & + op_in%tau, & + op_io%get_nband(), op_io%get_band_lims_gpoint()) + class is (ty_optical_props_2str) + call inc_1scalar_by_2stream_bybnd(ncol, nlay, ngpt, & + op_io%tau, & + op_in%tau, op_in%ssa, & + op_io%get_nband(), op_io%get_band_lims_gpoint()) + class is (ty_optical_props_nstr) + call inc_1scalar_by_nstream_bybnd(ncol, nlay, ngpt, & + op_io%tau, & + op_in%tau, op_in%ssa, & + op_io%get_nband(), op_io%get_band_lims_gpoint()) + end select + + class is (ty_optical_props_2str) + select type (op_in) + class is (ty_optical_props_1scl) + call inc_2stream_by_1scalar_bybnd(ncol, nlay, ngpt, & + op_io%tau, op_io%ssa, & + op_in%tau, & + op_io%get_nband(), op_io%get_band_lims_gpoint()) + class is (ty_optical_props_2str) + call inc_2stream_by_2stream_bybnd(ncol, nlay, ngpt, & + op_io%tau, op_io%ssa, op_io%g, & + op_in%tau, op_in%ssa, op_in%g, & + op_io%get_nband(), op_io%get_band_lims_gpoint()) + class is (ty_optical_props_nstr) + call inc_2stream_by_nstream_bybnd(ncol, nlay, ngpt, op_in%get_nmom(), & + op_io%tau, op_io%ssa, op_io%g, & + op_in%tau, op_in%ssa, op_in%p, & + op_io%get_nband(), op_io%get_band_lims_gpoint()) + end select + + class is (ty_optical_props_nstr) + select type (op_in) + class is (ty_optical_props_1scl) + call inc_nstream_by_1scalar_bybnd(ncol, nlay, ngpt, & + op_io%tau, op_io%ssa, & + op_in%tau, & + op_io%get_nband(), op_io%get_band_lims_gpoint()) + class is (ty_optical_props_2str) + call inc_nstream_by_2stream_bybnd(ncol, nlay, ngpt, op_io%get_nmom(), & + op_io%tau, op_io%ssa, op_io%p, & + op_in%tau, op_in%ssa, op_in%g, & + op_io%get_nband(), op_io%get_band_lims_gpoint()) + class is (ty_optical_props_nstr) + call inc_nstream_by_nstream_bybnd(ncol, nlay, ngpt, op_io%get_nmom(), op_in%get_nmom(), & + op_io%tau, op_io%ssa, op_io%p, & + op_in%tau, op_in%ssa, op_in%p, & + op_io%get_nband(), op_io%get_band_lims_gpoint()) + end select + end select + end if + end function increment + !> ----------------------------------------------------------------------------------------------- + !> + !> Routines for array classes: problem sizes + !> + !> ----------------------------------------------------------------------------------------------- + pure function get_arry_extent(this, dim) + class(ty_optical_props_arry), intent(in ) :: this + integer, intent(in ) :: dim + integer :: get_arry_extent + + if(allocated(this%tau)) then + get_arry_extent = size(this%tau, dim) + else + get_arry_extent = 0 + end if + end function get_arry_extent + ! ------------------------------------------------------------------------------------------ + pure function get_ncol(this) + class(ty_optical_props_arry), intent(in ) :: this + integer :: get_ncol + + get_ncol = get_arry_extent(this, 1) + end function get_ncol + ! ------------------------------------------------------------------------------------------ + pure function get_nlay(this) + class(ty_optical_props_arry), intent(in ) :: this + integer :: get_nlay + + get_nlay = get_arry_extent(this, 2) + end function get_nlay + ! ------------------------------------------------------------------------------------------ + pure function get_nmom(this) + class(ty_optical_props_nstr), intent(in ) :: this + integer :: get_nmom + + if(allocated(this%p)) then + get_nmom = size(this%p, 1) + else + get_nmom = 0 + end if + end function get_nmom + ! ----------------------------------------------------------------------------------------------- + ! + ! Routines for base class: spectral discretization + ! + !> ----------------------------------------------------------------------------------------------- + !> + !> Number of bands + !> + pure function get_nband(this) + class(ty_optical_props), intent(in) :: this + integer :: get_nband + + if(this%is_initialized()) then + get_nband = size(this%band2gpt,dim=2) + else + get_nband = 0 + end if + end function get_nband + !> ----------------------------------------------------------------------------------------------- + !> + !> Number of g-points + !> + pure function get_ngpt(this) + class(ty_optical_props), intent(in) :: this + integer :: get_ngpt + + if(this%is_initialized()) then + get_ngpt = maxval(this%band2gpt) + else + get_ngpt = 0 + end if + end function get_ngpt + !>-------------------------------------------------------------------------------------------------------------------- + !> + !> The first and last g-point of all bands at once + !> dimension (2, nbands) + !> + pure function get_band_lims_gpoint(this) + class(ty_optical_props), intent(in) :: this + integer, dimension(size(this%band2gpt,dim=1), size(this%band2gpt,dim=2)) & + :: get_band_lims_gpoint + + get_band_lims_gpoint = this%band2gpt + end function get_band_lims_gpoint + !>-------------------------------------------------------------------------------------------------------------------- + !> + !> First and last g-point of a specific band + !> + pure function convert_band2gpt(this, band) + class(ty_optical_props), intent(in) :: this + integer, intent(in) :: band + integer, dimension(2) :: convert_band2gpt + + if(this%is_initialized()) then + convert_band2gpt(:) = this%band2gpt(:,band) + else + convert_band2gpt(:) = 0 + end if + end function convert_band2gpt + !>-------------------------------------------------------------------------------------------------------------------- + !> + !> Lower and upper wavenumber of all bands + !> (upper and lower wavenumber by band) = band_lims_wvn(2,band) + !> + pure function get_band_lims_wavenumber(this) + class(ty_optical_props), intent(in) :: this + real(wp), dimension(size(this%band_lims_wvn,1), size(this%band_lims_wvn,2)) & + :: get_band_lims_wavenumber + + if(this%is_initialized()) then + get_band_lims_wavenumber(:,:) = this%band_lims_wvn(:,:) + else + get_band_lims_wavenumber(:,:) = 0._wp + end if + end function get_band_lims_wavenumber + !>-------------------------------------------------------------------------------------------------------------------- + !> + !> Lower and upper wavelength of all bands + !> + pure function get_band_lims_wavelength(this) + class(ty_optical_props), intent(in) :: this + real(wp), dimension(size(this%band_lims_wvn,1), size(this%band_lims_wvn,2)) & + :: get_band_lims_wavelength + + if(this%is_initialized()) then + get_band_lims_wavelength(:,:) = 1._wp/this%band_lims_wvn(:,:) + else + get_band_lims_wavelength(:,:) = 0._wp + end if + end function get_band_lims_wavelength + !>-------------------------------------------------------------------------------------------------------------------- + !> Bands for all the g-points at once + !> dimension (ngpt) + !> + pure function get_gpoint_bands(this) + class(ty_optical_props), intent(in) :: this + integer, dimension(size(this%gpt2band,dim=1)) & + :: get_gpoint_bands + + if(this%is_initialized()) then + get_gpoint_bands(:) = this%gpt2band(:) + else + get_gpoint_bands(:) = 0 + end if + end function get_gpoint_bands + !>-------------------------------------------------------------------------------------------------------------------- + !> + !> Band associated with a specific g-point + !> + pure function convert_gpt2band(this, gpt) + class(ty_optical_props), intent(in) :: this + integer, intent(in) :: gpt + integer :: convert_gpt2band + + if(this%is_initialized()) then + convert_gpt2band = this%gpt2band(gpt) + else + convert_gpt2band = 0 + end if + end function convert_gpt2band + !>-------------------------------------------------------------------------------------------------------------------- + !> + !> Expand an array of dimension arr_in(nband) to dimension arr_out(ngpt) + !> + pure function expand(this, arr_in) result(arr_out) + class(ty_optical_props), intent(in) :: this + real(wp), dimension(:), intent(in) :: arr_in ! (nband) + real(wp), dimension(size(this%gpt2band)) :: arr_out + + integer :: iband + + do iband=1,this%get_nband() + arr_out(this%band2gpt(1,iband):this%band2gpt(2,iband)) = arr_in(iband) + end do + end function expand + !>-------------------------------------------------------------------------------------------------------------------- + !> + !> Are the bands of two objects the same? (same number, same wavelength limits) + !> + pure function bands_are_equal(this, that) + class(ty_optical_props), intent(in) :: this, that + logical :: bands_are_equal + + bands_are_equal = this%get_nband() == that%get_nband() .and. & + this%get_nband() > 0 + if(.not. bands_are_equal) return + bands_are_equal = & + all(abs(this%get_band_lims_wavenumber() - that%get_band_lims_wavenumber()) < & + 5._wp * spacing(this%get_band_lims_wavenumber())) + end function bands_are_equal + !>-------------------------------------------------------------------------------------------------------------------- + !> + !> Is the g-point structure of two objects the same? + !> (same bands, same number of g-points, same mapping between bands and g-points) + !> + pure function gpoints_are_equal(this, that) + class(ty_optical_props), intent(in) :: this, that + logical :: gpoints_are_equal + + gpoints_are_equal = this%bands_are_equal(that) .and. & + this%get_ngpt() == that%get_ngpt() + if(.not. gpoints_are_equal) return + gpoints_are_equal = & + all(this%get_gpoint_bands() == that%get_gpoint_bands()) + end function gpoints_are_equal + !> ----------------------------------------------------------------------------------------------- + !> + !> --- Setting/getting the name + !> + !> ----------------------------------------------------------------------------------------------- + subroutine set_name(this, name) + class(ty_optical_props), intent(inout) :: this + character(len=*), intent(in ) :: name + + this%name = trim(name) + end subroutine set_name + ! -------------------------------------------------------- + function get_name(this) + class(ty_optical_props), intent(in ) :: this + character(len=name_len) :: get_name + + get_name = trim(this%name) + end function get_name + ! ------------------------------------------------------------------------------------------ + +end module mo_optical_props diff --git a/src/radiate/rte-rrtmgp/rte/mo_rte_config.F90 b/src/radiate/rte-rrtmgp/rte/mo_rte_config.F90 new file mode 100644 index 0000000..4b7a17f --- /dev/null +++ b/src/radiate/rte-rrtmgp/rte/mo_rte_config.F90 @@ -0,0 +1,51 @@ +! This code is part of RRTM for GCM Applications - Parallel (RRTMGP) +! +! Contacts: Robert Pincus and Eli Mlawer +! email: rrtmgp@aer.com +! +! Copyright 2020- Atmospheric and Environmental Research, +! Regents of the University of Colorado, +! Trustees of Columbia University in the City of New York +! All right reserved. +! +! Use and duplication is permitted under the terms of the +! BSD 3-clause license, see http://opensource.org/licenses/BSD-3-Clause + +!> ------------------------------------------------------------------------------------------------- +!> +!> ## Control input sanitization in Fortan front-end +!> Provides public access to two proteced module variables +!> +!> ------------------------------------------------------------------------------------------------- +module mo_rte_config + use mo_rte_kind, only: wl + implicit none + private + + logical(wl), protected, public :: check_extents = .true. + logical(wl), protected, public :: check_values = .true. + + !> Specify checking of extents and values individually, or all checks together + interface rte_config_checks + module procedure rte_config_checks_each, rte_config_checks_all + end interface + public :: rte_config_checks +contains + ! -------------------------------------------------------------- + !> Do extents and/or values checks within RTE+RRTMGP Fortran classes + subroutine rte_config_checks_each(extents, values) + logical(wl), intent(in) :: extents, values + + check_extents = extents + check_values = values + end subroutine rte_config_checks_each + ! -------------------------------------------------------------- + !> Do all checks within RTE+RRTMGP Fortran classes + subroutine rte_config_checks_all(do_checks) + logical(wl), intent(in) :: do_checks + + check_extents = do_checks + check_values = do_checks + end subroutine rte_config_checks_all + ! -------------------------------------------------------------- +end module mo_rte_config diff --git a/src/radiate/rte-rrtmgp/rte/mo_rte_kind.F90 b/src/radiate/rte-rrtmgp/rte/mo_rte_kind.F90 new file mode 100644 index 0000000..b8edbf5 --- /dev/null +++ b/src/radiate/rte-rrtmgp/rte/mo_rte_kind.F90 @@ -0,0 +1,54 @@ +! This code is part of Radiative Transfer for Energetics (RTE) +! +! Contacts: Robert Pincus and Eli Mlawer +! email: rrtmgp@aer.com +! +! Copyright 2015- Atmospheric and Environmental Research, +! Regents of the University of Colorado, +! Trustees of Columbia University in the City of New York +! All right reserved. +! +! Use and duplication is permitted under the terms of the +! BSD 3-clause license, see http://opensource.org/licenses/BSD-3-Clause +! ------------------------------------------------------------------------------------------------- +!> +!> ## Provide the Fortran KIND parameters for REAL and INTEGER variables. +!> By default kind parameters come from the ISO C binding and use double precision for working. +! +! If the host model in which RRTGMP is embedded has defined these constants elsewhere +! the model definitions can be used instead by renaming. For example, +! use mo_model_kind, only wp => dp, ... +! where the syntax is local_name => original_name +! and all the local names need to be defined + +module mo_rte_kind + use, intrinsic :: iso_c_binding, only: c_float, c_double, c_long, c_int, c_bool + implicit none + public + integer, parameter :: dp = c_double, sp = c_float, i8 = c_long, i4 = c_int + ! + ! Floating point working precision + ! +!#ifdef RTE_USE_SP +! integer, parameter :: wp = sp +!#else +! integer, parameter :: wp = dp +!#endif + +#ifdef RAMS_DOUBLE_PREC + integer, parameter :: wp = dp +#else + integer, parameter :: wp = sp +#endif + ! + ! Logical - for use with kernels + ! + ! Note that c_boolians don't work with PGI compiler currently + ! +#ifdef RTE_USE_CBOOL + integer, parameter :: wl = c_bool +#else + integer, parameter :: wl = kind(.true.) +#endif + +end module mo_rte_kind diff --git a/src/radiate/rte-rrtmgp/rte/mo_rte_lw.F90 b/src/radiate/rte-rrtmgp/rte/mo_rte_lw.F90 new file mode 100644 index 0000000..a13dfc0 --- /dev/null +++ b/src/radiate/rte-rrtmgp/rte/mo_rte_lw.F90 @@ -0,0 +1,495 @@ +! This code is part of Radiative Transfer for Energetics (RTE) +! +! Contacts: Robert Pincus and Eli Mlawer +! email: rrtmgp@aer.com +! +! Copyright 2015- Atmospheric and Environmental Research, +! Regents of the University of Colorado, +! Trustees of Columbia University in the City of New York +! All right reserved. +! +! Use and duplication is permitted under the terms of the +! BSD 3-clause license, see http://opensource.org/licenses/BSD-3-Clause +! ------------------------------------------------------------------------------------------------- +! +!> Compute longwave radiative fluxes +!> +!> Contains a single routine to compute direct and diffuse fluxes of solar radiation given +!> +!> - atmospheric optical properties, spectrally-resolved via one of the sub-classes of +!> [[mo_optical_props(module):ty_optical_props_arry(type)]] in module [[mo_optical_props]] +! (ty_optical_props_arry in module mo_optical_props) +!> - information about vertical ordering +!> - internal Planck source functions, defined per g-point on the same spectral grid at the atmosphere, +!> via [[mo_source_functions(module):ty_source_func_lw(type)]] in module [[mo_source_functions]] +! (ty_source_func_lw in module mo_source_functions) +!> - boundary conditions: surface emissivity defined per band +!> - optionally, a boundary condition for incident diffuse radiation +!> - optionally, an integer number of angles at which to do Gaussian quadrature if scattering is neglected +!> +!> If optical properties are supplied via class ty_optical_props_1scl (absorption optical thickenss only) +!> ([[mo_optical_props(module):ty_optical_props_1scl(type)]] in module [[mo_optical_props]]) +!> then an emission/absorption solver is called. +!> If optical properties are supplied via class ty_optical_props_2str +!> ([[mo_optical_props(module):ty_optical_props_2str(type)]] in module [[mo_optical_props]]) +!> fluxes are computed via a rescaling by default or, optionally, using two-stream calculations and adding. +!> +!> Users must ensure that emissivity is on the same spectral grid as the optical properties. +!> +!> Final output is via user-extensible ty_fluxes +!> ([[mo_fluxes(module):ty_fluxes(type)]] in module [[mo_fluxes]]) +!> which must reduce the detailed spectral fluxes to whatever summary the user needs +! +!> The routine does error checking and choses which lower-level kernel to invoke based on +!> what kinds of optical properties are supplied +! +! ------------------------------------------------------------------------------------------------- +module mo_rte_lw + use mo_rte_kind, only: wp, wl + use mo_rte_config, only: check_extents, check_values + use mo_rte_util_array,only: any_vals_less_than, any_vals_outside, extents_are, zero_array + use mo_optical_props, only: ty_optical_props, & + ty_optical_props_arry, ty_optical_props_1scl, ty_optical_props_2str, ty_optical_props_nstr + use mo_source_functions, & + only: ty_source_func_lw + use mo_fluxes, only: ty_fluxes, ty_fluxes_broadband + use mo_rte_solver_kernels, & + only: lw_solver_noscat, lw_solver_2stream + implicit none + private + + public :: rte_lw +contains + ! -------------------------------------------------- + ! + ! Interface using only optical properties and source functions as inputs; fluxes as outputs. + ! + ! -------------------------------------------------- + function rte_lw(optical_props, top_at_1, & + sources, sfc_emis, & + fluxes, & + inc_flux, n_gauss_angles, use_2stream, & + lw_Ds, flux_up_Jac) result(error_msg) + class(ty_optical_props_arry), intent(in ) :: optical_props + !! Set of optical properties as one or more arrays + integer, intent(in ) :: top_at_1 + !! Is the top of the domain at index 1? (if not, ordering is bottom-to-top) + type(ty_source_func_lw), intent(in ) :: sources + !! Derived type with Planck source functions + real(wp), dimension(:,:), intent(in ) :: sfc_emis + !! emissivity at surface [] (nband, ncol) + class(ty_fluxes), intent(inout) :: fluxes + !! Dervied type for computing spectral integrals from g-point fluxes. + !! Default computes broadband fluxes at all levels if output arrays are defined. Can be extended per user desires. + real(wp), dimension(:,:), & + target, optional, intent(in ) :: inc_flux + !! incident flux at domain top [W/m2] (ncol, ngpts) + integer, optional, intent(in ) :: n_gauss_angles + !! Number of angles used in Gaussian quadrature (max 3, no-scattering solution) + logical, optional, intent(in ) :: use_2stream + !! When 2-stream parameters (tau/ssa/g) are provided, use 2-stream methods + !! Default is to use re-scaled longwave transport + real(wp), dimension(:,:), & + optional, intent(in ) :: lw_Ds + !! User-specifed 1/cos of transport angle per col, g-point + real(wp), dimension(:,:), target, & + optional, intent(inout) :: flux_up_Jac + !! surface temperature flux Jacobian [W/m2/K] (ncol, nlay+1) + character(len=128) :: error_msg + !! If empty, calculation was successful + ! -------------------------------- + ! + ! Local variables + ! + integer :: ncol, nlay, ngpt, nband + integer :: icol, ilev, igpt, imu + integer :: n_quad_angs + integer :: using_2stream, do_Jacobians, do_broadband + real(wp), dimension(:,:), allocatable :: sfc_emis_gpt + real(wp), dimension(:,:,:), allocatable :: secants + real(wp), dimension(:,:), pointer :: jacobian + real(wp), dimension(optical_props%get_ncol(), & + optical_props%get_nlay()+1), target & + :: decoy2D ! Used for optional outputs - needs to be full size. + ! Memory needs to be allocated for the full g-point fluxes even if they aren't + ! used later because a) the GPU kernels use this memory to work in parallel and + ! b) the fluxes are intent(out) in the solvers + ! Shortwave solver takes a different approach since three fields are needed + real(wp), dimension(optical_props%get_ncol(), & + optical_props%get_nlay()+1, & + optical_props%get_ngpt()) & + :: gpt_flux_up, gpt_flux_dn + real(wp), dimension(:,:), pointer :: flux_dn_loc, flux_up_loc + real(wp), dimension(:,:), pointer :: inc_flux_diffuse + ! -------------------------------------------------- + ! + ! Weights and angle secants for first order (k=1) Gaussian quadrature. + ! Values from Table 2, Clough et al, 1992, doi:10.1029/92JD01419 + ! after Abramowitz & Stegun 1972, page 921 + ! + integer, parameter :: max_gauss_pts = 4 + real(wp), parameter, & + dimension(max_gauss_pts, max_gauss_pts) :: & + gauss_Ds = RESHAPE([1.66_wp, 0._wp, 0._wp, 0._wp, & ! Diffusivity angle, not Gaussian angle + 1.18350343_wp, 2.81649655_wp, 0._wp, 0._wp, & + 1.09719858_wp, 1.69338507_wp, 4.70941630_wp, 0._wp, & + 1.06056257_wp, 1.38282560_wp, 2.40148179_wp, 7.15513024_wp], & + [max_gauss_pts, max_gauss_pts]), & + gauss_wts = RESHAPE([0.5_wp, 0._wp, 0._wp, 0._wp, & + 0.3180413817_wp, 0.1819586183_wp, 0._wp, 0._wp, & + 0.2009319137_wp, 0.2292411064_wp, 0.0698269799_wp, 0._wp, & + 0.1355069134_wp, 0.2034645680_wp, 0.1298475476_wp, 0.0311809710_wp], & + [max_gauss_pts, max_gauss_pts]) + ! ------------------------------------------------------------------------------------ + ncol = optical_props%get_ncol() + nlay = optical_props%get_nlay() + ngpt = optical_props%get_ngpt() + nband = optical_props%get_nband() + if (present(flux_up_Jac)) then + do_Jacobians = 1 + else + do_Jacobians = 0 + endif + !do_Jacobians = present(flux_up_Jac) + error_msg = "" + + ! ------------------------------------------------------------------------------------ + ! + ! Error checking -- input consistency of sizes and validity of values + + if(.not. fluxes%are_desired()) & + error_msg = "rte_lw: no space allocated for fluxes" + + if (do_Jacobians==1 .and. check_extents) then + if( .not. extents_are(flux_up_Jac, ncol, nlay+1)) & + error_msg = "rte_lw: flux Jacobian inconsistently sized" + endif + + if (check_extents) then + ! + ! Source functions + ! + if(any([sources%get_ncol(), sources%get_nlay(), sources%get_ngpt()] /= [ncol, nlay, ngpt])) & + error_msg = "rte_lw: sources and optical properties inconsistently sized" + ! + ! Surface emissivity + ! + if(.not. extents_are(sfc_emis, nband, ncol)) & + error_msg = "rte_lw: sfc_emis inconsistently sized" + ! + ! Incident flux, if present + ! + if(present(inc_flux)) then + if(.not. extents_are(inc_flux, ncol, ngpt)) & + error_msg = "rte_lw: inc_flux inconsistently sized" + end if + if (present(lw_Ds)) then + if(.not. extents_are(lw_Ds, ncol, ngpt)) & + error_msg = "rte_lw: lw_Ds inconsistently sized" + end if + end if + + if(check_values) then + if(any_vals_outside(sfc_emis, 0._wp, 1._wp)) & + error_msg = "rte_lw: sfc_emis has values < 0 or > 1" + + if(present(inc_flux)) then + if(any_vals_less_than(inc_flux, 0._wp)) & + error_msg = "rte_lw: inc_flux has values < 0" + end if + + if (present(lw_Ds)) then + if(any_vals_less_than(lw_Ds, 1._wp)) & + error_msg = "rte_lw: one or more values of lw_Ds < 1." + end if + + if(present(n_gauss_angles)) then + if(n_gauss_angles > max_gauss_pts) & + error_msg = "rte_lw: asking for too many quadrature points for no-scattering calculation" + if(n_gauss_angles < 1) & + error_msg = "rte_lw: have to ask for at least one quadrature point for no-scattering calculation" + end if + end if + if(len_trim(error_msg) > 0) return + + ! + ! Number of quadrature points for no-scattering calculation + ! + n_quad_angs = 1 + if(present(n_gauss_angles)) n_quad_angs = n_gauss_angles + ! + ! Optionally - use 2-stream methods when low-order scattering properties are provided? + ! + using_2stream = 0! .false. + if(present(use_2stream)) then + if(use_2stream) using_2stream=1 + endif + + ! + ! Checking that optional arguments are consistent with one another and with optical properties + ! + select type (optical_props) + class is (ty_optical_props_1scl) + if (using_2stream==1) & + error_msg = "rte_lw: can't use two-stream methods with only absorption optical depth" + if(present(lw_Ds) .and. n_quad_angs /= 1) & + error_msg = "rte_lw: providing lw_Ds incompatible with specifying n_gauss_angles" + class is (ty_optical_props_2str) + if (present(lw_Ds)) & + error_msg = "rte_lw: lw_Ds not valid when providing scattering optical properties" + if (using_2stream==1 .and. n_quad_angs /= 1) & + error_msg = "rte_lw: using_2stream=true incompatible with specifying n_gauss_angles" + if (using_2stream==1 .and. do_Jacobians==1) & + error_msg = "rte_lw: can't provide Jacobian of fluxes w.r.t surface temperature with 2-stream" + class default + error_msg = "rte_lw: lw_solver(...ty_optical_props_nstr...) not yet implemented" + end select + + if(len_trim(error_msg) > 0) then + if(len_trim(optical_props%get_name()) > 0) & + error_msg = trim(optical_props%get_name()) // ': ' // trim(error_msg) + return + end if + + ! ------------------------------------------------------------------------------------ + ! Boundary conditions + ! Lower boundary condition -- expand surface emissivity by band to gpoints + ! + allocate(sfc_emis_gpt(ncol, ngpt)) + + ! Upper boundary condition - use values in optional arg or be set to 0 + ! + if (present(inc_flux)) then + inc_flux_diffuse => inc_flux + !$acc enter data copyin( inc_flux_diffuse) + !$omp target enter data map(to: inc_flux_diffuse) + else + allocate(inc_flux_diffuse(ncol, ngpt)) + !$acc enter data create( inc_flux_diffuse) + !$omp target enter data map(alloc:inc_flux_diffuse) + call zero_array(ncol, ngpt, inc_flux_diffuse) + end if + + ! ------------------------------------------------------------------------------------ + if(do_Jacobians==1) then + jacobian => flux_up_Jac + else + jacobian => decoy2D + end if + + select type(fluxes) + ! + ! Broadband fluxes are treated as a special case within the solvers; memory + ! for both up and down fluxes needs to be available even if the user doesn't + ! want one of them + ! + type is (ty_fluxes_broadband) + do_broadband = 1!.true._wl + ! + ! Broadband fluxes class has three possible outputs; allocate memory for local use + ! if one or more haven't been requested + ! + if(associated(fluxes%flux_up)) then + flux_up_loc => fluxes%flux_up + else + allocate(flux_up_loc(ncol, nlay+1)) + end if + if(associated(fluxes%flux_dn)) then + flux_dn_loc => fluxes%flux_dn + else + allocate(flux_dn_loc(ncol, nlay+1)) + end if + !$acc enter data create( flux_up_loc, flux_dn_loc) + !$omp target enter data map(alloc:flux_up_loc, flux_dn_loc) + class default + ! + ! If broadband integrals aren't being computed, allocate working space + ! and decoy addresses for spectrally-integrated fields + ! + do_broadband = 0!.false._wl + flux_up_loc => decoy2D + flux_dn_loc => decoy2D + end select + + ! + ! Compute the radiative transfer... + ! + !$acc data create( sfc_emis_gpt, flux_up_loc, flux_dn_loc, gpt_flux_up, gpt_flux_dn) + !$omp target data map(alloc:sfc_emis_gpt, flux_up_loc, flux_dn_loc, gpt_flux_up, gpt_flux_dn) + call expand_and_transpose(optical_props, sfc_emis, sfc_emis_gpt) + if(check_values) error_msg = optical_props%validate() + if(len_trim(error_msg) == 0) then ! Can't do an early return within OpenACC/MP data regions + select type (optical_props) + class is (ty_optical_props_1scl) + ! + ! No scattering two-stream calculation + ! + ! + ! Secant of radiation angle - either user-supplied, one per g-point, or + ! taken from first-order Gaussian quadrate and applied to all columns a g-points + ! + allocate(secants(ncol, ngpt, n_quad_angs)) + !$acc data create( secants) + !$omp target data map(alloc:secants) + if (present(lw_Ds)) then + !$acc parallel loop collapse(2) copyin(lw_Ds) + !$omp target teams distribute parallel do simd collapse(2) + ! nmu is 1 + do igpt = 1, ngpt + do icol = 1, ncol + secants(icol,igpt,1) = lw_Ds(icol,igpt) + end do + end do + else + ! + ! Is there an alternative to making ncol x ngpt copies of each value? + ! + !$acc parallel loop collapse(3) + !$omp target teams distribute parallel do simd collapse(3) + do imu = 1, n_quad_angs + do igpt = 1, ngpt + do icol = 1, ncol + secants(icol,igpt,imu) = gauss_Ds(imu,n_quad_angs) + end do + end do + end do + end if + call lw_solver_noscat(ncol, nlay, ngpt, & + top_at_1, n_quad_angs, & + secants, gauss_wts(1:n_quad_angs,n_quad_angs), & + optical_props%tau, & + sources%lay_source, sources%lev_source_inc, & + sources%lev_source_dec, & + sfc_emis_gpt, sources%sfc_source, & + inc_flux_diffuse, & + gpt_flux_up, gpt_flux_dn, & + do_broadband, flux_up_loc, flux_dn_loc, & + do_Jacobians, sources%sfc_source_Jac, jacobian, & + 0, optical_props%tau, optical_props%tau) + ! The last two arguments won't be used since the + ! third-to-last is .false. but need valid addresses + !$acc end data + !$omp end target data + class is (ty_optical_props_2str) + if (using_2stream==1) then + ! + ! two-stream calculation with scattering + ! + call lw_solver_2stream(ncol, nlay, ngpt, top_at_1, & + optical_props%tau, optical_props%ssa, optical_props%g, & + sources%lay_source, sources%lev_source_inc, sources%lev_source_dec, & + sfc_emis_gpt, sources%sfc_source, & + inc_flux_diffuse, & + gpt_flux_up, gpt_flux_dn) + else + allocate(secants(ncol, ngpt, n_quad_angs)) + !$acc data create( secants) + !$omp target data map(alloc:secants) + !$acc parallel loop collapse(3) + !$omp target teams distribute parallel do simd collapse(3) + do imu = 1, n_quad_angs + do igpt = 1, ngpt + do icol = 1, ncol + secants(icol,igpt,imu) = gauss_Ds(imu,n_quad_angs) + end do + end do + end do + ! + ! Re-scaled solution to account for scattering + ! + call lw_solver_noscat(ncol, nlay, ngpt, & + top_at_1, n_quad_angs, & + secants, gauss_wts(1:n_quad_angs,n_quad_angs), & + optical_props%tau, & + sources%lay_source, sources%lev_source_inc, & + sources%lev_source_dec, & + sfc_emis_gpt, sources%sfc_source, & + inc_flux_diffuse, & + gpt_flux_up, gpt_flux_dn, & + do_broadband, flux_up_loc, flux_dn_loc, & + do_Jacobians, sources%sfc_source_Jac, jacobian, & + 1, optical_props%ssa, optical_props%g) + !$acc end data + !$omp end target data + endif + class is (ty_optical_props_nstr) + ! + ! n-stream calculation + ! + error_msg = 'lw_solver(...ty_optical_props_nstr...) not yet implemented' + end select + + select type(fluxes) + ! + ! Tidy up memory for broadband fluxes on GPUs + ! + type is (ty_fluxes_broadband) + if(associated(fluxes%flux_net)) then + ! + ! FIXME: Do we need the create/copyout here? + ! +#ifdef _CRAYFTN + !$acc parallel loop collapse(2) copyout( fluxes%flux_net) !! Avoids internal compiler error +#else + !$acc parallel loop collapse(2) copyin(fluxes) copyout( fluxes%flux_net) +#endif + !$omp target teams distribute parallel do simd collapse(2) map(from:fluxes%flux_net) + do ilev = 1, nlay+1 + do icol = 1, ncol + fluxes%flux_net(icol,ilev) = flux_dn_loc(icol,ilev) - flux_up_loc(icol,ilev) + end do + end do + end if + class default + ! + ! ...or reduce spectral fluxes to desired output quantities + ! + error_msg = fluxes%reduce(gpt_flux_up, gpt_flux_dn, optical_props, top_at_1) + end select + end if ! no error message from validation + !$acc end data + !$omp end target data + + if(.not. present(inc_flux)) then + !$acc exit data delete( inc_flux_diffuse) + !$omp target exit data map(release:inc_flux_diffuse) + deallocate(inc_flux_diffuse) + end if + select type(fluxes) + type is (ty_fluxes_broadband) + !$acc exit data copyout( flux_up_loc, flux_dn_loc) + !$omp target exit data map(from:flux_up_loc, flux_dn_loc) + if(.not. associated(flux_up_loc, fluxes%flux_up)) deallocate(flux_up_loc) + if(.not. associated(flux_dn_loc, fluxes%flux_dn)) deallocate(flux_dn_loc) + end select + end function rte_lw + !-------------------------------------------------------------------------------------------------------------------- + ! + ! Expand from band to g-point dimension, transpose dimensions (nband, ncol) -> (ncol,ngpt) + ! + subroutine expand_and_transpose(ops,arr_in,arr_out) + class(ty_optical_props), intent(in ) :: ops + real(wp), dimension(:,:), intent(in ) :: arr_in ! (nband, ncol) + real(wp), dimension(:,:), intent(out) :: arr_out ! (ncol, igpt) + ! ------------- + integer :: ncol, nband, ngpt + integer :: icol, iband, igpt + integer, dimension(2,ops%get_nband()) :: limits + + ncol = size(arr_in, 2) + nband = ops%get_nband() + ngpt = ops%get_ngpt() + limits = ops%get_band_lims_gpoint() + !$acc parallel loop collapse(2) copyin(arr_in, limits) + !$omp target teams distribute parallel do simd collapse(2) map(to:arr_in, limits) + do iband = 1, nband + do icol = 1, ncol + do igpt = limits(1, iband), limits(2, iband) + arr_out(icol, igpt) = arr_in(iband,icol) + end do + end do + end do + + end subroutine expand_and_transpose + !-------------------------------------------------------------------------------------------------------------------- +end module mo_rte_lw diff --git a/src/radiate/rte-rrtmgp/rte/mo_rte_sw.F90 b/src/radiate/rte-rrtmgp/rte/mo_rte_sw.F90 new file mode 100644 index 0000000..f04a203 --- /dev/null +++ b/src/radiate/rte-rrtmgp/rte/mo_rte_sw.F90 @@ -0,0 +1,417 @@ +! This code is part of Radiative Transfer for Energetics (RTE) +! +! Contacts: Robert Pincus and Eli Mlawer +! email: rrtmgp@aer.com +! +! Copyright 2015-, Atmospheric and Environmental Research, +! Regents of the University of Colorado, Trustees of Columbia University. All right reserved. +! +! Use and duplication is permitted under the terms of the +! BSD 3-clause license, see http://opensource.org/licenses/BSD-3-Clause +! ------------------------------------------------------------------------------------------------- +! +!> Compute shortwave radiative fluxes + +!> Contains a single routine to compute direct and diffuse fluxes of solar radiation given +!> +!> - atmospheric optical properties on a spectral grid +!> - information about vertical ordering +!> - boundary conditions +!> - solar zenith angle, spectrally-resolved incident colimated flux, surface albedos for direct and diffuse radiation +!> - optionally, a boundary condition for incident diffuse radiation +!> +!> It is the user's responsibility to ensure that boundary conditions (incident fluxes, surface albedos) are on the same +!> spectral grid as the optical properties. +!> +!> Final output is via user-extensible ty_fluxes +!> ([[mo_fluxes(module):ty_fluxes(type)]] in module [[mo_fluxes]]) +!> which must reduce the detailed spectral fluxes to whatever summary the user needs +!> +!> +!> The routine does error checking and choses which lower-level kernel to invoke based on +!> what kinds of optical properties are supplied +! +! ------------------------------------------------------------------------------------------------- +module mo_rte_sw + use mo_rte_kind, only: wp, wl + use mo_rte_config, only: check_extents, check_values + use mo_rte_util_array,only: any_vals_less_than, any_vals_outside, extents_are, zero_array + use mo_optical_props, only: ty_optical_props, & + ty_optical_props_arry, ty_optical_props_1scl, ty_optical_props_2str, ty_optical_props_nstr + use mo_fluxes, only: ty_fluxes, ty_fluxes_broadband + use mo_rte_solver_kernels, & + only: sw_solver_noscat, sw_solver_2stream + implicit none + private + + interface rte_sw + module procedure rte_sw_mu0_bycol, rte_sw_mu0_full + end interface rte_sw + public :: rte_sw + +contains + ! ------------------------------------------------------------------------------------------------- + function rte_sw_mu0_bycol(atmos, top_at_1, & + mu0, inc_flux, & + sfc_alb_dir, sfc_alb_dif, & + fluxes, inc_flux_dif) result(error_msg) + class(ty_optical_props_arry), intent(in ) :: atmos + !! Optical properties provided as arrays + integer, intent(in ) :: top_at_1 + !! Is the top of the domain at index 1? (if not, ordering is bottom-to-top) + real(wp), dimension(:), intent(in ) :: mu0 + !! cosine of solar zenith angle (ncol) - will be assumed constant with height + real(wp), dimension(:,:), intent(in ) :: inc_flux + !! incident flux at top of domain [W/m2] (ncol, ngpt) + real(wp), dimension(:,:), intent(in ) :: sfc_alb_dir + !! surface albedo for direct and + real(wp), dimension(:,:), intent(in ) :: sfc_alb_dif + !! diffuse radiation (nband, ncol) + class(ty_fluxes), intent(inout) :: fluxes + !! Class describing output calculations + real(wp), dimension(:,:), optional, target, & + intent(in ) :: inc_flux_dif + !! incident diffuse flux at top of domain [W/m2] (ncol, ngpt) + character(len=128) :: error_msg + !! If empty, calculation was successful + ! -------------------------------- + real(wp), dimension(size(mu0), atmos%get_nlay()) :: mu0_bylay + integer :: i, j, ncol, nlay + + ncol = size(mu0) + nlay = atmos%get_nlay() + ! Solar zenith angle cosine is constant with height + !$acc data copyin(mu0) create(mu0_bylay) + !$omp target data map(to:mu0) map(alloc:mu0_bylay) + + !$acc parallel loop collapse(2) + !$omp target teams distribute parallel do simd collapse(2) + do j = 1, nlay + do i = 1, ncol + mu0_bylay(i,j) = mu0(i) + end do + end do + + error_msg = rte_sw_mu0_full(atmos, top_at_1, & + mu0_bylay, inc_flux, & + sfc_alb_dir, sfc_alb_dif, & + fluxes, inc_flux_dif) + !$acc end data + !$omp end target data + end function rte_sw_mu0_bycol + ! ------------------------------------------------------------------------------------------------- + function rte_sw_mu0_full(atmos, top_at_1, & + mu0, inc_flux, & + sfc_alb_dir, sfc_alb_dif, & + fluxes, inc_flux_dif) result(error_msg) + class(ty_optical_props_arry), intent(in ) :: atmos + !! Optical properties provided as arrays + integer, intent(in ) :: top_at_1 + !! Is the top of the domain at index 1? (if not, ordering is bottom-to-top) + real(wp), dimension(:,:), intent(in ) :: mu0 + !! cosine of solar zenith angle (ncol, nlay) + real(wp), dimension(:,:), intent(in ) :: inc_flux + !! incident flux at top of domain [W/m2] (ncol, ngpt) + real(wp), dimension(:,:), intent(in ) :: sfc_alb_dir + !! surface albedo for direct and + real(wp), dimension(:,:), intent(in ) :: sfc_alb_dif + !! diffuse radiation (nband, ncol) + class(ty_fluxes), intent(inout) :: fluxes + !! Class describing output calculations + real(wp), dimension(:,:), optional, target, & + intent(in ) :: inc_flux_dif + !! incident diffuse flux at top of domain [W/m2] (ncol, ngpt) + character(len=128) :: error_msg + !! If empty, calculation was successful + ! -------------------------------- + ! + ! Local variables + ! + integer :: ncol, nlay, ngpt, nband + integer :: icol, ilev + integer :: has_dif_bc, do_broadband + + real(wp), dimension(:,:,:), pointer :: gpt_flux_up, gpt_flux_dn, gpt_flux_dir + real(wp), dimension(:,:), allocatable :: sfc_alb_dir_gpt, sfc_alb_dif_gpt + real(wp), dimension(:,:), pointer :: flux_dn_loc, flux_up_loc, flux_dir_loc + real(wp), dimension(:,:), pointer :: inc_flux_diffuse + real(wp), dimension(:,:,:), allocatable, target :: decoy3D + real(wp), dimension(:,:), allocatable, target :: decoy2D + + ! ------------------------------------------------------------------------------------ + ncol = atmos%get_ncol() + nlay = atmos%get_nlay() + ngpt = atmos%get_ngpt() + nband = atmos%get_nband() + error_msg = "" + ! ------------------------------------------------------------------------------------ + ! + ! Error checking -- consistency of sizes and validity of values + ! + ! -------------------------------- + if(.not. fluxes%are_desired()) & + error_msg = "rte_sw: no space allocated for fluxes" + + if (present( inc_flux_dif)) then + has_dif_bc = 1 + else + has_dif_bc = 0 + endif + !has_dif_bc = present(inc_flux_dif) + + ! + ! Sizes of input arrays + ! + ! Copy variables whose sizes and values are checked to the GPU so the checks can happen there. + ! No harm done if checks are not performed (?) + !$acc data copyin(mu0, inc_flux, sfc_alb_dir, sfc_alb_dif) + !$omp target data map(to:mu0, inc_flux, sfc_alb_dir, sfc_alb_dif) + !$acc data copyin(inc_flux_dif) if (has_dif_bc==1) + !$omp target data map(to:inc_flux_dif) if (has_dif_bc==1) + if(check_extents) then + if(.not. extents_are(mu0, ncol, nlay)) & + error_msg = "rte_sw: mu0 inconsistently sized" + if(.not. extents_are(inc_flux, ncol, ngpt)) & + error_msg = "rte_sw: inc_flux inconsistently sized" + if(.not. extents_are(sfc_alb_dir, nband, ncol)) & + error_msg = "rte_sw: sfc_alb_dir inconsistently sized" + if(.not. extents_are(sfc_alb_dif, nband, ncol)) & + error_msg = "rte_sw: sfc_alb_dif inconsistently sized" + if(has_dif_bc==1) then + if(.not. extents_are(inc_flux_dif, ncol, ngpt)) & + error_msg = "rte_sw: inc_flux_dif inconsistently sized" + end if + end if + ! + ! Values of input arrays + ! + if(check_values) then + if(any_vals_outside(mu0, -1._wp, 1._wp)) & + error_msg = "rte_sw: one or more mu0 < -1 or > 1" + if(any_vals_less_than(inc_flux, 0._wp)) & + error_msg = "rte_sw: one or more inc_flux < 0" + if(any_vals_outside(sfc_alb_dir, 0._wp, 1._wp)) & + error_msg = "rte_sw: sfc_alb_dir out of bounds [0,1]" + if(any_vals_outside(sfc_alb_dif, 0._wp, 1._wp)) & + error_msg = "rte_sw: sfc_alb_dif out of bounds [0,1]" + if(has_dif_bc==1) then + if(any_vals_less_than(inc_flux_dif, 0._wp)) & + error_msg = "rte_sw: one or more inc_flux_dif < 0" + end if + end if + + ! ------------------------------------------------------------------------------------ + select type(fluxes) + type is (ty_fluxes_broadband) + do_broadband = 1 + ! + ! Solvers will integrate in place (one g-point at a time on CPUs) + ! so won't need big working arrays + ! + allocate(decoy3D(ncol, nlay+1, ngpt)) + gpt_flux_up => decoy3D + gpt_flux_dn => decoy3D + gpt_flux_dir => decoy3D + ! + ! Broadband fluxes class has three possible outputs; allocate memory for local use + ! if one or more haven't been requested + ! + if(associated(fluxes%flux_up)) then + flux_up_loc => fluxes%flux_up + else + allocate(flux_up_loc(ncol, nlay+1)) + end if + if(associated(fluxes%flux_dn)) then + flux_dn_loc => fluxes%flux_dn + else + allocate(flux_dn_loc(ncol, nlay+1)) + end if + if(associated(fluxes%flux_dn_dir)) then + flux_dir_loc => fluxes%flux_dn_dir + else + allocate(flux_dir_loc(ncol, nlay+1)) + end if + !$acc enter data create( flux_up_loc, flux_dn_loc, flux_dir_loc) + !$omp target enter data map(alloc:flux_up_loc, flux_dn_loc, flux_dir_loc) + class default + ! + ! If broadband integrals aren't being computed, allocate working space + ! and decoy addresses for spectrally-integrated fields + ! + do_broadband = 0 + allocate(decoy2D(ncol, nlay+1)) + flux_up_loc => decoy2D + flux_dn_loc => decoy2D + flux_dir_loc => decoy2D + allocate(gpt_flux_up (ncol,nlay+1,ngpt), & + gpt_flux_dn (ncol,nlay+1,ngpt), & + gpt_flux_dir(ncol,nlay+1,ngpt)) + end select + + allocate(sfc_alb_dir_gpt(ncol, ngpt), sfc_alb_dif_gpt(ncol, ngpt)) + if(len_trim(error_msg) > 0) then + if(len_trim(atmos%get_name()) > 0) & + error_msg = trim(atmos%get_name()) // ': ' // trim(error_msg) + end if + + ! Fluxes need to be copied out only if do_broadband is .true. + !$acc data copyin( flux_up_loc,flux_dn_loc,flux_dir_loc) if ( do_broadband==1) + !$omp target data map(to: flux_up_loc,flux_dn_loc,flux_dir_loc) if ( do_broadband==1) + !$acc data create( flux_up_loc,flux_dn_loc,flux_dir_loc) if ( do_broadband==0) + !$omp target data map(alloc:flux_up_loc,flux_dn_loc,flux_dir_loc) if ( do_broadband==0) + + !$acc data create( gpt_flux_up,gpt_flux_dn,gpt_flux_dir) & + !$acc create( sfc_alb_dir_gpt, sfc_alb_dif_gpt) + !$omp target data map(alloc:gpt_flux_up,gpt_flux_dn,gpt_flux_dir) & + !$omp map(alloc:sfc_alb_dir_gpt, sfc_alb_dif_gpt) + + + ! ------------------------------------------------------------------------------------ + ! Boundary conditions + ! Lower boundary condition -- expand surface albedos by band to gpoints + ! and switch dimension ordering + call expand_and_transpose(atmos, sfc_alb_dir, sfc_alb_dir_gpt) + call expand_and_transpose(atmos, sfc_alb_dif, sfc_alb_dif_gpt) + ! + ! Diffuse flux boundary condition - will use values in optional arg or be set to 0 + ! + if (has_dif_bc==1) then + inc_flux_diffuse => inc_flux_dif + !$acc enter data copyin( inc_flux_diffuse) + !$omp target enter data map(to: inc_flux_diffuse) + else + allocate(inc_flux_diffuse(ncol, ngpt)) + !$acc enter data create( inc_flux_diffuse) + !$omp target enter data map(alloc:inc_flux_diffuse) + call zero_array(ncol, ngpt, inc_flux_diffuse) + end if + ! ------------------------------------------------------------------------------------ + if(check_values) error_msg = atmos%validate() + ! + ! Compute the radiative transfer... + ! + if(len_trim(error_msg) == 0) then + select type (atmos) + class is (ty_optical_props_1scl) + ! + ! Direct beam only - for completeness, unlikely to be used in practice + ! + call sw_solver_noscat(ncol, nlay, ngpt, top_at_1, & + atmos%tau, mu0, inc_flux, & + gpt_flux_dir) + call zero_array(ncol, nlay+1, ngpt, gpt_flux_up) + ! + !$acc kernels + !$omp target + gpt_flux_dn(:,:,:) = gpt_flux_dir(:,:,:) + !$acc end kernels + !$omp end target + + class is (ty_optical_props_2str) + ! + ! two-stream calculation with scattering + ! + call sw_solver_2stream(ncol, nlay, ngpt, top_at_1, & + atmos%tau, atmos%ssa, atmos%g, mu0, & + sfc_alb_dir_gpt, sfc_alb_dif_gpt, & + inc_flux, & + gpt_flux_up, gpt_flux_dn, gpt_flux_dir, & + has_dif_bc, inc_flux_diffuse, & + do_broadband, flux_up_loc, flux_dn_loc, flux_dir_loc) + class is (ty_optical_props_nstr) + ! + ! n-stream calculation + ! + ! not yet implemented so fail + ! + error_msg = 'sw_solver(...ty_optical_props_nstr...) not yet implemented' + end select + if(len_trim(error_msg) > 0) then + if(len_trim(atmos%get_name()) > 0) & + error_msg = trim(atmos%get_name()) // ': ' // trim(error_msg) + end if + ! + ! Flux reduction (summarizing for output) + ! + select type(fluxes) + ! + ! Tidy up memory for broadband fluxes + ! + type is (ty_fluxes_broadband) + if(associated(fluxes%flux_net)) then + !$acc parallel loop collapse(2) copyout(fluxes%flux_net) + !$omp target teams distribute parallel do simd collapse(2) + do ilev = 1, nlay+1 + do icol = 1, ncol + fluxes%flux_net(icol,ilev) = flux_dn_loc(icol,ilev) - flux_up_loc(icol,ilev) + end do + end do + end if + class default + ! + ! ...or reduce spectral fluxes to desired output quantities + ! + error_msg = fluxes%reduce(gpt_flux_up, gpt_flux_dn, atmos, top_at_1, gpt_flux_dir) + end select + end if ! In case of an error we exit here + + !$acc end data + !$omp end target data + !$acc end data + !$omp end target data + !$acc end data + !$omp end target data + !$acc end data + !$omp end target data + !$acc end data + !$omp end target data + + ! + ! Deallocate any memory allocated locally to pointer variables + ! + select type(fluxes) + type is (ty_fluxes_broadband) + !$acc exit data copyout( flux_up_loc, flux_dn_loc, flux_dir_loc) + !$omp target exit data map(from:flux_up_loc, flux_dn_loc, flux_dir_loc) + if(.not. associated(fluxes%flux_up )) deallocate(flux_up_loc) + if(.not. associated(fluxes%flux_dn )) deallocate(flux_dn_loc) + if(.not. associated(fluxes%flux_dn_dir)) deallocate(flux_dir_loc) + class default + deallocate(gpt_flux_up, gpt_flux_dn, gpt_flux_dir) + end select + if(has_dif_bc==0) then + !$acc exit data delete( inc_flux_diffuse) + !$omp target exit data map(release:inc_flux_diffuse) + deallocate(inc_flux_diffuse) + end if + + end function rte_sw_mu0_full + !-------------------------------------------------------------------------------------------------------------------- + ! + ! Expand from band to g-point dimension, transpose dimensions (nband, ncol) -> (ncol,ngpt) + ! + subroutine expand_and_transpose(ops,arr_in,arr_out) + class(ty_optical_props), intent(in ) :: ops + real(wp), dimension(:,:), intent(in ) :: arr_in ! (nband, ncol) + real(wp), dimension(:,:), intent(out) :: arr_out ! (ncol, igpt) + ! ------------- + integer :: ncol, nband, ngpt + integer :: icol, iband, igpt + integer, dimension(2,ops%get_nband()) :: limits + + ncol = size(arr_in, 2) + nband = ops%get_nband() + ngpt = ops%get_ngpt() + limits = ops%get_band_lims_gpoint() + !$acc parallel loop collapse(2) copyin(arr_in, limits) + !$omp target teams distribute parallel do simd collapse(2) map(to:arr_in, limits) + do iband = 1, nband + do icol = 1, ncol + do igpt = limits(1, iband), limits(2, iband) + arr_out(icol, igpt) = arr_in(iband,icol) + end do + end do + end do + + end subroutine expand_and_transpose +end module mo_rte_sw diff --git a/src/radiate/rte-rrtmgp/rte/mo_rte_util_array.F90 b/src/radiate/rte-rrtmgp/rte/mo_rte_util_array.F90 new file mode 100644 index 0000000..b0ac350 --- /dev/null +++ b/src/radiate/rte-rrtmgp/rte/mo_rte_util_array.F90 @@ -0,0 +1,447 @@ +! This code is part of Radiative Transfer for Energetics (RTE) +! +! Contacts: Robert Pincus and Eli Mlawer +! email: rrtmgp@aer.com +! +! Copyright 2015- Atmospheric and Environmental Research, +! Regents of the University of Colorado, +! Trustees of Columbia University in the City of New York +! All right reserved. +! +! Use and duplication is permitted under the terms of the +! BSD 3-clause license, see http://opensource.org/licenses/BSD-3-Clause +! ------------------------------------------------------------------------------------------------- +module mo_rte_util_array +! +!> Provide utilites for sanitizing input arrays: +! checking values and sizes +! These are in a module so code can be written for both CPUs and GPUs +! Used only by Fortran classes so routines don't need C bindings and can use assumed-shape +! + use mo_rte_kind, only: wp, wl + implicit none + !> + !> Values less than a floor (including masked versions) + !> + interface any_vals_less_than + module procedure any_vals_less_than_1D, any_vals_less_than_2D, any_vals_less_than_3D + module procedure any_vals_less_than_1D_masked, any_vals_less_than_2D_masked, any_vals_less_than_3D_masked + end interface + !> + !> Values outside a range (including masked versions) + !> + interface any_vals_outside + module procedure any_vals_outside_1D, any_vals_outside_2D, any_vals_outside_3D + module procedure any_vals_outside_1D_masked, any_vals_outside_2D_masked, any_vals_outside_3D_masked + end interface + !> + !> Efficiently set arrays to zero + !> + interface zero_array + module procedure zero_array_1D, zero_array_2D, zero_array_3D, zero_array_4D + end interface + !> + !> Find the extents of an array + !> + interface extents_are + module procedure extents_are_1D, extents_are_2D, extents_are_3D + module procedure extents_are_4D, extents_are_5D, extents_are_6D + module procedure extents_are_2d_int + end interface extents_are + + private + public :: any_vals_less_than, any_vals_outside, extents_are, zero_array +contains + !------------------------------------------------------------------------------------------------- + ! Values less than a floor + !------------------------------------------------------------------------------------------------- + logical function any_vals_less_than_1D(array, check_value) + real(wp), dimension(:), intent(in) :: array + real(wp), intent(in) :: check_value + + real(wp) :: minValue + + !$acc kernels copyin(array) + !$omp target map(to:array) map(from:minValue) + minValue = minval(array) + !$acc end kernels + !$omp end target + + any_vals_less_than_1D = (minValue < check_value) + + end function any_vals_less_than_1D +!------------------------------------------------------------------------------------------------- + logical function any_vals_less_than_2D(array, check_value) + real(wp), dimension(:,:), intent(in) :: array + real(wp), intent(in) :: check_value + + real(wp) :: minValue + + !$acc kernels copyin(array) + !$omp target map(to:array) map(from:minValue) + minValue = minval(array) + !$acc end kernels + !$omp end target + + any_vals_less_than_2D = (minValue < check_value) + + end function any_vals_less_than_2D +!------------------------------------------------------------------------------------------------- + logical function any_vals_less_than_3D(array, check_value) + real(wp), dimension(:,:,:), intent(in) :: array + real(wp), intent(in) :: check_value + + real(wp) :: minValue + +#ifdef _OPENMP + integer :: dim1, dim2, dim3, i, j, k + dim1 = size(array,1) + dim2 = size(array,2) + dim3 = size(array,3) + minValue = check_value + epsilon(check_value) ! initialize to some value + !$omp target teams map(to:array) & + !$omp defaultmap(tofrom:scalar) reduction(min:minValue) + !$omp distribute parallel do simd reduction(min:minValue) + do i = 1, dim1 + do j = 1, dim2 + do k = 1, dim3 + minValue = min(minValue,array(i,j,k)) + enddo + enddo + enddo + !$omp end target teams +#else + !$acc kernels copyin(array) + minValue = minval(array) + !$acc end kernels +#endif + + any_vals_less_than_3D = (minValue < check_value) + + end function any_vals_less_than_3D + !------------------------------------------------------------------------------------------------- + ! Masked versions + !------------------------------------------------------------------------------------------------- + logical function any_vals_less_than_1D_masked(array, mask, check_value) + real (wp), dimension(:), intent(in) :: array + logical(wl), dimension(:), intent(in) :: mask + real (wp), intent(in) :: check_value + + real(wp) :: minValue + + !$acc kernels copyin(array) + !$omp target map(to:array, mask) map(from:minValue) + minValue = minval(array, mask=mask) + !$acc end kernels + !$omp end target + + any_vals_less_than_1D_masked = (minValue < check_value) + + end function any_vals_less_than_1D_masked + !------------------------------------------------------------------------------------------------- + logical function any_vals_less_than_2D_masked(array, mask, check_value) + real (wp), dimension(:,:), intent(in) :: array + logical(wl), dimension(:,:), intent(in) :: mask + real (wp), intent(in) :: check_value + + real(wp) :: minValue + + !$acc kernels copyin(array) + !$omp target map(to:array, mask) map(from:minValue) + minValue = minval(array, mask=mask) + !$acc end kernels + !$omp end target + + any_vals_less_than_2D_masked = (minValue < check_value) + + end function any_vals_less_than_2D_masked + !------------------------------------------------------------------------------------------------- + logical function any_vals_less_than_3D_masked(array, mask, check_value) + real (wp), dimension(:,:,:), intent(in) :: array + logical(wl), dimension(:,:,:), intent(in) :: mask + real (wp), intent(in) :: check_value + + real(wp) :: minValue + + !$acc kernels copyin(array) + !$omp target map(to:array, mask) map(from:minValue) + minValue = minval(array, mask=mask) + !$acc end kernels + !$omp end target + + any_vals_less_than_3D_masked = (minValue < check_value) + + end function any_vals_less_than_3D_masked + !------------------------------------------------------------------------------------------------- + ! Values outside a range + !------------------------------------------------------------------------------------------------- + logical function any_vals_outside_1D(array, checkMin, checkMax) + real(wp), dimension(:), intent(in) :: array + real(wp), intent(in) :: checkMin, checkMax + + real(wp) :: minValue, maxValue + + !$acc kernels copyin(array) + !$omp target map(to:array) map(from:minValue, maxValue) + minValue = minval(array) + maxValue = maxval(array) + !$acc end kernels + !$omp end target + any_vals_outside_1D = minValue < checkMin .or. maxValue > checkMax + + end function any_vals_outside_1D +! ---------------------------------------------------------- + logical function any_vals_outside_2D(array, checkMin, checkMax) + real(wp), dimension(:,:), intent(in) :: array + real(wp), intent(in) :: checkMin, checkMax + + real(wp) :: minValue, maxValue + + !$acc kernels copyin(array) + !$omp target map(to:array) map(from:minValue, maxValue) + minValue = minval(array) + maxValue = maxval(array) + !$acc end kernels + !$omp end target + any_vals_outside_2D = minValue < checkMin .or. maxValue > checkMax + + end function any_vals_outside_2D +! ---------------------------------------------------------- + logical function any_vals_outside_3D(array, checkMin, checkMax) + real(wp), dimension(:,:,:), intent(in) :: array + real(wp), intent(in) :: checkMin, checkMax + + ! Compact version using intrinsics below + ! but an explicit loop is the only current solution on GPUs + real(wp) :: minValue, maxValue + + +#ifdef _OPENMP + integer :: dim1, dim2, dim3, i, j, k + dim1 = size(array,1) + dim2 = size(array,2) + dim3 = size(array,3) + minValue = checkMin + epsilon(checkMin) ! initialize to some value + maxValue = checkMax - epsilon(checkMax) ! initialize to some value + !$omp target teams map(to:array) & + !$omp defaultmap(tofrom:scalar) reduction(min:minValue) reduction(max:maxValue) + !$omp distribute parallel do simd reduction(min:minValue) reduction(max:maxValue) + do i= 1, dim1 + do j = 1, dim2 + do k = 1, dim3 + minValue = min(minValue,array(i,j,k)) + maxValue = max(maxValue,array(i,j,k)) + enddo + enddo + enddo + !$omp end target teams +#else + !$acc kernels copyin(array) + minValue = minval(array) + maxValue = maxval(array) + !$acc end kernels +#endif + + any_vals_outside_3D = minValue < checkMin .or. maxValue > checkMax + + end function any_vals_outside_3D + ! ---------------------------------------------------------- + ! Masked versions + ! ---------------------------------------------------------- + logical function any_vals_outside_1D_masked(array, mask, checkMin, checkMax) + real (wp), dimension(:), intent(in) :: array + logical(wl), dimension(:), intent(in) :: mask + real(wp), intent(in) :: checkMin, checkMax + + real(wp) :: minValue, maxValue + + !$acc kernels copyin(array) + !$omp target map(to:array, mask) map(from:minValue, maxValue) + minValue = minval(array, mask=mask) + maxValue = maxval(array, mask=mask) + !$acc end kernels + !$omp end target + any_vals_outside_1D_masked = minValue < checkMin .or. maxValue > checkMax + + end function any_vals_outside_1D_masked +! ---------------------------------------------------------- + logical function any_vals_outside_2D_masked(array, mask, checkMin, checkMax) + real (wp), dimension(:,:), intent(in) :: array + logical(wl), dimension(:,:), intent(in) :: mask + real(wp), intent(in) :: checkMin, checkMax + + real(wp) :: minValue, maxValue + + !$acc kernels copyin(array) + !$omp target map(to:array, mask) map(from:minValue, maxValue) + minValue = minval(array, mask=mask) + maxValue = maxval(array, mask=mask) + !$acc end kernels + !$omp end target + any_vals_outside_2D_masked = minValue < checkMin .or. maxValue > checkMax + + end function any_vals_outside_2D_masked +! ---------------------------------------------------------- + logical function any_vals_outside_3D_masked(array, mask, checkMin, checkMax) + real (wp), dimension(:,:,:), intent(in) :: array + logical(wl), dimension(:,:,:), intent(in) :: mask + real(wp), intent(in) :: checkMin, checkMax + + real(wp) :: minValue, maxValue + + !$acc kernels copyin(array) + !$omp target map(to:array, mask) map(from:minValue, maxValue) + minValue = minval(array, mask=mask) + maxValue = maxval(array, mask=mask) + !$acc end kernels + !$omp end target + any_vals_outside_3D_masked = minValue < checkMin .or. maxValue > checkMax + + end function any_vals_outside_3D_masked + !-------------------------------------------------------------------------------------------------------------------- + ! + ! Extents + ! + ! -------------------------------------------------------------------------------------- + function extents_are_1d(array, n1) + real(wp), dimension(: ), intent(in) :: array + integer, intent(in) :: n1 + logical(wl) :: extents_are_1d + + extents_are_1d = (size(array,1) == n1) + end function extents_are_1d + ! -------------------------------------------------------------------------------------- + function extents_are_2d(array, n1, n2) + real(wp), dimension(:,: ), intent(in) :: array + integer, intent(in) :: n1, n2 + logical(wl) :: extents_are_2d + + extents_are_2d = (size(array,1) == n1 .and. & + size(array,2) == n2 ) + end function extents_are_2d + ! -------------------------------------------------------------------------------------- + function extents_are_3d(array, n1, n2, n3) + real(wp), dimension(:,:,: ), intent(in) :: array + integer, intent(in) :: n1, n2, n3 + logical(wl) :: extents_are_3d + + extents_are_3d = (size(array,1) == n1 .and. & + size(array,2) == n2 .and. & + size(array,3) == n3) + end function extents_are_3d + ! -------------------------------------------------------------------------------------- + function extents_are_4d(array, n1, n2, n3, n4) + real(wp), dimension(:,:,:,: ), intent(in) :: array + integer, intent(in) :: n1, n2, n3, n4 + logical(wl) :: extents_are_4d + + extents_are_4d = (size(array,1) == n1 .and. & + size(array,2) == n2 .and. & + size(array,3) == n3 .and. & + size(array,4) == n4) + end function extents_are_4d + ! -------------------------------------------------------------------------------------- + function extents_are_5d(array, n1, n2, n3, n4, n5) + real(wp), dimension(:,:,:,:,: ), intent(in) :: array + integer, intent(in) :: n1, n2, n3, n4, n5 + logical(wl) :: extents_are_5d + + extents_are_5d = (size(array,1) == n1 .and. & + size(array,2) == n2 .and. & + size(array,3) == n3 .and. & + size(array,4) == n4 .and. & + size(array,5) == n5 ) + end function extents_are_5d + ! -------------------------------------------------------------------------------------- + function extents_are_6d(array, n1, n2, n3, n4, n5, n6) + real(wp), dimension(:,:,:,:,:,:), intent(in) :: array + integer, intent(in) :: n1, n2, n3, n4, n5, n6 + logical(wl) :: extents_are_6d + + extents_are_6d = (size(array,1) == n1 .and. & + size(array,2) == n2 .and. & + size(array,3) == n3 .and. & + size(array,4) == n4 .and. & + size(array,5) == n5 .and. & + size(array,6) == n6 ) + end function extents_are_6d + ! -------------------------------------------------------------------------------------- + function extents_are_2d_int(array, n1, n2) + integer, dimension(:,: ), intent(in) :: array + integer, intent(in) :: n1, n2 + logical(wl) :: extents_are_2d_int + + extents_are_2d_int = (size(array,1) == n1 .and. & + size(array,2) == n2 ) + end function extents_are_2d_int + !------------------------------------------------------------------------------------------------- + ! Initializing arrays to 0 + !------------------------------------------------------------------------------------------------- + subroutine zero_array_1D(ni, array) bind(C, name="zero_array_1D") + integer, intent(in ) :: ni + real(wp), dimension(ni), intent(out) :: array + ! ----------------------- + integer :: i + ! ----------------------- + !$acc parallel loop copyout(array) + !$omp target teams distribute parallel do simd map(from:array) + do i = 1, ni + array(i) = 0.0_wp + end do + end subroutine zero_array_1D + ! ---------------------------------------------------------- + subroutine zero_array_2D(ni, nj, array) bind(C, name="zero_array_2D") + integer, intent(in ) :: ni, nj + real(wp), dimension(ni, nj), intent(out) :: array + ! ----------------------- + integer :: i,j + ! ----------------------- + !$acc parallel loop collapse(2) copyout(array) + !$omp target teams distribute parallel do simd collapse(2) map(from:array) + do j = 1, nj + do i = 1, ni + array(i,j) = 0.0_wp + end do + end do + + end subroutine zero_array_2D + ! ---------------------------------------------------------- + subroutine zero_array_3D(ni, nj, nk, array) bind(C, name="zero_array_3D") + integer, intent(in ) :: ni, nj, nk + real(wp), dimension(ni, nj, nk), intent(out) :: array + ! ----------------------- + integer :: i,j,k + ! ----------------------- + !$acc parallel loop collapse(3) copyout(array) + !$omp target teams distribute parallel do simd collapse(3) map(from:array) + do k = 1, nk + do j = 1, nj + do i = 1, ni + array(i,j,k) = 0.0_wp + end do + end do + end do + + end subroutine zero_array_3D + ! ---------------------------------------------------------- + subroutine zero_array_4D(ni, nj, nk, nl, array) bind(C, name="zero_array_4D") + integer, intent(in ) :: ni, nj, nk, nl + real(wp), dimension(ni, nj, nk, nl), intent(out) :: array + ! ----------------------- + integer :: i,j,k,l + ! ----------------------- + !$acc parallel loop collapse(4) copyout(array) + !$omp target teams distribute parallel do simd collapse(4) map(from:array) + do l = 1, nl + do k = 1, nk + do j = 1, nj + do i = 1, ni + array(i,j,k,l) = 0.0_wp + end do + end do + end do + end do + + end subroutine zero_array_4D + +end module mo_rte_util_array diff --git a/src/radiate/rte-rrtmgp/rte/mo_source_functions.F90 b/src/radiate/rte-rrtmgp/rte/mo_source_functions.F90 new file mode 100644 index 0000000..d242a9e --- /dev/null +++ b/src/radiate/rte-rrtmgp/rte/mo_source_functions.F90 @@ -0,0 +1,291 @@ +! This code is part of Radiative Transfer for Energetics (RTE) +! +! Contacts: Robert Pincus and Eli Mlawer +! email: rrtmgp@aer.com +! +! Copyright 2015- Atmospheric and Environmental Research, +! Regents of the University of Colorado, +! Trustees of Columbia University in the City of New York +! All right reserved. +! +! Use and duplication is permitted under the terms of the +! BSD 3-clause license, see http://opensource.org/licenses/BSD-3-Clause +! ------------------------------------------------------------------------------------------------- +! +!> Encapsulate source function arrays for longwave/lw/internal sources +! and shortwave/sw/external source. +! +! ------------------------------------------------------------------------------------------------- +module mo_source_functions + use mo_rte_kind, only: wp + use mo_optical_props, only: ty_optical_props + implicit none + private + ! ------------------------------------------------------------------------------------------------- + ! + !> Type representing Planck source functions in \(W/m^2\) + !> computed at layer center, at layer edges using + !> spectral mapping in each direction separately, and at the surface + !> + type, extends(ty_optical_props), public :: ty_source_func_lw + real(wp), allocatable, dimension(:,:,:) :: lay_source + !! Planck source at layer average temperature (ncol, nlay, ngpt) + real(wp), allocatable, dimension(:,:,:) :: lev_source_inc + !! Planck source at layer edge in increasing ilay direction (ncol, nlay+1, ngpt) + real(wp), allocatable, dimension(:,:,:) :: lev_source_dec + !! Planck source at layer edge in decreasing ilay direction (ncol, nlay+1, ngpt) + real(wp), allocatable, dimension(:,: ) :: sfc_source + !! Planck function at surface temperature + real(wp), allocatable, dimension(:,: ) :: sfc_source_Jac + !! surface source Jacobian + contains + generic, public :: alloc => alloc_lw, copy_and_alloc_lw + procedure, private:: alloc_lw + procedure, private:: copy_and_alloc_lw + procedure, public :: is_allocated => is_allocated_lw + procedure, public :: finalize => finalize_lw + procedure, public :: get_subset => get_subset_range_lw + procedure, public :: get_ncol => get_ncol_lw + procedure, public :: get_nlay => get_nlay_lw + ! validate? + end type ty_source_func_lw + ! ------------------------------------------------------------------------------------------------- + ! + ! Type for shortave sources: top-of-domain spectrally-resolved flux + ! The type isn't used at this time, so it's declared as private. + ! + type, extends(ty_optical_props), private :: ty_source_func_sw + real(wp), allocatable, dimension(:,: ) :: toa_source + contains + generic, public :: alloc => alloc_sw, copy_and_alloc_sw + procedure, private:: alloc_sw + procedure, private:: copy_and_alloc_sw + procedure, public :: is_allocated => is_allocated_sw + procedure, public :: finalize => finalize_sw + procedure, public :: get_subset => get_subset_range_sw + procedure, public :: get_ncol => get_ncol_sw + ! validate? + end type ty_source_func_sw + ! ------------------------------------------------------------------------------------------------- +contains + ! ------------------------------------------------------------------------------------------ + ! + ! Routines for initialization, validity checking, finalization + ! + ! ------------------------------------------------------------------------------------------ + ! + ! Longwave + ! + ! ------------------------------------------------------------------------------------------ + pure function is_allocated_lw(this) + class(ty_source_func_lw), intent(in) :: this + logical :: is_allocated_lw + + is_allocated_lw = this%is_initialized() .and. & + allocated(this%sfc_source) + end function is_allocated_lw + ! -------------------------------------------------------------- + function alloc_lw(this, ncol, nlay) result(err_message) + class(ty_source_func_lw), intent(inout) :: this + integer, intent(in ) :: ncol, nlay + character(len = 128) :: err_message + + integer :: ngpt + + err_message = "" + if(.not. this%is_initialized()) & + err_message = "source_func_lw%alloc: not initialized so can't allocate" + if(any([ncol, nlay] <= 0)) & + err_message = "source_func_lw%alloc: must provide positive extents for ncol, nlay" + if (err_message /= "") return + + if(allocated(this%sfc_source)) deallocate(this%sfc_source) + if(allocated(this%sfc_source_Jac)) deallocate(this%sfc_source_Jac) + if(allocated(this%lay_source)) deallocate(this%lay_source) + if(allocated(this%lev_source_inc)) deallocate(this%lev_source_inc) + if(allocated(this%lev_source_dec)) deallocate(this%lev_source_dec) + + ngpt = this%get_ngpt() + allocate(this%sfc_source (ncol, ngpt), this%lay_source (ncol,nlay,ngpt), & + this%lev_source_inc(ncol,nlay,ngpt), this%lev_source_dec(ncol,nlay,ngpt)) + allocate(this%sfc_source_Jac(ncol, ngpt)) + end function alloc_lw + ! -------------------------------------------------------------- + function copy_and_alloc_lw(this, ncol, nlay, spectral_desc) result(err_message) + class(ty_source_func_lw), intent(inout) :: this + integer, intent(in ) :: ncol, nlay + class(ty_optical_props ), intent(in ) :: spectral_desc + character(len = 128) :: err_message + + err_message = "" + if(.not. spectral_desc%is_initialized()) then + err_message = "source_func_lw%alloc: spectral_desc not initialized" + return + end if + call this%finalize() + err_message = this%init(spectral_desc) + if (err_message /= "") return + err_message = this%alloc(ncol,nlay) + end function copy_and_alloc_lw + ! ------------------------------------------------------------------------------------------ + ! + ! Shortwave + ! + ! ------------------------------------------------------------------------------------------ + pure function is_allocated_sw(this) + class(ty_source_func_sw), intent(in) :: this + logical :: is_allocated_sw + + is_allocated_sw = this%ty_optical_props%is_initialized() .and. & + allocated(this%toa_source) + end function is_allocated_sw + ! -------------------------------------------------------------- + function alloc_sw(this, ncol) result(err_message) + class(ty_source_func_sw), intent(inout) :: this + integer, intent(in ) :: ncol + character(len = 128) :: err_message + + err_message = "" + if(.not. this%is_initialized()) & + err_message = "source_func_sw%alloc: not initialized so can't allocate" + if(ncol <= 0) & + err_message = "source_func_sw%alloc: must provide positive extents for ncol" + if (err_message /= "") return + + if(allocated(this%toa_source)) deallocate(this%toa_source) + + allocate(this%toa_source(ncol, this%get_ngpt())) + end function alloc_sw + ! -------------------------------------------------------------- + function copy_and_alloc_sw(this, ncol, spectral_desc) result(err_message) + class(ty_source_func_sw), intent(inout) :: this + integer, intent(in ) :: ncol + class(ty_optical_props ), intent(in ) :: spectral_desc + character(len = 128) :: err_message + + err_message = "" + if(.not. spectral_desc%is_initialized()) then + err_message = "source_func_sw%alloc: spectral_desc not initialized" + return + end if + err_message = this%init(spectral_desc) + if(err_message /= "") return + err_message = this%alloc(ncol) + end function copy_and_alloc_sw + ! ------------------------------------------------------------------------------------------ + ! + ! Finalization (memory deallocation) + ! + ! ------------------------------------------------------------------------------------------ + subroutine finalize_lw(this) + class(ty_source_func_lw), intent(inout) :: this + + if(allocated(this%lay_source )) deallocate(this%lay_source) + if(allocated(this%lev_source_inc)) deallocate(this%lev_source_inc) + if(allocated(this%lev_source_dec)) deallocate(this%lev_source_dec) + if(allocated(this%sfc_source )) deallocate(this%sfc_source) + if(allocated(this%sfc_source_Jac)) deallocate(this%sfc_source_Jac) + call this%ty_optical_props%finalize() + end subroutine finalize_lw + ! -------------------------------------------------------------- + subroutine finalize_sw(this) + class(ty_source_func_sw), intent(inout) :: this + + if(allocated(this%toa_source )) deallocate(this%toa_source) + call this%ty_optical_props%finalize() + end subroutine finalize_sw + ! ------------------------------------------------------------------------------------------ + ! + ! Routines for finding the problem size + ! + ! ------------------------------------------------------------------------------------------ + pure function get_ncol_lw(this) + class(ty_source_func_lw), intent(in) :: this + integer :: get_ncol_lw + + if(this%is_allocated()) then + get_ncol_lw = size(this%lay_source,1) + else + get_ncol_lw = 0 + end if + end function get_ncol_lw + ! -------------------------------------------------------------- + pure function get_nlay_lw(this) + class(ty_source_func_lw), intent(in) :: this + integer :: get_nlay_lw + + if(this%is_allocated()) then + get_nlay_lw = size(this%lay_source,2) + else + get_nlay_lw = 0 + end if + end function get_nlay_lw + ! -------------------------------------------------------------- + pure function get_ncol_sw(this) + class(ty_source_func_sw), intent(in) :: this + integer :: get_ncol_sw + + if(this%is_allocated()) then + get_ncol_sw = size(this%toa_source,1) + else + get_ncol_sw = 0 + end if + end function get_ncol_sw + ! ------------------------------------------------------------------------------------------ + ! + ! Routines for subsetting + ! + ! ------------------------------------------------------------------------------------------ + function get_subset_range_lw(full, start, n, subset) result(err_message) + class(ty_source_func_lw), intent(inout) :: full + integer, intent(in ) :: start, n + class(ty_source_func_lw), intent(inout) :: subset + character(128) :: err_message + + err_message = "" + if(.not. full%is_allocated()) then + err_message = "source_func_lw%subset: Asking for a subset of unallocated data" + return + end if + if(start < 1 .or. start + n-1 > full%get_ncol()) & + err_message = "optical_props%subset: Asking for columns outside range" + if(err_message /= "") return + + ! + ! Could check to see if subset is correctly sized, has consistent spectral discretization + ! + if(subset%is_allocated()) call subset%finalize() + err_message = subset%alloc(n, full%get_nlay(), full) + if(err_message /= "") return + subset%sfc_source (1:n, :) = full%sfc_source (start:start+n-1, :) + subset%sfc_source_Jac(1:n, :) = full%sfc_source_Jac(start:start+n-1, :) + subset%lay_source (1:n,:,:) = full%lay_source (start:start+n-1,:,:) + subset%lev_source_inc(1:n,:,:) = full%lev_source_inc(start:start+n-1,:,:) + subset%lev_source_dec(1:n,:,:) = full%lev_source_dec(start:start+n-1,:,:) + end function get_subset_range_lw + ! ------------------------------------------------------------------------------------------ + function get_subset_range_sw(full, start, n, subset) result(err_message) + class(ty_source_func_sw), intent(inout) :: full + integer, intent(in ) :: start, n + class(ty_source_func_sw), intent(inout) :: subset + character(128) :: err_message + + err_message = "" + if(.not. full%is_allocated()) then + err_message = "source_func_sw%subset: Asking for a subset of unallocated data" + return + end if + if(start < 1 .or. start + n-1 > full%get_ncol()) & + err_message = "optical_props%subset: Asking for columns outside range" + if(err_message /= "") return + + ! + ! Could check to see if subset is correctly sized, has consistent spectral discretization + ! + if(subset%is_allocated()) call subset%finalize() + ! Seems like I should be able to call "alloc" generically but the compilers are complaining + err_message = subset%copy_and_alloc_sw(n, full) + + subset%toa_source(1:n, :) = full%toa_source(start:start+n-1, :) + end function get_subset_range_sw +end module mo_source_functions diff --git a/src/6.3.02/revu/RAMS_hdf5.f90 b/src/revu/RAMS_hdf5.f90 similarity index 100% rename from src/6.3.02/revu/RAMS_hdf5.f90 rename to src/revu/RAMS_hdf5.f90 diff --git a/src/6.3.02/revu/getvar.f90 b/src/revu/getvar.f90 similarity index 100% rename from src/6.3.02/revu/getvar.f90 rename to src/revu/getvar.f90 diff --git a/src/6.3.02/revu/hvlib.f90 b/src/revu/hvlib.f90 similarity index 99% rename from src/6.3.02/revu/hvlib.f90 rename to src/revu/hvlib.f90 index 84189e4..1685eed 100644 --- a/src/6.3.02/revu/hvlib.f90 +++ b/src/revu/hvlib.f90 @@ -1932,17 +1932,17 @@ Subroutine rams_varlib (cvar,n1,n2,n3,ngrd,a,b,flnm,cdname,cdunits) cdname='ice-nuclei-concentration;' cdunits='#/cm3;' -elseif(cvar(1:lv).eq.'ccn_concen_mg') then +elseif(cvar(1:lv).eq.'ccn1_concen_mg') then ivar_type=3 - ierr=rams_getvar('CCCNP',idim_type,ngrd,a,flnm) + ierr=rams_getvar('CN1NP',idim_type,ngrd,a,flnm) CALL rams_comp_mults (n1,n2,n3,a,1.e-6) CALL rams_comp_noneg (n1,n2,n3,a) - cdname='ccn-concentration;' + cdname='ccn-mode-1-concentration;' cdunits='#/mg;' -elseif(cvar(1:lv).eq.'ccn_concen_cm3') then +elseif(cvar(1:lv).eq.'ccn1_concen_cm3') then ivar_type=3 - ierr=rams_getvar('CCCNP',idim_type,ngrd,a,flnm) + ierr=rams_getvar('CN1NP',idim_type,ngrd,a,flnm) ierr=rams_getvar('TOPT',idim_type,ngrd,e,flnm) if(ierr.eq.0) then CALL rams_comp_dn0 (n1,n2,n3,b,c,d,e,ngrd) @@ -1950,20 +1950,20 @@ Subroutine rams_varlib (cvar,n1,n2,n3,ngrd,a,b,flnm,cdname,cdunits) CALL rams_comp_mults (n1,n2,n3,a,1.e-6) CALL rams_comp_noneg (n1,n2,n3,a) endif - cdname='ccn-concentration;' + cdname='ccn-mode-1-concentration;' cdunits='#/cm3;' -elseif(cvar(1:lv).eq.'gccn_concen_mg') then +elseif(cvar(1:lv).eq.'ccn2_concen_mg') then ivar_type=3 - ierr=rams_getvar('GCCNP',idim_type,ngrd,a,flnm) + ierr=rams_getvar('CN2NP',idim_type,ngrd,a,flnm) CALL rams_comp_mults (n1,n2,n3,a,1.e-6) CALL rams_comp_noneg (n1,n2,n3,a) - cdname='gccn-concentration;' + cdname='ccn-mode-2-concentration;' cdunits='#/mg;' -elseif(cvar(1:lv).eq.'gccn_concen_cm3') then +elseif(cvar(1:lv).eq.'ccn2_concen_cm3') then ivar_type=3 - ierr=rams_getvar('GCCNP',idim_type,ngrd,a,flnm) + ierr=rams_getvar('CN2NP',idim_type,ngrd,a,flnm) ierr=rams_getvar('TOPT',idim_type,ngrd,e,flnm) if(ierr.eq.0) then CALL rams_comp_dn0 (n1,n2,n3,b,c,d,e,ngrd) @@ -1971,7 +1971,7 @@ Subroutine rams_varlib (cvar,n1,n2,n3,ngrd,a,b,flnm,cdname,cdunits) CALL rams_comp_mults (n1,n2,n3,a,1.e-6) CALL rams_comp_noneg (n1,n2,n3,a) endif - cdname='gccn-concentration;' + cdname='ccn-mode-2-concentration;' cdunits='#/cm3;' elseif(cvar(1:lv).eq.'dust1_concen') then @@ -2091,9 +2091,9 @@ Subroutine rams_varlib (cvar,n1,n2,n3,ngrd,a,b,flnm,cdname,cdunits) cdname='regenerated-aero2-concentration;' cdunits='#/cm3;' -elseif(cvar(1:lv).eq.'ccn_mass') then +elseif(cvar(1:lv).eq.'ccn1_mass') then ivar_type=3 - ierr=rams_getvar('CCCMP',idim_type,ngrd,a,flnm) + ierr=rams_getvar('CN1MP',idim_type,ngrd,a,flnm) ierr=rams_getvar('TOPT',idim_type,ngrd,e,flnm) if(ierr.eq.0) then CALL rams_comp_dn0 (n1,n2,n3,b,c,d,e,ngrd) @@ -2101,12 +2101,12 @@ Subroutine rams_varlib (cvar,n1,n2,n3,ngrd,a,b,flnm,cdname,cdunits) CALL rams_comp_mults (n1,n2,n3,a,1.e9) CALL rams_comp_noneg (n1,n2,n3,a) endif - cdname='ccn-mass;' + cdname='ccn-mode-1-mass;' cdunits='micro-grams/m3;' -elseif(cvar(1:lv).eq.'gccn_mass') then +elseif(cvar(1:lv).eq.'ccn2_mass') then ivar_type=3 - ierr=rams_getvar('GCCMP',idim_type,ngrd,a,flnm) + ierr=rams_getvar('CN2MP',idim_type,ngrd,a,flnm) ierr=rams_getvar('TOPT',idim_type,ngrd,e,flnm) if(ierr.eq.0) then CALL rams_comp_dn0 (n1,n2,n3,b,c,d,e,ngrd) @@ -2114,7 +2114,7 @@ Subroutine rams_varlib (cvar,n1,n2,n3,ngrd,a,b,flnm,cdname,cdunits) CALL rams_comp_mults (n1,n2,n3,a,1.e9) CALL rams_comp_noneg (n1,n2,n3,a) endif - cdname='gccn-mass;' + cdname='ccn-mode-2-mass;' cdunits='micro-grams/m3;' elseif(cvar(1:lv).eq.'dust1_mass') then @@ -2310,24 +2310,24 @@ Subroutine rams_varlib (cvar,n1,n2,n3,ngrd,a,b,flnm,cdname,cdunits) cdname='regen2-solubility-fraction;' cdunits='fraction;' -elseif(cvar(1:lv).eq.'ccn_medrad') then +elseif(cvar(1:lv).eq.'ccn1_medrad') then ivar_type=3 - ierr=rams_getvar('CCCMP',idim_type,ngrd,a,flnm) - ierr=rams_getvar('CCCNP',idim_type,ngrd,c,flnm) + ierr=rams_getvar('CN1MP',idim_type,ngrd,a,flnm) + ierr=rams_getvar('CN2NP',idim_type,ngrd,c,flnm) CALL rams_comp_aeromedrad (n1,n2,n3,a,c,1769.) !1769 kg/m3 is solute density CALL rams_comp_mults (n1,n2,n3,a,1.e6) CALL rams_comp_noneg (n1,n2,n3,a) - cdname='ccn-median-radius;' + cdname='ccn1-median-radius;' cdunits='microns;' -elseif(cvar(1:lv).eq.'gccn_medrad') then +elseif(cvar(1:lv).eq.'ccn2_medrad') then ivar_type=3 - ierr=rams_getvar('GCCMP',idim_type,ngrd,a,flnm) - ierr=rams_getvar('GCCNP',idim_type,ngrd,c,flnm) + ierr=rams_getvar('CN2MP',idim_type,ngrd,a,flnm) + ierr=rams_getvar('CN2NP',idim_type,ngrd,c,flnm) CALL rams_comp_aeromedrad (n1,n2,n3,a,c,1769.) !1769 kg/m3 is solute density CALL rams_comp_mults (n1,n2,n3,a,1.e6) CALL rams_comp_noneg (n1,n2,n3,a) - cdname='gccn-median-radius;' + cdname='ccn2-median-radius;' cdunits='microns;' elseif(cvar(1:lv).eq.'dust1_medrad') then diff --git a/src/6.3.02/revu/iplt.f90 b/src/revu/iplt.f90 similarity index 100% rename from src/6.3.02/revu/iplt.f90 rename to src/revu/iplt.f90 diff --git a/src/6.3.02/revu/rainit.f90 b/src/revu/rainit.f90 similarity index 100% rename from src/6.3.02/revu/rainit.f90 rename to src/revu/rainit.f90 diff --git a/src/6.3.02/revu/rbat.f90 b/src/revu/rbat.f90 similarity index 100% rename from src/6.3.02/revu/rbat.f90 rename to src/revu/rbat.f90 diff --git a/src/6.3.02/revu/rcommons.f90 b/src/revu/rcommons.f90 similarity index 100% rename from src/6.3.02/revu/rcommons.f90 rename to src/revu/rcommons.f90 diff --git a/src/6.3.02/revu/rcomp.f90 b/src/revu/rcomp.f90 similarity index 100% rename from src/6.3.02/revu/rcomp.f90 rename to src/revu/rcomp.f90 diff --git a/src/6.3.02/revu/revu_main.f90 b/src/revu/revu_main.f90 similarity index 100% rename from src/6.3.02/revu/revu_main.f90 rename to src/revu/revu_main.f90 diff --git a/src/6.3.02/revu/revu_utils.f90 b/src/revu/revu_utils.f90 similarity index 100% rename from src/6.3.02/revu/revu_utils.f90 rename to src/revu/revu_utils.f90 diff --git a/src/6.3.02/revu/revugrads.f90 b/src/revu/revugrads.f90 similarity index 100% rename from src/6.3.02/revu/revugrads.f90 rename to src/revu/revugrads.f90 diff --git a/src/6.3.02/revu/rhdf5_f2c.c b/src/revu/rhdf5_f2c.c similarity index 100% rename from src/6.3.02/revu/rhdf5_f2c.c rename to src/revu/rhdf5_f2c.c diff --git a/src/6.3.02/revu/rhdf5_utils.f90 b/src/revu/rhdf5_utils.f90 similarity index 100% rename from src/6.3.02/revu/rhdf5_utils.f90 rename to src/revu/rhdf5_utils.f90 diff --git a/src/6.3.02/revu/textout.f90 b/src/revu/textout.f90 similarity index 98% rename from src/6.3.02/revu/textout.f90 rename to src/revu/textout.f90 index b6ea032..dbe11d7 100644 --- a/src/6.3.02/revu/textout.f90 +++ b/src/revu/textout.f90 @@ -438,10 +438,10 @@ Subroutine rams_text (a,iztrans,ivtype,nngd,n1,n2,n3,fcstsec & !3D AEROSOLS NUMBER, MASS, SIZE, SOLUBILITY - 37 variables if(len_trim(cvar).eq.13.and.cvar(1:13).eq.'ifn_concen_mg') ngem='IFNM' if(len_trim(cvar).eq.14.and.cvar(1:14).eq.'ifn_concen_cm3') ngem='IFNC' -if(len_trim(cvar).eq.13.and.cvar(1:13).eq.'ccn_concen_mg') ngem='CCNM' -if(len_trim(cvar).eq.14.and.cvar(1:14).eq.'ccn_concen_cm3') ngem='CCNC' -if(len_trim(cvar).eq.14.and.cvar(1:14).eq.'gccn_concen_mg') ngem='GCNM' -if(len_trim(cvar).eq.15.and.cvar(1:15).eq.'gccn_concen_cm3') ngem='GCNC' +if(len_trim(cvar).eq.13.and.cvar(1:14).eq.'ccn1_concen_mg') ngem='C1NM' +if(len_trim(cvar).eq.14.and.cvar(1:15).eq.'ccn1_concen_cm3') ngem='C1NC' +if(len_trim(cvar).eq.14.and.cvar(1:14).eq.'ccn2_concen_mg') ngem='C2NM' +if(len_trim(cvar).eq.15.and.cvar(1:15).eq.'ccn2_concen_cm3') ngem='C2NC' if(len_trim(cvar).eq.12.and.cvar(1:12).eq.'dust1_concen') ngem='D1CN' if(len_trim(cvar).eq.12.and.cvar(1:12).eq.'dust2_concen') ngem='D2CN' if(len_trim(cvar).eq.16.and.cvar(1:16).eq.'salt_film_concen') ngem='SFCN' @@ -449,8 +449,8 @@ Subroutine rams_text (a,iztrans,ivtype,nngd,n1,n2,n3,fcstsec & if(len_trim(cvar).eq.17.and.cvar(1:17).eq.'salt_spume_concen') ngem='SSCN' if(len_trim(cvar).eq.18.and.cvar(1:18).eq.'regen_aero1_concen') ngem='R1CN' if(len_trim(cvar).eq.18.and.cvar(1:18).eq.'regen_aero2_concen') ngem='R2CN' -if(len_trim(cvar).eq.8 .and.cvar(1:8) .eq.'ccn_mass') ngem='CCCM' -if(len_trim(cvar).eq.9 .and.cvar(1:9) .eq.'gccn_mass') ngem='GCCM' +if(len_trim(cvar).eq.8 .and.cvar(1:9) .eq.'ccn1_mass') ngem='C1CM' +if(len_trim(cvar).eq.9 .and.cvar(1:9) .eq.'ccn2_mass') ngem='C2CM' if(len_trim(cvar).eq.10.and.cvar(1:10).eq.'dust1_mass') ngem='D1CM' if(len_trim(cvar).eq.13.and.cvar(1:13).eq.'dust1_massd10') ngem='D1CM' if(len_trim(cvar).eq.10.and.cvar(1:10).eq.'dust2_mass') ngem='D2CM' @@ -464,8 +464,8 @@ Subroutine rams_text (a,iztrans,ivtype,nngd,n1,n2,n3,fcstsec & if(len_trim(cvar).eq.16.and.cvar(1:16).eq.'resol_aero2_mass') ngem='R2SM' if(len_trim(cvar).eq.14.and.cvar(1:14).eq.'regen1_epsilon') ngem='R1EP' if(len_trim(cvar).eq.14.and.cvar(1:14).eq.'regen2_epsilon') ngem='R2EP' -if(len_trim(cvar).eq.10.and.cvar(1:10).eq.'ccn_medrad') ngem='CCCR' -if(len_trim(cvar).eq.11.and.cvar(1:11).eq.'gccn_medrad') ngem='GCCR' +if(len_trim(cvar).eq.10.and.cvar(1:11).eq.'ccn1_medrad') ngem='C1CR' +if(len_trim(cvar).eq.11.and.cvar(1:11).eq.'ccn2_medrad') ngem='C2CR' if(len_trim(cvar).eq.12.and.cvar(1:12).eq.'dust1_medrad') ngem='D1CR' if(len_trim(cvar).eq.12.and.cvar(1:12).eq.'dust2_medrad') ngem='D2CR' if(len_trim(cvar).eq.16.and.cvar(1:16).eq.'salt_film_medrad') ngem='SFCR' diff --git a/src/6.3.02/revu/vplt.f90 b/src/revu/vplt.f90 similarity index 100% rename from src/6.3.02/revu/vplt.f90 rename to src/revu/vplt.f90 diff --git a/src/6.3.02/sib/sib2_co2.f90 b/src/sib/sib2_co2.f90 similarity index 100% rename from src/6.3.02/sib/sib2_co2.f90 rename to src/sib/sib2_co2.f90 diff --git a/src/6.3.02/sib/sib2_init.f90 b/src/sib/sib2_init.f90 similarity index 100% rename from src/6.3.02/sib/sib2_init.f90 rename to src/sib/sib2_init.f90 diff --git a/src/6.3.02/surface/leaf3_canopy.f90 b/src/surface/leaf3_canopy.f90 similarity index 100% rename from src/6.3.02/surface/leaf3_canopy.f90 rename to src/surface/leaf3_canopy.f90 diff --git a/src/6.3.02/surface/leaf3_init.f90 b/src/surface/leaf3_init.f90 similarity index 99% rename from src/6.3.02/surface/leaf3_init.f90 rename to src/surface/leaf3_init.f90 index 52b3574..bcd4a7e 100644 --- a/src/6.3.02/surface/leaf3_init.f90 +++ b/src/surface/leaf3_init.f90 @@ -597,7 +597,8 @@ Subroutine sfcinit_nofile (n1,n2,n3,mzg,mzs,npat,ifm & ,sfcwater_mass ,sfcwater_energy ,sfcwater_depth & ,veg_fracarea ,veg_lai ,veg_tai & ,veg_rough ,veg_height ,veg_albedo & - ,patch_area ,patch_rough ,leaf_class & + ,patch_area ,patch_rought , patch_roughm & + ,leaf_class & ,soil_rough ,sfcwater_nlev ,stom_resist & ,ground_rsat ,ground_rvap ,veg_water & ,veg_temp ,can_rvap ,can_temp & @@ -636,7 +637,7 @@ Subroutine sfcinit_nofile (n1,n2,n3,mzg,mzs,npat,ifm & real, dimension(n2,n3,npat) :: veg_fracarea ,veg_lai ,veg_tai & ,veg_rough & ,veg_height ,veg_albedo ,patch_area & - ,patch_rough ,leaf_class & + ,patch_rought, patch_roughm ,leaf_class & ,soil_rough ,sfcwater_nlev ,stom_resist & ,ground_rsat ,ground_rvap ,veg_water & ,veg_temp ,can_rvap ,can_temp & @@ -698,7 +699,8 @@ Subroutine sfcinit_nofile (n1,n2,n3,mzg,mzs,npat,ifm & airtemp = theta(2,i,j) * piv prsv = piv ** cpor * p00 - patch_rough(i,j,1) = 0.001 + patch_rought(i,j,1) = 0.001 + patch_roughm(i,j,1) = 0.001 can_temp(i,j,1) = airtemp can_rvap(i,j,1) = rv(2,i,j) @@ -711,8 +713,9 @@ Subroutine sfcinit_nofile (n1,n2,n3,mzg,mzs,npat,ifm & nveg = nint(leaf_class(i,j,ipat)) - soil_rough(i,j,ipat) = zrough - patch_rough(i,j,ipat) = max(zrough,zot(i,j)) + soil_rough(i,j,ipat) = ztrough + patch_rought(i,j,ipat) = max(ztrough,zot(i,j)) + patch_roughm(i,j,ipat) = max(zmrough,zot(i,j)) veg_height(i,j,ipat) = veg_ht(nveg) stom_resist(i,j,ipat) = 1.e6 diff --git a/src/6.3.02/surface/leaf3_prep.f90 b/src/surface/leaf3_prep.f90 similarity index 97% rename from src/6.3.02/surface/leaf3_prep.f90 rename to src/surface/leaf3_prep.f90 index 0f8b990..0726ec0 100644 --- a/src/6.3.02/surface/leaf3_prep.f90 +++ b/src/surface/leaf3_prep.f90 @@ -257,9 +257,11 @@ Subroutine sfcrad (mzg,mzs,ip & rlongup = rlongup + patch_area * stefan * tempk(mzg) ** 4 elseif (isfcl == 0) then - +!Adele - soil/water emissivity is set to 0.98 in LEAF for all soil types +!Let's continue to use 0.98 even if ISFCL = 0 albedt = albedt + patch_area * albedo - rlongup = rlongup + patch_area * stefan * can_temp ** 4 + rlongup = rlongup + 0.98 * patch_area * stefan * can_temp ** 4 & + + 0.02 * patch_area * rlong else diff --git a/src/6.3.02/surface/leaf3_slayer.f90 b/src/surface/leaf3_slayer.f90 similarity index 85% rename from src/6.3.02/surface/leaf3_slayer.f90 rename to src/surface/leaf3_slayer.f90 index 6553547..e1b18e0 100644 --- a/src/6.3.02/surface/leaf3_slayer.f90 +++ b/src/surface/leaf3_slayer.f90 @@ -1,13 +1,13 @@ !############################################################################## -Subroutine stars (ustar,tstar,rstar,ths,rvs,thetacan,can_rvap,zts,patch_rough & - ,vels_pat,dtllohcc,dens,dtll) +Subroutine stars (ustar,tstar,rstar,ths,rvs,thetacan,can_rvap,zts,patch_rought & + ,patch_roughm,vels_pat,dtllohcc,dens,dtll) use rconstants implicit none -real :: ustar,tstar,rstar,ths,rvs,thetacan,can_rvap,zts,patch_rough & - ,vels_pat,dtllohcc,dens,dtll +real :: ustar,tstar,rstar,ths,rvs,thetacan,can_rvap,zts,patch_rought & + ,patch_roughm,vels_pat,dtllohcc,dens,dtll real :: b,csm,csh,d,a2,c1,ri,fm,fh,c2,cm,ch,c3 real :: d_vel,d_veln,vel_new,delz,tstaro,d_theta,d_thetan,theta_new real, parameter :: ustmin = .1 @@ -25,23 +25,35 @@ Subroutine stars (ustar,tstar,rstar,ths,rvs,thetacan,can_rvap,zts,patch_rough & ! However, a2*fm, a2*fh appear to be what Louis(1981) calls drag ! or transfer coefficients. -a2 = (vonk / log(zts / patch_rough)) ** 2 +! Adele - calculate ustar with zm +a2 = (vonk / log(zts / patch_roughm)) ** 2 c1 = a2 * vels_pat ri = 9.8 * zts * (ths - thetacan) & / (.5 * (ths + thetacan) * vels_pat * vels_pat) if (ths - thetacan > 0.) then ! STABLE CASE fm = 1. / (1. + (2 * b * ri / sqrt(1 + d * ri))) - fh = 1. / (1. + (3 * b * ri * sqrt(1 + d * ri))) else ! UNSTABLE CASE - c2 = b * a2 * sqrt(zts / patch_rough * (abs(ri))) + c2 = b * a2 * sqrt(zts / patch_roughm * (abs(ri))) cm = csm * c2 - ch = csh * c2 fm = (1. - 2 * b * ri / (1. + 2 * cm)) +endif +ustar = max(ustmin,sqrt(c1 * vels_pat * fm)) + +! Adele - calculate other stars with zt +a2 = (vonk / log(zts / patch_rought)) ** 2 +c1 = a2 * vels_pat +ri = 9.8 * zts * (ths - thetacan) & + / (.5 * (ths + thetacan) * vels_pat * vels_pat) + +if (ths - thetacan > 0.) then ! STABLE CASE + fh = 1. / (1. + (3 * b * ri * sqrt(1 + d * ri))) +else ! UNSTABLE CASE + c2 = b * a2 * sqrt(zts / patch_rought * (abs(ri))) + ch = csh * c2 fh = (1. - 3 * b * ri / (1. + 3 * ch)) endif -ustar = max(ustmin,sqrt(c1 * vels_pat * fm)) c3 = c1 * fh / ustar rstar = c3 * (rvs - can_rvap) tstar = c3 * (ths - thetacan) diff --git a/src/6.3.02/surface/leaf3_soilveg.f90 b/src/surface/leaf3_soilveg.f90 similarity index 100% rename from src/6.3.02/surface/leaf3_soilveg.f90 rename to src/surface/leaf3_soilveg.f90 diff --git a/src/6.3.02/surface/leaf_coms.f90 b/src/surface/leaf_coms.f90 similarity index 97% rename from src/6.3.02/surface/leaf_coms.f90 rename to src/surface/leaf_coms.f90 index d6f8528..571b1c8 100644 --- a/src/6.3.02/surface/leaf_coms.f90 +++ b/src/surface/leaf_coms.f90 @@ -8,7 +8,8 @@ Module leaf_coms integer :: & niter_leaf & ! number of leaf timesteps in model long timestep ,niter_can & ! number of canopy timesteps in leaf timestep - ,ifreeslip ! flag for freeslip surface BC (set sflux to zero) + ,ifreeslip & ! flag for freeslip surface BC (set sflux to zero) + ,icharnock ! flag to use Charnock ocean roughness parameterization real :: & dtll & ! leaf timestep diff --git a/src/6.3.02/surface/ruser.f90 b/src/surface/ruser.f90 similarity index 98% rename from src/6.3.02/surface/ruser.f90 rename to src/surface/ruser.f90 index 3beed2c..078769e 100644 --- a/src/6.3.02/surface/ruser.f90 +++ b/src/surface/ruser.f90 @@ -199,7 +199,8 @@ Subroutine sfcinit_nofile_user (n1,n2,n3,mzg,mzs,npat,ifm & ,sfcwater_mass ,sfcwater_energy ,sfcwater_depth & ,veg_fracarea ,veg_lai ,veg_tai & ,veg_rough ,veg_height ,veg_albedo & - ,patch_area ,patch_rough ,leaf_class & + ,patch_area ,patch_rought ,patch_roughm & + ,leaf_class & ,soil_rough ,sfcwater_nlev ,stom_resist & ,ground_rsat ,ground_rvap ,veg_water & ,veg_temp ,can_rvap ,can_temp & @@ -238,7 +239,7 @@ Subroutine sfcinit_nofile_user (n1,n2,n3,mzg,mzs,npat,ifm & real, dimension(n2,n3,npat) :: veg_fracarea ,veg_lai ,veg_tai & ,veg_rough & ,veg_height ,veg_albedo ,patch_area & - ,patch_rough ,leaf_class & + ,patch_rought ,patch_roughm ,leaf_class & ,soil_rough ,sfcwater_nlev ,stom_resist & ,ground_rsat ,ground_rvap ,veg_water & ,veg_temp ,can_rvap ,can_temp & @@ -307,7 +308,8 @@ Subroutine sfcinit_nofile_user (n1,n2,n3,mzg,mzs,npat,ifm & airtemp = theta(2,i,j) * piv prsv = piv ** cpor * p00 - patch_rough(i,j,1) = 0.001 + patch_rought(i,j,1) = 0.001 + patch_roughm(i,j,1) = 0.001 can_temp(i,j,1) = airtemp can_rvap(i,j,1) = rv(2,i,j) @@ -320,8 +322,9 @@ Subroutine sfcinit_nofile_user (n1,n2,n3,mzg,mzs,npat,ifm & nveg = nint(leaf_class(i,j,ipat)) - soil_rough(i,j,ipat) = zrough - patch_rough(i,j,ipat) = max(zrough,zot(i,j)) + soil_rough(i,j,ipat) = ztrough + patch_rought(i,j,ipat) = max(ztrough,zot(i,j)) + patch_roughm(i,j,ipat) = max(zmrough,zot(i,j)) veg_rough(i,j,ipat) = .13 * veg_ht(nveg) veg_height(i,j,ipat) = veg_ht(nveg) diff --git a/src/6.3.02/surface/sfc_driver.f90 b/src/surface/sfc_driver.f90 similarity index 91% rename from src/6.3.02/surface/sfc_driver.f90 rename to src/surface/sfc_driver.f90 index bf3e24a..24bd5bd 100644 --- a/src/6.3.02/surface/sfc_driver.f90 +++ b/src/surface/sfc_driver.f90 @@ -2,6 +2,7 @@ Subroutine sfc_driver (mzp,mxp,myp,ia,iz,ja,jz) use mem_all +use rconstants implicit none @@ -13,9 +14,19 @@ Subroutine sfc_driver (mzp,mxp,myp,ia,iz,ja,jz) ng=ngrid -CALL leaf3_sib (mzp,mxp,myp,nzg,nzs,npatch,ia,iz,ja,jz & - ,leaf_g (ng), basic_g (ng), turb_g (ng), radiate_g(ng) & - ,grid_g (ng), cuparm_g(ng), micro_g(ng), sib_g(ng)) +if (isfcl <=2 ) then + CALL leaf3_sib (mzp,mxp,myp,nzg,nzs,npatch,ia,iz,ja,jz & + ,leaf_g (ng), basic_g (ng), turb_g (ng), radiate_g(ng) & + ,grid_g (ng), cuparm_g(ng), micro_g(ng), sib_g(ng)) +else + radiate_g(ng)%albedt(:,:) = albedo + radiate_g(ng)%rlongup(:,:) = 0.98 * stefan * seatmp**4. + 0.02 * radiate_g(ng)%rlong(:,:) + turb_g(ng)%sflux_u(:,:) = 0. + turb_g(ng)%sflux_v(:,:) = 0. + turb_g(ng)%sflux_w(:,:) = 0. + turb_g(ng)%sflux_t(:,:) = dthcon/cp + turb_g(ng)%sflux_r(:,:) = drtcon/alvl +endif return END SUBROUTINE sfc_driver @@ -27,6 +38,7 @@ Subroutine leaf3_sib (m1,m2,m3,mzg,mzs,np,ia,iz,ja,jz & use mem_all use leaf_coms use rconstants +use ref_sounding, only:forc_time, forc_ts implicit none @@ -45,6 +57,8 @@ Subroutine leaf3_sib (m1,m2,m3,mzg,mzs,np,ia,iz,ja,jz & integer :: i,j,ip,iter_leaf,runstars integer :: jday,oyr,omn,ody,otm integer, external :: julday +integer :: it1, it2 !only for iupdsst = 2 +real :: newsst !only for iupdsst = 2 real,external :: rslif ! SIB2 - temporary diagnostic/output SIB2 variables @@ -62,8 +76,19 @@ Subroutine leaf3_sib (m1,m2,m3,mzg,mzs,np,ia,iz,ja,jz & ! Time interpolation factor for updating SST if (iupdsst == 0) then timefac_sst = 0. -else +elseif (iupdsst == 1) then timefac_sst = (time-ssttime1(ngrid)) / (ssttime2(ngrid)-ssttime1(ngrid)) +else + it1 = findloc(time-forc_time >= 0, .TRUE., DIM=1, BACK=.TRUE.) + if (time - forc_time(it1) == 0.) then + newsst = forc_ts(it1) - 273.15 + else + it2 = it1 + 1 + if (it2>size(forc_time)) stop "No future SST for IUPDSST = 2" + timefac_sst = (time - forc_time(it1))/(forc_time(it2)-forc_time(it1)) + newsst = forc_ts(it1) + (forc_ts(it2) - forc_ts(it1)) * timefac_sst + newsst = newsst - 273.15 + endif endif ! Define LEAF3 and canopy time-split timesteps here. This ensures that LEAF3 @@ -130,10 +155,14 @@ Subroutine leaf3_sib (m1,m2,m3,mzg,mzs,np,ia,iz,ja,jz & ! If KPP is running, then KPP will update the SST / water-internal-energy. ! Note however that KPP may not be run every timestep and thus may only ! update SST/water-internal-energy at its timesteps. - if(IKPP==0)then - leaf%soil_energy(mzg,i,j,1) = 334000. & - + 4186. * (leaf%seatp(i,j) + (leaf%seatf(i,j) - leaf%seatp(i,j)) & - * timefac_sst - 273.15) + if (IKPP==0)then + if (iupdsst<=1) then + leaf%soil_energy(mzg,i,j,1) = 334000. & + + 4186. * (leaf%seatp(i,j) + (leaf%seatf(i,j) - leaf%seatp(i,j)) & + * timefac_sst - 273.15) + else + leaf%soil_energy(mzg,i,j,1) = 334000. + 4186. * newsst + endif endif ! Fill surface precipitation arrays for input @@ -232,16 +261,26 @@ Subroutine leaf3_sib (m1,m2,m3,mzg,mzs,np,ia,iz,ja,jz & if (ip == 1) then leaf%ground_rsat(i,j,ip) = rslif(prss,tempk(mzg)) - leaf%patch_rough(i,j,ip) & + if (ip == 1 .and. icharnock == 1) then + leaf%patch_rought(i,j,ip) & = max(z0fac_water * leaf%ustar(i,j,ip) ** 2,.0001) - + leaf%patch_roughm(i,j,ip) & + = max(z0fac_water * leaf%ustar(i,j,ip) ** 2,.0001) + else + leaf%patch_rought(i,j,ip) = ztrough + leaf%patch_roughm(i,j,ip) = zmrough + endif elseif (isfcl>=1) then if(isfcl==2) snowfac = & min(.99, leaf%sfcwater_depth(1,i,j,ip) / max(.001,leaf%veg_height(i,j,ip))) if (leaf%patch_area(i,j,ip) >= .009) then - leaf%patch_rough(i,j,ip) & + leaf%patch_rought(i,j,ip) & + = max(grid%topzo(i,j),leaf%soil_rough(i,j,ip) & + ,leaf%veg_rough(i,j,ip)) * (1. - snowfac) & + + snowrough * snowfac + leaf%patch_roughm(i,j,ip) & = max(grid%topzo(i,j),leaf%soil_rough(i,j,ip) & ,leaf%veg_rough(i,j,ip)) * (1. - snowfac) & + snowrough * snowfac @@ -288,7 +327,8 @@ Subroutine leaf3_sib (m1,m2,m3,mzg,mzs,np,ia,iz,ja,jz & if(runstars==1) & CALL stars (leaf%ustar(i,j,ip),leaf%tstar(i,j,ip) & ,leaf%rstar(i,j,ip),ths,rvs,thetacan,leaf%can_rvap(i,j,ip) & - ,zts,leaf%patch_rough(i,j,ip),vels_pat,dtllohcc,dens,dtlt) + ,zts,leaf%patch_rought(i,j,ip),leaf%patch_roughm(i,j,ip) & + ,vels_pat,dtllohcc,dens,dtlt) ! For water patches, update temperature and moisture of "canopy" from ! divergence of fluxes with water surface and atmosphere. rdi = ustar/5 diff --git a/src/6.3.02/turb/rgrad.f90 b/src/turb/rgrad.f90 similarity index 100% rename from src/6.3.02/turb/rgrad.f90 rename to src/turb/rgrad.f90 diff --git a/src/6.3.02/turb/turb_diff.f90 b/src/turb/turb_diff.f90 similarity index 100% rename from src/6.3.02/turb/turb_diff.f90 rename to src/turb/turb_diff.f90 diff --git a/src/6.3.02/turb/turb_k.f90 b/src/turb/turb_k.f90 similarity index 100% rename from src/6.3.02/turb/turb_k.f90 rename to src/turb/turb_k.f90 diff --git a/src/6.3.02/turb/turb_ke.f90 b/src/turb/turb_ke.f90 similarity index 100% rename from src/6.3.02/turb/turb_ke.f90 rename to src/turb/turb_ke.f90