diff --git a/contrib/get_all_static_data.sh b/contrib/get_all_static_data.sh index b0e8006dd..99c0cd4de 100755 --- a/contrib/get_all_static_data.sh +++ b/contrib/get_all_static_data.sh @@ -21,7 +21,7 @@ for file in "${data_files[@]}"; do mkdir -p $BASEDIR/scm/data/$file cd $BASEDIR/scm/data/$file echo "Retrieving $file" - wget https://github.com/NCAR/ccpp-scm/releases/download/v6.0.0/${file}.tar.gz + wget https://github.com/NCAR/ccpp-scm/releases/download/v7.0.0-beta/${file}.tar.gz tar -xf ${file}.tar.gz rm -f ${file}.tar.gz done diff --git a/scm/etc/case_config/COMBLE.nml b/scm/etc/case_config/COMBLE.nml new file mode 100644 index 000000000..fc332532b --- /dev/null +++ b/scm/etc/case_config/COMBLE.nml @@ -0,0 +1,9 @@ +$case_config +case_name = 'COMBLE', +input_type = 1 +lsm_ics = .false., +do_spinup = .false., +spinup_timesteps = 0, +reference_profile_choice = 2, +column_area = 1.45E8, +/ \ No newline at end of file diff --git a/scm/etc/case_config/LASSO_2016051812.nml b/scm/etc/case_config/LASSO_2016051812.nml index 75eff16b8..31df86d63 100644 --- a/scm/etc/case_config/LASSO_2016051812.nml +++ b/scm/etc/case_config/LASSO_2016051812.nml @@ -1,16 +1,7 @@ -$case_config -case_name = 'LASSO_2016051812', -runtime = 54000, -thermo_forcing_type = 2, -mom_forcing_type = 3, -relax_time = 7200.0, -sfc_flux_spec = .true., -sfc_roughness_length_cm = 10.0 -sfc_type = 1, -reference_profile_choice = 2, -year = 2016, -month = 5, -day = 18, -hour = 12, -column_area = 2.0E9, -$end +&case_config + case_name = 'LASSO_2016051812' + column_area = 2000000000.0 + input_type = 1 + reference_profile_choice = 2 + sfc_roughness_length_cm = 10.0 +/ diff --git a/scm/etc/case_config/LASSO_2016051812_MSDA.nml b/scm/etc/case_config/LASSO_2016051812_MSDA.nml index 900c70b9e..ec6edbf08 100644 --- a/scm/etc/case_config/LASSO_2016051812_MSDA.nml +++ b/scm/etc/case_config/LASSO_2016051812_MSDA.nml @@ -1,16 +1,7 @@ -$case_config -case_name = 'LASSO_2016051812_MSDA', -runtime = 54000, -thermo_forcing_type = 2, -mom_forcing_type = 3, -relax_time = 7200.0, -sfc_flux_spec = .true., -sfc_roughness_length_cm = 10.0 -sfc_type = 1, -reference_profile_choice = 2, -year = 2016, -month = 5, -day = 18, -hour = 12, -column_area = 2.0E9, -$end +&case_config + case_name = 'LASSO_2016051812_MSDA' + column_area = 2000000000.0 + input_type = 1 + reference_profile_choice = 2 + sfc_roughness_length_cm = 10.0 +/ diff --git a/scm/etc/case_config/LASSO_2016051812_VARA.nml b/scm/etc/case_config/LASSO_2016051812_VARA.nml index 2f0374372..139278616 100644 --- a/scm/etc/case_config/LASSO_2016051812_VARA.nml +++ b/scm/etc/case_config/LASSO_2016051812_VARA.nml @@ -1,16 +1,7 @@ -$case_config -case_name = 'LASSO_2016051812_VARA', -runtime = 54000, -thermo_forcing_type = 2, -mom_forcing_type = 3, -relax_time = 7200.0, -sfc_flux_spec = .true., -sfc_roughness_length_cm = 10.0 -sfc_type = 1, -reference_profile_choice = 2, -year = 2016, -month = 5, -day = 18, -hour = 12, -column_area = 2.0E9, -$end +&case_config + case_name = 'LASSO_2016051812_VARA' + column_area = 2000000000.0 + input_type = 1 + reference_profile_choice = 2 + sfc_roughness_length_cm = 10.0 +/ diff --git a/scm/etc/case_config/LASSO_20180514_s02.nml b/scm/etc/case_config/LASSO_20180514_s02.nml index 432c77ed1..61f9a7f3e 100644 --- a/scm/etc/case_config/LASSO_20180514_s02.nml +++ b/scm/etc/case_config/LASSO_20180514_s02.nml @@ -1,16 +1,7 @@ -$case_config -case_name = 'LASSO_20180514_s02', -runtime = 54000, -thermo_forcing_type = 2, -mom_forcing_type = 3, -relax_time = 7200.0, -sfc_flux_spec = .true., -sfc_roughness_length_cm = 10.0 -sfc_type = 1, -reference_profile_choice = 2, -year = 2018, -month = 5, -day = 14, -hour = 12, -column_area = 2.0E9, -$end +&case_config + case_name = 'LASSO_20180514_s02' + column_area = 2000000000.0 + input_type = 1 + reference_profile_choice = 2 + sfc_roughness_length_cm = 10.0 +/ diff --git a/scm/etc/case_config/LASSO_20180522_s02.nml b/scm/etc/case_config/LASSO_20180522_s02.nml index 4f69ef9b1..2a561bbb4 100644 --- a/scm/etc/case_config/LASSO_20180522_s02.nml +++ b/scm/etc/case_config/LASSO_20180522_s02.nml @@ -1,16 +1,7 @@ -$case_config -case_name = 'LASSO_20180522_s02', -runtime = 54000, -thermo_forcing_type = 2, -mom_forcing_type = 3, -relax_time = 7200.0, -sfc_flux_spec = .true., -sfc_roughness_length_cm = 10.0 -sfc_type = 1, -reference_profile_choice = 2, -year = 2018, -month = 5, -day = 22, -hour = 12, -column_area = 2.0E9, -$end +&case_config + case_name = 'LASSO_20180522_s02' + column_area = 2000000000.0 + input_type = 1 + reference_profile_choice = 2 + sfc_roughness_length_cm = 10.0 +/ diff --git a/scm/etc/case_config/LASSO_20180606_s02.nml b/scm/etc/case_config/LASSO_20180606_s02.nml index feeadc334..2e8a13eb4 100644 --- a/scm/etc/case_config/LASSO_20180606_s02.nml +++ b/scm/etc/case_config/LASSO_20180606_s02.nml @@ -1,16 +1,7 @@ -$case_config -case_name = 'LASSO_20180606_s02', -runtime = 54000, -thermo_forcing_type = 2, -mom_forcing_type = 3, -relax_time = 7200.0, -sfc_flux_spec = .true., -sfc_roughness_length_cm = 10.0 -sfc_type = 1, -reference_profile_choice = 2, -year = 2018, -month = 6, -day = 06, -hour = 12, -column_area = 2.0E9, -$end +&case_config + case_name = 'LASSO_20180606_s02' + column_area = 2000000000.0 + input_type = 1 + reference_profile_choice = 2 + sfc_roughness_length_cm = 10.0 +/ diff --git a/scm/etc/case_config/LASSO_20180618_s02.nml b/scm/etc/case_config/LASSO_20180618_s02.nml index a5b261a3c..1a609b659 100644 --- a/scm/etc/case_config/LASSO_20180618_s02.nml +++ b/scm/etc/case_config/LASSO_20180618_s02.nml @@ -1,16 +1,7 @@ -$case_config -case_name = 'LASSO_20180618_s02', -runtime = 54000, -thermo_forcing_type = 2, -mom_forcing_type = 3, -relax_time = 7200.0, -sfc_flux_spec = .true., -sfc_roughness_length_cm = 10.0 -sfc_type = 1, -reference_profile_choice = 2, -year = 2018, -month = 6, -day = 18, -hour = 12, -column_area = 2.0E9, -$end +&case_config + case_name = 'LASSO_20180618_s02' + column_area = 2000000000.0 + input_type = 1 + reference_profile_choice = 2 + sfc_roughness_length_cm = 10.0 +/ diff --git a/scm/etc/case_config/LASSO_20180619_s02.nml b/scm/etc/case_config/LASSO_20180619_s02.nml index e32bc294d..33c6c1981 100644 --- a/scm/etc/case_config/LASSO_20180619_s02.nml +++ b/scm/etc/case_config/LASSO_20180619_s02.nml @@ -1,16 +1,7 @@ -$case_config -case_name = 'LASSO_20180619_s02', -runtime = 54000, -thermo_forcing_type = 2, -mom_forcing_type = 3, -relax_time = 7200.0, -sfc_flux_spec = .true., -sfc_roughness_length_cm = 10.0 -sfc_type = 1, -reference_profile_choice = 2, -year = 2018, -month = 6, -day = 19, -hour = 12, -column_area = 2.0E9, -$end +&case_config + case_name = 'LASSO_20180619_s02' + column_area = 2000000000.0 + input_type = 1 + reference_profile_choice = 2 + sfc_roughness_length_cm = 10.0 +/ diff --git a/scm/etc/case_config/LASSO_20180705_s02.nml b/scm/etc/case_config/LASSO_20180705_s02.nml index 5648360e8..fac051533 100644 --- a/scm/etc/case_config/LASSO_20180705_s02.nml +++ b/scm/etc/case_config/LASSO_20180705_s02.nml @@ -1,16 +1,7 @@ -$case_config -case_name = 'LASSO_20180705_s02', -runtime = 54000, -thermo_forcing_type = 2, -mom_forcing_type = 3, -relax_time = 7200.0, -sfc_flux_spec = .true., -sfc_roughness_length_cm = 10.0 -sfc_type = 1, -reference_profile_choice = 2, -year = 2018, -month = 7, -day = 05, -hour = 12, -column_area = 2.0E9, -$end +&case_config + case_name = 'LASSO_20180705_s02' + column_area = 2000000000.0 + input_type = 1 + reference_profile_choice = 2 + sfc_roughness_length_cm = 10.0 +/ diff --git a/scm/etc/case_config/LASSO_20180707_s02.nml b/scm/etc/case_config/LASSO_20180707_s02.nml index af73e1d62..2df38195d 100644 --- a/scm/etc/case_config/LASSO_20180707_s02.nml +++ b/scm/etc/case_config/LASSO_20180707_s02.nml @@ -1,16 +1,7 @@ -$case_config -case_name = 'LASSO_20180707_s02', -runtime = 54000, -thermo_forcing_type = 2, -mom_forcing_type = 3, -relax_time = 7200.0, -sfc_flux_spec = .true., -sfc_roughness_length_cm = 10.0 -sfc_type = 1, -reference_profile_choice = 2, -year = 2018, -month = 7, -day = 07, -hour = 12, -column_area = 2.0E9, -$end +&case_config + case_name = 'LASSO_20180707_s02' + column_area = 2000000000.0 + input_type = 1 + reference_profile_choice = 2 + sfc_roughness_length_cm = 10.0 +/ diff --git a/scm/etc/case_config/LASSO_20180709_s02.nml b/scm/etc/case_config/LASSO_20180709_s02.nml index ac68594cd..5fd786d63 100644 --- a/scm/etc/case_config/LASSO_20180709_s02.nml +++ b/scm/etc/case_config/LASSO_20180709_s02.nml @@ -1,16 +1,7 @@ -$case_config -case_name = 'LASSO_20180709_s02', -runtime = 54000, -thermo_forcing_type = 2, -mom_forcing_type = 3, -relax_time = 7200.0, -sfc_flux_spec = .true., -sfc_roughness_length_cm = 10.0 -sfc_type = 1, -reference_profile_choice = 2, -year = 2018, -month = 7, -day = 09, -hour = 12, -column_area = 2.0E9, -$end +&case_config + case_name = 'LASSO_20180709_s02' + column_area = 2000000000.0 + input_type = 1 + reference_profile_choice = 2 + sfc_roughness_length_cm = 10.0 +/ diff --git a/scm/etc/case_config/LASSO_20180712_s02.nml b/scm/etc/case_config/LASSO_20180712_s02.nml index 6917a1851..7aa611c0a 100644 --- a/scm/etc/case_config/LASSO_20180712_s02.nml +++ b/scm/etc/case_config/LASSO_20180712_s02.nml @@ -1,16 +1,7 @@ -$case_config -case_name = 'LASSO_20180712_s02', -runtime = 54000, -thermo_forcing_type = 2, -mom_forcing_type = 3, -relax_time = 7200.0, -sfc_flux_spec = .true., -sfc_roughness_length_cm = 10.0 -sfc_type = 1, -reference_profile_choice = 2, -year = 2018, -month = 7, -day = 12, -hour = 12, -column_area = 2.0E9, -$end +&case_config + case_name = 'LASSO_20180712_s02' + column_area = 2000000000.0 + input_type = 1 + reference_profile_choice = 2 + sfc_roughness_length_cm = 10.0 +/ diff --git a/scm/etc/case_config/LASSO_20180731_s02.nml b/scm/etc/case_config/LASSO_20180731_s02.nml index 6ac93bbad..654037d69 100644 --- a/scm/etc/case_config/LASSO_20180731_s02.nml +++ b/scm/etc/case_config/LASSO_20180731_s02.nml @@ -1,16 +1,7 @@ -$case_config -case_name = 'LASSO_20180731_s02', -runtime = 54000, -thermo_forcing_type = 2, -mom_forcing_type = 3, -relax_time = 7200.0, -sfc_flux_spec = .true., -sfc_roughness_length_cm = 10.0 -sfc_type = 1, -reference_profile_choice = 2, -year = 2018, -month = 7, -day = 31, -hour = 12, -column_area = 2.0E9, -$end +&case_config + case_name = 'LASSO_20180731_s02' + column_area = 2000000000.0 + input_type = 1 + reference_profile_choice = 2 + sfc_roughness_length_cm = 10.0 +/ diff --git a/scm/etc/case_config/LASSO_20180911_s02.nml b/scm/etc/case_config/LASSO_20180911_s02.nml index e4fc92955..68e9fcb43 100644 --- a/scm/etc/case_config/LASSO_20180911_s02.nml +++ b/scm/etc/case_config/LASSO_20180911_s02.nml @@ -1,16 +1,7 @@ -$case_config -case_name = 'LASSO_20180911_s02', -runtime = 54000, -thermo_forcing_type = 2, -mom_forcing_type = 3, -relax_time = 7200.0, -sfc_flux_spec = .true., -sfc_roughness_length_cm = 10.0 -sfc_type = 1, -reference_profile_choice = 2, -year = 2018, -month = 9, -day = 11, -hour = 12, -column_area = 2.0E9, -$end +&case_config + case_name = 'LASSO_20180911_s02' + column_area = 2000000000.0 + input_type = 1 + reference_profile_choice = 2 + sfc_roughness_length_cm = 10.0 +/ diff --git a/scm/etc/case_config/LASSO_20180914_s02.nml b/scm/etc/case_config/LASSO_20180914_s02.nml index 66d28362d..6a6c834c6 100644 --- a/scm/etc/case_config/LASSO_20180914_s02.nml +++ b/scm/etc/case_config/LASSO_20180914_s02.nml @@ -1,16 +1,7 @@ -$case_config -case_name = 'LASSO_20180914_s02', -runtime = 54000, -thermo_forcing_type = 2, -mom_forcing_type = 3, -relax_time = 7200.0, -sfc_flux_spec = .true., -sfc_roughness_length_cm = 10.0 -sfc_type = 1, -reference_profile_choice = 2, -year = 2018, -month = 9, -day = 14, -hour = 12, -column_area = 2.0E9, -$end +&case_config + case_name = 'LASSO_20180914_s02' + column_area = 2000000000.0 + input_type = 1 + reference_profile_choice = 2 + sfc_roughness_length_cm = 10.0 +/ diff --git a/scm/etc/case_config/LASSO_20180916_s02.nml b/scm/etc/case_config/LASSO_20180916_s02.nml index 6197652b8..3e486717f 100644 --- a/scm/etc/case_config/LASSO_20180916_s02.nml +++ b/scm/etc/case_config/LASSO_20180916_s02.nml @@ -1,16 +1,7 @@ -$case_config -case_name = 'LASSO_20180916_s02', -runtime = 54000, -thermo_forcing_type = 2, -mom_forcing_type = 3, -relax_time = 7200.0, -sfc_flux_spec = .true., -sfc_roughness_length_cm = 10.0 -sfc_type = 1, -reference_profile_choice = 2, -year = 2018, -month = 9, -day = 16, -hour = 12, -column_area = 2.0E9, -$end +&case_config + case_name = 'LASSO_20180916_s02' + column_area = 2000000000.0 + input_type = 1 + reference_profile_choice = 2 + sfc_roughness_length_cm = 10.0 +/ diff --git a/scm/etc/case_config/LASSO_20180917_s02.nml b/scm/etc/case_config/LASSO_20180917_s02.nml index 896a32225..0ff786d1b 100644 --- a/scm/etc/case_config/LASSO_20180917_s02.nml +++ b/scm/etc/case_config/LASSO_20180917_s02.nml @@ -1,16 +1,7 @@ -$case_config -case_name = 'LASSO_20180917_s02', -runtime = 54000, -thermo_forcing_type = 2, -mom_forcing_type = 3, -relax_time = 7200.0, -sfc_flux_spec = .true., -sfc_roughness_length_cm = 10.0 -sfc_type = 1, -reference_profile_choice = 2, -year = 2018, -month = 9, -day = 17, -hour = 12, -column_area = 2.0E9, -$end +&case_config + case_name = 'LASSO_20180917_s02' + column_area = 2000000000.0 + input_type = 1 + reference_profile_choice = 2 + sfc_roughness_length_cm = 10.0 +/ diff --git a/scm/etc/case_config/LASSO_20180918_s02.nml b/scm/etc/case_config/LASSO_20180918_s02.nml index 09deb06aa..383cad945 100644 --- a/scm/etc/case_config/LASSO_20180918_s02.nml +++ b/scm/etc/case_config/LASSO_20180918_s02.nml @@ -1,16 +1,7 @@ -$case_config -case_name = 'LASSO_20180918_s02', -runtime = 54000, -thermo_forcing_type = 2, -mom_forcing_type = 3, -relax_time = 7200.0, -sfc_flux_spec = .true., -sfc_roughness_length_cm = 10.0 -sfc_type = 1, -reference_profile_choice = 2, -year = 2018, -month = 9, -day = 18, -hour = 12, -column_area = 2.0E9, -$end +&case_config + case_name = 'LASSO_20180918_s02' + column_area = 2000000000.0 + input_type = 1 + reference_profile_choice = 2 + sfc_roughness_length_cm = 10.0 +/ diff --git a/scm/etc/case_config/LASSO_20181002_s02.nml b/scm/etc/case_config/LASSO_20181002_s02.nml index b63d206de..9a10ff357 100644 --- a/scm/etc/case_config/LASSO_20181002_s02.nml +++ b/scm/etc/case_config/LASSO_20181002_s02.nml @@ -1,16 +1,7 @@ -$case_config -case_name = 'LASSO_20181002_s02', -runtime = 54000, -thermo_forcing_type = 2, -mom_forcing_type = 3, -relax_time = 7200.0, -sfc_flux_spec = .true., -sfc_roughness_length_cm = 10.0 -sfc_type = 1, -reference_profile_choice = 2, -year = 2018, -month = 10, -day = 02, -hour = 12, -column_area = 2.0E9, -$end +&case_config + case_name = 'LASSO_20181002_s02' + column_area = 2000000000.0 + input_type = 1 + reference_profile_choice = 2 + sfc_roughness_length_cm = 10.0 +/ diff --git a/scm/etc/case_config/MOSAiC-AMPS.nml b/scm/etc/case_config/MOSAiC-AMPS.nml new file mode 100644 index 000000000..bbcbdf46e --- /dev/null +++ b/scm/etc/case_config/MOSAiC-AMPS.nml @@ -0,0 +1,8 @@ +&case_config + case_name = 'MOSAiC-AMPS' + column_area = 2000000000.0 + input_type = 1 + lsm_ics = .true. + reference_profile_choice = 1 + sfc_roughness_length_cm = 0.02 +/ diff --git a/scm/etc/case_config/MOSAiC-SS.nml b/scm/etc/case_config/MOSAiC-SS.nml new file mode 100644 index 000000000..ec995e675 --- /dev/null +++ b/scm/etc/case_config/MOSAiC-SS.nml @@ -0,0 +1,8 @@ +&case_config + case_name = 'MOSAiC-SS' + column_area = 2000000000.0 + input_type = 1 + lsm_ics = .true. + reference_profile_choice = 1 + sfc_roughness_length_cm = 0.02 +/ 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 375d0c4cb..912c3ba2f 100644 --- a/scm/etc/case_config/arm_sgp_summer_1997_A.nml +++ b/scm/etc/case_config/arm_sgp_summer_1997_A.nml @@ -1,16 +1,7 @@ -$case_config -case_name = 'arm_sgp_summer_1997_A', -runtime = 345600, -thermo_forcing_type = 1, -mom_forcing_type = 3, -relax_time = 7200.0, -sfc_flux_spec = .true., -sfc_roughness_length_cm = 10.0 -sfc_type = 1, -reference_profile_choice = 2, -year = 1997, -month = 6, -day = 26, -hour = 23, -column_area = 2.0E9, -$end +&case_config + case_name = 'arm_sgp_summer_1997_A' + column_area = 2000000000.0 + input_type = 1 + reference_profile_choice = 2 + sfc_roughness_length_cm = 10.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 0ac151cc4..f72393b48 100644 --- a/scm/etc/case_config/arm_sgp_summer_1997_B.nml +++ b/scm/etc/case_config/arm_sgp_summer_1997_B.nml @@ -1,16 +1,7 @@ -$case_config -case_name = 'arm_sgp_summer_1997_B', -runtime = 432000, -thermo_forcing_type = 1, -mom_forcing_type = 3, -relax_time = 7200.0, -sfc_flux_spec = .true., -sfc_roughness_length_cm = 10.0 -sfc_type = 1, -reference_profile_choice = 2, -year = 1997, -month = 7, -day = 7, -hour = 23, -column_area = 2.0E9, -$end +&case_config + case_name = 'arm_sgp_summer_1997_B' + column_area = 2000000000.0 + input_type = 1 + reference_profile_choice = 2 + sfc_roughness_length_cm = 10.0 +/ 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 ace0b4dd2..4ed84bab0 100644 --- a/scm/etc/case_config/arm_sgp_summer_1997_C.nml +++ b/scm/etc/case_config/arm_sgp_summer_1997_C.nml @@ -1,16 +1,7 @@ -$case_config -case_name = 'arm_sgp_summer_1997_C', -runtime = 432000, -thermo_forcing_type = 1, -mom_forcing_type = 3, -relax_time = 7200.0, -sfc_flux_spec = .true., -sfc_roughness_length_cm = 10.0 -sfc_type = 1, -reference_profile_choice = 2, -year = 1997, -month = 7, -day = 12, -hour = 23, -column_area = 2.0E9, -$end +&case_config + case_name = 'arm_sgp_summer_1997_C' + column_area = 2000000000.0 + input_type = 1 + reference_profile_choice = 2 + sfc_roughness_length_cm = 10.0 +/ 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 c3da579ce..79632258b 100644 --- a/scm/etc/case_config/arm_sgp_summer_1997_R.nml +++ b/scm/etc/case_config/arm_sgp_summer_1997_R.nml @@ -1,16 +1,7 @@ -$case_config -case_name = 'arm_sgp_summer_1997_R', -runtime = 345600, -thermo_forcing_type = 1, -mom_forcing_type = 3, -relax_time = 7200.0, -sfc_flux_spec = .true., -sfc_roughness_length_cm = 10.0 -sfc_type = 1, -reference_profile_choice = 2, -year = 1997, -month = 6, -day = 18, -hour = 23, -column_area = 2.0E9, -$end +&case_config + case_name = 'arm_sgp_summer_1997_R' + column_area = 2000000000.0 + input_type = 1 + reference_profile_choice = 2 + sfc_roughness_length_cm = 10.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 ba26818be..25f21da4c 100644 --- a/scm/etc/case_config/arm_sgp_summer_1997_S.nml +++ b/scm/etc/case_config/arm_sgp_summer_1997_S.nml @@ -1,16 +1,7 @@ -$case_config -case_name = 'arm_sgp_summer_1997_S', -runtime = 345600, -thermo_forcing_type = 1, -mom_forcing_type = 3, -relax_time = 7200.0, -sfc_flux_spec = .true., -sfc_roughness_length_cm = 10.0 -sfc_type = 1, -reference_profile_choice = 2, -year = 1997, -month = 6, -day = 22, -hour = 23, -column_area = 2.0E9, -$end +&case_config + case_name = 'arm_sgp_summer_1997_S' + column_area = 2000000000.0 + input_type = 1 + reference_profile_choice = 2 + sfc_roughness_length_cm = 10.0 +/ 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 d68aaa82a..6b5cc9f3f 100644 --- a/scm/etc/case_config/arm_sgp_summer_1997_T.nml +++ b/scm/etc/case_config/arm_sgp_summer_1997_T.nml @@ -1,16 +1,7 @@ -$case_config -case_name = 'arm_sgp_summer_1997_T', -runtime = 259200, -thermo_forcing_type = 1, -mom_forcing_type = 3, -relax_time = 7200.0, -sfc_flux_spec = .true., -sfc_roughness_length_cm = 10.0 -sfc_type = 1, -reference_profile_choice = 2, -year = 1997, -month = 6, -day = 30, -hour = 23, -column_area = 2.0E9, -$end +&case_config + case_name = 'arm_sgp_summer_1997_T' + column_area = 2000000000.0 + input_type = 1 + reference_profile_choice = 2 + sfc_roughness_length_cm = 10.0 +/ 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 2d599f4f8..1abc438f5 100644 --- a/scm/etc/case_config/arm_sgp_summer_1997_U.nml +++ b/scm/etc/case_config/arm_sgp_summer_1997_U.nml @@ -1,16 +1,7 @@ -$case_config -case_name = 'arm_sgp_summer_1997_U', -runtime = 345600, -thermo_forcing_type = 1, -mom_forcing_type = 3, -relax_time = 7200.0, -sfc_flux_spec = .true., -sfc_roughness_length_cm = 10.0 -sfc_type = 1, -reference_profile_choice = 2, -year = 1997, -month = 7, -day = 4, -hour = 23, -column_area = 2.0E9, -$end +&case_config + case_name = 'arm_sgp_summer_1997_U' + column_area = 2000000000.0 + input_type = 1 + reference_profile_choice = 2 + sfc_roughness_length_cm = 10.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 cc90d4b91..b207a781f 100644 --- a/scm/etc/case_config/arm_sgp_summer_1997_X.nml +++ b/scm/etc/case_config/arm_sgp_summer_1997_X.nml @@ -1,16 +1,7 @@ -$case_config -case_name = 'arm_sgp_summer_1997_X', -runtime = 2505600, -thermo_forcing_type = 1, -mom_forcing_type = 3, -relax_time = 7200.0, -sfc_flux_spec = .true., -sfc_roughness_length_cm = 10.0 -sfc_type = 1, -reference_profile_choice = 2, -year = 1997, -month = 6, -day = 18, -hour = 23, -column_area = 2.0E9, -$end +&case_config + case_name = 'arm_sgp_summer_1997_X' + column_area = 2000000000.0 + input_type = 1 + reference_profile_choice = 2 + sfc_roughness_length_cm = 10.0 +/ diff --git a/scm/etc/case_config/astex.nml b/scm/etc/case_config/astex.nml index 3a9e99a3b..1cfb03bfb 100644 --- a/scm/etc/case_config/astex.nml +++ b/scm/etc/case_config/astex.nml @@ -1,16 +1,7 @@ -$case_config -case_name = 'astex', -runtime = 144000, -thermo_forcing_type = 2, -mom_forcing_type = 2, -relax_time = 7200.0, -sfc_flux_spec = .false., -sfc_type = 0, -sfc_roughness_length_cm = 0.02, -reference_profile_choice = 1, -year = 1992, -month = 6, -day = 13, -hour = 0, -column_area = 3.7E5, -$end +&case_config + case_name = 'astex' + column_area = 370000.0 + input_type = 1 + reference_profile_choice = 1 + sfc_roughness_length_cm = 0.02 +/ diff --git a/scm/etc/case_config/bomex.nml b/scm/etc/case_config/bomex.nml index 093c31353..e6f68378a 100644 --- a/scm/etc/case_config/bomex.nml +++ b/scm/etc/case_config/bomex.nml @@ -1,16 +1,7 @@ -$case_config -case_name = 'bomex', -runtime = 21600, -thermo_forcing_type = 2, -mom_forcing_type = 3, -relax_time = 7200.0, -sfc_flux_spec = .true., -sfc_roughness_length_cm = 0.012, -sfc_type = 0, -reference_profile_choice = 1, -year = 1969, -month = 6, -day = 22, -hour = 13, -column_area = 2.0E9, -$end +&case_config + case_name = 'bomex' + column_area = 2000000000.0 + input_type = 1 + reference_profile_choice = 1 + sfc_roughness_length_cm = 0.012 +/ diff --git a/scm/etc/case_config/gabls3.nml b/scm/etc/case_config/gabls3.nml index 727b9eced..0e48db674 100644 --- a/scm/etc/case_config/gabls3.nml +++ b/scm/etc/case_config/gabls3.nml @@ -1,19 +1,10 @@ -$case_config -case_name = 'gabls3', -runtime = 86400, -thermo_forcing_type = 2, -mom_forcing_type = 2, -relax_time = 7200.0, -sfc_flux_spec = .false., -lsm_ics = .true., -do_spinup = .true., -spinup_timesteps = 12, -sfc_roughness_length_cm = 15.0, -sfc_type = 1, -reference_profile_choice = 2, -year = 2006, -month = 7, -day = 1, -hour = 12, -column_area = 1.45E8, -$end +&case_config + case_name = 'gabls3' + column_area = 145000000.0 + do_spinup = .true. + input_type = 1 + lsm_ics = .true. + reference_profile_choice = 2 + sfc_roughness_length_cm = 15.0 + spinup_timesteps = 12 +/ diff --git a/scm/etc/case_config/gabls3_noahmp.nml b/scm/etc/case_config/gabls3_noahmp.nml index 5775d65f5..4b7267352 100644 --- a/scm/etc/case_config/gabls3_noahmp.nml +++ b/scm/etc/case_config/gabls3_noahmp.nml @@ -1,19 +1,10 @@ -$case_config -case_name = 'gabls3_noahmp', -runtime = 86400, -thermo_forcing_type = 2, -mom_forcing_type = 2, -relax_time = 7200.0, -sfc_flux_spec = .false., -lsm_ics = .true., -do_spinup = .true., -spinup_timesteps = 12, -sfc_roughness_length_cm = 15.0, -sfc_type = 1, -reference_profile_choice = 2, -year = 2006, -month = 7, -day = 1, -hour = 12, -column_area = 1.45E8, -$end +&case_config + case_name = 'gabls3_noahmp' + column_area = 145000000.0 + do_spinup = .true. + input_type = 1 + lsm_ics = .true. + reference_profile_choice = 2 + sfc_roughness_length_cm = 15.0 + spinup_timesteps = 12 +/ diff --git a/scm/etc/case_config/gabls3_ruc.nml b/scm/etc/case_config/gabls3_ruc.nml index a13a4dcf0..4a1ff01da 100644 --- a/scm/etc/case_config/gabls3_ruc.nml +++ b/scm/etc/case_config/gabls3_ruc.nml @@ -1,19 +1,10 @@ -$case_config -case_name = 'gabls3_ruc', -runtime = 86400, -thermo_forcing_type = 2, -mom_forcing_type = 2, -relax_time = 7200.0, -sfc_flux_spec = .false., -lsm_ics = .true., -do_spinup = .true., -spinup_timesteps = 12, -sfc_roughness_length_cm = 15.0, -sfc_type = 1, -reference_profile_choice = 2, -year = 2006, -month = 7, -day = 1, -hour = 12, -column_area = 1.45E8, -$end +&case_config + case_name = 'gabls3_ruc' + column_area = 145000000.0 + do_spinup = .true. + input_type = 1 + lsm_ics = .true. + reference_profile_choice = 2 + sfc_roughness_length_cm = 15.0 + spinup_timesteps = 12 +/ diff --git a/scm/etc/case_config/twpice.nml b/scm/etc/case_config/twpice.nml index 23a5ceea0..bd3374c36 100644 --- a/scm/etc/case_config/twpice.nml +++ b/scm/etc/case_config/twpice.nml @@ -1,16 +1,7 @@ -$case_config -case_name = 'twpice', -runtime = 2138400, -thermo_forcing_type = 2, -mom_forcing_type = 3, -relax_time = 7200.0, -sfc_flux_spec = .false., -sfc_type = 0, -sfc_roughness_length_cm = 0.02, -reference_profile_choice = 1, -year = 2006, -month = 1, -day = 19, -hour = 3, -column_area = 2.0E9, -$end +&case_config + case_name = 'twpice' + column_area = 2000000000.0 + input_type = 1 + reference_profile_choice = 1 + sfc_roughness_length_cm = 0.02 +/ diff --git a/scm/etc/scripts/MOSAiC_AMPS_forcing_file_generator.py b/scm/etc/scripts/MOSAiC_AMPS_forcing_file_generator.py new file mode 100755 index 000000000..b2c5a9381 --- /dev/null +++ b/scm/etc/scripts/MOSAiC_AMPS_forcing_file_generator.py @@ -0,0 +1,590 @@ +#!/usr/bin/env python + +from netCDF4 import Dataset +import numpy as np +import forcing_file_common as ffc +import scipy.interpolate +import scm_plotting_routines as spr + +#reload(ffc) + +#read in raw input file + +nc_fid = Dataset("../../data/raw_case_input/MOSAiC_31Oct20190Z_raw.nc", 'r') + +#ncdump to look at raw input file +#nc_attrs, nc_dims, nc_vars = ncdump(nc_fid, False) + +#netCDF how-to +#set attributes +#file_id.setncattr(file_id.variables['variable'].ncattr(), nc_fid.variables['time'].getncattr(ncattr)) +#get attributes +#file_id.variables['variable'].getncattr(index) + +#get raw input variables + +day = nc_fid.variables['day'][:] +hour = nc_fid.variables['hour'][:] +for t in range(day.size): + #find time index corresponding to October 29, 2019 at 0Z + if day[t] == 31 and hour[t] == 0: + start_t_index = t + break + +time = nc_fid.variables['time_offset'][:] #number of seconds since 00Z on 1/17/2006 (starts at 03Z) +#subtract the initial time_offset from all values to get elapsed time since the start of the simulation +time = time - time[start_t_index] +levels = nc_fid.variables['levels'][:] #pressure levels in mb +#convert levels to Pa +levels = 100.0*levels +ice_thickness = np.zeros((2),dtype=float) +#height = nc_fid.variables['alt'][:] +lat = nc_fid.variables['lat'][:] #degrees north +#convert latitutde to degrees north +lon = nc_fid.variables['lon'][:] #degrees east +#use upstream T +T_abs = nc_fid.variables['Tu'][:] #absolute temperature (time, lev) +T_abs = np.swapaxes(T_abs, 0, 1) +thetail = nc_fid.variables['thetail'][:] #theta_il (time, lev) +thetail = np.swapaxes(thetail, 0, 1) +#use unpstream theta instead of thetail +thetailu = nc_fid.variables['thetailu'][:] #theta (time, lev) +thetailu = np.swapaxes(thetailu, 0, 1) +#calculate theta_il from absolute temperature (assuming no condensate) +#thetal = np.zeros((levels.size,time.size),dtype=float) +#for t in range(time.size): +# thetal[:,t] = (ffc.p0/levels)**(ffc.R_dry/ffc.c_p)*T_abs[:,t] +qv = nc_fid.variables['qu'][:] #water vapor mixing ratio in kg/kg (time, lev) +qv = np.swapaxes(qv, 0, 1) +qt = np.zeros((levels.size,time.size),dtype=float) +qt_mr = nc_fid.variables['qt'][:] #water vapor mixing ratio in kg/kg (time, lev) +qt_mr = np.swapaxes(qt_mr, 0, 1) #swap the time and levels axis +qt = qt_mr/(1.0 + qt_mr) #convert to specific humidity from mixing ratio +qtu = np.zeros((levels.size,time.size),dtype=float) +#use upstream qv instead of qt +qtu_mr = nc_fid.variables['qtu'][:] #water vapor mixing ratio in kg/kg (time, lev) +qtu_mr = np.swapaxes(qtu_mr, 0, 1) #swap the time and levels axis +qtu = qtu_mr/(1.0 + qtu_mr) #convert to specific humidity from mixing ratio + +#ql and tke are not specified; set to zero +#ql = np.zeros((levels.size,time.size),dtype=float) +#qi = np.zeros((levels.size,time.size),dtype=float) +ql = nc_fid.variables['ql'][:] #ql (time, lev) +ql = np.swapaxes(ql, 0, 1) +qi = nc_fid.variables['qi'][:] #ql (time, lev) +qi = np.swapaxes(qi, 0, 1) +tke = np.zeros((levels.size,time.size),dtype=float) +# ozone_mmr = nc_fid.variables['o3mmr'][:] +u_wind = nc_fid.variables['u'][:] +u_wind = np.swapaxes(u_wind, 0, 1) #swap the time and levels axis +v_wind = nc_fid.variables['v'][:] +v_wind = np.swapaxes(v_wind, 0, 1) #swap the time and levels axis + +#w_sub = np.zeros((levels.size,time.size),dtype=float) +omega = nc_fid.variables['omega'][:] #vertical pressure velocity in Pa/s +omega = np.swapaxes(omega, 0, 1) #swap the time and levels axis +w_sub = nc_fid.variables['w'][:] #vertical velocity in m/s +w_sub = np.swapaxes(w_sub, 0, 1) #swap the time and levels axis +#convert to w +#for t in range(time.size): +# w_sub[:,t] = ffc.omega_to_w(omega[:,t],levels,T_abs[:,t]) + +T_surf = nc_fid.variables['T_skin'][:] +#T_surf = T_surf + 273.15 #convert to K +#T_surf = (29 + 273.15)*np.ones((time.size),dtype=float) #forcing instructions specify time-invariant 29 deg C. +p_surf = nc_fid.variables['p_srf'][:] #Pa +#p_surf = p_surf*100.0 #convert to Pa + +#h_advec_thil = np.zeros((levels.size,time.size),dtype=float) +h_advec_thil = nc_fid.variables['h_advec_thetail'][:] #K/s +h_advec_thil = np.swapaxes(h_advec_thil, 0, 1) #swap the time and levels axis +#for t in range(time.size): +# h_advec_thil[:,t] = (ffc.p0/levels)**(ffc.R_dry/ffc.c_p)*h_advec_T[:,t] #convert to potential temperature + +#v_advec_thil = np.zeros((levels.size,time.size),dtype=float) +v_advec_thil = nc_fid.variables['v_advec_thetail'][:] #K/s +v_advec_thil = np.swapaxes(v_advec_thil, 0, 1) #swap the time and levels axis +#for t in range(time.size): +# v_advec_thil[:,t] = (ffc.p0/levels)**(ffc.R_dry/ffc.c_p)*v_advec_T[:,t] #convert to potential temperature + +dT_dt = np.zeros((levels.size,time.size),dtype=float) + +# h_advec_T = h_advec_T*86400.0 +# v_advec_T = v_advec_T*86400.0 +# dT_dt = dT_dt*86400.0 +# spr.contour_plot_firl(time, levels, h_advec_T, np.min(h_advec_T), np.max(h_advec_T), 'h advec T', 'time', 'pressure', 'h_advec_T.eps', y_inverted = True) +# spr.contour_plot_firl(time, levels, v_advec_T, np.min(v_advec_T), np.max(v_advec_T), 'v advec T', 'time', 'pressure', 'v_advec_T.eps', y_inverted = True) +# spr.contour_plot_firl(time, levels, dT_dt, np.min(dT_dt), np.max(dT_dt), 'total T tend', 'time', 'pressure', 'dT_dt.eps', y_inverted = True) + +#h_advec_qt = np.zeros((levels.size,time.size),dtype=float) +h_advec_qt = nc_fid.variables['h_advec_qt'][:] #kg/kg/s +h_advec_qt = np.swapaxes(h_advec_qt, 0, 1) #swap the time and levels axis +h_advec_qt = h_advec_qt/(1.0 + qt_mr)**2 #convert to specific humidity + +h_advec_qi = np.zeros((levels.size,time.size),dtype=float) +h_advec_ql = np.zeros((levels.size,time.size),dtype=float) + +#v_advec_qt = np.zeros((levels.size,time.size),dtype=float) +v_advec_qt = nc_fid.variables['v_advec_qt'][:] #kg/kg/s +v_advec_qt = np.swapaxes(v_advec_qt, 0, 1) #swap the time and levels axis +v_advec_qt = v_advec_qt/(1.0 + qt_mr)**2 #convert to specific humidity + +dq_dt = np.zeros((levels.size,time.size),dtype=float) +#dq_dt = nc_fid.variables['dqdt'][:] +#dq_dt = np.swapaxes(dq_dt, 0, 1)*1.0E-3/3600.0 #swap the time and levels axis, convert to K/s + +#h_advec_qt = h_advec_qt*86400.0 +#v_advec_qt = v_advec_qt*86400.0 +#dq_dt = dq_dt*86400.0 +#spr.contour_plot_firl(time, levels, h_advec_qt, np.min(h_advec_qt), np.max(h_advec_qt), 'h advec q', 'time', 'pressure', 'h_advec_q.eps', y_inverted = True) +#spr.contour_plot_firl(time, levels, v_advec_qt, np.min(v_advec_qt), np.max(v_advec_qt), 'v advec q', 'time', 'pressure', 'v_advec_q.eps', y_inverted = True) +#spr.contour_plot_firl(time, levels, dq_dt, np.min(dq_dt), np.max(dq_dt), 'total q tend', 'time', 'pressure', 'dq_dt.eps', y_inverted = True) + +#phi_sfc = nc_fid.variables['phis'][:] +#z_sfc = nc_fid.variables['alt'][:] +height = nc_fid.variables['height'][:] +#height = ffc.get_height_from_pres(T_abs[:,0],levels,z_sfc) + +#the following variables are not in this forcing file, but are included in other cases +soil_depth = np.zeros(4,dtype=float) +soil_depth[:] = [0.1, 0.4, 1.0, 2.0] + +#rad_heating = nc_fid.variables['dT_dt_rad'][:] #K/s +#rad_heating = np.swapaxes(rad_heating, 0, 1) #swap the time and levels axis +rad_heating = np.zeros((levels.size,time.size),dtype=float) +u_g = np.zeros((levels.size,time.size),dtype=float) +v_g = np.zeros((levels.size,time.size),dtype=float) + +ozone = np.zeros((levels.size,time.size),dtype=float) +ozone = ozone + 2.e-8 + +tiice = np.zeros((ice_thickness.size),dtype=float) +##tiice[0] = T_surf[start_t_index] +tiice[0] = 271.35 + .75*(T_surf[start_t_index] - 271.35) +tiice[1] = 271.35 + .25*(T_surf[start_t_index] - 271.35) +stc = tiice[0] +smc = 0.33 +slc = 0.33 +hice = 0.3 +slmsk = 2.0 #sea ice +tsfco = T_surf[start_t_index] +weasd = 200.0 #mm water equivalent snow depth +fice = 1.0 +tisfc = tsfco +snwdph = 2.e-4 +tg3 = 271.35 +zorl = 15.0 +alvsf = 0.06 +alnsf = 0.06 +alvwf = 0.06 +alnwf = 0.06 +facsf = 0.0 +facwf = 0.0 +vegfrac = 0.0 +canopy = 0.0 +vegtyp = 0 +soiltyp = 0 +scolor = 1 +uustar = 0.3828793 +shdmin = 0.0 +shdmax = 0.0 +slopetyp = 1 +snoalb = 0.0 +sncovr = 1.0 + +# Open ozone file +#f = open('../../data/raw_case_input/twpice_CRM_ozone.txt', 'r') + +# Read and ignore header lines +#header1 = f.readline() + +#oz_pres = [] +#oz_data = [] +# Loop over lines and extract variables of interest +#for line in f: +# line = line.strip() +# columns = line.split() +# oz_pres.append(float(columns[1])) +# oz_data.append(float(columns[2])) + +#f.close() + +#oz_pres = 100.0*np.array(oz_pres) +#oz_data = np.array(oz_data) +#oz_f = scipy.interpolate.interp1d(oz_pres, oz_data) +#ozone_ppb = oz_f(levels[1:].tolist()) +#ozone_ppb = np.insert(ozone_ppb, 0, oz_data[0]) +#ozone_mmr = ozone_ppb*1.0E-9 + +# +#open processed input file for writing + +writefile_fid = Dataset('../../data/processed_case_input/MOSAiC.nc', 'w', format='NETCDF4') +writefile_fid.description = "CCPP SCM forcing file for MOSAiC case" + +#create groups for scalars, intitialization, and forcing + +writefile_scalar_grp = writefile_fid.createGroup("scalars") +writefile_initial_grp = writefile_fid.createGroup("initial") +writefile_forcing_grp = writefile_fid.createGroup("forcing") + +#create dimensions and write them out + +writefile_time_dim = writefile_fid.createDimension('time', None) +writefile_time_var = writefile_fid.createVariable('time', 'f4', ('time',)) +writefile_time_var[:] = time[start_t_index:] +writefile_time_var.units = 's' +writefile_time_var.description = 'elapsed time since the beginning of the simulation' + +writefile_levels_dim = writefile_fid.createDimension('levels', None) +writefile_levels_var = writefile_fid.createVariable('levels', 'f4', ('levels',)) +writefile_levels_var[:] = levels +writefile_levels_var.units = 'Pa' +writefile_levels_var.description = 'pressure levels' + +writefile_soil_depth_dim = writefile_fid.createDimension('soil_depth', None) +writefile_soil_depth_var = writefile_fid.createVariable('soil_depth', 'f4', ('soil_depth',)) +writefile_soil_depth_var[:] = soil_depth[:] +writefile_soil_depth_var.units = 'm' +writefile_soil_depth_var.description = 'soil depth' + +writefile_ice_thickness_dim = writefile_fid.createDimension('ice_thickness', None) +writefile_ice_thickness_var = writefile_fid.createVariable('ice_thickness', 'f4', ('ice_thickness',)) +writefile_ice_thickness_var[:] = ice_thickness +writefile_ice_thickness_var.units = 'm' +writefile_ice_thickness_var.description = 'depth of ice layers' + +#create variables and write them out + +#scalar group + +writefile_lat_var = writefile_scalar_grp.createVariable('lat', 'f4') +writefile_lat_var[:] = lat +writefile_lat_var.units = 'degrees N' +writefile_lat_var.description = 'latitude of column' + +writefile_lon_var = writefile_scalar_grp.createVariable('lon', 'f4') +writefile_lon_var[:] = lon +writefile_lon_var.units = 'degrees E' +writefile_lon_var.description = 'longitude of column' + +writefile_hice_var = writefile_scalar_grp.createVariable('hice', 'f4') +writefile_hice_var[:] = hice +writefile_hice_var.units = 'm' +writefile_hice_var.description = 'sea ice thickness' + +writefile_slmsk_var = writefile_scalar_grp.createVariable('slmsk', 'f4') +writefile_slmsk_var[:] = slmsk +writefile_slmsk_var.units = '' +writefile_slmsk_var.description = 'land-sea-ice mask' + +writefile_tsfco_var = writefile_scalar_grp.createVariable('tsfco', 'f4') +writefile_tsfco_var[:] = tsfco +writefile_tsfco_var.units = 'm' +writefile_tsfco_var.description = 'sea ice surface skin temperature' + +writefile_weasd_var = writefile_scalar_grp.createVariable('weasd', 'f4') +writefile_weasd_var[:] = weasd +writefile_weasd_var.units = 'mm' +writefile_weasd_var.description = 'water equivalent accumulated snow depth' + +writefile_fice_var = writefile_scalar_grp.createVariable('fice', 'f4') +writefile_fice_var[:] = fice +writefile_fice_var.units = '1' +writefile_fice_var.description = 'ice fraction' + +writefile_tisfc_var = writefile_scalar_grp.createVariable('tisfc', 'f4') +writefile_tisfc_var[:] = tisfc +writefile_tisfc_var.units = 'K' +writefile_tisfc_var.description = 'ice surface temperature' + +writefile_snwdph_var = writefile_scalar_grp.createVariable('snwdph', 'f4') +writefile_snwdph_var[:] = snwdph +writefile_snwdph_var.units = 'mm' +writefile_snwdph_var.description = 'water equivalent snow depth' + +writefile_tg3_var = writefile_scalar_grp.createVariable('tg3', 'f4') +writefile_tg3_var[:] = tg3 +writefile_tg3_var.units = 'K' +writefile_tg3_var.description = 'deep soil temperature' + +writefile_zorl_var = writefile_scalar_grp.createVariable('zorl', 'f4') +writefile_zorl_var[:] = zorl +writefile_zorl_var.units = 'cm' +writefile_zorl_var.description = 'composite surface roughness length' + +writefile_zorll_var = writefile_scalar_grp.createVariable('zorll', 'f4') +writefile_zorll_var[:] = zorl +writefile_zorll_var.units = 'cm' +writefile_zorll_var.description = 'surface roughness length over land' + +writefile_zorlw_var = writefile_scalar_grp.createVariable('zorlw', 'f4') +writefile_zorlw_var[:] = zorl +writefile_zorlw_var.units = 'cm' +writefile_zorlw_var.description = 'surface roughness length over ocean' + +writefile_zorli_var = writefile_scalar_grp.createVariable('zorli', 'f4') +writefile_zorli_var[:] = zorl +writefile_zorli_var.units = 'cm' +writefile_zorli_var.description = 'surface roughness length over ice' + +writefile_alvsf_var = writefile_scalar_grp.createVariable('alvsf', 'f4') +writefile_alvsf_var[:] = alvsf +writefile_alvsf_var.units = '' +writefile_alvsf_var.description = '60 degree vis albedo with strong cosz dependency' + +writefile_alnsf_var = writefile_scalar_grp.createVariable('alnsf', 'f4') +writefile_alnsf_var[:] = alnsf +writefile_alnsf_var.units = '' +writefile_alnsf_var.description = '60 degree nir albedo with strong cosz dependency' + +writefile_alvwf_var = writefile_scalar_grp.createVariable('alvwf', 'f4') +writefile_alvwf_var[:] = alvwf +writefile_alvwf_var.units = '' +writefile_alvwf_var.description = '60 degree vis albedo with weak cosz dependency' + +writefile_alnwf_var = writefile_scalar_grp.createVariable('alnwf', 'f4') +writefile_alnwf_var[:] = alnwf +writefile_alnwf_var.units = '' +writefile_alnwf_var.description = '60 degree nir albedo with weak cosz dependency' + +writefile_facsf_var = writefile_scalar_grp.createVariable('facsf', 'f4') +writefile_facsf_var[:] = facsf +writefile_facsf_var.units = '' +writefile_facsf_var.description = 'fractional coverage with strong cosz dependency' + +writefile_facwf_var = writefile_scalar_grp.createVariable('facwf', 'f4') +writefile_facwf_var[:] = facwf +writefile_facwf_var.units = '' +writefile_facwf_var.description = 'fractional coverage with weak cosz dependency' + +writefile_vegfrac_var = writefile_scalar_grp.createVariable('vegfrac', 'f4') +writefile_vegfrac_var[:] = vegfrac +writefile_vegfrac_var.units = '1' +writefile_vegfrac_var.description = 'vegetation fraction' + +writefile_canopy_var = writefile_scalar_grp.createVariable('canopy', 'f4') +writefile_canopy_var[:] = canopy +writefile_canopy_var.units = 'kg m-2' +writefile_canopy_var.description = 'amount of water stored in camopy' + +writefile_vegtyp_var = writefile_scalar_grp.createVariable('vegtyp', 'f4') +writefile_vegtyp_var[:] = vegtyp +writefile_vegtyp_var.units = '' +writefile_vegtyp_var.description = 'vegetation type 1-12' + +writefile_soiltyp_var = writefile_scalar_grp.createVariable('soiltyp', 'f4') +writefile_soiltyp_var[:] = soiltyp +writefile_soiltyp_var.units = '' +writefile_soiltyp_var.description = 'soil type 1-12' + +writefile_scolor_var = writefile_scalar_grp.createVariable('scolor', 'f4') +writefile_scolor_var[:] = scolor +writefile_scolor_var.units = '' +writefile_scolor_var.description = 'soil color' + +writefile_uustar_var = writefile_scalar_grp.createVariable('uustar', 'f4') +writefile_uustar_var[:] = uustar +writefile_uustar_var.units = 'm s-1' +writefile_uustar_var.description = 'friction velocity' + +writefile_shdmin_var = writefile_scalar_grp.createVariable('shdmin', 'f4') +writefile_shdmin_var[:] = shdmin +writefile_shdmin_var.units = '1' +writefile_shdmin_var.description = 'minimum vegetation fraction' + +writefile_shdmax_var = writefile_scalar_grp.createVariable('shdmax', 'f4') +writefile_shdmax_var[:] = shdmax +writefile_shdmax_var.units = '1' +writefile_shdmax_var.description = 'maximum vegetation fraction' + +writefile_slopetyp_var = writefile_scalar_grp.createVariable('slopetyp', 'f4') +writefile_slopetyp_var[:] = slopetyp +writefile_slopetyp_var.units = '' +writefile_slopetyp_var.description = 'slope type 1-9' + +writefile_snoalb_var = writefile_scalar_grp.createVariable('snoalb', 'f4') +writefile_snoalb_var[:] = snoalb +writefile_snoalb_var.units = '1' +writefile_snoalb_var.description = 'maximum snow albedo' + +writefile_sncovr_var = writefile_scalar_grp.createVariable('sncovr', 'f4') +writefile_sncovr_var[:] = sncovr +writefile_sncovr_var.units = '1' +writefile_sncovr_var.description = 'surface snow area fraction' + +#initial group + +writefile_height_var = writefile_initial_grp.createVariable('height', 'f4', ('levels',)) +writefile_height_var[:] = height +writefile_height_var.units = 'm' +writefile_height_var.description = 'physical height at pressure levels' + +writefile_tiice_var = writefile_initial_grp.createVariable('tiice', 'f4', ('ice_thickness',)) +writefile_tiice_var[:] = tiice +writefile_tiice_var.units = 'K' +writefile_tiice_var.description = 'initial profile of sea ice internal temperature' + +writefile_stc_var = writefile_initial_grp.createVariable('stc', 'f4', ('soil_depth',)) +writefile_stc_var[:] = stc +writefile_stc_var.units = 'K' +writefile_stc_var.description = 'initial profile of sea ice internal temperature' + +writefile_smc_var = writefile_initial_grp.createVariable('smc', 'f4', ('soil_depth',)) +writefile_smc_var[:] = smc +writefile_smc_var.units = 'm3 m-3' +writefile_smc_var.description = 'initial profile of soil moisture' + +writefile_slc_var = writefile_initial_grp.createVariable('slc', 'f4', ('soil_depth',)) +writefile_slc_var[:] = slc +writefile_slc_var.units = 'm3 m-3' +writefile_slc_var.description = 'initial profile of soil liquid water' + +writefile_thetail_var = writefile_initial_grp.createVariable('thetail', 'f4', ('levels',)) +writefile_thetail_var[:] = thetail[:,start_t_index] +writefile_thetail_var.units = 'K' +writefile_thetail_var.description = 'initial profile of ice-liquid water potential temperature' + +writefile_qt_var = writefile_initial_grp.createVariable('qt', 'f4', ('levels',)) +writefile_qt_var[:] = qt[:,start_t_index] +writefile_qt_var.units = 'kg kg^-1' +writefile_qt_var.description = 'initial profile of total water specific humidity' + +writefile_ql_var = writefile_initial_grp.createVariable('ql', 'f4', ('levels',)) +writefile_ql_var[:] = ql[:,start_t_index] +writefile_ql_var.units = 'kg kg^-1' +writefile_ql_var.description = 'initial profile of liquid water specific humidity' + +writefile_qi_var = writefile_initial_grp.createVariable('qi', 'f4', ('levels',)) +writefile_qi_var[:] = qi[:,start_t_index] +writefile_qi_var.units = 'kg kg^-1' +writefile_qi_var.description = 'initial profile of ice water specific humidity' + +writefile_u_var = writefile_initial_grp.createVariable('u', 'f4', ('levels',)) +writefile_u_var[:] = u_wind[:,start_t_index] +writefile_u_var.units = 'm s^-1' +writefile_u_var.description = 'initial profile of E-W horizontal wind' + +writefile_v_var = writefile_initial_grp.createVariable('v', 'f4', ('levels',)) +writefile_v_var[:] = v_wind[:,start_t_index] +writefile_v_var.units = 'm s^-1' +writefile_v_var.description = 'initial profile of N-S horizontal wind' + +writefile_tke_var = writefile_initial_grp.createVariable('tke', 'f4', ('levels',)) +writefile_tke_var[:] = tke[:,start_t_index] +writefile_tke_var.units = 'm^2 s^-2' +writefile_tke_var.description = 'initial profile of turbulence kinetic energy' + +writefile_ozone_var = writefile_initial_grp.createVariable('ozone', 'f4', ('levels',)) +writefile_ozone_var[:] = ozone[:,start_t_index] +writefile_ozone_var.units = 'kg kg^-1' +writefile_ozone_var.description = 'initial profile of ozone mass mixing ratio' + +#forcing group + +writefile_p_surf_var = writefile_forcing_grp.createVariable('p_surf', 'f4', ('time',)) +writefile_p_surf_var[:] = p_surf[start_t_index:] +writefile_p_surf_var.units = 'Pa' +writefile_p_surf_var.description = 'surface pressure' + +writefile_T_surf_var = writefile_forcing_grp.createVariable('T_surf', 'f4', ('time',)) +writefile_T_surf_var[:] = T_surf[start_t_index:] +writefile_T_surf_var.units = 'K' +writefile_T_surf_var.description = 'surface absolute temperature' + +writefile_w_ls_var = writefile_forcing_grp.createVariable('w_ls', 'f4', ('levels','time',)) +writefile_w_ls_var[:] = w_sub[:,start_t_index:] +writefile_w_ls_var.units = 'm s^-1' +writefile_w_ls_var.description = 'large scale vertical velocity' + +writefile_omega_var = writefile_forcing_grp.createVariable('omega', 'f4', ('levels','time',)) +writefile_omega_var[:] = omega[:,start_t_index:] +writefile_omega_var.units = 'Pa s^-1' +writefile_omega_var.description = 'large scale pressure vertical velocity' + +writefile_u_g_var = writefile_forcing_grp.createVariable('u_g', 'f4', ('levels','time',)) +writefile_u_g_var[:] = u_g[:,start_t_index:] +writefile_u_g_var.units = 'm s^-1' +writefile_u_g_var.description = 'large scale geostrophic E-W wind' + +writefile_v_g_var = writefile_forcing_grp.createVariable('v_g', 'f4', ('levels','time',)) +writefile_v_g_var[:] = v_g[:,start_t_index:] +writefile_v_g_var.units = 'm s^-1' +writefile_v_g_var.description = 'large scale geostrophic N-S wind' + +writefile_u_nudge_var = writefile_forcing_grp.createVariable('u_nudge', 'f4', ('levels','time',)) +writefile_u_nudge_var[:] = u_wind[:,start_t_index:] +writefile_u_nudge_var.units = 'm s^-1' +writefile_u_nudge_var.description = 'E-W wind to nudge toward' + +writefile_v_nudge_var = writefile_forcing_grp.createVariable('v_nudge', 'f4', ('levels','time',)) +writefile_v_nudge_var[:] = v_wind[:,start_t_index:] +writefile_v_nudge_var.units = 'm s^-1' +writefile_v_nudge_var.description = 'N-S wind to nudge toward' + +writefile_T_nudge_var = writefile_forcing_grp.createVariable('T_nudge', 'f4', ('levels','time',)) +writefile_T_nudge_var[:] = T_abs[:,start_t_index:] +writefile_T_nudge_var.units = 'K' +writefile_T_nudge_var.description = 'absolute temperature to nudge toward' + +writefile_thil_nudge_var = writefile_forcing_grp.createVariable('thil_nudge', 'f4', ('levels','time',)) +writefile_thil_nudge_var[:] = thetailu[:,start_t_index:] +writefile_thil_nudge_var.units = 'K' +writefile_thil_nudge_var.description = 'potential temperature to nudge toward' + +writefile_qt_nudge_var = writefile_forcing_grp.createVariable('qt_nudge', 'f4', ('levels','time',)) +writefile_qt_nudge_var[:] = qtu[:,start_t_index:] +writefile_qt_nudge_var.units = 'kg kg^-1' +writefile_qt_nudge_var.description = 'q_t to nudge toward' + +writefile_qi_nudge_var = writefile_forcing_grp.createVariable('qi_nudge', 'f4', ('levels','time',)) +writefile_qi_nudge_var[:] = qi[:,start_t_index:] +writefile_qi_nudge_var.units = 'kg kg^-1' +writefile_qi_nudge_var.description = 'q_i to nudge toward' + +writefile_ql_nudge_var = writefile_forcing_grp.createVariable('ql_nudge', 'f4', ('levels','time',)) +writefile_ql_nudge_var[:] = ql[:,start_t_index:] +writefile_ql_nudge_var.units = 'kg kg^-1' +writefile_ql_nudge_var.description = 'q_l to nudge toward' + +writefile_rad_heating_var = writefile_forcing_grp.createVariable('dT_dt_rad', 'f4', ('levels','time',)) +writefile_rad_heating_var[:] = rad_heating[:,start_t_index:] +writefile_rad_heating_var.units = 'K s^-1' +writefile_rad_heating_var.description = 'prescribed radiative heating rate' + +writefile_h_advec_thil_var = writefile_forcing_grp.createVariable('h_advec_thetail', 'f4', ('levels','time',)) +writefile_h_advec_thil_var[:] = h_advec_thil[:,start_t_index:] +writefile_h_advec_thil_var.units = 'K s^-1' +writefile_h_advec_thil_var.description = 'prescribed theta_il tendency due to horizontal advection' + +writefile_v_advec_thil_var = writefile_forcing_grp.createVariable('v_advec_thetail', 'f4', ('levels','time',)) +writefile_v_advec_thil_var[:] = v_advec_thil[:,start_t_index:] +writefile_v_advec_thil_var.units = 'K s^-1' +writefile_v_advec_thil_var.description = 'prescribed theta_il tendency due to vertical advection' + +writefile_h_advec_qt_var = writefile_forcing_grp.createVariable('h_advec_qt', 'f4', ('levels','time',)) +writefile_h_advec_qt_var[:] = h_advec_qt[:,start_t_index:] +writefile_h_advec_qt_var.units = 'kg kg^-1 s^-1' +writefile_h_advec_qt_var.description = 'prescribed q_t tendency due to horizontal advection' + +writefile_h_advec_qi_var = writefile_forcing_grp.createVariable('h_advec_qi', 'f4', ('levels','time',)) +writefile_h_advec_qi_var[:] = h_advec_qi[:,start_t_index:] +writefile_h_advec_qi_var.units = 'kg kg^-1 s^-1' +writefile_h_advec_qi_var.description = 'prescribed q_i tendency due to horizontal advection' + +writefile_h_advec_ql_var = writefile_forcing_grp.createVariable('h_advec_ql', 'f4', ('levels','time',)) +writefile_h_advec_ql_var[:] = h_advec_ql[:,start_t_index:] +writefile_h_advec_ql_var.units = 'kg kg^-1 s^-1' +writefile_h_advec_ql_var.description = 'prescribed q_l tendency due to horizontal advection' + +writefile_v_advec_qt_var = writefile_forcing_grp.createVariable('v_advec_qt', 'f4', ('levels','time',)) +writefile_v_advec_qt_var[:] = v_advec_qt[:,start_t_index:] +writefile_v_advec_qt_var.units = 'kg kg^-1 s^-1' +writefile_v_advec_qt_var.description = 'prescribed q_t tendency due to vertical advection' + + +#close processed input file +writefile_fid.close() + +#close raw input file +nc_fid.close() diff --git a/scm/etc/scripts/MOSAiC_SS_forcing_file_generator.py b/scm/etc/scripts/MOSAiC_SS_forcing_file_generator.py new file mode 100755 index 000000000..514c4dfe2 --- /dev/null +++ b/scm/etc/scripts/MOSAiC_SS_forcing_file_generator.py @@ -0,0 +1,590 @@ +#!/usr/bin/env python + +from netCDF4 import Dataset +import numpy as np +import forcing_file_common as ffc +import scipy.interpolate +import scm_plotting_routines as spr + +#reload(ffc) + +#read in raw input file + +nc_fid = Dataset("../../data/raw_case_input/MOSAiC_2Mar20200Z_raw.nc", 'r') + +#ncdump to look at raw input file +#nc_attrs, nc_dims, nc_vars = ncdump(nc_fid, False) + +#netCDF how-to +#set attributes +#file_id.setncattr(file_id.variables['variable'].ncattr(), nc_fid.variables['time'].getncattr(ncattr)) +#get attributes +#file_id.variables['variable'].getncattr(index) + +#get raw input variables + +day = nc_fid.variables['day'][:] +hour = nc_fid.variables['hour'][:] +for t in range(day.size): + #find time index corresponding to October 29, 2019 at 0Z + if day[t] == 2 and hour[t] == 0: + start_t_index = t + break + +time = nc_fid.variables['time_offset'][:] #number of seconds since 00Z on 1/17/2006 (starts at 03Z) +#subtract the initial time_offset from all values to get elapsed time since the start of the simulation +time = time - time[start_t_index] +levels = nc_fid.variables['levels'][:] #pressure levels in mb +#convert levels to Pa +levels = 100.0*levels +ice_thickness = np.zeros((2),dtype=float) +#height = nc_fid.variables['alt'][:] +lat = nc_fid.variables['lat'][:] #degrees north +#convert latitutde to degrees north +lon = nc_fid.variables['lon'][:] #degrees east +#use upstream T +T_abs = nc_fid.variables['Tu'][:] #absolute temperature (time, lev) +T_abs = np.swapaxes(T_abs, 0, 1) +thetailu = nc_fid.variables['thetailu'][:] #theta_il (time, lev) +thetailu = np.swapaxes(thetailu, 0, 1) +#use unpstream theta instead of thetail +thetail = nc_fid.variables['thetail'][:] #theta (time, lev) +thetail = np.swapaxes(thetail, 0, 1) +#calculate theta_il from absolute temperature (assuming no condensate) +#thetal = np.zeros((levels.size,time.size),dtype=float) +#for t in range(time.size): +# thetal[:,t] = (ffc.p0/levels)**(ffc.R_dry/ffc.c_p)*T_abs[:,t] +qv = nc_fid.variables['qu'][:] #water vapor mixing ratio in kg/kg (time, lev) +qv = np.swapaxes(qv, 0, 1) +qt = np.zeros((levels.size,time.size),dtype=float) +qt_mr = nc_fid.variables['qt'][:] #water vapor mixing ratio in kg/kg (time, lev) +qt_mr = np.swapaxes(qt_mr, 0, 1) #swap the time and levels axis +qt = qt_mr/(1.0 + qt_mr) #convert to specific humidity from mixing ratio +qtu = np.zeros((levels.size,time.size),dtype=float) +#use upstream qv instead of qt +qtu_mr = nc_fid.variables['qtu'][:] #water vapor mixing ratio in kg/kg (time, lev) +qtu_mr = np.swapaxes(qtu_mr, 0, 1) #swap the time and levels axis +qtu = qtu_mr/(1.0 + qtu_mr) #convert to specific humidity from mixing ratio + +#ql and tke are not specified; set to zero +#ql = np.zeros((levels.size,time.size),dtype=float) +#qi = np.zeros((levels.size,time.size),dtype=float) +ql = nc_fid.variables['ql'][:] #ql (time, lev) +ql = np.swapaxes(ql, 0, 1) +qi = nc_fid.variables['qi'][:] #ql (time, lev) +qi = np.swapaxes(qi, 0, 1) +tke = np.zeros((levels.size,time.size),dtype=float) +# ozone_mmr = nc_fid.variables['o3mmr'][:] +u_wind = nc_fid.variables['u'][:] +u_wind = np.swapaxes(u_wind, 0, 1) #swap the time and levels axis +v_wind = nc_fid.variables['v'][:] +v_wind = np.swapaxes(v_wind, 0, 1) #swap the time and levels axis + +#w_sub = np.zeros((levels.size,time.size),dtype=float) +omega = nc_fid.variables['omega'][:] #vertical pressure velocity in Pa/s +omega = np.swapaxes(omega, 0, 1) #swap the time and levels axis +w_sub = nc_fid.variables['w'][:] #vertical velocity in m/s +w_sub = np.swapaxes(w_sub, 0, 1) #swap the time and levels axis +#convert to w +#for t in range(time.size): +# w_sub[:,t] = ffc.omega_to_w(omega[:,t],levels,T_abs[:,t]) + +T_surf = nc_fid.variables['T_skin'][:] +#T_surf = T_surf + 273.15 #convert to K +#T_surf = (29 + 273.15)*np.ones((time.size),dtype=float) #forcing instructions specify time-invariant 29 deg C. +p_surf = nc_fid.variables['p_srf'][:] #Pa +#p_surf = p_surf*100.0 #convert to Pa + +#h_advec_thil = np.zeros((levels.size,time.size),dtype=float) +h_advec_thil = nc_fid.variables['h_advec_thetail'][:] #K/s +h_advec_thil = np.swapaxes(h_advec_thil, 0, 1) #swap the time and levels axis +#for t in range(time.size): +# h_advec_thil[:,t] = (ffc.p0/levels)**(ffc.R_dry/ffc.c_p)*h_advec_T[:,t] #convert to potential temperature + +#v_advec_thil = np.zeros((levels.size,time.size),dtype=float) +v_advec_thil = nc_fid.variables['v_advec_thetail'][:] #K/s +v_advec_thil = np.swapaxes(v_advec_thil, 0, 1) #swap the time and levels axis +#for t in range(time.size): +# v_advec_thil[:,t] = (ffc.p0/levels)**(ffc.R_dry/ffc.c_p)*v_advec_T[:,t] #convert to potential temperature + +dT_dt = np.zeros((levels.size,time.size),dtype=float) + +# h_advec_T = h_advec_T*86400.0 +# v_advec_T = v_advec_T*86400.0 +# dT_dt = dT_dt*86400.0 +# spr.contour_plot_firl(time, levels, h_advec_T, np.min(h_advec_T), np.max(h_advec_T), 'h advec T', 'time', 'pressure', 'h_advec_T.eps', y_inverted = True) +# spr.contour_plot_firl(time, levels, v_advec_T, np.min(v_advec_T), np.max(v_advec_T), 'v advec T', 'time', 'pressure', 'v_advec_T.eps', y_inverted = True) +# spr.contour_plot_firl(time, levels, dT_dt, np.min(dT_dt), np.max(dT_dt), 'total T tend', 'time', 'pressure', 'dT_dt.eps', y_inverted = True) + +#h_advec_qt = np.zeros((levels.size,time.size),dtype=float) +h_advec_qt = nc_fid.variables['h_advec_qt'][:] #kg/kg/s +h_advec_qt = np.swapaxes(h_advec_qt, 0, 1) #swap the time and levels axis +h_advec_qt = h_advec_qt/(1.0 + qt_mr)**2 #convert to specific humidity + +h_advec_qi = np.zeros((levels.size,time.size),dtype=float) +h_advec_ql = np.zeros((levels.size,time.size),dtype=float) + +#v_advec_qt = np.zeros((levels.size,time.size),dtype=float) +v_advec_qt = nc_fid.variables['v_advec_qt'][:] #kg/kg/s +v_advec_qt = np.swapaxes(v_advec_qt, 0, 1) #swap the time and levels axis +v_advec_qt = v_advec_qt/(1.0 + qt_mr)**2 #convert to specific humidity + +dq_dt = np.zeros((levels.size,time.size),dtype=float) +#dq_dt = nc_fid.variables['dqdt'][:] +#dq_dt = np.swapaxes(dq_dt, 0, 1)*1.0E-3/3600.0 #swap the time and levels axis, convert to K/s + +#h_advec_qt = h_advec_qt*86400.0 +#v_advec_qt = v_advec_qt*86400.0 +#dq_dt = dq_dt*86400.0 +#spr.contour_plot_firl(time, levels, h_advec_qt, np.min(h_advec_qt), np.max(h_advec_qt), 'h advec q', 'time', 'pressure', 'h_advec_q.eps', y_inverted = True) +#spr.contour_plot_firl(time, levels, v_advec_qt, np.min(v_advec_qt), np.max(v_advec_qt), 'v advec q', 'time', 'pressure', 'v_advec_q.eps', y_inverted = True) +#spr.contour_plot_firl(time, levels, dq_dt, np.min(dq_dt), np.max(dq_dt), 'total q tend', 'time', 'pressure', 'dq_dt.eps', y_inverted = True) + +#phi_sfc = nc_fid.variables['phis'][:] +#z_sfc = nc_fid.variables['alt'][:] +height = nc_fid.variables['height'][:] +#height = ffc.get_height_from_pres(T_abs[:,0],levels,z_sfc) + +#the following variables are not in this forcing file, but are included in other cases +soil_depth = np.zeros(4,dtype=float) +soil_depth[:] = [0.1, 0.4, 1.0, 2.0] + +#rad_heating = nc_fid.variables['dT_dt_rad'][:] #K/s +#rad_heating = np.swapaxes(rad_heating, 0, 1) #swap the time and levels axis +rad_heating = np.zeros((levels.size,time.size),dtype=float) +u_g = np.zeros((levels.size,time.size),dtype=float) +v_g = np.zeros((levels.size,time.size),dtype=float) + +ozone = np.zeros((levels.size,time.size),dtype=float) +ozone = ozone + 2.e-8 + +tiice = np.zeros((ice_thickness.size),dtype=float) +##tiice[0] = T_surf[start_t_index] +tiice[0] = 271.35 + .75*(T_surf[start_t_index] - 271.35) +tiice[1] = 271.35 + .25*(T_surf[start_t_index] - 271.35) +stc = tiice[0] +smc = 0.33 +slc = 0.33 +hice = 0.3 +slmsk = 2.0 #sea ice +tsfco = T_surf[start_t_index] +weasd = 200.0 #mm water equivalent snow depth +fice = 1.0 +tisfc = tsfco +snwdph = 2.e-4 +tg3 = 271.35 +zorl = 15.0 +alvsf = 0.06 +alnsf = 0.06 +alvwf = 0.06 +alnwf = 0.06 +facsf = 0.0 +facwf = 0.0 +vegfrac = 0.0 +canopy = 0.0 +vegtyp = 0 +soiltyp = 0 +scolor = 1 +uustar = 0.3828793 +shdmin = 0.0 +shdmax = 0.0 +slopetyp = 1 +snoalb = 0.0 +sncovr = 1.0 + +# Open ozone file +#f = open('../../data/raw_case_input/twpice_CRM_ozone.txt', 'r') + +# Read and ignore header lines +#header1 = f.readline() + +#oz_pres = [] +#oz_data = [] +# Loop over lines and extract variables of interest +#for line in f: +# line = line.strip() +# columns = line.split() +# oz_pres.append(float(columns[1])) +# oz_data.append(float(columns[2])) + +#f.close() + +#oz_pres = 100.0*np.array(oz_pres) +#oz_data = np.array(oz_data) +#oz_f = scipy.interpolate.interp1d(oz_pres, oz_data) +#ozone_ppb = oz_f(levels[1:].tolist()) +#ozone_ppb = np.insert(ozone_ppb, 0, oz_data[0]) +#ozone_mmr = ozone_ppb*1.0E-9 + +# +#open processed input file for writing + +writefile_fid = Dataset('../../data/processed_case_input/MOSAiC.nc', 'w', format='NETCDF4') +writefile_fid.description = "CCPP SCM forcing file for MOSAiC case" + +#create groups for scalars, intitialization, and forcing + +writefile_scalar_grp = writefile_fid.createGroup("scalars") +writefile_initial_grp = writefile_fid.createGroup("initial") +writefile_forcing_grp = writefile_fid.createGroup("forcing") + +#create dimensions and write them out + +writefile_time_dim = writefile_fid.createDimension('time', None) +writefile_time_var = writefile_fid.createVariable('time', 'f4', ('time',)) +writefile_time_var[:] = time[start_t_index:] +writefile_time_var.units = 's' +writefile_time_var.description = 'elapsed time since the beginning of the simulation' + +writefile_levels_dim = writefile_fid.createDimension('levels', None) +writefile_levels_var = writefile_fid.createVariable('levels', 'f4', ('levels',)) +writefile_levels_var[:] = levels +writefile_levels_var.units = 'Pa' +writefile_levels_var.description = 'pressure levels' + +writefile_soil_depth_dim = writefile_fid.createDimension('soil_depth', None) +writefile_soil_depth_var = writefile_fid.createVariable('soil_depth', 'f4', ('soil_depth',)) +writefile_soil_depth_var[:] = soil_depth[:] +writefile_soil_depth_var.units = 'm' +writefile_soil_depth_var.description = 'soil depth' + +writefile_ice_thickness_dim = writefile_fid.createDimension('ice_thickness', None) +writefile_ice_thickness_var = writefile_fid.createVariable('ice_thickness', 'f4', ('ice_thickness',)) +writefile_ice_thickness_var[:] = ice_thickness +writefile_ice_thickness_var.units = 'm' +writefile_ice_thickness_var.description = 'depth of ice layers' + +#create variables and write them out + +#scalar group + +writefile_lat_var = writefile_scalar_grp.createVariable('lat', 'f4') +writefile_lat_var[:] = lat +writefile_lat_var.units = 'degrees N' +writefile_lat_var.description = 'latitude of column' + +writefile_lon_var = writefile_scalar_grp.createVariable('lon', 'f4') +writefile_lon_var[:] = lon +writefile_lon_var.units = 'degrees E' +writefile_lon_var.description = 'longitude of column' + +writefile_hice_var = writefile_scalar_grp.createVariable('hice', 'f4') +writefile_hice_var[:] = hice +writefile_hice_var.units = 'm' +writefile_hice_var.description = 'sea ice thickness' + +writefile_slmsk_var = writefile_scalar_grp.createVariable('slmsk', 'f4') +writefile_slmsk_var[:] = slmsk +writefile_slmsk_var.units = '' +writefile_slmsk_var.description = 'land-sea-ice mask' + +writefile_tsfco_var = writefile_scalar_grp.createVariable('tsfco', 'f4') +writefile_tsfco_var[:] = tsfco +writefile_tsfco_var.units = 'm' +writefile_tsfco_var.description = 'sea ice surface skin temperature' + +writefile_weasd_var = writefile_scalar_grp.createVariable('weasd', 'f4') +writefile_weasd_var[:] = weasd +writefile_weasd_var.units = 'mm' +writefile_weasd_var.description = 'water equivalent accumulated snow depth' + +writefile_fice_var = writefile_scalar_grp.createVariable('fice', 'f4') +writefile_fice_var[:] = fice +writefile_fice_var.units = '1' +writefile_fice_var.description = 'ice fraction' + +writefile_tisfc_var = writefile_scalar_grp.createVariable('tisfc', 'f4') +writefile_tisfc_var[:] = tisfc +writefile_tisfc_var.units = 'K' +writefile_tisfc_var.description = 'ice surface temperature' + +writefile_snwdph_var = writefile_scalar_grp.createVariable('snwdph', 'f4') +writefile_snwdph_var[:] = snwdph +writefile_snwdph_var.units = 'mm' +writefile_snwdph_var.description = 'water equivalent snow depth' + +writefile_tg3_var = writefile_scalar_grp.createVariable('tg3', 'f4') +writefile_tg3_var[:] = tg3 +writefile_tg3_var.units = 'K' +writefile_tg3_var.description = 'deep soil temperature' + +writefile_zorl_var = writefile_scalar_grp.createVariable('zorl', 'f4') +writefile_zorl_var[:] = zorl +writefile_zorl_var.units = 'cm' +writefile_zorl_var.description = 'composite surface roughness length' + +writefile_zorll_var = writefile_scalar_grp.createVariable('zorll', 'f4') +writefile_zorll_var[:] = zorl +writefile_zorll_var.units = 'cm' +writefile_zorll_var.description = 'surface roughness length over land' + +writefile_zorlw_var = writefile_scalar_grp.createVariable('zorlw', 'f4') +writefile_zorlw_var[:] = zorl +writefile_zorlw_var.units = 'cm' +writefile_zorlw_var.description = 'surface roughness length over ocean' + +writefile_zorli_var = writefile_scalar_grp.createVariable('zorli', 'f4') +writefile_zorli_var[:] = zorl +writefile_zorli_var.units = 'cm' +writefile_zorli_var.description = 'surface roughness length over ice' + +writefile_alvsf_var = writefile_scalar_grp.createVariable('alvsf', 'f4') +writefile_alvsf_var[:] = alvsf +writefile_alvsf_var.units = '' +writefile_alvsf_var.description = '60 degree vis albedo with strong cosz dependency' + +writefile_alnsf_var = writefile_scalar_grp.createVariable('alnsf', 'f4') +writefile_alnsf_var[:] = alnsf +writefile_alnsf_var.units = '' +writefile_alnsf_var.description = '60 degree nir albedo with strong cosz dependency' + +writefile_alvwf_var = writefile_scalar_grp.createVariable('alvwf', 'f4') +writefile_alvwf_var[:] = alvwf +writefile_alvwf_var.units = '' +writefile_alvwf_var.description = '60 degree vis albedo with weak cosz dependency' + +writefile_alnwf_var = writefile_scalar_grp.createVariable('alnwf', 'f4') +writefile_alnwf_var[:] = alnwf +writefile_alnwf_var.units = '' +writefile_alnwf_var.description = '60 degree nir albedo with weak cosz dependency' + +writefile_facsf_var = writefile_scalar_grp.createVariable('facsf', 'f4') +writefile_facsf_var[:] = facsf +writefile_facsf_var.units = '' +writefile_facsf_var.description = 'fractional coverage with strong cosz dependency' + +writefile_facwf_var = writefile_scalar_grp.createVariable('facwf', 'f4') +writefile_facwf_var[:] = facwf +writefile_facwf_var.units = '' +writefile_facwf_var.description = 'fractional coverage with weak cosz dependency' + +writefile_vegfrac_var = writefile_scalar_grp.createVariable('vegfrac', 'f4') +writefile_vegfrac_var[:] = vegfrac +writefile_vegfrac_var.units = '1' +writefile_vegfrac_var.description = 'vegetation fraction' + +writefile_canopy_var = writefile_scalar_grp.createVariable('canopy', 'f4') +writefile_canopy_var[:] = canopy +writefile_canopy_var.units = 'kg m-2' +writefile_canopy_var.description = 'amount of water stored in camopy' + +writefile_vegtyp_var = writefile_scalar_grp.createVariable('vegtyp', 'f4') +writefile_vegtyp_var[:] = vegtyp +writefile_vegtyp_var.units = '' +writefile_vegtyp_var.description = 'vegetation type 1-12' + +writefile_soiltyp_var = writefile_scalar_grp.createVariable('soiltyp', 'f4') +writefile_soiltyp_var[:] = soiltyp +writefile_soiltyp_var.units = '' +writefile_soiltyp_var.description = 'soil type 1-12' + +writefile_scolor_var = writefile_scalar_grp.createVariable('scolor', 'f4') +writefile_scolor_var[:] = scolor +writefile_scolor_var.units = '' +writefile_scolor_var.description = 'soil color' + +writefile_uustar_var = writefile_scalar_grp.createVariable('uustar', 'f4') +writefile_uustar_var[:] = uustar +writefile_uustar_var.units = 'm s-1' +writefile_uustar_var.description = 'friction velocity' + +writefile_shdmin_var = writefile_scalar_grp.createVariable('shdmin', 'f4') +writefile_shdmin_var[:] = shdmin +writefile_shdmin_var.units = '1' +writefile_shdmin_var.description = 'minimum vegetation fraction' + +writefile_shdmax_var = writefile_scalar_grp.createVariable('shdmax', 'f4') +writefile_shdmax_var[:] = shdmax +writefile_shdmax_var.units = '1' +writefile_shdmax_var.description = 'maximum vegetation fraction' + +writefile_slopetyp_var = writefile_scalar_grp.createVariable('slopetyp', 'f4') +writefile_slopetyp_var[:] = slopetyp +writefile_slopetyp_var.units = '' +writefile_slopetyp_var.description = 'slope type 1-9' + +writefile_snoalb_var = writefile_scalar_grp.createVariable('snoalb', 'f4') +writefile_snoalb_var[:] = snoalb +writefile_snoalb_var.units = '1' +writefile_snoalb_var.description = 'maximum snow albedo' + +writefile_sncovr_var = writefile_scalar_grp.createVariable('sncovr', 'f4') +writefile_sncovr_var[:] = sncovr +writefile_sncovr_var.units = '1' +writefile_sncovr_var.description = 'surface snow area fraction' + +#initial group + +writefile_height_var = writefile_initial_grp.createVariable('height', 'f4', ('levels',)) +writefile_height_var[:] = height +writefile_height_var.units = 'm' +writefile_height_var.description = 'physical height at pressure levels' + +writefile_tiice_var = writefile_initial_grp.createVariable('tiice', 'f4', ('ice_thickness',)) +writefile_tiice_var[:] = tiice +writefile_tiice_var.units = 'K' +writefile_tiice_var.description = 'initial profile of sea ice internal temperature' + +writefile_stc_var = writefile_initial_grp.createVariable('stc', 'f4', ('soil_depth',)) +writefile_stc_var[:] = stc +writefile_stc_var.units = 'K' +writefile_stc_var.description = 'initial profile of sea ice internal temperature' + +writefile_smc_var = writefile_initial_grp.createVariable('smc', 'f4', ('soil_depth',)) +writefile_smc_var[:] = smc +writefile_smc_var.units = 'm3 m-3' +writefile_smc_var.description = 'initial profile of soil moisture' + +writefile_slc_var = writefile_initial_grp.createVariable('slc', 'f4', ('soil_depth',)) +writefile_slc_var[:] = slc +writefile_slc_var.units = 'm3 m-3' +writefile_slc_var.description = 'initial profile of soil liquid water' + +writefile_thetail_var = writefile_initial_grp.createVariable('thetail', 'f4', ('levels',)) +writefile_thetail_var[:] = thetail[:,start_t_index] +writefile_thetail_var.units = 'K' +writefile_thetail_var.description = 'initial profile of ice-liquid water potential temperature' + +writefile_qt_var = writefile_initial_grp.createVariable('qt', 'f4', ('levels',)) +writefile_qt_var[:] = qt[:,start_t_index] +writefile_qt_var.units = 'kg kg^-1' +writefile_qt_var.description = 'initial profile of total water specific humidity' + +writefile_ql_var = writefile_initial_grp.createVariable('ql', 'f4', ('levels',)) +writefile_ql_var[:] = ql[:,start_t_index] +writefile_ql_var.units = 'kg kg^-1' +writefile_ql_var.description = 'initial profile of liquid water specific humidity' + +writefile_qi_var = writefile_initial_grp.createVariable('qi', 'f4', ('levels',)) +writefile_qi_var[:] = qi[:,start_t_index] +writefile_qi_var.units = 'kg kg^-1' +writefile_qi_var.description = 'initial profile of ice water specific humidity' + +writefile_u_var = writefile_initial_grp.createVariable('u', 'f4', ('levels',)) +writefile_u_var[:] = u_wind[:,start_t_index] +writefile_u_var.units = 'm s^-1' +writefile_u_var.description = 'initial profile of E-W horizontal wind' + +writefile_v_var = writefile_initial_grp.createVariable('v', 'f4', ('levels',)) +writefile_v_var[:] = v_wind[:,start_t_index] +writefile_v_var.units = 'm s^-1' +writefile_v_var.description = 'initial profile of N-S horizontal wind' + +writefile_tke_var = writefile_initial_grp.createVariable('tke', 'f4', ('levels',)) +writefile_tke_var[:] = tke[:,start_t_index] +writefile_tke_var.units = 'm^2 s^-2' +writefile_tke_var.description = 'initial profile of turbulence kinetic energy' + +writefile_ozone_var = writefile_initial_grp.createVariable('ozone', 'f4', ('levels',)) +writefile_ozone_var[:] = ozone[:,start_t_index] +writefile_ozone_var.units = 'kg kg^-1' +writefile_ozone_var.description = 'initial profile of ozone mass mixing ratio' + +#forcing group + +writefile_p_surf_var = writefile_forcing_grp.createVariable('p_surf', 'f4', ('time',)) +writefile_p_surf_var[:] = p_surf[start_t_index:] +writefile_p_surf_var.units = 'Pa' +writefile_p_surf_var.description = 'surface pressure' + +writefile_T_surf_var = writefile_forcing_grp.createVariable('T_surf', 'f4', ('time',)) +writefile_T_surf_var[:] = T_surf[start_t_index:] +writefile_T_surf_var.units = 'K' +writefile_T_surf_var.description = 'surface absolute temperature' + +writefile_w_ls_var = writefile_forcing_grp.createVariable('w_ls', 'f4', ('levels','time',)) +writefile_w_ls_var[:] = w_sub[:,start_t_index:] +writefile_w_ls_var.units = 'm s^-1' +writefile_w_ls_var.description = 'large scale vertical velocity' + +writefile_omega_var = writefile_forcing_grp.createVariable('omega', 'f4', ('levels','time',)) +writefile_omega_var[:] = omega[:,start_t_index:] +writefile_omega_var.units = 'Pa s^-1' +writefile_omega_var.description = 'large scale pressure vertical velocity' + +writefile_u_g_var = writefile_forcing_grp.createVariable('u_g', 'f4', ('levels','time',)) +writefile_u_g_var[:] = u_g[:,start_t_index:] +writefile_u_g_var.units = 'm s^-1' +writefile_u_g_var.description = 'large scale geostrophic E-W wind' + +writefile_v_g_var = writefile_forcing_grp.createVariable('v_g', 'f4', ('levels','time',)) +writefile_v_g_var[:] = v_g[:,start_t_index:] +writefile_v_g_var.units = 'm s^-1' +writefile_v_g_var.description = 'large scale geostrophic N-S wind' + +writefile_u_nudge_var = writefile_forcing_grp.createVariable('u_nudge', 'f4', ('levels','time',)) +writefile_u_nudge_var[:] = u_wind[:,start_t_index:] +writefile_u_nudge_var.units = 'm s^-1' +writefile_u_nudge_var.description = 'E-W wind to nudge toward' + +writefile_v_nudge_var = writefile_forcing_grp.createVariable('v_nudge', 'f4', ('levels','time',)) +writefile_v_nudge_var[:] = v_wind[:,start_t_index:] +writefile_v_nudge_var.units = 'm s^-1' +writefile_v_nudge_var.description = 'N-S wind to nudge toward' + +writefile_T_nudge_var = writefile_forcing_grp.createVariable('T_nudge', 'f4', ('levels','time',)) +writefile_T_nudge_var[:] = T_abs[:,start_t_index:] +writefile_T_nudge_var.units = 'K' +writefile_T_nudge_var.description = 'absolute temperature to nudge toward' + +writefile_thil_nudge_var = writefile_forcing_grp.createVariable('thil_nudge', 'f4', ('levels','time',)) +writefile_thil_nudge_var[:] = thetailu[:,start_t_index:] +writefile_thil_nudge_var.units = 'K' +writefile_thil_nudge_var.description = 'potential temperature to nudge toward' + +writefile_qt_nudge_var = writefile_forcing_grp.createVariable('qt_nudge', 'f4', ('levels','time',)) +writefile_qt_nudge_var[:] = qtu[:,start_t_index:] +writefile_qt_nudge_var.units = 'kg kg^-1' +writefile_qt_nudge_var.description = 'q_t to nudge toward' + +writefile_qi_nudge_var = writefile_forcing_grp.createVariable('qi_nudge', 'f4', ('levels','time',)) +writefile_qi_nudge_var[:] = qi[:,start_t_index:] +writefile_qi_nudge_var.units = 'kg kg^-1' +writefile_qi_nudge_var.description = 'q_i to nudge toward' + +writefile_ql_nudge_var = writefile_forcing_grp.createVariable('ql_nudge', 'f4', ('levels','time',)) +writefile_ql_nudge_var[:] = ql[:,start_t_index:] +writefile_ql_nudge_var.units = 'kg kg^-1' +writefile_ql_nudge_var.description = 'q_l to nudge toward' + +writefile_rad_heating_var = writefile_forcing_grp.createVariable('dT_dt_rad', 'f4', ('levels','time',)) +writefile_rad_heating_var[:] = rad_heating[:,start_t_index:] +writefile_rad_heating_var.units = 'K s^-1' +writefile_rad_heating_var.description = 'prescribed radiative heating rate' + +writefile_h_advec_thil_var = writefile_forcing_grp.createVariable('h_advec_thetail', 'f4', ('levels','time',)) +writefile_h_advec_thil_var[:] = h_advec_thil[:,start_t_index:] +writefile_h_advec_thil_var.units = 'K s^-1' +writefile_h_advec_thil_var.description = 'prescribed theta_il tendency due to horizontal advection' + +writefile_v_advec_thil_var = writefile_forcing_grp.createVariable('v_advec_thetail', 'f4', ('levels','time',)) +writefile_v_advec_thil_var[:] = v_advec_thil[:,start_t_index:] +writefile_v_advec_thil_var.units = 'K s^-1' +writefile_v_advec_thil_var.description = 'prescribed theta_il tendency due to vertical advection' + +writefile_h_advec_qt_var = writefile_forcing_grp.createVariable('h_advec_qt', 'f4', ('levels','time',)) +writefile_h_advec_qt_var[:] = h_advec_qt[:,start_t_index:] +writefile_h_advec_qt_var.units = 'kg kg^-1 s^-1' +writefile_h_advec_qt_var.description = 'prescribed q_t tendency due to horizontal advection' + +writefile_h_advec_qi_var = writefile_forcing_grp.createVariable('h_advec_qi', 'f4', ('levels','time',)) +writefile_h_advec_qi_var[:] = h_advec_qi[:,start_t_index:] +writefile_h_advec_qi_var.units = 'kg kg^-1 s^-1' +writefile_h_advec_qi_var.description = 'prescribed q_i tendency due to horizontal advection' + +writefile_h_advec_ql_var = writefile_forcing_grp.createVariable('h_advec_ql', 'f4', ('levels','time',)) +writefile_h_advec_ql_var[:] = h_advec_ql[:,start_t_index:] +writefile_h_advec_ql_var.units = 'kg kg^-1 s^-1' +writefile_h_advec_ql_var.description = 'prescribed q_l tendency due to horizontal advection' + +writefile_v_advec_qt_var = writefile_forcing_grp.createVariable('v_advec_qt', 'f4', ('levels','time',)) +writefile_v_advec_qt_var[:] = v_advec_qt[:,start_t_index:] +writefile_v_advec_qt_var.units = 'kg kg^-1 s^-1' +writefile_v_advec_qt_var.description = 'prescribed q_t tendency due to vertical advection' + + +#close processed input file +writefile_fid.close() + +#close raw input file +nc_fid.close() diff --git a/scm/etc/scripts/dephy_converter.py b/scm/etc/scripts/dephy_converter.py new file mode 100755 index 000000000..3a803ec21 --- /dev/null +++ b/scm/etc/scripts/dephy_converter.py @@ -0,0 +1,2550 @@ +#!/usr/bin/env python + +import argparse +import logging +import f90nml +import os +from netCDF4 import Dataset +import numpy as np +from datetime import datetime, timedelta + + +############################################################################### +# Global settings # +############################################################################### + +# Path to the directory containing processed case input files +CASE_NML_DIR = '../case_config' + +# Path to the directory containing processed case input files +PROCESSED_CASE_DIR = '../../data/processed_case_input' + +# For developers: set logging level to DEBUG for additional output +#LOGLEVEL = logging.DEBUG +LOGLEVEL = logging.INFO + +DEFAULT_MISSING_VALUE = -9999.0 +DEFAULT_NUDGING_TIMESCALE = 7200.0 #s + +############################################################################### +# Command line arguments # +############################################################################### + +parser = argparse.ArgumentParser() +parser.add_argument('-n', '--case_name', help='name of case', required=True) +parser.add_argument('-a', '--use_area', help='use column_area namelist attribute as forcing_scale', action='store_true') +parser.add_argument('-d', '--debug', help='enable debugging output', action='store_true') + + +######################################################################################## +# +######################################################################################## +def parse_arguments(): + """Parse command line arguments""" + args = parser.parse_args() + + return (args.case_name, args.use_area, args.debug) + +######################################################################################## +# +######################################################################################## +def setup_logging(debug): + """Sets up the logging module.""" + if debug: + logging.basicConfig(format='%(levelname)s: %(message)s', level=logging.DEBUG) + else: + logging.basicConfig(format='%(levelname)s: %(message)s', level=logging.INFO) + +class Case_Data(object): + def __init__(self, name, missing_value, time, levels, soil_depth, lat, lon, slmsk, vegsrc, vegtyp, soiltyp, \ + scolor, slopetyp, tsfco, vegfrac, shdmin, shdmax, canopy, hice, fice, tisfc, snowd, snoalb, tg3, \ + uustar, alvsf, alnsf, alvwf, alnwf, facsf, facwf, weasd, f10m, t2m, q2m, ffmm, ffhh, \ + tprcp, srflag, sncovr, tsfcl, zorl, zorll, zorli, zorlw, zorlwav, tvxy, tgxy, tahxy, canicexy, canliqxy, eahxy, \ + cmxy, chxy, fwetxy, sneqvoxy, alboldxy, qsnowxy, wslakexy, taussxy, waxy, wtxy, zwtxy, xlaixy, xsaixy, \ + lfmassxy, stmassxy, rtmassxy, woodxy, stblcpxy, fastcpxy, smcwtdxy, deeprechxy, rechxy, snowxy, \ + wetness, clw_surf_land, clw_surf_ice, qwv_surf_land, qwv_surf_ice, tsnow_land, tsnow_ice, \ + snowfallac_land, snowfallac_ice, sncovr_ice, sfalb_lnd, sfalb_lnd_bck, emis_ice, lai, area, \ + stddev, convexity, oa1, oa2, oa3, oa4, ol1, ol2, ol3, ol4, theta_oro, gamma, sigma, elvmax, \ + oro, oro_uf, landfrac, lakefrac, lakedepth, tref, z_c, c_0, c_d, w_0, w_d, xt, xs, xu, xv, xz, zm, \ + xtts, xzts, d_conv, ifd, dt_cool, qrain, height, theta_il, t,\ + qt, ql, qi, u, v, tke, ozone, stc, smc, slc, snicexy, snliqxy, tsnoxy, smoiseq, zsnsoxy, tiice, \ + tslb, smois, sh2o, smfr, flfr, \ + p_surf, T_surf, w_ls, omega, u_g, v_g, u_nudge, v_nudge, T_nudge, thil_nudge, qt_nudge, \ + dT_dt_rad, h_advec_thil, v_advec_thil, h_advec_qt, v_advec_qt, sh_flux_sfc, lh_flux_sfc): + self._name = name + self._missing_value = missing_value + #dimensions + self._time = time + self._levels = levels + self._soil_depth = soil_depth + #scalars + self._lat = lat + self._lon = lon + #NOAH LSM scalars + self._slmsk = slmsk + self._vegsrc = vegsrc + self._vegtyp = vegtyp + self._soiltyp = soiltyp + self._scolor = scolor + self._slopetyp = slopetyp + self._tsfco = tsfco + self._vegfrac = vegfrac + self._shdmin = shdmin + self._shdmax = shdmax + self._canopy = canopy + self._hice = hice + self._fice = fice + self._tisfc = tisfc + self._snowd = snowd + self._snoalb = snoalb + self._tg3 = tg3 + self._uustar = uustar + self._alvsf = alvsf + self._alnsf = alnsf + self._alvwf = alvwf + self._alnwf = alnwf + self._facsf = facsf + self._facwf = facwf + self._weasd = weasd + self._f10m = f10m + self._t2m = t2m + self._q2m = q2m + self._ffmm = ffmm + self._ffhh = ffhh + self._tprcp = tprcp + self._srflag = srflag + self._sncovr = sncovr + self._tsfcl = tsfcl + self._zorl = zorl + self._zorll = zorll + self._zorli = zorli + self._zorlw = zorlw + self._zorlwav = zorlwav + self._area = area + #NOAHMP scalars + self._tvxy = tvxy + self._tgxy = tgxy + self._tahxy = tahxy + self._canicexy = canicexy + self._canliqxy = canliqxy + self._eahxy = eahxy + self._cmxy = cmxy + self._chxy = chxy + self._fwetxy = fwetxy + self._sneqvoxy = sneqvoxy + self._alboldxy = alboldxy + self._qsnowxy = qsnowxy + self._wslakexy = wslakexy + self._taussxy = taussxy + self._waxy = waxy + self._wtxy = wtxy + self._zwtxy = zwtxy + self._xlaixy = xlaixy + self._xsaixy = xsaixy + self._lfmassxy = lfmassxy + self._stmassxy = stmassxy + self._rtmassxy = rtmassxy + self._woodxy = woodxy + self._stblcpxy = stblcpxy + self._fastcpxy = fastcpxy + self._smcwtdxy = smcwtdxy + self._deeprechxy = deeprechxy + self._rechxy = rechxy + self._snowxy = snowxy + #RUC LSM scalars + self._wetness = wetness + self._clw_surf_land = clw_surf_land + self._clw_surf_ice = clw_surf_ice + self._qwv_surf_land = qwv_surf_land + self._qwv_surf_ice = qwv_surf_ice + self._tsnow_land = tsnow_land + self._tsnow_ice = tsnow_ice + self._snowfallac_land = snowfallac_land + self._snowfallac_ice = snowfallac_ice + self._sncovr_ice = sncovr_ice + self._sfalb_lnd = sfalb_lnd + self._sfalb_lnd_bck = sfalb_lnd_bck + self._emis_ice = emis_ice + self._lai = lai + #orographic variables + self._stddev = stddev + self._convexity = convexity + self._oa1 = oa1 + self._oa2 = oa2 + self._oa3 = oa3 + self._oa4 = oa4 + self._ol1 = ol1 + self._ol2 = ol2 + self._ol3 = ol3 + self._ol4 = ol4 + self._theta_oro = theta_oro + self._gamma = gamma + self._sigma = sigma + self._elvmax = elvmax + self._oro = oro + self._oro_uf = oro_uf + self._landfrac = landfrac + self._lakefrac = lakefrac + self._lakedepth = lakedepth + #NSST vars + self._tref = tref + self._z_c = z_c + self._c_0 = c_0 + self._c_d = c_d + self._w_0 = w_0 + self._w_d = w_d + self._xt = xt + self._xs = xs + self._xu = xu + self._xv = xv + self._xz = xz + self._zm = zm + self._xtts = xtts + self._xzts = xzts + self._d_conv = d_conv + self._ifd = ifd + self._dt_cool = dt_cool + self._qrain = qrain + #initial conditions (profiles for t0) + self._height = height + self._theta_il = theta_il + self._t = t + self._qt = qt + self._ql = ql + self._qi = qi + self._u = u + self._v = v + self._tke = tke + self._ozone = ozone + self._stc = stc + self._smc = smc + self._slc = slc + self._snicexy = snicexy + self._snliqxy = snliqxy + self._tsnoxy = tsnoxy + self._smoiseq = smoiseq + self._zsnsoxy = zsnsoxy + self._tiice = tiice + self._tslb = tslb + self._smois = smois + self._sh2o = sh2o + self._smfr = smfr + self._flfr = flfr + #time series + self._p_surf = p_surf + self._T_surf = T_surf + #2D forcing vars (vert, time) + self._w_ls = w_ls + self._omega = omega + self._u_g = u_g + self._v_g = v_g + self._u_nudge = u_nudge + self._v_nudge = v_nudge + self._T_nudge = T_nudge + self._thil_nudge = thil_nudge + self._qt_nudge = qt_nudge + self._dT_dt_rad = dT_dt_rad + self._h_advec_thil = h_advec_thil + self._v_advec_thil = v_advec_thil + self._h_advec_qt = h_advec_qt + self._v_advec_qt = v_advec_qt + self._sh_flux_sfc = sh_flux_sfc + self._lh_flux_sfc = lh_flux_sfc + + def __repr__(self): + return f"""Case_Data + Globals: + name: {self._name} + missing_value: {self._missing_value} + Dimensions: + time: {self._time} + levels: {self._levels} + soil_depth: {self._soil_depth} + Scalars: + lat: {self._lat} + lon: {self._lon} + area: {self._area} + slmsk: {self._slmsk} + vegsrc: {self._vegsrc} + vegtyp: {self._vegtyp} + soiltyp: {self._soiltyp} + scolor: {self._scolor} + slopetyp: {self._slopetyp} + tsfco: {self._tsfco} + vegfrac: {self._vegfrac} + shdmin: {self._shdmin} + shdmax: {self._shdmax} + canopy: {self._canopy} + hice: {self._hice} + fice: {self._fice} + tisfc: {self._tisfc} + snowd: {self._snowd} + snoalb: {self._snoalb} + tg3: {self._tg3} + uustar: {self._uustar} + alvsf: {self._alvsf} + alnsf: {self._alnsf} + alvwf: {self._alvwf} + alnwf: {self._alnwf} + facsf: {self._facsf} + facwf: {self._facwf} + weasd: {self._weasd} + f10m: {self._f10m} + t2m: {self._t2m} + q2m: {self._q2m} + ffmm: {self._ffmm} + ffhh: {self._ffhh} + tprcp: {self._tprcp} + srflag: {self._srflag} + sncovr: {self._sncovr} + tsfcl: {self._tsfcl} + zorl: {self._zorl} + zorll: {self._zorll} + zorli: {self._zorli} + zorlw: {self._zorlw} + zorlwav: {self._zorlwav} + tvxy: {self._tvxy} + tgxy: {self._tgxy} + tahxy: {self._tahxy} + canicexy: {self._canicexy} + canliqxy: {self._canliqxy} + eahxy: {self._eahxy} + cmxy: {self._cmxy} + chxy: {self._chxy} + fwetxy: {self._fwetxy} + sneqvoxy: {self._sneqvoxy} + alboldxy: {self._alboldxy} + qsnowxy: {self._qsnowxy} + wslakexy: {self._wslakexy} + taussxy: {self._taussxy} + waxy: {self._waxy} + wtxy: {self._wtxy} + zwtxy: {self._zwtxy} + xlaixy: {self._xlaixy} + xsaixy: {self._xsaixy} + lfmassxy: {self._lfmassxy} + stmassxy: {self._stmassxy} + rtmassxy: {self._rtmassxy} + woodxy: {self._woodxy} + stblcpxy: {self._stblcpxy} + fastcpxy: {self._fastcpxy} + smcwtdxy: {self._smcwtdxy} + deeprechxy: {self._deeprechxy} + rechxy: {self._rechxy} + snowxy: {self._snowxy} + wetness: {self._wetness} + clw_surf_land: {self._clw_surf_land} + clw_surf_ice: {self._clw_surf_ice} + qwv_surf_land: {self._qwv_surf_land} + qwv_surf_ice: {self._qwv_surf_ice} + tsnow_land: {self._tsnow_land} + tsnow_ice: {self._tsnow_ice} + snowfallac_land: {self._snowfallac_land} + snowfallac_ice: {self._snowfallac_ice} + sncovr_ice: {self._sncovr_ice} + sfalb_lnd: {self._sfalb_lnd} + sfalb_lnd_bck: {self._sfalb_lnd_bck} + emis_ice: {self._emis_ice} + lai: {self._lai} + stddev: {self._stddev} + convexity: {self._convexity} + oa1: {self._oa1} + oa2: {self._oa2} + oa3: {self._oa3} + oa4: {self._oa4} + ol1: {self._ol1} + ol2: {self._ol2} + ol3: {self._ol3} + ol4: {self._ol4} + theta_oro: {self._theta_oro} + gamma: {self._gamma} + sigma: {self._sigma} + elvmax: {self._elvmax} + oro: {self._oro} + oro_uf: {self._oro_uf} + landfrac: {self._landfrac} + lakefrac: {self._lakefrac} + lakedepth: {self._lakedepth} + tref: {self._tref} + z_c: {self._z_c} + c_0: {self._c_0} + c_d: {self._c_d} + w_0: {self._w_0} + w_d: {self._w_d} + xt: {self._xt} + xs: {self._xs} + xu: {self._xu} + xv: {self._xv} + xz: {self._xz} + zm: {self._zm} + xtts: {self._xtts} + xzts: {self._xzts} + d_conv: {self._d_conv} + ifd: {self._ifd} + dt_cool: {self._dt_cool} + qrain: {self._qrain} + Initial: + height: {self._height} + theta_il: {self._theta_il} + t: {self._t} + qt: {self._qt} + ql: {self._ql} + qi: {self._qi} + u: {self._u} + v: {self._v} + tke: {self._tke} + ozone: {self._ozone} + stc: {self._stc} + smc: {self._smc} + slc: {self._slc} + snicexy: {self._snicexy} + snliqxy: {self._snliqxy} + tsnoxy: {self._tsnoxy} + smoiseq: {self._smoiseq} + zsnsoxy: {self._zsnsoxy} + tiice: {self._tiice} + tslb: {self._tslb} + smois: {self._smois} + sh2o: {self._sh2o} + smfr: {self._smfr} + flfr: {self._flfr} + Forcing: + p_surf: {self._p_surf} + T_surf: {self._T_surf} + w_ls (time avg): {np.mean(self._w_ls, axis=1)} + omega (time avg): {np.mean(self._omega, axis=1)} + u_g (time avg): {np.mean(self._u_g, axis=1)} + v_g (time avg): {np.mean(self._v_g, axis=1)} + u_nudge (time avg): {np.mean(self._u_nudge, axis=1)} + v_nudge (time avg): {np.mean(self._v_nudge, axis=1)} + T_nudge (time avg): {np.mean(self._T_nudge, axis=1)} + thil_nudge (time avg): {np.mean(self._thil_nudge, axis=1)} + qt_nudge (time avg): {np.mean(self._qt_nudge, axis=1)} + dT_dt_rad (time avg): {np.mean(self._dT_dt_rad, axis=1)} + h_advec_thil (time avg): {np.mean(self._h_advec_thil, axis=1)} + v_advec_thil (time avg): {np.mean(self._v_advec_thil, axis=1)} + h_advec_qt (time avg): {np.mean(self._h_advec_qt, axis=1)} + v_advec_qt (time avg): {np.mean(self._v_advec_qt, axis=1)} + sh_flux_sfc: {self._sh_flux_sfc} + lh_flux_sfc: {self._lh_flux_sfc}""" + +def get_case_nml(case_name): + """Returns case configuration Fortran namelist""" + + filename = os.path.join(CASE_NML_DIR, case_name + '.nml') + + logging.debug(filename) + + error = False + nml = '' + if (os.path.exists(filename)): + nml = f90nml.read(filename) + else: + error = True + + return (nml, error) + +def get_case_data(case_name): + """Returns proprietary CCPP SCM case data in NetCDF Dataset format""" + + #TODO: need to handle LSM ICs + + filename = os.path.join(PROCESSED_CASE_DIR, case_name + '.nc') + + error = False + try: + nc_fid = Dataset(filename , 'r') + except: + error = True + + if (not error): + #read global variables + try: + missing_value = nc_fid.getncattr('missing_value') + except: + missing_value = DEFAULT_MISSING_VALUE + + time = nc_fid.variables['time'][:] + levels = nc_fid.variables['levels'][:] + try: + soil_depth = nc_fid.variables['soil_depth'][:] + except KeyError: + soil_depth = [missing_value] + + #read variables from scalar group + scalars_grp = nc_fid.groups['scalars'] + lat = scalars_grp.variables['lat'][:] + lon = scalars_grp.variables['lon'][:] + try: + slmsk = scalars_grp.variables['slmsk'][:] + except KeyError: + slmsk = missing_value + try: + vegsrc = scalars_grp.variables['vegsrc'][:] + except KeyError: + vegsrc = missing_value + try: + vegtyp = scalars_grp.variables['vegtyp'][:] + except KeyError: + vegtyp = missing_value + try: + soiltyp = scalars_grp.variables['soiltyp'][:] + except KeyError: + soiltyp = missing_value + try: + scolor = scalars_grp.variables['scolor'][:] + except KeyError: + scolor = missing_value + try: + slopetyp = scalars_grp.variables['slopetyp'][:] + except KeyError: + slopetyp = missing_value + try: + tsfco = scalars_grp.variables['tsfco'][:] + except KeyError: + tsfco = missing_value + try: + vegfrac = scalars_grp.variables['vegfrac'][:] + except KeyError: + vegfrac = missing_value + try: + shdmin = scalars_grp.variables['shdmin'][:] + except KeyError: + shdmin = missing_value + try: + shdmax = scalars_grp.variables['shdmax'][:] + except KeyError: + shdmax = missing_value + try: + canopy = scalars_grp.variables['canopy'][:] + except KeyError: + canopy = missing_value + try: + hice = scalars_grp.variables['hice'][:] + except KeyError: + hice = missing_value + try: + fice = scalars_grp.variables['fice'][:] + except KeyError: + fice = missing_value + try: + tisfc = scalars_grp.variables['tisfc'][:] + except KeyError: + tisfc = missing_value + try: + snowd = scalars_grp.variables['snowd'][:] + except KeyError: + try: + snowd = scalars_grp.variables['snwdph'][:] + except KeyError: + snowd = missing_value + try: + snoalb = scalars_grp.variables['snoalb'][:] + except KeyError: + snoalb = missing_value + try: + tg3 = scalars_grp.variables['tg3'][:] + except KeyError: + tg3 = missing_value + try: + uustar = scalars_grp.variables['uustar'][:] + except KeyError: + uustar = missing_value + try: + alvsf = scalars_grp.variables['alvsf'][:] + except KeyError: + alvsf = missing_value + try: + alnsf = scalars_grp.variables['alnsf'][:] + except KeyError: + alnsf = missing_value + try: + alvwf = scalars_grp.variables['alvwf'][:] + except KeyError: + alvwf = missing_value + try: + alnwf = scalars_grp.variables['alnwf'][:] + except KeyError: + alnwf = missing_value + try: + facsf = scalars_grp.variables['facsf'][:] + except KeyError: + facsf = missing_value + try: + facwf = scalars_grp.variables['facwf'][:] + except KeyError: + facwf = missing_value + try: + weasd = scalars_grp.variables['weasd'][:] + except KeyError: + weasd = missing_value + try: + f10m = scalars_grp.variables['f10m'][:] + except KeyError: + f10m = missing_value + try: + t2m = scalars_grp.variables['t2m'][:] + except KeyError: + t2m = missing_value + try: + q2m = scalars_grp.variables['q2m'][:] + except KeyError: + q2m = missing_value + try: + ffmm = scalars_grp.variables['ffmm'][:] + except KeyError: + ffmm = missing_value + try: + ffhh = scalars_grp.variables['ffhh'][:] + except KeyError: + ffhh = missing_value + try: + tprcp = scalars_grp.variables['tprcp'][:] + except KeyError: + tprcp = missing_value + try: + srflag = scalars_grp.variables['srflag'][:] + except KeyError: + srflag = missing_value + try: + sncovr = scalars_grp.variables['sncovr'][:] + except KeyError: + sncovr = missing_value + try: + tsfcl = scalars_grp.variables['tsfcl'][:] + except KeyError: + tsfcl = missing_value + try: + zorl = scalars_grp.variables['zorl'][:] + except KeyError: + zorl = missing_value + try: + zorll = scalars_grp.variables['zorll'][:] + except KeyError: + zorll = missing_value + try: + zorli = scalars_grp.variables['zorli'][:] + except KeyError: + zorli = missing_value + try: + zorlw = scalars_grp.variables['zorlw'][:] + except KeyError: + zorlw = missing_value + try: + zorlwav = scalars_grp.variables['zorlwav'][:] + except KeyError: + zorlwav = missing_value + try: + tvxy = scalars_grp.variables['tvxy'][:] + except KeyError: + tvxy = missing_value + try: + tgxy = scalars_grp.variables['tgxy'][:] + except KeyError: + tgxy = missing_value + try: + tahxy = scalars_grp.variables['tahxy'][:] + except KeyError: + tahxy = missing_value + try: + canicexy = scalars_grp.variables['canicexy'][:] + except KeyError: + canicexy = missing_value + try: + canliqxy = scalars_grp.variables['canliqxy'][:] + except KeyError: + canliqxy = missing_value + try: + eahxy = scalars_grp.variables['eahxy'][:] + except KeyError: + eahxy = missing_value + try: + cmxy = scalars_grp.variables['cmxy'][:] + except KeyError: + cmxy = missing_value + try: + chxy = scalars_grp.variables['chxy'][:] + except KeyError: + chxy = missing_value + try: + fwetxy = scalars_grp.variables['fwetxy'][:] + except KeyError: + fwetxy = missing_value + try: + sneqvoxy = scalars_grp.variables['sneqvoxy'][:] + except KeyError: + sneqvoxy = missing_value + try: + alboldxy = scalars_grp.variables['alboldxy'][:] + except KeyError: + alboldxy = missing_value + try: + qsnowxy = scalars_grp.variables['qsnowxy'][:] + except KeyError: + qsnowxy = missing_value + try: + wslakexy = scalars_grp.variables['wslakexy'][:] + except KeyError: + wslakexy = missing_value + try: + taussxy = scalars_grp.variables['taussxy'][:] + except KeyError: + taussxy = missing_value + try: + waxy = scalars_grp.variables['waxy'][:] + except KeyError: + waxy = missing_value + try: + wtxy = scalars_grp.variables['wtxy'][:] + except KeyError: + wtxy = missing_value + try: + zwtxy = scalars_grp.variables['zwtxy'][:] + except KeyError: + zwtxy = missing_value + try: + xlaixy = scalars_grp.variables['xlaixy'][:] + except KeyError: + xlaixy = missing_value + try: + xsaixy = scalars_grp.variables['xsaixy'][:] + except KeyError: + xsaixy = missing_value + try: + lfmassxy = scalars_grp.variables['lfmassxy'][:] + except KeyError: + lfmassxy = missing_value + try: + stmassxy = scalars_grp.variables['stmassxy'][:] + except KeyError: + stmassxy = missing_value + try: + rtmassxy = scalars_grp.variables['rtmassxy'][:] + except KeyError: + rtmassxy = missing_value + try: + woodxy = scalars_grp.variables['woodxy'][:] + except KeyError: + woodxy = missing_value + try: + stblcpxy = scalars_grp.variables['stblcpxy'][:] + except KeyError: + stblcpxy = missing_value + try: + fastcpxy = scalars_grp.variables['fastcpxy'][:] + except KeyError: + fastcpxy = missing_value + try: + smcwtdxy = scalars_grp.variables['smcwtdxy'][:] + except KeyError: + smcwtdxy = missing_value + try: + deeprechxy = scalars_grp.variables['deeprechxy'][:] + except KeyError: + deeprechxy = missing_value + try: + rechxy = scalars_grp.variables['rechxy'][:] + except KeyError: + rechxy = missing_value + try: + snowxy = scalars_grp.variables['snowxy'][:] + except KeyError: + snowxy = missing_value + try: + wetness = scalars_grp.variables['wetness'][:] + except KeyError: + wetness = missing_value + try: + clw_surf_land = scalars_grp.variables['clw_surf_land'][:] + except KeyError: + clw_surf_land = missing_value + try: + clw_surf_ice = scalars_grp.variables['clw_surf_ice'][:] + except KeyError: + clw_surf_ice = missing_value + try: + qwv_surf_land = scalars_grp.variables['qwv_surf_land'][:] + except KeyError: + qwv_surf_land = missing_value + try: + qwv_surf_ice = scalars_grp.variables['qwv_surf_ice'][:] + except KeyError: + qwv_surf_ice = missing_value + try: + tsnow_land = scalars_grp.variables['tsnow_land'][:] + except KeyError: + tsnow_land = missing_value + try: + tsnow_ice = scalars_grp.variables['tsnow_ice'][:] + except KeyError: + tsnow_ice = missing_value + try: + snowfallac_land = scalars_grp.variables['snowfallac_land'][:] + except KeyError: + snowfallac_land = missing_value + try: + snowfallac_ice = scalars_grp.variables['snowfallac_ice'][:] + except KeyError: + snowfallac_ice = missing_value + try: + sncovr_ice = scalars_grp.variables['sncovr_ice'][:] + except KeyError: + sncovr_ice = missing_value + try: + sfalb_lnd = scalars_grp.variables['sfalb_lnd'][:] + except KeyError: + sfalb_lnd = missing_value + try: + sfalb_lnd_bck = scalars_grp.variables['sfalb_lnd_bck'][:] + except KeyError: + sfalb_lnd_bck = missing_value + try: + emis_ice = scalars_grp.variables['emis_ice'][:] + except KeyError: + emis_ice = missing_value + try: + lai = scalars_grp.variables['lai'][:] + except KeyError: + lai = missing_value + try: + area = scalars_grp.variables['area'][:] + except KeyError: + area = missing_value + try: + stddev = scalars_grp.variables['stddev'][:] + except KeyError: + stddev = missing_value + try: + convexity = scalars_grp.variables['convexity'][:] + except KeyError: + convexity = missing_value + try: + oa1 = scalars_grp.variables['oa1'][:] + except KeyError: + oa1 = missing_value + try: + oa2 = scalars_grp.variables['oa2'][:] + except KeyError: + oa2 = missing_value + try: + oa3 = scalars_grp.variables['oa3'][:] + except KeyError: + oa3 = missing_value + try: + oa4 = scalars_grp.variables['oa4'][:] + except KeyError: + oa4 = missing_value + try: + ol1 = scalars_grp.variables['ol1'][:] + except KeyError: + ol1 = missing_value + try: + ol2 = scalars_grp.variables['ol2'][:] + except KeyError: + ol2 = missing_value + try: + ol3 = scalars_grp.variables['ol3'][:] + except KeyError: + ol3 = missing_value + try: + ol4 = scalars_grp.variables['ol4'][:] + except KeyError: + ol4 = missing_value + try: + theta_oro = scalars_grp.variables['theta_oro'][:] + except KeyError: + theta_oro = missing_value + try: + gamma = scalars_grp.variables['gamma'][:] + except KeyError: + gamma = missing_value + try: + sigma = scalars_grp.variables['sigma'][:] + except KeyError: + sigma = missing_value + try: + elvmax = scalars_grp.variables['elvmax'][:] + except KeyError: + elvmax = missing_value + try: + oro = scalars_grp.variables['oro'][:] + except KeyError: + oro = missing_value + try: + oro_uf = scalars_grp.variables['oro_uf'][:] + except KeyError: + oro_uf = missing_value + try: + landfrac = scalars_grp.variables['landfrac'][:] + except KeyError: + landfrac = missing_value + try: + lakefrac = scalars_grp.variables['lakefrac'][:] + except KeyError: + lakefrac = missing_value + try: + lakedepth = scalars_grp.variables['lakedepth'][:] + except KeyError: + lakedepth = missing_value + try: + tref = scalars_grp.variables['tref'][:] + except KeyError: + tref = missing_value + try: + z_c = scalars_grp.variables['z_c'][:] + except KeyError: + z_c = missing_value + try: + c_0 = scalars_grp.variables['c_0'][:] + except KeyError: + c_0 = missing_value + try: + c_d = scalars_grp.variables['c_d'][:] + except KeyError: + c_d = missing_value + try: + w_0 = scalars_grp.variables['w_0'][:] + except KeyError: + w_0 = missing_value + try: + w_d = scalars_grp.variables['w_d'][:] + except KeyError: + w_d = missing_value + try: + xt = scalars_grp.variables['xt'][:] + except KeyError: + xt = missing_value + try: + xs = scalars_grp.variables['xs'][:] + except KeyError: + xs = missing_value + try: + xu = scalars_grp.variables['xu'][:] + except KeyError: + xu = missing_value + try: + xv = scalars_grp.variables['xv'][:] + except KeyError: + xv = missing_value + try: + xz = scalars_grp.variables['xz'][:] + except KeyError: + xz = missing_value + try: + zm = scalars_grp.variables['zm'][:] + except KeyError: + zm = missing_value + try: + xtts = scalars_grp.variables['xtts'][:] + except KeyError: + xtts = missing_value + try: + xzts = scalars_grp.variables['xzts'][:] + except KeyError: + xzts = missing_value + try: + d_conv = scalars_grp.variables['d_conv'][:] + except KeyError: + d_conv = missing_value + try: + ifd = scalars_grp.variables['ifd'][:] + except KeyError: + ifd = missing_value + try: + dt_cool = scalars_grp.variables['dt_cool'][:] + except KeyError: + dt_cool = missing_value + try: + qrain = scalars_grp.variables['qrains'][:] + except KeyError: + qrain = missing_value + + #read variables from initial group + initial_grp = nc_fid.groups['initial'] + try: + height = initial_grp.variables['height'][:] + except KeyError: + height = [missing_value] + try: + theta_il = initial_grp.variables['thetail'][:] + except KeyError: + theta_il = [missing_value] + try: + t = initial_grp.variables['temp'][:] + except KeyError: + t = [missing_value] + qt = initial_grp.variables['qt'][:] + ql = initial_grp.variables['ql'][:] + qi = initial_grp.variables['qi'][:] + u = initial_grp.variables['u'][:] + v = initial_grp.variables['v'][:] + tke = initial_grp.variables['tke'][:] + ozone = initial_grp.variables['ozone'][:] + try: + stc = initial_grp.variables['stc'][:] + except KeyError: + stc = [missing_value] + try: + smc = initial_grp.variables['smc'][:] + except KeyError: + smc = [missing_value] + try: + slc = initial_grp.variables['slc'][:] + except KeyError: + slc = [missing_value] + try: + snicexy = initial_grp.variables['snicexy'][:] + except KeyError: + snicexy = [missing_value] + try: + snliqxy = initial_grp.variables['snliqxy'][:] + except KeyError: + snliqxy = [missing_value] + try: + tsnoxy = initial_grp.variables['tsnoxy'][:] + except KeyError: + tsnoxy = [missing_value] + try: + smoiseq = initial_grp.variables['smoiseq'][:] + except KeyError: + smoiseq = [missing_value] + try: + zsnsoxy = initial_grp.variables['zsnsoxy'][:] + except KeyError: + zsnsoxy = [missing_value] + try: + tiice = initial_grp.variables['tiice'][:] + except KeyError: + tiice = [missing_value] + try: + tslb = initial_grp.variables['tslb'][:] + except KeyError: + tslb = [missing_value] + try: + smois = initial_grp.variables['smois'][:] + except KeyError: + smois = [missing_value] + try: + sh2o = initial_grp.variables['sh2o'][:] + except KeyError: + sh2o = [missing_value] + try: + smfr = initial_grp.variables['smfr'][:] + except KeyError: + smfr = [missing_value] + try: + flfr = initial_grp.variables['flfr'][:] + except KeyError: + flfr = [missing_value] + + #read variables from forcing group + forcing_grp = nc_fid.groups['forcing'] + p_surf = forcing_grp.variables['p_surf'][:] + T_surf = forcing_grp.variables['T_surf'][:] + w_ls = forcing_grp.variables['w_ls'][:] + omega = forcing_grp.variables['omega'][:] + u_g = forcing_grp.variables['u_g'][:] + v_g = forcing_grp.variables['v_g'][:] + u_nudge = forcing_grp.variables['u_nudge'][:] + v_nudge = forcing_grp.variables['v_nudge'][:] + T_nudge = forcing_grp.variables['T_nudge'][:] + thil_nudge = forcing_grp.variables['thil_nudge'][:] + qt_nudge = forcing_grp.variables['qt_nudge'][:] + dT_dt_rad = forcing_grp.variables['dT_dt_rad'][:] + h_advec_thil = forcing_grp.variables['h_advec_thetail'][:] + v_advec_thil = forcing_grp.variables['v_advec_thetail'][:] + h_advec_qt = forcing_grp.variables['h_advec_qt'][:] + v_advec_qt = forcing_grp.variables['v_advec_qt'][:] + try: + sh_flux_sfc = forcing_grp.variables['sh_flux_sfc'][:] + except KeyError: + sh_flux_sfc = '' + try: + lh_flux_sfc = forcing_grp.variables['lh_flux_sfc'][:] + except KeyError: + lh_flux_sfc = '' + + nc_fid.close() + + case_data = Case_Data(case_name, missing_value, time, levels, soil_depth, lat, lon, + slmsk, vegsrc, vegtyp, soiltyp, scolor, slopetyp, tsfco, vegfrac, shdmin, shdmax, + canopy, hice, fice, tisfc, snowd, snoalb, tg3, uustar, + alvsf, alnsf, alvwf, alnwf, facsf, facwf, weasd, f10m, t2m, q2m, ffmm, ffhh, + tprcp, srflag, sncovr, tsfcl, zorl, zorll, zorli, zorlw, zorlwav, tvxy, tgxy, tahxy, canicexy, canliqxy, eahxy, + cmxy, chxy, fwetxy, sneqvoxy, alboldxy, qsnowxy, wslakexy, taussxy, + waxy, wtxy, zwtxy, xlaixy, xsaixy, + lfmassxy, stmassxy, rtmassxy, woodxy, stblcpxy, fastcpxy, smcwtdxy, deeprechxy, rechxy, snowxy, + wetness, clw_surf_land, clw_surf_ice, qwv_surf_land, qwv_surf_ice, tsnow_land, tsnow_ice, + snowfallac_land, snowfallac_ice, sncovr_ice, sfalb_lnd, sfalb_lnd_bck, emis_ice, lai, area, + stddev, convexity, oa1, oa2, oa3, oa4, ol1, ol3, ol3, ol4, theta_oro, gamma, sigma, elvmax, oro, oro_uf, landfrac, lakefrac, lakedepth, + tref, z_c, c_0, c_d, w_0, w_d, xt, xs, xu, xv, xz, zm, xtts, xzts, d_conv, ifd, dt_cool, qrain, + height, theta_il, t, qt, ql, qi, u, v, tke, ozone, stc, smc, slc, + snicexy, snliqxy, tsnoxy, smoiseq, zsnsoxy, tiice, tslb, smois, sh2o, smfr, flfr, + p_surf, T_surf, w_ls, omega, u_g, v_g, + u_nudge, v_nudge, T_nudge, thil_nudge, qt_nudge, + dT_dt_rad, h_advec_thil, v_advec_thil, h_advec_qt, + v_advec_qt, sh_flux_sfc, lh_flux_sfc) + + return(case_data, error) + +def write_SCM_case_file(case_nml, case_data, use_area): + """Write all data to a netCDF file in the DEPHY-SCM format""" + + #TODO: need to handle LSM ICs + + # Working types + wp = np.float64 + wi = np.int32 + + # Local switches + forcing_on = 1 + forcing_off = 0 + + nml_keys = case_nml['case_config'].todict().keys() + nml_filename = os.path.join(CASE_NML_DIR, case_nml['case_config']['case_name'] + '.nml') + + # Output file + com = 'mkdir -p ' + PROCESSED_CASE_DIR + logging.info(com) + os.system(com) + fileOUT = os.path.join(PROCESSED_CASE_DIR, case_nml['case_config']['case_name'] + '_dephy' + '_SCM_driver.nc') + + nc_file = Dataset(fileOUT, 'w', format='NETCDF3_CLASSIC') + nc_file.description = "Case data for {} from CCPP SCM".format(case_nml['case_config']['case_name']) + + nc_file.missing_value = case_data._missing_value + + #not all namelists will have minutes, set to 0 if nml doesn't have + try: + minute = case_nml['case_config']['minute'] + except KeyError: + minute = 0 + + start_date = datetime(case_nml['case_config']['year'],case_nml['case_config']['month'],case_nml['case_config']['day'],case_nml['case_config']['hour'],minute,0) + start_date_string = start_date.strftime("%Y-%m-%d %H:%M:%S") + runtime = case_nml['case_config']['runtime'] + delta = timedelta(seconds=runtime) + end_date = start_date + delta + end_date_string = end_date.strftime("%Y-%m-%d %H:%M:%S") + loc_string = str(case_data._lon) + "E" + str(case_data._lat) + "N" + case_string = case_nml['case_config']['case_name'] + '_' + start_date_string + '_' + loc_string + + logging.debug('Case string: {}'.format(case_string)) + logging.debug('Case start date: {}'.format(start_date)) + logging.debug('Case duration: {}'.format(delta)) + logging.debug('Case end date: {}'.format(end_date)) + + if (case_nml['case_config']['sfc_type'] > 1.5): + surface_string = 'ice' + elif (case_nml['case_config']['sfc_type'] > 0.5): + surface_string = 'land' + else: + surface_string = 'ocean' + + #override case nml with LSM/model data + if ('lsm_ics' in nml_keys): + if (case_nml['case_config']['lsm_ics']): + if (case_data._slmsk > 1.5): + surface_string = 'ice' + elif (case_data._slmsk > 0.5): + surface_string = 'land' + else: + surface_string = 'ocean' + + #DEPHY v1 format specifies the global attributes in this order. Some attributes are rewritten below after the order is established in the file. + nc_file.case = case_string + nc_file.title = 'Forcing and Initial Conditions for ' + case_string + nc_file.reference = 'https://dtcenter.org/sites/default/files/paragraph/scm-ccpp-guide-v6-0-0.pdf' + nc_file.author = 'Grant J. Firl and Dustin Swales' + nc_file.version = 'Created on ' + datetime.today().strftime('%Y-%m-%d %H:%M:%S') + nc_file.format_version = 'DEPHY SCM format version 1' + nc_file.modifications = '' + nc_file.script = os.path.basename(__file__) + nc_file.comment = 'converted from ' + case_nml['case_config']['case_name'] + '.nc' + nc_file.start_date = start_date_string + nc_file.end_date = end_date_string + + if (use_area and case_nml['case_config']['column_area']): + nc_file.forcing_scale = case_nml['case_config']['column_area'] + else: + nc_file.forcing_scale = -1 + + nc_file.adv_ta = forcing_off + nc_file.adv_qv = forcing_off + nc_file.adv_ua = forcing_off #no mom_forcing_type implemented this (providing pre-calculated advective terms for u) + nc_file.adv_va = forcing_off #no mom_forcing_type implemented this (providing pre-calculated advective terms for v) + nc_file.adv_theta = forcing_off + nc_file.adv_thetal = forcing_off + nc_file.adv_qt = forcing_off + nc_file.adv_rv = forcing_off + nc_file.adv_rt = forcing_off + nc_file.radiation = "on" #not implemented in CCPP SCM - controlled by CCPP SDF and/or namelist + nc_file.forc_wap = forcing_off + nc_file.forc_wa = forcing_off + nc_file.forc_geo = forcing_off + nc_file.nudging_ua = forcing_off + nc_file.nudging_va = forcing_off + nc_file.nudging_ta = forcing_off + nc_file.nudging_theta = forcing_off + nc_file.nudging_thetal = forcing_off + nc_file.nudging_qv = forcing_off + nc_file.nudging_qt = forcing_off + nc_file.nudging_rv = forcing_off + nc_file.nudging_rt = forcing_off + nc_file.zh_nudging_ta = forcing_off + nc_file.zh_nudging_theta = forcing_off + nc_file.zh_nudging_thetal = forcing_off + nc_file.zh_nudging_qv = forcing_off + nc_file.zh_nudging_qt = forcing_off + nc_file.zh_nudging_rv = forcing_off + nc_file.zh_nudging_rt = forcing_off + nc_file.zh_nudging_ua = forcing_off + nc_file.zh_nudging_va = forcing_off + nc_file.pa_nudging_ta = forcing_off + nc_file.pa_nudging_theta = forcing_off + nc_file.pa_nudging_thetal = forcing_off + nc_file.pa_nudging_qv = forcing_off + nc_file.pa_nudging_qt = forcing_off + nc_file.pa_nudging_rv = forcing_off + nc_file.pa_nudging_rt = forcing_off + nc_file.pa_nudging_ua = forcing_off + nc_file.pa_nudging_va = forcing_off + # + nc_file.surface_type = surface_string + nc_file.surface_forcing_temp = 'none' + nc_file.surface_forcing_moisture = 'none' + nc_file.surface_forcing_wind = 'none' + nc_file.surface_forcing_lsm = 'none' + + #rewrite forc_wa, forc_wap, forc_geo, nudging_ua, nudging_va depending on mom_forcing_type provided in case_config nml + if (case_nml['case_config']['mom_forcing_type'] == 2): + #CCPP SCM proprietery forcing interprets mom_forcing_type = 2 as calculating vertical advective terms from provided vertical velocity AND applying geostrophic winds + + #CCPP SCM proprietery cases could have either w or omega available (or both); use omega by default? + w_ls_avail = True if np.any(case_data._w_ls[:,:]) else False + omega_avail = True if np.any(case_data._omega[:,:]) else False + if omega_avail: + nc_file.forc_wap = forcing_on + nc_file.forc_wa = forcing_off + elif w_ls_avail: + nc_file.forc_wap = forcing_off + nc_file.forc_wa = forcing_on + else: + message = 'The case namelist ({0}) specifies the momentum variables should be forced using vertical velocity (through mom_forcing = 2), but neither w_ls or omega have nonzero values'.format(nml_filename) + logging.info(message) + nc_file.forc_wap = forcing_off + nc_file.forc_wa = forcing_off + #logging.critical(message) + #raise Exception(message) + + geostrophic_avail = True if (np.any(case_data._u_g[:,:]) or np.any(case_data._v_g[:,:])) else False + if geostrophic_avail: + nc_file.forc_geo = forcing_on + else: + message = 'The case namelist ({0}) specifies the momentum variables should be forced using geostrophic winds (through mom_forcing = 2), but neither u_g or v_g have nonzero values'.format(nml_filename) + logging.info(message) + nc_file.forc_geo = forcing_off + #logging.critical(message) + #raise Exception(message) + nc_file.nudging_ua = forcing_off + nc_file.nudging_va = forcing_off + + elif (case_nml['case_config']['mom_forcing_type'] == 3): + #CCPP SCM proprietery forcing interprets mom_forcing_type = 3 as calculating momentum forcing as nudging toward u and v profiles (only) + + nc_file.forc_wa = forcing_off + nc_file.forc_wap = forcing_off + nc_file.forc_geo = forcing_off + + u_nudge_avail = True if np.any(case_data._u_nudge[:,:]) else False + v_nudge_avail = True if np.any(case_data._v_nudge[:,:]) else False + relax_time_avail = True if case_nml['case_config']['relax_time'] else False + if relax_time_avail: + relax_time = case_nml['case_config']['relax_time'] + else: + relax_time = DEFAULT_NUDGING_TIMESCALE + message = 'The case namelist ({0}) specifies the momentum variables should be forced using nudging (through mom_forcing = 3), but relax_time was not provided -- using default value of {1}s '.format(nml_filename, DEFAULT_NUDGING_TIMESCALE) + logging.info(message) + + nc_file.nudging_ua = forcing_on*relax_time + nc_file.nudging_va = forcing_on*relax_time + + if (case_nml['case_config']['thermo_forcing_type'] == 1): + #total advective forcing + radiative heating + nc_file.adv_thetal = forcing_on + nc_file.adv_qt = forcing_on + #nc_file.radiation = 'tend' #radiation isn't turned off in the CCPP SCM through the forcing + elif (case_nml['case_config']['thermo_forcing_type'] == 2): + #horizontal advective forcing + (radiative heating) + vertical velocity + nc_file.adv_thetal = forcing_on + nc_file.adv_qt = forcing_on + #nc_file.radiation = 'tend' #radiation isn't turned off in the CCPP SCM through the forcing + + w_ls_avail = True if np.any(case_data._w_ls[:,:]) else False + omega_avail = True if np.any(case_data._omega[:,:]) else False + if omega_avail: + nc_file.forc_wap = forcing_on + nc_file.forc_wa = forcing_off + elif w_ls_avail: + nc_file.forc_wap = forcing_off + nc_file.forc_wa = forcing_on + else: + message = 'The case namelist ({0}) specifies the thermo variables should be forced using vertical velocity (through thermo_forcing = 2), but neither w_ls or omega have nonzero values'.format(nml_filename) + logging.info(message) + nc_file.forc_wap = forcing_off + nc_file.forc_wa = forcing_off + #logging.critical(message) + #raise Exception(message) + + elif (case_nml['case_config']['thermo_forcing_type'] == 3): + #nudging + vertical velocity + + T_nudge_avail = True if np.any(case_data._T_nudge[:,:]) else False + qt_nudge_avail = True if np.any(case_data._qt_nudge[:,:]) else False + relax_time_avail = True if case_nml['case_config']['relax_time'] else False + if relax_time_avail: + relax_time = case_nml['case_config']['relax_time'] + else: + relax_time = DEFAULT_NUDGING_TIMESCALE + message = 'The case namelist ({0}) specifies the thermo variables should be forced using nudging (through thermo_forcing = 3), but relax_time was not provided -- using default value of {1}s '.format(nml_filename, DEFAULT_NUDGING_TIMESCALE) + logging.info(message) + + nc_file.nudging_ta = forcing_on*relax_time + nc_file.nudging_qt = forcing_on*relax_time + + w_ls_avail = True if np.any(case_data._w_ls[:,:]) else False + omega_avail = True if np.any(case_data._omega[:,:]) else False + if omega_avail: + nc_file.forc_wap = forcing_on + nc_file.forc_wa = forcing_off + elif w_ls_avail: + nc_file.forc_wap = forcing_off + nc_file.forc_wa = forcing_on + else: + message = 'The case namelist ({0}) specifies the thermo variables should be forced using vertical velocity (through thermo_forcing = 2), but neither w_ls or omega have nonzero values'.format(nml_filename) + logging.info(message) + nc_file.forc_wap = forcing_off + nc_file.forc_wa = forcing_off + #logging.critical(message) + #raise Exception(message) + + time_dim = nc_file.createDimension('time', case_data._time.shape[0]) + timei_dim = nc_file.createDimension('t0', 1) + lev_dim = nc_file.createDimension('lev', case_data._levels.shape[0]) + + if ('lsm_ics' in nml_keys or 'model_ics' in nml_keys): + nc_file.surface_forcing_lsm = 'lsm' + if (('lsm_ics' in nml_keys and case_nml['case_config']['lsm_ics']) or ('model_ics' in nml_keys and case_nml['case_config']['model_ics'])): + if (case_data._soil_depth[0] != case_data._missing_value): + soil_dim = nc_file.createDimension('nsoil', case_data._soil_depth.shape[0]) + else: + message = 'LSM ICs are expected from the case_nml file, but no soil depth is provided.' + logging.critical(message) + raise Exception(message) + + if (case_data._snicexy[0] != case_data._missing_value): + snow_dim = nc_file.createDimension('nsnow', case_data._snicexy.shape[0]) + nslsnw_dim = nc_file.createDimension('nsoil_plus_nsnow',case_data._snicexy.shape[0] + case_data._soil_depth.shape[0]) + + if (case_data._tiice[0] != case_data._missing_value): + ice_dim = nc_file.createDimension('nice', case_data._tiice.shape[0]) + + # + timei_var = nc_file.createVariable('t0', wp, ('t0')) + timei_var.units = 'seconds since ' + start_date_string + timei_var.standard_name = 'Initial time' + timei_var.calendar = 'gregorian' + timei_var[:] = 0.0 + # + timef_var = nc_file.createVariable('time', wp, ('time')) + timef_var.units = 'seconds since ' + start_date_string + timef_var.standard_name = 'Forcing time' + timef_var.calendar = 'gregorian' + timef_var[:] = case_data._time[:] + # + lev_var = nc_file.createVariable('lev', wp, ('lev')) + lev_var.units = 'Pa' + lev_var.standard_name = 'pressure' + lev_var[:] = case_data._levels[:] + + if (case_data._soil_depth[0] != case_data._missing_value): + soil_depth_var = nc_file.createVariable('soil_depth', wp, ('nsoil')) + soil_depth_var.units = 'm' + soil_depth_var.standard_name = 'depth of bottom of soil layers' + soil_depth_var[:] = case_data._soil_depth[:] + + # + lon_var = nc_file.createVariable('lon', wp, ('time')) + lon_var.units = 'degrees_east' + lon_var.standard_name = 'longitude' + lon_var[:] = case_data._lon + + # + lat_var = nc_file.createVariable('lat', wp, ('time')) + lat_var.units = 'degrees_north' + lat_var.standard_name = 'latitude' + lat_var[:] = case_data._lat + + if (case_data._slmsk != case_data._missing_value): + slmsk_var = nc_file.createVariable('slmsk', wp) + slmsk_var.units = 'none' + slmsk_var.standard_name = 'land_sea_ice_mask' + slmsk_var[:] = case_data._slmsk + + if (case_data._vegsrc != case_data._missing_value): + vegsrc_var = nc_file.createVariable('vegsrc', wp) + vegsrc_var.units = 'none' + vegsrc_var.standard_name = 'vegetation source (1-2)' + vegsrc_var[:] = case_data._vegsrc + + if (case_data._vegtyp != case_data._missing_value): + vegtyp_var = nc_file.createVariable('vegtyp', wp) + vegtyp_var.units = 'none' + vegtyp_var.standard_name = 'vegetation type (1-12)' + vegtyp_var[:] = case_data._vegtyp + + if (case_data._soiltyp != case_data._missing_value): + soiltyp_var = nc_file.createVariable('soiltyp', wp) + soiltyp_var.units = 'none' + soiltyp_var.standard_name = 'soil type (1-12)' + soiltyp_var[:] = case_data._soiltyp + + if (case_data._scolor != case_data._missing_value): + scolor_var = nc_file.createVariable('scolor', wp) + scolor_var.units = 'none' + scolor_var.standard_name = 'soil color' + scolor_var[:] = case_data._scolor + + if (case_data._slopetyp != case_data._missing_value): + slopetyp_var = nc_file.createVariable('slopetyp', wp) + slopetyp_var.units = 'none' + slopetyp_var.standard_name = 'slope type (1-9)' + slopetyp_var[:] = case_data._slopetyp + + if (case_data._tsfco != case_data._missing_value): + tsfco_var = nc_file.createVariable('tsfco', wp) + tsfco_var.units = 'none' + tsfco_var.standard_name = 'slope type (1-9)' + tsfco_var[:] = case_data._tsfco + + if (case_data._vegfrac != case_data._missing_value): + vegfrac_var = nc_file.createVariable('vegfrac', wp) + vegfrac_var.units = 'none' + vegfrac_var.standard_name = 'slope type (1-9)' + vegfrac_var[:] = case_data._vegfrac + + if (case_data._shdmin != case_data._missing_value): + shdmin_var = nc_file.createVariable('shdmin', wp) + shdmin_var.units = 'none' + shdmin_var.standard_name = 'slope type (1-9)' + shdmin_var[:] = case_data._shdmin + + if (case_data._shdmax != case_data._missing_value): + shdmax_var = nc_file.createVariable('shdmax', wp) + shdmax_var.units = 'none' + shdmax_var.standard_name = 'slope type (1-9)' + shdmax_var[:] = case_data._shdmax + + if (case_data._canopy != case_data._missing_value): + canopy_var = nc_file.createVariable('canopy', wp) + canopy_var.units = 'kg m-2' + canopy_var.standard_name = 'amount of water stored in canopy' + canopy_var[:] = case_data._canopy + + if (case_data._hice != case_data._missing_value): + hice_var = nc_file.createVariable('hice', wp) + hice_var.units = 'm' + hice_var.standard_name = 'sea ice thickness' + hice_var[:] = case_data._hice + + if (case_data._fice != case_data._missing_value): + fice_var = nc_file.createVariable('fice', wp) + fice_var.units = 'none' + fice_var.standard_name = 'ice fraction' + fice_var[:] = case_data._fice + + if (case_data._tisfc != case_data._missing_value): + tisfc_var = nc_file.createVariable('tisfc', wp) + tisfc_var.units = 'K' + tisfc_var.standard_name = 'ice surface temperature' + tisfc_var[:] = case_data._tisfc + + if (case_data._snowd != case_data._missing_value): + snowd_var = nc_file.createVariable('snowd', wp) + snowd_var.units = 'mm' + snowd_var.standard_name = 'water equivalent snow depth' + snowd_var[:] = case_data._snowd + + if (case_data._snoalb != case_data._missing_value): + snoalb_var = nc_file.createVariable('snoalb', wp) + snoalb_var.units = 'none' + snoalb_var.standard_name = 'maximum snow albedo' + snoalb_var[:] = case_data._snoalb + + if (case_data._tg3 != case_data._missing_value): + tg3_var = nc_file.createVariable('tg3', wp) + tg3_var.units = 'K' + tg3_var.standard_name = 'deep soil temperature' + tg3_var[:] = case_data._tg3 + + if (case_data._uustar != case_data._missing_value): + uustar_var = nc_file.createVariable('uustar', wp) + uustar_var.units = 'm s-1' + uustar_var.standard_name = 'surface_friction_velocity' + uustar_var[:] = case_data._uustar + + if (case_data._alvsf != case_data._missing_value): + alvsf_var = nc_file.createVariable('alvsf', wp) + alvsf_var.units = 'none' + alvsf_var.standard_name = '60 degree vis albedo with strong cosz dependency' + alvsf_var[:] = case_data._alvsf + + if (case_data._alnsf != case_data._missing_value): + alnsf_var = nc_file.createVariable('alnsf', wp) + alnsf_var.units = 'none' + alnsf_var.standard_name = '60 degree nir albedo with strong cosz dependency' + alnsf_var[:] = case_data._alnsf + + if (case_data._alvwf != case_data._missing_value): + alvwf_var = nc_file.createVariable('alvwf', wp) + alvwf_var.units = 'none' + alvwf_var.standard_name = '60 degree vis albedo with weak cosz dependency' + alvwf_var[:] = case_data._alvwf + + if (case_data._alnwf != case_data._missing_value): + alnwf_var = nc_file.createVariable('alnwf', wp) + alnwf_var.units = 'none' + alnwf_var.standard_name = '60 degree nir albedo with weak cosz dependency' + alnwf_var[:] = case_data._alnwf + + if (case_data._facsf != case_data._missing_value): + facsf_var = nc_file.createVariable('facsf', wp) + facsf_var.units = 'none' + facsf_var.standard_name = 'fractional coverage with strong cosz dependency' + facsf_var[:] = case_data._facsf + + if (case_data._facwf != case_data._missing_value): + facwf_var = nc_file.createVariable('facwf', wp) + facwf_var.units = 'none' + facwf_var.standard_name = 'fractional coverage with weak cosz dependency' + facwf_var[:] = case_data._facwf + + if (case_data._weasd != case_data._missing_value): + weasd_var = nc_file.createVariable('weasd', wp) + weasd_var.units = 'mm' + weasd_var.standard_name = 'water equivalent accumulated snow depth' + weasd_var[:] = case_data._weasd + + if (case_data._f10m != case_data._missing_value): + f10m_var = nc_file.createVariable('f10m', wp) + f10m_var.units = 'none' + f10m_var.standard_name = 'ratio of sigma level 1 wind and 10m wind' + f10m_var[:] = case_data._f10m + + if (case_data._t2m != case_data._missing_value): + t2m_var = nc_file.createVariable('t2m', wp) + t2m_var.units = 'K' + t2m_var.standard_name = '2-meter absolute temperature' + t2m_var[:] = case_data._t2m + + if (case_data._q2m != case_data._missing_value): + q2m_var = nc_file.createVariable('q2m', wp) + q2m_var.units = 'kg kg-1' + q2m_var.standard_name = '2-meter specific humidity' + q2m_var[:] = case_data._q2m + + if (case_data._ffmm != case_data._missing_value): + ffmm_var = nc_file.createVariable('ffmm', wp) + ffmm_var.units = 'none' + ffmm_var.standard_name = 'Monin-Obukhov similarity function for momentum' + ffmm_var[:] = case_data._ffmm + + if (case_data._ffhh != case_data._missing_value): + ffhh_var = nc_file.createVariable('ffhh', wp) + ffhh_var.units = 'none' + ffhh_var.standard_name = 'Monin-Obukhov similarity function for heat' + ffhh_var[:] = case_data._ffhh + + if (case_data._tprcp != case_data._missing_value): + tprcp_var = nc_file.createVariable('tprcp', wp) + tprcp_var.units = 'm' + tprcp_var.standard_name = 'instantaneous total precipitation amount' + tprcp_var[:] = case_data._tprcp + + if (case_data._srflag != case_data._missing_value): + srflag_var = nc_file.createVariable('srflag', wp) + srflag_var.units = 'none' + srflag_var.standard_name = 'snow/rain flag for precipitation' + srflag_var[:] = case_data._srflag + + if (case_data._sncovr != case_data._missing_value): + sncovr_var = nc_file.createVariable('sncovr', wp) + sncovr_var.units = 'none' + sncovr_var.standard_name = 'surface snow area fraction' + sncovr_var[:] = case_data._sncovr + + if (case_data._tsfcl != case_data._missing_value): + tsfcl_var = nc_file.createVariable('tsfcl', wp) + tsfcl_var.units = 'K' + tsfcl_var.standard_name = 'surface skin temperature over land' + tsfcl_var[:] = case_data._tsfcl + + if (case_data._zorl != case_data._missing_value): + zorl_var = nc_file.createVariable('zorl', wp) + zorl_var.units = 'cm' + zorl_var.standard_name = 'surface roughness length' + zorl_var[:] = case_data._zorl + + if (case_data._zorll != case_data._missing_value): + zorll_var = nc_file.createVariable('zorll', wp) + zorll_var.units = 'cm' + zorll_var.standard_name = 'surface roughness length over land' + zorll_var[:] = case_data._zorll + + if (case_data._zorli != case_data._missing_value): + zorli_var = nc_file.createVariable('zorli', wp) + zorli_var.units = 'cm' + zorli_var.standard_name = 'surface roughness length over ice' + zorli_var[:] = case_data._zorli + + if (case_data._zorlw != case_data._missing_value): + zorlw_var = nc_file.createVariable('zorlw', wp) + zorlw_var.units = 'cm' + zorlw_var.standard_name = 'surface roughness length over ocean' + zorlw_var[:] = case_data._zorlw + + if (case_data._zorlwav != case_data._missing_value): + zorlwav_var = nc_file.createVariable('zorlwav', wp) + zorlwav_var.units = 'cm' + zorlwav_var.standard_name = 'surface_roughness_length_from_wave_model' + zorlwav_var[:] = case_data._zorlwav + + if (case_data._tvxy != case_data._missing_value): + tvxy_var = nc_file.createVariable('tvxy', wp) + tvxy_var.units = 'K' + tvxy_var.standard_name = 'vegetation temperature for NoahMP' + tvxy_var[:] = case_data._tvxy + + if (case_data._tgxy != case_data._missing_value): + tgxy_var = nc_file.createVariable('tgxy', wp) + tgxy_var.units = 'K' + tgxy_var.standard_name = 'ground temperature for NoahMP' + tgxy_var[:] = case_data._tgxy + + if (case_data._tahxy != case_data._missing_value): + tahxy_var = nc_file.createVariable('tahxy', wp) + tahxy_var.units = 'K' + tahxy_var.standard_name = 'canopy air temperature for NoahMP' + tahxy_var[:] = case_data._tahxy + + if (case_data._canicexy != case_data._missing_value): + canicexy_var = nc_file.createVariable('canicexy', wp) + canicexy_var.units = 'mm' + canicexy_var.standard_name = 'canopy intercepted ice mass for NoahMP' + canicexy_var[:] = case_data._canicexy + + if (case_data._canliqxy != case_data._missing_value): + canliqxy_var = nc_file.createVariable('canliqxy', wp) + canliqxy_var.units = 'mm' + canliqxy_var.standard_name = 'canopy intercepted liquid water for NoahMP' + canliqxy_var[:] = case_data._canliqxy + + if (case_data._eahxy != case_data._missing_value): + eahxy_var = nc_file.createVariable('eahxy', wp) + eahxy_var.units = 'Pa' + eahxy_var.standard_name = 'canopy air vapor pressure for NoahMP' + eahxy_var[:] = case_data._eahxy + + if (case_data._cmxy != case_data._missing_value): + cmxy_var = nc_file.createVariable('cmxy', wp) + cmxy_var.units = 'none' + cmxy_var.standard_name = 'surface drag coefficient for momentum for NoahMP' + cmxy_var[:] = case_data._cmxy + + if (case_data._chxy != case_data._missing_value): + chxy_var = nc_file.createVariable('chxy', wp) + chxy_var.units = 'none' + chxy_var.standard_name = 'surface exchange coeff heat & moisture for NoahMP' + chxy_var[:] = case_data._chxy + + if (case_data._fwetxy != case_data._missing_value): + fwetxy_var = nc_file.createVariable('fwetxy', wp) + fwetxy_var.units = 'none' + fwetxy_var.standard_name = 'area fraction of canopy that is wetted/snowed for NoahMP' + fwetxy_var[:] = case_data._fwetxy + + if (case_data._sneqvoxy != case_data._missing_value): + sneqvoxy_var = nc_file.createVariable('sneqvoxy', wp) + sneqvoxy_var.units = 'mm' + sneqvoxy_var.standard_name = 'snow mass at previous time step for NoahMP' + sneqvoxy_var[:] = case_data._sneqvoxy + + if (case_data._alboldxy != case_data._missing_value): + alboldxy_var = nc_file.createVariable('alboldxy', wp) + alboldxy_var.units = 'none' + alboldxy_var.standard_name = 'snow albedo at previous time step for NoahMP' + alboldxy_var[:] = case_data._alboldxy + + if (case_data._qsnowxy != case_data._missing_value): + qsnowxy_var = nc_file.createVariable('qsnowxy', wp) + qsnowxy_var.units = 'mm s-1' + qsnowxy_var.standard_name = 'snow precipitation rate at surface for NoahMP' + qsnowxy_var[:] = case_data._qsnowxy + + if (case_data._wslakexy != case_data._missing_value): + wslakexy_var = nc_file.createVariable('wslakexy', wp) + wslakexy_var.units = 'mm' + wslakexy_var.standard_name = 'lake water storage for NoahMP' + wslakexy_var[:] = case_data._wslakexy + + if (case_data._taussxy != case_data._missing_value): + taussxy_var = nc_file.createVariable('taussxy', wp) + taussxy_var.units = 'none' + taussxy_var.standard_name = 'non-dimensional snow age for NoahMP' + taussxy_var[:] = case_data._taussxy + + + if (case_data._waxy != case_data._missing_value): + waxy_var = nc_file.createVariable('waxy', wp) + waxy_var.units = 'mm' + waxy_var.standard_name = 'water storage in aquifer for NoahMP' + waxy_var[:] = case_data._waxy + + if (case_data._wtxy != case_data._missing_value): + wtxy_var = nc_file.createVariable('wtxy', wp) + wtxy_var.units = 'mm' + wtxy_var.standard_name = 'ater storage in aquifer and saturated soil for NoahMP' + wtxy_var[:] = case_data._wtxy + + if (case_data._zwtxy != case_data._missing_value): + zwtxy_var = nc_file.createVariable('zwtxy', wp) + zwtxy_var.units = 'm' + zwtxy_var.standard_name = 'water table depth for NoahMP' + zwtxy_var[:] = case_data._zwtxy + + if (case_data._xlaixy != case_data._missing_value): + xlaixy_var = nc_file.createVariable('xlaixy', wp) + xlaixy_var.units = 'none' + xlaixy_var.standard_name = 'leaf area index for NoahMP' + xlaixy_var[:] = case_data._xlaixy + + if (case_data._xsaixy != case_data._missing_value): + xsaixy_var = nc_file.createVariable('xsaixy', wp) + xsaixy_var.units = 'none' + xsaixy_var.standard_name = 'stem area index for NoahMP' + xsaixy_var[:] = case_data._xsaixy + + if (case_data._lfmassxy != case_data._missing_value): + lfmassxy_var = nc_file.createVariable('lfmassxy', wp) + lfmassxy_var.units = 'g m-2' + lfmassxy_var.standard_name = 'leaf mass for NoahMP' + lfmassxy_var[:] = case_data._lfmassxy + + if (case_data._stmassxy != case_data._missing_value): + stmassxy_var = nc_file.createVariable('stmassxy', wp) + stmassxy_var.units = 'g m-2' + stmassxy_var.standard_name = 'stem mass for NoahMP' + stmassxy_var[:] = case_data._stmassxy + + if (case_data._rtmassxy != case_data._missing_value): + rtmassxy_var = nc_file.createVariable('rtmassxy', wp) + rtmassxy_var.units = 'g m-2' + rtmassxy_var.standard_name = 'fine root mass for NoahMP' + rtmassxy_var[:] = case_data._rtmassxy + + if (case_data._woodxy != case_data._missing_value): + woodxy_var = nc_file.createVariable('woodxy', wp) + woodxy_var.units = 'g m-2' + woodxy_var.standard_name = 'wood mass including woody roots for NoahMP' + woodxy_var[:] = case_data._woodxy + + if (case_data._stblcpxy != case_data._missing_value): + stblcpxy_var = nc_file.createVariable('stblcpxy', wp) + stblcpxy_var.units = 'g m-2' + stblcpxy_var.standard_name = 'stable carbon in deep soil for NoahMP' + stblcpxy_var[:] = case_data._stblcpxy + + if (case_data._fastcpxy != case_data._missing_value): + fastcpxy_var = nc_file.createVariable('fastcpxy', wp) + fastcpxy_var.units = 'g m-2' + fastcpxy_var.standard_name = 'short-lived carbon in shallow soil for NoahMP' + fastcpxy_var[:] = case_data._fastcpxy + + if (case_data._smcwtdxy != case_data._missing_value): + smcwtdxy_var = nc_file.createVariable('smcwtdxy', wp) + smcwtdxy_var.units = 'm3 m-3' + smcwtdxy_var.standard_name = 'oil water content between the bottom of the soil and the water table for NoahMP' + smcwtdxy_var[:] = case_data._smcwtdxy + + if (case_data._deeprechxy != case_data._missing_value): + deeprechxy_var = nc_file.createVariable('deeprechxy', wp) + deeprechxy_var.units = 'm' + deeprechxy_var.standard_name = 'echarge to or from the water table when deep for NoahMP' + deeprechxy_var[:] = case_data._deeprechxy + + if (case_data._rechxy != case_data._missing_value): + rechxy_var = nc_file.createVariable('rechxy', wp) + rechxy_var.units = 'm' + rechxy_var.standard_name = 'recharge to or from the water table when shallow for NoahMP' + rechxy_var[:] = case_data._rechxy + + if (case_data._snowxy != case_data._missing_value): + snowxy_var = nc_file.createVariable('snowxy', wp) + snowxy_var.units = 'none' + snowxy_var.standard_name = 'number of snow layers for NoahMP' + snowxy_var[:] = case_data._snowxy + + if (case_data._wetness != case_data._missing_value): + wetness_var = nc_file.createVariable('wetness', wp) + wetness_var.units = 'none' + wetness_var.standard_name = 'normalized soil wetness for RUC LSM' + wetness_var[:] = case_data._wetness + + if (case_data._clw_surf_land != case_data._missing_value): + clw_surf_land_var = nc_file.createVariable('clw_surf_land', wp) + clw_surf_land_var.units = 'kg kg-1' + clw_surf_land_var.standard_name = 'cloud condensed water mixing ratio at surface over land for RUC LSM' + clw_surf_land_var[:] = case_data._clw_surf_land + + if (case_data._clw_surf_ice != case_data._missing_value): + clw_surf_ice_var = nc_file.createVariable('clw_surf_ice', wp) + clw_surf_ice_var.units = 'kg kg-1' + clw_surf_ice_var.standard_name = 'cloud condensed water mixing ratio at surface over ice for RUC LSM' + clw_surf_ice_var[:] = case_data._clw_surf_ice + + if (case_data._qwv_surf_land != case_data._missing_value): + qwv_surf_land_var = nc_file.createVariable('qwv_surf_land', wp) + qwv_surf_land_var.units = 'kg kg-1' + qwv_surf_land_var.standard_name = 'water vapor mixing ratio at surface over land for RUC LSM' + qwv_surf_land_var[:] = case_data._qwv_surf_land + + if (case_data._qwv_surf_ice != case_data._missing_value): + qwv_surf_ice_var = nc_file.createVariable('qwv_surf_ice', wp) + qwv_surf_ice_var.units = 'kg kg-1' + qwv_surf_ice_var.standard_name = 'water vapor mixing ratio at surface over ice for RUC LSM' + qwv_surf_ice_var[:] = case_data._qwv_surf_ice + + if (case_data._tsnow_land != case_data._missing_value): + tsnow_land_var = nc_file.createVariable('tsnow_land', wp) + tsnow_land_var.units = 'K' + tsnow_land_var.standard_name = 'snow temperature at the bottom of the first snow layer over land for RUC LSM' + tsnow_land_var[:] = case_data._tsnow_land + + if (case_data._tsnow_ice != case_data._missing_value): + tsnow_ice_var = nc_file.createVariable('tsnow_ice', wp) + tsnow_ice_var.units = 'K' + tsnow_ice_var.standard_name = 'snow temperature at the bottom of the first snow layer over land for RUC LSM' + tsnow_ice_var[:] = case_data._tsnow_ice + + if (case_data._snowfallac_land != case_data._missing_value): + snowfallac_land_var = nc_file.createVariable('snowfallac_land', wp) + snowfallac_land_var.units = 'kg m-2' + snowfallac_land_var.standard_name = 'run-total snow accumulation on the ground over land for RUC LSM' + snowfallac_land_var[:] = case_data._snowfallac_land + + if (case_data._snowfallac_ice != case_data._missing_value): + snowfallac_ice_var = nc_file.createVariable('snowfallac_ice', wp) + snowfallac_ice_var.units = 'kg m-2' + snowfallac_ice_var.standard_name = 'run-total snow accumulation on the ground over land for RUC LSM' + snowfallac_ice_var[:] = case_data._snowfallac_ice + + if (case_data._sncovr_ice != case_data._missing_value): + sncovr_ice_var = nc_file.createVariable('sncovr_ice', wp) + sncovr_ice_var.units = 'none' + sncovr_ice_var.standard_name = 'surface snow area fraction over ice' + sncovr_ice_var[:] = case_data._sncovr_ice + + if (case_data._sfalb_lnd != case_data._missing_value): + sfalb_lnd_var = nc_file.createVariable('sfalb_lnd', wp) + sfalb_lnd_var.units = 'none' + sfalb_lnd_var.standard_name = 'surface albedo over land for RUC LSM' + sfalb_lnd_var[:] = case_data._sfalb_lnd + + if (case_data._sfalb_lnd_bck != case_data._missing_value): + sfalb_lnd_bck_var = nc_file.createVariable('sfalb_lnd_bckß', wp) + sfalb_lnd_bck_var.units = 'none' + sfalb_lnd_bck_var.standard_name = 'surface snow-free albedo over land for RUC LSM' + sfalb_lnd_bck_var[:] = case_data._sfalb_lnd_bck + + if (case_data._emis_ice != case_data._missing_value): + emis_ice_var = nc_file.createVariable('emis_ice', wp) + emis_ice_var.units = 'none' + emis_ice_var.standard_name = 'surface emissivity over ice for RUC LSM' + emis_ice_var[:] = case_data._emis_ice + + if (case_data._lai != case_data._missing_value): + lai_var = nc_file.createVariable('lai', wp) + lai_var.units = 'none' + lai_var.standard_name = 'leaf area index for RUC LSM' + lai_var[:] = case_data._lai + + area_var = nc_file.createVariable('area', wp) + area_var.units = 'm2' + area_var.standard_name = 'grid cell area' + if ('column_area' in nml_keys and case_nml['case_config']['column_area']): + area_var[:] = case_nml['case_config']['column_area'] + message = 'Since column_area was supplied in the case namelist, it will be used instead of the data from the case data file (if it exists).' + logging.info(message) + elif (case_data._area != case_data._missing_value): + area_var[:] = case_data._area + + if (case_data._stddev != case_data._missing_value): + stddev_var = nc_file.createVariable('stddev', wp) + stddev_var.units = 'm' + stddev_var.standard_name = 'standard deviation of subgrid orography' + stddev_var[:] = case_data._stddev + + if (case_data._convexity != case_data._missing_value): + convexity_var = nc_file.createVariable('convexity', wp) + convexity_var.units = 'none' + convexity_var.standard_name = 'convexity of subgrid orography' + convexity_var[:] = case_data._convexity + + if (case_data._oa1 != case_data._missing_value): + oa1_var = nc_file.createVariable('oa1', wp) + oa1_var.units = 'none' + oa1_var.standard_name = 'assymetry of subgrid orography 1' + oa1_var[:] = case_data._oa1 + + if (case_data._oa2 != case_data._missing_value): + oa2_var = nc_file.createVariable('oa2', wp) + oa2_var.units = 'none' + oa2_var.standard_name = 'assymetry of subgrid orography 2' + oa2_var[:] = case_data._oa2 + + if (case_data._oa3 != case_data._missing_value): + oa3_var = nc_file.createVariable('oa3', wp) + oa3_var.units = 'none' + oa3_var.standard_name = 'assymetry of subgrid orography 3' + oa3_var[:] = case_data._oa3 + + if (case_data._oa4 != case_data._missing_value): + oa4_var = nc_file.createVariable('oa4', wp) + oa4_var.units = 'none' + oa4_var.standard_name = 'assymetry of subgrid orography 4' + oa4_var[:] = case_data._oa4 + + if (case_data._ol1 != case_data._missing_value): + ol1_var = nc_file.createVariable('ol1', wp) + ol1_var.units = 'none' + ol1_var.standard_name = 'fraction of grid box with subgrid orography higher than critical height 1' + ol1_var[:] = case_data._ol1 + + if (case_data._ol2 != case_data._missing_value): + ol2_var = nc_file.createVariable('ol2', wp) + ol2_var.units = 'none' + ol2_var.standard_name = 'fraction of grid box with subgrid orography higher than critical height 2' + ol2_var[:] = case_data._ol2 + + if (case_data._ol3 != case_data._missing_value): + ol3_var = nc_file.createVariable('ol3', wp) + ol3_var.units = 'none' + ol3_var.standard_name = 'fraction of grid box with subgrid orography higher than critical height 3' + ol3_var[:] = case_data._ol3 + + if (case_data._ol4 != case_data._missing_value): + ol4_var = nc_file.createVariable('ol4', wp) + ol4_var.units = 'none' + ol4_var.standard_name = 'fraction of grid box with subgrid orography higher than critical height 4' + ol4_var[:] = case_data._ol4 + + if (case_data._theta_oro != case_data._missing_value): + theta_oro_var = nc_file.createVariable('theta_oro', wp) + theta_oro_var.units = 'deg' + theta_oro_var.standard_name = 'angle with respect to east of maximum subgrid orographic variations' + theta_oro_var[:] = case_data._theta_oro + + if (case_data._gamma != case_data._missing_value): + gamma_var = nc_file.createVariable('gamma', wp) + gamma_var.units = 'none' + gamma_var.standard_name = 'anisotropy of subgrid orography' + gamma_var[:] = case_data._gamma + + if (case_data._sigma != case_data._missing_value): + sigma_var = nc_file.createVariable('sigma', wp) + sigma_var.units = 'none' + sigma_var.standard_name = 'slope of subgrid orography' + sigma_var[:] = case_data._sigma + + if (case_data._elvmax != case_data._missing_value): + elvmax_var = nc_file.createVariable('elvmax', wp) + elvmax_var.units = 'm' + elvmax_var.standard_name = 'maximum of subgrid orography' + elvmax_var[:] = case_data._elvmax + + if (case_data._oro != case_data._missing_value): + oro_var = nc_file.createVariable('oro', wp) + oro_var.units = 'm' + oro_var.standard_name = 'orography' + oro_var[:] = case_data._oro + + if (case_data._oro_uf != case_data._missing_value): + oro_uf_var = nc_file.createVariable('oro_uf', wp) + oro_uf_var.units = 'm' + oro_uf_var.standard_name = 'unfiltered orography' + oro_uf_var[:] = case_data._oro_uf + + if (case_data._landfrac != case_data._missing_value): + landfrac_var = nc_file.createVariable('landfrac', wp) + landfrac_var.units = 'none' + landfrac_var.standard_name = 'fraction of horizontal grid area occupied by land' + landfrac_var[:] = case_data._landfrac + + if (case_data._lakefrac != case_data._missing_value): + lakefrac_var = nc_file.createVariable('lakefrac', wp) + lakefrac_var.units = 'none' + lakefrac_var.standard_name = 'fraction of horizontal grid area occupied by lake' + lakefrac_var[:] = case_data._lakefrac + + if (case_data._lakedepth != case_data._missing_value): + lakedepth_var = nc_file.createVariable('lakedepth', wp) + lakedepth_var.units = 'none' + lakedepth_var.standard_name = 'lake depth' + lakedepth_var[:] = case_data._lakedepth + + if (case_data._tref != case_data._missing_value): + tref_var = nc_file.createVariable('tref', wp) + tref_var.units = 'K' + tref_var.standard_name = 'sea surface reference temperature for NSST' + tref_var[:] = case_data._tref + + if (case_data._z_c != case_data._missing_value): + z_c_var = nc_file.createVariable('z_c', wp) + z_c_var.units = 'm' + z_c_var.standard_name = 'sub-layer cooling thickness for NSST' + z_c_var[:] = case_data._z_c + + if (case_data._c_0 != case_data._missing_value): + c_0_var = nc_file.createVariable('c_0', wp) + c_0_var.units = 'none' + c_0_var.standard_name = 'coefficient 1 to calculate d(Tz)/d(Ts) for NSST' + c_0_var[:] = case_data._c_0 + + if (case_data._c_d != case_data._missing_value): + c_d_var = nc_file.createVariable('c_d', wp) + c_d_var.units = 'none' + c_d_var.standard_name = 'coefficient 2 to calculate d(Tz)/d(Ts) for NSST' + c_d_var[:] = case_data._c_d + + if (case_data._w_0!= case_data._missing_value): + w_0_var = nc_file.createVariable('w_0', wp) + w_0_var.units = 'none' + w_0_var.standard_name = 'coefficient 3 to calculate d(Tz)/d(Ts) for NSST' + w_0_var[:] = case_data._w_0 + + if (case_data._w_d != case_data._missing_value): + w_d_var = nc_file.createVariable('w_d', wp) + w_d_var.units = 'none' + w_d_var.standard_name = 'coefficient 4 to calculate d(Tz)/d(Ts) for NSST' + w_d_var[:] = case_data._w_d + + if (case_data._xt != case_data._missing_value): + xt_var = nc_file.createVariable('xt', wp) + xt_var.units = 'K m' + xt_var.standard_name = 'heat content in diurnal thermocline layer for NSST' + xt_var[:] = case_data._xt + + if (case_data._xs != case_data._missing_value): + xs_var = nc_file.createVariable('xs', wp) + xs_var.units = 'ppt m' + xs_var.standard_name = 'salinity content in diurnal thermocline layer for NSST' + xs_var[:] = case_data._xs + + if (case_data._xu != case_data._missing_value): + xu_var = nc_file.createVariable('xu', wp) + xu_var.units = 'm2 s-1' + xu_var.standard_name = 'u-current in diurnal thermocline layer for NSST' + xu_var[:] = case_data._xu + + if (case_data._xv != case_data._missing_value): + xv_var = nc_file.createVariable('xv', wp) + xv_var.units = 'm2 s-1' + xv_var.standard_name = 'v-current in diurnal thermocline layer for NSST' + xv_var[:] = case_data._xv + + if (case_data._xz != case_data._missing_value): + xz_var = nc_file.createVariable('xz', wp) + xz_var.units = 'm' + xz_var.standard_name = 'thickness of diurnal thermocline layer for NSST' + xz_var[:] = case_data._xz + + if (case_data._zm != case_data._missing_value): + zm_var = nc_file.createVariable('zm', wp) + zm_var.units = 'm' + zm_var.standard_name = 'thickness of ocean mixed layer for NSST' + zm_var[:] = case_data._zm + + if (case_data._xtts != case_data._missing_value): + xtts_var = nc_file.createVariable('xtts', wp) + xtts_var.units = 'm' + xtts_var.standard_name = 'sensitivity of diurnal thermocline layer heat content to surface temperature [d(xt)/d(ts)] for NSST' + xtts_var[:] = case_data._xtts + + if (case_data._xzts != case_data._missing_value): + xzts_var = nc_file.createVariable('xzts', wp) + xzts_var.units = 'm K-1' + xzts_var.standard_name = 'sensitivity of diurnal thermocline layer thickness to surface temperature [d(xz)/d(ts)] for NSST' + xzts_var[:] = case_data._xzts + + if (case_data._d_conv != case_data._missing_value): + d_conv_var = nc_file.createVariable('d_conv', wp) + d_conv_var.units = 'm' + d_conv_var.standard_name = 'thickness of free convection layer for NSST' + d_conv_var[:] = case_data._d_conv + + if (case_data._ifd != case_data._missing_value): + ifd_var = nc_file.createVariable('ifd', wp) + ifd_var.units = 'none' + ifd_var.standard_name = 'index to start DTM run for NSST' + ifd_var[:] = case_data._ifd + + if (case_data._dt_cool != case_data._missing_value): + dt_cool_var = nc_file.createVariable('dt_cool', wp) + dt_cool_var.units = 'K' + dt_cool_var.standard_name = 'sub-layer cooling amount for NSST' + dt_cool_var[:] = case_data._dt_cool + + if (case_data._qrain != case_data._missing_value): + qrain_var = nc_file.createVariable('qrain', wp) + qrain_var.units = 'W m-2' + qrain_var.standard_name = 'sensible heat due to rainfall for NSST' + qrain_var[:] = case_data._qrain + + if (case_data._theta_il[0] != case_data._missing_value): + thetal_var = nc_file.createVariable('thetal', wp, ('t0','lev')) + thetal_var.units = 'K' + thetal_var.standard_name = 'air_liquid_potential_temperature' + thetal_var[:] = case_data._theta_il[:] + + if (case_data._t[0] != case_data._missing_value): + t_var = nc_file.createVariable('t', wp, ('t0','lev')) + t_var.units = 'K' + t_var.standard_name = 'absolute temperature' + t_var[:] = case_data._t[:] + + # + qt_var = nc_file.createVariable('qt', wp, ('t0','lev')) + qt_var.units = 'kg kg-1' + qt_var.standard_name = 'mass_fraction_of_water_in_air' + qt_var[:] = case_data._qt[:] + + # + u_var = nc_file.createVariable('ua', wp, ('t0','lev')) + u_var.units = 'm s-1' + u_var.standard_name = 'eastward_wind' + u_var[:] = case_data._u[:] + + # + v_var = nc_file.createVariable('va', wp, ('t0','lev')) + v_var.units = 'm s-1' + v_var.standard_name = 'northward_wind' + v_var[:] = case_data._v[:] + + # + p_var = nc_file.createVariable('pa', wp, ('t0','lev')) + p_var.units = 'Pa' + p_var.standard_name = 'air_pressure' + p_var[:] = case_data._levels[:] + + # + z_var = nc_file.createVariable('zh', wp, ('t0','lev')) + z_var.units = 'm' + z_var.standard_name = 'height' + z_var[:] = case_data._height[:] + + # + ps_var = nc_file.createVariable('ps', wp, ('t0')) + ps_var.units = 'Pa' + ps_var.standard_name = 'surface_air_pressure' + ps_var[:] = case_data._p_surf[0] + + # + ql_var = nc_file.createVariable('ql', wp, ('t0','lev')) + ql_var.units = 'kg kg-1' + ql_var.standard_name = 'mass_fraction_of_cloud_liquid_water_in_air' + ql_var[:] = case_data._ql[:] + + # + qi_var = nc_file.createVariable('qi', wp, ('t0','lev')) + qi_var.units = 'kg kg-1' + qi_var.standard_name = 'mass_fraction_of_cloud_ice_water_in_air' + qi_var[:] = case_data._qi[:] + + # + tke_var = nc_file.createVariable('tke', wp, ('t0','lev')) + tke_var.units = 'm2 s-2' + tke_var.standard_name = 'specific_turbulent_kinetic_energy' + tke_var[:] = case_data._tke[:] + + # + ozone_var = nc_file.createVariable('o3', wp, ('t0','lev')) + ozone_var.units = 'kg kg-1' + ozone_var.standard_name = 'mole_fraction_of_ozone_in_air' + ozone_var[:] = case_data._ozone[:] + + if (case_data._stc[0] != case_data._missing_value): + stc_var = nc_file.createVariable('stc', wp, ('t0','nsoil')) + stc_var.units = 'K' + stc_var.standard_name = 'initial profile of soil temperature' + stc_var[:] = case_data._stc[:] + + if (case_data._smc[0] != case_data._missing_value): + smc_var = nc_file.createVariable('smc', wp, ('t0','nsoil')) + smc_var.units = 'kg' + smc_var.standard_name = 'initial profile of soil moisture' + smc_var[:] = case_data._smc[:] + + if (case_data._slc[0] != case_data._missing_value): + slc_var = nc_file.createVariable('slc', wp, ('t0','nsoil')) + slc_var.units = 'kg' + slc_var.standard_name = 'initial profile of soil liquid moisture' + slc_var[:] = case_data._slc[:] + + if (case_data._snicexy[0] != case_data._missing_value): + snicexy_var = nc_file.createVariable('snicexy', wp, ('t0','nsnow')) + snicexy_var.units = 'mm' + snicexy_var.standard_name = 'initial profile of snow layer ice' + snicexy_var[:] = case_data._snicexy[:] + + if (case_data._snliqxy[0] != case_data._missing_value): + snliqxy_var = nc_file.createVariable('snliqxy', wp, ('t0','nsnow')) + snliqxy_var.units = 'mm' + snliqxy_var.standard_name = 'initial profile of snow layer liquid' + snliqxy_var[:] = case_data._snliqxy[:] + + if (case_data._tsnoxy[0] != case_data._missing_value): + tsnoxy_var = nc_file.createVariable('tsnoxy', wp, ('t0','nsnow')) + tsnoxy_var.units = 'K' + tsnoxy_var.standard_name = 'initial profile of snow layer temperature' + tsnoxy_var[:] = case_data._tsnoxy[:] + + if (case_data._smoiseq[0] != case_data._missing_value): + smoiseq_var = nc_file.createVariable('smoiseq', wp, ('t0','nsoil')) + smoiseq_var.units = 'm3 m-3' + smoiseq_var.standard_name = 'initial profile of equilibrium soil water content' + smoiseq_var[:] = case_data._smoiseq[:] + + if (case_data._zsnsoxy[0] != case_data._missing_value): + zsnsoxy_var = nc_file.createVariable('zsnxosy', wp, ('t0','nsoil_plus_nsnow')) + zsnsoxy_var.units = 'm' + zsnsoxy_var.standard_name = 'layer bottom depth from snow surface' + zsnsoxy_var[:] = case_data._zsnsoxy[:] + + if (case_data._tiice[0] != case_data._missing_value): + tiice_var = nc_file.createVariable('tiice', wp, ('t0','nice')) + tiice_var.units = 'K' + tiice_var.standard_name = 'sea ice internal temperature' + tiice_var[:] = case_data._tiice[:] + + if (case_data._tslb[0] != case_data._missing_value): + tslb_var = nc_file.createVariable('tslb', wp, ('t0','nsoil')) + tslb_var.units = 'K' + tslb_var.standard_name = 'soil temperature for RUC LSM' + tslb_var[:] = case_data._tslb[:] + + if (case_data._smois[0] != case_data._missing_value): + smois_var = nc_file.createVariable('smois', wp, ('t0','nsoil')) + smois_var.units = 'none' + smois_var.standard_name = 'volume fraction of soil moisture for RUC LSM' + smois_var[:] = case_data._smois[:] + + if (case_data._sh2o[0] != case_data._missing_value): + sh2o_var = nc_file.createVariable('sh2o', wp, ('t0','nsoil')) + sh2o_var.units = 'none' + sh2o_var.standard_name = 'volume fraction of unfrozen soil moisture for RUC LSM' + sh2o_var[:] = case_data._sh2o[:] + + if (case_data._smfr[0] != case_data._missing_value): + smfr_var = nc_file.createVariable('smfr', wp, ('t0','nsoil')) + smfr_var.units = 'none' + smfr_var.standard_name = 'volume fraction of frozen soil moisture for RUC LSM' + smfr_var[:] = case_data._smfr[:] + + if (case_data._flfr[0] != case_data._missing_value): + flfr_var = nc_file.createVariable('flfr', wp, ('t0','nsoil')) + flfr_var.units = 'none' + flfr_var.standard_name = 'flag for frozen soil physics for RUC LSM' + flfr_var[:] = case_data._flfr[:] + + ps_forc_var = nc_file.createVariable('ps_forc', wp, ('time')) + ps_forc_var.units = 'Pa' + ps_forc_var.standard_name = 'forcing_surface_air_pressure' + ps_forc_var[:] = case_data._p_surf[:] + + pa_forc_var = nc_file.createVariable('pa_forc', wp, ('time','lev')) + pa_forc_var.units = 'Pa' + pa_forc_var.standard_name = 'air_pressure_forcing' + pa_forc_var[:] = case_data._levels[:] + + zh_forc_var = nc_file.createVariable('zh_forc', wp, ('time','lev')) + zh_forc_var.units = 'm' + zh_forc_var.standard_name = 'height_forcing' + zh_forc_var[:] = case_data._height[:] + + if (nc_file.adv_ta == forcing_on): + message = 'adv_ta is turned on, but is not implemented in the proprietery CCPP SCM case format and cannot be used.' + logging.critical(message) + raise Exception(message) + # tnta_adv_var = nc_file.createVariable('tnta_adv', wp, ('time','lev')) + # tnta_adv_var.units = 'K s-1' + # tnta_adv_var.standard_name = 'tendency_of_air_temperature_due_to_advection' + # tnta_adv_var[:] = np.swapaxes(case_data._tnta_adv[:],0,1) + + if (nc_file.adv_qv == forcing_on): + message = 'adv_qv is turned on, but is not implemented in the proprietery CCPP SCM case format and cannot be used.' + logging.critical(message) + raise Exception(message) + # tnqv_adv_var = nc_file.createVariable('tnqv_adv', wp, ('time','lev')) + # tnqv_adv_var.units = 'kg kg-1 s-1' + # tnqv_adv_var.standard_name = 'tendency_of_specific_humidity_due_to_advection' + # tnqv_adv_var[:] = np.swapaxes(case_data._tnqv_adv[:],0,1) + + if (nc_file.adv_ua == forcing_on): + message = 'adv_ua is turned on, but is not implemented in the proprietery CCPP SCM case format and cannot be used.' + logging.critical(message) + raise Exception(message) + # tnua_adv_var = nc_file.createVariable('tnua_adv', wp, ('time','lev')) + # tnua_adv_var.units = 'm s-2' + # tnua_adv_var.standard_name = 'tendency_of_eastward_wind_due_to_advection' + # tnua_adv_var[:] = np.swapaxes(case_data._tnua_adv[:],0,1) + + if (nc_file.adv_va == forcing_on): + message = 'adv_va is turned on, but is not implemented in the proprietery CCPP SCM case format and cannot be used.' + logging.critical(message) + raise Exception(message) + # tnva_adv_var = nc_file.createVariable('tnva_adv', wp, ('time','lev')) + # tnva_adv_var.units = 'm s-2' + # tnva_adv_var.standard_name = 'tendency_of_northward_wind_due_to_advection' + # tnva_adv_var[:] = np.swapaxes(case_data._tnva_adv[:],0,1) + + if (nc_file.adv_theta == forcing_on): + message = 'adv_theta is turned on, but is not implemented in the proprietery CCPP SCM case format and cannot be used.' + logging.critical(message) + raise Exception(message) + # tntheta_adv_var = nc_file.createVariable('tntheta_adv', wp, ('time','lev')) + # tntheta_adv_var.units = 'K s-1' + # tntheta_adv_var.standard_name = 'tendency_of_air_potential_temperature_due_to_advection' + # tntheta_adv_var[:] = np.swapaxes(case_data._tntheta_adv[:],0,1) + + if (nc_file.adv_thetal == forcing_on): + tnthetal_adv_var = nc_file.createVariable('tnthetal_adv', wp, ('time','lev')) + tnthetal_adv_var.units = 'K s-1' + tnthetal_adv_var.standard_name = 'tendency_of_air_liquid_potential_temperature_due_to_advection' + if (nc_file.forc_wap == forcing_on or nc_file.forc_wa == forcing_on): + tnthetal_adv_var[:] = np.swapaxes(case_data._h_advec_thil[:],0,1) + else: + tnthetal_adv_var[:] = np.swapaxes(case_data._h_advec_thil[:] + case_data._v_advec_thil[:],0,1) + + if (nc_file.adv_qt == forcing_on): + tnqt_adv_var = nc_file.createVariable('tnqt_adv', wp, ('time','lev')) + tnqt_adv_var.units = 'kg kg-1 s-1' + tnqt_adv_var.standard_name = 'tendency_of_mass_fraction_of_water_in_air_due_to_advection' + if (nc_file.forc_wap == forcing_on or nc_file.forc_wa == forcing_on): + tnqt_adv_var[:] = np.swapaxes(case_data._h_advec_qt[:],0,1) + else: + tnqt_adv_var[:] = np.swapaxes(case_data._h_advec_qt[:] + case_data._v_advec_qt[:],0,1) + + if (nc_file.adv_rv == forcing_on): + message = 'adv_rv is turned on, but is not implemented in the proprietery CCPP SCM case format and cannot be used.' + logging.critical(message) + raise Exception(message) + # tnrv_adv_var = nc_file.createVariable('tnrv_adv', wp, ('time','lev')) + # tnrv_adv_var.units = 'kg kg-1 s-1' + # tnrv_adv_var.standard_name = 'tendency_of_humidity_mixing_ratio_due_to_advection' + # tnrv_adv_var[:] = np.swapaxes(case_data._tnrv_adv[:],0,1) + + if (nc_file.adv_rt == forcing_on): + message = 'adv_rt is turned on, but is not implemented in the proprietery CCPP SCM case format and cannot be used.' + logging.critical(message) + raise Exception(message) + # tnrt_adv_var = nc_file.createVariable('tnrt_adv', wp, ('time','lev')) + # tnrt_adv_var.units = 'kg kg-1 s-1' + # tnrt_adv_var.standard_name = 'tendency_of_water_mixing_ratio_due_to_advection' + # tnrt_adv_var[:] = np.swapaxes(case_data._tnrt_adv[:],0,1) + + if (nc_file.forc_wap == forcing_on): + wap_var = nc_file.createVariable('wap', wp, ('time','lev')) + wap_var.units = 'Pa s-1' + wap_var.standard_name = 'lagrangian_tendency_of_air_pressure' + wap_var[:] = np.swapaxes(case_data._omega[:],0,1) + elif (nc_file.forc_wa == forcing_on): + wa_var = nc_file.createVariable('wa', wp, ('time','lev')) + wa_var.units = 'm s-1' + wa_var.standard_name = 'upward_air_velocity' + wa_var[:] = np.swapaxes(case_data._w_ls[:],0,1) + + if (nc_file.forc_geo == forcing_on): + ug_var = nc_file.createVariable('ug', wp, ('time','lev')) + ug_var.units = 'm s-1' + ug_var.standard_name = 'geostrophic_eastward_wind' + ug_var[:] = np.swapaxes(case_data._u_g[:],0,1) + + vg_var = nc_file.createVariable('vg', wp, ('time','lev')) + vg_var.units = 'm s-1' + vg_var.standard_name = 'geostrophic_northward_wind' + vg_var[:] = np.swapaxes(case_data._v_g[:],0,1) + + if (nc_file.nudging_ua != forcing_off): + ua_nud_var = nc_file.createVariable('ua_nud', wp, ('time','lev')) + ua_nud_var.units = 'm s-1' + ua_nud_var.standard_name = 'nudging_eastward_wind' + ua_nud_var[:] = np.swapaxes(case_data._u_nudge[:],0,1) + + if (nc_file.nudging_va != forcing_off): + va_nud_var = nc_file.createVariable('va_nud', wp, ('time','lev')) + va_nud_var.units = 'm s-1' + va_nud_var.standard_name = 'nudging_northward_wind' + va_nud_var[:] = np.swapaxes(case_data._v_nudge[:],0,1) + + if (nc_file.nudging_ta != forcing_off): + ta_nud_var = nc_file.createVariable('ta_nud', wp, ('time','lev')) + ta_nud_var.units = 'K' + ta_nud_var.standard_name = 'nudging_air_temperature' + ta_nud_var[:] = np.swapaxes(case_data._T_nudge[:],0,1) + + if (nc_file.nudging_qt != forcing_off): + qt_nud_var = nc_file.createVariable('qt_nud', wp, ('time','lev')) + qt_nud_var.units = 'kg kg-1' + qt_nud_var.standard_name = 'nudging_mass_fraction_of_water_in_air' + qt_nud_var[:] = np.swapaxes(case_data._qt_nudge[:],0,1) + + if (case_nml['case_config']['sfc_flux_spec']): + nc_file.surface_forcing_temp = 'kinematic' + nc_file.surface_forcing_moisture = 'kinematic' + nc_file.surface_forcing_wind = 'z0' + + wpthetap_s_var = nc_file.createVariable('wpthetap_s', wp, ('time')) + wpthetap_s_var.units = 'K m s-1' + wpthetap_s_var.standard_name = 'surface_upward_potential_temperature_flux' + wpthetap_s_var[:] = case_data._sh_flux_sfc[:] + + wpqtp_s_var = nc_file.createVariable('wpqvp_s', wp, ('time')) + wpqtp_s_var.units = 'kg kg-1 m s-1' + wpqtp_s_var.standard_name = 'surface_upward_specific_humidity_flux' + wpqtp_s_var[:] = case_data._lh_flux_sfc[:] + + z0_var = nc_file.createVariable('z0', wp, ('time')) + z0_var.units = 'm' + z0_var.standard_name = 'surface_roughness_length_for_momentum_in_air' + z0_var[:] = case_nml['case_config']['sfc_roughness_length_cm']*1.0E-2 + + + ts_var = nc_file.createVariable('ts_forc', wp, ('time')) + ts_var.units = 'K' + ts_var.standard_name = 'forcing_surface_temperature' + if np.any(case_data._T_surf[:]): + ts_var[:] = case_data._T_surf[:] + else: + ts_var[:] = case_data._missing_value + else: + nc_file.surface_forcing_temp = 'ts' + nc_file.surface_forcing_wind = 'z0' + + z0_var = nc_file.createVariable('z0', wp, ('time')) + z0_var.units = 'm' + z0_var.standard_name = 'surface_roughness_length_for_momentum_in_air' + z0_var[:] = case_nml['case_config']['sfc_roughness_length_cm']*1.0E-2 + + ts_var = nc_file.createVariable('ts_forc', wp, ('time')) + ts_var.units = 'K' + ts_var.standard_name = 'forcing_surface_temperature' + ts_var[:] = case_data._T_surf[:] + + + nc_file.close() + + return(fileOUT) + +def write_SCM_nml_file(case_nml): + filename = os.path.join(CASE_NML_DIR, case_nml['case_config']['case_name'] + '_dephy.nml') + + #Go through existing case namelist and only add necessary items to new DEPHY-based namelist + + #add _dephy to case (temporary - to differentiate from old format case) + int_dict = {'case_name':case_nml['case_config']['case_name']+'_dephy', + 'input_type':1} + + nml_keys = case_nml['case_config'].todict().keys() + if ('npz_type' in nml_keys): + int_dict['npz_type'] = case_nml['case_config']['npz_type'] + if int_dict['npz_type'] == 'input' and 'vert_coord_file' in nml_keys: + int_dict['vert_coord_file'] = case_nml['case_config']['vert_coord_file'] + + if ('dt' in nml_keys): + int_dict['dt'] = case_nml['case_config']['dt'] + + #runtime is in netCDF file + + if ('output_dir' in nml_keys): + int_dict['output_dir'] = case_nml['case_config']['output_dir'] + + if ('model_ics' in nml_keys): + int_dict['model_ics'] = case_nml['case_config']['model_ics'] + + if ('lsm_ics' in nml_keys): + int_dict['lsm_ics'] = case_nml['case_config']['lsm_ics'] + + if ('do_spinup' in nml_keys): + int_dict['do_spinup'] = case_nml['case_config']['do_spinup'] + + if ('spinup_timesteps' in nml_keys): + int_dict['spinup_timesteps'] = case_nml['case_config']['spinup_timesteps'] + + if ('C_RES' in nml_keys): + int_dict['C_RES'] = case_nml['case_config']['C_RES'] + + #relax_time is in netCDF file + + #sfc_type is in netCDF file + + #sfc_flux_spec is in netCDF file + + if ('sfc_roughness_length_cm' in nml_keys): + int_dict['sfc_roughness_length_cm'] = case_nml['case_config']['sfc_roughness_length_cm'] + + if ('reference_profile_choice' in nml_keys): + int_dict['reference_profile_choice'] = case_nml['case_config']['reference_profile_choice'] + + if ('column_area' in nml_keys): + int_dict['column_area'] = case_nml['case_config']['column_area'] + + nml_dict = {'case_config':int_dict} + + nml = f90nml.namelist.Namelist(nml_dict) + + #print(nml) + nml.write(filename, force=True) + + return(filename) + +######################################################################################## +# +######################################################################################## +def main(): + (case_name, use_area, debug) = parse_arguments() + + setup_logging(debug) + + (case_nml, error) = get_case_nml(case_name) + if (error): + message = 'The directory {0} does not contain a config file for case {1}'.format(CASE_NML_DIR, case_name) + logging.critical(message) + raise Exception(message) + else: + logging.info(case_nml) + + (case_data, error) = get_case_data(case_name) + if (error): + message = 'The directory {0} does not contain a data file for case {1}'.format(PROCESSED_CASE_DIR, case_name) + logging.critical(message) + raise Exception(message) + else: + logging.debug(case_data) + + fileOUT = write_SCM_case_file(case_nml, case_data, use_area) + logging.debug("Created {}".format(fileOUT)) + + write_SCM_nml_file(case_nml) + +if __name__ == '__main__': + main() diff --git a/scm/etc/scripts/plot_configs/MOSAiC-AMPS.ini b/scm/etc/scripts/plot_configs/MOSAiC-AMPS.ini new file mode 100644 index 000000000..0ce84096a --- /dev/null +++ b/scm/etc/scripts/plot_configs/MOSAiC-AMPS.ini @@ -0,0 +1,63 @@ +scm_datasets = output_MOSAiC-AMPS_SCM_RRFS_v1beta/output.nc, output_MOSAiC-AMPS_SCM_GFS_v17_p8/output.nc, output_MOSAiC-AMPS_SCM_GFS_v16/output.nc +scm_datasets_labels = RRFS_v1beta, GFSv17p8, GFSv16 +plot_dir = plots_MOSAiC-AMPS_all_suites/ +obs_file = ../data/raw_case_input/MOSAiC_31Oct20190Z_raw.nc +obs_compare = True +plot_ind_datasets = True +time_series_resample = False + +[time_slices] + [[active]] + start = 2019, 11, 1, 0 + end = 2019, 11, 2, 0 + +[time_snapshots] + +[plots] + [[profiles_mean]] + vars = ql, qc, qi, qv, T, dT_dt_pbl, T_force_tend, dT_dt_conv, dT_dt_micro, dT_dt_lwrad, dT_dt_phys, qv_force_tend, dq_dt_pbl, dq_dt_shalconv, dq_dt_micro, dq_dt_phys, dq_dt_nonphys, rad_cloud_iwp, rad_cloud_swp, rad_cloud_rwp, rad_cloud_lwp + vars_labels = 'cloud water mixing ratio ($g$ $kg^{-1}$)', 'total cloud water mixing ratio ($g$ $kg^{-1}$)', 'ice+snow+graup mixing ratio ($g$ $kg^{-1}$)', 'specific humidity ($g$ $kg^{-1}$)', 'T (K)', 'PBL tendency (K/day)', 'force (K/day)', 'conv. tendency (K/day)', 'microphysics tendency (K/day)', 'LW tendency (K/day)', 'PHYS (K/day)', 'force (kg/kg/day)', 'PBL tendency (kg/kg/day)', 'ShalConv tendency (kg/kg/day)', 'microphysics tendency (kg/kg/day)', 'PHYS (kg/kg/day)', 'NONPHYS (kg/kg/day)', 'IWC (g/m3)', 'SWC (g/m3)', 'RWC (g/m3)', 'LWC (g/m3)' + vert_axis = pres_l + vert_axis_label = 'average pressure (Pa)' + y_inverted = True + y_log = False +# y_min_option = min #min, max, val (if val, add y_min = float value) + y_min_option = val #min, max, val (if val, add y_min = float value) + y_min = 70000.0 #min, max, val (if val, add y_min = float value) + y_max_option = max #min, max, val (if val, add y_max = float value) + conversion_factor = 1000.0, 1000.0, 1000.0, 1000.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 + + [[profiles_mean_multi]] + [[[T_forcing]]] + vars = T_force_tend, dT_dt_pbl, dT_dt_conv, dT_dt_micro, dT_dt_lwrad + vars_labels = 'force', 'PBL', 'Conv', 'MP', 'LW' + x_label = 'K/day' + [[[QV_forcing]]] + vars = qv_force_tend, dq_dt_pbl, dq_dt_shalconv, dq_dt_micro, dq_dt_phys, dq_dt_nonphys + vars_labels = 'force', 'PBL', 'ShalConv', 'MP', 'PHYS', 'NONPHYS' + x_label = 'kg/kg/day' + [[[conv_tendencies]]] + vars = dT_dt_deepconv, dT_dt_shalconv + vars_labels = 'deep', 'shallow' + x_label = 'K/day' + + [[profiles_instant]] + + [[time_series]] + vars = 'pres_s','lhf','shf','tprcp_rate_inst','t2m','q2m','u10m','v10m','gflux','sfc_dwn_lw','tsfc' + vars_labels = 'surface pressure (Pa)','latent heat flux ($W$ $m^{-2}$)','sensible heat flux ($W$ $m^{-2}$)','surface rainfall rate ($mm$ $hr{-1}$)','2m temperature ($K$)','2m specific humidity ($g$ $kg{-1}$)','10m zonal wind ($m$ $s{-1}$)','10m meridional wind ($m$ $s{-1}$)','ground flux ($W$ $m{-2}$)','downward longwave flux ($W$ $m{-2}$)','surface temperature ($K$)' + + [[contours]] + vars = qv, T, h_advec_qt, h_advec_thil, qi, ql + vars_labels = 'Water Vapor ($g$ $kg^{-1}$)','Temperature ($K$)','Horizontal total water advection ($g$ $kg^{-1}$ $s^{-1}$)','Horizontal thetail advection ($K$ $s^{-1}$)','QI ($g$ $kg^{-1}$)','QL ($g$ $kg^{-1}$)' + vert_axis = pres_l + vert_axis_label = 'p (Pa)' + y_inverted = True + y_log = False + y_min_option = val #min, max, val (if val, add y_min = float value) + y_min = 10000.0 + y_max_option = val #min, max, val (if val, add y_max = float value) + y_max = 100000.0 + x_ticks_num = 10 + y_ticks_num = 10 + conversion_factor = 1000.0, 1.0, 1.0, 1.0, 1000.0, 1000.0 diff --git a/scm/etc/scripts/plot_configs/MOSAiC-SS.ini b/scm/etc/scripts/plot_configs/MOSAiC-SS.ini new file mode 100644 index 000000000..82672321c --- /dev/null +++ b/scm/etc/scripts/plot_configs/MOSAiC-SS.ini @@ -0,0 +1,65 @@ +scm_datasets = output_MOSAiC-SS_SCM_RRFS_v1beta/output.nc, output_MOSAiC-SS_SCM_GFS_v17_p8/output.nc, output_MOSAiC-SS_SCM_GFS_v16/output.nc +##scm_datasets = output_MOSAiC-SS_SCM_GFS_v17_p8/output.nc, output_MOSAiC-SS_SCM_GFS_v16/output.nc +##scm_datasets_labels = GFSv17p8, GFSv16 +scm_datasets_labels = RRFS_v1beta, GFSv17p8, GFSv16 +plot_dir = plots_MOSAiC-SS_all_suites/ +obs_file = ../data/raw_case_input/MOSAiC_2Mar20200Z_raw.nc +obs_compare = True +plot_ind_datasets = True +time_series_resample = False + +[time_slices] + [[active]] + start = 2020, 3, 4, 0 + end = 2020, 3, 5, 0 + +[time_snapshots] + +[plots] + [[profiles_mean]] + vars = ql, qc, qi, qv, T, dT_dt_pbl, T_force_tend, dT_dt_conv, dT_dt_micro, dT_dt_lwrad, dT_dt_phys, qv_force_tend, dq_dt_pbl, dq_dt_shalconv, dq_dt_micro, dq_dt_phys, dq_dt_nonphys, rad_cloud_iwp, rad_cloud_swp, rad_cloud_rwp, rad_cloud_lwp + vars_labels = 'cloud water mixing ratio ($g$ $kg^{-1}$)', 'total cloud water mixing ratio ($g$ $kg^{-1}$)', 'ice+snow+graup mixing ratio ($g$ $kg^{-1}$)', 'specific humidity ($g$ $kg^{-1}$)', 'T (K)', 'PBL tendency (K/day)', 'force (K/day)', 'conv. tendency (K/day)', 'microphysics tendency (K/day)', 'LW tendency (K/day)', 'PHYS (K/day)', 'force (kg/kg/day)', 'PBL tendency (kg/kg/day)', 'ShalConv tendency (kg/kg/day)', 'microphysics tendency (kg/kg/day)', 'PHYS (kg/kg/day)', 'NONPHYS (kg/kg/day)', 'IWC (g/m3)', 'SWC (g/m3)', 'RWC (g/m3)', 'LWC (g/m3)' + vert_axis = pres_l + vert_axis_label = 'average pressure (Pa)' + y_inverted = True + y_log = False +# y_min_option = min #min, max, val (if val, add y_min = float value) + y_min_option = val #min, max, val (if val, add y_min = float value) + y_min = 70000.0 #min, max, val (if val, add y_min = float value) + y_max_option = max #min, max, val (if val, add y_max = float value) + conversion_factor = 1000.0, 1000.0, 1000.0, 1000.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 + + [[profiles_mean_multi]] + [[[T_forcing]]] + vars = T_force_tend, dT_dt_pbl, dT_dt_conv, dT_dt_micro, dT_dt_lwrad + vars_labels = 'force', 'PBL', 'Conv', 'MP', 'LW' + x_label = 'K/day' + [[[QV_forcing]]] + vars = qv_force_tend, dq_dt_pbl, dq_dt_shalconv, dq_dt_micro, dq_dt_phys, dq_dt_nonphys + vars_labels = 'force', 'PBL', 'ShalConv', 'MP', 'PHYS', 'NONPHYS' + x_label = 'kg/kg/day' + [[[conv_tendencies]]] + vars = dT_dt_deepconv, dT_dt_shalconv + vars_labels = 'deep', 'shallow' + x_label = 'K/day' + + [[profiles_instant]] + + [[time_series]] + vars = 'pres_s','lhf','shf','tprcp_rate_inst','t2m','q2m','u10m','v10m','gflux','sfc_dwn_lw','tsfc' + vars_labels = 'surface pressure (Pa)','latent heat flux ($W$ $m^{-2}$)','sensible heat flux ($W$ $m^{-2}$)','surface rainfall rate ($mm$ $hr{-1}$)','2m temperature ($K$)','2m specific humidity ($g$ $kg{-1}$)','10m zonal wind ($m$ $s{-1}$)','10m meridional wind ($m$ $s{-1}$)','ground flux ($W$ $m{-2}$)','downward longwave flux ($W$ $m{-2}$)','surface temperature ($K$)' + + [[contours]] + vars = qv, T, h_advec_qt, h_advec_thil, qi, ql + vars_labels = 'Water Vapor ($g$ $kg^{-1}$)','Temperature ($K$)','Horizontal total water advection ($g$ $kg^{-1}$ $s^{-1}$)','Horizontal thetail advection ($K$ $s^{-1}$)','QI ($g$ $kg^{-1}$)','QL ($g$ $kg^{-1}$)' + vert_axis = pres_l + vert_axis_label = 'p (Pa)' + y_inverted = True + y_log = False + y_min_option = val #min, max, val (if val, add y_min = float value) + y_min = 10000.0 + y_max_option = val #min, max, val (if val, add y_max = float value) + y_max = 100000.0 + x_ticks_num = 10 + y_ticks_num = 10 + conversion_factor = 1000.0, 1.0, 1.0, 1.0, 1000.0, 1000.0 diff --git a/scm/etc/scripts/scm_analysis.py b/scm/etc/scripts/scm_analysis.py index 34c85c529..2b1ff7664 100755 --- a/scm/etc/scripts/scm_analysis.py +++ b/scm/etc/scripts/scm_analysis.py @@ -856,6 +856,8 @@ def replace_fill_with_nan(nc_ds, var_name, var, group, time_diag, pres_l, datase obs_dict = sro.read_LASSO_obs(obs_file, time_slices, date_inst) elif('gabls3' in case_name.strip()): obs_dict = sro.read_gabls3_obs(obs_file, time_slices, date_inst) + elif('MOSAiC' in case_name.strip()): + obs_dict = sro.read_MOSAiC_obs(obs_file, time_slices, date_inst) try: os.makedirs(plot_dir) @@ -1378,7 +1380,6 @@ def replace_fill_with_nan(nc_ds, var_name, var, group, time_diag, pres_l, datase else: y_max_val = profiles_mean['y_max'] y_lim_val = [y_min_val, y_max_val] - #plot mean profiles for k in range(len(profiles_mean['vars'])): #get the python variable associated with the vars listed in the config file diff --git a/scm/etc/scripts/scm_read_obs.py b/scm/etc/scripts/scm_read_obs.py index 59ac43c34..ba9dc712d 100644 --- a/scm/etc/scripts/scm_read_obs.py +++ b/scm/etc/scripts/scm_read_obs.py @@ -6,185 +6,241 @@ import math import forcing_file_common as ffc +def read_MOSAiC_obs(obs_file, time_slices, date): + obs_time_slice_indices = [] + + obs_fid = Dataset(obs_file, 'r') + + obs_year = obs_fid.variables['year'][:] + obs_month = obs_fid.variables['month'][:] + obs_day = obs_fid.variables['day'][:] + obs_hour = obs_fid.variables['hour'][:] + obs_time = obs_fid.variables['time_offset'][:] + + obs_date = [] + for i in range(obs_hour.size): + obs_date.append(datetime.datetime(obs_year[i], obs_month[i], obs_day[i], obs_hour[i], 0, 0, 0)) + obs_date = np.array(obs_date) + + for time_slice in time_slices: + start_date = datetime.datetime(time_slices[time_slice]['start'][0], time_slices[time_slice]['start'][1],time_slices[time_slice]['start'][2], time_slices[time_slice]['start'][3], time_slices[time_slice]['start'][4]) + end_date = datetime.datetime(time_slices[time_slice]['end'][0], time_slices[time_slice]['end'][1],time_slices[time_slice]['end'][2], time_slices[time_slice]['end'][3], time_slices[time_slice]['end'][4]) + start_date_index = np.where(obs_date == start_date)[0][0] + end_date_index = np.where(obs_date == end_date)[0][0] + obs_time_slice_indices.append([start_date_index, end_date_index]) + + #print(start_date, end_date, start_date_index, end_date_index, obs_date[start_date_index], obs_date[end_date_index]) + + #find the index corresponding to the start of the simulations + obs_start_index = np.where(obs_date == date[0][0])[0] + obs_time = obs_time - obs_time[obs_start_index] + + obs_pres_l = obs_fid.variables['levels'][:]*100.0 #pressure levels in mb + + obs_T = obs_fid.variables['T'][:] + obs_q = obs_fid.variables['q'][:] + obs_qi= obs_fid.variables['qi'][:] + obs_ql= obs_fid.variables['ql'][:] + obs_u = obs_fid.variables['u'][:] + obs_v = obs_fid.variables['v'][:] + obs_rad_net_srf = obs_fid.variables['rad_net_srf'][:] + obs_lw_dn_srf = obs_fid.variables['lw_dn_srf'][:] + obs_tsk = obs_fid.variables['T_skin'][:] + obs_shf = obs_fid.variables['SH'][:] + obs_lhf = obs_fid.variables['LH'][:] + obs_t2m = obs_fid.variables['T_srf'][:] + obs_q2m = obs_fid.variables['q_srf'][:] + + obs_time_h = obs_time/3600.0 + + Rd = 287.0 + Rv = 461.0 + + e_s = 6.1078*np.exp(17.2693882*(obs_T - 273.16)/(obs_T - 35.86))*100.0 #Tetens formula produces e_s in mb (convert to Pa) + e = obs_q*obs_pres_l/(obs_q + (Rd/Rv)*(1.0 - obs_q)) #compute vapor pressure from specific humidity + obs_rh = np.clip(e/e_s, 0.0, 1.0) + + return_dict = {'year': obs_year, 'month': obs_month, 'day': obs_day, 'hour': obs_hour, + 'time': obs_time, 'date': obs_date, 'time_slice_indices': obs_time_slice_indices, + 'pres_l': obs_pres_l, 'T': obs_T, 'q': obs_q, 'rh': obs_rh, 'u': obs_u, 'v': obs_v, 'shf': obs_shf, + 'lhf': obs_lhf, 't2m': obs_t2m, 'q2m': obs_q2m, 'time_h': obs_time_h, 'tsfc': obs_tsk, + 'qv': obs_q, 'qi': obs_qi, 'ql': obs_ql, 'rad_net_srf': obs_rad_net_srf, 'sfc_dwn_lw': obs_lw_dn_srf} +# 'lwp': obs_lwp, 'T_force_tend': obs_T_forcing, 'qv_force_tend': obs_q_forcing} + + obs_fid.close() + + return return_dict + def read_twpice_obs(obs_file, time_slices, date): - obs_time_slice_indices = [] + obs_time_slice_indices = [] + + obs_fid = Dataset(obs_file, 'r') + + obs_year = obs_fid.variables['year'][:] + obs_month = obs_fid.variables['month'][:] + obs_day = obs_fid.variables['day'][:] + obs_hour = obs_fid.variables['hour'][:] + obs_time = obs_fid.variables['time_offset'][:] + + obs_date = [] + for i in range(obs_hour.size): + obs_date.append(datetime.datetime(obs_year[i], obs_month[i], obs_day[i], obs_hour[i], 0, 0, 0)) + obs_date = np.array(obs_date) + + for time_slice in time_slices: + start_date = datetime.datetime(time_slices[time_slice]['start'][0], time_slices[time_slice]['start'][1],time_slices[time_slice]['start'][2], time_slices[time_slice]['start'][3], time_slices[time_slice]['start'][4]) + end_date = datetime.datetime(time_slices[time_slice]['end'][0], time_slices[time_slice]['end'][1],time_slices[time_slice]['end'][2], time_slices[time_slice]['end'][3], time_slices[time_slice]['end'][4]) + start_date_index = np.where(obs_date == start_date)[0][0] + end_date_index = np.where(obs_date == end_date)[0][0] + obs_time_slice_indices.append([start_date_index, end_date_index]) + + #find the index corresponding to the start of the simulations + obs_start_index = np.where(obs_date == date[0][0])[0] + obs_time = obs_time - obs_time[obs_start_index] + + obs_pres_l = obs_fid.variables['lev'][:]*100.0 #pressure levels in mb + + obs_cld = obs_fid.variables['cld'][:]/100.0 + obs_T = obs_fid.variables['T'][:] + obs_q = obs_fid.variables['q'][:]/1000.0 + obs_u = obs_fid.variables['u'][:] + obs_v = obs_fid.variables['v'][:] + obs_precip = obs_fid.variables['prec_srf'][:]/3.6E7 #convert from mm/hr to m/s + obs_shf = obs_fid.variables['SH'][:] + obs_lhf = obs_fid.variables['LH'][:] + obs_pwat = obs_fid.variables['PW'][:]*10.0 #convert from cm to kg/m2 + obs_lw_net_toa = obs_fid.variables['lw_net_toa'][:] + obs_rad_net_srf = obs_fid.variables['rad_net_srf'][:] + obs_sw_dn_toa = obs_fid.variables['sw_dn_toa'][:] + obs_sw_dn_srf = obs_fid.variables['sw_dn_srf'][:] + obs_lw_dn_srf = obs_fid.variables['lw_dn_srf'][:] + obs_lwp = obs_fid.variables['LWP'][:]*10.0 #convert from cm to kg/m2 + #obs_T_forcing = obs_fid.variables['dTdt'][:]*24.0 #convert from K/hour to K/day + #obs_q_forcing = obs_fid.variables['dqdt'][:]*24.0 #convert from g/kg/hour to g/kg/day + obs_h_advec_T = obs_fid.variables['T_adv_h'][:]*24.0 + obs_h_advec_q = obs_fid.variables['q_adv_h'][:]*24.0 + obs_v_advec_T = obs_fid.variables['T_adv_v'][:]*24.0 + obs_v_advec_q = obs_fid.variables['q_adv_v'][:]*24.0 + + obs_T_forcing = obs_h_advec_T + obs_v_advec_T + obs_q_forcing = obs_h_advec_q + obs_v_advec_q + + obs_time_h = obs_time/3600.0 + + Rd = 287.0 + Rv = 461.0 + + e_s = 6.1078*np.exp(17.2693882*(obs_T - 273.16)/(obs_T - 35.86))*100.0 #Tetens formula produces e_s in mb (convert to Pa) + e = obs_q*obs_pres_l/(obs_q + (Rd/Rv)*(1.0 - obs_q)) #compute vapor pressure from specific humidity + obs_rh = np.clip(e/e_s, 0.0, 1.0) + + obs_rh_500 = np.zeros(obs_rh.shape[0]) + index_500 = np.where(obs_pres_l[:]*0.01 < 500.0)[0][0] + lifrac = (obs_pres_l[index_500-1] - 50000.0)/(obs_pres_l[index_500-1] - obs_pres_l[index_500]) + for j in range(obs_rh.shape[0]): #loop over times + obs_rh_500[j] = obs_rh[j,index_500-1] + lifrac*(obs_rh[j,index_500] - obs_rh[j,index_500-1]) + #print index_500, pres_l[-1][j,index_500,k], pres_l[-1][j,index_500-1,k], rh_500_kj, rh[-1][j,index_500,k], rh[-1][j,index_500-1,k] + + return_dict = {'year': obs_year, 'month': obs_month, 'day': obs_day, 'hour': obs_hour, + 'time': obs_time, 'date': obs_date, 'time_slice_indices': obs_time_slice_indices, + 'pres_l': obs_pres_l, 'cld': obs_cld, 'T': obs_T, 'q': obs_q, 'u': obs_u, 'v': obs_v, + 'shf': obs_shf, 'lhf': obs_lhf, 'pwat': obs_pwat, 'time_h': obs_time_h, + 'tprcp_rate_accum': obs_precip, 'qv': obs_q, 'rh': obs_rh, 'rh_500': obs_rh_500, + 'lw_up_TOA_tot': obs_lw_net_toa, 'rad_net_srf': obs_rad_net_srf, 'sw_dn_TOA_tot': obs_sw_dn_toa, + 'lw_dn_sfc_tot': obs_lw_dn_srf, 'sw_dn_sfc_tot': obs_sw_dn_srf, 'lwp': obs_lwp, + 'T_force_tend': obs_T_forcing, 'qv_force_tend': obs_q_forcing} + + obs_fid.close() + + return return_dict + +def read_arm_sgp_summer_1997_obs(obs_file, time_slices, date): + obs_time_slice_indices = [] + + obs_fid = Dataset(obs_file, 'r') - obs_fid = Dataset(obs_file, 'r') + obs_year = obs_fid.variables['Year'][:] + obs_month = obs_fid.variables['Month'][:] + obs_day = obs_fid.variables['Day'][:] + #obs_hour = obs_fid.variables['hour'][:] + obs_time = obs_fid.variables['time_offset'][:] - obs_year = obs_fid.variables['year'][:] - obs_month = obs_fid.variables['month'][:] - obs_day = obs_fid.variables['day'][:] - obs_hour = obs_fid.variables['hour'][:] - obs_time = obs_fid.variables['time_offset'][:] + #this file doesn't have the hour variable - calculate from the time offset (seconds from 00Z on 6/18/1997) + obs_hour = (((obs_time - 3)/3600.0)%24).astype(int) - obs_date = [] - for i in range(obs_hour.size): - obs_date.append(datetime.datetime(obs_year[i], obs_month[i], obs_day[i], obs_hour[i], 0, 0, 0)) - obs_date = np.array(obs_date) + obs_date = [] + for i in range(obs_hour.size): + obs_date.append(datetime.datetime(obs_year[i], obs_month[i], obs_day[i], obs_hour[i], 0, 0, 0)) + obs_date = np.array(obs_date) - for time_slice in time_slices: + for time_slice in time_slices: start_date = datetime.datetime(time_slices[time_slice]['start'][0], time_slices[time_slice]['start'][1],time_slices[time_slice]['start'][2], time_slices[time_slice]['start'][3], time_slices[time_slice]['start'][4]) end_date = datetime.datetime(time_slices[time_slice]['end'][0], time_slices[time_slice]['end'][1],time_slices[time_slice]['end'][2], time_slices[time_slice]['end'][3], time_slices[time_slice]['end'][4]) start_date_index = np.where(obs_date == start_date)[0][0] end_date_index = np.where(obs_date == end_date)[0][0] obs_time_slice_indices.append([start_date_index, end_date_index]) + #print start_date, end_date, start_date_index, end_date_index, obs_date[start_date_index], obs_date[end_date_index] - #find the index corresponding to the start of the simulations - obs_start_index = np.where(obs_date == date[0][0])[0] - obs_time = obs_time - obs_time[obs_start_index] - - obs_pres_l = obs_fid.variables['lev'][:]*100.0 #pressure levels in mb - - obs_cld = obs_fid.variables['cld'][:]/100.0 - obs_T = obs_fid.variables['T'][:] - obs_q = obs_fid.variables['q'][:]/1000.0 - obs_u = obs_fid.variables['u'][:] - obs_v = obs_fid.variables['v'][:] - obs_precip = obs_fid.variables['prec_srf'][:]/3.6E7 #convert from mm/hr to m/s - obs_shf = obs_fid.variables['SH'][:] - obs_lhf = obs_fid.variables['LH'][:] - obs_pwat = obs_fid.variables['PW'][:]*10.0 #convert from cm to kg/m2 - obs_lw_net_toa = obs_fid.variables['lw_net_toa'][:] - obs_rad_net_srf = obs_fid.variables['rad_net_srf'][:] - obs_sw_dn_toa = obs_fid.variables['sw_dn_toa'][:] - obs_sw_dn_srf = obs_fid.variables['sw_dn_srf'][:] - obs_lw_dn_srf = obs_fid.variables['lw_dn_srf'][:] - obs_lwp = obs_fid.variables['LWP'][:]*10.0 #convert from cm to kg/m2 - #obs_T_forcing = obs_fid.variables['dTdt'][:]*24.0 #convert from K/hour to K/day - #obs_q_forcing = obs_fid.variables['dqdt'][:]*24.0 #convert from g/kg/hour to g/kg/day - obs_h_advec_T = obs_fid.variables['T_adv_h'][:]*24.0 - obs_h_advec_q = obs_fid.variables['q_adv_h'][:]*24.0 - obs_v_advec_T = obs_fid.variables['T_adv_v'][:]*24.0 - obs_v_advec_q = obs_fid.variables['q_adv_v'][:]*24.0 - - obs_T_forcing = obs_h_advec_T + obs_v_advec_T - obs_q_forcing = obs_h_advec_q + obs_v_advec_q - - obs_time_h = obs_time/3600.0 - - Rd = 287.0 - Rv = 461.0 - - e_s = 6.1078*np.exp(17.2693882*(obs_T - 273.16)/(obs_T - 35.86))*100.0 #Tetens formula produces e_s in mb (convert to Pa) - e = obs_q*obs_pres_l/(obs_q + (Rd/Rv)*(1.0 - obs_q)) #compute vapor pressure from specific humidity - obs_rh = np.clip(e/e_s, 0.0, 1.0) - - obs_rh_500 = np.zeros(obs_rh.shape[0]) - index_500 = np.where(obs_pres_l[:]*0.01 < 500.0)[0][0] - lifrac = (obs_pres_l[index_500-1] - 50000.0)/(obs_pres_l[index_500-1] - obs_pres_l[index_500]) - for j in range(obs_rh.shape[0]): #loop over times - obs_rh_500[j] = obs_rh[j,index_500-1] + lifrac*(obs_rh[j,index_500] - obs_rh[j,index_500-1]) - #print index_500, pres_l[-1][j,index_500,k], pres_l[-1][j,index_500-1,k], rh_500_kj, rh[-1][j,index_500,k], rh[-1][j,index_500-1,k] - - return_dict = {'year': obs_year, 'month': obs_month, 'day': obs_day, 'hour': obs_hour, - 'time': obs_time, 'date': obs_date, 'time_slice_indices': obs_time_slice_indices, - 'pres_l': obs_pres_l, 'cld': obs_cld, 'T': obs_T, 'q': obs_q, 'u': obs_u, 'v': obs_v, - 'shf': obs_shf, 'lhf': obs_lhf, 'pwat': obs_pwat, 'time_h': obs_time_h, - 'tprcp_rate_accum': obs_precip, 'qv': obs_q, 'rh': obs_rh, 'rh_500': obs_rh_500, - 'lw_up_TOA_tot': obs_lw_net_toa, 'rad_net_srf': obs_rad_net_srf, 'sw_dn_TOA_tot': obs_sw_dn_toa, - 'lw_dn_sfc_tot': obs_lw_dn_srf, 'sw_dn_sfc_tot': obs_sw_dn_srf, 'lwp': obs_lwp, - 'T_force_tend': obs_T_forcing, 'qv_force_tend': obs_q_forcing} - - obs_fid.close() - - return return_dict + #find the index corresponding to the start of the simulations + obs_start_index = np.where(obs_date == date[0][0])[0] + obs_time = obs_time - obs_time[obs_start_index] -def read_arm_sgp_summer_1997_obs(obs_file, time_slices, date): - obs_time_slice_indices = [] - - obs_fid = Dataset(obs_file, 'r') - - obs_year = obs_fid.variables['Year'][:] - obs_month = obs_fid.variables['Month'][:] - obs_day = obs_fid.variables['Day'][:] - #obs_hour = obs_fid.variables['hour'][:] - obs_time = obs_fid.variables['time_offset'][:] - - #this file doesn't have the hour variable - calculate from the time offset (seconds from 00Z on 6/18/1997) - obs_hour = (((obs_time - 3)/3600.0)%24).astype(int) - - obs_date = [] - for i in range(obs_hour.size): - obs_date.append(datetime.datetime(obs_year[i], obs_month[i], obs_day[i], obs_hour[i], 0, 0, 0)) - obs_date = np.array(obs_date) - - for time_slice in time_slices: - start_date = datetime.datetime(time_slices[time_slice]['start'][0], time_slices[time_slice]['start'][1],time_slices[time_slice]['start'][2], time_slices[time_slice]['start'][3], time_slices[time_slice]['start'][4]) - end_date = datetime.datetime(time_slices[time_slice]['end'][0], time_slices[time_slice]['end'][1],time_slices[time_slice]['end'][2], time_slices[time_slice]['end'][3], time_slices[time_slice]['end'][4]) - start_date_index = np.where(obs_date == start_date)[0][0] - end_date_index = np.where(obs_date == end_date)[0][0] - obs_time_slice_indices.append([start_date_index, end_date_index]) - #print start_date, end_date, start_date_index, end_date_index, obs_date[start_date_index], obs_date[end_date_index] - - #find the index corresponding to the start of the simulations - obs_start_index = np.where(obs_date == date[0][0])[0] - obs_time = obs_time - obs_time[obs_start_index] - - - obs_pres_l = np.flipud(obs_fid.variables['lev'][:])*100.0 #pressure levels in mb - - obs_cld = np.fliplr(obs_fid.variables['ARSCL_Cld'][:,:,0,0])/100.0 - obs_T = np.fliplr(obs_fid.variables['Temp'][:,:,0,0]) - obs_q = np.fliplr(obs_fid.variables['H2O_Mixing_Ratio'][:,:,0,0]/1000.0) - obs_u = np.fliplr(obs_fid.variables['u_wind'][:,:,0,0]) - obs_v = np.fliplr(obs_fid.variables['v_wind'][:,:,0,0]) - obs_precip = obs_fid.variables['Prec'][:,0,0] - # obs_shf = obs_fid.variables['SH'][:] - # obs_lhf = obs_fid.variables['LH'][:] - # obs_pwat = obs_fid.variables['PW'][:] - # obs_lw_net_toa = obs_fid.variables['lw_net_toa'][:] - # obs_rad_net_srf = obs_fid.variables['rad_net_srf'][:] - # obs_sw_dn_toa = obs_fid.variables['sw_dn_toa'][:] - # obs_sw_dn_srf = obs_fid.variables['sw_dn_srf'][:] - # obs_lw_dn_srf = obs_fid.variables['lw_dn_srf'][:] - # obs_lwp = obs_fid.variables['LWP'][:]*10.0 #convert from cm to kg/m2 - # #obs_T_forcing = obs_fid.variables['dTdt'][:]*24.0 #convert from K/hour to K/day - # #obs_q_forcing = obs_fid.variables['dqdt'][:]*24.0 #convert from g/kg/hour to g/kg/day - # obs_h_advec_T = obs_fid.variables['T_adv_h'][:]*24.0 - # obs_h_advec_q = obs_fid.variables['q_adv_h'][:]*24.0 - # obs_v_advec_T = obs_fid.variables['T_adv_v'][:]*24.0 - # obs_v_advec_q = obs_fid.variables['q_adv_v'][:]*24.0 - # - # obs_T_forcing = obs_h_advec_T + obs_v_advec_T - # obs_q_forcing = obs_h_advec_q + obs_v_advec_q - # - # obs_time_h = obs_time/3600.0 - # - # Rd = 287.0 - # Rv = 461.0 - # - # e_s = 6.1078*np.exp(17.2693882*(obs_T - 273.16)/(obs_T - 35.86))*100.0 #Tetens formula produces e_s in mb (convert to Pa) - # e = obs_q*obs_pres_l/(obs_q + (Rd/Rv)*(1.0 - obs_q)) #compute vapor pressure from specific humidity - # obs_rh = np.clip(e/e_s, 0.0, 1.0) - # - # obs_rh_500 = np.zeros(obs_rh.shape[0]) - # index_500 = np.where(obs_pres_l[:]*0.01 < 500.0)[0][0] - # lifrac = (obs_pres_l[index_500-1] - 50000.0)/(obs_pres_l[index_500-1] - obs_pres_l[index_500]) - # for j in range(obs_rh.shape[0]): #loop over times - # obs_rh_500[j] = obs_rh[j,index_500-1] + lifrac*(obs_rh[j,index_500] - obs_rh[j,index_500-1]) - # #print index_500, pres_l[-1][j,index_500,k], pres_l[-1][j,index_500-1,k], rh_500_kj, rh[-1][j,index_500,k], rh[-1][j,index_500-1,k] - - return_dict = {'year': obs_year, 'month': obs_month, 'day': obs_day, 'hour': obs_hour, - 'time': obs_time, 'date': obs_date, 'time_slice_indices': obs_time_slice_indices, - 'pres_l': obs_pres_l, 'cld': obs_cld, 'T': obs_T, 'qv': obs_q, 'u': obs_u, 'v': obs_v, - 'precip': obs_precip}#, 'shf': obs_shf, 'lhf': obs_lhf, 'pwat': obs_pwat, 'time_h': obs_time_h, - # 'rain': obs_precip, 'rainc': obs_precip, 'qv': obs_q, 'rh': obs_rh, 'rh_500': obs_rh_500, - # 'lw_up_TOA_tot': obs_lw_net_toa, 'rad_net_srf': obs_rad_net_srf, 'sw_dn_TOA_tot': obs_sw_dn_toa, - # 'lw_dn_sfc_tot': obs_lw_dn_srf, 'sw_dn_sfc_tot': obs_sw_dn_srf, 'lwp': obs_lwp, - # 'T_force_tend': obs_T_forcing, 'qv_force_tend': obs_q_forcing} - - # return_dict = {'year': obs_year, 'month': obs_month, 'day': obs_day, 'hour': obs_hour, - # 'time': obs_time, 'date': obs_date, 'time_slice_indices': obs_time_slice_indices, - # 'pres_l': obs_pres_l, 'cld': obs_cld, 'T': obs_T, 'q': obs_q, 'u': obs_u, 'v': obs_v, - # 'precip': obs_precip, 'shf': obs_shf, 'lhf': obs_lhf, 'pwat': obs_pwat, 'time_h': obs_time_h, - # 'rain': obs_precip, 'rainc': obs_precip, 'qv': obs_q, 'rh': obs_rh, 'rh_500': obs_rh_500, - # 'lw_up_TOA_tot': obs_lw_net_toa, 'rad_net_srf': obs_rad_net_srf, 'sw_dn_TOA_tot': obs_sw_dn_toa, - # 'lw_dn_sfc_tot': obs_lw_dn_srf, 'sw_dn_sfc_tot': obs_sw_dn_srf, 'lwp': obs_lwp, - # 'T_force_tend': obs_T_forcing, 'qv_force_tend': obs_q_forcing} - - obs_fid.close() - - return return_dict + + obs_pres_l = np.flipud(obs_fid.variables['lev'][:])*100.0 #pressure levels in mb + + obs_cld = np.fliplr(obs_fid.variables['ARSCL_Cld'][:,:,0,0])/100.0 + obs_T = np.fliplr(obs_fid.variables['Temp'][:,:,0,0]) + obs_q = np.fliplr(obs_fid.variables['H2O_Mixing_Ratio'][:,:,0,0]/1000.0) + obs_u = np.fliplr(obs_fid.variables['u_wind'][:,:,0,0]) + obs_v = np.fliplr(obs_fid.variables['v_wind'][:,:,0,0]) + obs_precip = obs_fid.variables['Prec'][:,0,0] + # obs_shf = obs_fid.variables['SH'][:] + # obs_lhf = obs_fid.variables['LH'][:] + # obs_pwat = obs_fid.variables['PW'][:] + # obs_lw_net_toa = obs_fid.variables['lw_net_toa'][:] + # obs_rad_net_srf = obs_fid.variables['rad_net_srf'][:] + # obs_sw_dn_toa = obs_fid.variables['sw_dn_toa'][:] + # obs_sw_dn_srf = obs_fid.variables['sw_dn_srf'][:] + # obs_lw_dn_srf = obs_fid.variables['lw_dn_srf'][:] + # obs_lwp = obs_fid.variables['LWP'][:]*10.0 #convert from cm to kg/m2 + # #obs_T_forcing = obs_fid.variables['dTdt'][:]*24.0 #convert from K/hour to K/day + # #obs_q_forcing = obs_fid.variables['dqdt'][:]*24.0 #convert from g/kg/hour to g/kg/day + # obs_h_advec_T = obs_fid.variables['T_adv_h'][:]*24.0 + # obs_h_advec_q = obs_fid.variables['q_adv_h'][:]*24.0 + # obs_v_advec_T = obs_fid.variables['T_adv_v'][:]*24.0 + # obs_v_advec_q = obs_fid.variables['q_adv_v'][:]*24.0 + # + # obs_T_forcing = obs_h_advec_T + obs_v_advec_T + # obs_q_forcing = obs_h_advec_q + obs_v_advec_q + # + # obs_time_h = obs_time/3600.0 + # + # Rd = 287.0 + # Rv = 461.0 + # + # e_s = 6.1078*np.exp(17.2693882*(obs_T - 273.16)/(obs_T - 35.86))*100.0 #Tetens formula produces e_s in mb (convert to Pa) + # e = obs_q*obs_pres_l/(obs_q + (Rd/Rv)*(1.0 - obs_q)) #compute vapor pressure from specific humidity + # obs_rh = np.clip(e/e_s, 0.0, 1.0) + # + # obs_rh_500 = np.zeros(obs_rh.shape[0]) + # index_500 = np.where(obs_pres_l[:]*0.01 < 500.0)[0][0] + # lifrac = (obs_pres_l[index_500-1] - 50000.0)/(obs_pres_l[index_500-1] - obs_pres_l[index_500]) + # for j in range(obs_rh.shape[0]): #loop over times + # obs_rh_500[j] = obs_rh[j,index_500-1] + lifrac*(obs_rh[j,index_500] - obs_rh[j,index_500-1]) + # #print index_500, pres_l[-1][j,index_500,k], pres_l[-1][j,index_500-1,k], rh_500_kj, rh[-1][j,index_500,k], rh[-1][j,index_500-1,k] + + return_dict = {'year': obs_year, 'month': obs_month, 'day': obs_day, 'hour': obs_hour, + 'time': obs_time, 'date': obs_date, 'time_slice_indices': obs_time_slice_indices, + 'pres_l': obs_pres_l, 'cld': obs_cld, 'T': obs_T, 'qv': obs_q, 'u': obs_u, 'v': obs_v, + 'precip': obs_precip}#, 'shf': obs_shf, 'lhf': obs_lhf, 'pwat': obs_pwat, 'time_h': obs_time_h, + # 'rain': obs_precip, 'rainc': obs_precip, 'qv': obs_q, 'rh': obs_rh, 'rh_500': obs_rh_500, + # 'lw_up_TOA_tot': obs_lw_net_toa, 'rad_net_srf': obs_rad_net_srf, 'sw_dn_TOA_tot': obs_sw_dn_toa, + # 'lw_dn_sfc_tot': obs_lw_dn_srf, 'sw_dn_sfc_tot': obs_sw_dn_srf, 'lwp': obs_lwp, + # 'T_force_tend': obs_T_forcing, 'qv_force_tend': obs_q_forcing} + + obs_fid.close() + + return return_dict def read_LASSO_obs(obs_file, time_slices, date): obs_time_slice_indices = [] @@ -337,4 +393,4 @@ def read_gabls3_obs(obs_file, time_slices, date): 'sfc_dwn_sw': obs_sw_dn, 'sfc_up_sw': obs_sw_up, 'sfc_rad_net_land': obs_sfc_rad_net, 'gflux': -1*obs_gflux, 't2m':obs_t2m, 'q2m':obs_q2m, 'ustar':obs_ustar,'u10m':obs_u10m, 'v10m':obs_v10m, 'hpbl':obs_hpbl, 'tsfc':obs_tsk} - return return_dict \ No newline at end of file + return return_dict diff --git a/scm/src/run_scm.py b/scm/src/run_scm.py index 93f09435f..e610475ba 100755 --- a/scm/src/run_scm.py +++ b/scm/src/run_scm.py @@ -502,7 +502,7 @@ def setup_rundir(self): nc_fid = Dataset(os.path.join(SCM_ROOT, self._case_data_dir) + '/' + self._case + '_SCM_driver.nc' , 'r') surfaceForcing = nc_fid.getncattr('surface_forcing_temp') nc_fid.close() - if (surfaceForcing.lower() == 'flux' or surfaceForcing.lower() == 'surface_flux'): + if (surfaceForcing.lower() == 'kinematic' or surfaceForcing.lower() == 'surface_flux'): surface_flux_spec = True except KeyError: # if not using DEPHY format, check to see if surface fluxes are specified in the case configuration file (default is False) diff --git a/scm/src/scm_forcing.F90 b/scm/src/scm_forcing.F90 index db239aa8b..44e6026c9 100644 --- a/scm/src/scm_forcing.F90 +++ b/scm/src/scm_forcing.F90 @@ -155,7 +155,7 @@ subroutine interpolate_forcing(scm_input, scm_state, in_spinup) scm_input%input_omega(scm_input%input_ntimes,:), scm_state%pres_l(i,:), scm_state%n_levels, & omega_bracket(1,:), top_index, 3) if (top_index < scm_state%n_levels .and. top_index > 0) then - w_ls_bracket(1,top_index+1:scm_state%n_levels) = 0.0!w_ls_bracket(1,top_index) + omega_bracket(1,top_index+1:scm_state%n_levels) = 0.0!w_ls_bracket(1,top_index) end if scm_state%omega(i,:) = omega_bracket(1,:) end do diff --git a/scm/src/scm_input.F90 b/scm/src/scm_input.F90 index abaeedefc..59229cf68 100644 --- a/scm/src/scm_input.F90 +++ b/scm/src/scm_input.F90 @@ -1157,10 +1157,12 @@ subroutine get_case_init_DEPHY(scm_state, scm_input) integer :: ncid, varID, allocate_status, ierr, i, k integer :: active_lon, active_lat, active_init_time CHARACTER(LEN=nf90_max_name) :: tmpName + CHARACTER(LEN=nf90_max_name) :: tmpUnits real(kind=sp), parameter :: p0 = 100000.0 real(kind=sp) :: exner, exner_inv, rho, elapsed_sec, missing_value_eps real(kind=dp) :: rinc(5) integer :: jdat(1:8), idat(1:8) !(yr, mon, day, t-zone, hr, min, sec, mil-sec) + logical :: needed_for_lsm_ics, needed_for_model_ics, lev_in_altitude integer :: input_n_init_times, input_n_forcing_times, input_n_lev, input_n_snow, input_n_ice, input_n_soil @@ -1180,7 +1182,17 @@ subroutine get_case_init_DEPHY(scm_state, scm_input) call check(NF90_INQUIRE_DIMENSION(ncid, varID, tmpName, input_n_lev),"nf90_inq_dim(lev)") !Check whether long_name = 'altitude', units='m' OR long_name = 'pressure', units='Pa'? !It may not matter, because 'lev' may not be needed when the IC pressure and height are BOTH already provided - + call check(NF90_INQ_VARID(ncid,"lev",varID),"nf90_inq_varid(lev)") + call check(NF90_GET_ATT(ncid, varID, "units", tmpUnits),"nf90_get_att(units)") + if (adjustl(trim(tmpUnits)) == 'pa' .or. adjustl(trim(tmpUnits)) == 'Pa') then + lev_in_altitude = .false. + else if (adjustl(trim(tmpUnits)) == 'm') then + lev_in_altitude = .true. + else + write(0,'(a,i0,a)') "The variable 'lev' in the case data file had units different than 'm', 'pa', or 'Pa', but it is expected to be altitude in m or pressure in Pa. Stopping..." + STOP + end if + !### TO BE USED IF DEPHY-SCM can be extended to include model ICs ### !possible dimensions (if using model ICs) ierr = NF90_INQ_DIMID(ncid,"nsoil",varID) @@ -1301,15 +1313,16 @@ subroutine get_case_init_DEPHY(scm_state, scm_input) input_ri (input_n_lev, input_n_init_times), & input_rh (input_n_lev, input_n_init_times), & input_tke (input_n_lev, input_n_init_times), & + input_ozone (input_n_lev, input_n_init_times), & stat=allocate_status) if (trim(input_surfaceForcingLSM) == "lsm") then !if model ICs are included in the file scm_state%lsm_ics = .true. + endif !variables with vertical extent - allocate(input_ozone (input_n_lev, input_n_init_times), & - input_stc (input_n_soil, input_n_init_times), & + allocate(input_stc (input_n_soil, input_n_init_times), & input_smc (input_n_soil, input_n_init_times), & input_slc (input_n_soil, input_n_init_times), & input_snicexy (input_n_snow, input_n_init_times), & @@ -1451,11 +1464,38 @@ subroutine get_case_init_DEPHY(scm_state, scm_input) input_sfalb_ice ( input_n_init_times), & input_emis_ice ( input_n_init_times), & stat=allocate_status) - end if - + + needed_for_lsm_ics = .False. + needed_for_model_ics = .False. + if (scm_state%lsm_ics .or. trim(input_surfaceForcingLSM) == "lsm") needed_for_lsm_ics = .True. + if (scm_state%model_ics) needed_for_model_ics = .True. + !> - Read in the initial profiles. - call NetCDF_read_var(ncid, "pa", .True., input_pres) - call NetCDF_read_var(ncid, "zh", .True., input_height) + + if (lev_in_altitude) then + call NetCDF_read_var(ncid, "pa", .True., input_pres) + !zh could be defined in addition to lev, use if so + call NetCDF_read_var(ncid, "zh", .False., input_height) + if (input_height(1,1) == missing_value) then + do i=1, input_n_init_times + do k=1, input_n_lev + input_height(k,i) = input_lev(k) + end do + end do + end if + else + call NetCDF_read_var(ncid, "zh", .True., input_height) + !pa could be defined in addition to lev, use if so + call NetCDF_read_var(ncid, "pa", .False., input_pres) + if (input_pres(1,1) == missing_value) then + do i=1, input_n_init_times + do k=1, input_n_lev + input_pres(k,i) = input_lev(k) + end do + end do + end if + end if + call NetCDF_read_var(ncid, "ps", .True., input_pres_surf) call NetCDF_read_var(ncid, "ua", .True., input_u) call NetCDF_read_var(ncid, "va", .True., input_v) @@ -1475,55 +1515,52 @@ subroutine get_case_init_DEPHY(scm_state, scm_input) call NetCDF_read_var(ncid, "rl", .False., input_rl) call NetCDF_read_var(ncid, "ri", .False., input_ri) call NetCDF_read_var(ncid, "hur", .False., input_rh) - - call NetCDF_read_var(ncid, "tke", .True., input_tke) - - if (trim(input_surfaceForcingLSM) == "lsm") then - call NetCDF_read_var(ncid, "o3", .True., input_ozone) - call NetCDF_read_var(ncid, "area", .True., input_area) - - !orographic parameters - call NetCDF_read_var(ncid, "stddev", .True., input_stddev) - call NetCDF_read_var(ncid, "convexity", .True., input_convexity) - call NetCDF_read_var(ncid, "oa1", .True., input_oa1) - call NetCDF_read_var(ncid, "oa2", .True., input_oa2) - call NetCDF_read_var(ncid, "oa3", .True., input_oa3) - call NetCDF_read_var(ncid, "oa4", .True., input_oa4) - call NetCDF_read_var(ncid, "ol1", .True., input_ol1) - call NetCDF_read_var(ncid, "ol2", .True., input_ol2) - call NetCDF_read_var(ncid, "ol3", .True., input_ol3) - call NetCDF_read_var(ncid, "ol4", .True., input_ol4) - call NetCDF_read_var(ncid, "theta_oro", .True., input_theta_oro) - call NetCDF_read_var(ncid, "gamma", .True., input_gamma) - call NetCDF_read_var(ncid, "sigma", .True., input_sigma) - call NetCDF_read_var(ncid, "elvmax", .True., input_elvmax) - call NetCDF_read_var(ncid, "oro", .True., input_oro) - call NetCDF_read_var(ncid, "oro_uf", .True., input_oro_uf) - call NetCDF_read_var(ncid, "landfrac", .True., input_landfrac) - call NetCDF_read_var(ncid, "lakefrac", .True., input_lakefrac) - call NetCDF_read_var(ncid, "lakedepth", .True., input_lakedepth) - - !NSST variables - call NetCDF_read_var(ncid, "tref", .True., input_tref) - call NetCDF_read_var(ncid, "z_c", .True., input_z_c) - call NetCDF_read_var(ncid, "c_0", .True., input_c_0) - call NetCDF_read_var(ncid, "c_d", .True., input_c_d) - call NetCDF_read_var(ncid, "w_0", .True., input_w_0) - call NetCDF_read_var(ncid, "w_d", .True., input_w_d) - call NetCDF_read_var(ncid, "xt", .True., input_xt) - call NetCDF_read_var(ncid, "xs", .True., input_xs) - call NetCDF_read_var(ncid, "xu", .True., input_xu) - call NetCDF_read_var(ncid, "xv", .True., input_xv) - call NetCDF_read_var(ncid, "xz", .True., input_xz) - call NetCDF_read_var(ncid, "zm", .True., input_zm) - call NetCDF_read_var(ncid, "xtts", .True., input_xtts) - call NetCDF_read_var(ncid, "xzts", .True., input_xzts) - call NetCDF_read_var(ncid, "d_conv", .True., input_d_conv) - call NetCDF_read_var(ncid, "ifd", .True., input_ifd) - call NetCDF_read_var(ncid, "dt_cool", .True., input_dt_cool) - call NetCDF_read_var(ncid, "qrain", .True., input_qrain) - end if - + call NetCDF_read_var(ncid, "tke", .False., input_tke) + + call NetCDF_read_var(ncid, "o3", .False., input_ozone) + call NetCDF_read_var(ncid, "area", .False., input_area) + !orographic parameters + call NetCDF_read_var(ncid, "stddev", needed_for_model_ics, input_stddev) + call NetCDF_read_var(ncid, "convexity", needed_for_model_ics, input_convexity) + call NetCDF_read_var(ncid, "oa1", needed_for_model_ics, input_oa1) + call NetCDF_read_var(ncid, "oa2", needed_for_model_ics, input_oa2) + call NetCDF_read_var(ncid, "oa3", needed_for_model_ics, input_oa3) + call NetCDF_read_var(ncid, "oa4", needed_for_model_ics, input_oa4) + call NetCDF_read_var(ncid, "ol1", needed_for_model_ics, input_ol1) + call NetCDF_read_var(ncid, "ol2", needed_for_model_ics, input_ol2) + call NetCDF_read_var(ncid, "ol3", needed_for_model_ics, input_ol3) + call NetCDF_read_var(ncid, "ol4", needed_for_model_ics, input_ol4) + call NetCDF_read_var(ncid, "theta_oro", needed_for_model_ics, input_theta_oro) + call NetCDF_read_var(ncid, "gamma", needed_for_model_ics, input_gamma) + call NetCDF_read_var(ncid, "sigma", needed_for_model_ics, input_sigma) + call NetCDF_read_var(ncid, "elvmax", needed_for_model_ics, input_elvmax) + call NetCDF_read_var(ncid, "oro", needed_for_model_ics, input_oro) + call NetCDF_read_var(ncid, "oro_uf", needed_for_model_ics, input_oro_uf) + call NetCDF_read_var(ncid, "landfrac", needed_for_model_ics, input_landfrac) + call NetCDF_read_var(ncid, "lakefrac", needed_for_model_ics, input_lakefrac) + call NetCDF_read_var(ncid, "lakedepth", needed_for_model_ics, input_lakedepth) + + !NSST variables + call NetCDF_read_var(ncid, "tref", needed_for_model_ics, input_tref) + call NetCDF_read_var(ncid, "z_c", needed_for_model_ics, input_z_c) + call NetCDF_read_var(ncid, "c_0", needed_for_model_ics, input_c_0) + call NetCDF_read_var(ncid, "c_d", needed_for_model_ics, input_c_d) + call NetCDF_read_var(ncid, "w_0", needed_for_model_ics, input_w_0) + call NetCDF_read_var(ncid, "w_d", needed_for_model_ics, input_w_d) + call NetCDF_read_var(ncid, "xt", needed_for_model_ics, input_xt) + call NetCDF_read_var(ncid, "xs", needed_for_model_ics, input_xs) + call NetCDF_read_var(ncid, "xu", needed_for_model_ics, input_xu) + call NetCDF_read_var(ncid, "xv", needed_for_model_ics, input_xv) + call NetCDF_read_var(ncid, "xz", needed_for_model_ics, input_xz) + call NetCDF_read_var(ncid, "zm", needed_for_model_ics, input_zm) + call NetCDF_read_var(ncid, "xtts", needed_for_model_ics, input_xtts) + call NetCDF_read_var(ncid, "xzts", needed_for_model_ics, input_xzts) + call NetCDF_read_var(ncid, "d_conv", needed_for_model_ics, input_d_conv) + call NetCDF_read_var(ncid, "ifd", needed_for_model_ics, input_ifd) + call NetCDF_read_var(ncid, "dt_cool", needed_for_model_ics, input_dt_cool) + call NetCDF_read_var(ncid, "qrain", needed_for_model_ics, input_qrain) + + !> - Allocate the forcing variables. !allocate all, but conditionally read forcing variables given global atts; set unused forcing variables to missing @@ -1573,9 +1610,24 @@ subroutine get_case_init_DEPHY(scm_state, scm_input) call NetCDF_read_var(ncid, "lat", .True., input_lat) call NetCDF_read_var(ncid, "lon", .True., input_lon) call NetCDF_read_var(ncid, "ps_forc", .True., input_force_pres_surf) - call NetCDF_read_var(ncid, "zh_forc", .True., input_force_height) - call NetCDF_read_var(ncid, "pa_forc", .True., input_force_pres) - + !zh_forc and pa_forc should be present according to the DEPHY standard; if not, assume that zh_forc = input_height and pa_forc = input_pres + call NetCDF_read_var(ncid, "zh_forc", .False., input_force_height) + if (input_force_height(1,1) == missing_value) then + do i=1, input_n_forcing_times + do k=1, input_n_lev + input_force_height(k,i) = input_height(k,1) + end do + end do + end if + call NetCDF_read_var(ncid, "pa_forc", .False., input_force_pres) + if (input_force_pres(1,1) == missing_value) then + do i=1, input_n_forcing_times + do k=1, input_n_lev + input_force_pres(k,i) = input_pres(k,1) + end do + end do + end if + !conditionally read forcing vars (or set to missing); if the global attribute is set to expect a variable and it doesn't exist, stop the model call NetCDF_conditionally_read_var(adv_u, "adv_ua", "tnua_adv", trim(adjustl(scm_state%case_name))//'.nc', ncid, input_force_u_adv) call NetCDF_conditionally_read_var(adv_v, "adv_va", "tnva_adv", trim(adjustl(scm_state%case_name))//'.nc', ncid, input_force_v_adv) @@ -1644,107 +1696,109 @@ subroutine get_case_init_DEPHY(scm_state, scm_input) ! ! Surface forcing Model LSM ICs ! - if (trim(input_surfaceForcingLSM) == "lsm") then - call NetCDF_read_var(ncid, "stc", .True., input_stc) - call NetCDF_read_var(ncid, "smc", .True., input_smc) - call NetCDF_read_var(ncid, "slc", .True., input_slc) - call NetCDF_read_var(ncid, "snicexy", .True., input_snicexy) - call NetCDF_read_var(ncid, "snliqxy", .True., input_snliqxy) - call NetCDF_read_var(ncid, "tsnoxy", .True., input_tsnoxy ) - call NetCDF_read_var(ncid, "smoiseq", .True., input_smoiseq) - call NetCDF_read_var(ncid, "zsnsoxy", .True., input_zsnsoxy) - call NetCDF_read_var(ncid, "tiice", .True., input_tiice) - call NetCDF_read_var(ncid, "tslb", .True., input_tslb ) - call NetCDF_read_var(ncid, "smois", .True., input_smois) - call NetCDF_read_var(ncid, "sh2o", .True., input_sh2o ) - call NetCDF_read_var(ncid, "smfr", .True., input_smfr ) - call NetCDF_read_var(ncid, "flfr", .True., input_flfr ) - - call NetCDF_read_var(ncid, "vegsrc", .True., input_vegsrc ) - call NetCDF_read_var(ncid, "vegtyp", .True., input_vegtyp ) - call NetCDF_read_var(ncid, "soiltyp", .True., input_soiltyp ) - call NetCDF_read_var(ncid, "scolor", .True., input_scolor) - call NetCDF_read_var(ncid, "slopetyp", .True., input_slopetype) - call NetCDF_read_var(ncid, "tsfco", .True., input_tsfco) - call NetCDF_read_var(ncid, "vegfrac", .True., input_vegfrac) - call NetCDF_read_var(ncid, "shdmin", .True., input_shdmin) - call NetCDF_read_var(ncid, "shdmax", .True., input_shdmax) - call NetCDF_read_var(ncid, "slmsk", .True., input_slmsk) - call NetCDF_read_var(ncid, "canopy", .True., input_canopy) - call NetCDF_read_var(ncid, "hice", .True., input_hice) - call NetCDF_read_var(ncid, "fice", .True., input_fice) - call NetCDF_read_var(ncid, "tisfc", .True., input_tisfc) - call NetCDF_read_var(ncid, "snowd", .True., input_snwdph) - call NetCDF_read_var(ncid, "snoalb", .True., input_snoalb) - call NetCDF_read_var(ncid, "tg3", .True., input_tg3) - call NetCDF_read_var(ncid, "uustar", .True., input_uustar) - call NetCDF_read_var(ncid, "alvsf", .True., input_alvsf) - call NetCDF_read_var(ncid, "alnsf", .True., input_alnsf) - call NetCDF_read_var(ncid, "alvwf", .True., input_alvwf) - call NetCDF_read_var(ncid, "alnwf", .True., input_alnwf) - call NetCDF_read_var(ncid, "facsf", .True., input_facsf) - call NetCDF_read_var(ncid, "facwf", .True., input_facwf) - call NetCDF_read_var(ncid, "weasd", .True., input_weasd) - call NetCDF_read_var(ncid, "f10m", .True., input_f10m) - call NetCDF_read_var(ncid, "t2m", .True., input_t2m) - call NetCDF_read_var(ncid, "q2m", .True., input_q2m) - call NetCDF_read_var(ncid, "ffmm", .True., input_ffmm) - call NetCDF_read_var(ncid, "ffhh", .True., input_ffhh) - call NetCDF_read_var(ncid, "tprcp", .True., input_tprcp) - call NetCDF_read_var(ncid, "srflag", .True., input_srflag) - call NetCDF_read_var(ncid, "sncovr", .True., input_sncovr) - call NetCDF_read_var(ncid, "tsfcl", .True., input_tsfcl) - call NetCDF_read_var(ncid, "zorll", .True., input_zorll) - call NetCDF_read_var(ncid, "zorli", .True., input_zorli) - call NetCDF_read_var(ncid, "zorlw", .True., input_zorlw) - - !NoahMP parameters - call NetCDF_read_var(ncid, "tvxy", .False., input_tvxy) - call NetCDF_read_var(ncid, "tgxy", .False., input_tgxy) - call NetCDF_read_var(ncid, "tahxy", .False., input_tahxy) - call NetCDF_read_var(ncid, "canicexy", .False., input_canicexy) - call NetCDF_read_var(ncid, "canliqxy", .False., input_canliqxy) - call NetCDF_read_var(ncid, "eahxy", .False., input_eahxy) - call NetCDF_read_var(ncid, "cmxy", .False., input_cmxy) - call NetCDF_read_var(ncid, "chxy", .False., input_chxy) - call NetCDF_read_var(ncid, "fwetxy", .False., input_fwetxy) - call NetCDF_read_var(ncid, "sneqvoxy", .False., input_sneqvoxy) - call NetCDF_read_var(ncid, "alboldxy", .False., input_alboldxy) - call NetCDF_read_var(ncid, "qsnowxy", .False., input_qsnowxy) - call NetCDF_read_var(ncid, "wslakexy", .False., input_wslakexy) - call NetCDF_read_var(ncid, "taussxy", .False., input_taussxy) - call NetCDF_read_var(ncid, "waxy", .False., input_waxy) - call NetCDF_read_var(ncid, "wtxy", .False., input_wtxy) - call NetCDF_read_var(ncid, "zwtxy", .False., input_zwtxy) - call NetCDF_read_var(ncid, "xlaixy", .False., input_xlaixy) - call NetCDF_read_var(ncid, "xsaixy", .False., input_xsaixy) - call NetCDF_read_var(ncid, "lfmassxy", .False., input_lfmassxy) - call NetCDF_read_var(ncid, "stmassxy", .False., input_stmassxy) - call NetCDF_read_var(ncid, "rtmassxy", .False., input_rtmassxy) - call NetCDF_read_var(ncid, "woodxy", .False., input_woodxy) - call NetCDF_read_var(ncid, "stblcpxy", .False., input_stblcpxy) - call NetCDF_read_var(ncid, "fastcpxy", .False., input_fastcpxy) - call NetCDF_read_var(ncid, "smcwtdxy", .False., input_smcwtdxy) - call NetCDF_read_var(ncid, "deeprechxy",.False., input_deeprechxy) - call NetCDF_read_var(ncid, "rechxy", .False., input_rechxy) - call NetCDF_read_var(ncid, "snowxy", .False., input_snowxy) - !RUC LSM variables - call NetCDF_read_var(ncid, "wetness", .False., input_wetness) - call NetCDF_read_var(ncid, "clw_surf_land", .False., input_clw_surf_land) - call NetCDF_read_var(ncid, "clw_surf_ice", .False., input_clw_surf_ice) - call NetCDF_read_var(ncid, "qwv_surf_land", .False., input_qwv_surf_land) - call NetCDF_read_var(ncid, "qwv_surf_ice", .False., input_qwv_surf_ice) - call NetCDF_read_var(ncid, "tsnow_land", .False., input_tsnow_land) - call NetCDF_read_var(ncid, "tsnow_ice", .False., input_tsnow_ice) - call NetCDF_read_var(ncid, "snowfallac_land", .False., input_snowfallac_land) - call NetCDF_read_var(ncid, "snowfallac_ice", .False., input_snowfallac_ice) - call NetCDF_read_var(ncid, "sncovr_ice", .False., input_sncovr_ice) - call NetCDF_read_var(ncid, "sfalb_lnd", .False., input_sfalb_lnd) - call NetCDF_read_var(ncid, "sfalb_lnd_bck", .False., input_sfalb_lnd_bck) - call NetCDF_read_var(ncid, "emis_ice", .False., input_emis_ice) - call NetCDF_read_var(ncid, "lai", .False., input_lai) - end if - + + call NetCDF_read_var(ncid, "stc", .False., input_stc) + call NetCDF_read_var(ncid, "smc", .False., input_smc) + call NetCDF_read_var(ncid, "slc", .False., input_slc) + + call NetCDF_read_var(ncid, "tiice", .False., input_tiice) + + call NetCDF_read_var(ncid, "vegsrc", .False., input_vegsrc ) + call NetCDF_read_var(ncid, "vegtyp", .False., input_vegtyp ) + call NetCDF_read_var(ncid, "soiltyp", .False., input_soiltyp ) + call NetCDF_read_var(ncid, "scolor", .False., input_scolor) + call NetCDF_read_var(ncid, "slopetyp", .False., input_slopetype) + call NetCDF_read_var(ncid, "tsfco", .False., input_tsfco) + call NetCDF_read_var(ncid, "vegfrac", .False., input_vegfrac) + call NetCDF_read_var(ncid, "shdmin", .False., input_shdmin) + call NetCDF_read_var(ncid, "shdmax", .False., input_shdmax) + call NetCDF_read_var(ncid, "slmsk", .False., input_slmsk) + call NetCDF_read_var(ncid, "canopy", .False., input_canopy) + call NetCDF_read_var(ncid, "hice", .False., input_hice) + call NetCDF_read_var(ncid, "fice", .False., input_fice) + call NetCDF_read_var(ncid, "tisfc", .False., input_tisfc) + call NetCDF_read_var(ncid, "snowd", .False., input_snwdph) + call NetCDF_read_var(ncid, "snoalb", .False., input_snoalb) + call NetCDF_read_var(ncid, "tg3", .False., input_tg3) + call NetCDF_read_var(ncid, "uustar", .False., input_uustar) + call NetCDF_read_var(ncid, "alvsf", .False., input_alvsf) + call NetCDF_read_var(ncid, "alnsf", .False., input_alnsf) + call NetCDF_read_var(ncid, "alvwf", .False., input_alvwf) + call NetCDF_read_var(ncid, "alnwf", .False., input_alnwf) + call NetCDF_read_var(ncid, "facsf", .False., input_facsf) + call NetCDF_read_var(ncid, "facwf", .False., input_facwf) + call NetCDF_read_var(ncid, "weasd", .False., input_weasd) + call NetCDF_read_var(ncid, "f10m", .False., input_f10m) + call NetCDF_read_var(ncid, "t2m", .False., input_t2m) + call NetCDF_read_var(ncid, "q2m", .False., input_q2m) + call NetCDF_read_var(ncid, "ffmm", .False., input_ffmm) + call NetCDF_read_var(ncid, "ffhh", .False., input_ffhh) + call NetCDF_read_var(ncid, "tprcp", .False., input_tprcp) + call NetCDF_read_var(ncid, "srflag", .False., input_srflag) + call NetCDF_read_var(ncid, "sncovr", .False., input_sncovr) + call NetCDF_read_var(ncid, "tsfcl", .False., input_tsfcl) + call NetCDF_read_var(ncid, "zorll", .False., input_zorll) + call NetCDF_read_var(ncid, "zorli", .False., input_zorli) + call NetCDF_read_var(ncid, "zorlw", .False., input_zorlw) + + !NoahMP parameters + call NetCDF_read_var(ncid, "snicexy", .False., input_snicexy) + call NetCDF_read_var(ncid, "snliqxy", .False., input_snliqxy) + call NetCDF_read_var(ncid, "tsnoxy", .False., input_tsnoxy ) + call NetCDF_read_var(ncid, "smoiseq", .False., input_smoiseq) + call NetCDF_read_var(ncid, "zsnsoxy", .False., input_zsnsoxy) + + call NetCDF_read_var(ncid, "tvxy", .False., input_tvxy) + call NetCDF_read_var(ncid, "tgxy", .False., input_tgxy) + call NetCDF_read_var(ncid, "tahxy", .False., input_tahxy) + call NetCDF_read_var(ncid, "canicexy", .False., input_canicexy) + call NetCDF_read_var(ncid, "canliqxy", .False., input_canliqxy) + call NetCDF_read_var(ncid, "eahxy", .False., input_eahxy) + call NetCDF_read_var(ncid, "cmxy", .False., input_cmxy) + call NetCDF_read_var(ncid, "chxy", .False., input_chxy) + call NetCDF_read_var(ncid, "fwetxy", .False., input_fwetxy) + call NetCDF_read_var(ncid, "sneqvoxy", .False., input_sneqvoxy) + call NetCDF_read_var(ncid, "alboldxy", .False., input_alboldxy) + call NetCDF_read_var(ncid, "qsnowxy", .False., input_qsnowxy) + call NetCDF_read_var(ncid, "wslakexy", .False., input_wslakexy) + call NetCDF_read_var(ncid, "taussxy", .False., input_taussxy) + call NetCDF_read_var(ncid, "waxy", .False., input_waxy) + call NetCDF_read_var(ncid, "wtxy", .False., input_wtxy) + call NetCDF_read_var(ncid, "zwtxy", .False., input_zwtxy) + call NetCDF_read_var(ncid, "xlaixy", .False., input_xlaixy) + call NetCDF_read_var(ncid, "xsaixy", .False., input_xsaixy) + call NetCDF_read_var(ncid, "lfmassxy", .False., input_lfmassxy) + call NetCDF_read_var(ncid, "stmassxy", .False., input_stmassxy) + call NetCDF_read_var(ncid, "rtmassxy", .False., input_rtmassxy) + call NetCDF_read_var(ncid, "woodxy", .False., input_woodxy) + call NetCDF_read_var(ncid, "stblcpxy", .False., input_stblcpxy) + call NetCDF_read_var(ncid, "fastcpxy", .False., input_fastcpxy) + call NetCDF_read_var(ncid, "smcwtdxy", .False., input_smcwtdxy) + call NetCDF_read_var(ncid, "deeprechxy",.False., input_deeprechxy) + call NetCDF_read_var(ncid, "rechxy", .False., input_rechxy) + call NetCDF_read_var(ncid, "snowxy", .False., input_snowxy) + !RUC LSM variables + call NetCDF_read_var(ncid, "tslb", .False., input_tslb ) + call NetCDF_read_var(ncid, "smois", .False., input_smois) + call NetCDF_read_var(ncid, "sh2o", .False., input_sh2o ) + call NetCDF_read_var(ncid, "smfr", .False., input_smfr ) + call NetCDF_read_var(ncid, "flfr", .False., input_flfr ) + call NetCDF_read_var(ncid, "wetness", .False., input_wetness) + call NetCDF_read_var(ncid, "clw_surf_land", .False., input_clw_surf_land) + call NetCDF_read_var(ncid, "clw_surf_ice", .False., input_clw_surf_ice) + call NetCDF_read_var(ncid, "qwv_surf_land", .False., input_qwv_surf_land) + call NetCDF_read_var(ncid, "qwv_surf_ice", .False., input_qwv_surf_ice) + call NetCDF_read_var(ncid, "tsnow_land", .False., input_tsnow_land) + call NetCDF_read_var(ncid, "tsnow_ice", .False., input_tsnow_ice) + call NetCDF_read_var(ncid, "snowfallac_land", .False., input_snowfallac_land) + call NetCDF_read_var(ncid, "snowfallac_ice", .False., input_snowfallac_ice) + call NetCDF_read_var(ncid, "sncovr_ice", .False., input_sncovr_ice) + call NetCDF_read_var(ncid, "sfalb_lnd", .False., input_sfalb_lnd) + call NetCDF_read_var(ncid, "sfalb_lnd_bck", .False., input_sfalb_lnd_bck) + call NetCDF_read_var(ncid, "emis_ice", .False., input_emis_ice) + call NetCDF_read_var(ncid, "lai", .False., input_lai) + + call check(NF90_CLOSE(NCID=ncid),"nf90_close()") call scm_input%create(input_n_forcing_times, input_n_lev, input_n_soil, input_n_snow, input_n_ice) @@ -2137,7 +2191,9 @@ subroutine get_case_init_DEPHY(scm_state, scm_input) else scm_input%input_lh_flux_sfc = input_force_sfc_lat_flx(:) end if - else if (trim(input_surfaceForcingLSM) == 'lsm') then + end if + + if (trim(input_surfaceForcingLSM) == 'lsm') then !these were considered required variables above, so they should not need to be checked for missing scm_input%input_stc = input_stc(:,active_init_time) scm_input%input_smc = input_smc(:,active_init_time) @@ -2258,8 +2314,8 @@ subroutine get_case_init_DEPHY(scm_state, scm_input) !set all individual w forcing controls to .true. until finer control is available from the input file scm_state%force_sub_for_T = .true. scm_state%force_sub_for_qv = .true. - scm_state%force_sub_for_u = .true. - scm_state%force_sub_for_v = .true. + !scm_state%force_sub_for_u = .true. + !scm_state%force_sub_for_v = .true. else if (forc_w > 0) then do i=1, input_n_forcing_times scm_input%input_w_ls(i,:) = input_force_w(:,i) @@ -2269,8 +2325,8 @@ subroutine get_case_init_DEPHY(scm_state, scm_input) !set all individual w forcing controls to .true. until finer control is available from the input file scm_state%force_sub_for_T = .true. scm_state%force_sub_for_qv = .true. - scm_state%force_sub_for_u = .true. - scm_state%force_sub_for_v = .true. + ! scm_state%force_sub_for_u = .true. + ! scm_state%force_sub_for_v = .true. end if if (forc_geo > 0) then @@ -2398,7 +2454,7 @@ subroutine get_case_init_DEPHY(scm_state, scm_input) end if end do else - scm_input%input_k_T_nudge = 1 + scm_input%input_k_T_nudge(:) = 1 end if else if (nudging_theta > 0) then !assume no cloud water since there is no associate [ql,qi]_nudge in the input? @@ -2424,7 +2480,7 @@ subroutine get_case_init_DEPHY(scm_state, scm_input) end if end do else - scm_input%input_k_thil_nudge = 1 + scm_input%input_k_thil_nudge(:) = 1 end if else if (nudging_thetal > 0) then !assume no cloud water since there is no associate [ql,qi]_nudge in the input? @@ -2450,7 +2506,7 @@ subroutine get_case_init_DEPHY(scm_state, scm_input) end if end do else - scm_input%input_k_thil_nudge = 1 + scm_input%input_k_thil_nudge(:) = 1 end if end if @@ -2477,7 +2533,7 @@ subroutine get_case_init_DEPHY(scm_state, scm_input) end if end do else - scm_input%input_k_qt_nudge = 1 + scm_input%input_k_qt_nudge(:) = 1 end if else if (nudging_qt > 0) then do i=1, input_n_forcing_times @@ -2502,7 +2558,7 @@ subroutine get_case_init_DEPHY(scm_state, scm_input) end if end do else - scm_input%input_k_qt_nudge = 1 + scm_input%input_k_qt_nudge(:) = 1 end if else if (nudging_rv > 0) then do i=1, input_n_forcing_times @@ -2530,7 +2586,7 @@ subroutine get_case_init_DEPHY(scm_state, scm_input) end if end do else - scm_input%input_k_qt_nudge = 1 + scm_input%input_k_qt_nudge(:) = 1 end if else if (nudging_rt > 0) then do i=1, input_n_forcing_times @@ -2558,7 +2614,7 @@ subroutine get_case_init_DEPHY(scm_state, scm_input) end if end do else - scm_input%input_k_qt_nudge = 1 + scm_input%input_k_qt_nudge(:) = 1 end if end if @@ -2585,7 +2641,7 @@ subroutine get_case_init_DEPHY(scm_state, scm_input) end if end do else - scm_input%input_k_u_nudge = 1 + scm_input%input_k_u_nudge(:) = 1 end if end if @@ -2612,7 +2668,7 @@ subroutine get_case_init_DEPHY(scm_state, scm_input) end if end do else - scm_input%input_k_v_nudge = 1 + scm_input%input_k_v_nudge(:) = 1 end if end if diff --git a/test/rt_test_cases.py b/test/rt_test_cases.py index f1db91bf9..1660b48c9 100644 --- a/test/rt_test_cases.py +++ b/test/rt_test_cases.py @@ -27,6 +27,17 @@ {"case": "LASSO_2016051812", "suite": "SCM_GFS_v16"}, \ {"case": "LASSO_2016051812", "suite": "SCM_WoFS_v0"}, \ {"case": "LASSO_2016051812", "suite": "SCM_HRRR_gf"}, \ + {"case": "COMBLE", "suite": "SCM_GFS_v17_p8_ugwpv1"}, \ + {"case": "COMBLE", "suite": "SCM_GFS_v16_RRTMGP"}, \ + {"case": "COMBLE", "suite": "SCM_GFS_v16"}, \ + {"case": "COMBLE", "suite": "SCM_WoFS_v0"}, \ + {"case": "COMBLE", "suite": "SCM_HRRR_gf"}, \ + {"case": "MOSAiC-AMPS", "suite": "SCM_GFS_v17_p8_ugwpv1"}, \ + {"case": "MOSAiC-AMPS", "suite": "SCM_GFS_v16_RRTMGP"}, \ + {"case": "MOSAiC-AMPS", "suite": "SCM_GFS_v16"}, \ + {"case": "MOSAiC-AMPS", "suite": "SCM_WoFS_v0"}, \ + {"case": "MOSAiC-AMPS", "suite": "SCM_HRRR_gf"}, \ + {"case": "gabls3", "suite": "SCM_GFS_v16"}, \ #---------------------------------------------------------------------------------------------------------------------------------------------- # Unsupported suites (w/ supported cases) #----------------------------------------------------------------------------------------------------------------------------------------------