From f0bc9dd3f6f8f2db452c2c05e0ff73a0dcbc8837 Mon Sep 17 00:00:00 2001 From: Grant Firl Date: Fri, 4 Mar 2022 19:15:16 -0700 Subject: [PATCH 1/8] update scm_vgrid from fv_eta --- scm/src/CMakeLists.txt | 3 +- scm/src/fv_eta.h | 984 +++++++++++++++ scm/src/scm_type_defs.F90 | 4 +- scm/src/scm_vgrid.F90 | 2400 ++++++++++++++++--------------------- 4 files changed, 2049 insertions(+), 1342 deletions(-) create mode 100644 scm/src/fv_eta.h diff --git a/scm/src/CMakeLists.txt b/scm/src/CMakeLists.txt index 6c3f24940..c10e992c3 100644 --- a/scm/src/CMakeLists.txt +++ b/scm/src/CMakeLists.txt @@ -145,8 +145,7 @@ ADD_DEFINITIONS(-DSCM) #------------------------------------------------------------------------------ # Add model-specific flags for C/C++/Fortran preprocessor -#ADD_DEFINITIONS(-DMOIST_CAPPA -DUSE_COND -DNEMS_GSM) -ADD_DEFINITIONS(-DMOIST_CAPPA -DUSE_COND -DNEMS_GSM -DGFSL64) # add GFSL64 to use correct GFS ak and bks +ADD_DEFINITIONS(-DMOIST_CAPPA -DUSE_COND -DNEMS_GSM) #ADD_DEFINITIONS(-DINTERNAL_FILE_NML) #------------------------------------------------------------------------------ diff --git a/scm/src/fv_eta.h b/scm/src/fv_eta.h new file mode 100644 index 000000000..7df22b11b --- /dev/null +++ b/scm/src/fv_eta.h @@ -0,0 +1,984 @@ +!*********************************************************************** +!* GNU Lesser General Public License +!* +!* This file is part of the FV3 dynamical core. +!* +!* The FV3 dynamical core is free software: you can redistribute it +!* and/or modify it under the terms of the +!* GNU Lesser General Public License as published by the +!* Free Software Foundation, either version 3 of the License, or +!* (at your option) any later version. +!* +!* The FV3 dynamical core is distributed in the hope that it will be +!* useful, but WITHOUT ANYWARRANTY; without even the implied warranty +!* of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +!* See the GNU General Public License for more details. +!* +!* You should have received a copy of the GNU Lesser General Public +!* License along with the FV3 dynamical core. +!* If not, see . +!*********************************************************************** +#ifndef _FV_ETA_ +#define _FV_ETA__ + +! -*-f90-*-* + +! local + real a24(25),b24(25) ! GFDL AM2L24 + real a26(27),b26(27) ! Jablonowski & Williamson 26-level + real a32old(33),b32old(33) + real a32(33),b32(33) + real a32w(33),b32w(33) + real a33(34),b33(34) ! miz: grid with enhanced surface-layer resolution + real a47(48),b47(48) + real a48(49),b48(49) + real a50(51),b50(51) ! kyc: HRRRv3 grid + real a52(53),b52(53) + real a54(55),b54(55) + real a56(57),b56(57) + real a60(61),b60(61) + real a60gfs(61),b60gfs(61) + real a63(64),b63(64) + real a63meso(64),b63meso(64) + real a64(65),b64(65) + real a64gfs(65),b64gfs(65) + real a68(69),b68(69) ! cjg: grid with enhanced PBL resolution + real a96(97),b96(97) ! cjg: grid with enhanced PBL resolution + real a100(101),b100(101) + real a104(105),b104(105) + real a125(126),b125(126) + +!----------------------------------------------- +! GFDL AM2-L24: modified by SJL at the model top +!----------------------------------------------- +! data a24 / 100.0000, 1050.0000, 3474.7942, 7505.5556, 12787.2428, & + data a24 / 100.0000, 903.4465, 3474.7942, 7505.5556, 12787.2428, & + 19111.3683, 21854.9274, 22884.1866, 22776.3058, 21716.1604, & + 20073.2963, 18110.5123, 16004.7832, 13877.6253, 11812.5452, & + 9865.8840, 8073.9726, 6458.0834, 5027.9899, 3784.6085, & + 2722.0086, 1828.9752, 1090.2396, 487.4595, 0.0000 / + + data b24 / 0.0000000, 0.0000000, 0.0000000, 0.0000000, 0.0000000, & + 0.0000000, 0.0435679, 0.1102275, 0.1922249, 0.2817656, & + 0.3694997, 0.4532348, 0.5316253, 0.6038733, 0.6695556, & + 0.7285176, 0.7808017, 0.8265992, 0.8662148, 0.9000406, & + 0.9285364, 0.9522140, 0.9716252, 0.9873523, 1.0000000 / + +! Jablonowski & Williamson 26-level setup + data a26 / 219.4067, 489.5209, 988.2418, 1805.2010, 2983.7240, 4462.3340, & + 6160.5870, 7851.2430, 7731.2710, 7590.1310, 7424.0860, & + 7228.7440, 6998.9330, 6728.5740, 6410.5090, 6036.3220, & + 5596.1110, 5078.2250, 4468.9600, 3752.1910, 2908.9490, & + 2084.739, 1334.443, 708.499, 252.1360, 0.0, 0.0 / + + data b26 / 0.0, 0.0, 0.0000000, 0.0000000, 0.0000000, 0.0000000, 0.0000000,& + 0.0000000, 0.01505309, 0.03276228, 0.05359622, 0.07810627, & + 0.1069411, 0.1408637, 0.1807720, 0.2277220, 0.2829562, & + 0.3479364, 0.4243822, 0.5143168, 0.6201202, 0.7235355, & + 0.8176768, 0.8962153, 0.9534761, 0.9851122, 1.0000000 / + + +! High-resolution troposphere setup +! Revised Apr 14, 2004: PINT = 245.027 mb + data a32old/100.00000, 400.00000, 818.60211, & + 1378.88653, 2091.79519, 2983.64084, & + 4121.78960, 5579.22148, 7419.79300, & + 9704.82578, 12496.33710, 15855.26306, & + 19839.62499, 24502.73262, 28177.10152, & + 29525.28447, 29016.34358, 27131.32792, & + 24406.11225, 21326.04907, 18221.18357, & + 15275.14642, 12581.67796, 10181.42843, & + 8081.89816, 6270.86956, 4725.35001, & + 3417.39199, 2317.75459, 1398.09473, & + 632.49506, 0.00000, 0.00000 / + + data b32old/0.00000, 0.00000, 0.00000, & + 0.00000, 0.00000, 0.00000, & + 0.00000, 0.00000, 0.00000, & + 0.00000, 0.00000, 0.00000, & + 0.00000, 0.00000, 0.01711, & + 0.06479, 0.13730, 0.22693, & + 0.32416, 0.42058, 0.51105, & + 0.59325, 0.66628, 0.73011, & + 0.78516, 0.83217, 0.87197, & + 0.90546, 0.93349, 0.95685, & + 0.97624, 0.99223, 1.00000 / + +! SJL June 26, 2012 +! pint= 55.7922 + data a32/100.00000, 400.00000, 818.60211, & + 1378.88653, 2091.79519, 2983.64084, & + 4121.78960, 5579.22148, 6907.19063, & + 7735.78639, 8197.66476, 8377.95525, & + 8331.69594, 8094.72213, 7690.85756, & + 7139.01788, 6464.80251, 5712.35727, & + 4940.05347, 4198.60465, 3516.63294, & + 2905.19863, 2366.73733, 1899.19455, & + 1497.78137, 1156.25252, 867.79199, & + 625.59324, 423.21322, 254.76613, & + 115.06646, 0.00000, 0.00000 / + + data b32/0.00000, 0.00000, 0.00000, & + 0.00000, 0.00000, 0.00000, & + 0.00000, 0.00000, 0.00513, & + 0.01969, 0.04299, 0.07477, & + 0.11508, 0.16408, 0.22198, & + 0.28865, 0.36281, 0.44112, & + 0.51882, 0.59185, 0.65810, & + 0.71694, 0.76843, 0.81293, & + 0.85100, 0.88331, 0.91055, & + 0.93338, 0.95244, 0.96828, & + 0.98142, 0.99223, 1.00000 / + +!--------------------- +! Wilson's 32L settings: +!--------------------- +! Top changed to 0.01 mb + data a32w/ 1.00, 26.6378, 84.5529, 228.8592, & + 539.9597, 1131.7087, 2141.8082, 3712.0454, & + 5963.5317, 8974.1873, 12764.5388, 17294.5911, & + 20857.7007, 22221.8651, 22892.7202, 22891.1641, & + 22286.0724, 21176.0846, 19673.0671, 17889.0989, & + 15927.5060, 13877.6239, 11812.5474, 9865.8830, & + 8073.9717, 6458.0824, 5027.9893, 3784.6104, & + 2722.0093, 1828.9741, 1090.2397, 487.4575, & + 0.0000 / + + data b32w/ 0.0000, 0.0000, 0.0000, 0.0000, & + 0.0000, 0.0000, 0.0000, 0.0000, & + 0.0000, 0.0000, 0.0000, 0.0000, & + 0.0159, 0.0586, 0.1117, 0.1734, & + 0.2415, 0.3137, 0.3878, 0.4619, & + 0.5344, 0.6039, 0.6696, 0.7285, & + 0.7808, 0.8266, 0.8662, 0.9000, & + 0.9285, 0.9522, 0.9716, 0.9874, & + 1.0000 / + +!miz + data a33/100.00000, 400.00000, 818.60211, & + 1378.88653, 2091.79519, 2983.64084, & + 4121.78960, 5579.22148, 6907.19063, & + 7735.78639, 8197.66476, 8377.95525, & + 8331.69594, 8094.72213, 7690.85756, & + 7139.01788, 6464.80251, 5712.35727, & + 4940.05347, 4198.60465, 3516.63294, & + 2905.19863, 2366.73733, 1899.19455, & + 1497.78137, 1156.25252, 867.79199, & + 625.59324, 426.21322, 264.76613, & + 145.06646, 60.00000, 15.00000, & + 0.00000 / + + data b33/0.00000, 0.00000, 0.00000, & + 0.00000, 0.00000, 0.00000, & + 0.00000, 0.00000, 0.00513, & + 0.01969, 0.04299, 0.07477, & + 0.11508, 0.16408, 0.22198, & + 0.28865, 0.36281, 0.44112, & + 0.51882, 0.59185, 0.65810, & + 0.71694, 0.76843, 0.81293, & + 0.85100, 0.88331, 0.91055, & + 0.93331, 0.95214, 0.96750, & + 0.97968, 0.98908, 0.99575, & + 1.00000 / +!miz +#ifdef OLD_L47 +! QBO setting with ptop = 0.1 mb and p_full=0.17 mb; pint ~ 100 mb + data a47/ 10.00000, 24.45365, 48.76776, & + 85.39458, 133.41983, 191.01402, & + 257.94919, 336.63306, 431.52741, & + 548.18995, 692.78825, 872.16512, & + 1094.18467, 1368.11917, 1704.99489, & + 2117.91945, 2622.42986, 3236.88281, & + 3982.89623, 4885.84733, 5975.43260, & + 7286.29500, 8858.72424, 10739.43477, & + 12982.41110, 15649.68745, 18811.37629, & + 22542.71275, 25724.93857, 27314.36781, & + 27498.59474, 26501.79312, 24605.92991, & + 22130.51655, 19381.30274, 16601.56419, & + 13952.53231, 11522.93244, 9350.82303, & + 7443.47723, 5790.77434, 4373.32696, & + 3167.47008, 2148.51663, 1293.15510, & + 581.62429, 0.00000, 0.00000 / + + data b47/ 0.0000, 0.0000, 0.0000, & + 0.00000, 0.00000, 0.00000, & + 0.00000, 0.00000, 0.00000, & + 0.00000, 0.00000, 0.00000, & + 0.00000, 0.00000, 0.00000, & + 0.00000, 0.00000, 0.00000, & + 0.00000, 0.00000, 0.00000, & + 0.00000, 0.00000, 0.00000, & + 0.00000, 0.00000, 0.00000, & + 0.00000, 0.01188, 0.04650, & + 0.10170, 0.17401, 0.25832, & + 0.34850, 0.43872, 0.52448, & + 0.60307, 0.67328, 0.73492, & + 0.78834, 0.83418, 0.87320, & + 0.90622, 0.93399, 0.95723, & + 0.97650, 0.99223, 1.00000 / +#else +! Oct 23, 2012 +! QBO setting with ptop = 0.1 mb, pint ~ 60 mb + data a47/ 10.00000, 24.45365, 48.76776, & + 85.39458, 133.41983, 191.01402, & + 257.94919, 336.63306, 431.52741, & + 548.18995, 692.78825, 872.16512, & + 1094.18467, 1368.11917, 1704.99489, & + 2117.91945, 2622.42986, 3236.88281, & + 3982.89623, 4885.84733, 5975.43260, & + 7019.26669, 7796.15848, 8346.60209, & + 8700.31838, 8878.27554, 8894.27179, & + 8756.46404, 8469.60171, 8038.92687, & + 7475.89006, 6803.68067, 6058.68992, & + 5285.28859, 4526.01565, 3813.00206, & + 3164.95553, 2589.26318, 2085.96929, & + 1651.11596, 1278.81205, 962.38875, & + 695.07046, 470.40784, 282.61654, & + 126.92745, 0.00000, 0.00000 / + data b47/ 0.0000, 0.0000, 0.0000, & + 0.00000, 0.00000, 0.00000, & + 0.00000, 0.00000, 0.00000, & + 0.00000, 0.00000, 0.00000, & + 0.00000, 0.00000, 0.00000, & + 0.00000, 0.00000, 0.00000, & + 0.00000, 0.00000, 0.00000, & + 0.00267, 0.01063, 0.02393, & + 0.04282, 0.06771, 0.09917, & + 0.13786, 0.18444, 0.23925, & + 0.30193, 0.37100, 0.44379, & + 0.51695, 0.58727, 0.65236, & + 0.71094, 0.76262, 0.80757, & + 0.84626, 0.87930, 0.90731, & + 0.93094, 0.95077, 0.96733, & + 0.98105, 0.99223, 1.00000 / +#endif + + data a48/ & + 1.00000, 2.69722, 5.17136, & + 8.89455, 14.24790, 22.07157, & + 33.61283, 50.48096, 74.79993, & + 109.40055, 158.00460, 225.44108, & + 317.89560, 443.19350, 611.11558, & + 833.74392, 1125.83405, 1505.20759, & + 1993.15829, 2614.86254, 3399.78420, & + 4382.06240, 5600.87014, 7100.73115, & + 8931.78242, 11149.97021, 13817.16841, & + 17001.20930, 20775.81856, 23967.33875, & + 25527.64563, 25671.22552, 24609.29622, & + 22640.51220, 20147.13482, 17477.63530, & + 14859.86462, 12414.92533, 10201.44191, & + 8241.50255, 6534.43202, 5066.17865, & + 3815.60705, 2758.60264, 1870.64631, & + 1128.33931, 510.47983, 0.00000, & + 0.00000 / + + data b48/ & + 0.00000, 0.00000, 0.00000, & + 0.00000, 0.00000, 0.00000, & + 0.00000, 0.00000, 0.00000, & + 0.00000, 0.00000, 0.00000, & + 0.00000, 0.00000, 0.00000, & + 0.00000, 0.00000, 0.00000, & + 0.00000, 0.00000, 0.00000, & + 0.00000, 0.00000, 0.00000, & + 0.00000, 0.00000, 0.00000, & + 0.00000, 0.00000, 0.01253, & + 0.04887, 0.10724, 0.18455, & + 0.27461, 0.36914, 0.46103, & + 0.54623, 0.62305, 0.69099, & + 0.75016, 0.80110, 0.84453, & + 0.88127, 0.91217, 0.93803, & + 0.95958, 0.97747, 0.99223, & + 1.00000 / + +! KYC: HRRRv3 vertical coordinate + + data a50/ 2.00000000e+03, 2.46060000e+03, 2.95060000e+03, & + 3.47980000e+03, 4.04820000e+03, 4.65580000e+03, & + 5.30260000e+03, 6.00820000e+03, 6.76280000e+03, & + 7.56640000e+03, 8.43860000e+03, 9.62440000e+03, & + 1.10062000e+04, 1.23880000e+04, 1.37698000e+04, & + 1.51516000e+04, 1.65334000e+04, 1.79152000e+04, & + 1.92970000e+04, 2.06788000e+04, 2.20530309e+04, & + 2.33224623e+04, 2.44604680e+04, 2.56437194e+04, & + 2.66933976e+04, 2.76478977e+04, 2.84633440e+04, & + 2.90796820e+04, 2.94284494e+04, 2.94337456e+04, & + 2.90084684e+04, 2.80761591e+04, 2.65243296e+04, & + 2.42850206e+04, 2.13118800e+04, 1.81350000e+04, & + 1.50098730e+04, 1.20805273e+04, 9.44285062e+03, & + 7.15256437e+03, 5.23262695e+03, 3.68006836e+03, & + 2.47225500e+03, 1.57258500e+03, 8.82770078e+02, & + 4.33565391e+02, 1.83056641e+02, 6.24538281e+01, & + 1.98243750e+01, 4.87312500e+00, 0.00000000e+00 / + + data b50/ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, & + 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, & + 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, & + 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, & + 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, & + 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, & + 0.00000000e+00, 0.00000000e+00, 7.56910398e-05, & + 1.19937655e-03, 3.63732042e-03, 8.17080640e-03, & + 1.47260242e-02, 2.40950227e-02, 3.70105596e-02, & + 5.42691797e-02, 7.67515062e-02, 1.05608544e-01, & + 1.42005316e-01, 1.86608409e-01, 2.41816704e-01, & + 3.08309794e-01, 3.87041200e-01, 4.65850000e-01, & + 5.41201270e-01, 6.11654727e-01, 6.76251494e-01, & + 7.34434356e-01, 7.85973730e-01, 8.30899316e-01, & + 8.69437450e-01, 9.01954150e-01, 9.31392299e-01, & + 9.55484346e-01, 9.73669434e-01, 9.86635462e-01, & + 9.93921756e-01, 9.97991269e-01, 1.00000000e+00 / + +! High PBL resolution with top at 1 mb +! SJL modified May 7, 2013 to ptop ~ 100 mb + data a54/100.00000, 254.83931, 729.54278, & + 1602.41121, 2797.50667, 4100.18977, & + 5334.87140, 6455.24153, 7511.80944, & + 8580.26355, 9714.44293, 10938.62253, & + 12080.36051, 12987.13921, 13692.75084, & + 14224.92180, 14606.55444, 14856.69953, & + 14991.32121, 15023.90075, 14965.91493, & + 14827.21612, 14616.33505, 14340.72252, & + 14006.94280, 13620.82849, 13187.60470, & + 12711.98873, 12198.27003, 11650.37451, & + 11071.91608, 10466.23819, 9836.44706, & + 9185.43852, 8515.96231, 7831.01080, & + 7135.14301, 6436.71659, 5749.00215, & + 5087.67188, 4465.67510, 3889.86419, & + 3361.63433, 2879.51065, 2441.02496, & + 2043.41345, 1683.80513, 1359.31122, & + 1067.09135, 804.40101, 568.62625, & + 357.32525, 168.33263, 0.00000, & + 0.00000 / + + data b54/0.00000, 0.00000, 0.00000, & + 0.00000, 0.00000, 0.00000, & + 0.00000, 0.00000, 0.00000, & + 0.00000, 0.00000, 0.00000, & + 0.00180, 0.00694, 0.01510, & + 0.02601, 0.03942, 0.05515, & + 0.07302, 0.09288, 0.11459, & + 0.13803, 0.16307, 0.18960, & + 0.21753, 0.24675, 0.27716, & + 0.30866, 0.34115, 0.37456, & + 0.40879, 0.44375, 0.47935, & + 0.51551, 0.55215, 0.58916, & + 0.62636, 0.66334, 0.69946, & + 0.73395, 0.76622, 0.79594, & + 0.82309, 0.84780, 0.87020, & + 0.89047, 0.90876, 0.92524, & + 0.94006, 0.95336, 0.96529, & + 0.97596, 0.98551, 0.99400, & + 1.00000 / + + +! The 56-L setup + data a56/ 10.00000, 24.97818, 58.01160, & + 115.21466, 199.29210, 309.39897, & + 445.31785, 610.54747, 812.28518, & + 1059.80882, 1363.07092, 1732.09335, & + 2176.91502, 2707.68972, 3334.70962, & + 4068.31964, 4918.76594, 5896.01890, & + 7009.59166, 8268.36324, 9680.41211, & + 11252.86491, 12991.76409, 14901.95764, & + 16987.01313, 19249.15733, 21689.24182, & + 23845.11055, 25330.63353, 26243.52467, & + 26663.84998, 26657.94696, 26281.61371, & + 25583.05256, 24606.03265, 23393.39510, & + 21990.28845, 20445.82122, 18811.93894, & + 17139.59660, 15473.90350, 13850.50167, & + 12294.49060, 10821.62655, 9440.57746, & + 8155.11214, 6965.72496, 5870.70511, & + 4866.83822, 3949.90019, 3115.03562, & + 2357.07879, 1670.87329, 1051.65120, & + 495.51399, 0.00000, 0.00000 / + + data b56 /0.00000, 0.00000, 0.00000, & + 0.00000, 0.00000, 0.00000, & + 0.00000, 0.00000, 0.00000, & + 0.00000, 0.00000, 0.00000, & + 0.00000, 0.00000, 0.00000, & + 0.00000, 0.00000, 0.00000, & + 0.00000, 0.00000, 0.00000, & + 0.00000, 0.00000, 0.00000, & + 0.00000, 0.00000, 0.00000, & + 0.00462, 0.01769, 0.03821, & + 0.06534, 0.09834, 0.13659, & + 0.17947, 0.22637, 0.27660, & + 0.32929, 0.38343, 0.43791, & + 0.49162, 0.54361, 0.59319, & + 0.63989, 0.68348, 0.72391, & + 0.76121, 0.79545, 0.82679, & + 0.85537, 0.88135, 0.90493, & + 0.92626, 0.94552, 0.96286, & + 0.97840, 0.99223, 1.00000 / + + data a60gfs/300.0000, 430.00000, 558.00000, & + 700.00000, 863.05803, 1051.07995, & + 1265.75194, 1510.71101, 1790.05098, & + 2108.36604, 2470.78817, 2883.03811, & + 3351.46002, 3883.05187, 4485.49315, & + 5167.14603, 5937.04991, 6804.87379, & + 7780.84698, 8875.64338, 10100.20534, & + 11264.35673, 12190.64366, 12905.42546, & + 13430.87867, 13785.88765, 13986.77987, & + 14047.96335, 13982.46770, 13802.40331, & + 13519.33841, 13144.59486, 12689.45608, & + 12165.28766, 11583.57006, 10955.84778, & + 10293.60402, 9608.08306, 8910.07678, & + 8209.70131, 7516.18560, 6837.69250, & + 6181.19473, 5552.39653, 4955.72632, & + 4394.37629, 3870.38682, 3384.76586, & + 2937.63489, 2528.37666, 2155.78385, & + 1818.20722, 1513.68173, 1240.03585, & + 994.99144, 776.23591, 581.48797, & + 408.53400, 255.26520, 119.70243, 0. / + + data b60gfs/0.00000, 0.00000, 0.00000, & + 0.00000, 0.00000, 0.00000, & + 0.00000, 0.00000, 0.00000, & + 0.00000, 0.00000, 0.00000, & + 0.00000, 0.00000, 0.00000, & + 0.00000, 0.00000, 0.00000, & + 0.00000, 0.00000, 0.00000, & + 0.00201, 0.00792, 0.01755, & + 0.03079, 0.04751, 0.06761, & + 0.09097, 0.11746, 0.14690, & + 0.17911, 0.21382, 0.25076, & + 0.28960, 0.32994, 0.37140, & + 0.41353, 0.45589, 0.49806, & + 0.53961, 0.58015, 0.61935, & + 0.65692, 0.69261, 0.72625, & + 0.75773, 0.78698, 0.81398, & + 0.83876, 0.86138, 0.88192, & + 0.90050, 0.91722, 0.93223, & + 0.94565, 0.95762, 0.96827, & + 0.97771, 0.98608, 0.99347, 1./ + +! NAM levels + data a60/200., 1311.4934, 2424.6044, 3541.7594,& + 4662.9584, 5790.2234, 6932.6534, 8095.3034,& + 9278.1734, 10501.4834, 11755.1234, 13049.2034,& + 14403.9434, 15809.2334, 17315.6234, 18953.4434,& + 20783.3534, 22815.4634, 25059.8834, 27567.1634,& + 30148.42896047, 32193.91776039, 33237.35176644, 33332.15200668,& + 32747.34688095, 31710.06232008, 30381.0344269, 28858.71577772,& + 27218.00439794, 25500.31691133, 23734.52294749, 21947.3406187,& + 20167.06984021, 18396.08144096, 16688.20978135, 15067.73749198,& + 13564.49530178, 12183.34512952, 10928.24869364, 9815.02787644,& + 8821.38325756, 7943.05793658, 7181.90985128, 6500.94645341,& + 5932.84856135, 5420.87683616, 4959.15585353, 4522.15047657,& + 4103.63596619, 3703.72540955, 3322.52525084, 2953.65688391,& + 2597.18532669, 2253.10764634, 1915.10585833, 1583.14516612,& + 1257.18953818, 937.3977544 , 623.60136981, 311.11085215,& + 0. / + data b60/0., 0., 0., 0., 0.,& + 0. , 0. , 0. , 0. , 0. ,& + 0. , 0. , 0. , 0. , 0. ,& + 0. , 0. , 0. , 0. , 0. ,& + 0.0014653 , 0.01021565, 0.0301554 , 0.06025816, 0.09756877,& + 0.13994493, 0.18550048, 0.23318371, 0.2819159 , 0.33120838,& + 0.38067633, 0.42985641, 0.47816985, 0.52569303, 0.57109611,& + 0.61383996, 0.6532309 , 0.68922093, 0.72177094, 0.75052515,& + 0.77610288, 0.79864598, 0.81813309, 0.83553022, 0.85001773,& + 0.86305395, 0.8747947 , 0.88589325, 0.89650986, 0.9066434 ,& + 0.91629284, 0.92562094, 0.93462705, 0.94331221, 0.95183659,& + 0.96020153, 0.96840839, 0.97645359, 0.98434181, 0.99219119, 1. / + + +! This is activated by USE_GFSL63 +! Thfollowing L63 setting is the same as NCEP GFS's L64 except the top +! 3 layers + data a63/64.247, 137.790, 221.958, & + 318.266, 428.434, 554.424, & + 698.457, 863.05803, 1051.07995, & + 1265.75194, 1510.71101, 1790.05098, & + 2108.36604, 2470.78817, 2883.03811, & + 3351.46002, 3883.05187, 4485.49315, & + 5167.14603, 5937.04991, 6804.87379, & + 7780.84698, 8875.64338, 10100.20534, & + 11264.35673, 12190.64366, 12905.42546, & + 13430.87867, 13785.88765, 13986.77987, & + 14047.96335, 13982.46770, 13802.40331, & + 13519.33841, 13144.59486, 12689.45608, & + 12165.28766, 11583.57006, 10955.84778, & + 10293.60402, 9608.08306, 8910.07678, & + 8209.70131, 7516.18560, 6837.69250, & + 6181.19473, 5552.39653, 4955.72632, & + 4394.37629, 3870.38682, 3384.76586, & + 2937.63489, 2528.37666, 2155.78385, & + 1818.20722, 1513.68173, 1240.03585, & + 994.99144, 776.23591, 581.48797, & + 408.53400, 255.26520, 119.70243, 0. / + + data b63/0.00000, 0.00000, 0.00000, & + 0.00000, 0.00000, 0.00000, & + 0.00000, 0.00000, 0.00000, & + 0.00000, 0.00000, 0.00000, & + 0.00000, 0.00000, 0.00000, & + 0.00000, 0.00000, 0.00000, & + 0.00000, 0.00000, 0.00000, & + 0.00000, 0.00000, 0.00000, & + 0.00201, 0.00792, 0.01755, & + 0.03079, 0.04751, 0.06761, & + 0.09097, 0.11746, 0.14690, & + 0.17911, 0.21382, 0.25076, & + 0.28960, 0.32994, 0.37140, & + 0.41353, 0.45589, 0.49806, & + 0.53961, 0.58015, 0.61935, & + 0.65692, 0.69261, 0.72625, & + 0.75773, 0.78698, 0.81398, & + 0.83876, 0.86138, 0.88192, & + 0.90050, 0.91722, 0.93223, & + 0.94565, 0.95762, 0.96827, & + 0.97771, 0.98608, 0.99347, 1./ + + data a63meso/ 64.247, 234.14925, 444.32075, & + 719.10698, 1077.83197, 1545.21700, & + 2152.6203, 2939.37353, 3954.07197, & + 5255.55443, 6913.13424, 8955.12932, & + 10898.75012, 12137.76737, 12858.09331, & + 13388.26761, 13747.35846, 13951.85268, & + 14016.29356, 13953.82551, 13776.65318, & + 13496.41874, 13124.49605, 12672.19867, & + 12150.90036, 11572.06889, 10947.21741, & + 10287.78472, 9604.96173, 8909.48448, & + 8211.41625, 7519.94125, 6843.19133, & + 6188.11962, 5560.42852, 4964.55636, & + 4403.71643, 3879.97894, 3394.38835, & + 2996.77033, 2730.02573, 2530.11329, & + 2339.36720, 2157.57530, 1984.53745, & + 1820.00086, 1663.72705, 1515.43668, & + 1374.86622, 1241.72259, 1115.72934, & + 996.58895, 884.02079, 777.73138, & + 677.44387, 582.87349, 493.75161, & + 409.80694, 330.78356, 256.42688, & + 186.49670, 120.75560, 58.97959, 0. / + + data b63meso/ 0. , 0. , 0. , & + 0. , 0. , 0. , & + 0. , 0. , 0. , & + 0. , 0. , 0.0005 , & + 0.00298, 0.00885, 0.01845, & + 0.03166, 0.04836, 0.06842, & + 0.09175, 0.1182 , 0.14759, & + 0.17974, 0.21438, 0.25123, & + 0.28997, 0.33022, 0.37157, & + 0.41359, 0.45584, 0.49791, & + 0.53936, 0.57981, 0.61894, & + 0.65645, 0.6921 , 0.72571, & + 0.75717, 0.78642, 0.81343, & + 0.83547, 0.85023, 0.86128, & + 0.8718 , 0.88182, 0.89135, & + 0.9004 , 0.90898, 0.91712, & + 0.92483, 0.93213, 0.93904, & + 0.94556, 0.95172, 0.95754, & + 0.96302, 0.96819, 0.97306, & + 0.97764, 0.98196, 0.98601, & + 0.98983, 0.99341, 0.99678, 1. / + + data a64gfs/20.00000, 68.00000, 137.79000, & + 221.95800, 318.26600, 428.43400, & + 554.42400, 698.45700, 863.05803, & + 1051.07995, 1265.75194, 1510.71101, & + 1790.05098, 2108.36604, 2470.78817, & + 2883.03811, 3351.46002, 3883.05187, & + 4485.49315, 5167.14603, 5937.04991, & + 6804.87379, 7780.84698, 8875.64338, & + 9921.40745, 10760.99844, 11417.88354, & + 11911.61193, 12258.61668, 12472.89642, & + 12566.58298, 12550.43517, 12434.26075, & + 12227.27484, 11938.39468, 11576.46910, & + 11150.43640, 10669.41063, 10142.69482, & + 9579.72458, 8989.94947, 8382.67090, & + 7766.85063, 7150.91171, 6542.55077, & + 5948.57894, 5374.81094, 4825.99383, & + 4305.79754, 3816.84622, 3360.78848, & + 2938.39801, 2549.69756, 2194.08449, & + 1870.45732, 1577.34218, 1313.00028, & + 1075.52114, 862.90778, 673.13815, & + 504.22118, 354.22752, 221.32110, & + 103.78014, 0./ + data b64gfs/0.00000, 0.00000, 0.00000, & + 0.00000, 0.00000, 0.00000, & + 0.00000, 0.00000, 0.00000, & + 0.00000, 0.00000, 0.00000, & + 0.00000, 0.00000, 0.00000, & + 0.00000, 0.00000, 0.00000, & + 0.00000, 0.00000, 0.00000, & + 0.00000, 0.00000, 0.00000, & + 0.00179, 0.00705, 0.01564, & + 0.02749, 0.04251, 0.06064, & + 0.08182, 0.10595, 0.13294, & + 0.16266, 0.19492, 0.22950, & + 0.26615, 0.30455, 0.34435, & + 0.38516, 0.42656, 0.46815, & + 0.50949, 0.55020, 0.58989, & + 0.62825, 0.66498, 0.69987, & + 0.73275, 0.76351, 0.79208, & + 0.81845, 0.84264, 0.86472, & + 0.88478, 0.90290, 0.91923, & + 0.93388, 0.94697, 0.95865, & + 0.96904, 0.97826, 0.98642, & + 0.99363, 1./ + + data a64/1.00000, 3.90000, 8.70000, & + 15.42000, 24.00000, 34.50000, & + 47.00000, 61.50000, 78.60000, & + 99.13500, 124.12789, 154.63770, & + 191.69700, 236.49300, 290.38000, & + 354.91000, 431.82303, 523.09300, & + 630.92800, 757.79000, 906.45000, & + 1079.85000, 1281.00000, 1515.00000, & + 1788.00000, 2105.00000, 2470.00000, & + 2889.00000, 3362.00000, 3890.00000, & + 4475.00000, 5120.00000, 5830.00000, & + 6608.00000, 7461.00000, 8395.00000, & + 9424.46289, 10574.46880, 11864.80270, & + 13312.58890, 14937.03710, 16759.70700, & + 18804.78710, 21099.41210, 23674.03710, & + 26562.82810, 29804.11720, 32627.31640, & + 34245.89840, 34722.28910, 34155.19920, & + 32636.50390, 30241.08200, 27101.44920, & + 23362.20700, 19317.05270, 15446.17090, & + 12197.45210, 9496.39941, 7205.66992, & + 5144.64307, 3240.79346, 1518.62134, & + 0.00000, 0.00000 / + + data b64/0.00000, 0.00000, 0.00000, & + 0.00000, 0.00000, 0.00000, & + 0.00000, 0.00000, 0.00000, & + 0.00000, 0.00000, 0.00000, & + 0.00000, 0.00000, 0.00000, & + 0.00000, 0.00000, 0.00000, & + 0.00000, 0.00000, 0.00000, & + 0.00000, 0.00000, 0.00000, & + 0.00000, 0.00000, 0.00000, & + 0.00000, 0.00000, 0.00000, & + 0.00000, 0.00000, 0.00000, & + 0.00000, 0.00000, 0.00000, & + 0.00000, 0.00000, 0.00000, & + 0.00000, 0.00000, 0.00000, & + 0.00000, 0.00000, 0.00000, & + 0.00000, 0.00000, 0.00813, & + 0.03224, 0.07128, 0.12445, & + 0.19063, 0.26929, 0.35799, & + 0.45438, 0.55263, 0.64304, & + 0.71703, 0.77754, 0.82827, & + 0.87352, 0.91502, 0.95235, & + 0.98511, 1.00000 / + +!-->cjg + data a68/1.00000, 2.68881, 5.15524, & + 8.86683, 14.20349, 22.00278, & + 33.50807, 50.32362, 74.56680, & + 109.05958, 157.51214, 224.73844, & + 316.90481, 441.81219, 609.21090, & + 831.14537, 1122.32514, 1500.51628, & + 1986.94617, 2606.71274, 3389.18802, & + 4368.40473, 5583.41379, 7078.60015, & + 8903.94455, 11115.21886, 13774.60566, & + 16936.82070, 20340.47045, 23193.71492, & + 24870.36141, 25444.59363, 25252.57081, & + 24544.26211, 23474.29096, 22230.65331, & + 20918.50731, 19589.96280, 18296.26682, & + 17038.02866, 15866.85655, 14763.18943, & + 13736.83624, 12794.11850, 11930.72442, & + 11137.17217, 10404.78946, 9720.03954, & + 9075.54055, 8466.72650, 7887.12346, & + 7333.90490, 6805.43028, 6297.33773, & + 5805.78227, 5327.94995, 4859.88765, & + 4398.63854, 3942.81761, 3491.08449, & + 3043.04531, 2598.71608, 2157.94527, & + 1720.87444, 1287.52805, 858.02944, & + 432.71276, 8.10905, 0.00000 / + + data b68/0.00000, 0.00000, 0.00000, & + 0.00000, 0.00000, 0.00000, & + 0.00000, 0.00000, 0.00000, & + 0.00000, 0.00000, 0.00000, & + 0.00000, 0.00000, 0.00000, & + 0.00000, 0.00000, 0.00000, & + 0.00000, 0.00000, 0.00000, & + 0.00000, 0.00000, 0.00000, & + 0.00000, 0.00000, 0.00000, & + 0.00000, 0.00283, 0.01590, & + 0.04412, 0.08487, 0.13284, & + 0.18470, 0.23828, 0.29120, & + 0.34211, 0.39029, 0.43518, & + 0.47677, 0.51536, 0.55091, & + 0.58331, 0.61263, 0.63917, & + 0.66333, 0.68552, 0.70617, & + 0.72555, 0.74383, 0.76117, & + 0.77765, 0.79335, 0.80838, & + 0.82287, 0.83693, 0.85069, & + 0.86423, 0.87760, 0.89082, & + 0.90392, 0.91689, 0.92973, & + 0.94244, 0.95502, 0.96747, & + 0.97979, 0.99200, 1.00000 / + + data a96/1.00000, 2.35408, 4.51347, & + 7.76300, 12.43530, 19.26365, & + 29.33665, 44.05883, 65.28397, & + 95.48274, 137.90344, 196.76073, & + 277.45330, 386.81095, 533.37018, & + 727.67600, 982.60677, 1313.71685, & + 1739.59104, 2282.20281, 2967.26766, & + 3824.58158, 4888.33404, 6197.38450, & + 7795.49158, 9731.48414, 11969.71024, & + 14502.88894, 17304.52434, 20134.76139, & + 22536.63814, 24252.54459, 25230.65591, & + 25585.72044, 25539.91412, 25178.87141, & + 24644.84493, 23978.98781, 23245.49366, & + 22492.11600, 21709.93990, 20949.64473, & + 20225.94258, 19513.31158, 18829.32485, & + 18192.62250, 17589.39396, 17003.45386, & + 16439.01774, 15903.91204, 15396.39758, & + 14908.02140, 14430.65897, 13967.88643, & + 13524.16667, 13098.30227, 12687.56457, & + 12287.08757, 11894.41553, 11511.54106, & + 11139.22483, 10776.01912, 10419.75711, & + 10067.11881, 9716.63489, 9369.61967, & + 9026.69066, 8687.29884, 8350.04978, & + 8013.20925, 7677.12187, 7343.12994, & + 7011.62844, 6681.98102, 6353.09764, & + 6025.10535, 5699.10089, 5375.54503, & + 5053.63074, 4732.62740, 4413.38037, & + 4096.62775, 3781.79777, 3468.45371, & + 3157.19882, 2848.25306, 2541.19150, & + 2236.21942, 1933.50628, 1632.83741, & + 1334.35954, 1038.16655, 744.22318, & + 452.71094, 194.91899, 0.00000, & + 0.00000 / + + data b96/0.00000, 0.00000, 0.00000, & + 0.00000, 0.00000, 0.00000, & + 0.00000, 0.00000, 0.00000, & + 0.00000, 0.00000, 0.00000, & + 0.00000, 0.00000, 0.00000, & + 0.00000, 0.00000, 0.00000, & + 0.00000, 0.00000, 0.00000, & + 0.00000, 0.00000, 0.00000, & + 0.00000, 0.00000, 0.00000, & + 0.00000, 0.00000, 0.00193, & + 0.00974, 0.02538, 0.04876, & + 0.07817, 0.11081, 0.14514, & + 0.18007, 0.21486, 0.24866, & + 0.28088, 0.31158, 0.34030, & + 0.36701, 0.39210, 0.41554, & + 0.43733, 0.45774, 0.47707, & + 0.49540, 0.51275, 0.52922, & + 0.54495, 0.56007, 0.57459, & + 0.58850, 0.60186, 0.61471, & + 0.62715, 0.63922, 0.65095, & + 0.66235, 0.67348, 0.68438, & + 0.69510, 0.70570, 0.71616, & + 0.72651, 0.73675, 0.74691, & + 0.75700, 0.76704, 0.77701, & + 0.78690, 0.79672, 0.80649, & + 0.81620, 0.82585, 0.83542, & + 0.84492, 0.85437, 0.86375, & + 0.87305, 0.88229, 0.89146, & + 0.90056, 0.90958, 0.91854, & + 0.92742, 0.93623, 0.94497, & + 0.95364, 0.96223, 0.97074, & + 0.97918, 0.98723, 0.99460, & + 1.00000 / +!<--cjg +! +! Ultra high troposphere resolution + data a100/100.00000, 300.00000, 800.00000, & + 1762.35235, 3106.43596, 4225.71874, & + 4946.40525, 5388.77387, 5708.35540, & + 5993.33124, 6277.73673, 6571.49996, & + 6877.05339, 7195.14327, 7526.24920, & + 7870.82981, 8229.35361, 8602.30193, & + 8990.16936, 9393.46399, 9812.70768, & + 10248.43625, 10701.19980, 11171.56286, & + 11660.10476, 12167.41975, 12694.11735, & + 13240.82253, 13808.17600, 14396.83442, & + 15007.47066, 15640.77407, 16297.45067, & + 16978.22343, 17683.83253, 18415.03554, & + 19172.60771, 19957.34218, 20770.05022, & + 21559.14829, 22274.03147, 22916.87519, & + 23489.70456, 23994.40187, 24432.71365, & + 24806.25734, 25116.52754, 25364.90190, & + 25552.64670, 25680.92203, 25750.78675, & + 25763.20311, 25719.04113, 25619.08274, & + 25464.02630, 25254.49482, 24991.06137, & + 24674.32737, 24305.11235, 23884.79781, & + 23415.77059, 22901.76510, 22347.84738, & + 21759.93950, 21144.07284, 20505.73136, & + 19849.54271, 19179.31412, 18498.23400, & + 17809.06809, 17114.28232, 16416.10343, & + 15716.54833, 15017.44246, 14320.43478, & + 13627.01116, 12938.50682, 12256.11762, & + 11580.91062, 10913.83385, 10255.72526, & + 9607.32122, 8969.26427, 8342.11044, & + 7726.33606, 7122.34405, 6530.46991, & + 5950.98721, 5384.11279, 4830.01153, & + 4288.80090, 3760.55514, 3245.30920, & + 2743.06250, 2253.78294, 1777.41285, & + 1313.88054, 863.12371, 425.13088, & + 0.00000, 0.00000 / + + + data b100/0.00000, 0.00000, 0.00000, & + 0.00000, 0.00000, 0.00000, & + 0.00000, 0.00000, 0.00000, & + 0.00000, 0.00000, 0.00000, & + 0.00000, 0.00000, 0.00000, & + 0.00000, 0.00000, 0.00000, & + 0.00000, 0.00000, 0.00000, & + 0.00000, 0.00000, 0.00000, & + 0.00000, 0.00000, 0.00000, & + 0.00000, 0.00000, 0.00000, & + 0.00000, 0.00000, 0.00000, & + 0.00000, 0.00000, 0.00000, & + 0.00000, 0.00000, 0.00000, & + 0.00052, 0.00209, 0.00468, & + 0.00828, 0.01288, 0.01849, & + 0.02508, 0.03266, 0.04121, & + 0.05075, 0.06126, 0.07275, & + 0.08521, 0.09866, 0.11308, & + 0.12850, 0.14490, 0.16230, & + 0.18070, 0.20009, 0.22042, & + 0.24164, 0.26362, 0.28622, & + 0.30926, 0.33258, 0.35605, & + 0.37958, 0.40308, 0.42651, & + 0.44981, 0.47296, 0.49591, & + 0.51862, 0.54109, 0.56327, & + 0.58514, 0.60668, 0.62789, & + 0.64872, 0.66919, 0.68927, & + 0.70895, 0.72822, 0.74709, & + 0.76554, 0.78357, 0.80117, & + 0.81835, 0.83511, 0.85145, & + 0.86736, 0.88286, 0.89794, & + 0.91261, 0.92687, 0.94073, & + 0.95419, 0.96726, 0.97994, & + 0.99223, 1.00000 / + + data a104/ & + 1.8827062944e-01, 7.7977549145e-01, 2.1950593583e+00, & + 4.9874566624e+00, 9.8041418997e+00, 1.7019717163e+01, & + 2.7216579591e+01, 4.0518628401e+01, 5.6749646818e+01, & + 7.5513868331e+01, 9.6315093333e+01, 1.1866706195e+02, & + 1.4216835396e+02, 1.6653733709e+02, 1.9161605772e+02, & + 2.1735580129e+02, 2.4379516604e+02, 2.7103771847e+02, & + 2.9923284173e+02, 3.2856100952e+02, 3.5922338766e+02, & + 3.9143507908e+02, 4.2542117983e+02, 4.6141487902e+02, & + 4.9965698106e+02, 5.4039638379e+02, 5.8389118154e+02, & + 6.3041016829e+02, 6.8023459505e+02, 7.3366009144e+02, & + 7.9099869949e+02, 8.5258099392e+02, 9.1875827946e+02, & + 9.8990486716e+02, 1.0664204381e+03, 1.1487325074e+03, & + 1.2372990044e+03, 1.3326109855e+03, 1.4351954993e+03, & + 1.5456186222e+03, 1.6644886848e+03, 1.7924597105e+03, & + 1.9302350870e+03, 2.0785714934e+03, 2.2382831070e+03, & + 2.4102461133e+03, 2.5954035462e+03, 2.7947704856e+03, & + 3.0094396408e+03, 3.2405873512e+03, 3.4894800360e+03, & + 3.7574811281e+03, 4.0460585279e+03, 4.3567926151e+03, & + 4.6913848588e+03, 5.0516670674e+03, 5.4396113207e+03, & + 5.8573406270e+03, 6.3071403487e+03, 6.7914704368e+03, & + 7.3129785102e+03, 7.8745138115e+03, 8.4791420557e+03, & + 9.1301611750e+03, 9.8311179338e+03, 1.0585825354e+04, & + 1.1398380836e+04, 1.2273184781e+04, 1.3214959424e+04, & + 1.4228767429e+04, 1.5320029596e+04, 1.6494540743e+04, & + 1.7758482452e+04, 1.9118430825e+04, 2.0422798801e+04, & + 2.1520147587e+04, 2.2416813461e+04, 2.3118184510e+04, & + 2.3628790785e+04, 2.3952411814e+04, 2.4092209011e+04, & + 2.4050892106e+04, 2.3830930156e+04, 2.3434818358e+04, & + 2.2865410898e+04, 2.2126326004e+04, 2.1222420323e+04, & + 2.0160313690e+04, 1.8948920926e+04, 1.7599915822e+04, & + 1.6128019809e+04, 1.4550987232e+04, 1.2889169132e+04, & + 1.1164595563e+04, 9.4227665517e+03, 7.7259097899e+03, & + 6.1538244381e+03, 4.7808126007e+03, 3.5967415552e+03, & + 2.5886394104e+03, 1.7415964865e+03, 1.0393721271e+03, & + 4.6478852032e+02, 7.0308342481e-13, 0.0000000000e+00 / + + + data b104/ & + 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & + 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & + 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & + 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & + 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & + 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & + 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & + 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & + 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & + 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & + 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & + 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & + 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & + 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & + 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & + 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & + 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & + 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & + 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & + 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & + 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & + 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & + 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & + 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & + 0.0000000000e+00, 0.0000000000e+00, 1.5648447298e-03, & + 6.2617046389e-03, 1.4104157933e-02, 2.5118187415e-02, & + 3.9340510972e-02, 5.6816335609e-02, 7.7596328431e-02, & + 1.0173255472e-01, 1.2927309709e-01, 1.6025505622e-01, & + 1.9469566981e-01, 2.3258141217e-01, 2.7385520518e-01, & + 3.1840233814e-01, 3.6603639170e-01, 4.1648734767e-01, & + 4.6939496013e-01, 5.2431098738e-01, 5.8071350676e-01, & + 6.3803478105e-01, 6.9495048840e-01, 7.4963750338e-01, & + 7.9975208897e-01, 8.4315257576e-01, 8.8034012292e-01, & + 9.1184389721e-01, 9.3821231526e-01, 9.6000677644e-01, & + 9.7779792223e-01, 9.9216315122e-01, 1.0000000000e+00 / + +! IFS-like L125(top 12 levels removed from IFSL137) + data a125/ 64., & + 86.895882, 107.415741, 131.425507, 159.279404, 191.338562, & + 227.968948, 269.539581, 316.420746, 368.982361, 427.592499, 492.616028, & + 564.413452, 643.339905, 729.744141, 823.967834, 926.344910, 1037.201172, & + 1156.853638, 1285.610352, 1423.770142, 1571.622925, 1729.448975, 1897.519287, & + 2076.095947, 2265.431641, 2465.770508, 2677.348145, 2900.391357, 3135.119385, & + 3381.743652, 3640.468262, 3911.490479, 4194.930664, 4490.817383, 4799.149414, & + 5119.895020, 5452.990723, 5798.344727, 6156.074219, 6526.946777, 6911.870605, & + 7311.869141, 7727.412109, 8159.354004, 8608.525391, 9076.400391, 9562.682617, & + 10065.978516, 10584.631836, 11116.662109, 11660.067383, 12211.547852, 12766.873047, & + 13324.668945, 13881.331055, 14432.139648, 14975.615234, 15508.256836, 16026.115234, & + 16527.322266, 17008.789063, 17467.613281, 17901.621094, 18308.433594, 18685.718750, & + 19031.289063, 19343.511719, 19620.042969, 19859.390625, 20059.931641, 20219.664063, & + 20337.863281, 20412.308594, 20442.078125, 20425.718750, 20361.816406, 20249.511719, & + 20087.085938, 19874.025391, 19608.572266, 19290.226563, 18917.460938, 18489.707031, & + 18006.925781, 17471.839844, 16888.687500, 16262.046875, 15596.695313, 14898.453125, & + 14173.324219, 13427.769531, 12668.257813, 11901.339844, 11133.304688, 10370.175781, & + 9617.515625, 8880.453125, 8163.375000, 7470.343750, 6804.421875, 6168.531250, & + 5564.382813, 4993.796875, 4457.375000, 3955.960938, 3489.234375, 3057.265625, & + 2659.140625, 2294.242188, 1961.500000, 1659.476563, 1387.546875, 1143.250000, & + 926.507813, 734.992188, 568.062500, 424.414063, 302.476563, 202.484375, & + 122.101563, 62.781250, 22.835938, 3.757813, 0.000000, 0.000000 / + + data b125/ 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, & + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, & + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, & + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, & + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, & + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, & + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, & + 0.000000, 0.000007, 0.000024, 0.000059, 0.000112, 0.000199, & + 0.000340, 0.000562, 0.000890, 0.001353, 0.001992, 0.002857, & + 0.003971, 0.005378, 0.007133, 0.009261, 0.011806, 0.014816, & + 0.018318, 0.022355, 0.026964, 0.032176, 0.038026, 0.044548, & + 0.051773, 0.059728, 0.068448, 0.077958, 0.088286, 0.099462, & + 0.111505, 0.124448, 0.138313, 0.153125, 0.168910, 0.185689, & + 0.203491, 0.222333, 0.242244, 0.263242, 0.285354, 0.308598, & + 0.332939, 0.358254, 0.384363, 0.411125, 0.438391, 0.466003, & + 0.493800, 0.521619, 0.549301, 0.576692, 0.603648, 0.630036, & + 0.655736, 0.680643, 0.704669, 0.727739, 0.749797, 0.770798, & + 0.790717, 0.809536, 0.827256, 0.843881, 0.859432, 0.873929, & + 0.887408, 0.899900, 0.911448, 0.922096, 0.931881, 0.940860, & + 0.949064, 0.956550, 0.963352, 0.969513, 0.975078, 0.980072, & + 0.984542, 0.988500, 0.991984, 0.995003, 0.997630, 1.000000 / + + + +#endif _FV_ETA_ diff --git a/scm/src/scm_type_defs.F90 b/scm/src/scm_type_defs.F90 index dd333ac45..2d60f299c 100644 --- a/scm/src/scm_type_defs.F90 +++ b/scm/src/scm_type_defs.F90 @@ -48,8 +48,8 @@ module scm_type_defs character(len=character_length) :: physics_suite_name !< name of physics suite (must be "GFS_operational" for prototype) character(len=character_length) :: physics_nml - integer :: n_levels !< number of model levels (must be 64 for prototype) - integer :: n_soil !< number of model levels (must be 4 for prototype) + integer :: n_levels !< number of model levels + integer :: n_soil !< number of model levels integer :: itt !< current model iteration integer :: itt_out !< output iteration counter integer :: itt_swrad !< sw radiation iteration counter diff --git a/scm/src/scm_vgrid.F90 b/scm/src/scm_vgrid.F90 index 30a22b194..91704c807 100644 --- a/scm/src/scm_vgrid.F90 +++ b/scm/src/scm_vgrid.F90 @@ -109,1107 +109,379 @@ subroutine get_GFS_vgrid(scm_input, scm_state, error) !> @} end subroutine get_GFS_vgrid -!most of this was obtained from FV3/atmos_cubed_sphere/tools/fv_eta.F90 from FV3 v0 release +!GJF: most of this was obtained from FV3/atmos_cubed_sphere/tools/fv_eta.F90 from FV3 +!GJF: current as of March 2022 +!GJF: assuming proprocessor variable USE_VAR_ETA is NOT set subroutine get_FV3_vgrid(scm_input, scm_state) use scm_type_defs, only: scm_input_type, scm_state_type type(scm_input_type), intent(in) :: scm_input type(scm_state_type), intent(inout) :: scm_state - integer :: km ! vertical dimension + character(24) :: npz_type + integer :: km ! vertical dimension integer :: ks ! number of pure p layers real(kind=dp) :: ptop ! model top (Pa) - ! local real(kind=dp) :: pres_sfc_inv, p_ref, ak_tmp, bk_tmp - - real a24(25),b24(25) ! GFDL AM2L24 - real a26(27),b26(27) ! Jablonowski & Williamson 26-level - real a32(33),b32(33) - !real a32w(33),b32w(33) - real a47(48),b47(48) - real a48(49),b48(49) - real a52(53),b52(53) - real a54(55),b54(55) - real a56(57),b56(57) - real a60(61),b60(61) - !real a63(64),b63(64) - real a64(65),b64(65) - real a68(69),b68(69) ! cjg: grid with enhanced PBL resolution - real a96(97),b96(97) ! cjg: grid with enhanced PBL resolution - real a100(101),b100(101) - real a104(105),b104(105) - real a125(126),b125(126) - + real:: p0=1000.E2 real:: pc=200.E2 - - real pt, pint, lnpe, dlnp - real press(scm_state%n_levels+1) + + real :: pint = 100.E2 + real :: stretch_fac = 1.03 + integer :: auto_routine = 0 + integer k, last_index, mid_index - + +#include "fv_eta.h" + + npz_type = '' !GJF: this is the default in atmos_cubed_sphere/model/fv_arrays.F90 km = scm_state%n_levels - + ptop = 1. ! Definition: press(i,j,k) = ak(k) + bk(k) * ps(i,j) - -!----------------------------------------------- -! GFDL AM2-L24: modified by SJL at the model top -!----------------------------------------------- -! data a24 / 100.0000, 1050.0000, 3474.7942, 7505.5556, 12787.2428, & - data a24 / 100.0000, 903.4465, 3474.7942, 7505.5556, 12787.2428, & - 19111.3683, 21854.9274, 22884.1866, 22776.3058, 21716.1604, & - 20073.2963, 18110.5123, 16004.7832, 13877.6253, 11812.5452, & - 9865.8840, 8073.9726, 6458.0834, 5027.9899, 3784.6085, & - 2722.0086, 1828.9752, 1090.2396, 487.4595, 0.0000 / - - data b24 / 0.0000000, 0.0000000, 0.0000000, 0.0000000, 0.0000000, & - 0.0000000, 0.0435679, 0.1102275, 0.1922249, 0.2817656, & - 0.3694997, 0.4532348, 0.5316253, 0.6038733, 0.6695556, & - 0.7285176, 0.7808017, 0.8265992, 0.8662148, 0.9000406, & - 0.9285364, 0.9522140, 0.9716252, 0.9873523, 1.0000000 / - -! Jablonowski & Williamson 26-level setup - data a26 / 219.4067, 489.5209, 988.2418, 1805.2010, 2983.7240, 4462.3340, & - 6160.5870, 7851.2430, 7731.2710, 7590.1310, 7424.0860, & - 7228.7440, 6998.9330, 6728.5740, 6410.5090, 6036.3220, & - 5596.1110, 5078.2250, 4468.9600, 3752.1910, 2908.9490, & - 2084.739, 1334.443, 708.499, 252.1360, 0.0, 0.0 / - - data b26 / 0.0, 0.0, 0.0000000, 0.0000000, 0.0000000, 0.0000000, 0.0000000,& - 0.0000000, 0.01505309, 0.03276228, 0.05359622, 0.07810627, & - 0.1069411, 0.1408637, 0.1807720, 0.2277220, 0.2829562, & - 0.3479364, 0.4243822, 0.5143168, 0.6201202, 0.7235355, & - 0.8176768, 0.8962153, 0.9534761, 0.9851122, 1.0000000 / - - -! High-resolution troposphere setup -#ifdef OLD_32 -! Revised Apr 14, 2004: PINT = 245.027 mb - data a32/100.00000, 400.00000, 818.60211, & - 1378.88653, 2091.79519, 2983.64084, & - 4121.78960, 5579.22148, 7419.79300, & - 9704.82578, 12496.33710, 15855.26306, & - 19839.62499, 24502.73262, 28177.10152, & - 29525.28447, 29016.34358, 27131.32792, & - 24406.11225, 21326.04907, 18221.18357, & - 15275.14642, 12581.67796, 10181.42843, & - 8081.89816, 6270.86956, 4725.35001, & - 3417.39199, 2317.75459, 1398.09473, & - 632.49506, 0.00000, 0.00000 / - - data b32/0.00000, 0.00000, 0.00000, & - 0.00000, 0.00000, 0.00000, & - 0.00000, 0.00000, 0.00000, & - 0.00000, 0.00000, 0.00000, & - 0.00000, 0.00000, 0.01711, & - 0.06479, 0.13730, 0.22693, & - 0.32416, 0.42058, 0.51105, & - 0.59325, 0.66628, 0.73011, & - 0.78516, 0.83217, 0.87197, & - 0.90546, 0.93349, 0.95685, & - 0.97624, 0.99223, 1.00000 / -#else -! SJL June 26, 2012 -! pint= 55.7922 - data a32/100.00000, 400.00000, 818.60211, & - 1378.88653, 2091.79519, 2983.64084, & - 4121.78960, 5579.22148, 6907.19063, & - 7735.78639, 8197.66476, 8377.95525, & - 8331.69594, 8094.72213, 7690.85756, & - 7139.01788, 6464.80251, 5712.35727, & - 4940.05347, 4198.60465, 3516.63294, & - 2905.19863, 2366.73733, 1899.19455, & - 1497.78137, 1156.25252, 867.79199, & - 625.59324, 423.21322, 254.76613, & - 115.06646, 0.00000, 0.00000 / - - data b32/0.00000, 0.00000, 0.00000, & - 0.00000, 0.00000, 0.00000, & - 0.00000, 0.00000, 0.00513, & - 0.01969, 0.04299, 0.07477, & - 0.11508, 0.16408, 0.22198, & - 0.28865, 0.36281, 0.44112, & - 0.51882, 0.59185, 0.65810, & - 0.71694, 0.76843, 0.81293, & - 0.85100, 0.88331, 0.91055, & - 0.93338, 0.95244, 0.96828, & - 0.98142, 0.99223, 1.00000 / -#endif - -!!--------------------- -!! Wilson's 32L settings: -!!--------------------- -!! Top changed to 0.01 mb -! data a32w/ 1.00, 26.6378, 84.5529, 228.8592, & -! 539.9597, 1131.7087, 2141.8082, 3712.0454, & -! 5963.5317, 8974.1873, 12764.5388, 17294.5911, & -! 20857.7007, 22221.8651, 22892.7202, 22891.1641, & -! 22286.0724, 21176.0846, 19673.0671, 17889.0989, & -! 15927.5060, 13877.6239, 11812.5474, 9865.8830, & -! 8073.9717, 6458.0824, 5027.9893, 3784.6104, & -! 2722.0093, 1828.9741, 1090.2397, 487.4575, & -! 0.0000 / -! -! data b32w/ 0.0000, 0.0000, 0.0000, 0.0000, & -! 0.0000, 0.0000, 0.0000, 0.0000, & -! 0.0000, 0.0000, 0.0000, 0.0000, & -! 0.0159, 0.0586, 0.1117, 0.1734, & -! 0.2415, 0.3137, 0.3878, 0.4619, & -! 0.5344, 0.6039, 0.6696, 0.7285, & -! 0.7808, 0.8266, 0.8662, 0.9000, & -! 0.9285, 0.9522, 0.9716, 0.9874, & -! 1.0000 / - - -#ifdef OLD_L47 -! QBO setting with ptop = 0.1 mb and p_full=0.17 mb; pint ~ 100 mb - data a47/ 10.00000, 24.45365, 48.76776, & - 85.39458, 133.41983, 191.01402, & - 257.94919, 336.63306, 431.52741, & - 548.18995, 692.78825, 872.16512, & - 1094.18467, 1368.11917, 1704.99489, & - 2117.91945, 2622.42986, 3236.88281, & - 3982.89623, 4885.84733, 5975.43260, & - 7286.29500, 8858.72424, 10739.43477, & - 12982.41110, 15649.68745, 18811.37629, & - 22542.71275, 25724.93857, 27314.36781, & - 27498.59474, 26501.79312, 24605.92991, & - 22130.51655, 19381.30274, 16601.56419, & - 13952.53231, 11522.93244, 9350.82303, & - 7443.47723, 5790.77434, 4373.32696, & - 3167.47008, 2148.51663, 1293.15510, & - 581.62429, 0.00000, 0.00000 / - - data b47/ 0.0000, 0.0000, 0.0000, & - 0.00000, 0.00000, 0.00000, & - 0.00000, 0.00000, 0.00000, & - 0.00000, 0.00000, 0.00000, & - 0.00000, 0.00000, 0.00000, & - 0.00000, 0.00000, 0.00000, & - 0.00000, 0.00000, 0.00000, & - 0.00000, 0.00000, 0.00000, & - 0.00000, 0.00000, 0.00000, & - 0.00000, 0.01188, 0.04650, & - 0.10170, 0.17401, 0.25832, & - 0.34850, 0.43872, 0.52448, & - 0.60307, 0.67328, 0.73492, & - 0.78834, 0.83418, 0.87320, & - 0.90622, 0.93399, 0.95723, & - 0.97650, 0.99223, 1.00000 / -#else -! Oct 23, 2012 -! QBO setting with ptop = 0.1 mb, pint ~ 60 mb - data a47/ 10.00000, 24.45365, 48.76776, & - 85.39458, 133.41983, 191.01402, & - 257.94919, 336.63306, 431.52741, & - 548.18995, 692.78825, 872.16512, & - 1094.18467, 1368.11917, 1704.99489, & - 2117.91945, 2622.42986, 3236.88281, & - 3982.89623, 4885.84733, 5975.43260, & - 7019.26669, 7796.15848, 8346.60209, & - 8700.31838, 8878.27554, 8894.27179, & - 8756.46404, 8469.60171, 8038.92687, & - 7475.89006, 6803.68067, 6058.68992, & - 5285.28859, 4526.01565, 3813.00206, & - 3164.95553, 2589.26318, 2085.96929, & - 1651.11596, 1278.81205, 962.38875, & - 695.07046, 470.40784, 282.61654, & - 126.92745, 0.00000, 0.00000 / - data b47/ 0.0000, 0.0000, 0.0000, & - 0.00000, 0.00000, 0.00000, & - 0.00000, 0.00000, 0.00000, & - 0.00000, 0.00000, 0.00000, & - 0.00000, 0.00000, 0.00000, & - 0.00000, 0.00000, 0.00000, & - 0.00000, 0.00000, 0.00000, & - 0.00267, 0.01063, 0.02393, & - 0.04282, 0.06771, 0.09917, & - 0.13786, 0.18444, 0.23925, & - 0.30193, 0.37100, 0.44379, & - 0.51695, 0.58727, 0.65236, & - 0.71094, 0.76262, 0.80757, & - 0.84626, 0.87930, 0.90731, & - 0.93094, 0.95077, 0.96733, & - 0.98105, 0.99223, 1.00000 / -#endif - - data a48/ & - 1.00000, 2.69722, 5.17136, & - 8.89455, 14.24790, 22.07157, & - 33.61283, 50.48096, 74.79993, & - 109.40055, 158.00460, 225.44108, & - 317.89560, 443.19350, 611.11558, & - 833.74392, 1125.83405, 1505.20759, & - 1993.15829, 2614.86254, 3399.78420, & - 4382.06240, 5600.87014, 7100.73115, & - 8931.78242, 11149.97021, 13817.16841, & - 17001.20930, 20775.81856, 23967.33875, & - 25527.64563, 25671.22552, 24609.29622, & - 22640.51220, 20147.13482, 17477.63530, & - 14859.86462, 12414.92533, 10201.44191, & - 8241.50255, 6534.43202, 5066.17865, & - 3815.60705, 2758.60264, 1870.64631, & - 1128.33931, 510.47983, 0.00000, & - 0.00000 / - - data b48/ & - 0.00000, 0.00000, 0.00000, & - 0.00000, 0.00000, 0.00000, & - 0.00000, 0.00000, 0.00000, & - 0.00000, 0.00000, 0.00000, & - 0.00000, 0.00000, 0.00000, & - 0.00000, 0.00000, 0.00000, & - 0.00000, 0.00000, 0.00000, & - 0.00000, 0.00000, 0.00000, & - 0.00000, 0.00000, 0.00000, & - 0.00000, 0.00000, 0.01253, & - 0.04887, 0.10724, 0.18455, & - 0.27461, 0.36914, 0.46103, & - 0.54623, 0.62305, 0.69099, & - 0.75016, 0.80110, 0.84453, & - 0.88127, 0.91217, 0.93803, & - 0.95958, 0.97747, 0.99223, & - 1.00000 / - -! High PBL resolution with top at 1 mb -! SJL modified May 7, 2013 to ptop ~ 100 mb - data a54/100.00000, 254.83931, 729.54278, & - 1602.41121, 2797.50667, 4100.18977, & - 5334.87140, 6455.24153, 7511.80944, & - 8580.26355, 9714.44293, 10938.62253, & - 12080.36051, 12987.13921, 13692.75084, & - 14224.92180, 14606.55444, 14856.69953, & - 14991.32121, 15023.90075, 14965.91493, & - 14827.21612, 14616.33505, 14340.72252, & - 14006.94280, 13620.82849, 13187.60470, & - 12711.98873, 12198.27003, 11650.37451, & - 11071.91608, 10466.23819, 9836.44706, & - 9185.43852, 8515.96231, 7831.01080, & - 7135.14301, 6436.71659, 5749.00215, & - 5087.67188, 4465.67510, 3889.86419, & - 3361.63433, 2879.51065, 2441.02496, & - 2043.41345, 1683.80513, 1359.31122, & - 1067.09135, 804.40101, 568.62625, & - 357.32525, 168.33263, 0.00000, & - 0.00000 / - - data b54/0.00000, 0.00000, 0.00000, & - 0.00000, 0.00000, 0.00000, & - 0.00000, 0.00000, 0.00000, & - 0.00000, 0.00000, 0.00000, & - 0.00180, 0.00694, 0.01510, & - 0.02601, 0.03942, 0.05515, & - 0.07302, 0.09288, 0.11459, & - 0.13803, 0.16307, 0.18960, & - 0.21753, 0.24675, 0.27716, & - 0.30866, 0.34115, 0.37456, & - 0.40879, 0.44375, 0.47935, & - 0.51551, 0.55215, 0.58916, & - 0.62636, 0.66334, 0.69946, & - 0.73395, 0.76622, 0.79594, & - 0.82309, 0.84780, 0.87020, & - 0.89047, 0.90876, 0.92524, & - 0.94006, 0.95336, 0.96529, & - 0.97596, 0.98551, 0.99400, & - 1.00000 / - - -! The 56-L setup - data a56/ 10.00000, 24.97818, 58.01160, & - 115.21466, 199.29210, 309.39897, & - 445.31785, 610.54747, 812.28518, & - 1059.80882, 1363.07092, 1732.09335, & - 2176.91502, 2707.68972, 3334.70962, & - 4068.31964, 4918.76594, 5896.01890, & - 7009.59166, 8268.36324, 9680.41211, & - 11252.86491, 12991.76409, 14901.95764, & - 16987.01313, 19249.15733, 21689.24182, & - 23845.11055, 25330.63353, 26243.52467, & - 26663.84998, 26657.94696, 26281.61371, & - 25583.05256, 24606.03265, 23393.39510, & - 21990.28845, 20445.82122, 18811.93894, & - 17139.59660, 15473.90350, 13850.50167, & - 12294.49060, 10821.62655, 9440.57746, & - 8155.11214, 6965.72496, 5870.70511, & - 4866.83822, 3949.90019, 3115.03562, & - 2357.07879, 1670.87329, 1051.65120, & - 495.51399, 0.00000, 0.00000 / - - data b56 /0.00000, 0.00000, 0.00000, & - 0.00000, 0.00000, 0.00000, & - 0.00000, 0.00000, 0.00000, & - 0.00000, 0.00000, 0.00000, & - 0.00000, 0.00000, 0.00000, & - 0.00000, 0.00000, 0.00000, & - 0.00000, 0.00000, 0.00000, & - 0.00000, 0.00000, 0.00000, & - 0.00000, 0.00000, 0.00000, & - 0.00462, 0.01769, 0.03821, & - 0.06534, 0.09834, 0.13659, & - 0.17947, 0.22637, 0.27660, & - 0.32929, 0.38343, 0.43791, & - 0.49162, 0.54361, 0.59319, & - 0.63989, 0.68348, 0.72391, & - 0.76121, 0.79545, 0.82679, & - 0.85537, 0.88135, 0.90493, & - 0.92626, 0.94552, 0.96286, & - 0.97840, 0.99223, 1.00000 / - - data a60/ 1.7861000000e-01, 1.0805100000e+00, 3.9647100000e+00, & - 9.7516000000e+00, 1.9816580000e+01, 3.6695950000e+01, & - 6.2550570000e+01, 9.9199620000e+01, 1.4792505000e+02, & - 2.0947487000e+02, 2.8422571000e+02, 3.7241721000e+02, & - 4.7437835000e+02, 5.9070236000e+02, 7.2236063000e+02, & - 8.7076746000e+02, 1.0378138800e+03, 1.2258877300e+03, & - 1.4378924600e+03, 1.6772726600e+03, 1.9480506400e+03, & - 2.2548762700e+03, 2.6030909400e+03, 2.9988059200e+03, & - 3.4489952300e+03, 3.9616028900e+03, 4.5456641600e+03, & - 5.2114401700e+03, 5.9705644000e+03, 6.8361981800e+03, & - 7.8231906000e+03, 8.9482351000e+03, 1.0230010660e+04, & - 1.1689289750e+04, 1.3348986860e+04, 1.5234111060e+04, & - 1.7371573230e+04, 1.9789784580e+04, 2.2005564550e+04, & - 2.3550115120e+04, 2.4468583320e+04, 2.4800548800e+04, & - 2.4582445070e+04, 2.3849999620e+04, 2.2640519740e+04, & - 2.0994737150e+04, 1.8957848730e+04, 1.6579413230e+04, & - 1.4080071030e+04, 1.1753630920e+04, 9.6516996300e+03, & - 7.7938009300e+03, 6.1769062800e+03, 4.7874276000e+03, & - 3.6050497500e+03, 2.6059860700e+03, 1.7668328200e+03, & - 1.0656131200e+03, 4.8226201000e+02, 0.0000000000e+00, & - 0.0000000000e+00 / - - - data b60/ 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & - 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & - 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & - 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & - 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & - 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & - 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & - 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & - 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & - 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & - 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & - 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & - 0.0000000000e+00, 0.0000000000e+00, 5.0600000000e-03, & - 2.0080000000e-02, 4.4900000000e-02, 7.9360000000e-02, & - 1.2326000000e-01, 1.7634000000e-01, 2.3820000000e-01, & - 3.0827000000e-01, 3.8581000000e-01, 4.6989000000e-01, & - 5.5393000000e-01, 6.2958000000e-01, 6.9642000000e-01, & - 7.5458000000e-01, 8.0463000000e-01, 8.4728000000e-01, & - 8.8335000000e-01, 9.1368000000e-01, 9.3905000000e-01, & - 9.6020000000e-01, 9.7775000000e-01, 9.9223000000e-01, & - 1.0000000000e+00 / - -!! This is activated by USE_GFSL63 -!! Thfollowing L63 setting is the same as NCEP GFS's L64 except the top -!! 3 layers -! data a63/64.247, 137.790, 221.958, & -! 318.266, 428.434, 554.424, & -! 698.457, 863.05803, 1051.07995, & -! 1265.75194, 1510.71101, 1790.05098, & -! 2108.36604, 2470.78817, 2883.03811, & -! 3351.46002, 3883.05187, 4485.49315, & -! 5167.14603, 5937.04991, 6804.87379, & -! 7780.84698, 8875.64338, 10100.20534, & -! 11264.35673, 12190.64366, 12905.42546, & -! 13430.87867, 13785.88765, 13986.77987, & -! 14047.96335, 13982.46770, 13802.40331, & -! 13519.33841, 13144.59486, 12689.45608, & -! 12165.28766, 11583.57006, 10955.84778, & -! 10293.60402, 9608.08306, 8910.07678, & -! 8209.70131, 7516.18560, 6837.69250, & -! 6181.19473, 5552.39653, 4955.72632, & -! 4394.37629, 3870.38682, 3384.76586, & -! 2937.63489, 2528.37666, 2155.78385, & -! 1818.20722, 1513.68173, 1240.03585, & -! 994.99144, 776.23591, 581.48797, & -! 408.53400, 255.26520, 119.70243, 0. / -! -! data b63/0.00000, 0.00000, 0.00000, & -! 0.00000, 0.00000, 0.00000, & -! 0.00000, 0.00000, 0.00000, & -! 0.00000, 0.00000, 0.00000, & -! 0.00000, 0.00000, 0.00000, & -! 0.00000, 0.00000, 0.00000, & -! 0.00000, 0.00000, 0.00000, & -! 0.00000, 0.00000, 0.00000, & -! 0.00201, 0.00792, 0.01755, & -! 0.03079, 0.04751, 0.06761, & -! 0.09097, 0.11746, 0.14690, & -! 0.17911, 0.21382, 0.25076, & -! 0.28960, 0.32994, 0.37140, & -! 0.41353, 0.45589, 0.49806, & -! 0.53961, 0.58015, 0.61935, & -! 0.65692, 0.69261, 0.72625, & -! 0.75773, 0.78698, 0.81398, & -! 0.83876, 0.86138, 0.88192, & -! 0.90050, 0.91722, 0.93223, & -! 0.94565, 0.95762, 0.96827, & -! 0.97771, 0.98608, 0.99347, 1./ -#ifdef GFSL64 -! data a64/20.00000, 68.00000, 137.79000, & -! 221.95800, 318.26600, 428.43400, & -! 554.42400, 698.45700, 863.05803, & -! 1051.07995, 1265.75194, 1510.71101, & -! 1790.05098, 2108.36604, 2470.78817, & -! 2883.03811, 3351.46002, 3883.05187, & -! 4485.49315, 5167.14603, 5937.04991, & -! 6804.87379, 7780.84698, 8875.64338, & -! 9921.40745, 10760.99844, 11417.88354, & -! 11911.61193, 12258.61668, 12472.89642, & -! 12566.58298, 12550.43517, 12434.26075, & -! 12227.27484, 11938.39468, 11576.46910, & -! 11150.43640, 10669.41063, 10142.69482, & -! 9579.72458, 8989.94947, 8382.67090, & -! 7766.85063, 7150.91171, 6542.55077, & -! 5948.57894, 5374.81094, 4825.99383, & -! 4305.79754, 3816.84622, 3360.78848, & -! 2938.39801, 2549.69756, 2194.08449, & -! 1870.45732, 1577.34218, 1313.00028, & -! 1075.52114, 862.90778, 673.13815, & -! 504.22118, 354.22752, 221.32110, & -! 103.78014, 0./ -! data b64/0.00000, 0.00000, 0.00000, & -! 0.00000, 0.00000, 0.00000, & -! 0.00000, 0.00000, 0.00000, & -! 0.00000, 0.00000, 0.00000, & -! 0.00000, 0.00000, 0.00000, & -! 0.00000, 0.00000, 0.00000, & -! 0.00000, 0.00000, 0.00000, & -! 0.00000, 0.00000, 0.00000, & -! 0.00179, 0.00705, 0.01564, & -! 0.02749, 0.04251, 0.06064, & -! 0.08182, 0.10595, 0.13294, & -! 0.16266, 0.19492, 0.22950, & -! 0.26615, 0.30455, 0.34435, & -! 0.38516, 0.42656, 0.46815, & -! 0.50949, 0.55020, 0.58989, & -! 0.62825, 0.66498, 0.69987, & -! 0.73275, 0.76351, 0.79208, & -! 0.81845, 0.84264, 0.86472, & -! 0.88478, 0.90290, 0.91923, & -! 0.93388, 0.94697, 0.95865, & -! 0.96904, 0.97826, 0.98642, & -! 0.99363, 1./ - data a64/20.00000, 64.24700, 137.79000, & - 221.95800, 318.26600, 428.43400, & - 554.42400, 698.45700, 863.05800, & - 1051.08000, 1265.75200, 1510.71100, & - 1790.05100, 2108.36600, 2470.78800, & - 2883.03800, 3351.46000, 3883.05200, & - 4485.49300, 5167.14600, 5937.05000, & - 6804.87400, 7777.15000, 8832.53700, & - 9936.61400, 11054.85300, 12152.93700, & - 13197.06500, 14154.31600, 14993.07400, & - 15683.48900, 16197.96700, 16511.73000, & - 16611.60300, 16503.14400, 16197.31500, & - 15708.89300, 15056.34200, 14261.43500, & - 13348.67100, 12344.49000, 11276.34800, & - 10171.71200, 9057.05100, 7956.90800, & - 6893.11700, 5884.20600, 4945.02900, & - 4086.61400, 3316.21700, 2637.55300, & - 2051.15000, 1554.78900, 1143.98800, & - 812.489000, 552.72000, 356.22300, & - 214.015000, 116.89900, 55.71200, & - 21.516000, 5.74100, 0.57500, & - 0.000000, 0./ - data b64/0.00000, 0.00000, 0.00000, & - 0.00000, 0.00000, 0.00000, & - 0.00000, 0.00000, 0.00000, & - 0.00000, 0.00000, 0.00000, & - 0.00000, 0.00000, 0.00000, & - 0.00000, 0.00000, 0.00000, & - 0.00000, 0.00000, 0.00000, & - 0.00000, 3.697e-05, 0.00043106, & - 0.00163591, 0.00410671, 0.00829402, & - 0.01463712, 0.02355588, 0.03544162, & - 0.05064684, 0.06947458, 0.09216691, & - 0.11881219, 0.14926877, 0.18329624, & - 0.22057019, 0.26068545, 0.30316412, & - 0.34746849, 0.39301826, 0.43921080, & - 0.48544331, 0.53113482, 0.57574665, & - 0.61879962, 0.65988704, 0.69868292, & - 0.73494523, 0.76851468, 0.79930974, & - 0.82731884, 0.85259067, 0.87522360, & - 0.89535499, 0.91315100, 0.92879731, & - 0.94249106, 0.95443411, 0.96482757, & - 0.9738676, 0.98174229, 0.98862660, & - 0.99467119, 1./ - -#else - data a64/1.00000, 3.90000, 8.70000, & - 15.42000, 24.00000, 34.50000, & - 47.00000, 61.50000, 78.60000, & - 99.13500, 124.12789, 154.63770, & - 191.69700, 236.49300, 290.38000, & - 354.91000, 431.82303, 523.09300, & - 630.92800, 757.79000, 906.45000, & - 1079.85000, 1281.00000, 1515.00000, & - 1788.00000, 2105.00000, 2470.00000, & - 2889.00000, 3362.00000, 3890.00000, & - 4475.00000, 5120.00000, 5830.00000, & - 6608.00000, 7461.00000, 8395.00000, & - 9424.46289, 10574.46880, 11864.80270, & - 13312.58890, 14937.03710, 16759.70700, & - 18804.78710, 21099.41210, 23674.03710, & - 26562.82810, 29804.11720, 32627.31640, & - 34245.89840, 34722.28910, 34155.19920, & - 32636.50390, 30241.08200, 27101.44920, & - 23362.20700, 19317.05270, 15446.17090, & - 12197.45210, 9496.39941, 7205.66992, & - 5144.64307, 3240.79346, 1518.62134, & - 0.00000, 0.00000 / - - data b64/0.00000, 0.00000, 0.00000, & - 0.00000, 0.00000, 0.00000, & - 0.00000, 0.00000, 0.00000, & - 0.00000, 0.00000, 0.00000, & - 0.00000, 0.00000, 0.00000, & - 0.00000, 0.00000, 0.00000, & - 0.00000, 0.00000, 0.00000, & - 0.00000, 0.00000, 0.00000, & - 0.00000, 0.00000, 0.00000, & - 0.00000, 0.00000, 0.00000, & - 0.00000, 0.00000, 0.00000, & - 0.00000, 0.00000, 0.00000, & - 0.00000, 0.00000, 0.00000, & - 0.00000, 0.00000, 0.00000, & - 0.00000, 0.00000, 0.00000, & - 0.00000, 0.00000, 0.00813, & - 0.03224, 0.07128, 0.12445, & - 0.19063, 0.26929, 0.35799, & - 0.45438, 0.55263, 0.64304, & - 0.71703, 0.77754, 0.82827, & - 0.87352, 0.91502, 0.95235, & - 0.98511, 1.00000 / -#endif -!-->cjg - data a68/1.00000, 2.68881, 5.15524, & - 8.86683, 14.20349, 22.00278, & - 33.50807, 50.32362, 74.56680, & - 109.05958, 157.51214, 224.73844, & - 316.90481, 441.81219, 609.21090, & - 831.14537, 1122.32514, 1500.51628, & - 1986.94617, 2606.71274, 3389.18802, & - 4368.40473, 5583.41379, 7078.60015, & - 8903.94455, 11115.21886, 13774.60566, & - 16936.82070, 20340.47045, 23193.71492, & - 24870.36141, 25444.59363, 25252.57081, & - 24544.26211, 23474.29096, 22230.65331, & - 20918.50731, 19589.96280, 18296.26682, & - 17038.02866, 15866.85655, 14763.18943, & - 13736.83624, 12794.11850, 11930.72442, & - 11137.17217, 10404.78946, 9720.03954, & - 9075.54055, 8466.72650, 7887.12346, & - 7333.90490, 6805.43028, 6297.33773, & - 5805.78227, 5327.94995, 4859.88765, & - 4398.63854, 3942.81761, 3491.08449, & - 3043.04531, 2598.71608, 2157.94527, & - 1720.87444, 1287.52805, 858.02944, & - 432.71276, 8.10905, 0.00000 / - - data b68/0.00000, 0.00000, 0.00000, & - 0.00000, 0.00000, 0.00000, & - 0.00000, 0.00000, 0.00000, & - 0.00000, 0.00000, 0.00000, & - 0.00000, 0.00000, 0.00000, & - 0.00000, 0.00000, 0.00000, & - 0.00000, 0.00000, 0.00000, & - 0.00000, 0.00000, 0.00000, & - 0.00000, 0.00000, 0.00000, & - 0.00000, 0.00283, 0.01590, & - 0.04412, 0.08487, 0.13284, & - 0.18470, 0.23828, 0.29120, & - 0.34211, 0.39029, 0.43518, & - 0.47677, 0.51536, 0.55091, & - 0.58331, 0.61263, 0.63917, & - 0.66333, 0.68552, 0.70617, & - 0.72555, 0.74383, 0.76117, & - 0.77765, 0.79335, 0.80838, & - 0.82287, 0.83693, 0.85069, & - 0.86423, 0.87760, 0.89082, & - 0.90392, 0.91689, 0.92973, & - 0.94244, 0.95502, 0.96747, & - 0.97979, 0.99200, 1.00000 / - - data a96/1.00000, 2.35408, 4.51347, & - 7.76300, 12.43530, 19.26365, & - 29.33665, 44.05883, 65.28397, & - 95.48274, 137.90344, 196.76073, & - 277.45330, 386.81095, 533.37018, & - 727.67600, 982.60677, 1313.71685, & - 1739.59104, 2282.20281, 2967.26766, & - 3824.58158, 4888.33404, 6197.38450, & - 7795.49158, 9731.48414, 11969.71024, & - 14502.88894, 17304.52434, 20134.76139, & - 22536.63814, 24252.54459, 25230.65591, & - 25585.72044, 25539.91412, 25178.87141, & - 24644.84493, 23978.98781, 23245.49366, & - 22492.11600, 21709.93990, 20949.64473, & - 20225.94258, 19513.31158, 18829.32485, & - 18192.62250, 17589.39396, 17003.45386, & - 16439.01774, 15903.91204, 15396.39758, & - 14908.02140, 14430.65897, 13967.88643, & - 13524.16667, 13098.30227, 12687.56457, & - 12287.08757, 11894.41553, 11511.54106, & - 11139.22483, 10776.01912, 10419.75711, & - 10067.11881, 9716.63489, 9369.61967, & - 9026.69066, 8687.29884, 8350.04978, & - 8013.20925, 7677.12187, 7343.12994, & - 7011.62844, 6681.98102, 6353.09764, & - 6025.10535, 5699.10089, 5375.54503, & - 5053.63074, 4732.62740, 4413.38037, & - 4096.62775, 3781.79777, 3468.45371, & - 3157.19882, 2848.25306, 2541.19150, & - 2236.21942, 1933.50628, 1632.83741, & - 1334.35954, 1038.16655, 744.22318, & - 452.71094, 194.91899, 0.00000, & - 0.00000 / - - data b96/0.00000, 0.00000, 0.00000, & - 0.00000, 0.00000, 0.00000, & - 0.00000, 0.00000, 0.00000, & - 0.00000, 0.00000, 0.00000, & - 0.00000, 0.00000, 0.00000, & - 0.00000, 0.00000, 0.00000, & - 0.00000, 0.00000, 0.00000, & - 0.00000, 0.00000, 0.00000, & - 0.00000, 0.00000, 0.00000, & - 0.00000, 0.00000, 0.00193, & - 0.00974, 0.02538, 0.04876, & - 0.07817, 0.11081, 0.14514, & - 0.18007, 0.21486, 0.24866, & - 0.28088, 0.31158, 0.34030, & - 0.36701, 0.39210, 0.41554, & - 0.43733, 0.45774, 0.47707, & - 0.49540, 0.51275, 0.52922, & - 0.54495, 0.56007, 0.57459, & - 0.58850, 0.60186, 0.61471, & - 0.62715, 0.63922, 0.65095, & - 0.66235, 0.67348, 0.68438, & - 0.69510, 0.70570, 0.71616, & - 0.72651, 0.73675, 0.74691, & - 0.75700, 0.76704, 0.77701, & - 0.78690, 0.79672, 0.80649, & - 0.81620, 0.82585, 0.83542, & - 0.84492, 0.85437, 0.86375, & - 0.87305, 0.88229, 0.89146, & - 0.90056, 0.90958, 0.91854, & - 0.92742, 0.93623, 0.94497, & - 0.95364, 0.96223, 0.97074, & - 0.97918, 0.98723, 0.99460, & - 1.00000 / -!<--cjg -! -! Ultra high troposphere resolution - data a100/100.00000, 300.00000, 800.00000, & - 1762.35235, 3106.43596, 4225.71874, & - 4946.40525, 5388.77387, 5708.35540, & - 5993.33124, 6277.73673, 6571.49996, & - 6877.05339, 7195.14327, 7526.24920, & - 7870.82981, 8229.35361, 8602.30193, & - 8990.16936, 9393.46399, 9812.70768, & - 10248.43625, 10701.19980, 11171.56286, & - 11660.10476, 12167.41975, 12694.11735, & - 13240.82253, 13808.17600, 14396.83442, & - 15007.47066, 15640.77407, 16297.45067, & - 16978.22343, 17683.83253, 18415.03554, & - 19172.60771, 19957.34218, 20770.05022, & - 21559.14829, 22274.03147, 22916.87519, & - 23489.70456, 23994.40187, 24432.71365, & - 24806.25734, 25116.52754, 25364.90190, & - 25552.64670, 25680.92203, 25750.78675, & - 25763.20311, 25719.04113, 25619.08274, & - 25464.02630, 25254.49482, 24991.06137, & - 24674.32737, 24305.11235, 23884.79781, & - 23415.77059, 22901.76510, 22347.84738, & - 21759.93950, 21144.07284, 20505.73136, & - 19849.54271, 19179.31412, 18498.23400, & - 17809.06809, 17114.28232, 16416.10343, & - 15716.54833, 15017.44246, 14320.43478, & - 13627.01116, 12938.50682, 12256.11762, & - 11580.91062, 10913.83385, 10255.72526, & - 9607.32122, 8969.26427, 8342.11044, & - 7726.33606, 7122.34405, 6530.46991, & - 5950.98721, 5384.11279, 4830.01153, & - 4288.80090, 3760.55514, 3245.30920, & - 2743.06250, 2253.78294, 1777.41285, & - 1313.88054, 863.12371, 425.13088, & - 0.00000, 0.00000 / - - - data b100/0.00000, 0.00000, 0.00000, & - 0.00000, 0.00000, 0.00000, & - 0.00000, 0.00000, 0.00000, & - 0.00000, 0.00000, 0.00000, & - 0.00000, 0.00000, 0.00000, & - 0.00000, 0.00000, 0.00000, & - 0.00000, 0.00000, 0.00000, & - 0.00000, 0.00000, 0.00000, & - 0.00000, 0.00000, 0.00000, & - 0.00000, 0.00000, 0.00000, & - 0.00000, 0.00000, 0.00000, & - 0.00000, 0.00000, 0.00000, & - 0.00000, 0.00000, 0.00000, & - 0.00052, 0.00209, 0.00468, & - 0.00828, 0.01288, 0.01849, & - 0.02508, 0.03266, 0.04121, & - 0.05075, 0.06126, 0.07275, & - 0.08521, 0.09866, 0.11308, & - 0.12850, 0.14490, 0.16230, & - 0.18070, 0.20009, 0.22042, & - 0.24164, 0.26362, 0.28622, & - 0.30926, 0.33258, 0.35605, & - 0.37958, 0.40308, 0.42651, & - 0.44981, 0.47296, 0.49591, & - 0.51862, 0.54109, 0.56327, & - 0.58514, 0.60668, 0.62789, & - 0.64872, 0.66919, 0.68927, & - 0.70895, 0.72822, 0.74709, & - 0.76554, 0.78357, 0.80117, & - 0.81835, 0.83511, 0.85145, & - 0.86736, 0.88286, 0.89794, & - 0.91261, 0.92687, 0.94073, & - 0.95419, 0.96726, 0.97994, & - 0.99223, 1.00000 / - - data a104/ & - 1.8827062944e-01, 7.7977549145e-01, 2.1950593583e+00, & - 4.9874566624e+00, 9.8041418997e+00, 1.7019717163e+01, & - 2.7216579591e+01, 4.0518628401e+01, 5.6749646818e+01, & - 7.5513868331e+01, 9.6315093333e+01, 1.1866706195e+02, & - 1.4216835396e+02, 1.6653733709e+02, 1.9161605772e+02, & - 2.1735580129e+02, 2.4379516604e+02, 2.7103771847e+02, & - 2.9923284173e+02, 3.2856100952e+02, 3.5922338766e+02, & - 3.9143507908e+02, 4.2542117983e+02, 4.6141487902e+02, & - 4.9965698106e+02, 5.4039638379e+02, 5.8389118154e+02, & - 6.3041016829e+02, 6.8023459505e+02, 7.3366009144e+02, & - 7.9099869949e+02, 8.5258099392e+02, 9.1875827946e+02, & - 9.8990486716e+02, 1.0664204381e+03, 1.1487325074e+03, & - 1.2372990044e+03, 1.3326109855e+03, 1.4351954993e+03, & - 1.5456186222e+03, 1.6644886848e+03, 1.7924597105e+03, & - 1.9302350870e+03, 2.0785714934e+03, 2.2382831070e+03, & - 2.4102461133e+03, 2.5954035462e+03, 2.7947704856e+03, & - 3.0094396408e+03, 3.2405873512e+03, 3.4894800360e+03, & - 3.7574811281e+03, 4.0460585279e+03, 4.3567926151e+03, & - 4.6913848588e+03, 5.0516670674e+03, 5.4396113207e+03, & - 5.8573406270e+03, 6.3071403487e+03, 6.7914704368e+03, & - 7.3129785102e+03, 7.8745138115e+03, 8.4791420557e+03, & - 9.1301611750e+03, 9.8311179338e+03, 1.0585825354e+04, & - 1.1398380836e+04, 1.2273184781e+04, 1.3214959424e+04, & - 1.4228767429e+04, 1.5320029596e+04, 1.6494540743e+04, & - 1.7758482452e+04, 1.9118430825e+04, 2.0422798801e+04, & - 2.1520147587e+04, 2.2416813461e+04, 2.3118184510e+04, & - 2.3628790785e+04, 2.3952411814e+04, 2.4092209011e+04, & - 2.4050892106e+04, 2.3830930156e+04, 2.3434818358e+04, & - 2.2865410898e+04, 2.2126326004e+04, 2.1222420323e+04, & - 2.0160313690e+04, 1.8948920926e+04, 1.7599915822e+04, & - 1.6128019809e+04, 1.4550987232e+04, 1.2889169132e+04, & - 1.1164595563e+04, 9.4227665517e+03, 7.7259097899e+03, & - 6.1538244381e+03, 4.7808126007e+03, 3.5967415552e+03, & - 2.5886394104e+03, 1.7415964865e+03, 1.0393721271e+03, & - 4.6478852032e+02, 7.0308342481e-13, 0.0000000000e+00 / - - - data b104/ & - 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & - 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & - 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & - 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & - 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & - 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & - 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & - 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & - 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & - 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & - 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & - 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & - 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & - 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & - 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & - 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & - 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & - 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & - 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & - 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & - 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & - 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & - 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & - 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & - 0.0000000000e+00, 0.0000000000e+00, 1.5648447298e-03, & - 6.2617046389e-03, 1.4104157933e-02, 2.5118187415e-02, & - 3.9340510972e-02, 5.6816335609e-02, 7.7596328431e-02, & - 1.0173255472e-01, 1.2927309709e-01, 1.6025505622e-01, & - 1.9469566981e-01, 2.3258141217e-01, 2.7385520518e-01, & - 3.1840233814e-01, 3.6603639170e-01, 4.1648734767e-01, & - 4.6939496013e-01, 5.2431098738e-01, 5.8071350676e-01, & - 6.3803478105e-01, 6.9495048840e-01, 7.4963750338e-01, & - 7.9975208897e-01, 8.4315257576e-01, 8.8034012292e-01, & - 9.1184389721e-01, 9.3821231526e-01, 9.6000677644e-01, & - 9.7779792223e-01, 9.9216315122e-01, 1.0000000000e+00 / - -! IFS-like L125(top 12 levels removed from IFSL137) - data a125/ 64., & - 86.895882, 107.415741, 131.425507, 159.279404, 191.338562, & - 227.968948, 269.539581, 316.420746, 368.982361, 427.592499, 492.616028, & - 564.413452, 643.339905, 729.744141, 823.967834, 926.344910, 1037.201172, & - 1156.853638, 1285.610352, 1423.770142, 1571.622925, 1729.448975, 1897.519287, & - 2076.095947, 2265.431641, 2465.770508, 2677.348145, 2900.391357, 3135.119385, & - 3381.743652, 3640.468262, 3911.490479, 4194.930664, 4490.817383, 4799.149414, & - 5119.895020, 5452.990723, 5798.344727, 6156.074219, 6526.946777, 6911.870605, & - 7311.869141, 7727.412109, 8159.354004, 8608.525391, 9076.400391, 9562.682617, & - 10065.978516, 10584.631836, 11116.662109, 11660.067383, 12211.547852, 12766.873047, & - 13324.668945, 13881.331055, 14432.139648, 14975.615234, 15508.256836, 16026.115234, & - 16527.322266, 17008.789063, 17467.613281, 17901.621094, 18308.433594, 18685.718750, & - 19031.289063, 19343.511719, 19620.042969, 19859.390625, 20059.931641, 20219.664063, & - 20337.863281, 20412.308594, 20442.078125, 20425.718750, 20361.816406, 20249.511719, & - 20087.085938, 19874.025391, 19608.572266, 19290.226563, 18917.460938, 18489.707031, & - 18006.925781, 17471.839844, 16888.687500, 16262.046875, 15596.695313, 14898.453125, & - 14173.324219, 13427.769531, 12668.257813, 11901.339844, 11133.304688, 10370.175781, & - 9617.515625, 8880.453125, 8163.375000, 7470.343750, 6804.421875, 6168.531250, & - 5564.382813, 4993.796875, 4457.375000, 3955.960938, 3489.234375, 3057.265625, & - 2659.140625, 2294.242188, 1961.500000, 1659.476563, 1387.546875, 1143.250000, & - 926.507813, 734.992188, 568.062500, 424.414063, 302.476563, 202.484375, & - 122.101563, 62.781250, 22.835938, 3.757813, 0.000000, 0.000000 / - - data b125/ 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, & - 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, & - 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, & - 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, & - 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, & - 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, & - 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, & - 0.000000, 0.000007, 0.000024, 0.000059, 0.000112, 0.000199, & - 0.000340, 0.000562, 0.000890, 0.001353, 0.001992, 0.002857, & - 0.003971, 0.005378, 0.007133, 0.009261, 0.011806, 0.014816, & - 0.018318, 0.022355, 0.026964, 0.032176, 0.038026, 0.044548, & - 0.051773, 0.059728, 0.068448, 0.077958, 0.088286, 0.099462, & - 0.111505, 0.124448, 0.138313, 0.153125, 0.168910, 0.185689, & - 0.203491, 0.222333, 0.242244, 0.263242, 0.285354, 0.308598, & - 0.332939, 0.358254, 0.384363, 0.411125, 0.438391, 0.466003, & - 0.493800, 0.521619, 0.549301, 0.576692, 0.603648, 0.630036, & - 0.655736, 0.680643, 0.704669, 0.727739, 0.749797, 0.770798, & - 0.790717, 0.809536, 0.827256, 0.843881, 0.859432, 0.873929, & - 0.887408, 0.899900, 0.911448, 0.922096, 0.931881, 0.940860, & - 0.949064, 0.956550, 0.963352, 0.969513, 0.975078, 0.980072, & - 0.984542, 0.988500, 0.991984, 0.995003, 0.997630, 1.000000 / - - select case (km) - - case (24) - + + if (trim(npz_type) == 'superC' .or. trim(npz_type) == 'superK') then + auto_routine = 1 + select case (km) + case (20) + ptop = 56.e2 + pint = ptop + stretch_fac = 1.03 + case (24) + ptop = 56.e2 + pint = ptop + stretch_fac = 1.03 + case (30) + ptop = 56.e2 + pint = ptop + stretch_fac = 1.03 + case (40) + ptop = 56.e2 + pint = ptop + stretch_fac = 1.03 + case (50) + ptop = 56.e2 + pint = ptop + stretch_fac = 1.03 + case (60) + ptop = 56.e2 + pint = ptop + stretch_fac = 1.03 + case (80) + ptop = 56.e2 + pint = ptop + stretch_fac = 1.03 + case (90) ! super-duper cell + ptop = 40.e2 + stretch_fac = 1.025 + auto_routine = 2 + end select + else if (trim(npz_type) == 'input') then + !GJF: not implemented yet + write(*,*) 'scm_vgrid: npz_type = input is not supported yet' + stop + ! Jili Dong add ak/bk input + !call ascii_read (trim(fv_eta_file), eta_level_unit) + !!--- fv_eta_file being read in must have the following format: + !! include a single line description + !! ak/bk pairs, with each pair occupying a single line + !! the pairs must be ordered from surface to TOA + !! the pairs define the levels of the grid to create levels-1 layers + !if (size(eta_level_unit(:)) /= km+2) then + ! print *,' size is ', size(eta_level_unit(:)) + ! call error_mesg ('FV3 set_eta',trim(fv_eta_file)//" has too few or too many entries or has extra & + ! &spaces at the end of the file", FATAL) + !endif + !l = 1 + !read(eta_level_unit(l),*) + !do k=km+1,1,-1 + ! l = l + 1 + ! read(eta_level_unit(l),*) ak(k),bk(k) + !end do + !deallocate (eta_level_unit) + !call set_external_eta(ak, bk, ptop, ks) + else + select case (km) + case (5,10) ! does this work???? + ! Equivalent Shallow Water: for modon test + ptop = 500.e2 + ks = 0 + do k=1,km+1 + scm_state%b_k(k) = real(k-1) / real (km) + scm_state%a_k(k) = ptop*(1.-scm_state%b_k(k)) + enddo + case (24) ks = 5 do k=1,km+1 scm_state%a_k(k) = a24(k) scm_state%b_k(k) = b24(k) enddo - - case (26) - + case (26) ks = 7 do k=1,km+1 scm_state%a_k(k) = a26(k) scm_state%b_k(k) = b26(k) enddo - + case (30) ! For Baroclinic Instability Test + ptop = 2.26e2 + pint = 250.E2 + stretch_fac = 1.03 + auto_routine = 1 + case (31) ! N = 4, M=2 + if (trim(npz_type) == 'lowtop') then + ptop = 300. + pint = 100.E2 + stretch_fac = 1.035 + auto_routine = 5 + else + ptop = 100. + stretch_fac = 1.035 + auto_routine = 1 + endif case (32) -#ifdef OLD_32 - ks = 13 ! high-res trop_32 setup -#else + if (trim(npz_type) == 'old32') then + ks = 13 ! high-res trop_32 setup + do k=1,km+1 + scm_state%a_k(k) = a32old(k) + scm_state%b_k(k) = b32old(k) + enddo + elseif (trim(npz_type) == 'lowtop') then + ptop = 100. + stretch_fac = 1.035 + auto_routine = 1 + else + ks = 7 + do k=1,km+1 + scm_state%a_k(k) = a32(k) + scm_state%b_k(k) = b32(k) + enddo + endif + !miz + case (33) ks = 7 -#endif do k=1,km+1 - scm_state%a_k(k) = a32(k) - scm_state%b_k(k) = b32(k) + scm_state%a_k(k) = a33(k) + scm_state%b_k(k) = b33(k) enddo - - case (47) - ! ks = 27 ! high-res trop-strat - ks = 20 ! Oct 23, 2012 - do k=1,km+1 - scm_state%a_k(k) = a47(k) - scm_state%b_k(k) = b47(k) - enddo - + !miz + case (39) ! N = 5 + ptop = 100. + stretch_fac = 1.035 + auto_routine = 1 + case (40) + ptop = 50.e2 ! For super cell test + pint = 300.E2 + stretch_fac = 1.03 + auto_routine = 1 + case (41) + ptop = 100. + pint = 100.E2 + stretch_fac = 1.035 + auto_routine = 1 + case (47) + if (trim(npz_type) == 'lowtop') then + ptop = 100. + stretch_fac = 1.035 + auto_routine = 1 + else + ! ks = 27 ! high-res trop-strat + ks = 20 ! Oct 23, 2012 + do k=1,km+1 + scm_state%a_k(k) = a47(k) + scm_state%b_k(k) = b47(k) + enddo + endif case (48) ks = 28 do k=1,km+1 scm_state%a_k(k) = a48(k) scm_state%b_k(k) = b48(k) enddo - - case (52) - ks = 35 ! pint = 223 + case (50) + ! ! *Very-low top: for idealized super-cell simulation: + ! ptop = 50.e2 + ! pint = 250.E2 + ! stretch_fac = 1.03 + ! auto_routine = 1 + ks = 19 do k=1,km+1 - scm_state%a_k(k) = a52(k) - scm_state%b_k(k) = b52(k) + scm_state%a_k(k) = a50(k) + scm_state%b_k(k) = b50(k) enddo - + case (51) + if (trim(npz_type) == 'lowtop') then + ptop = 100. + stretch_fac = 1.03 + auto_routine = 1 + elseif (trim(npz_type) == 'meso') then + ptop = 20.E2 + pint = 100.E2 + stretch_fac = 1.05 + auto_routine = 1 + elseif (trim(npz_type) == 'meso2') then + ptop = 1.E2 + pint = 100.E2 + stretch_fac = 1.05 + auto_routine = 6 + else + ptop = 100. + pint = 100.E2 + stretch_fac = 1.035 + auto_routine = 1 + endif + case (52) + if (trim(npz_type) == 'rce') then + ptop = 30.e2 ! for special DPM RCE experiments + stretch_fac = 1.03 + auto_routine = 1 + else + ks = 35 ! pint = 223 + do k=1,km+1 + scm_state%a_k(k) = a52(k) + scm_state%b_k(k) = b52(k) + enddo + endif case (54) ks = 11 ! pint = 109.4 do k=1,km+1 scm_state%a_k(k) = a54(k) scm_state%b_k(k) = b54(k) enddo - + case (55) ! Mid-top: ! N = 7 + ptop = 10. + pint = 100.E2 + stretch_fac = 1.035 + auto_routine = 1 case (56) ks = 26 do k=1,km+1 scm_state%a_k(k) = a56(k) scm_state%b_k(k) = b56(k) enddo - case (60) - ks = 37 - do k=1,km+1 - scm_state%a_k(k) = a60(k) - scm_state%b_k(k) = b60(k) - enddo - - + if (trim(npz_type) == 'gfs') then + ks = 20 + do k=1,km+1 + scm_state%a_k(k) = a60gfs(k) + scm_state%b_k(k) = b60gfs(k) + enddo + else if (trim(npz_type) == 'BCwave') then + ptop = 3.e2 + ! pint = 250.E2 + pint = 300.E2 ! revised for Moist test + stretch_fac = 1.03 + auto_routine = 1 + else if (trim(npz_type) == 'meso') then + ptop = 40.e2 + pint = 250.E2 + stretch_fac = 1.03 + auto_routine = 1 + else + ks = 19 + do k=1,km+1 + scm_state%a_k(k) = a60(k) + scm_state%b_k(k) = b60(k) + enddo + endif + case (63) + if (trim(npz_type) == 'meso') then + ks = 11 + do k=1,km+1 + scm_state%a_k(k) = a63meso(k) + scm_state%b_k(k) = b63meso(k) + enddo + elseif (trim(npz_type) == 'hitop') then + ptop = 1. ! high top + pint = 100.E2 + stretch_fac = 1.035 + auto_routine = 1 + else!if (trim(npz_type) == 'gfs') then + !Used for SHiELD + ! GFS L64 equivalent setting + ks = 23 + do k=1,km+1 + scm_state%a_k(k) = a63(k) + scm_state%b_k(k) = b63(k) + enddo + endif case (64) -#ifdef GFSL64 - ks = 23 -#else - ks = 46 -#endif - do k=1,km+1 - scm_state%a_k(k) = a64(k) - scm_state%b_k(k) = b64(k) - enddo - !-->cjg + if (trim(npz_type) == 'gfs') then + ks = 23 + do k=1,km+1 + scm_state%a_k(k) = a64gfs(k) + scm_state%b_k(k) = b64gfs(k) + enddo + else + ks = 46 + do k=1,km+1 + scm_state%a_k(k) = a64(k) + scm_state%b_k(k) = b64(k) + enddo + endif + !-->cjg case (68) ks = 27 do k=1,km+1 scm_state%a_k(k) = a68(k) scm_state%b_k(k) = b68(k) enddo - + case (71) ! N = 9 + ptop = 1. + stretch_fac = 1.03 + auto_routine = 1 + case (75) ! HS-SGO test configuration + pint = 100.E2 + ptop = 10.E2 + stretch_fac = 1.035 + auto_routine = 6 + case (79) ! N = 10, M=5 + if (trim(npz_type) == 'gcrm') then + pint = 100.E2 + ptop = 3.E2 + stretch_fac = 1.035 + auto_routine = 6 + else + ptop = 1. + stretch_fac = 1.03 + auto_routine = 1 + endif + case (90) ! super-duper cell + ptop = 40.e2 + stretch_fac = 1.025 + auto_routine = 2 + case (91) ! NGGPS_GFS + pint = 100.E2 + ptop = 40. + stretch_fac = 1.029 + auto_routine = 6 + case (95) + ! Mid-top settings: + pint = 100.E2 + ptop = 20. + stretch_fac = 1.029 + auto_routine = 6 case (96) ks = 27 do k=1,km+1 scm_state%a_k(k) = a96(k) scm_state%b_k(k) = b96(k) enddo - !<--cjg - + !<--cjg case (100) ks = 38 do k=1,km+1 scm_state%a_k(k) = a100(k) scm_state%b_k(k) = b100(k) enddo - case (104) ks = 73 do k=1,km+1 scm_state%a_k(k) = a104(k) scm_state%b_k(k) = b104(k) enddo - -#ifndef TEST_GWAVES - case (10) - !-------------------------------------------------- - ! Pure sigma-coordinate with uniform spacing in "z" - !-------------------------------------------------- - ! - pt = 2000. ! model top pressure (pascal) - ! pt = 100. ! 1 mb - press(1) = pt - press(km+1) = p0 - dlnp = (log(p0) - log(pt)) / real(km) - - lnpe = log(press(km+1)) - do k=km,2,-1 - lnpe = lnpe - dlnp - press(k) = exp(lnpe) - enddo - - ! Search KS - ks = 0 - do k=1,km - if(press(k) >= pc) then - ks = k-1 - goto 123 - endif - enddo -123 continue - - if(ks /= 0) then - do k=1,ks - scm_state%a_k(k) = press(k) - scm_state%b_k(k) = 0. - enddo - endif - - pint = press(ks+1) - do k=ks+1,km - scm_state%a_k(k) = pint*(press(km)-press(k))/(press(km)-pint) - scm_state%b_k(k) = (press(k) - scm_state%a_k(k)) / press(km+1) - enddo - scm_state%a_k(km+1) = 0. - scm_state%b_k(km+1) = 1. - - ! do k=2,km - ! scm_state%b_k(k) = real(k-1) / real(km) - ! scm_state%a_k(k) = pt * ( 1. - scm_state%b_k(k) ) - ! enddo -#endif - -! The following 4 selections are better for non-hydrostatic -! Low top: - case (31) - ptop = 300. - pint = 100.E2 - call var_dz(km, scm_state%a_k, scm_state%b_k, ptop, ks, pint, 1.035) -#ifndef TEST_GWAVES - case (41) - ptop = 100. - pint = 100.E2 - call var_hi(km, scm_state%a_k, scm_state%b_k, ptop, ks, pint, 1.035) -#endif - case (51) - ptop = 100. - pint = 100.E2 - call var_hi(km, scm_state%a_k, scm_state%b_k, ptop, ks, pint, 1.035) - ! Mid-top: - case (55) - ptop = 10. - pint = 100.E2 - ! call var_dz(km, scm_state%a_k, scm_state%b_k, ptop, ks, pint, 1.035) - call var_hi(km, scm_state%a_k, scm_state%b_k, ptop, ks, pint, 1.035) -#ifdef USE_GFSL63 -! GFS L64 equivalent setting - case (63) - ks = 23 - ptop = a63(1) - pint = a63(ks+1) - do k=1,km+1 - scm_state%a_k(k) = a63(k) - scm_state%b_k(k) = b63(k) - enddo -#else - case (63) - ptop = 1. ! high top - pint = 100.E2 - call var_hi(km, scm_state%a_k, scm_state%b_k, ptop, ks, pint, 1.035) -#endif -! NGGPS_GFS - case (91) - pint = 100.E2 - ptop = 40. - call var_gfs(km, scm_state%a_k, scm_state%b_k, ptop, ks, pint, 1.029) - case (95) - ! Mid-top settings: - pint = 100.E2 - ptop = 20. - call var_gfs(km, scm_state%a_k, scm_state%b_k, ptop, ks, pint, 1.028) - case (127) - ptop = 1. - pint = 75.E2 - call var_gfs(km, scm_state%a_k, scm_state%b_k, ptop, ks, pint, 1.028) - ! IFS-like L125 + ! IFS-like L125 case (125) ks = 33 ptop = a125(1) @@ -1218,43 +490,73 @@ subroutine get_FV3_vgrid(scm_input, scm_state) scm_state%a_k(k) = a125(k) scm_state%b_k(k) = b125(k) enddo + case (127) ! N = 10, M=5 + if (trim(npz_type) == 'hitop') then + ptop = 1. + stretch_fac = 1.03 + auto_routine = 2 + else + ptop = 1. + pint = 75.E2 + stretch_fac = 1.028 + auto_routine = 6 + endif + case (151) + !LES applications + ptop = 75.e2 + pint = 500.E2 + stretch_fac = 1.01 + auto_routine = 3 case default + if(trim(npz_type) == 'hitop') then + ptop = 1. + pint = 100.E2 + elseif(trim(npz_type) == 'midtop') then + ptop = 10. + pint = 100.E2 + elseif(trim(npz_type) == 'lowtop') then + ptop = 1.E2 + pint = 100.E2 + endif -#ifdef TEST_GWAVES -!-------------------------------------------------- -! Pure sigma-coordinate with uniform spacing in "z" -!-------------------------------------------------- - call gw_1d(km, 1000.E2, scm_state%a_k, scm_state%b_k, ptop, 10.E3, pt1) - ks = 0 - pint = scm_state%a_k(1) -#else - -!---------------------------------------------------------------- -! Sigma-coordinate with uniform spacing in sigma and ptop = 1 mb -!---------------------------------------------------------------- - pt = 100. - ! One pressure layer - ks = 1 - ! pint = pt + 0.5*1.E5/real(km) ! SJL: 20120327 - pint = pt + 1.E5/real(km) - - scm_state%a_k(1) = pt - scm_state%b_k(1) = 0. - scm_state%a_k(2) = pint - scm_state%b_k(2) = 0. - - do k=3,km+1 - scm_state%b_k(k) = real(k-2) / real(km-1) - scm_state%a_k(k) = pint - scm_state%b_k(k)*pint - enddo - scm_state%a_k(km+1) = 0. - scm_state%b_k(km+1) = 1. -#endif + if (trim(npz_type) == 'gfs') then + auto_routine = 6 + elseif(trim(npz_type) == 'les') then + auto_routine = 3 + elseif(trim(npz_type) == 'mountain_wave') then + auto_routine = 4 + elseif (km > 79) then + auto_routine = 2 + else + auto_routine = 1 + endif + end select + endif ! superC/superK + + select case (auto_routine) + case (1) + call var_hi(km, scm_state%a_k, scm_state%b_k, ptop, ks, pint, stretch_fac) + case (2) + call var_hi2(km, scm_state%a_k, scm_state%b_k, ptop, ks, pint, stretch_fac) + case (3) + call var_les(km, scm_state%a_k, scm_state%b_k, ptop, ks, pint, stretch_fac) + case (4) + call mount_waves(km, scm_state%a_k, scm_state%b_k, ptop, ks, pint) + case (5) + call var_dz(km, scm_state%a_k, scm_state%b_k, ptop, ks, pint, stretch_fac) + case (6) + call var_gfs(km, scm_state%a_k, scm_state%b_k, ptop, ks, pint, stretch_fac) end select - - ptop = scm_state%a_k(1) - pint = scm_state%a_k(ks+1) - + + call check_eta_levels (scm_state%a_k, scm_state%b_k) + + if (verbose) then + write(*, '(A4, A13, A13, A11)') 'klev', 'ak', 'bk', 'p_ref' + do k=1,km+1 + write(*,'(I4, F13.5, F13.5, F11.2)') k, scm_state%a_k(k), scm_state%b_k(k), 1000.E2*scm_state%b_k(k) + scm_state%a_k(k) + enddo + endif + !> - Calculate interface pressures, sigma, and exner function. ! flip scm_state%a_k, scm_state%b_k in vertical @@ -1291,14 +593,189 @@ subroutine get_FV3_vgrid(scm_input, scm_state) end subroutine get_FV3_vgrid -subroutine var_dz(km, ak, bk, ptop, ks, pint, s_rate) +subroutine var_hi(km, ak, bk, ptop, ks, pint, s_rate) + integer, intent(in):: km + real, intent(in):: ptop + real, intent(in):: s_rate !< between [1. 1.1] + real, intent(out):: ak(km+1), bk(km+1) + real, intent(inout):: pint + integer, intent(out):: ks +! Local + real, parameter:: p00 = 1.E5 + real, dimension(km+1):: ze, pe1, peln, eta + real, dimension(km):: dz, s_fac, dlnp + real ztop, t0, dz0, sum1, tmp1 + real ep, es, alpha, beta, gama +!---- Tunable parameters: + integer:: k_inc = 15 ! p - do k=1,km+1 - pe1(k) = p0*( (1.-s0/t0) + s0/t0*exp(-n2*ze(k)/con_g) )**(1./con_rocp) - enddo - - ptop = pe1(1) -! if ( verbose ) write(*,*) 'GW_1D: computed model top (pa)=', ptop - -! Set up "sigma" coordinate - ak(1) = pe1(1) - bk(1) = 0. - do k=2,km - bk(k) = (pe1(k) - pe1(1)) / (pe1(km+1)-pe1(1)) ! bk == sigma - ak(k) = pe1(1)*(1.-bk(k)) - enddo - ak(km+1) = 0. - bk(km+1) = 1. - - do k=1,km+1 - pk1(k) = pe1(k) ** con_rocp - enddo - -! Compute volume mean potential temperature with hydrostatic eqn: - do k=1,km - pt1(k) = con_g*dz1(k) / ( con_cp*(pk1(k+1)-pk1(k)) ) - enddo - - end subroutine gw_1d +end subroutine check_eta_levels !> This subroutine calculates the pressure and exner function at grid centers and interface levels given a surface pressure and interface-level GFS grid coefficients. !! This subroutine should be called to update the pressures of the model levels as the surface pressure of the column changes. From 58f75040ee9b9721b9117932b591fe922e919b61 Mon Sep 17 00:00:00 2001 From: Grant Firl Date: Tue, 8 Mar 2022 19:35:25 -0700 Subject: [PATCH 2/8] working updated version of run_scm.py (without using suite_info); still need to add more passthrough args for multi_run_scm.py and check operation of rt.sh; also update all case configuration files to get rid of unused namelist vars --- scm/etc/case_config/arm_sgp_summer_1997_A.nml | 11 +- scm/src/multi_run_scm.py | 91 ++-- scm/src/run_scm.py | 412 ++++++++++++++---- scm/src/scm.F90 | 22 +- scm/src/scm_input.F90 | 36 +- scm/src/scm_type_defs.F90 | 12 +- scm/src/scm_vgrid.F90 | 206 +++------ scm/src/suite_info.py | 50 +++ 8 files changed, 513 insertions(+), 327 deletions(-) create mode 100755 scm/src/suite_info.py diff --git a/scm/etc/case_config/arm_sgp_summer_1997_A.nml b/scm/etc/case_config/arm_sgp_summer_1997_A.nml index d1efaabbb..375d0c4cb 100644 --- a/scm/etc/case_config/arm_sgp_summer_1997_A.nml +++ b/scm/etc/case_config/arm_sgp_summer_1997_A.nml @@ -1,15 +1,6 @@ $case_config -model_name = 'FV3', -n_columns = 1, case_name = 'arm_sgp_summer_1997_A', -dt = 600.0, -time_scheme = 1, runtime = 345600, -n_itt_out = 1, -n_levels = 64, -output_file = 'output', -case_data_dir = '../data/processed_case_input', -vert_coord_data_dir = '../data/vert_coord_data', thermo_forcing_type = 1, mom_forcing_type = 3, relax_time = 7200.0, @@ -22,4 +13,4 @@ month = 6, day = 26, hour = 23, column_area = 2.0E9, -$end \ No newline at end of file +$end diff --git a/scm/src/multi_run_scm.py b/scm/src/multi_run_scm.py index ee7ab7528..878a07512 100755 --- a/scm/src/multi_run_scm.py +++ b/scm/src/multi_run_scm.py @@ -29,6 +29,10 @@ parser.add_argument('-t', '--timer', help='set to time each subprocess', action='store_true', default=False) parser.add_argument('-d', '--docker', help='include if scm is being run in a docker container to mount volumes', action='store_true', default=False) parser.add_argument('--runtime', help='set the runtime in the namelists', action='store', required=False) +parser.add_argument('-l', '--levels', help='number of vertical levels', required=False) +parser.add_argument('--npz_type', help='type of FV3 vertical grid to produce (see scm_vgrid.F90 for valid values)', required=False) +parser.add_argument('--vert_coord_file', help='filename with coefficients to produce a vertical grid', required=False) +parser.add_argument('--case_data_dir', help='directory containing the case input data netCDF file', required=False) # Results are recorded in this global list (to avoid complications with getting return values from the partial functions used below) RESULTS = [] @@ -87,17 +91,32 @@ def main(): args = parser.parse_args() setup_logging(args.verbose) - + + passthrough_args = '' + if args.levels: + passthrough_args += ' -l ' + args.levels + if args.npz_type: + if args.npz_type == 'input': + if args.vert_coord_file: + passthrough_args += ' --npz_type ' + args.npz_type + ' --vert_coord_file ' + args.vert_coord_file + else: + message = 'The npz_type was set to \'input\' but no file was specified via --vert_coord_file. Please specify the name of the file via --vert_coord_file name_of_file' + logging.critical(message) + raise Exception(message) + else: + passthrough_args += ' --npz_type ' + args.npz_type + if args.case_data_dir: + passthrough_args += ' --case_data_dir ' + args.case_data_dir + if args.docker: + passthrough_args += ' -d' + if args.runtime: + passthrough_args += ' --runtime ' + args.runtime + # if the case argument is specified, run through all supported suites with the specified case if args.case: - logging.info('Running all supported suites with case {0}'.format(args.case)) + logging.info('Running all supported suites with case {0} and passthrough args: {1}'.format(args.case, passthrough_args)) for i, suite in enumerate(suites,1): - command = RUN_SCRIPT + ' -c ' + args.case + ' -s ' + suite - if args.docker: - command = command + ' -d' - # If modifying the runtime, pass the -runtime argument to the RUN_SCRIPT - if args.runtime: - command = command + ' --runtime ' + args.runtime + command = RUN_SCRIPT + ' -c ' + args.case + ' -s ' + suite + passthrough_args logging.info('Executing process {0} of {1} ({2})'.format(i, len(suites), command)) elapsed_time = spawn_subprocess(command, args.timer) if args.timer: @@ -106,13 +125,9 @@ def main(): # if the suite argument is specified, run through all supported cases with the specified suite if args.suite: - logging.info('Running all supported cases with suite {0}'.format(args.suite)) + logging.info('Running all supported cases with suite {0} and passthrough args: {1}'.format(args.suite, passthrough_args)) for i, case in enumerate(cases,1): - command = RUN_SCRIPT + ' -c ' + case + ' -s ' + args.suite - if args.docker: - command = command + ' -d' - if args.runtime: - command = command + ' --runtime ' + args.runtime + command = RUN_SCRIPT + ' -c ' + case + ' -s ' + args.suite + passthrough_args logging.info('Executing process {0} of {1} ({2})'.format(i, len(cases), command)) elapsed_time = spawn_subprocess(command, args.timer) if args.timer: @@ -154,13 +169,9 @@ def main(): if scm_runs.cases and not scm_runs.suites and not scm_runs.namelists: logging.info( - 'Only cases were specified in {0}, so running all cases with the default suite'.format(args.file)) + 'Only cases were specified in {0}, so running all cases with the default suite and passthrough args: {1}'.format(args.file, passthrough_args)) for i, case in enumerate(scm_runs.cases,1): - command = RUN_SCRIPT + ' -c ' + case - if args.docker: - command = command + ' -d' - if args.runtime: - command = command + ' --runtime ' + args.runtime + command = RUN_SCRIPT + ' -c ' + case + passthrough_args logging.info('Executing process {0} of {1} ({2})'.format(i, len(scm_runs.cases), command)) elapsed_time = spawn_subprocess(command, args.timer) if args.timer: @@ -171,14 +182,10 @@ def main(): if scm_runs.namelists: if len(scm_runs.suites) == 1: logging.info('Cases and namelists were specified with 1 suite in {0}, so running all cases with '\ - 'the suite {1} for all specified namelists'.format(args.file, scm_runs.suites[0])) + 'the suite {1} for all specified namelists and passthrough args: {2}'.format(args.file, scm_runs.suites[0], passthrough_args)) for i, case in enumerate(scm_runs.cases): for j, namelist in enumerate(scm_runs.namelists,1): - command = RUN_SCRIPT + ' -c ' + case + ' -s ' + scm_runs.suites[0] + ' -n ' + namelist - if args.docker: - command = command + ' -d' - if args.runtime: - command = command + ' --runtime ' + args.runtime + command = RUN_SCRIPT + ' -c ' + case + ' -s ' + scm_runs.suites[0] + ' -n ' + namelist + passthrough_args logging.info('Executing process {0} of {1} ({2})'.format( len(scm_runs.namelists)*i+j, len(scm_runs.cases)*len(scm_runs.namelists), command)) elapsed_time = spawn_subprocess(command, args.timer) @@ -187,14 +194,10 @@ def main(): .format(elapsed_time/timer_iterations, case, scm_runs.suites[0])) elif len(scm_runs.suites) == len(scm_runs.namelists): logging.info('Cases, suites, and namelists were specified in {0}, so running all cases with all '\ - 'suites, matched with namelists by order'.format(args.file)) + 'suites, matched with namelists by order and passthrough args: {1}'.format(args.file, passthrough_args)) for i, case in enumerate(scm_runs.cases): for j, suite in enumerate(scm_runs.suites,1): - command = RUN_SCRIPT + ' -c ' + case + ' -s ' + suite + ' -n ' + scm_runs.namelists[j-1] - if args.docker: - command = command + ' -d' - if args.runtime: - command = command + ' --runtime ' + args.runtime + command = RUN_SCRIPT + ' -c ' + case + ' -s ' + suite + ' -n ' + scm_runs.namelists[j-1] + passthrough_args logging.info('Executing process {0} of {1} ({2})'.format( len(scm_runs.suites)*i+j, len(scm_runs.cases)*len(scm_runs.suites), command)) elapsed_time = spawn_subprocess(command, args.timer) @@ -209,14 +212,10 @@ def main(): raise Exception(message) else: logging.info('Cases and suites specified in {0}, so running all cases with all suites using default '\ - 'namelists for each suite'.format(args.file)) + 'namelists for each suite and passthrough args: {1}'.format(args.file, passthrough_args)) for i, case in enumerate(scm_runs.cases): for j, suite in enumerate(scm_runs.suites,1): - command = RUN_SCRIPT + ' -c ' + case + ' -s ' + suite - if args.docker: - command = command + ' -d' - if args.runtime: - command = command + ' --runtime ' + args.runtime + command = RUN_SCRIPT + ' -c ' + case + ' -s ' + suite + passthrough_args logging.info('Executing process {0} of {1} ({2})'.format( len(scm_runs.suites)*i+j, len(scm_runs.cases)*len(scm_runs.suites), command)) elapsed_time = spawn_subprocess(command, args.timer) @@ -226,14 +225,10 @@ def main(): if scm_runs.cases and not scm_runs.suites and scm_runs.namelists: logging.info('Cases and namelists were specified in {0}, so running all cases with the default suite '\ - 'using the list of namelists'.format(args.file)) + 'using the list of namelists and passthrough args: {1}'.format(args.file, passthrough_args)) for i, case in enumerate(scm_runs.cases): for j, namelist in enumerate(scm_runs.namelists,1): - command = RUN_SCRIPT + ' -c ' + case + ' -n ' + namelist - if args.docker: - command = command + ' -d' - if args.runtime: - command = command + ' --runtime ' + args.runtime + command = RUN_SCRIPT + ' -c ' + case + ' -n ' + namelist + passthrough_args logging.info('Executing process {0} of {1} ({2})'.format( len(scm_runs.namelists)*i+j, len(scm_runs.cases)*len(scm_runs.namelists), command)) elapsed_time = spawn_subprocess(command, args.timer) @@ -244,14 +239,10 @@ def main(): # If running the script with no arguments, run all supported (case,suite) permutations. if not args.case and not args.suite and not args.file: logging.info('Since no arguments were specified, running through all permuatations of supported cases and '\ - 'suites') + 'suites with passthrough args: {0}').format(passthrough_args) for i, case in enumerate(cases): for j, suite in enumerate(suites,1): - command = RUN_SCRIPT + ' -c ' + case + ' -s ' + suite - if args.docker: - command = command + ' -d' - if args.runtime: - command = command + ' --runtime ' + args.runtime + command = RUN_SCRIPT + ' -c ' + case + ' -s ' + suite + passthrough_args logging.info('Executing process {0} of {1} ({2})'.format( len(suites)*i+j, len(cases)*len(suites), command)) elapsed_time = spawn_subprocess(command, args.timer) diff --git a/scm/src/run_scm.py b/scm/src/run_scm.py index b3ed25354..f4ff1045b 100755 --- a/scm/src/run_scm.py +++ b/scm/src/run_scm.py @@ -11,42 +11,70 @@ import time from default_namelists import default_physics_namelists from default_tracers import default_tracers +from suite_info import suite, suite_list from netCDF4 import Dataset ############################################################################### # Global settings # ############################################################################### -# Name of the Fortran executable to run, including path (relative to run dir) -EXECUTABLE = './scm' +SCM_ROOT = '' +SCM_RUN = '' +SCM_BIN = '' +EXECUTABLE = '' -# Path to the directory containing experiment namelists (relative to run dir) -CASE_NAMELIST_DIR = '../etc/case_config' +# Name of the Fortran executable to run, including path +EXECUTABLE_NAME = 'scm' -# Path to the directory containing tracer configurations (relative to run dir) -TRACERS_DIR = '../etc/tracer_config' +# Path to default run directory (relative to scm_root) +DEFAULT_RUN_DIR = 'scm/run' + +# Path to default bin directory (relative to scm_root) +DEFAULT_BIN_DIR = 'scm/bin' + +# Default +DEFAULT_OUTPUT_PERIOD = 1 +DEFAULT_DIAG_PERIOD = 1 + +# Path to the directory containing experiment namelists (relative to scm_root) +CASE_NAMELIST_DIR = 'scm/etc/case_config' + +# Path to the directory containing case input data files (relative to scm_root) +DEFAULT_CASE_DATA_DIR = 'scm/data/processed_case_input' + +# Path to the directory containing vertical coordinate files (relative to scm_root) +VERT_COORD_DATA_DIR = 'scm/data/vert_coord_data' + +# Path to reference profiles +REFERENCE_PROFILE_DIR = DEFAULT_CASE_DATA_DIR + +# Reference profile file list +REFERENCE_PROFILE_FILE_LIST = ['McCProfiles.dat','mid_lat_summer_std.nc'] + +# Path to the directory containing tracer configurations (relative to scm_root) +TRACERS_DIR = 'scm/etc/tracer_config' TRACERS_LINK = 'tracers.txt' # Standard name of experiment namelist in run directory, must match value in scm_input.f90 STANDARD_EXPERIMENT_NAMELIST = 'input_experiment.nml' -# Path to the directory containing physics namelists (relative to run dir) -PHYSICS_NAMELIST_DIR = '../../ccpp/physics_namelists' +# Path to the directory containing physics namelists (relative to scm_root) +PHYSICS_NAMELIST_DIR = 'ccpp/physics_namelists' -# Path to the directory containing physics namelists (relative to run dir) -PHYSICS_SUITE_DIR = '../../ccpp/suites' +# Path to the directory containing physics namelists (relative to scm_root) +PHYSICS_SUITE_DIR = 'ccpp/suites' # Default suite to use if none is specified DEFAULT_SUITE = 'SCM_GFS_v15p2' -# Path to physics data files -PHYSICS_DATA_DIR = '../data/physics_input_data' +# Path to physics data files (relative to scm_root) +PHYSICS_DATA_DIR = 'scm/data/physics_input_data' -# Path to analysis script -SCM_ANALYSIS_SCRIPT_DIR = '../etc/scripts' +# Path to analysis script (relative to scm_root) +SCM_ANALYSIS_SCRIPT_DIR = 'scm/etc/scripts' -# Path to analysis script configuration files -SCM_ANALYSIS_CONFIG_DIR = '../etc/scripts/plot_configs' +# Path to analysis script configuration files (relative to scm_root) +SCM_ANALYSIS_CONFIG_DIR = 'scm/etc/scripts/plot_configs' # Default settings and filenames of input data for ozone physics; # these must match the default settings in GFS_typedefs.F90. @@ -77,6 +105,13 @@ parser.add_argument('-t', '--tracers', help='tracer configuration to use') parser.add_argument('--runtime', help='set the runtime in the namelists', action='store', type=int, required=False) parser.add_argument('-d', '--docker', help='include if scm is being run in a docker container to mount volumes', action='store_true', default=False) +parser.add_argument('-l', '--levels', help='number of vertical levels', required=False, type=int) +parser.add_argument('--npz_type', help='type of FV3 vertical grid to produce (see scm_vgrid.F90 for valid values)', required=False) +parser.add_argument('--vert_coord_file', help='filename with coefficients to produce a vertical grid', required=False) +parser.add_argument('--run_dir', help='path for the run directory', required=False) +parser.add_argument('--case_data_dir', help='directory containing the case input data netCDF file', required=False) +parser.add_argument('--n_itt_out', help='period of instantaneous output (number of timesteps)', required=False, type=int) +parser.add_argument('--n_itt_diag', help='period of diagnostic output (number of timesteps)', required=False, type=int) ############################################################################### # Functions and subroutines # @@ -116,7 +151,15 @@ def parse_arguments(): docker = args.docker tracers = args.tracers runtime = args.runtime - return (case, gdb, suite, namelist, docker, tracers, runtime) + levels = args.levels + npz_type = args.npz_type + vert_coord_file = args.vert_coord_file + case_data_dir = args.case_data_dir + n_itt_out = args.n_itt_out + n_itt_diag = args.n_itt_diag + run_dir = args.run_dir + + return (case, gdb, suite, namelist, docker, tracers, runtime, levels, npz_type, vert_coord_file, case_data_dir, n_itt_out, n_itt_diag, run_dir) def find_gdb(): """Detect gdb, abort if not found""" @@ -133,7 +176,7 @@ def find_gdb(): class Experiment(object): - def __init__(self, case, suite, physics_namelist, tracers, runtime): + def __init__(self, case, suite, physics_namelist, tracers, runtime, levels, npz_type, vert_coord_file, case_data_dir, n_itt_out, n_itt_diag): """Initialize experiment. This routine does most of the work, including setting and checking the experiment configuration (namelist).""" @@ -155,8 +198,8 @@ def __init__(self, case, suite, physics_namelist, tracers, runtime): raise Exception(message) #check to see that the physics namelists exists in the right dir - if not os.path.isfile(os.path.join(PHYSICS_NAMELIST_DIR, self._physics_namelist)): - message = 'The physics namelist {0} was not found'.format(os.path.join(PHYSICS_NAMELIST_DIR, self._physics_namelist)) + if not os.path.isfile(os.path.join(SCM_ROOT, PHYSICS_NAMELIST_DIR, self._physics_namelist)): + message = 'The physics namelist {0} was not found'.format(os.path.join(SCM_ROOT, PHYSICS_NAMELIST_DIR, self._physics_namelist)) logging.critical(message) raise Exception(message) @@ -172,14 +215,14 @@ def __init__(self, case, suite, physics_namelist, tracers, runtime): logging.critical(message) raise Exception(message) - #check to see that the physics namelists exists in the right dir - if not os.path.isfile(os.path.join(TRACERS_DIR, self._tracers)): + #check to see that the tracers exists in the right dir + if not os.path.isfile(os.path.join(SCM_ROOT, TRACERS_DIR, self._tracers)): message = 'The tracer configuration {0} was not found'.format(os.path.join(TRACERS_DIR, self._tracers)) logging.critical(message) raise Exception(message) #check to see if the case namelists exists in the right dir - self._namelist = os.path.join(CASE_NAMELIST_DIR, self._case + '.nml') + self._namelist = os.path.join(SCM_ROOT, CASE_NAMELIST_DIR, self._case + '.nml') if not os.path.isfile(self._namelist): message = 'Experiment {0} with namelist {1} not found'.format(self._name, self._namelist) logging.critical(message) @@ -193,7 +236,60 @@ def __init__(self, case, suite, physics_namelist, tracers, runtime): self._runtime = None message = 'Namelist runtime adjustment {0} IS NOT applied'.format(self._runtime) logging.info(message) - + + if levels: + self._levels = levels + message = 'The number of vertical levels is set to {0}'.format(self._levels) + logging.info(message) + else: + self._levels = None + message = 'The number of vertical levels contained in the case configuration file is used if present, otherwise the default value in scm_input.F90 is used.' + logging.info(message) + + if npz_type: + self._npz_type = npz_type + message = 'The npz_type of vertical levels is set to {0}'.format(self._npz_type) + logging.info(message) + if npz_type == 'input': + if vert_coord_file: + self._vert_coord_file = vert_coord_file + #check to see that the vert coords file exists in the right dir + if not os.path.isfile(os.path.join(SCM_ROOT, VERT_COORD_DATA_DIR, self._vert_coord_file)): + message = 'The vertical coordinate file {0} was not found'.format(os.path.join(SCM_ROOT, VERT_COORD_DATA_DIR, self._vert_coord_file)) + logging.critical(message) + raise Exception(message) + else: + message = 'The npz_type was set to \'input\' but no file was specified via --vert_coord_file. Please specify the name of the file via --vert_coord_file name_of_file' + logging.critical(message) + raise Exception(message) + else: + self._vert_coord_file = None + else: + self._npz_type = None + self._vert_coord_file = None + message = 'The npz_type contained in the case configuration file is used if present, otherwise the default value in scm_input.F90 is used.' + logging.info(message) + + if case_data_dir: + self._case_data_dir = case_data_dir + else: + self._case_data_dir = DEFAULT_CASE_DATA_DIR + #check to see that the provided case data directory exists + if not os.path.isdir(os.path.join(SCM_ROOT, self._case_data_dir)): + message = 'The case data directory {0} was not found'.format(self._case_data_dir) + logging.critical(message) + raise Exception(message) + + if n_itt_out: + self._n_itt_out = n_itt_out + else: + self._n_itt_out = DEFAULT_OUTPUT_PERIOD + + if n_itt_diag: + self._n_itt_diag = n_itt_diag + else: + self._n_itt_diag = DEFAULT_DIAG_PERIOD + @property def name(self): """Get the name of the experiment.""" @@ -243,7 +339,77 @@ def physics_namelist(self): def physics_namelist(self, value): """Set the physics namelist of the experiment.""" self._physics_namelist = value - + + @property + def tracers(self): + """Get the tracer file for the experiment.""" + return self._tracers + + @tracers.setter + def tracers(self, value): + """Set the tracer file for the experiment.""" + self._tracers = value + + @property + def levels(self): + """Get the number of vertical levels for the experiment.""" + return self._levels + + @levels.setter + def levels(self, value): + """Set the number of vertical levels for the experiment.""" + self._levels = value + + @property + def npz_type(self): + """Get the vertical level type for the experiment.""" + return self._npz_type + + @npz_type.setter + def npz_type(self, value): + """Set the vertical level type for the experiment.""" + self._npz_type = value + + @property + def vert_coord_file(self): + """Get the file containing vertical levels for the experiment.""" + return self._vert_coord_file + + @vert_coord_file.setter + def vert_coord_file(self, value): + """Set the file containing vertical levels for the experiment.""" + self._vert_coord_file = value + + @property + def case_data_dir(self): + """Get the case data directory for the experiment.""" + return self._case_data_dir + + @case_data_dir.setter + def case_data_dir(self, value): + """Set the case data directory for the experiment.""" + self._case_data_dir = value + + @property + def n_itt_out(self): + """Get the output period (in timesteps) for the experiment.""" + return self._n_itt_out + + @n_itt_out.setter + def n_itt_out(self, value): + """Set the output period (in timesteps) for the experiment.""" + self._n_itt_out = value + + @property + def n_itt_diag(self): + """Get the diagnostic period (in timesteps) for the experiment.""" + return self._n_itt_diag + + @n_itt_diag.setter + def n_itt_diag(self, value): + """Set the diagnostic period (in timesteps) for the experiment.""" + self._n_itt_diag = value + def setup_rundir(self): """Set up run directory for this experiment.""" @@ -255,6 +421,18 @@ def setup_rundir(self): # If running the regression test, reduce the runtime if self._runtime: case_nml['case_config']['runtime'] = self._runtime + # If the number of levels is specified, set the namelist value + if self._levels: + case_nml['case_config']['n_levels'] = self._levels + # If the npz_type is specified, set the namelist value + if self._npz_type: + case_nml['case_config']['npz_type'] = self._npz_type + if self._vert_coord_file: + case_nml['case_config']['vert_coord_file'] = self._vert_coord_file + if self._n_itt_out: + case_nml['case_config']['n_itt_out'] = self._n_itt_out + if self._n_itt_diag: + case_nml['case_config']['n_itt_diag'] = self._n_itt_diag # look for the output_dir variable in the case configuration namelist and use it if it does; # if it doesn't exist, create a default output directory name (from the case and suite names) and create a namelist patch try: @@ -275,7 +453,7 @@ def setup_rundir(self): if input_type == 1: #open the case data file and read the surfaceForcing global attribute case_data_dir = case_nml['case_config']['case_data_dir'] - nc_fid = Dataset(case_data_dir + '/' + self._case + '_SCM_driver.nc' , 'r') + nc_fid = Dataset(os.path.join(SCM_ROOT, case_data_dir) + '/' + self._case + '_SCM_driver.nc' , 'r') surfaceForcing = nc_fid.getncattr('surfaceForcing') nc_fid.close() if (surfaceForcing.lower() == 'flux' or surfaceForcing.lower() == 'surfaceflux'): @@ -301,73 +479,113 @@ def setup_rundir(self): # Create STANDARD_EXPERIMENT_NAMELIST in the run directory with the case configuration and physics configuration namelists logging.info('Creating experiment configuration namelist {0} in the run directory from {1} using {2} and {3} '.format(STANDARD_EXPERIMENT_NAMELIST,self._namelist,self._suite,self._physics_namelist)) - with open(STANDARD_EXPERIMENT_NAMELIST, "w+") as nml_file: + with open(os.path.join(SCM_RUN, STANDARD_EXPERIMENT_NAMELIST), "w+") as nml_file: case_nml.write(nml_file) - with open(STANDARD_EXPERIMENT_NAMELIST, "a") as nml_file: + with open(os.path.join(SCM_RUN, STANDARD_EXPERIMENT_NAMELIST), "a") as nml_file: physics_config_nml.write(nml_file) # if using the default output dir name created in this script, patch the experiment namelist with the new output_dir variable if(not custom_output_dir): # GJF TODO: this implementation is clunky; newer versions of f90nml can handle this better, but this works with v0.19 so no need to require newer version - f90nml.patch(STANDARD_EXPERIMENT_NAMELIST, output_dir_patch_nml, 'temp.nml') - cmd = "mv {0} {1}".format('temp.nml', STANDARD_EXPERIMENT_NAMELIST) + f90nml.patch(os.path.join(SCM_RUN, STANDARD_EXPERIMENT_NAMELIST), output_dir_patch_nml, 'temp.nml') + cmd = "mv {0} {1}".format('temp.nml', os.path.join(SCM_RUN, STANDARD_EXPERIMENT_NAMELIST)) execute(cmd) # Link physics namelist to run directory with its original name logging.info('Linking physics namelist {0} to run directory'.format(self._physics_namelist)) - if os.path.isfile(self._physics_namelist): - os.remove(self._physics_namelist) - if not os.path.isfile(os.path.join(PHYSICS_NAMELIST_DIR, self._physics_namelist)): - message = 'Physics namelist {0} not found in directory {1}'.format(self._physics_namelist, PHYSICS_NAMELIST_DIR) + if os.path.isfile(os.path.join(SCM_RUN, self._physics_namelist)): + os.remove(os.path.join(SCM_RUN,self._physics_namelist)) + if not os.path.isfile(os.path.join(SCM_ROOT, PHYSICS_NAMELIST_DIR, self._physics_namelist)): + message = 'Physics namelist {0} not found in directory {1}'.format(SCM_ROOT, self._physics_namelist, PHYSICS_NAMELIST_DIR) logging.critical(message) raise Exception(message) - cmd = "ln -sf {0} {1}".format(os.path.join(PHYSICS_NAMELIST_DIR, self._physics_namelist), self._physics_namelist) + cmd = "ln -sf {0} {1}".format(os.path.join(SCM_ROOT, PHYSICS_NAMELIST_DIR, self._physics_namelist), os.path.join(SCM_RUN, self._physics_namelist)) if surface_flux_spec: #check for optional prescribed-surface-specific physics namelist and link it instead (if present) - opt_ps_nml_filename = os.path.splitext(os.path.join(PHYSICS_NAMELIST_DIR,self._physics_namelist))[0] + '_ps.nml' + opt_ps_nml_filename = os.path.splitext(os.path.join(SCM_ROOT, PHYSICS_NAMELIST_DIR,self._physics_namelist))[0] + '_ps.nml' if os.path.isfile(opt_ps_nml_filename): logging.info('Found optional prescribed surface physics namelist {0}; linking it to run directory'.format(opt_ps_nml_filename)) - cmd = "ln -sf {0} {1}".format(opt_ps_nml_filename, self._physics_namelist) + cmd = "ln -sf {0} {1}".format(opt_ps_nml_filename, os.path.join(SCM_RUN, self._physics_namelist)) execute(cmd) - # Link tracer configuration to run directory with its original name + # Link tracer configuration to run directory with standard name logging.info('Linking tracer configuration {0} to run directory'.format(self._tracers)) - if os.path.isfile(self._tracers): - os.remove(self._tracers) - if not os.path.isfile(os.path.join(TRACERS_DIR, self._tracers)): - message = 'Tracer configuration {0} not found in directory {1}'.format(self._tracers, TRACERS_DIR) + if os.path.isfile(os.path.join(SCM_RUN, self._tracers)): + os.remove(os.path.join(SCM_RUN, self._tracers)) + if not os.path.isfile(os.path.join(SCM_ROOT, TRACERS_DIR, self._tracers)): + message = 'Tracer configuration {0} not found in directory {1}'.format(self._tracers, os.path.join(SCM_ROOT, TRACERS_DIR)) + logging.critical(message) + raise Exception(message) + cmd = "ln -sf {0} {1}".format(os.path.join(SCM_ROOT, TRACERS_DIR, self._tracers), os.path.join(SCM_RUN, TRACERS_LINK)) + execute(cmd) + + # Link case data file to run directory with original name + try: + input_type = case_nml['case_config']['input_type'] + if input_type == 1: + case_data_netcdf_file = self._case + '_SCM_driver.nc' + else: + case_data_netcdf_file = self._case + '.nc' + except KeyError: + case_data_netcdf_file = self._case + '.nc' + logging.info('Linking case input data file {0} to run directory'.format(case_data_netcdf_file)) + if os.path.isfile(os.path.join(SCM_RUN, case_data_netcdf_file)): + os.remove(os.path.join(SCM_RUN, case_data_netcdf_file)) + if not os.path.isfile(os.path.join(SCM_ROOT, self._case_data_dir, case_data_netcdf_file)): + message = 'Case input data file {0} not found in directory {1}'.format(case_data_netcdf_file, os.path.join(SCM_ROOT, self._case_data_dir)) logging.critical(message) raise Exception(message) - cmd = "ln -sf {0} {1}".format(os.path.join(TRACERS_DIR, self._tracers), TRACERS_LINK) + cmd = "ln -sf {0} {1}".format(os.path.join(SCM_ROOT, self._case_data_dir, case_data_netcdf_file), os.path.join(SCM_RUN, case_data_netcdf_file)) execute(cmd) + # Link vertical coordinate file to run directory with its original name + if (self._npz_type == 'input'): + logging.info('Linking vertical coordinate file {0} to run directory'.format(self._vert_coord_file)) + if os.path.isfile(os.path.join(SCM_RUN, self._vert_coord_file)): + os.remove(os.path.join(SCM_RUN, self._vert_coord_file)) + if not os.path.isfile(os.path.join(SCM_ROOT, VERT_COORD_DATA_DIR, self._vert_coord_file)): + message = 'Vertical coordinate file {0} not found in directory {1}'.format(self._vert_coord_file, os.path.join(SCM_ROOT, VERT_COORD_DATA_DIR)) + logging.critical(message) + raise Exception(message) + cmd = "ln -sf {0} {1}".format(os.path.join(SCM_ROOT, VERT_COORD_DATA_DIR, self._vert_coord_file), os.path.join(SCM_RUN, self._vert_coord_file)) + execute(cmd) + # Link physics SDF to run directory physics_suite = 'suite_' + self._suite + '.xml' logging.info('Linking physics suite {0} to run directory'.format(physics_suite)) - if os.path.isfile(physics_suite): - os.remove(physics_suite) - if not os.path.isfile(os.path.join(PHYSICS_SUITE_DIR, physics_suite)): - message = 'Physics suite {0} not found in directory {1}'.format(physics_suite, PHYSICS_SUITE_DIR) + if os.path.isfile(os.path.join(SCM_RUN, physics_suite)): + os.remove(os.path.join(SCM_RUN, physics_suite)) + if not os.path.isfile(os.path.join(SCM_ROOT, PHYSICS_SUITE_DIR, physics_suite)): + message = 'Physics suite {0} not found in directory {1}'.format(physics_suite, os.path.join(SCM_ROOT, PHYSICS_SUITE_DIR)) logging.critical(message) raise Exception(message) - cmd = "ln -sf {0} {1}".format(os.path.join(PHYSICS_SUITE_DIR, physics_suite), physics_suite) + cmd = "ln -sf {0} {1}".format(os.path.join(SCM_ROOT, PHYSICS_SUITE_DIR, physics_suite), os.path.join(SCM_RUN, physics_suite)) execute(cmd) # Link physics data needed for schemes to run directory - logging.info('Linking physics input data from {0} into run directory'.format(PHYSICS_DATA_DIR)) - for entry in os.listdir(PHYSICS_DATA_DIR): - if os.path.isfile(os.path.join(PHYSICS_DATA_DIR, entry)): + logging.info('Linking physics input data from {0} into run directory'.format(os.path.join(SCM_ROOT, PHYSICS_DATA_DIR))) + for entry in os.listdir(os.path.join(SCM_ROOT, PHYSICS_DATA_DIR)): + if os.path.isfile(os.path.join(SCM_ROOT, PHYSICS_DATA_DIR, entry)): if not os.path.exists(entry): logging.debug('Linking file {0}'.format(entry)) - cmd = 'ln -sf {0} {1}'.format(os.path.join(PHYSICS_DATA_DIR, entry), entry) + cmd = 'ln -sf {0} {1}'.format(os.path.join(SCM_ROOT, PHYSICS_DATA_DIR, entry), os.path.join(SCM_RUN, entry)) + execute(cmd) + + # Link reference profile data to run directory + logging.info('Linking reference profile data from {0} into run directory'.format(os.path.join(SCM_ROOT, REFERENCE_PROFILE_DIR))) + for entry in REFERENCE_PROFILE_FILE_LIST: + if os.path.isfile(os.path.join(SCM_ROOT, REFERENCE_PROFILE_DIR, entry)): + if not os.path.exists(entry): + logging.debug('Linking file {0}'.format(entry)) + cmd = 'ln -sf {0} {1}'.format(os.path.join(SCM_ROOT, REFERENCE_PROFILE_DIR, entry), os.path.join(SCM_RUN, entry)) execute(cmd) # Parse physics namelist and extract # - oz_phys # - oz_phys_2015 - logging.info('Parsing physics namelist {0}'.format(self._physics_namelist)) - nml = f90nml.read(self._physics_namelist) + logging.info('Parsing physics namelist {0}'.format(os.path.join(SCM_RUN, self._physics_namelist))) + nml = f90nml.read(os.path.join(SCM_RUN, self._physics_namelist)) # oz_phys try: oz_phys = nml['gfs_physics_nml']['oz_phys'] @@ -385,15 +603,15 @@ def setup_rundir(self): raise Exception(message) # Link input data for oz_phys or oz_phys_2015 - if os.path.exists(OZ_PHYS_LINK): - os.remove(OZ_PHYS_LINK) + if os.path.exists(os.path.join(SCM_RUN, OZ_PHYS_LINK)): + os.remove(os.path.join(SCM_RUN, OZ_PHYS_LINK)) if oz_phys: logging.info('Linking input data for oz_phys') - cmd = 'ln -sf {0} {1}'.format(OZ_PHYS_TARGET, OZ_PHYS_LINK) + cmd = 'ln -sf {0} {1}'.format(os.path.join(SCM_RUN, OZ_PHYS_TARGET), os.path.join(SCM_RUN, OZ_PHYS_LINK)) execute(cmd) elif oz_phys_2015: logging.info('Linking input data for oz_phys_2015') - cmd = 'ln -sf {0} {1}'.format(OZ_PHYS_2015_TARGET, OZ_PHYS_LINK) + cmd = 'ln -sf {0} {1}'.format(os.path.join(SCM_RUN, OZ_PHYS_2015_TARGET), os.path.join(SCM_RUN, OZ_PHYS_LINK)) execute(cmd) # Look for do_ugwp_v1 @@ -404,40 +622,45 @@ def setup_rundir(self): # Link the tau file if do_ugwp_v1 if do_ugwp_v1: - if os.path.exists(TAU_LINK): - os.remove(TAU_LINK) + if os.path.exists(os.path.join(SCM_RUN, TAU_LINK)): + os.remove(os.path.join(SCM_RUN, TAU_LINK)) logging.info('Linking input data for UGWP_v1') - cmd = 'ln -sf {0} {1}'.format(TAU_TARGET, TAU_LINK) + cmd = 'ln -sf {0} {1}'.format(os.path.join(SCM_RUN, TAU_TARGET), os.path.join(SCM_RUN, TAU_LINK)) execute(cmd) # Link scripts needed to run SCM analysis - logging.info('Linking analysis scripts from {0} into run directory'.format(SCM_ANALYSIS_SCRIPT_DIR)) + logging.info('Linking analysis scripts from {0} into run directory'.format(os.path.join(SCM_ROOT, SCM_ANALYSIS_SCRIPT_DIR))) analysis_script_files = ['scm_analysis.py','configspec.ini'] for entry in analysis_script_files: - if os.path.isfile(os.path.join(SCM_ANALYSIS_SCRIPT_DIR, entry)): + if os.path.isfile(os.path.join(SCM_ROOT, SCM_ANALYSIS_SCRIPT_DIR, entry)): if not os.path.exists(entry): logging.debug('Linking file {0}'.format(entry)) - cmd = 'ln -sf {0} {1}'.format(os.path.join(SCM_ANALYSIS_SCRIPT_DIR, entry), entry) + cmd = 'ln -sf {0} {1}'.format(os.path.join(SCM_ROOT, SCM_ANALYSIS_SCRIPT_DIR, entry), os.path.join(SCM_RUN, entry)) execute(cmd) # Link plot configuration files needed to run SCM analysis - logging.info('Linking plot configuration files from {0} into run directory'.format(SCM_ANALYSIS_CONFIG_DIR)) - for entry in os.listdir(SCM_ANALYSIS_CONFIG_DIR): - if os.path.isfile(os.path.join(SCM_ANALYSIS_CONFIG_DIR, entry)): + logging.info('Linking plot configuration files from {0} into run directory'.format(os.path.join(SCM_ROOT, SCM_ANALYSIS_CONFIG_DIR))) + for entry in os.listdir(os.path.join(SCM_ROOT, SCM_ANALYSIS_CONFIG_DIR)): + if os.path.isfile(os.path.join(SCM_ROOT, SCM_ANALYSIS_CONFIG_DIR, entry)): if not os.path.exists(entry): logging.debug('Linking file {0}'.format(entry)) - cmd = 'ln -sf {0} {1}'.format(os.path.join(SCM_ANALYSIS_CONFIG_DIR, entry), entry) + cmd = 'ln -sf {0} {1}'.format(os.path.join(SCM_ROOT, SCM_ANALYSIS_CONFIG_DIR, entry), os.path.join(SCM_RUN, entry)) execute(cmd) # Create output directory (delete existing directory) logging.info('Creating output directory {0} in run directory'.format(output_dir)) - if os.path.isdir(output_dir): - shutil.rmtree(output_dir) - os.makedirs(output_dir) + if os.path.isdir(os.path.join(SCM_RUN, output_dir)): + shutil.rmtree(os.path.join(SCM_RUN, output_dir)) + os.makedirs(os.path.join(SCM_RUN, output_dir)) # Write experiment configuration file to output directory logging.info('Writing experiment configuration {0}.nml to output directory'.format(self._name)) - cmd = 'cp {0} {1}'.format(STANDARD_EXPERIMENT_NAMELIST, os.path.join(output_dir,self._name + '.nml')) + cmd = 'cp {0} {1}'.format(STANDARD_EXPERIMENT_NAMELIST, os.path.join(SCM_RUN, output_dir,self._name + '.nml')) + execute(cmd) + + # Copy executable to run dir (does copying the executable give any performance gains on, say, HPC where build dir is in home and run dir on scratch/glade?) + logging.info('Copying executable to run directory') + cmd = 'cp {0} {1}'.format(os.path.join(SCM_ROOT, SCM_BIN, EXECUTABLE_NAME), os.path.join(SCM_RUN, EXECUTABLE_NAME)) execute(cmd) return output_dir @@ -445,9 +668,9 @@ def setup_rundir(self): def launch_executable(use_gdb, gdb): """Configure model run command and pass control to shell/gdb""" if use_gdb: - cmd = '{gdb} {executable}'.format(gdb=gdb, executable=EXECUTABLE) + cmd = '(cd {scm_run} && exec {gdb} {executable})'.format(scm_run=SCM_RUN, gdb=gdb, executable=EXECUTABLE) else: - cmd = '{executable}'.format(executable=EXECUTABLE) + cmd = '(cd {scm_run} && exec {executable})'.format(scm_run=SCM_RUN, executable=EXECUTABLE) logging.info('Passing control to "{0}"'.format(cmd)) time.sleep(2) failure = os.system(cmd) @@ -463,22 +686,51 @@ def copy_outdir(exp_dir): shutil.copytree(exp_dir, home_output_dir) def main(): - (case, use_gdb, suite, namelist, docker, tracers, runtime) = parse_arguments() + (case, use_gdb, suite_name, namelist, docker, tracers, runtime, levels, npz_type, vert_coord_file, case_data_dir, n_itt_out, n_itt_diag, run_dir) = parse_arguments() + + global SCM_ROOT + SCM_ROOT = os.getenv('SCM_ROOT') + if SCM_ROOT is None: + message = 'The SCM_ROOT environment variable is not set. Please set the SCM_ROOT environment variable to the top-level path where the model was cloned.' + logging.critical(message) + raise Exception(message) + + global SCM_BIN + SCM_BIN = os.path.join(SCM_ROOT, DEFAULT_BIN_DIR) + + global SCM_RUN + if run_dir: + SCM_RUN = run_dir + else: + SCM_RUN = os.path.join(SCM_ROOT, DEFAULT_RUN_DIR) + if not os.path.isdir(SCM_RUN): + os.makedirs(SCM_RUN) + + global EXECUTABLE + EXECUTABLE = os.path.join(SCM_RUN, EXECUTABLE_NAME) setup_logging() #Experiment if namelist: if tracers: - logging.info('Setting up experiment {0} with suite {1} using namelist {2} and tracers {3}'.format(case,suite,namelist,tracers)) + logging.info('Setting up experiment {0} with suite {1} using namelist {2} and tracers {3}'.format(case,suite_name,namelist,tracers)) else: - logging.info('Setting up experiment {0} with suite {1} using namelist {2} using default tracers for the suite'.format(case,suite,namelist)) + logging.info('Setting up experiment {0} with suite {1} using namelist {2} using default tracers for the suite'.format(case,suite_name,namelist)) else: if tracers: - logging.info('Setting up experiment {0} with suite {1} using the default namelist for the suite and tracers {2}'.format(case,suite,tracers)) + logging.info('Setting up experiment {0} with suite {1} using the default namelist for the suite and tracers {2}'.format(case,suite_name,tracers)) else: - logging.info('Setting up experiment {0} with suite {1} using the default namelist and tracers for the suite'.format(case,suite)) - exp = Experiment(case, suite, namelist, tracers, runtime) + logging.info('Setting up experiment {0} with suite {1} using the default namelist and tracers for the suite'.format(case,suite_name)) + + active_suite = None + for s in suite_list: + if suite_name == s._name: + active_suite = s + break + + + exp = Experiment(case, suite_name, namelist, tracers, runtime, levels, npz_type, vert_coord_file, case_data_dir, n_itt_out, n_itt_diag) exp_dir = exp.setup_rundir() # Debugger if use_gdb: diff --git a/scm/src/scm.F90 b/scm/src/scm.F90 index dbd7c4eba..ba152f1c1 100644 --- a/scm/src/scm.F90 +++ b/scm/src/scm.F90 @@ -30,7 +30,7 @@ subroutine scm_main_sub() type(scm_input_type), target :: scm_input_instance type(scm_reference_type), target :: scm_reference - integer :: i, j, grid_error, kdt_rad, idtend, itrac + integer :: i, j, kdt_rad, idtend, itrac real(kind=8) :: rinc(5) !(DAYS, HOURS, MINUTES, SECONDS, MILLISECONDS) integer :: jdat(1:8) @@ -53,25 +53,7 @@ subroutine scm_main_sub() call get_reference_profile(scm_state, scm_reference) - select case(trim(adjustl(scm_state%model_name))) - case("GFS") - !> - Call get_GFS_grid in \ref vgrid to read in the necessary coefficients and calculate the pressure-related variables on the grid. - call get_GFS_vgrid(scm_input_instance, scm_state, grid_error) - !> - Exit if an unsupported number of levels is specified or the file with grid coefficients cannot be opened. - if (grid_error == 1) then - write(*,*) 'When using the GFS host model, only 28, 42, 60, 64, and 91 levels are currently supported. Exiting...' - stop - end if - if (grid_error == 2) then - write(*,*) 'The grid coefficient file could not be opened. Exiting...' - stop - end if - case("FV3") - call get_FV3_vgrid(scm_input_instance, scm_state) - case default - write(*,*) 'Only the GFS (GSM) and FV3 vertical coordinates are currently supported. Exiting...' - stop - end select + call get_FV3_vgrid(scm_input_instance, scm_state) !allocate(cdata_cols(scm_state%n_cols)) diff --git a/scm/src/scm_input.F90 b/scm/src/scm_input.F90 index 648ba0243..2c089b64b 100644 --- a/scm/src/scm_input.F90 +++ b/scm/src/scm_input.F90 @@ -34,7 +34,8 @@ subroutine get_config_nml(scm_state) type(scm_state_type), target, intent(inout) :: scm_state character(len=character_length) :: experiment_name !< name of the experiment configuration file (usually case name) - character(len=character_length) :: model_name !< name of the host model (currently only GFS supported) + character(len=character_length) :: npz_type !< used for generating different FV3 vertical grids + character(len=character_length) :: vert_coord_file !< file containing FV3 vertical grid coefficients character(len=character_length) :: case_name !< name of case initialization and forcing dataset real(kind=dp) :: dt !< time step in seconds real(kind=dp) :: runtime !< total runtime in seconds @@ -48,9 +49,6 @@ subroutine get_config_nml(scm_state) integer :: time_scheme !< 1 => forward Euler, 2 => filtered leapfrog character(len=character_length) :: output_dir !< name of the output directory character(len=character_length) :: output_file !< name of the output file (without the file extension) - character(len=character_length) :: case_data_dir !< path to the directory containing case initialization and forcing data - character(len=character_length) :: vert_coord_data_dir !< path to the directory containing vertical coordinate data - character(len=character_length) :: reference_profile_dir !< path to the directory containing the reference profile integer :: thermo_forcing_type !< 1: "revealed forcing", 2: "horizontal advective forcing", 3: "relaxation forcing" integer :: mom_forcing_type !< 1: "revealed forcing", 2: "horizontal advective forcing", 3: "relaxation forcing" integer :: C_RES !< reference "C" resoltiion of FV3 grid (needed for GWD and mountain blocking) @@ -77,10 +75,10 @@ subroutine get_config_nml(scm_state) CHARACTER(LEN=*), parameter :: experiment_namelist = 'input_experiment.nml' - NAMELIST /case_config/ model_name, n_columns, case_name, dt, time_scheme, runtime, n_itt_out, n_itt_diag, & - n_levels, output_dir, output_file, case_data_dir, vert_coord_data_dir, thermo_forcing_type, model_ics, & + NAMELIST /case_config/ npz_type, vert_coord_file, case_name, dt, runtime, n_itt_out, n_itt_diag, & + n_levels, output_dir, thermo_forcing_type, model_ics, & lsm_ics, do_spinup, C_RES, spinup_timesteps, mom_forcing_type, relax_time, sfc_type, sfc_flux_spec, & - sfc_roughness_length_cm, reference_profile_choice, reference_profile_dir, year, month, day, hour, min, & + sfc_roughness_length_cm, reference_profile_choice, year, month, day, hour, min, & column_area, input_type NAMELIST /physics_config/ physics_suite, physics_nml @@ -89,21 +87,20 @@ subroutine get_config_nml(scm_state) !! @{ !> Define default values for experiment configuration (to be overridden by external namelist file or command line arguments) - model_name = 'GFS' + npz_type = '' + vert_coord_file = '' n_columns = 1 case_name = 'twpice' dt = 600.0 - time_scheme = 2 + time_scheme = 1 runtime = 2138400.0 n_itt_out = 1 n_itt_diag = -999 - n_levels = 64 + n_levels = 127 n_soil = 4 n_snow = 3 output_dir = 'output' output_file = 'output' - case_data_dir = '../data/processed_case_input' - vert_coord_data_dir = '../data/vert_coord_data' thermo_forcing_type = 2 mom_forcing_type = 3 C_RES = 384 @@ -116,7 +113,6 @@ subroutine get_config_nml(scm_state) lsm_ics = .false. do_spinup = .false. reference_profile_choice = 1 - reference_profile_dir = case_data_dir year = 2006 month = 1 day = 19 @@ -166,11 +162,9 @@ subroutine get_config_nml(scm_state) call scm_state%create(n_columns, n_levels, n_soil, n_snow, n_time_levels, tracer_names, tracer_types) scm_state%experiment_name = experiment_name - scm_state%model_name = model_name + scm_state%npz_type = npz_type + scm_state%vert_coord_file = vert_coord_file scm_state%output_dir = output_dir - scm_state%case_data_dir = case_data_dir - scm_state%vert_coord_data_dir = vert_coord_data_dir - scm_state%reference_profile_dir = reference_profile_dir scm_state%output_file = output_file scm_state%case_name = case_name scm_state%physics_suite_name = physics_suite @@ -429,7 +423,7 @@ subroutine get_case_init(scm_state, scm_input) !! @{ !> - Open the case input file found in the processed_case_input dir corresponding to the experiment name. - call check(NF90_OPEN(trim(adjustl(scm_state%case_data_dir))//'/'//trim(adjustl(scm_state%case_name))//'.nc',nf90_nowrite,ncid)) + call check(NF90_OPEN(trim(adjustl(scm_state%case_name))//'.nc',nf90_nowrite,ncid)) !> - Read in missing value from file (replace module variable if present) ierr = NF90_GET_ATT(ncid, NF90_GLOBAL, 'missing_value', nc_missing_value) @@ -1018,7 +1012,7 @@ subroutine get_case_init_DEPHY(scm_state, scm_input) missing_value_eps = missing_value + 0.01 !> - Open the case input file found in the processed_case_input dir corresponding to the experiment name. - call check(NF90_OPEN(trim(adjustl(scm_state%case_data_dir))//'/'//trim(adjustl(scm_state%case_name))//'_SCM_driver.nc',nf90_nowrite,ncid)) + call check(NF90_OPEN(trim(adjustl(scm_state%case_name))//'_SCM_driver.nc',nf90_nowrite,ncid)) !> - Get the dimensions. @@ -2050,7 +2044,7 @@ subroutine get_reference_profile(scm_state, scm_reference) select case (scm_state%reference_profile_choice) case (1) - open(unit=1, file=trim(adjustl(scm_state%reference_profile_dir))//'/'//'McCProfiles.dat', status='old', action='read', iostat=ioerror) + open(unit=1, file='McCProfiles.dat', status='old', action='read', iostat=ioerror) if(ioerror /= 0) then write(*,*) 'There was an error opening the file McCprofiles.dat in the processed_case_input directory. & Error code = ',ioerror @@ -2075,7 +2069,7 @@ subroutine get_reference_profile(scm_state, scm_reference) END DO close(1) case (2) - call check(NF90_OPEN(trim(adjustl(scm_state%reference_profile_dir))//'/'//'mid_lat_summer_std.nc',nf90_nowrite,ncid)) + call check(NF90_OPEN('mid_lat_summer_std.nc',nf90_nowrite,ncid)) call check(NF90_INQ_DIMID(ncid,"height",varID)) call check(NF90_INQUIRE_DIMENSION(ncid, varID, tmpName, nlev)) diff --git a/scm/src/scm_type_defs.F90 b/scm/src/scm_type_defs.F90 index 2d60f299c..822f763aa 100644 --- a/scm/src/scm_type_defs.F90 +++ b/scm/src/scm_type_defs.F90 @@ -38,11 +38,9 @@ module scm_type_defs type scm_state_type character(len=character_length) :: experiment_name !> name of model configuration file - character(len=character_length) :: model_name !< name of "host" model (must be "GFS" for prototype) + character(len=character_length) :: npz_type !< used to define different FV3 vertical grids + character(len=character_length) :: vert_coord_file !< name of vertical coordinate file character(len=character_length) :: output_dir !< name of output directory to place netCDF file - character(len=character_length) :: case_data_dir !< location of the case initialization and forcing data files (relative to the executable path) - character(len=character_length) :: vert_coord_data_dir !< location of the vertical coordinate data files (relative to the executable path) - character(len=character_length) :: reference_profile_dir !< location of the reference profile data files (relative to the executable path) character(len=character_length) :: output_file !< name of output file (without the file extension) character(len=character_length) :: case_name !< name of case initialization and forcing to use (different than experiment name, which names the model run (as a control, experiment_1, etc.)) character(len=character_length) :: physics_suite_name !< name of physics suite (must be "GFS_operational" for prototype) @@ -438,11 +436,9 @@ subroutine scm_state_create(scm_state, n_columns, n_levels, n_soil, n_snow, n_ti integer :: i scm_state%experiment_name = clear_char - scm_state%model_name = clear_char + scm_state%npz_type = clear_char + scm_state%vert_coord_file = clear_char scm_state%output_dir = clear_char - scm_state%case_data_dir = clear_char - scm_state%vert_coord_data_dir = clear_char - scm_state%reference_profile_dir = clear_char scm_state%output_file = clear_char scm_state%case_name = clear_char diff --git a/scm/src/scm_vgrid.F90 b/scm/src/scm_vgrid.F90 index 91704c807..bde37775d 100644 --- a/scm/src/scm_vgrid.F90 +++ b/scm/src/scm_vgrid.F90 @@ -9,7 +9,7 @@ module scm_vgrid implicit none private -public get_GFS_vgrid, get_FV3_vgrid, calc_pres_exner_geopotential, calc_geopotential +public get_FV3_vgrid, calc_pres_exner_geopotential, calc_geopotential logical :: verbose = .true. @@ -21,94 +21,6 @@ module scm_vgrid !! @{ !! Contains the vertical grid setup routines. -!> Subroutine for setting up the GFS hybrid coordinate vertical grid. Files with precalculated coefficients (A_k and B_k) from the -!! "fix" directory in Patrick Tripp's V2 code are used; their filenames start with "global_hyblev". There are only files for 28, 42, -!! 60, 64, and 91 levels. If a different number of levels are specified, an error is returned. Using the A_k and B_k coefficients, the -!! model level pressures, sigma values, and exner function (at interfaces and layer centers) are calculated and returned to the calling -!! procedure. -subroutine get_GFS_vgrid(scm_input, scm_state, error) - use scm_type_defs, only: scm_input_type, scm_state_type - - type(scm_input_type), intent(in) :: scm_input - type(scm_state_type), intent(inout) :: scm_state - - !create GFS hybrid coordinate vertical grid - integer, intent(out) :: error !< error code - - integer :: i, ierr - - real(kind=dp) :: pres_sfc_inv, p0 - character(len=37) :: filename - character(len=80) :: line - character(len=16) :: file_format - - !> \section get_GFS_vgrid_alg Algorithm - !! @{ - - error = 0 - - !file format for all but the 91 level file is the same - file_format = '(1F12.3, 1F12.8)' - - - !> - Check to see if the desired number of grid levels is available. If not, return an error code. - select case (scm_state%n_levels) - case(28) - filename = trim(adjustl(scm_state%vert_coord_data_dir))//"/global_hyblev.l28.txt" - case(42) - filename = trim(adjustl(scm_state%vert_coord_data_dir))//"/global_hyblev.l42.txt" - case(60) - filename = trim(adjustl(scm_state%vert_coord_data_dir))//"/global_hyblev.l60.txt" - case(64) - filename = trim(adjustl(scm_state%vert_coord_data_dir))//"/global_hyblev.l64.txt" - case(91) - filename = trim(adjustl(scm_state%vert_coord_data_dir))//"/global_hyblev.l91.txt" - !file format for the 91-level file is different - file_format = '(1F14.6, 1F10.6)' - case default - error = 1 - return - end select - - !> - Open the appropriate file. - open(unit=1, file=filename, status='old', action='read', iostat=ierr) - if(ierr /= 0) then - write(*,*) 'There was an error opening the file ', filename, ' in the model_config directory. & - Error code = ',ierr - error = 2 - endif - - !> - The first line contains the number of coefficients and number of levels (these should already by known; discard this info) - read(1,'(a)',iostat=ierr) line - !> - Read in the coefficient data. - do i=1, scm_state%n_levels+1 - read(1,file_format) scm_state%a_k(i), scm_state%b_k(i) - end do - close(1) - - !> - Calculate interface pressures, sigma, and exner function. - - p0 = scm_input%input_pres_surf(1) - pres_sfc_inv = 1.0/p0 - do i=1, scm_state%n_levels+1 - scm_state%pres_i(:,i) = scm_state%a_k(i) + scm_state%b_k(i)*p0 - scm_state%si(:,i) = scm_state%a_k(i)*pres_sfc_inv + scm_state%b_k(i) - scm_state%exner_i(:,i) = (scm_state%pres_i(:,i)/1.0E5)**con_rocp - end do - - !> - Calculate layer center pressures, sigma, and exner function. - do i=1, scm_state%n_levels - scm_state%pres_l(:,i) = ((1.0/(con_rocp+1.0))*& - (scm_state%pres_i(:,i)**(con_rocp+1.0) - scm_state%pres_i(:,i+1)**(con_rocp+1.0))/ & - (scm_state%pres_i(:,i) - scm_state%pres_i(:,i+1)))**(1.0/con_rocp) - scm_state%sl(:,i) = 0.5*(scm_state%si(:,i) + scm_state%si(:,i+1)) - - scm_state%exner_l(:,i) = (scm_state%pres_l(:,i)/1.0E5)**con_rocp - - end do - !> @} -end subroutine get_GFS_vgrid - !GJF: most of this was obtained from FV3/atmos_cubed_sphere/tools/fv_eta.F90 from FV3 !GJF: current as of March 2022 !GJF: assuming proprocessor variable USE_VAR_ETA is NOT set @@ -118,7 +30,6 @@ subroutine get_FV3_vgrid(scm_input, scm_state) type(scm_input_type), intent(in) :: scm_input type(scm_state_type), intent(inout) :: scm_state - character(24) :: npz_type integer :: km ! vertical dimension integer :: ks ! number of pure p layers real(kind=dp) :: ptop ! model top (Pa) @@ -133,16 +44,18 @@ subroutine get_FV3_vgrid(scm_input, scm_state) real :: stretch_fac = 1.03 integer :: auto_routine = 0 - integer k, last_index, mid_index + integer k, last_index, mid_index, ierr, dummy, n_levels_file + + character(len=80) :: line + character(len=16) :: file_format #include "fv_eta.h" - npz_type = '' !GJF: this is the default in atmos_cubed_sphere/model/fv_arrays.F90 km = scm_state%n_levels ptop = 1. ! Definition: press(i,j,k) = ak(k) + bk(k) * ps(i,j) - if (trim(npz_type) == 'superC' .or. trim(npz_type) == 'superK') then + if (trim(scm_state%npz_type) == 'superC' .or. trim(scm_state%npz_type) == 'superK') then auto_routine = 1 select case (km) case (20) @@ -178,30 +91,47 @@ subroutine get_FV3_vgrid(scm_input, scm_state) stretch_fac = 1.025 auto_routine = 2 end select - else if (trim(npz_type) == 'input') then - !GJF: not implemented yet - write(*,*) 'scm_vgrid: npz_type = input is not supported yet' - stop - ! Jili Dong add ak/bk input - !call ascii_read (trim(fv_eta_file), eta_level_unit) - !!--- fv_eta_file being read in must have the following format: - !! include a single line description + else if (trim(scm_state%npz_type) == 'input') then + + !> - Open the appropriate file. + open(unit=1, file=scm_state%vert_coord_file, status='old', action='read', iostat=ierr) + if(ierr /= 0) then + write(*,*) 'There was an error opening the file ', scm_state%vert_coord_file, ' in the run directory. & + Error code = ',ierr + stop + endif + + !> The file being read in must have the following format: + !! include a single line description: number of coefficients, number of layers !! ak/bk pairs, with each pair occupying a single line !! the pairs must be ordered from surface to TOA - !! the pairs define the levels of the grid to create levels-1 layers - !if (size(eta_level_unit(:)) /= km+2) then - ! print *,' size is ', size(eta_level_unit(:)) - ! call error_mesg ('FV3 set_eta',trim(fv_eta_file)//" has too few or too many entries or has extra & - ! &spaces at the end of the file", FATAL) - !endif - !l = 1 - !read(eta_level_unit(l),*) - !do k=km+1,1,-1 - ! l = l + 1 - ! read(eta_level_unit(l),*) ak(k),bk(k) - !end do - !deallocate (eta_level_unit) - !call set_external_eta(ak, bk, ptop, ks) + !! the pairs define the interfaces of the grid to create levels-1 layer + + !> - The first line contains the number of coefficients and number of levels + read(1,*) dummy, n_levels_file + if (n_levels_file /= scm_state%n_levels) then + write(*,*) 'There is a mismatch in the number of levels expected and the number of coefficients supplied in the file ',scm_state%vert_coord_file + stop + end if + !> - Read in the coefficient data. + do k=1, km+1 + read(1,*) scm_state%a_k(k), scm_state%b_k(k) + end do + close(1) + + ! flip scm_state%a_k, scm_state%b_k in vertical (a_k and b_k are expected to be TOA-to-surface at this point) + mid_index = (km+1)/2 + last_index = km+1 + do k = 1, mid_index + ak_tmp = scm_state%a_k(k) + bk_tmp = scm_state%b_k(k) + scm_state%a_k(k) = scm_state%a_k(last_index) + scm_state%b_k(k) = scm_state%b_k(last_index) + scm_state%a_k(last_index) = ak_tmp + scm_state%b_k(last_index) = bk_tmp + last_index = last_index - 1 + end do + else select case (km) case (5,10) ! does this work???? @@ -230,7 +160,7 @@ subroutine get_FV3_vgrid(scm_input, scm_state) stretch_fac = 1.03 auto_routine = 1 case (31) ! N = 4, M=2 - if (trim(npz_type) == 'lowtop') then + if (trim(scm_state%npz_type) == 'lowtop') then ptop = 300. pint = 100.E2 stretch_fac = 1.035 @@ -241,13 +171,13 @@ subroutine get_FV3_vgrid(scm_input, scm_state) auto_routine = 1 endif case (32) - if (trim(npz_type) == 'old32') then + if (trim(scm_state%npz_type) == 'old32') then ks = 13 ! high-res trop_32 setup do k=1,km+1 scm_state%a_k(k) = a32old(k) scm_state%b_k(k) = b32old(k) enddo - elseif (trim(npz_type) == 'lowtop') then + elseif (trim(scm_state%npz_type) == 'lowtop') then ptop = 100. stretch_fac = 1.035 auto_routine = 1 @@ -281,7 +211,7 @@ subroutine get_FV3_vgrid(scm_input, scm_state) stretch_fac = 1.035 auto_routine = 1 case (47) - if (trim(npz_type) == 'lowtop') then + if (trim(scm_state%npz_type) == 'lowtop') then ptop = 100. stretch_fac = 1.035 auto_routine = 1 @@ -311,16 +241,16 @@ subroutine get_FV3_vgrid(scm_input, scm_state) scm_state%b_k(k) = b50(k) enddo case (51) - if (trim(npz_type) == 'lowtop') then + if (trim(scm_state%npz_type) == 'lowtop') then ptop = 100. stretch_fac = 1.03 auto_routine = 1 - elseif (trim(npz_type) == 'meso') then + elseif (trim(scm_state%npz_type) == 'meso') then ptop = 20.E2 pint = 100.E2 stretch_fac = 1.05 auto_routine = 1 - elseif (trim(npz_type) == 'meso2') then + elseif (trim(scm_state%npz_type) == 'meso2') then ptop = 1.E2 pint = 100.E2 stretch_fac = 1.05 @@ -332,7 +262,7 @@ subroutine get_FV3_vgrid(scm_input, scm_state) auto_routine = 1 endif case (52) - if (trim(npz_type) == 'rce') then + if (trim(scm_state%npz_type) == 'rce') then ptop = 30.e2 ! for special DPM RCE experiments stretch_fac = 1.03 auto_routine = 1 @@ -361,19 +291,19 @@ subroutine get_FV3_vgrid(scm_input, scm_state) scm_state%b_k(k) = b56(k) enddo case (60) - if (trim(npz_type) == 'gfs') then + if (trim(scm_state%npz_type) == 'gfs') then ks = 20 do k=1,km+1 scm_state%a_k(k) = a60gfs(k) scm_state%b_k(k) = b60gfs(k) enddo - else if (trim(npz_type) == 'BCwave') then + else if (trim(scm_state%npz_type) == 'BCwave') then ptop = 3.e2 ! pint = 250.E2 pint = 300.E2 ! revised for Moist test stretch_fac = 1.03 auto_routine = 1 - else if (trim(npz_type) == 'meso') then + else if (trim(scm_state%npz_type) == 'meso') then ptop = 40.e2 pint = 250.E2 stretch_fac = 1.03 @@ -386,18 +316,18 @@ subroutine get_FV3_vgrid(scm_input, scm_state) enddo endif case (63) - if (trim(npz_type) == 'meso') then + if (trim(scm_state%npz_type) == 'meso') then ks = 11 do k=1,km+1 scm_state%a_k(k) = a63meso(k) scm_state%b_k(k) = b63meso(k) enddo - elseif (trim(npz_type) == 'hitop') then + elseif (trim(scm_state%npz_type) == 'hitop') then ptop = 1. ! high top pint = 100.E2 stretch_fac = 1.035 auto_routine = 1 - else!if (trim(npz_type) == 'gfs') then + else!if (trim(scm_state%npz_type) == 'gfs') then !Used for SHiELD ! GFS L64 equivalent setting ks = 23 @@ -407,7 +337,7 @@ subroutine get_FV3_vgrid(scm_input, scm_state) enddo endif case (64) - if (trim(npz_type) == 'gfs') then + if (trim(scm_state%npz_type) == 'gfs') then ks = 23 do k=1,km+1 scm_state%a_k(k) = a64gfs(k) @@ -437,7 +367,7 @@ subroutine get_FV3_vgrid(scm_input, scm_state) stretch_fac = 1.035 auto_routine = 6 case (79) ! N = 10, M=5 - if (trim(npz_type) == 'gcrm') then + if (trim(scm_state%npz_type) == 'gcrm') then pint = 100.E2 ptop = 3.E2 stretch_fac = 1.035 @@ -491,7 +421,7 @@ subroutine get_FV3_vgrid(scm_input, scm_state) scm_state%b_k(k) = b125(k) enddo case (127) ! N = 10, M=5 - if (trim(npz_type) == 'hitop') then + if (trim(scm_state%npz_type) == 'hitop') then ptop = 1. stretch_fac = 1.03 auto_routine = 2 @@ -508,22 +438,22 @@ subroutine get_FV3_vgrid(scm_input, scm_state) stretch_fac = 1.01 auto_routine = 3 case default - if(trim(npz_type) == 'hitop') then + if(trim(scm_state%npz_type) == 'hitop') then ptop = 1. pint = 100.E2 - elseif(trim(npz_type) == 'midtop') then + elseif(trim(scm_state%npz_type) == 'midtop') then ptop = 10. pint = 100.E2 - elseif(trim(npz_type) == 'lowtop') then + elseif(trim(scm_state%npz_type) == 'lowtop') then ptop = 1.E2 pint = 100.E2 endif - if (trim(npz_type) == 'gfs') then + if (trim(scm_state%npz_type) == 'gfs') then auto_routine = 6 - elseif(trim(npz_type) == 'les') then + elseif(trim(scm_state%npz_type) == 'les') then auto_routine = 3 - elseif(trim(npz_type) == 'mountain_wave') then + elseif(trim(scm_state%npz_type) == 'mountain_wave') then auto_routine = 4 elseif (km > 79) then auto_routine = 2 diff --git a/scm/src/suite_info.py b/scm/src/suite_info.py new file mode 100755 index 000000000..d27041512 --- /dev/null +++ b/scm/src/suite_info.py @@ -0,0 +1,50 @@ +class suite(object): + + def __init__(self, name, tracers, namelist, timestep, max_timestep, supported): + self._name = name #should remain unchanged after init + self._default_tracers = tracers #should remain unchanged after init + self._default_namelist = namelist #should remain unchanged after init + self.tracers = self._default_tracers #can be modified after init + self.namelist = self._default_namelist #can be modified after init + self._supported = supported + + self._max_timestep = max_timestep #should remain unchanged after init + if timestep <= self._max_timestep: + self._default_timestep = timestep #should remain unchanged after init + self.timestep = self._default_timestep #can be modified after init + else: + message = 'The timestep for suite {0} cannot be set greater than the max_timestep of {1}'.format(self._name, self._max_timestep) + raise Exception(message) + +suite_list = [] +suite_list.append(suite('SCM_GFS_v15p2', 'tracers_GFS_v15p2.txt', 'input_GFS_v15p2.nml', 600.0, 1800.0, True )) +suite_list.append(suite('SCM_GFS_v16', 'tracers_GFS_v16.txt', 'input_GFS_v16.nml', 600.0, 1800.0, True )) +suite_list.append(suite('SCM_GSD_v1', 'tracers_gsd.txt', 'input_GSD_v1.nml', 600.0, 600.0 , True )) +suite_list.append(suite('SCM_RRFS_v1alpha', 'tracers_RRFS_v1alpha.txt', 'input_RRFS_v1alpha.nml', 600.0, 600.0 , True )) +suite_list.append(suite('SCM_csawmg', 'tracers_csawmg.txt', 'input_csawmg.nml', 600.0, 1800.0, True )) + +suite_list.append(suite('SCM_GFS_v15p2_RRTMGP', 'tracers_GFS_v15p2.txt', 'input_GFS_v15p2_RRTMGP.nml', 600.0, 1800.0, False)) +suite_list.append(suite('SCM_GFS_v15p2_no_nsst', 'tracers_GFS_v15p2.txt', 'input_GFS_v15p2.nml', 600.0, 1800.0, False)) +suite_list.append(suite('SCM_GFS_v15p2_noahmp', 'tracers_GFS_v15p2.txt', 'input_GFS_v15p2_noahmp.nml', 600.0, 1800.0, False)) +suite_list.append(suite('SCM_GFS_v15p2_MYJ', 'tracers_GFS_v15p2.txt', 'input_GFS_v15p2_MYJ.nml', 600.0, 1800.0, False)) +suite_list.append(suite('SCM_GFS_v15p2_YSU', 'tracers_GFS_v15p2.txt', 'input_GFS_v15p2_YSU.nml', 600.0, 1800.0, False)) +suite_list.append(suite('SCM_GFS_v15p2_saYSU', 'tracers_GFS_v15p2.txt', 'input_GFS_v15p2_saYSU.nml', 600.0, 1800.0, False)) +suite_list.append(suite('SCM_GFS_v15p2_ACM', 'tracers_GFS_v15p2.txt', 'input_GFS_v15p2_ACM.nml', 600.0, 1800.0, False)) +suite_list.append(suite('SCM_GFS_v16_RRTMGP', 'tracers_GFS_v16.txt', 'input_GFS_v16_RRTMGP.nml', 600.0, 1800.0, False)) +suite_list.append(suite('SCM_GFS_v16_no_nsst', 'tracers_GFS_v16.txt', 'input_GFS_v16.nml', 600.0, 1800.0, False)) +suite_list.append(suite('HAFS_v0_hwrf', 'tracers_HAFS_v0_hwrf.txt', 'input_HAFS_v0_hwrf.nml', 600.0, 1800.0, False)) +suite_list.append(suite('HAFS_v0_hwrf_thompson', 'tracers_HAFS_v0_hwrf_thompson.txt', 'input_HAFS_v0_hwrf_thompson.nml', 600.0, 600.0 , False)) + + # run_scm.py changes + # add default n_itt_output, n_itt_diag + # import list of suites + # check if suite_name argument is found in list of suites + # if so use it and modify attributes by incoming args + # if not, create new (if has tracers, namelist to go with) + # + # run dir? + # root dir to create new experiment run dirs (like rt.sh) + # separate build, run, output dirs? + + + From c42f7f157a456f5375eafd5fac5a4e47b6f13181 Mon Sep 17 00:00:00 2001 From: Grant Firl Date: Tue, 8 Mar 2022 20:24:33 -0700 Subject: [PATCH 3/8] use suite_info in run_scm.py --- scm/src/default_namelists.py | 18 --------- scm/src/default_tracers.py | 17 --------- scm/src/run_scm.py | 71 +++++++++++++++++++----------------- scm/src/suite_info.py | 25 ++++++++++++- 4 files changed, 60 insertions(+), 71 deletions(-) delete mode 100644 scm/src/default_namelists.py delete mode 100644 scm/src/default_tracers.py diff --git a/scm/src/default_namelists.py b/scm/src/default_namelists.py deleted file mode 100644 index 6da01a8e4..000000000 --- a/scm/src/default_namelists.py +++ /dev/null @@ -1,18 +0,0 @@ -default_physics_namelists = {"SCM_csawmg":"input_csawmg.nml", - "SCM_GSD_v1":"input_GSD_v1.nml", - "SCM_GFS_v15p2":"input_GFS_v15p2.nml", - "SCM_GFS_v16":"input_GFS_v16.nml", - "SCM_GFS_v15p2_no_nsst":"input_GFS_v15p2.nml", - "SCM_GFS_v16_no_nsst":"input_GFS_v16.nml", - "SCM_GFS_v15p2_RRTMGP":"input_GFS_v15p2_RRTMGP.nml", - "SCM_GFS_v16_RRTMGP":"input_GFS_v16_RRTMGP.nml", - "SCM_GFS_v15p2_noahmp":"input_GFS_v15p2_noahmp.nml", - "SCM_GFS_v15p2_MYJ":"input_GFS_v15p2_MYJ.nml", - "SCM_GFS_v15p2_FA":"input_GFS_v15p2_FA.nml", - "SCM_GFS_v15p2_YSU":"input_GFS_v15p2_YSU.nml", - "SCM_GFS_v15p2_saYSU":"input_GFS_v15p2_saYSU.nml", - "SCM_GFS_v15p2_ACM":"input_GFS_v15p2_ACM.nml", - "HAFS_v0_hwrf":"input_HAFS_v0_hwrf.nml", - "HAFS_v0_hwrf_thompson":"input_HAFS_v0_hwrf_thompson.nml", - "SCM_RRFS_v1alpha":"input_RRFS_v1alpha.nml" - } \ No newline at end of file diff --git a/scm/src/default_tracers.py b/scm/src/default_tracers.py deleted file mode 100644 index e401991b6..000000000 --- a/scm/src/default_tracers.py +++ /dev/null @@ -1,17 +0,0 @@ -default_tracers = {"SCM_GFS_v15p2":"tracers_GFS_v15p2.txt", - "SCM_GFS_v16":"tracers_GFS_v16.txt", - "SCM_GFS_v15p2_RRTMGP":"tracers_GFS_v15p2.txt", - "SCM_GFS_v16_RRTMGP":"tracers_GFS_v16.txt", - "SCM_csawmg":"tracers_csawmg.txt", - "SCM_GFS_v15p2_no_nsst":"tracers_GFS_v15p2.txt", - "SCM_GFS_v16_no_nsst":"tracers_GFS_v16.txt", - "SCM_GFS_v15p2_noahmp":"tracers_GFS_v15p2.txt", - "SCM_GFS_v15p2_MYJ":"tracers_GFS_v15p2.txt", - "SCM_GSD_v1":"tracers_gsd.txt", - "SCM_GFS_v15p2_YSU":"tracers_GFS_v15p2.txt", - "SCM_GFS_v15p2_saYSU":"tracers_GFS_v15p2.txt", - "SCM_GFS_v15p2_ACM":"tracers_GFS_v15p2.txt", - "HAFS_v0_hwrf":"tracers_HAFS_v0_hwrf.txt", - "HAFS_v0_hwrf_thompson":"tracers_HAFS_v0_hwrf_thompson.txt", - "SCM_RRFS_v1alpha":"tracers_RRFS_v1alpha.txt" - } \ No newline at end of file diff --git a/scm/src/run_scm.py b/scm/src/run_scm.py index f4ff1045b..b7025b07e 100755 --- a/scm/src/run_scm.py +++ b/scm/src/run_scm.py @@ -9,8 +9,6 @@ import subprocess import sys import time -from default_namelists import default_physics_namelists -from default_tracers import default_tracers from suite_info import suite, suite_list from netCDF4 import Dataset @@ -112,6 +110,7 @@ parser.add_argument('--case_data_dir', help='directory containing the case input data netCDF file', required=False) parser.add_argument('--n_itt_out', help='period of instantaneous output (number of timesteps)', required=False, type=int) parser.add_argument('--n_itt_diag', help='period of diagnostic output (number of timesteps)', required=False, type=int) +parser.add_argument('-dt', '--timestep', help='timestep (s)', required=False, type=float) ############################################################################### # Functions and subroutines # @@ -158,8 +157,9 @@ def parse_arguments(): n_itt_out = args.n_itt_out n_itt_diag = args.n_itt_diag run_dir = args.run_dir + timestep = args.timestep - return (case, gdb, suite, namelist, docker, tracers, runtime, levels, npz_type, vert_coord_file, case_data_dir, n_itt_out, n_itt_diag, run_dir) + return (case, gdb, suite, namelist, docker, tracers, runtime, levels, npz_type, vert_coord_file, case_data_dir, n_itt_out, n_itt_diag, run_dir, timestep) def find_gdb(): """Detect gdb, abort if not found""" @@ -176,44 +176,25 @@ def find_gdb(): class Experiment(object): - def __init__(self, case, suite, physics_namelist, tracers, runtime, levels, npz_type, vert_coord_file, case_data_dir, n_itt_out, n_itt_diag): + def __init__(self, case, suite, runtime, levels, npz_type, vert_coord_file, case_data_dir, n_itt_out, n_itt_diag): """Initialize experiment. This routine does most of the work, including setting and checking the experiment configuration (namelist).""" self._case = case - self._suite = suite - self._name = case + '_' + suite - - #if a physics namelist is specified (entire filename), it will be used; - #otherwise, a default physics namelist for the given suite is used from default_namelists.py - if physics_namelist: - self._physics_namelist = physics_namelist - else: - if self._suite in default_physics_namelists: - self._physics_namelist = default_physics_namelists.get(self._suite) - else: - message = 'A default physics namelist for suite {0} is not found in default_namelists.py'.format(self._suite) - logging.critical(message) - raise Exception(message) + self._suite_obj = suite + self._suite = suite._name + self._name = case + '_' + suite._name + self._physics_namelist = suite.namelist + #check to see that the physics namelists exists in the right dir if not os.path.isfile(os.path.join(SCM_ROOT, PHYSICS_NAMELIST_DIR, self._physics_namelist)): message = 'The physics namelist {0} was not found'.format(os.path.join(SCM_ROOT, PHYSICS_NAMELIST_DIR, self._physics_namelist)) logging.critical(message) raise Exception(message) - #if a tracer configuration is specified (entire filename), it will be used; - #otherwise, a default tracer configuration for the given suite is used from default_tracers.py - if tracers: - self._tracers = tracers - else: - if self._suite in default_tracers: - self._tracers = default_tracers.get(self._suite) - else: - message = 'A default tracer configuration for suite {0} is not found in default_tracers.py'.format(self._suite) - logging.critical(message) - raise Exception(message) + self._tracers = suite.tracers #check to see that the tracers exists in the right dir if not os.path.isfile(os.path.join(SCM_ROOT, TRACERS_DIR, self._tracers)): @@ -290,6 +271,9 @@ def __init__(self, case, suite, physics_namelist, tracers, runtime, levels, npz_ else: self._n_itt_diag = DEFAULT_DIAG_PERIOD + if suite.timestep is not None: + self._timestep = suite.timestep + @property def name(self): """Get the name of the experiment.""" @@ -433,6 +417,8 @@ def setup_rundir(self): case_nml['case_config']['n_itt_out'] = self._n_itt_out if self._n_itt_diag: case_nml['case_config']['n_itt_diag'] = self._n_itt_diag + if self._timestep: + case_nml['case_config']['dt'] = self._timestep # look for the output_dir variable in the case configuration namelist and use it if it does; # if it doesn't exist, create a default output directory name (from the case and suite names) and create a namelist patch try: @@ -440,7 +426,7 @@ def setup_rundir(self): custom_output_dir = True except KeyError: # If using the default namelist, no need to include it in the output directory name; if not, need to use write custom namelist in output dir name in case running multiple experiments with the same case and suite but different namelists - if self._physics_namelist == default_physics_namelists.get(self._suite): + if self._physics_namelist == self._suite_obj._default_namelist: output_dir = 'output_' + self._case + '_' + self._suite else: output_dir = 'output_' + self._case + '_' + self._suite + '_' + os.path.splitext(self._physics_namelist)[0] @@ -655,7 +641,7 @@ def setup_rundir(self): # Write experiment configuration file to output directory logging.info('Writing experiment configuration {0}.nml to output directory'.format(self._name)) - cmd = 'cp {0} {1}'.format(STANDARD_EXPERIMENT_NAMELIST, os.path.join(SCM_RUN, output_dir,self._name + '.nml')) + cmd = 'cp {0} {1}'.format(os.path.join(SCM_RUN, STANDARD_EXPERIMENT_NAMELIST), os.path.join(SCM_RUN, output_dir,self._name + '.nml')) execute(cmd) # Copy executable to run dir (does copying the executable give any performance gains on, say, HPC where build dir is in home and run dir on scratch/glade?) @@ -686,7 +672,7 @@ def copy_outdir(exp_dir): shutil.copytree(exp_dir, home_output_dir) def main(): - (case, use_gdb, suite_name, namelist, docker, tracers, runtime, levels, npz_type, vert_coord_file, case_data_dir, n_itt_out, n_itt_diag, run_dir) = parse_arguments() + (case, use_gdb, suite_name, namelist, docker, tracers, runtime, levels, npz_type, vert_coord_file, case_data_dir, n_itt_out, n_itt_diag, run_dir, timestep) = parse_arguments() global SCM_ROOT SCM_ROOT = os.getenv('SCM_ROOT') @@ -728,9 +714,26 @@ def main(): if suite_name == s._name: active_suite = s break + + if (active_suite is None): + if (namelist and tracers): + if timestep: + active_suite = suite(suite_name, tracers, namelist, timestep, -1, False) + else: + active_sutie = suite(suite_name, tracers, namelist, -1, -1, False) + else: + message = 'The given suite ({0}), does not have defaults set in suite_info.py and either the tracers file or physics namelist file (or both) were not provided.'.format(suite_name) + logging.critical(message) + raise Exception(message) + else: + if namelist: + active_suite.namelist = namelist + if tracers: + active_suite.tracers = tracers + if timestep: + active_suite.timestep = timestep - - exp = Experiment(case, suite_name, namelist, tracers, runtime, levels, npz_type, vert_coord_file, case_data_dir, n_itt_out, n_itt_diag) + exp = Experiment(case, active_suite, runtime, levels, npz_type, vert_coord_file, case_data_dir, n_itt_out, n_itt_diag) exp_dir = exp.setup_rundir() # Debugger if use_gdb: diff --git a/scm/src/suite_info.py b/scm/src/suite_info.py index d27041512..b77527fd5 100755 --- a/scm/src/suite_info.py +++ b/scm/src/suite_info.py @@ -1,5 +1,7 @@ class suite(object): + DEFAULT_MAX_TIMESTEP = 1800.0 + def __init__(self, name, tracers, namelist, timestep, max_timestep, supported): self._name = name #should remain unchanged after init self._default_tracers = tracers #should remain unchanged after init @@ -8,14 +10,33 @@ def __init__(self, name, tracers, namelist, timestep, max_timestep, supported): self.namelist = self._default_namelist #can be modified after init self._supported = supported - self._max_timestep = max_timestep #should remain unchanged after init - if timestep <= self._max_timestep: + if max_timestep > 0: + self._max_timestep = max_timestep #should remain unchanged after init + else: + self._max_timestep = DEFAULT_MAX_TIMESTEP + if timestep <= self._max_timestep and timestep > 0: self._default_timestep = timestep #should remain unchanged after init self.timestep = self._default_timestep #can be modified after init + elif timestep <= 0: + self.timestep = None #use the default dt in the SCM code else: message = 'The timestep for suite {0} cannot be set greater than the max_timestep of {1}'.format(self._name, self._max_timestep) raise Exception(message) + @property + def timestep(self): + """Get the timestep for the given suite.""" + return self.timestep + + @timestep.setter + def timestep(self, value): + """Set the timestep for the given suite.""" + if value <= self._max_timestep: + self.timestep = value + else: + message = 'The timestep for suite {0} cannot be set greater than the max_timestep of {1}'.format(self._name, self._max_timestep) + raise Exception(message) + suite_list = [] suite_list.append(suite('SCM_GFS_v15p2', 'tracers_GFS_v15p2.txt', 'input_GFS_v15p2.nml', 600.0, 1800.0, True )) suite_list.append(suite('SCM_GFS_v16', 'tracers_GFS_v16.txt', 'input_GFS_v16.nml', 600.0, 1800.0, True )) From 1b306f8a6d7ea2ba1cda51ef6e99dd92e3fa2f9b Mon Sep 17 00:00:00 2001 From: Grant Firl Date: Wed, 9 Mar 2022 17:32:31 -0700 Subject: [PATCH 4/8] edit all case configuration files to have only necessary case-specific variables; edit rt.sh to work with new run script; add runtime_mult argument --- scm/etc/case_config/AMMA_REF.nml | 11 -- scm/etc/case_config/ARMCU_E3SM.nml | 10 -- scm/etc/case_config/ARMCU_MESONH.nml | 10 -- scm/etc/case_config/ARMCU_REF.nml | 11 -- scm/etc/case_config/AYOTTE_00SC.nml | 10 -- scm/etc/case_config/BOMEX_REF.nml | 10 -- scm/etc/case_config/DYNAMO_NSA3a.nml | 10 -- scm/etc/case_config/DYNAMO_NSA3a_D1.nml | 10 -- scm/etc/case_config/GABLS1_REF.nml | 10 -- scm/etc/case_config/IHOP_REF.nml | 10 -- scm/etc/case_config/LASSO_2016051812.nml | 9 -- scm/etc/case_config/LASSO_2016051812_MSDA.nml | 9 -- scm/etc/case_config/LASSO_2016051812_VARA.nml | 9 -- scm/etc/case_config/LASSO_20180514_s02.nml | 9 -- scm/etc/case_config/LASSO_20180522_s02.nml | 9 -- scm/etc/case_config/LASSO_20180606_s02.nml | 9 -- scm/etc/case_config/LASSO_20180618_s02.nml | 9 -- scm/etc/case_config/LASSO_20180619_s02.nml | 9 -- scm/etc/case_config/LASSO_20180705_s02.nml | 9 -- scm/etc/case_config/LASSO_20180707_s02.nml | 9 -- scm/etc/case_config/LASSO_20180709_s02.nml | 9 -- scm/etc/case_config/LASSO_20180712_s02.nml | 9 -- scm/etc/case_config/LASSO_20180731_s02.nml | 9 -- scm/etc/case_config/LASSO_20180911_s02.nml | 9 -- scm/etc/case_config/LASSO_20180914_s02.nml | 9 -- scm/etc/case_config/LASSO_20180916_s02.nml | 9 -- scm/etc/case_config/LASSO_20180917_s02.nml | 9 -- scm/etc/case_config/LASSO_20180918_s02.nml | 9 -- scm/etc/case_config/LASSO_20181002_s02.nml | 9 -- scm/etc/case_config/MPACE_REF.nml | 10 -- scm/etc/case_config/RICO_MESONH.nml | 10 -- scm/etc/case_config/SANDU_FAST.nml | 10 -- scm/etc/case_config/SANDU_REF.nml | 10 -- scm/etc/case_config/SANDU_SLOW.nml | 10 -- scm/etc/case_config/SCMS_REF.nml | 10 -- scm/etc/case_config/arm_sgp_summer_1997_B.nml | 11 +- scm/etc/case_config/arm_sgp_summer_1997_C.nml | 11 +- scm/etc/case_config/arm_sgp_summer_1997_R.nml | 9 -- scm/etc/case_config/arm_sgp_summer_1997_S.nml | 11 +- scm/etc/case_config/arm_sgp_summer_1997_T.nml | 11 +- scm/etc/case_config/arm_sgp_summer_1997_U.nml | 9 -- scm/etc/case_config/arm_sgp_summer_1997_X.nml | 9 -- scm/etc/case_config/astex.nml | 9 -- scm/etc/case_config/bomex.nml | 9 -- scm/etc/case_config/default.nml | 9 -- scm/etc/case_config/fv3_model_point_noah.nml | 10 -- scm/etc/case_config/gabls3.nml | 10 -- scm/etc/case_config/gabls3_noahmp.nml | 10 -- scm/etc/case_config/gabls3_ruc.nml | 10 -- scm/etc/case_config/twpice.nml | 12 +- scm/src/multi_run_scm.py | 108 +++++++++++++----- scm/src/run_scm.py | 41 +++++-- test/rt.sh | 8 +- 53 files changed, 122 insertions(+), 518 deletions(-) diff --git a/scm/etc/case_config/AMMA_REF.nml b/scm/etc/case_config/AMMA_REF.nml index 96c4506bb..5921d4103 100644 --- a/scm/etc/case_config/AMMA_REF.nml +++ b/scm/etc/case_config/AMMA_REF.nml @@ -1,20 +1,9 @@ $case_config -model_name = 'FV3', -n_columns = 1, case_name = 'AMMA_REF', input_type = 1 -dt = 600.0, -time_scheme = 1, -n_itt_out = 1, -n_itt_diag = 1, -n_levels = 64, -output_file = 'output', -case_data_dir = '../data/DEPHY-SCM/AMMA/REF', -vert_coord_data_dir = '../data/vert_coord_data', lsm_ics = .false., do_spinup = .false., spinup_timesteps = 0, reference_profile_choice = 2, -reference_profile_dir = '../data/processed_case_input' column_area = 1.45E8, $end diff --git a/scm/etc/case_config/ARMCU_E3SM.nml b/scm/etc/case_config/ARMCU_E3SM.nml index e5f525cdc..fceb583d8 100644 --- a/scm/etc/case_config/ARMCU_E3SM.nml +++ b/scm/etc/case_config/ARMCU_E3SM.nml @@ -1,16 +1,6 @@ $case_config -model_name = 'FV3', -n_columns = 1, case_name = 'ARMCU_E3SM', input_type = 1 -dt = 600.0, -time_scheme = 1, -n_itt_out = 1, -n_itt_diag = 1, -n_levels = 64, -output_file = 'output', -case_data_dir = '../data/DEPHY-SCM/ARMCU/E3SM', -vert_coord_data_dir = '../data/vert_coord_data', lsm_ics = .false., do_spinup = .false., spinup_timesteps = 0, diff --git a/scm/etc/case_config/ARMCU_MESONH.nml b/scm/etc/case_config/ARMCU_MESONH.nml index fd9ce263b..c75452ade 100644 --- a/scm/etc/case_config/ARMCU_MESONH.nml +++ b/scm/etc/case_config/ARMCU_MESONH.nml @@ -1,16 +1,6 @@ $case_config -model_name = 'FV3', -n_columns = 1, case_name = 'ARMCU_MESONH', input_type = 1 -dt = 600.0, -time_scheme = 1, -n_itt_out = 1, -n_itt_diag = 1, -n_levels = 64, -output_file = 'output', -case_data_dir = '../data/DEPHY-SCM/ARMCU/MESONH', -vert_coord_data_dir = '../data/vert_coord_data', lsm_ics = .false., do_spinup = .false., spinup_timesteps = 0, diff --git a/scm/etc/case_config/ARMCU_REF.nml b/scm/etc/case_config/ARMCU_REF.nml index 3001ce36a..ec84d1e2b 100644 --- a/scm/etc/case_config/ARMCU_REF.nml +++ b/scm/etc/case_config/ARMCU_REF.nml @@ -1,20 +1,9 @@ $case_config -model_name = 'FV3', -n_columns = 1, case_name = 'ARMCU_REF', input_type = 1 -dt = 600.0, -time_scheme = 1, -n_itt_out = 1, -n_itt_diag = 1, -n_levels = 64, -output_file = 'output', -case_data_dir = '../data/DEPHY-SCM/ARMCU/REF', -vert_coord_data_dir = '../data/vert_coord_data', lsm_ics = .false., do_spinup = .false., spinup_timesteps = 0, reference_profile_choice = 2, -reference_profile_dir = '../data/processed_case_input' column_area = 1.45E8, $end diff --git a/scm/etc/case_config/AYOTTE_00SC.nml b/scm/etc/case_config/AYOTTE_00SC.nml index 49c1d008c..de24578b7 100644 --- a/scm/etc/case_config/AYOTTE_00SC.nml +++ b/scm/etc/case_config/AYOTTE_00SC.nml @@ -1,16 +1,6 @@ $case_config -model_name = 'FV3', -n_columns = 1, case_name = 'AYOTTE_00SC', input_type = 1 -dt = 600.0, -time_scheme = 1, -n_itt_out = 1, -n_itt_diag = 1, -n_levels = 64, -output_file = 'output', -case_data_dir = '../data/DEPHY-SCM/AYOTTE/00SC', -vert_coord_data_dir = '../data/vert_coord_data', lsm_ics = .false., do_spinup = .false., spinup_timesteps = 0, diff --git a/scm/etc/case_config/BOMEX_REF.nml b/scm/etc/case_config/BOMEX_REF.nml index ac5b59846..a684bc380 100644 --- a/scm/etc/case_config/BOMEX_REF.nml +++ b/scm/etc/case_config/BOMEX_REF.nml @@ -1,16 +1,6 @@ $case_config -model_name = 'FV3', -n_columns = 1, case_name = 'BOMEX_REF', input_type = 1 -dt = 600.0, -time_scheme = 1, -n_itt_out = 1, -n_itt_diag = 1, -n_levels = 64, -output_file = 'output', -case_data_dir = '../data/DEPHY-SCM/BOMEX/REF', -vert_coord_data_dir = '../data/vert_coord_data', lsm_ics = .false., do_spinup = .false., spinup_timesteps = 0, diff --git a/scm/etc/case_config/DYNAMO_NSA3a.nml b/scm/etc/case_config/DYNAMO_NSA3a.nml index a81845868..c10cc953a 100644 --- a/scm/etc/case_config/DYNAMO_NSA3a.nml +++ b/scm/etc/case_config/DYNAMO_NSA3a.nml @@ -1,16 +1,6 @@ $case_config -model_name = 'FV3', -n_columns = 1, case_name = 'DYNAMO_NSA3a', input_type = 1 -dt = 600.0, -time_scheme = 1, -n_itt_out = 1, -n_itt_diag = 1, -n_levels = 64, -output_file = 'output', -case_data_dir = '../data/DEPHY-SCM/DYNAMO/NSA3a', -vert_coord_data_dir = '../data/vert_coord_data', lsm_ics = .false., do_spinup = .false., spinup_timesteps = 0, diff --git a/scm/etc/case_config/DYNAMO_NSA3a_D1.nml b/scm/etc/case_config/DYNAMO_NSA3a_D1.nml index 4b2cbc9ee..c9ea73f29 100644 --- a/scm/etc/case_config/DYNAMO_NSA3a_D1.nml +++ b/scm/etc/case_config/DYNAMO_NSA3a_D1.nml @@ -1,16 +1,6 @@ $case_config -model_name = 'FV3', -n_columns = 1, case_name = 'DYNAMO_NSA3a_D1', input_type = 1 -dt = 600.0, -time_scheme = 1, -n_itt_out = 1, -n_itt_diag = 1, -n_levels = 64, -output_file = 'output', -case_data_dir = '../data/DEPHY-SCM/DYNAMO/NSA3a_D1', -vert_coord_data_dir = '../data/vert_coord_data', lsm_ics = .false., do_spinup = .false., spinup_timesteps = 0, diff --git a/scm/etc/case_config/GABLS1_REF.nml b/scm/etc/case_config/GABLS1_REF.nml index 6acf4b4b6..ab50b2a44 100644 --- a/scm/etc/case_config/GABLS1_REF.nml +++ b/scm/etc/case_config/GABLS1_REF.nml @@ -1,16 +1,6 @@ $case_config -model_name = 'FV3', -n_columns = 1, case_name = 'GABLS1_REF', input_type = 1 -dt = 600.0, -time_scheme = 1, -n_itt_out = 1, -n_itt_diag = 1, -n_levels = 64, -output_file = 'output', -case_data_dir = '../data/DEPHY-SCM/GABLS1/REF', -vert_coord_data_dir = '../data/vert_coord_data', lsm_ics = .false., do_spinup = .false., spinup_timesteps = 0, diff --git a/scm/etc/case_config/IHOP_REF.nml b/scm/etc/case_config/IHOP_REF.nml index 92fbf0af9..9ae918161 100644 --- a/scm/etc/case_config/IHOP_REF.nml +++ b/scm/etc/case_config/IHOP_REF.nml @@ -1,16 +1,6 @@ $case_config -model_name = 'FV3', -n_columns = 1, case_name = 'IHOP_REF', input_type = 1 -dt = 600.0, -time_scheme = 1, -n_itt_out = 1, -n_itt_diag = 1, -n_levels = 64, -output_file = 'output', -case_data_dir = '../data/DEPHY-SCM/IHOP/REF', -vert_coord_data_dir = '../data/vert_coord_data', lsm_ics = .false., do_spinup = .false., spinup_timesteps = 0, diff --git a/scm/etc/case_config/LASSO_2016051812.nml b/scm/etc/case_config/LASSO_2016051812.nml index bba6da995..75eff16b8 100644 --- a/scm/etc/case_config/LASSO_2016051812.nml +++ b/scm/etc/case_config/LASSO_2016051812.nml @@ -1,15 +1,6 @@ $case_config -model_name = 'FV3', -n_columns = 1, case_name = 'LASSO_2016051812', -dt = 600.0, -time_scheme = 1, runtime = 54000, -n_itt_out = 1, -n_levels = 64, -output_file = 'output', -case_data_dir = '../data/processed_case_input', -vert_coord_data_dir = '../data/vert_coord_data', thermo_forcing_type = 2, mom_forcing_type = 3, relax_time = 7200.0, diff --git a/scm/etc/case_config/LASSO_2016051812_MSDA.nml b/scm/etc/case_config/LASSO_2016051812_MSDA.nml index 3388311d0..900c70b9e 100644 --- a/scm/etc/case_config/LASSO_2016051812_MSDA.nml +++ b/scm/etc/case_config/LASSO_2016051812_MSDA.nml @@ -1,15 +1,6 @@ $case_config -model_name = 'FV3', -n_columns = 1, case_name = 'LASSO_2016051812_MSDA', -dt = 600.0, -time_scheme = 1, runtime = 54000, -n_itt_out = 1, -n_levels = 64, -output_file = 'output', -case_data_dir = '../data/processed_case_input', -vert_coord_data_dir = '../data/vert_coord_data', thermo_forcing_type = 2, mom_forcing_type = 3, relax_time = 7200.0, diff --git a/scm/etc/case_config/LASSO_2016051812_VARA.nml b/scm/etc/case_config/LASSO_2016051812_VARA.nml index 197f049fc..2f0374372 100644 --- a/scm/etc/case_config/LASSO_2016051812_VARA.nml +++ b/scm/etc/case_config/LASSO_2016051812_VARA.nml @@ -1,15 +1,6 @@ $case_config -model_name = 'FV3', -n_columns = 1, case_name = 'LASSO_2016051812_VARA', -dt = 600.0, -time_scheme = 1, runtime = 54000, -n_itt_out = 1, -n_levels = 64, -output_file = 'output', -case_data_dir = '../data/processed_case_input', -vert_coord_data_dir = '../data/vert_coord_data', thermo_forcing_type = 2, mom_forcing_type = 3, relax_time = 7200.0, diff --git a/scm/etc/case_config/LASSO_20180514_s02.nml b/scm/etc/case_config/LASSO_20180514_s02.nml index 96187ebc6..432c77ed1 100644 --- a/scm/etc/case_config/LASSO_20180514_s02.nml +++ b/scm/etc/case_config/LASSO_20180514_s02.nml @@ -1,15 +1,6 @@ $case_config -model_name = 'FV3', -n_columns = 1, case_name = 'LASSO_20180514_s02', -dt = 600.0, -time_scheme = 1, runtime = 54000, -n_itt_out = 1, -n_levels = 64, -output_file = 'output', -case_data_dir = '../data/processed_case_input', -vert_coord_data_dir = '../data/vert_coord_data', thermo_forcing_type = 2, mom_forcing_type = 3, relax_time = 7200.0, diff --git a/scm/etc/case_config/LASSO_20180522_s02.nml b/scm/etc/case_config/LASSO_20180522_s02.nml index 3853bdd9f..4f69ef9b1 100644 --- a/scm/etc/case_config/LASSO_20180522_s02.nml +++ b/scm/etc/case_config/LASSO_20180522_s02.nml @@ -1,15 +1,6 @@ $case_config -model_name = 'FV3', -n_columns = 1, case_name = 'LASSO_20180522_s02', -dt = 600.0, -time_scheme = 1, runtime = 54000, -n_itt_out = 1, -n_levels = 64, -output_file = 'output', -case_data_dir = '../data/processed_case_input', -vert_coord_data_dir = '../data/vert_coord_data', thermo_forcing_type = 2, mom_forcing_type = 3, relax_time = 7200.0, diff --git a/scm/etc/case_config/LASSO_20180606_s02.nml b/scm/etc/case_config/LASSO_20180606_s02.nml index 7e9746ccf..feeadc334 100644 --- a/scm/etc/case_config/LASSO_20180606_s02.nml +++ b/scm/etc/case_config/LASSO_20180606_s02.nml @@ -1,15 +1,6 @@ $case_config -model_name = 'FV3', -n_columns = 1, case_name = 'LASSO_20180606_s02', -dt = 600.0, -time_scheme = 1, runtime = 54000, -n_itt_out = 1, -n_levels = 64, -output_file = 'output', -case_data_dir = '../data/processed_case_input', -vert_coord_data_dir = '../data/vert_coord_data', thermo_forcing_type = 2, mom_forcing_type = 3, relax_time = 7200.0, diff --git a/scm/etc/case_config/LASSO_20180618_s02.nml b/scm/etc/case_config/LASSO_20180618_s02.nml index 76f99c2dc..a5b261a3c 100644 --- a/scm/etc/case_config/LASSO_20180618_s02.nml +++ b/scm/etc/case_config/LASSO_20180618_s02.nml @@ -1,15 +1,6 @@ $case_config -model_name = 'FV3', -n_columns = 1, case_name = 'LASSO_20180618_s02', -dt = 600.0, -time_scheme = 1, runtime = 54000, -n_itt_out = 1, -n_levels = 64, -output_file = 'output', -case_data_dir = '../data/processed_case_input', -vert_coord_data_dir = '../data/vert_coord_data', thermo_forcing_type = 2, mom_forcing_type = 3, relax_time = 7200.0, diff --git a/scm/etc/case_config/LASSO_20180619_s02.nml b/scm/etc/case_config/LASSO_20180619_s02.nml index 1ffce01f6..e32bc294d 100644 --- a/scm/etc/case_config/LASSO_20180619_s02.nml +++ b/scm/etc/case_config/LASSO_20180619_s02.nml @@ -1,15 +1,6 @@ $case_config -model_name = 'FV3', -n_columns = 1, case_name = 'LASSO_20180619_s02', -dt = 600.0, -time_scheme = 1, runtime = 54000, -n_itt_out = 1, -n_levels = 64, -output_file = 'output', -case_data_dir = '../data/processed_case_input', -vert_coord_data_dir = '../data/vert_coord_data', thermo_forcing_type = 2, mom_forcing_type = 3, relax_time = 7200.0, diff --git a/scm/etc/case_config/LASSO_20180705_s02.nml b/scm/etc/case_config/LASSO_20180705_s02.nml index e1f95d61c..5648360e8 100644 --- a/scm/etc/case_config/LASSO_20180705_s02.nml +++ b/scm/etc/case_config/LASSO_20180705_s02.nml @@ -1,15 +1,6 @@ $case_config -model_name = 'FV3', -n_columns = 1, case_name = 'LASSO_20180705_s02', -dt = 600.0, -time_scheme = 1, runtime = 54000, -n_itt_out = 1, -n_levels = 64, -output_file = 'output', -case_data_dir = '../data/processed_case_input', -vert_coord_data_dir = '../data/vert_coord_data', thermo_forcing_type = 2, mom_forcing_type = 3, relax_time = 7200.0, diff --git a/scm/etc/case_config/LASSO_20180707_s02.nml b/scm/etc/case_config/LASSO_20180707_s02.nml index 4b930b7a2..af73e1d62 100644 --- a/scm/etc/case_config/LASSO_20180707_s02.nml +++ b/scm/etc/case_config/LASSO_20180707_s02.nml @@ -1,15 +1,6 @@ $case_config -model_name = 'FV3', -n_columns = 1, case_name = 'LASSO_20180707_s02', -dt = 600.0, -time_scheme = 1, runtime = 54000, -n_itt_out = 1, -n_levels = 64, -output_file = 'output', -case_data_dir = '../data/processed_case_input', -vert_coord_data_dir = '../data/vert_coord_data', thermo_forcing_type = 2, mom_forcing_type = 3, relax_time = 7200.0, diff --git a/scm/etc/case_config/LASSO_20180709_s02.nml b/scm/etc/case_config/LASSO_20180709_s02.nml index 6ae76cb6f..ac68594cd 100644 --- a/scm/etc/case_config/LASSO_20180709_s02.nml +++ b/scm/etc/case_config/LASSO_20180709_s02.nml @@ -1,15 +1,6 @@ $case_config -model_name = 'FV3', -n_columns = 1, case_name = 'LASSO_20180709_s02', -dt = 600.0, -time_scheme = 1, runtime = 54000, -n_itt_out = 1, -n_levels = 64, -output_file = 'output', -case_data_dir = '../data/processed_case_input', -vert_coord_data_dir = '../data/vert_coord_data', thermo_forcing_type = 2, mom_forcing_type = 3, relax_time = 7200.0, diff --git a/scm/etc/case_config/LASSO_20180712_s02.nml b/scm/etc/case_config/LASSO_20180712_s02.nml index c8591cc42..6917a1851 100644 --- a/scm/etc/case_config/LASSO_20180712_s02.nml +++ b/scm/etc/case_config/LASSO_20180712_s02.nml @@ -1,15 +1,6 @@ $case_config -model_name = 'FV3', -n_columns = 1, case_name = 'LASSO_20180712_s02', -dt = 600.0, -time_scheme = 1, runtime = 54000, -n_itt_out = 1, -n_levels = 64, -output_file = 'output', -case_data_dir = '../data/processed_case_input', -vert_coord_data_dir = '../data/vert_coord_data', thermo_forcing_type = 2, mom_forcing_type = 3, relax_time = 7200.0, diff --git a/scm/etc/case_config/LASSO_20180731_s02.nml b/scm/etc/case_config/LASSO_20180731_s02.nml index 05029c5b5..6ac93bbad 100644 --- a/scm/etc/case_config/LASSO_20180731_s02.nml +++ b/scm/etc/case_config/LASSO_20180731_s02.nml @@ -1,15 +1,6 @@ $case_config -model_name = 'FV3', -n_columns = 1, case_name = 'LASSO_20180731_s02', -dt = 600.0, -time_scheme = 1, runtime = 54000, -n_itt_out = 1, -n_levels = 64, -output_file = 'output', -case_data_dir = '../data/processed_case_input', -vert_coord_data_dir = '../data/vert_coord_data', thermo_forcing_type = 2, mom_forcing_type = 3, relax_time = 7200.0, diff --git a/scm/etc/case_config/LASSO_20180911_s02.nml b/scm/etc/case_config/LASSO_20180911_s02.nml index 4138e027e..e4fc92955 100644 --- a/scm/etc/case_config/LASSO_20180911_s02.nml +++ b/scm/etc/case_config/LASSO_20180911_s02.nml @@ -1,15 +1,6 @@ $case_config -model_name = 'FV3', -n_columns = 1, case_name = 'LASSO_20180911_s02', -dt = 600.0, -time_scheme = 1, runtime = 54000, -n_itt_out = 1, -n_levels = 64, -output_file = 'output', -case_data_dir = '../data/processed_case_input', -vert_coord_data_dir = '../data/vert_coord_data', thermo_forcing_type = 2, mom_forcing_type = 3, relax_time = 7200.0, diff --git a/scm/etc/case_config/LASSO_20180914_s02.nml b/scm/etc/case_config/LASSO_20180914_s02.nml index fdaf44952..66d28362d 100644 --- a/scm/etc/case_config/LASSO_20180914_s02.nml +++ b/scm/etc/case_config/LASSO_20180914_s02.nml @@ -1,15 +1,6 @@ $case_config -model_name = 'FV3', -n_columns = 1, case_name = 'LASSO_20180914_s02', -dt = 600.0, -time_scheme = 1, runtime = 54000, -n_itt_out = 1, -n_levels = 64, -output_file = 'output', -case_data_dir = '../data/processed_case_input', -vert_coord_data_dir = '../data/vert_coord_data', thermo_forcing_type = 2, mom_forcing_type = 3, relax_time = 7200.0, diff --git a/scm/etc/case_config/LASSO_20180916_s02.nml b/scm/etc/case_config/LASSO_20180916_s02.nml index d8461ecf3..6197652b8 100644 --- a/scm/etc/case_config/LASSO_20180916_s02.nml +++ b/scm/etc/case_config/LASSO_20180916_s02.nml @@ -1,15 +1,6 @@ $case_config -model_name = 'FV3', -n_columns = 1, case_name = 'LASSO_20180916_s02', -dt = 600.0, -time_scheme = 1, runtime = 54000, -n_itt_out = 1, -n_levels = 64, -output_file = 'output', -case_data_dir = '../data/processed_case_input', -vert_coord_data_dir = '../data/vert_coord_data', thermo_forcing_type = 2, mom_forcing_type = 3, relax_time = 7200.0, diff --git a/scm/etc/case_config/LASSO_20180917_s02.nml b/scm/etc/case_config/LASSO_20180917_s02.nml index b1d7103fc..896a32225 100644 --- a/scm/etc/case_config/LASSO_20180917_s02.nml +++ b/scm/etc/case_config/LASSO_20180917_s02.nml @@ -1,15 +1,6 @@ $case_config -model_name = 'FV3', -n_columns = 1, case_name = 'LASSO_20180917_s02', -dt = 600.0, -time_scheme = 1, runtime = 54000, -n_itt_out = 1, -n_levels = 64, -output_file = 'output', -case_data_dir = '../data/processed_case_input', -vert_coord_data_dir = '../data/vert_coord_data', thermo_forcing_type = 2, mom_forcing_type = 3, relax_time = 7200.0, diff --git a/scm/etc/case_config/LASSO_20180918_s02.nml b/scm/etc/case_config/LASSO_20180918_s02.nml index 1dad0c91e..09deb06aa 100644 --- a/scm/etc/case_config/LASSO_20180918_s02.nml +++ b/scm/etc/case_config/LASSO_20180918_s02.nml @@ -1,15 +1,6 @@ $case_config -model_name = 'FV3', -n_columns = 1, case_name = 'LASSO_20180918_s02', -dt = 600.0, -time_scheme = 1, runtime = 54000, -n_itt_out = 1, -n_levels = 64, -output_file = 'output', -case_data_dir = '../data/processed_case_input', -vert_coord_data_dir = '../data/vert_coord_data', thermo_forcing_type = 2, mom_forcing_type = 3, relax_time = 7200.0, diff --git a/scm/etc/case_config/LASSO_20181002_s02.nml b/scm/etc/case_config/LASSO_20181002_s02.nml index 8114ae804..b63d206de 100644 --- a/scm/etc/case_config/LASSO_20181002_s02.nml +++ b/scm/etc/case_config/LASSO_20181002_s02.nml @@ -1,15 +1,6 @@ $case_config -model_name = 'FV3', -n_columns = 1, case_name = 'LASSO_20181002_s02', -dt = 600.0, -time_scheme = 1, runtime = 54000, -n_itt_out = 1, -n_levels = 64, -output_file = 'output', -case_data_dir = '../data/processed_case_input', -vert_coord_data_dir = '../data/vert_coord_data', thermo_forcing_type = 2, mom_forcing_type = 3, relax_time = 7200.0, diff --git a/scm/etc/case_config/MPACE_REF.nml b/scm/etc/case_config/MPACE_REF.nml index d00da2ded..a67fad9f9 100644 --- a/scm/etc/case_config/MPACE_REF.nml +++ b/scm/etc/case_config/MPACE_REF.nml @@ -1,16 +1,6 @@ $case_config -model_name = 'FV3', -n_columns = 1, case_name = 'MPACE_REF', input_type = 1 -dt = 600.0, -time_scheme = 1, -n_itt_out = 1, -n_itt_diag = 1, -n_levels = 64, -output_file = 'output', -case_data_dir = '../data/DEPHY-SCM/MPACE/REF', -vert_coord_data_dir = '../data/vert_coord_data', lsm_ics = .false., do_spinup = .false., spinup_timesteps = 0, diff --git a/scm/etc/case_config/RICO_MESONH.nml b/scm/etc/case_config/RICO_MESONH.nml index 1defff18b..4e8ca78ba 100644 --- a/scm/etc/case_config/RICO_MESONH.nml +++ b/scm/etc/case_config/RICO_MESONH.nml @@ -1,16 +1,6 @@ $case_config -model_name = 'FV3', -n_columns = 1, case_name = 'RICO_MESONH', input_type = 1 -dt = 600.0, -time_scheme = 1, -n_itt_out = 1, -n_itt_diag = 1, -n_levels = 64, -output_file = 'output', -case_data_dir = '../data/DEPHY-SCM/RICO/MESONH', -vert_coord_data_dir = '../data/vert_coord_data', lsm_ics = .false., do_spinup = .false., spinup_timesteps = 0, diff --git a/scm/etc/case_config/SANDU_FAST.nml b/scm/etc/case_config/SANDU_FAST.nml index 4afa44328..51aae1115 100644 --- a/scm/etc/case_config/SANDU_FAST.nml +++ b/scm/etc/case_config/SANDU_FAST.nml @@ -1,16 +1,6 @@ $case_config -model_name = 'FV3', -n_columns = 1, case_name = 'SANDU_FAST', input_type = 1 -dt = 600.0, -time_scheme = 1, -n_itt_out = 1, -n_itt_diag = 1, -n_levels = 64, -output_file = 'output', -case_data_dir = '../data/DEPHY-SCM/SANDU/FAST', -vert_coord_data_dir = '../data/vert_coord_data', lsm_ics = .false., do_spinup = .false., spinup_timesteps = 0, diff --git a/scm/etc/case_config/SANDU_REF.nml b/scm/etc/case_config/SANDU_REF.nml index 2a6221859..61c1a5e06 100644 --- a/scm/etc/case_config/SANDU_REF.nml +++ b/scm/etc/case_config/SANDU_REF.nml @@ -1,16 +1,6 @@ $case_config -model_name = 'FV3', -n_columns = 1, case_name = 'SANDU_REF', input_type = 1 -dt = 600.0, -time_scheme = 1, -n_itt_out = 1, -n_itt_diag = 1, -n_levels = 64, -output_file = 'output', -case_data_dir = '../data/DEPHY-SCM/SANDU/REF', -vert_coord_data_dir = '../data/vert_coord_data', lsm_ics = .false., do_spinup = .false., spinup_timesteps = 0, diff --git a/scm/etc/case_config/SANDU_SLOW.nml b/scm/etc/case_config/SANDU_SLOW.nml index 2ce008174..14de37c9b 100644 --- a/scm/etc/case_config/SANDU_SLOW.nml +++ b/scm/etc/case_config/SANDU_SLOW.nml @@ -1,16 +1,6 @@ $case_config -model_name = 'FV3', -n_columns = 1, case_name = 'SANDU_SLOW', input_type = 1 -dt = 600.0, -time_scheme = 1, -n_itt_out = 1, -n_itt_diag = 1, -n_levels = 64, -output_file = 'output', -case_data_dir = '../data/DEPHY-SCM/SANDU/SLOW', -vert_coord_data_dir = '../data/vert_coord_data', lsm_ics = .false., do_spinup = .false., spinup_timesteps = 0, diff --git a/scm/etc/case_config/SCMS_REF.nml b/scm/etc/case_config/SCMS_REF.nml index 5c3a3a99d..14ec8926d 100644 --- a/scm/etc/case_config/SCMS_REF.nml +++ b/scm/etc/case_config/SCMS_REF.nml @@ -1,16 +1,6 @@ $case_config -model_name = 'FV3', -n_columns = 1, case_name = 'SCMS_REF', input_type = 1 -dt = 600.0, -time_scheme = 1, -n_itt_out = 1, -n_itt_diag = 1, -n_levels = 64, -output_file = 'output', -case_data_dir = '../data/DEPHY-SCM/SCMS/REF', -vert_coord_data_dir = '../data/vert_coord_data', lsm_ics = .false., do_spinup = .false., spinup_timesteps = 0, diff --git a/scm/etc/case_config/arm_sgp_summer_1997_B.nml b/scm/etc/case_config/arm_sgp_summer_1997_B.nml index 348baa573..0ac151cc4 100644 --- a/scm/etc/case_config/arm_sgp_summer_1997_B.nml +++ b/scm/etc/case_config/arm_sgp_summer_1997_B.nml @@ -1,15 +1,6 @@ $case_config -model_name = 'FV3', -n_columns = 1, case_name = 'arm_sgp_summer_1997_B', -dt = 600.0, -time_scheme = 1, runtime = 432000, -n_itt_out = 1, -n_levels = 64, -output_file = 'output', -case_data_dir = '../data/processed_case_input', -vert_coord_data_dir = '../data/vert_coord_data', thermo_forcing_type = 1, mom_forcing_type = 3, relax_time = 7200.0, @@ -22,4 +13,4 @@ month = 7, day = 7, hour = 23, column_area = 2.0E9, -$end \ No newline at end of file +$end diff --git a/scm/etc/case_config/arm_sgp_summer_1997_C.nml b/scm/etc/case_config/arm_sgp_summer_1997_C.nml index 79b4e49ed..ace0b4dd2 100644 --- a/scm/etc/case_config/arm_sgp_summer_1997_C.nml +++ b/scm/etc/case_config/arm_sgp_summer_1997_C.nml @@ -1,15 +1,6 @@ $case_config -model_name = 'FV3', -n_columns = 1, case_name = 'arm_sgp_summer_1997_C', -dt = 600.0, -time_scheme = 1, runtime = 432000, -n_itt_out = 1, -n_levels = 64, -output_file = 'output', -case_data_dir = '../data/processed_case_input', -vert_coord_data_dir = '../data/vert_coord_data', thermo_forcing_type = 1, mom_forcing_type = 3, relax_time = 7200.0, @@ -22,4 +13,4 @@ month = 7, day = 12, hour = 23, column_area = 2.0E9, -$end \ No newline at end of file +$end diff --git a/scm/etc/case_config/arm_sgp_summer_1997_R.nml b/scm/etc/case_config/arm_sgp_summer_1997_R.nml index 9948335ad..c3da579ce 100644 --- a/scm/etc/case_config/arm_sgp_summer_1997_R.nml +++ b/scm/etc/case_config/arm_sgp_summer_1997_R.nml @@ -1,15 +1,6 @@ $case_config -model_name = 'FV3', -n_columns = 1, case_name = 'arm_sgp_summer_1997_R', -dt = 600.0, -time_scheme = 1, runtime = 345600, -n_itt_out = 1, -n_levels = 64, -output_file = 'output', -case_data_dir = '../data/processed_case_input', -vert_coord_data_dir = '../data/vert_coord_data', thermo_forcing_type = 1, mom_forcing_type = 3, relax_time = 7200.0, diff --git a/scm/etc/case_config/arm_sgp_summer_1997_S.nml b/scm/etc/case_config/arm_sgp_summer_1997_S.nml index f62b1ea24..ba26818be 100644 --- a/scm/etc/case_config/arm_sgp_summer_1997_S.nml +++ b/scm/etc/case_config/arm_sgp_summer_1997_S.nml @@ -1,15 +1,6 @@ $case_config -model_name = 'FV3', -n_columns = 1, case_name = 'arm_sgp_summer_1997_S', -dt = 600.0, -time_scheme = 1, runtime = 345600, -n_itt_out = 1, -n_levels = 64, -output_file = 'output', -case_data_dir = '../data/processed_case_input', -vert_coord_data_dir = '../data/vert_coord_data', thermo_forcing_type = 1, mom_forcing_type = 3, relax_time = 7200.0, @@ -22,4 +13,4 @@ month = 6, day = 22, hour = 23, column_area = 2.0E9, -$end \ No newline at end of file +$end diff --git a/scm/etc/case_config/arm_sgp_summer_1997_T.nml b/scm/etc/case_config/arm_sgp_summer_1997_T.nml index 203047539..d68aaa82a 100644 --- a/scm/etc/case_config/arm_sgp_summer_1997_T.nml +++ b/scm/etc/case_config/arm_sgp_summer_1997_T.nml @@ -1,15 +1,6 @@ $case_config -model_name = 'FV3', -n_columns = 1, case_name = 'arm_sgp_summer_1997_T', -dt = 600.0, -time_scheme = 1, runtime = 259200, -n_itt_out = 1, -n_levels = 64, -output_file = 'output', -case_data_dir = '../data/processed_case_input', -vert_coord_data_dir = '../data/vert_coord_data', thermo_forcing_type = 1, mom_forcing_type = 3, relax_time = 7200.0, @@ -22,4 +13,4 @@ month = 6, day = 30, hour = 23, column_area = 2.0E9, -$end \ No newline at end of file +$end diff --git a/scm/etc/case_config/arm_sgp_summer_1997_U.nml b/scm/etc/case_config/arm_sgp_summer_1997_U.nml index aabed0b2e..2d599f4f8 100644 --- a/scm/etc/case_config/arm_sgp_summer_1997_U.nml +++ b/scm/etc/case_config/arm_sgp_summer_1997_U.nml @@ -1,15 +1,6 @@ $case_config -model_name = 'FV3', -n_columns = 1, case_name = 'arm_sgp_summer_1997_U', -dt = 600.0, -time_scheme = 1, runtime = 345600, -n_itt_out = 1, -n_levels = 64, -output_file = 'output', -case_data_dir = '../data/processed_case_input', -vert_coord_data_dir = '../data/vert_coord_data', thermo_forcing_type = 1, mom_forcing_type = 3, relax_time = 7200.0, diff --git a/scm/etc/case_config/arm_sgp_summer_1997_X.nml b/scm/etc/case_config/arm_sgp_summer_1997_X.nml index 205f1a0e8..cc90d4b91 100644 --- a/scm/etc/case_config/arm_sgp_summer_1997_X.nml +++ b/scm/etc/case_config/arm_sgp_summer_1997_X.nml @@ -1,15 +1,6 @@ $case_config -model_name = 'FV3', -n_columns = 1, case_name = 'arm_sgp_summer_1997_X', -dt = 600.0, -time_scheme = 1, runtime = 2505600, -n_itt_out = 1, -n_levels = 64, -output_file = 'output', -case_data_dir = '../data/processed_case_input', -vert_coord_data_dir = '../data/vert_coord_data', thermo_forcing_type = 1, mom_forcing_type = 3, relax_time = 7200.0, diff --git a/scm/etc/case_config/astex.nml b/scm/etc/case_config/astex.nml index 028297625..3a9e99a3b 100644 --- a/scm/etc/case_config/astex.nml +++ b/scm/etc/case_config/astex.nml @@ -1,15 +1,6 @@ $case_config -model_name = 'FV3', -n_columns = 1, case_name = 'astex', -dt = 600.0, -time_scheme = 1, runtime = 144000, -n_itt_out = 1, -n_levels = 64, -output_file = 'output', -case_data_dir = '../data/processed_case_input', -vert_coord_data_dir = '../data/vert_coord_data', thermo_forcing_type = 2, mom_forcing_type = 2, relax_time = 7200.0, diff --git a/scm/etc/case_config/bomex.nml b/scm/etc/case_config/bomex.nml index c486ad6e6..093c31353 100644 --- a/scm/etc/case_config/bomex.nml +++ b/scm/etc/case_config/bomex.nml @@ -1,15 +1,6 @@ $case_config -model_name = 'FV3', -n_columns = 1, case_name = 'bomex', -dt = 600.0, -time_scheme = 1, runtime = 21600, -n_itt_out = 1, -n_levels = 64, -output_file = 'output', -case_data_dir = '../data/processed_case_input', -vert_coord_data_dir = '../data/vert_coord_data', thermo_forcing_type = 2, mom_forcing_type = 3, relax_time = 7200.0, diff --git a/scm/etc/case_config/default.nml b/scm/etc/case_config/default.nml index 27b5cfe49..49f433f56 100644 --- a/scm/etc/case_config/default.nml +++ b/scm/etc/case_config/default.nml @@ -1,15 +1,6 @@ $case_config -model_name = 'FV3', -n_columns = 1, case_name = 'twpice', -dt = 600.0, -time_scheme = 1, runtime = 2138400, -n_itt_out = 1, -n_levels = 64, -output_file = 'output', -case_data_dir = '../data/processed_case_input', -vert_coord_data_dir = '../data/vert_coord_data', thermo_forcing_type = 2, mom_forcing_type = 3, relax_time = 7200.0, diff --git a/scm/etc/case_config/fv3_model_point_noah.nml b/scm/etc/case_config/fv3_model_point_noah.nml index ca393f79f..b4761cc2f 100644 --- a/scm/etc/case_config/fv3_model_point_noah.nml +++ b/scm/etc/case_config/fv3_model_point_noah.nml @@ -1,15 +1,6 @@ $case_config -model_name = 'FV3', -n_columns = 1, case_name = 'fv3_model_point_noah', -dt = 900.0, -time_scheme = 1, runtime = 86400, -n_itt_out = 1, -n_levels = 64, -output_file = 'output', -case_data_dir = '../data/processed_case_input', -vert_coord_data_dir = '../data/vert_coord_data', thermo_forcing_type = 0, model_ics=.true., mom_forcing_type = 0, @@ -23,4 +14,3 @@ month = 10, day = 3, hour = 0, $end - diff --git a/scm/etc/case_config/gabls3.nml b/scm/etc/case_config/gabls3.nml index c57c7b59d..727b9eced 100644 --- a/scm/etc/case_config/gabls3.nml +++ b/scm/etc/case_config/gabls3.nml @@ -1,16 +1,6 @@ $case_config -model_name = 'FV3', -n_columns = 1, case_name = 'gabls3', -dt = 600.0, -time_scheme = 1, runtime = 86400, -n_itt_out = 1, -n_itt_diag = 6, -n_levels = 64, -output_file = 'output', -case_data_dir = '../data/processed_case_input', -vert_coord_data_dir = '../data/vert_coord_data', thermo_forcing_type = 2, mom_forcing_type = 2, relax_time = 7200.0, diff --git a/scm/etc/case_config/gabls3_noahmp.nml b/scm/etc/case_config/gabls3_noahmp.nml index 86efa2efd..5775d65f5 100644 --- a/scm/etc/case_config/gabls3_noahmp.nml +++ b/scm/etc/case_config/gabls3_noahmp.nml @@ -1,16 +1,6 @@ $case_config -model_name = 'FV3', -n_columns = 1, case_name = 'gabls3_noahmp', -dt = 600.0, -time_scheme = 1, runtime = 86400, -n_itt_out = 1 -n_itt_diag = 6 -n_levels = 64, -output_file = 'output', -case_data_dir = '../data/processed_case_input', -vert_coord_data_dir = '../data/vert_coord_data', thermo_forcing_type = 2, mom_forcing_type = 2, relax_time = 7200.0, diff --git a/scm/etc/case_config/gabls3_ruc.nml b/scm/etc/case_config/gabls3_ruc.nml index b3c0c1835..a13a4dcf0 100644 --- a/scm/etc/case_config/gabls3_ruc.nml +++ b/scm/etc/case_config/gabls3_ruc.nml @@ -1,16 +1,6 @@ $case_config -model_name = 'FV3', -n_columns = 1, case_name = 'gabls3_ruc', -dt = 600.0, -time_scheme = 1, runtime = 86400, -n_itt_out = 1, -n_itt_diag = 6, -n_levels = 64, -output_file = 'output', -case_data_dir = '../data/processed_case_input', -vert_coord_data_dir = '../data/vert_coord_data', thermo_forcing_type = 2, mom_forcing_type = 2, relax_time = 7200.0, diff --git a/scm/etc/case_config/twpice.nml b/scm/etc/case_config/twpice.nml index 35bf17559..23a5ceea0 100644 --- a/scm/etc/case_config/twpice.nml +++ b/scm/etc/case_config/twpice.nml @@ -1,16 +1,6 @@ $case_config -model_name = 'FV3', -n_columns = 1, case_name = 'twpice', -dt = 600.0, -time_scheme = 1, runtime = 2138400, -n_itt_out = 1, -n_itt_diag = 6, -n_levels = 64, -output_file = 'output', -case_data_dir = '../data/processed_case_input', -vert_coord_data_dir = '../data/vert_coord_data', thermo_forcing_type = 2, mom_forcing_type = 3, relax_time = 7200.0, @@ -23,4 +13,4 @@ month = 1, day = 19, hour = 3, column_area = 2.0E9, -$end \ No newline at end of file +$end diff --git a/scm/src/multi_run_scm.py b/scm/src/multi_run_scm.py index 878a07512..59df6921d 100755 --- a/scm/src/multi_run_scm.py +++ b/scm/src/multi_run_scm.py @@ -6,13 +6,17 @@ import os import logging import subprocess -from supported_suites import suites +from suite_info import suite, suite_list from supported_cases import cases import timeit, functools # Name of the python runscript executable to run, including path (relative to run dir) RUN_SCRIPT = './run_scm.py' +# which suites in suite_info to use when running through suites +SUITE_CHOICE = 'supported' +#SUITE_CHOIE = 'all' + # number of realizations to time if timer is used timer_iterations = 1 @@ -29,10 +33,15 @@ parser.add_argument('-t', '--timer', help='set to time each subprocess', action='store_true', default=False) parser.add_argument('-d', '--docker', help='include if scm is being run in a docker container to mount volumes', action='store_true', default=False) parser.add_argument('--runtime', help='set the runtime in the namelists', action='store', required=False) +parser.add_argument('--runtime_mult', help='multiply the existing runtime in the namelist by some factor', action='store', required=False) parser.add_argument('-l', '--levels', help='number of vertical levels', required=False) parser.add_argument('--npz_type', help='type of FV3 vertical grid to produce (see scm_vgrid.F90 for valid values)', required=False) +parser.add_argument('--run_dir', help='path for the run directory', required=False) parser.add_argument('--vert_coord_file', help='filename with coefficients to produce a vertical grid', required=False) parser.add_argument('--case_data_dir', help='directory containing the case input data netCDF file', required=False) +parser.add_argument('--n_itt_out', help='period of instantaneous output (number of timesteps)', required=False, type=int) +parser.add_argument('--n_itt_diag', help='period of diagnostic output (number of timesteps)', required=False, type=int) +parser.add_argument('-dt', '--timestep', help='timestep (s)', required=False, type=float) # Results are recorded in this global list (to avoid complications with getting return values from the partial functions used below) RESULTS = [] @@ -111,21 +120,45 @@ def main(): passthrough_args += ' -d' if args.runtime: passthrough_args += ' --runtime ' + args.runtime + if args.runtime_mult: + passthrough_args += ' --runtime_mult ' + args.runtime_mult + if args.run_dir: + passthrough_args += ' --run_dir ' + args.run_dir + if args.n_itt_out: + passthrough_args += ' --n_itt_out ' + args.n_itt_out + if args.n_itt_diag: + passthrough_args += ' --n_itt_diag ' + args.n_itt_diag + if args.timestep: + passthrough_args += ' -dt ' + args.timestep # if the case argument is specified, run through all supported suites with the specified case - if args.case: - logging.info('Running all supported suites with case {0} and passthrough args: {1}'.format(args.case, passthrough_args)) - for i, suite in enumerate(suites,1): - command = RUN_SCRIPT + ' -c ' + args.case + ' -s ' + suite + passthrough_args - logging.info('Executing process {0} of {1} ({2})'.format(i, len(suites), command)) - elapsed_time = spawn_subprocess(command, args.timer) - if args.timer: - logging.info('elapsed time: {0} s for case: {1} suite: {2}'\ - .format(elapsed_time/timer_iterations, args.case, suite)) + if args.case: + n_suites = 0 + if SUITE_CHOICE == 'supported': + logging.info('Running all supported suites in suite_info list with case {0}'.format(args.case)) + for s in suite_list: + if s._supported: + n_suites += 1 + else: + logging.info('Running all suites in suite_info list with case {0}'.format(args.case)) + n_suites = len(suite_list) + + if passthrough_args != '': + logging.info('Using passthrough args: {}'.format(passthrough_args)) + for i, s in enumerate(suite_list,1): + if SUITE_CHOICE == 'all' or (SUITE_CHOICE == 'supported' and s._supported): + command = RUN_SCRIPT + ' -c ' + args.case + ' -s ' + s._name + passthrough_args + logging.info('Executing process {0} of {1} ({2})'.format(i, n_suites, command)) + elapsed_time = spawn_subprocess(command, args.timer) + if args.timer: + logging.info('elapsed time: {0} s for case: {1} suite: {2}'\ + .format(elapsed_time/timer_iterations, args.case, s._name)) # if the suite argument is specified, run through all supported cases with the specified suite if args.suite: - logging.info('Running all supported cases with suite {0} and passthrough args: {1}'.format(args.suite, passthrough_args)) + logging.info('Running all supported cases with suite {0}'.format(args.suite)) + if passthrough_args != '': + logging.info('Using passthrough args: {}'.format(passthrough_args)) for i, case in enumerate(cases,1): command = RUN_SCRIPT + ' -c ' + case + ' -s ' + args.suite + passthrough_args logging.info('Executing process {0} of {1} ({2})'.format(i, len(cases), command)) @@ -169,7 +202,9 @@ def main(): if scm_runs.cases and not scm_runs.suites and not scm_runs.namelists: logging.info( - 'Only cases were specified in {0}, so running all cases with the default suite and passthrough args: {1}'.format(args.file, passthrough_args)) + 'Only cases were specified in {0}, so running all cases with the default suite'.format(args.file)) + if passthrough_args != '': + logging.info('Using passthrough args: {}'.format(passthrough_args)) for i, case in enumerate(scm_runs.cases,1): command = RUN_SCRIPT + ' -c ' + case + passthrough_args logging.info('Executing process {0} of {1} ({2})'.format(i, len(scm_runs.cases), command)) @@ -182,7 +217,9 @@ def main(): if scm_runs.namelists: if len(scm_runs.suites) == 1: logging.info('Cases and namelists were specified with 1 suite in {0}, so running all cases with '\ - 'the suite {1} for all specified namelists and passthrough args: {2}'.format(args.file, scm_runs.suites[0], passthrough_args)) + 'the suite {1} for all specified namelists'.format(args.file, scm_runs.suites[0])) + if passthrough_args != '': + logging.info('Using passthrough args: {}'.format(passthrough_args)) for i, case in enumerate(scm_runs.cases): for j, namelist in enumerate(scm_runs.namelists,1): command = RUN_SCRIPT + ' -c ' + case + ' -s ' + scm_runs.suites[0] + ' -n ' + namelist + passthrough_args @@ -194,7 +231,9 @@ def main(): .format(elapsed_time/timer_iterations, case, scm_runs.suites[0])) elif len(scm_runs.suites) == len(scm_runs.namelists): logging.info('Cases, suites, and namelists were specified in {0}, so running all cases with all '\ - 'suites, matched with namelists by order and passthrough args: {1}'.format(args.file, passthrough_args)) + 'suites, matched with namelists by order'.format(args.file)) + if passthrough_args != '': + logging.info('Using passthrough args: {}'.format(passthrough_args)) for i, case in enumerate(scm_runs.cases): for j, suite in enumerate(scm_runs.suites,1): command = RUN_SCRIPT + ' -c ' + case + ' -s ' + suite + ' -n ' + scm_runs.namelists[j-1] + passthrough_args @@ -212,7 +251,9 @@ def main(): raise Exception(message) else: logging.info('Cases and suites specified in {0}, so running all cases with all suites using default '\ - 'namelists for each suite and passthrough args: {1}'.format(args.file, passthrough_args)) + 'namelists for each suite'.format(args.file)) + if passthrough_args != '': + logging.info('Using passthrough args: {}'.format(passthrough_args)) for i, case in enumerate(scm_runs.cases): for j, suite in enumerate(scm_runs.suites,1): command = RUN_SCRIPT + ' -c ' + case + ' -s ' + suite + passthrough_args @@ -225,7 +266,9 @@ def main(): if scm_runs.cases and not scm_runs.suites and scm_runs.namelists: logging.info('Cases and namelists were specified in {0}, so running all cases with the default suite '\ - 'using the list of namelists and passthrough args: {1}'.format(args.file, passthrough_args)) + 'using the list of namelists'.format(args.file)) + if passthrough_args != '': + logging.info('Using passthrough args: {}'.format(passthrough_args)) for i, case in enumerate(scm_runs.cases): for j, namelist in enumerate(scm_runs.namelists,1): command = RUN_SCRIPT + ' -c ' + case + ' -n ' + namelist + passthrough_args @@ -238,17 +281,30 @@ def main(): # If running the script with no arguments, run all supported (case,suite) permutations. if not args.case and not args.suite and not args.file: - logging.info('Since no arguments were specified, running through all permuatations of supported cases and '\ - 'suites with passthrough args: {0}').format(passthrough_args) + n_suites = 0 + if SUITE_CHOICE == 'supported': + logging.info('Since no arguments were specified, running through all permuatations of supported cases and '\ + 'supported suites in suite_info.') + if passthrough_args != '': + logging.info('Using passthrough args: {}'.format(passthrough_args)) + for s in suite_list: + if s._supported: + n_suites += 1 + else: + logging.info('Since no arguments were specified, running through all permuatations of supported cases and '\ + 'all suites in suite_info') + n_suites = len(suite_list) + for i, case in enumerate(cases): - for j, suite in enumerate(suites,1): - command = RUN_SCRIPT + ' -c ' + case + ' -s ' + suite + passthrough_args - logging.info('Executing process {0} of {1} ({2})'.format( - len(suites)*i+j, len(cases)*len(suites), command)) - elapsed_time = spawn_subprocess(command, args.timer) - if args.timer: - logging.info('elapsed time: {0} s for case: {1} suite: {2}'\ - .format(elapsed_time/timer_iterations, case, suite)) + for j, s in enumerate(suite_list,1): + if SUITE_CHOICE == 'all' or (SUITE_CHOICE == 'supported' and s._supported): + command = RUN_SCRIPT + ' -c ' + case + ' -s ' + s._name + passthrough_args + logging.info('Executing process {0} of {1} ({2})'.format( + n_suites*i+j, len(cases)*n_suites, command)) + elapsed_time = spawn_subprocess(command, args.timer) + if args.timer: + logging.info('elapsed time: {0} s for case: {1} suite: {2}'\ + .format(elapsed_time/timer_iterations, case, s._name)) # Generate report at the end of the log file when verbose flag is set if args.verbose > 0: diff --git a/scm/src/run_scm.py b/scm/src/run_scm.py index b7025b07e..611be8b3b 100755 --- a/scm/src/run_scm.py +++ b/scm/src/run_scm.py @@ -30,9 +30,12 @@ # Path to default bin directory (relative to scm_root) DEFAULT_BIN_DIR = 'scm/bin' -# Default +# Copy executable to run directory if true (otherwise it will be linked) +COPY_EXECUTABLE = False + +# Default output periods DEFAULT_OUTPUT_PERIOD = 1 -DEFAULT_DIAG_PERIOD = 1 +DEFAULT_DIAG_PERIOD = 6 # Path to the directory containing experiment namelists (relative to scm_root) CASE_NAMELIST_DIR = 'scm/etc/case_config' @@ -102,6 +105,7 @@ parser.add_argument('-n', '--namelist', help='physics namelist to use') parser.add_argument('-t', '--tracers', help='tracer configuration to use') parser.add_argument('--runtime', help='set the runtime in the namelists', action='store', type=int, required=False) +parser.add_argument('--runtime_mult', help='multiply the existing runtime in the namelist by some factor', action='store', type=float, required=False) parser.add_argument('-d', '--docker', help='include if scm is being run in a docker container to mount volumes', action='store_true', default=False) parser.add_argument('-l', '--levels', help='number of vertical levels', required=False, type=int) parser.add_argument('--npz_type', help='type of FV3 vertical grid to produce (see scm_vgrid.F90 for valid values)', required=False) @@ -150,6 +154,7 @@ def parse_arguments(): docker = args.docker tracers = args.tracers runtime = args.runtime + runtime_mult = args.runtime_mult levels = args.levels npz_type = args.npz_type vert_coord_file = args.vert_coord_file @@ -159,7 +164,7 @@ def parse_arguments(): run_dir = args.run_dir timestep = args.timestep - return (case, gdb, suite, namelist, docker, tracers, runtime, levels, npz_type, vert_coord_file, case_data_dir, n_itt_out, n_itt_diag, run_dir, timestep) + return (case, gdb, suite, namelist, docker, tracers, runtime, runtime_mult, levels, npz_type, vert_coord_file, case_data_dir, n_itt_out, n_itt_diag, run_dir, timestep) def find_gdb(): """Detect gdb, abort if not found""" @@ -176,7 +181,7 @@ def find_gdb(): class Experiment(object): - def __init__(self, case, suite, runtime, levels, npz_type, vert_coord_file, case_data_dir, n_itt_out, n_itt_diag): + def __init__(self, case, suite, runtime, runtime_mult, levels, npz_type, vert_coord_file, case_data_dir, n_itt_out, n_itt_diag): """Initialize experiment. This routine does most of the work, including setting and checking the experiment configuration (namelist).""" @@ -218,6 +223,11 @@ def __init__(self, case, suite, runtime, levels, npz_type, vert_coord_file, case message = 'Namelist runtime adjustment {0} IS NOT applied'.format(self._runtime) logging.info(message) + if runtime_mult: + self._runtime_mult = runtime_mult + message = 'Existing case namelist runtime multipled by {0}'.format(self._runtime_mult) + logging.info(message) + if levels: self._levels = levels message = 'The number of vertical levels is set to {0}'.format(self._levels) @@ -405,6 +415,12 @@ def setup_rundir(self): # If running the regression test, reduce the runtime if self._runtime: case_nml['case_config']['runtime'] = self._runtime + if self._runtime_mult: + try: + old_runtime = case_nml['case_config']['runtime'] + case_nml['case_config']['runtime'] = old_runtime*self._runtime_mult + except KeyError: + logging.info('The runtime multiplier argument was set, but the runtime is not set in {0} '.format(self._namelist)) # If the number of levels is specified, set the namelist value if self._levels: case_nml['case_config']['n_levels'] = self._levels @@ -644,10 +660,15 @@ def setup_rundir(self): cmd = 'cp {0} {1}'.format(os.path.join(SCM_RUN, STANDARD_EXPERIMENT_NAMELIST), os.path.join(SCM_RUN, output_dir,self._name + '.nml')) execute(cmd) - # Copy executable to run dir (does copying the executable give any performance gains on, say, HPC where build dir is in home and run dir on scratch/glade?) - logging.info('Copying executable to run directory') - cmd = 'cp {0} {1}'.format(os.path.join(SCM_ROOT, SCM_BIN, EXECUTABLE_NAME), os.path.join(SCM_RUN, EXECUTABLE_NAME)) - execute(cmd) + # Move executable to run dir + if COPY_EXECUTABLE: + logging.info('Copying executable to run directory') + cmd = 'cp {0} {1}'.format(os.path.join(SCM_ROOT, SCM_BIN, EXECUTABLE_NAME), os.path.join(SCM_RUN, EXECUTABLE_NAME)) + execute(cmd) + else: + logging.info('Linking executable to run directory') + cmd = 'ln -s {0} {1}'.format(os.path.join(SCM_ROOT, SCM_BIN, EXECUTABLE_NAME), os.path.join(SCM_RUN, EXECUTABLE_NAME)) + execute(cmd) return output_dir @@ -672,7 +693,7 @@ def copy_outdir(exp_dir): shutil.copytree(exp_dir, home_output_dir) def main(): - (case, use_gdb, suite_name, namelist, docker, tracers, runtime, levels, npz_type, vert_coord_file, case_data_dir, n_itt_out, n_itt_diag, run_dir, timestep) = parse_arguments() + (case, use_gdb, suite_name, namelist, docker, tracers, runtime, runtime_mult, levels, npz_type, vert_coord_file, case_data_dir, n_itt_out, n_itt_diag, run_dir, timestep) = parse_arguments() global SCM_ROOT SCM_ROOT = os.getenv('SCM_ROOT') @@ -733,7 +754,7 @@ def main(): if timestep: active_suite.timestep = timestep - exp = Experiment(case, active_suite, runtime, levels, npz_type, vert_coord_file, case_data_dir, n_itt_out, n_itt_diag) + exp = Experiment(case, active_suite, runtime, runtime_mult, levels, npz_type, vert_coord_file, case_data_dir, n_itt_out, n_itt_diag) exp_dir = exp.setup_rundir() # Debugger if use_gdb: diff --git a/test/rt.sh b/test/rt.sh index 94a8798be..b9d976015 100755 --- a/test/rt.sh +++ b/test/rt.sh @@ -229,9 +229,9 @@ for compiler in "${compilers[@]}"; do BUILD_OUTPUT=${BIN_DIR}/build.out if [ "${build_type}" == "Debug" ] ; then # Add --runtime ${runtime} to multi_run_scm.py to reduce runtime for tests - test_run_cmd="${RUN_DIR}/multi_run_scm.py -f ${TEST_DIR}/rt_test_cases.py -v --runtime 86400" # 1 day + test_run_cmd="${BIN_DIR}/multi_run_scm.py -f ${TEST_DIR}/rt_test_cases.py -v --runtime_mult 0.1 --run_dir ${RUN_DIR}" else - test_run_cmd="${RUN_DIR}/multi_run_scm.py -f ${TEST_DIR}/rt_test_cases.py -v --timer --runtime 259200" # 3 days + test_run_cmd="${BIN_DIR}/multi_run_scm.py -f ${TEST_DIR}/rt_test_cases.py -v --timer --runtime_mult 0.1 --run_dir ${RUN_DIR}" fi . ${ETC_DIR}/${machine}_setup_${compiler}.sh @@ -261,8 +261,8 @@ for compiler in "${compilers[@]}"; do if [ -d "${RUN_DIR}" ] ; then rm -rf ${RUN_DIR}; fi mkdir ${RUN_DIR} cd ${RUN_DIR} - ln -s ${BIN_DIR}/${executable_name} ${executable_name} - ln -s ${SRC_DIR}/multi_run_scm.py multi_run_scm.py + #ln -s ${BIN_DIR}/${executable_name} ${executable_name} + #ln -s ${SRC_DIR}/multi_run_scm.py multi_run_scm.py ln -s ${SRC_DIR}/run_scm.py run_scm.py job_name=${job_prefix}_${compiler}_${build_type_lc} if ${use_batch_system} ; then From 6fb6675599d03c1d28faf507fd2ec10814ea4231 Mon Sep 17 00:00:00 2001 From: Grant Firl Date: Wed, 9 Mar 2022 17:55:58 -0700 Subject: [PATCH 5/8] update machine setup script to set the SCM_ROOT environment variable for use in the run script --- scm/etc/CENTOS_docker_setup.sh | 2 ++ scm/etc/Cheyenne_setup_gnu.csh | 2 ++ scm/etc/Cheyenne_setup_gnu.sh | 2 ++ scm/etc/Cheyenne_setup_intel.csh | 2 ++ scm/etc/Cheyenne_setup_intel.sh | 3 ++- scm/etc/Desktop_setup_gfortran.csh | 2 ++ scm/etc/Desktop_setup_gfortran.sh | 2 ++ scm/etc/Hera_setup_intel.csh | 2 ++ scm/etc/Hera_setup_intel.sh | 2 ++ 9 files changed, 18 insertions(+), 1 deletion(-) diff --git a/scm/etc/CENTOS_docker_setup.sh b/scm/etc/CENTOS_docker_setup.sh index 27e821d28..1a519050b 100755 --- a/scm/etc/CENTOS_docker_setup.sh +++ b/scm/etc/CENTOS_docker_setup.sh @@ -2,6 +2,8 @@ echo "Setting environment variables for SCM-CCPP on CENTOS with gcc/gfortran" +export SCM_ROOT=$PWD + export CC=/opt/rh/devtoolset-9/root/usr/bin/gcc export CXX=/opt/rh/devtoolset-9/root/usr/bin/g++ export F77=/opt/rh/devtoolset-9/root/usr/bin/gfortran diff --git a/scm/etc/Cheyenne_setup_gnu.csh b/scm/etc/Cheyenne_setup_gnu.csh index e08b58203..013709868 100755 --- a/scm/etc/Cheyenne_setup_gnu.csh +++ b/scm/etc/Cheyenne_setup_gnu.csh @@ -2,6 +2,8 @@ echo "Setting environment variables for CCPP-SCM on Cheyenne with gcc/gfortran" +setenv SCM_ROOT $PWD + #start with a "clean" environment; activate and deactivate ncar_pylib in order to successfully deactivate previously activated environment without errors module load ncarenv/1.3 ncar_pylib diff --git a/scm/etc/Cheyenne_setup_gnu.sh b/scm/etc/Cheyenne_setup_gnu.sh index d06c11e33..09fc32c44 100755 --- a/scm/etc/Cheyenne_setup_gnu.sh +++ b/scm/etc/Cheyenne_setup_gnu.sh @@ -2,6 +2,8 @@ echo "Setting environment variables for CCPP-SCM on Cheyenne with gcc/gfortran" +export SCM_ROOT=$PWD + #start with a "clean" environment; activate and deactivate ncar_pylib in order to successfully deactivate previously activated environment without errors module load ncarenv/1.3 ncar_pylib diff --git a/scm/etc/Cheyenne_setup_intel.csh b/scm/etc/Cheyenne_setup_intel.csh index a1a015b40..9254e0c4e 100755 --- a/scm/etc/Cheyenne_setup_intel.csh +++ b/scm/etc/Cheyenne_setup_intel.csh @@ -2,6 +2,8 @@ echo "Setting environment variables for CCPP-SCM on Cheyenne with icc/ifort" +setenv SCM_ROOT $PWD + #start with a "clean" environment; activate and deactivate ncar_pylib in order to successfully deactivate previously activated environment without errors module load ncarenv/1.3 ncar_pylib diff --git a/scm/etc/Cheyenne_setup_intel.sh b/scm/etc/Cheyenne_setup_intel.sh index b2dbbba04..c29d3e4fc 100755 --- a/scm/etc/Cheyenne_setup_intel.sh +++ b/scm/etc/Cheyenne_setup_intel.sh @@ -2,6 +2,8 @@ echo "Setting environment variables for CCPP-SCM on Cheyenne with icc/ifort" +export SCM_ROOT=$PWD + #start with a "clean" environment; activate and deactivate ncar_pylib in order to successfully deactivate previously activated environment without errors module load ncarenv/1.3 ncar_pylib @@ -53,4 +55,3 @@ if [ $? -ne 0 ]; then else echo "f90nml is installed" fi - diff --git a/scm/etc/Desktop_setup_gfortran.csh b/scm/etc/Desktop_setup_gfortran.csh index aa6839107..9d39d0d28 100755 --- a/scm/etc/Desktop_setup_gfortran.csh +++ b/scm/etc/Desktop_setup_gfortran.csh @@ -2,6 +2,8 @@ echo "Setting environment variables for CCPP-SCM on Desktop (MacOS) with gcc/gfortran" +setenv SCM_ROOT $PWD + echo "Setting CC/CXX/FC environment variables" setenv CC /opt/local/bin/gcc-mp-10 setenv CXX /opt/local/bin/g++-mp-10 diff --git a/scm/etc/Desktop_setup_gfortran.sh b/scm/etc/Desktop_setup_gfortran.sh index ccb4db42c..b178772fd 100755 --- a/scm/etc/Desktop_setup_gfortran.sh +++ b/scm/etc/Desktop_setup_gfortran.sh @@ -2,6 +2,8 @@ echo "Setting environment variables for CCPP-SCM on Desktop (MacOS) with gcc/gfortran" +export SCM_ROOT=$PWD + echo "Setting CC/CXX/FC environment variables" export CC=/opt/local/bin/gcc-mp-10 export CXX=/opt/local/bin/g++-mp-10 diff --git a/scm/etc/Hera_setup_intel.csh b/scm/etc/Hera_setup_intel.csh index 2c32de8ba..fa2276619 100755 --- a/scm/etc/Hera_setup_intel.csh +++ b/scm/etc/Hera_setup_intel.csh @@ -2,6 +2,8 @@ echo "Setting environment variables for CCPP-SCM on Hera with icc/ifort" +setenv SCM_ROOT $PWD + #load the modules in order to compile the CCPP SCM echo "Loading intel and netcdf modules..." module purge diff --git a/scm/etc/Hera_setup_intel.sh b/scm/etc/Hera_setup_intel.sh index 57560b50e..49ac72346 100755 --- a/scm/etc/Hera_setup_intel.sh +++ b/scm/etc/Hera_setup_intel.sh @@ -2,6 +2,8 @@ echo "Setting environment variables for CCPP-SCM on Hera with icc/ifort" +export SCM_ROOT=$PWD + #load the modules in order to compile the CCPP SCM echo "Loading intel and netcdf modules..." module purge From ebdd79f9edc97a288dfe7a8c7ab58176451e2726 Mon Sep 17 00:00:00 2001 From: Grant Firl Date: Wed, 9 Mar 2022 18:13:45 -0700 Subject: [PATCH 6/8] fix bug in run_scm.py --- scm/src/run_scm.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/scm/src/run_scm.py b/scm/src/run_scm.py index 611be8b3b..7e9b3c569 100755 --- a/scm/src/run_scm.py +++ b/scm/src/run_scm.py @@ -227,6 +227,8 @@ def __init__(self, case, suite, runtime, runtime_mult, levels, npz_type, vert_co self._runtime_mult = runtime_mult message = 'Existing case namelist runtime multipled by {0}'.format(self._runtime_mult) logging.info(message) + else: + self._runtime_mult = None if levels: self._levels = levels @@ -283,6 +285,8 @@ def __init__(self, case, suite, runtime, runtime_mult, levels, npz_type, vert_co if suite.timestep is not None: self._timestep = suite.timestep + else: + self._timestep = None @property def name(self): From f7bc8347c06def26759103a30ca423c50ddc571d Mon Sep 17 00:00:00 2001 From: Grant Firl Date: Thu, 31 Mar 2022 15:25:28 -0400 Subject: [PATCH 7/8] address reviewer comments --- scm/src/run_scm.py | 22 +++++++------ scm/src/suite_info.py | 75 ++++++++++++++++++------------------------- test/rt.sh | 2 -- 3 files changed, 45 insertions(+), 54 deletions(-) diff --git a/scm/src/run_scm.py b/scm/src/run_scm.py index 7e9b3c569..6e67ca056 100755 --- a/scm/src/run_scm.py +++ b/scm/src/run_scm.py @@ -225,7 +225,7 @@ def __init__(self, case, suite, runtime, runtime_mult, levels, npz_type, vert_co if runtime_mult: self._runtime_mult = runtime_mult - message = 'Existing case namelist runtime multipled by {0}'.format(self._runtime_mult) + message = 'Existing case namelist runtime multiplied by {0}'.format(self._runtime_mult) logging.info(message) else: self._runtime_mult = None @@ -418,8 +418,12 @@ def setup_rundir(self): case_nml = f90nml.read(self._namelist) # If running the regression test, reduce the runtime if self._runtime: - case_nml['case_config']['runtime'] = self._runtime + case_nml['case_config']['runtime'] = self._runtime if self._runtime_mult: + if self._runtime_mult < 0.0: + message = 'The --runtime_mult argument must be greater than 0 ({0} was entered)'.format(self._runtime_mult) + logging.critical(message) + raise Exception(message) try: old_runtime = case_nml['case_config']['runtime'] case_nml['case_config']['runtime'] = old_runtime*self._runtime_mult @@ -427,18 +431,18 @@ def setup_rundir(self): logging.info('The runtime multiplier argument was set, but the runtime is not set in {0} '.format(self._namelist)) # If the number of levels is specified, set the namelist value if self._levels: - case_nml['case_config']['n_levels'] = self._levels + case_nml['case_config']['n_levels'] = self._levels # If the npz_type is specified, set the namelist value if self._npz_type: - case_nml['case_config']['npz_type'] = self._npz_type + case_nml['case_config']['npz_type'] = self._npz_type if self._vert_coord_file: - case_nml['case_config']['vert_coord_file'] = self._vert_coord_file + case_nml['case_config']['vert_coord_file'] = self._vert_coord_file if self._n_itt_out: - case_nml['case_config']['n_itt_out'] = self._n_itt_out + case_nml['case_config']['n_itt_out'] = self._n_itt_out if self._n_itt_diag: - case_nml['case_config']['n_itt_diag'] = self._n_itt_diag + case_nml['case_config']['n_itt_diag'] = self._n_itt_diag if self._timestep: - case_nml['case_config']['dt'] = self._timestep + case_nml['case_config']['dt'] = self._timestep # look for the output_dir variable in the case configuration namelist and use it if it does; # if it doesn't exist, create a default output directory name (from the case and suite names) and create a namelist patch try: @@ -503,7 +507,7 @@ def setup_rundir(self): if os.path.isfile(os.path.join(SCM_RUN, self._physics_namelist)): os.remove(os.path.join(SCM_RUN,self._physics_namelist)) if not os.path.isfile(os.path.join(SCM_ROOT, PHYSICS_NAMELIST_DIR, self._physics_namelist)): - message = 'Physics namelist {0} not found in directory {1}'.format(SCM_ROOT, self._physics_namelist, PHYSICS_NAMELIST_DIR) + message = 'Physics namelist {0} not found in directory {1}'.format(os.path.join(SCM_ROOT, self._physics_namelist), PHYSICS_NAMELIST_DIR) logging.critical(message) raise Exception(message) cmd = "ln -sf {0} {1}".format(os.path.join(SCM_ROOT, PHYSICS_NAMELIST_DIR, self._physics_namelist), os.path.join(SCM_RUN, self._physics_namelist)) diff --git a/scm/src/suite_info.py b/scm/src/suite_info.py index ba2f690d4..4ab44f7d6 100755 --- a/scm/src/suite_info.py +++ b/scm/src/suite_info.py @@ -1,41 +1,41 @@ class suite(object): - DEFAULT_MAX_TIMESTEP = 1800.0 + DEFAULT_MAX_TIMESTEP = 1800.0 - def __init__(self, name, tracers, namelist, timestep, max_timestep, supported): - self._name = name #should remain unchanged after init - self._default_tracers = tracers #should remain unchanged after init - self._default_namelist = namelist #should remain unchanged after init - self.tracers = self._default_tracers #can be modified after init - self.namelist = self._default_namelist #can be modified after init - self._supported = supported + def __init__(self, name, tracers, namelist, timestep, max_timestep, supported): + self._name = name #should remain unchanged after init + self._default_tracers = tracers #should remain unchanged after init + self._default_namelist = namelist #should remain unchanged after init + self.tracers = self._default_tracers #can be modified after init + self.namelist = self._default_namelist #can be modified after init + self._supported = supported - if max_timestep > 0: - self._max_timestep = max_timestep #should remain unchanged after init - else: - self._max_timestep = DEFAULT_MAX_TIMESTEP - if timestep <= self._max_timestep and timestep > 0: - self._default_timestep = timestep #should remain unchanged after init - self.timestep = self._default_timestep #can be modified after init - elif timestep <= 0: - self.timestep = None #use the default dt in the SCM code - else: - message = 'The timestep for suite {0} cannot be set greater than the max_timestep of {1}'.format(self._name, self._max_timestep) - raise Exception(message) + if max_timestep > 0: + self._max_timestep = max_timestep #should remain unchanged after init + else: + self._max_timestep = DEFAULT_MAX_TIMESTEP + if timestep <= self._max_timestep and timestep > 0: + self._default_timestep = timestep #should remain unchanged after init + self.timestep = self._default_timestep #can be modified after init + elif timestep <= 0: + self.timestep = None #use the default dt in the SCM code + else: + message = 'The timestep for suite {0} cannot be set greater than the max_timestep of {1}'.format(self._name, self._max_timestep) + raise Exception(message) - @property - def timestep(self): - """Get the timestep for the given suite.""" - return self.timestep + @property + def timestep(self): + """Get the timestep for the given suite.""" + return self.timestep - @timestep.setter - def timestep(self, value): - """Set the timestep for the given suite.""" - if value <= self._max_timestep: - self.timestep = value - else: - message = 'The timestep for suite {0} cannot be set greater than the max_timestep of {1}'.format(self._name, self._max_timestep) - raise Exception(message) + @timestep.setter + def timestep(self, value): + """Set the timestep for the given suite.""" + if value <= self._max_timestep: + self.timestep = value + else: + message = 'The timestep for suite {0} cannot be set greater than the max_timestep of {1}'.format(self._name, self._max_timestep) + raise Exception(message) suite_list = [] suite_list.append(suite('SCM_GFS_v15p2', 'tracers_GFS_v15p2.txt', 'input_GFS_v15p2.nml', 600.0, 1800.0, True )) @@ -57,17 +57,6 @@ def timestep(self, value): suite_list.append(suite('HAFS_v0_hwrf_thompson', 'tracers_HAFS_v0_hwrf_thompson.txt', 'input_HAFS_v0_hwrf_thompson.nml', 600.0, 600.0 , False)) suite_list.append(suite('SCM_GSD_v1nssl', 'tracers_gsd_nssl.txt', 'input_GSD_v1nssl.nml', 600.0, 600.0 , False)) suite_list.append(suite('SCM_RRFS_v1nssl', 'tracers_RRFS_v1nssl_nohail_noccn.txt', 'input_RRFS_v1nssl_nohailnoccn.nml', 600.0, 600.0 , False)) - - # run_scm.py changes - # add default n_itt_output, n_itt_diag - # import list of suites - # check if suite_name argument is found in list of suites - # if so use it and modify attributes by incoming args - # if not, create new (if has tracers, namelist to go with) - # - # run dir? - # root dir to create new experiment run dirs (like rt.sh) - # separate build, run, output dirs? diff --git a/test/rt.sh b/test/rt.sh index b9d976015..a8189c590 100755 --- a/test/rt.sh +++ b/test/rt.sh @@ -261,8 +261,6 @@ for compiler in "${compilers[@]}"; do if [ -d "${RUN_DIR}" ] ; then rm -rf ${RUN_DIR}; fi mkdir ${RUN_DIR} cd ${RUN_DIR} - #ln -s ${BIN_DIR}/${executable_name} ${executable_name} - #ln -s ${SRC_DIR}/multi_run_scm.py multi_run_scm.py ln -s ${SRC_DIR}/run_scm.py run_scm.py job_name=${job_prefix}_${compiler}_${build_type_lc} if ${use_batch_system} ; then From 3e5acf59926e174a943f9f6b25f80990d42c1a96 Mon Sep 17 00:00:00 2001 From: Grant Firl Date: Mon, 11 Apr 2022 10:35:16 -0400 Subject: [PATCH 8/8] fix tab error introduced in last commit in suite_info.py --- scm/src/suite_info.py | 39 ++++++++++++++++++++------------------- 1 file changed, 20 insertions(+), 19 deletions(-) diff --git a/scm/src/suite_info.py b/scm/src/suite_info.py index 4ab44f7d6..0fdb48a49 100755 --- a/scm/src/suite_info.py +++ b/scm/src/suite_info.py @@ -14,29 +14,30 @@ def __init__(self, name, tracers, namelist, timestep, max_timestep, supported): self._max_timestep = max_timestep #should remain unchanged after init else: self._max_timestep = DEFAULT_MAX_TIMESTEP - if timestep <= self._max_timestep and timestep > 0: - self._default_timestep = timestep #should remain unchanged after init - self.timestep = self._default_timestep #can be modified after init - elif timestep <= 0: - self.timestep = None #use the default dt in the SCM code - else: - message = 'The timestep for suite {0} cannot be set greater than the max_timestep of {1}'.format(self._name, self._max_timestep) - raise Exception(message) - - @property - def timestep(self): - """Get the timestep for the given suite.""" - return self.timestep - - @timestep.setter - def timestep(self, value): - """Set the timestep for the given suite.""" - if value <= self._max_timestep: - self.timestep = value + + if timestep <= self._max_timestep and timestep > 0: + self._default_timestep = timestep #should remain unchanged after init + self.timestep = self._default_timestep #can be modified after init + elif timestep <= 0: + self.timestep = None #use the default dt in the SCM code else: message = 'The timestep for suite {0} cannot be set greater than the max_timestep of {1}'.format(self._name, self._max_timestep) raise Exception(message) + @property + def timestep(self): + """Get the timestep for the given suite.""" + return self.timestep + + @timestep.setter + def timestep(self, value): + """Set the timestep for the given suite.""" + if value <= self._max_timestep: + self.timestep = value + else: + message = 'The timestep for suite {0} cannot be set greater than the max_timestep of {1}'.format(self._name, self._max_timestep) + raise Exception(message) + suite_list = [] suite_list.append(suite('SCM_GFS_v15p2', 'tracers_GFS_v15p2.txt', 'input_GFS_v15p2.nml', 600.0, 1800.0, True )) suite_list.append(suite('SCM_GFS_v16', 'tracers_GFS_v16.txt', 'input_GFS_v16.nml', 600.0, 1800.0, True ))