From b89634d4db5153d61481a1afd5b99714120404fd Mon Sep 17 00:00:00 2001 From: dustinswales Date: Tue, 2 May 2023 11:54:20 -0600 Subject: [PATCH] Feature: UFS Replay (#372) * Feature: UFS Replay * Some changes to documentation. Work in progress * Some doc changes * Some more doc changes * Some more doc changes * Some more doc changes * Some more doc changes * Some more doc changes * Some more doc changes * Some more doc changes * Some more doc changes * Some more doc changes * Some more doc changes * Some more doc changes * Some more doc changes * Some more doc changes * Some more doc changes * Some more doc changes * Some more doc changes * Some cleanup * Documentation changes for UFS-replay * Added YAML configuration to create SCM environment * Doc changes for YAML environment files * Initial commit * New CI test for ufs-replay * New CI test for ufs-replay * New CI test for ufs-replay * New CI test for ufs-replay * Update CI test for UFS replay * Update CI test for UFS replay * Update CI test for UFS replay * Update CI test for UFS replay * Update CI test for UFS replay * Update CI test for UFS replay * Update CI test for UFS replay * Update CI test for UFS replay * Update CI test for UFS replay * Update CI test for UFS replay * Update CI test for UFS replay * Update CI test for UFS replay * Update CI test for UFS replay * Update CI test for UFS replay * Update CI test for UFS replay * Update CI test for UFS replay * Update CI test for UFS replay * Update CI test for UFS replay * Update CI test for UFS replay * Update CI test for UFS replay * Update CI test for UFS replay * Update CI test for UFS replay * Update CI test for UFS replay * Update CI test for UFS replay * Update CI test for UFS replay * Update CI test for UFS replay * Update CI test for UFS replay * Update CI test for UFS replay * Update CI test for UFS replay * Update CI test for UFS replay * Update CI test for UFS replay * Update CI test for UFS replay * Update CI test for UFS replay * Update CI test for UFS replay * Update CI test for UFS replay * Update CI test for UFS replay * Update CI test for UFS replay * Update CI test for UFS replay * Update CI test for UFS replay * Update CI test for UFS replay * Update to CI * Update to CI * Update to CI * Update to CI * Update to CI * Update to CI * Update to CI * Update to CI * Update to CI * CI tests working! * Add consistent event triggers for CI tests * Address reviewers comments * Update techguide PDF --- .github/workflows/ci_run_scm_DEPHY.yml | 2 +- .github/workflows/ci_run_scm_ufs_replay.yml | 75 + .github/workflows/ci_scm_ccpp_prebuild.yml | 2 +- environment-ufsreplay.yml | 10 + environment.yml | 6 + scm/doc/TechGuide/chap_cases.tex | 152 +- scm/doc/TechGuide/main.pdf | Bin 557759 -> 565520 bytes scm/etc/scripts/UFS_IC_generator.py | 3789 ++++++++++------- scm/etc/scripts/UFS_LSM_param.py | 36 +- .../scripts/UFS_forcing_ensemble_generator.py | 190 + scm/etc/scripts/fv3_remap.py | 1681 ++++++++ scm/src/fv_eta.h | 458 +- scm/src/run_scm.py | 14 +- scm/src/scm_input.F90 | 3 +- scm/src/scm_vgrid.F90 | 67 +- 15 files changed, 4761 insertions(+), 1724 deletions(-) create mode 100644 .github/workflows/ci_run_scm_ufs_replay.yml create mode 100644 environment-ufsreplay.yml create mode 100644 environment.yml create mode 100755 scm/etc/scripts/UFS_forcing_ensemble_generator.py create mode 100755 scm/etc/scripts/fv3_remap.py diff --git a/.github/workflows/ci_run_scm_DEPHY.yml b/.github/workflows/ci_run_scm_DEPHY.yml index a07f1698a..0f0463c77 100644 --- a/.github/workflows/ci_run_scm_DEPHY.yml +++ b/.github/workflows/ci_run_scm_DEPHY.yml @@ -1,6 +1,6 @@ name: CI test to run the SCM with DEPHY v1 data -on: [push, pull_request] +on: [pull_request,workflow_dispatch] jobs: run-scm-DEPHY: diff --git a/.github/workflows/ci_run_scm_ufs_replay.yml b/.github/workflows/ci_run_scm_ufs_replay.yml new file mode 100644 index 000000000..0bd6a161d --- /dev/null +++ b/.github/workflows/ci_run_scm_ufs_replay.yml @@ -0,0 +1,75 @@ +name: CI test to create SCM UFS-replay cases from UWM regression tests + +on: [pull_request,workflow_dispatch] + +jobs: + run_scm_ufs_replay: + + # The type of runner that the job will run on + runs-on: ubuntu-22.04 + defaults: + run: + shell: bash -el {0} + + # Environmental variables + env: + dir_rt_cache: /home/runner/ufs_rts + SCM_ROOT: ${{ github.workspace }} + + steps: + + ####################################################################################### + # Checkout SCM code, setup python. + ####################################################################################### + + - name: Checkout SCM. + uses: actions/checkout@v3 + + - name: Initialize SCM submodules. + run: git submodule update --init --recursive + + - name: Update system packages. + run: sudo apt-get update + + - name: Cache conda + uses: actions/cache@v3 + with: + path: ~/conda_pkgs_dir + key: conda-pkgs + + - name: Setup python. + uses: conda-incubator/setup-miniconda@v2 + with: + activate-environment: env_ufsreplay + environment-file: environment-ufsreplay.yml + use-only-tar-bz2: true + auto-activate-base: true + auto-update-conda: true + + ####################################################################################### + # Create UFS-replay case for SCM using UWM Regression Tests + ####################################################################################### + + - name: Cache UWM regression test output. + uses: actions/cache@v3 + with: + path: ${dir_rt_cache} + key: ufs-rt-files + + - name: Download UWM regression test output from NCAR-DTC FTP site, if not cached. + run: | + if test ! -d "${dir_rt_cache}"; then + mkdir -p ${dir_rt_cache} && cd ${dir_rt_cache} + wget -q ftp://ftp.rap.ucar.edu:/pub/ccpp-scm/ufs_rts_scmreplay_ci.tar + tar -xvf ufs_rts_scmreplay_ci.tar + ls ${dir_rt_cache} + fi + + - name: Create UFS-replay case. + run: | + cd ${SCM_ROOT}/scm/etc/scripts/ + ./UFS_forcing_ensemble_generator.py -d ${dir_rt_cache}/ --C_RES 192 -dt 360 -n control_c192 -lons 300 -lats 34 -sc + + ####################################################################################### + # Done + ####################################################################################### \ No newline at end of file diff --git a/.github/workflows/ci_scm_ccpp_prebuild.yml b/.github/workflows/ci_scm_ccpp_prebuild.yml index 40beaa2c0..bb9e3bd17 100644 --- a/.github/workflows/ci_scm_ccpp_prebuild.yml +++ b/.github/workflows/ci_scm_ccpp_prebuild.yml @@ -1,6 +1,6 @@ name: CI test to run SCM ccpp_prebuild script -on: [push, pull_request] +on: [push, pull_request, workflow_dispatch] jobs: build-linux: diff --git a/environment-ufsreplay.yml b/environment-ufsreplay.yml new file mode 100644 index 000000000..fc76fe24b --- /dev/null +++ b/environment-ufsreplay.yml @@ -0,0 +1,10 @@ +name: env_ufsreplay + +dependencies: + - conda-forge::python=3.8.5 + - conda-forge::netcdf4 + - conda-forge::f90nml + - conda-forge::xarray + - conda-forge::numpy + - conda-forge::shapely + - conda-forge::xesmf diff --git a/environment.yml b/environment.yml new file mode 100644 index 000000000..02b6eb2f4 --- /dev/null +++ b/environment.yml @@ -0,0 +1,6 @@ +name: scm_py37 + +dependencies: + - conda-forge::python=3.7 + - conda-forge::netcdf4 + - conda-forge::f90nml diff --git a/scm/doc/TechGuide/chap_cases.tex b/scm/doc/TechGuide/chap_cases.tex index eacb6123b..e12b75ead 100644 --- a/scm/doc/TechGuide/chap_cases.tex +++ b/scm/doc/TechGuide/chap_cases.tex @@ -132,7 +132,7 @@ \section{Included Cases} \item UFS initial conditions for 38.1 N, 98.5 W (central Kansas) for 00Z on Oct. 3, 2016 with Noah variables on the C96 FV3 grid (\execout{fv3\_model\_point\_noah.nc}) \item UFS initial conditions for 38.1 N, 98.5 W (central Kansas) for 00Z on Oct. 3, 2016 with NoahMP variables on the C96 FV3 grid (\execout{fv3\_model\_point\_noahmp.nc}) \end{itemize} -See \ref{sec:UFS ICs} for information on how to generate these files for other locations and dates, given appropriate UFS Atmosphere initial conditions. +See \ref{sec:UFSreplay} for information on how to generate these files for other locations and dates, given appropriate UFS Atmosphere initial conditions and output. \section{How to set up new cases} @@ -196,15 +196,36 @@ \section{Using other LASSO cases} \item Create a new case configuration file (or copy and modify an existing one) in \execout{ccpp-scm/scm/etc/case\_config}. Be sure that the \execout{case\_name} variable points to the newly created/processed case input file from above. \end{enumerate} -\section{Using UFS Initial Conditions} -\label{sec:UFS ICs} +\section{Using UFS Output to Create SCM Cases: UFS-Replay} +\label{sec:UFSreplay} + + +\subsection{Python Dependencies} +\label{subsection: pydepend} +The scripts here require a few python packages that may not be found by default in all python installations. There is a YAML file with the python environment needed to run the script in \execout{ccpp-scm/environment-ufsreplay.yml}. To create and activate this environment using conda: + +Create environment (only once): + +\execout{> conda env create -f environment-ufsreplay.yml} + +This will create the conda environment \execout{env\_ufsreplay} + + +Activate environment: + +\execout{> conda activate env\_ufsreplay} + + +\subsection{UFS\_IC\_generator.py} +\label{subsection: ufsicgenerator} +A script exists in \execout{scm/etc/scripts/UFS\_IC\_generator.py} to read in UFS history (output) files and their initial conditions to generate a SCM case input data file, in DEPHY format. -A script exists in \execout{scm/etc/scripts/UFS\_IC\_generator.py} to read in UFS Atmosphere cold start initial conditions and generate a case input data file that the SCM can use. Note that the script requires a few python packages that may not be found by default in all python installations: \exec{argparse}, \exec{fnmatch}, \exec{logging}, \exec{NetCDF4}, \exec{numpy}, \exec{shapely}, \exec{f90nml}, and \exec{re}. \begin{lstlisting}[language=bash] ./UFS_IC_generator.py [-h] (-l LOCATION LOCATION | -ij INDEX INDEX) -d -DATE -i IN_DIR -g GRID_DIR [-t {1,2,3,4,5,6}] -[-a AREA] -n CASE_NAME [-oc] +DATE -i IN_DIR -g GRID_DIR -f FORCING_DIR -n +CASE_NAME [-t {1,2,3,4,5,6,7}] [-a AREA] [-oc] +[-lam] [-sc] [-near] \end{lstlisting} Mandatory arguments: @@ -214,10 +235,11 @@ \section{Using UFS Initial Conditions} \item -l 261.51 38.2 (two floating point values separated by a space) \item -ij 8 49 (two integer values separated by a space; this option must also use the \exec{-{}-tile (-t)} argument to specify the tile number) \end{itemize} -\item \exec{-{}-date (-d)} YYYYMMDDHHMM: date corresponding to the UFS initial conditions -\item \exec{-{}-in\_dir (-i)}: path to the directory containing UFS initial conditions +\item \exec{-{}-date (-d)} YYYYMMDDHHMMSS: date corresponding to the UFS initial conditions +\item \exec{-{}-in\_dir (-i)}: path to the directory containing the UFS initial conditions \item \exec{-{}-grid\_dir (-g)}: path to the directory containing the UFS supergrid files (AKA "fix" directory) -\item \exec{-{}-case\_name (-n)}: what to call the output NetCDF file +\item \exec{-{}-forcing\_dir (-f)}: path to the directory containing the UFS history files +\item \exec{-{}-case\_name (-n)}: name of case \end{enumerate} Optional arguments: @@ -225,18 +247,118 @@ \section{Using UFS Initial Conditions} \item \exec{-{}-tile (-t)}: if one already knows the correct tile for the given longitude and latitude OR one is specifying the UFS grid index (\exec{-{}-index} argument) \item \exec{-{}-area (-a)}: area of grid cell in $m^2$ (if known or different than the value calculated from the supergrid file) \item \exec{-{}-old\_chgres (-oc)}: flag if UFS initial conditions were generated using older version of chgres (global\_chgres); might be the case for pre-2018 data +\item \exec{-{}-lam (-lam)}: flag to signal that the ICs and forcing is from a limited-area model run +\item \exec{-{}-save\_comp (-sc)}: flag to create UFS reference file for comparison +\item \exec{-{}-use\_nearest (-near)}: flag to indicate using the nearest UFS history file gridpoint +\end{enumerate} + +\subsection{UFS\_forcing\_ensemble\_generator.py} +\label{subsection: ufsforcingensemblegenerator} +There is an additional script in \execout{scm/etc/scripts/UFS\_forcing\_ensemble\_generator.py} to create UFS-replay case(s) starting with output from UFS Weather Model (UWM) Regression Tests (RTs). + +\begin{lstlisting}[language=bash] +UFS_forcing_ensemble_generator.py [-h] -d DIR -n CASE_NAME +(-lonl LON_1 LON_2 -latl LAT_1 LAT_2 -nens NENSMEMBERS | +-lons [LON_LIST] -lats [LAT_LIST]) +[-dt TIMESTEP] [-cres C_RES] [-sdf SUITE] [-sc] [-near] +\end{lstlisting} + +Mandatory arguments: +\begin{enumerate} +\item \exec{-{}-dir (-d)}: path to UFS Regression Test output +\item \exec{-{}-case\_name (-n)}: name of cases +\item Either: (see examples below) + \begin{itemize} + \item \exec{-{}-lon\_limits (-lonl)} AND \exec{-{}-lat\_limits (-latl)} AND \exec{-{}-nensmembers (-nens)}: longitude range, latitude range, and number of cases to create + \item \exec{-{}-lon\_list (-lons)} AND \exec{-{}-lat\_list (-lats)}: longitude and latitude of cases + \end{itemize} \end{enumerate} -The following commands were used from within the \exec{scm/etc/scripts} directory to generate the example UFS Atmosphere initial condition case input file: +Optional arguments: +\begin{enumerate} +\item \exec{-{}-timestep (-dt)}: SCM timestep, in seconds +\item \exec{-{}-C\_res (-cres)}: UFS spatial resolution +\item \exec{-{}-suite (-sdf)}: CCPP suite definition file to use for ensemble +\item \exec{-{}-save\_comp (-sc)}: flag to create UFS reference file for comparison +\item \exec{-{}-use\_nearest (-near)}: flag to indicate using the nearest UFS history file gridpoint +\end{enumerate} + +Examples to run from within the \exec{scm/etc/scripts} directory to create SCM cases starting with the output from a UFS Weather Model regression test(s): + +On the supported platforms Cheyenne (NCAR) and Hera (NOAA), there are staged UWM RTs located at: +\begin{itemize} +\item \execout{Cheyenne /glade/scratch/epicufsrt/GMTB/CCPP-SCM/UFS\_RTs} +\item \execout{Hera /scratch1/BMC/gmtb/CCPP-SCM/UFS\_RTs} +\end{itemize} + +\subsection{Example 1: UFS-replay for single point} +\label{subsection: example1} + +UFS regression test, \execout{control\_c192}, for single point. +\begin{lstlisting}[language=bash] +./UFS_forcing_ensemble_generator.py -d /glade/scratch/epicufsrt/GMTB/CCPP-SCM/UFS_RTs/control_c192/ -sc --C_RES 192 -dt 360 -n control_c192 -lons 300 -lats 34 +\end{lstlisting} + +Upon successful completion of the script, the command to run the case(s) will print to the screen. For example, + +\begin{lstlisting}[language=bash] +./run_scm.py --npz_type gfs --file scm_ufsens_control_c192.py --timestep 360 +\end{lstlisting} + +The file \exec{scm\_ufsens\_control\_c192.py} is created in \exec{ccpp-scm/scm/bin/}, where the SCM run script is to be exectued. + +\subsection{Example 2: UFS-replay for list of points} +\label{subsection: example2} + +UFS regression test, \execout{control\_c384}, for multiple points. +\begin{lstlisting}[language=bash] +./UFS_forcing_ensemble_generator.py -d /glade/scratch/epicufsrt/GMTB/CCPP-SCM/UFS_RTs/control_c384/ -sc --C_RES 384 -dt 225 -n control_c384 -lons 300 300 300 300 -lats 34 35 35 37 +\end{lstlisting} + +Upon successful completion of the script, the command to run the case(s) will print to the screen. For example, + +\begin{lstlisting}[language=bash] +./run_scm.py --npz_type gfs --file scm_ufsens_control_c384.py --timestep 225 +\end{lstlisting} + +The file \exec{scm\_ufsens\_control\_c384.py} contains \exec{ALL} of the cases created. Each case created will have the naming convention \exec{case\_name\_nXXX}, where the suffix \exec{XXX} is the case number from 0 to the number of points provided. The contents of the file should look like: \begin{lstlisting}[language=bash] -./UFS_IC_generator.py -l 261.51 38.2 -d 201610030000 -i ../../data/raw_case_input/FV3_C96_example_ICs -g ../../data/raw_case_input/FV3_C96_example_ICs -n fv3_model_point_noah -oc +run_list = [{"case": "control_c384_n000", "suite": "SCM_GFS_v16"}, + {"case": "control_c384_n001", "suite": "SCM_GFS_v16"}, + {"case": "control_c384_n002", "suite": "SCM_GFS_v16"}, + {"case": "control_c384_n003", "suite": "SCM_GFS_v16"}] \end{lstlisting} -Note that the \exec{-{}-in\_dir (-i)} and \exec{-{}-grid\_dir (-g)} arguments are the same in this case (since the supergrid files were copied to the same directory as the initial conditions files for point of example), but they will not in general be the same. Also note that the default behavior of the script is to expect that the NetCDF initial condition files were generated from \execout{chgres\_cube} and not the older \execout{global\_chgres}. If they were generated from the older version (which is likely for pre-2018 data), they will have a slightly different format requiring the \exec{-{}-old\_chgres (-oc)} option to be set in order for the files to be read properly by the script. If you try without the \exec{-{}-old\_chgres (-oc)} flag and receive a ``IndexError: t not found'' error, try the script again with the flag. +\subsection{Example 3: UFS-replay for an ensemble of points} +\label{subsection: example3} + +UFS regression test, \execout{control\_p8}, for an ensemble (10) of randomly selected points over a specified longitude ($300-320^oW$) and latitude ($40-50^oN$) range + +But first, to use the \execout{control\_p8} test we need to rerun the regression test to generate UFS history files with a denser and constant output interval. First, in \execout{control\_p8/model\_configure}, change \exec{-{}-output\_fh} to \execout{"interval -1"}, where \execout{interval} is the UFS history file output frequency (in hours), see \href{https://ufs-weather-model.readthedocs.io/en/latest/InputsOutputs.html}{UFS Weather Model Users Guide} for more details. + +For the purposes of this example the \execout{control\_p8} test has already been rerun, but if starting from your own UWM RTs, you can rerun the UWM regression test, on Cheyenne for example, by running the following command in the RT directory: \execout{qsub job\_card} -In addition to the case input files generated by this script, one will need appropriate case configuration files. Make sure that the \exec{model\_ics} variable is set to \exec{.true.} and that the \exec{C\_RES}, \exec{year}, \exec{month}, \exec{day}, and \exec{hour} are all set to the appropriate values that match the UFS Atmosphere initial conditions used. See \execout{scm/etc/case\_config/fv3\_model\_point\_noah.nml} for an example. +Now the cases can be generated with the following command: +\begin{lstlisting}[language=bash] +./UFS_forcing_ensemble_generator.py -d /glade/scratch/epicufsrt/GMTB/CCPP-SCM/UFS_RTs/control_p8/ -sc --C_RES 96 -dt 720 -n control_p8 -lonl 300 320 -latl 40 50 -nens 10 -sdf SCM_GFS_v17_p8 +\end{lstlisting} + +Upon successful completion of the script, the command to run the case(s) will print to the screen. For example, + +\begin{lstlisting}[language=bash] +./run_scm.py --npz_type gfs --file scm_ufsens_control_p8.py --timestep 720 +\end{lstlisting} -Running the model is the same as for observational field campaign cases: +The file \exec{scm\_ufsens\_control\_p8.py} contains ten cases (n000-n009) to be run. The contents of the file should look like: \begin{lstlisting}[language=bash] -./run_scm.py -c fv3_model_point_noah -s SCM_GFS_v16 +run_list = [{"case": "control_p8_n000", "suite": "SCM_GFS_v17_p8"}, + {"case": "control_p8_n001", "suite": "SCM_GFS_v17_p8"}, + {"case": "control_p8_n002", "suite": "SCM_GFS_v17_p8"}, + {"case": "control_p8_n003", "suite": "SCM_GFS_v17_p8"}, + {"case": "control_p8_n004", "suite": "SCM_GFS_v17_p8"}, + {"case": "control_p8_n005", "suite": "SCM_GFS_v17_p8"}, + {"case": "control_p8_n006", "suite": "SCM_GFS_v17_p8"}, + {"case": "control_p8_n007", "suite": "SCM_GFS_v17_p8"}, + {"case": "control_p8_n008", "suite": "SCM_GFS_v17_p8"}, + {"case": "control_p8_n009", "suite": "SCM_GFS_v17_p8"}] \end{lstlisting} diff --git a/scm/doc/TechGuide/main.pdf b/scm/doc/TechGuide/main.pdf index 13ae9ed1a55bc979ccfdb0faf61e47d63ae8130f..0f50aceba85f31601dfc74661f005a7c7ab3ae76 100644 GIT binary patch delta 191980 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%0D6&3!tH& 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%0DthSV>~%12pYHK)}f)oZpDAQ#ZBx-qG6Cd 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%0D}5+fM{OG~p|pJ2!x*qa$#PO~;3i?^6J&tw;O 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%0AhzlBab>U{9Q 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%0AlBIAn*ZNT|mnF|2U^p1fehNU)CBf}EpS^&ef7 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 6): + message = 'The entered tile {0} is not compatibile with the global cubed-sphere grid'.format(date) + logging.critical(message) + raise Exception(message) + + return (location, index, date_dict, in_dir, grid_dir, forcing_dir, tile, \ + area, case_name, old_chgres, lam, save_comp, use_nearest) +######################################################################################## +# +######################################################################################## def setup_logging(): """Sets up the logging module.""" logging.basicConfig(format='%(levelname)s: %(message)s', level=LOGLEVEL) - -def find_tile(loc, dir): + +######################################################################################## +# +######################################################################################## +def find_tile(loc, dir, lam): """Find the FV3 tile with the given lon/lat""" #returns the integer tile number @@ -133,8 +163,8 @@ def find_tile(loc, dir): for f_name in grid_fnames: if not found_tile: nc_file = Dataset('{0}/{1}'.format(dir,f_name)) - longitude = np.array(nc_file['x']).swapaxes(0,1) - latitude = np.array(nc_file['y']).swapaxes(0,1) + longitude = np.asarray(nc_file['x']).swapaxes(0,1) + latitude = np.asarray(nc_file['y']).swapaxes(0,1) nc_file.close() adj_long = False @@ -149,20 +179,20 @@ def find_tile(loc, dir): edge_1_lon = longitude[0,:] edge_1_lat = latitude[0,:] - edge_1 = zip(edge_1_lon, edge_1_lat) + edge_1 = list(zip(edge_1_lon, edge_1_lat)) edge_2_lon = longitude[:,-1] edge_2_lat = latitude[:,-1] - edge_2 = zip(edge_2_lon, edge_2_lat) + edge_2 = list(zip(edge_2_lon, edge_2_lat)) edge_3_lon = longitude[-1,:] edge_3_lat = latitude[-1,:] - edge_3 = zip(edge_3_lon, edge_3_lat) + edge_3 = list(zip(edge_3_lon, edge_3_lat)) edge_3.reverse() #need to reverse the direction of this edge to form a regular polygon edge_4_lon = longitude[:,0] edge_4_lat = latitude[:,0] - edge_4 = zip(edge_4_lon, edge_4_lat) + edge_4 = list(zip(edge_4_lon, edge_4_lat)) edge_4.reverse() #need to reverse the direction of this edge to form a regular polygon polygon_points = edge_1 + edge_2 + edge_3 + edge_4 @@ -178,28 +208,44 @@ def find_tile(loc, dir): loc_point = Point(temp_loc) if tile_polygon.contains(loc_point): found_tile = True - return f_name.split('tile')[1].split('.nc')[0] + if (lam): + return f_name.split('tile')[1].split('.halo')[0] + else: + return f_name.split('tile')[1].split('.nc')[0] else: polar_tile_filenames.append(f_name) #if the tile hasn't been found by this point, it must be contained within a polar tile for f_name in polar_tile_filenames: nc_file = Dataset('{0}/{1}'.format(dir,f_name)) - latitude = np.array(nc_file['y']).swapaxes(0,1) + latitude = np.asarray(nc_file['y']).swapaxes(0,1) nc_file.close() #if the sign of the mean latitude of the tile is the same as that of the point, the tile has been found if np.sign(np.mean(latitude)) == np.sign(loc[1]): found_tile = True - return f_name.split('tile')[1].split('.nc')[0] + if (lam): + return f_name.split('tile')[1].split('.halo')[0] + else: + return f_name.split('tile')[1].split('.nc')[0] return -1 -def find_loc_indices(loc, dir, tile): +######################################################################################## +# +######################################################################################## +def find_loc_indices(loc, dir, tile, lam): """Find the nearest neighbor FV3 grid point given a lon/lat pair and the tile number""" #returns the indices of the nearest neighbor point in the given tile, the lon/lat of the nearest neighbor, #and the distance (m) from the given point to the nearest neighbor grid cell - filename_pattern = '*grid.tile{0}.nc'.format(tile) + if (tile >= 0): + if (lam): + filename_pattern = '*grid.tile7.halo{}.nc'.format(n_lam_halo_points) + else: + filename_pattern = '*grid.tile{0}.nc'.format(tile) + else: + filename_pattern = 'atmf000.nc' + for f_name in os.listdir(dir): if fnmatch.fnmatch(f_name, filename_pattern): filename = f_name @@ -209,13 +255,29 @@ def find_loc_indices(loc, dir, tile): raise Exception(message) nc_file = Dataset('{0}/{1}'.format(dir,filename)) - #read in supergrid longitude and latitude - lon_super = np.array(nc_file['x']) #[lat,lon] or [y,x] #.swapaxes(0,1) - lat_super = np.array(nc_file['y']) #[lat,lon] or [y,x] #.swapaxes(0,1) - #get the longitude and latitude data for the grid centers by slicing the supergrid - #and taking only odd-indexed values - longitude = lon_super[1::2,1::2] - latitude = lat_super[1::2,1::2] + + if (tile >= 0): + #read in supergrid longitude and latitude + lon_super = np.asarray(nc_file['x']) #[lat,lon] or [y,x] #.swapaxes(0,1) + lat_super = np.asarray(nc_file['y']) #[lat,lon] or [y,x] #.swapaxes(0,1) + if (lam): + #strip ghost/halo points and return central (A-grid) points + #assuming n_lam_halo_points + lon_super_no_halo = lon_super[2*n_lam_halo_points:lon_super.shape[0]-2*n_lam_halo_points,2*n_lam_halo_points:lon_super.shape[1]-2*n_lam_halo_points] + lat_super_no_halo = lat_super[2*n_lam_halo_points:lat_super.shape[0]-2*n_lam_halo_points,2*n_lam_halo_points:lat_super.shape[1]-2*n_lam_halo_points] + #get the longitude and latitude data for the grid centers by slicing the supergrid + #and taking only odd-indexed values + longitude = lon_super_no_halo[1::2,1::2] + latitude = lat_super_no_halo[1::2,1::2] + else: + #get the longitude and latitude data for the grid centers by slicing the supergrid + #and taking only odd-indexed values + longitude = lon_super[1::2,1::2] + latitude = lat_super[1::2,1::2] + else: + longitude = np.asarray(nc_file['lon']) + latitude = np.asarray(nc_file['lat']) + nc_file.close() adj_long = False @@ -233,12 +295,12 @@ def find_loc_indices(loc, dir, tile): eucl_dist = np.zeros((longitude.shape[0],longitude.shape[1])) #get the Cartesian location of the given point - cart_loc = np.array(sph2cart(math.radians(temp_loc[0]), math.radians(temp_loc[1]), earth_radius)) + cart_loc = np.asarray(sph2cart(math.radians(temp_loc[0]), math.radians(temp_loc[1]), earth_radius)) for i in range(len(longitude)): for j in range(len(longitude[i])): #get the Cartesian location of all grid points - cart_cell = np.array(sph2cart(math.radians(longitude[i,j]), math.radians(latitude[i,j]), earth_radius)) + cart_cell = np.asarray(sph2cart(math.radians(longitude[i,j]), math.radians(latitude[i,j]), earth_radius)) #calculate the euclidean distance from the given point to the current grid cell eucl_dist[i,j] = np.linalg.norm(cart_loc - cart_cell) @@ -248,10 +310,17 @@ def find_loc_indices(loc, dir, tile): return (i,j,longitude[i,j]%360.0, latitude[i,j], eucl_dist[i,j]) -def find_lon_lat_of_indices(indices, dir, tile): +######################################################################################## +# +######################################################################################## +def find_lon_lat_of_indices(indices, dir, tile, lam): """Find the longitude and latitude of the given indices within the given tile.""" - filename_pattern = '*grid.tile{0}.nc'.format(tile) + if (lam): + filename_pattern = '*grid.tile{0}.halo{1}.nc'.format(tile, n_lam_halo_points) + else: + filename_pattern = '*grid.tile{0}.nc'.format(tile) + for f_name in os.listdir(dir): if fnmatch.fnmatch(f_name, filename_pattern): filename = f_name @@ -261,17 +330,73 @@ def find_lon_lat_of_indices(indices, dir, tile): raise Exception(message) nc_file = Dataset('{0}/{1}'.format(dir,filename)) + #read in supergrid longitude and latitude - lon_super = np.array(nc_file['x']) #[lat,lon] or [y,x] #.swapaxes(0,1) - lat_super = np.array(nc_file['y']) #[lat,lon] or [y,x] #.swapaxes(0,1) - #get the longitude and latitude data for the grid centers by slicing the supergrid - #and taking only odd-indexed values - longitude = lon_super[1::2,1::2] - latitude = lat_super[1::2,1::2] + lon_super = np.asarray(nc_file['x']) #[lat,lon] or [y,x] #.swapaxes(0,1) + lat_super = np.asarray(nc_file['y']) #[lat,lon] or [y,x] #.swapaxes(0,1) + if (lam): + #strip ghost/halo points and return central (A-grid) points + #assuming n_lam_halo_points + lon_super_no_halo = lon_super[2*n_lam_halo_points:lon_super.shape[0]-2*n_lam_halo_points,2*n_lam_halo_points:lon_super.shape[1]-2*n_lam_halo_points] + lat_super_no_halo = lat_super[2*n_lam_halo_points:lat_super.shape[0]-2*n_lam_halo_points,2*n_lam_halo_points:lat_super.shape[1]-2*n_lam_halo_points] + #get the longitude and latitude data for the grid centers by slicing the supergrid + #and taking only odd-indexed values + longitude = lon_super_no_halo[1::2,1::2] + latitude = lat_super_no_halo[1::2,1::2] + else: + #get the longitude and latitude data for the grid centers by slicing the supergrid + #and taking only odd-indexed values + longitude = lon_super[1::2,1::2] + latitude = lat_super[1::2,1::2] + nc_file.close() return (longitude[indices[1],indices[0]], latitude[indices[1],indices[0]]) + +######################################################################################## +# +######################################################################################## +def get_initial_lon_lat_grid(dir, tile, lam): + if (lam): + filename_pattern = '*grid.tile{0}.halo{1}.nc'.format(tile, n_lam_halo_points) + else: + filename_pattern = '*grid.tile{0}.nc'.format(tile) + + for f_name in os.listdir(dir): + if fnmatch.fnmatch(f_name, filename_pattern): + filename = f_name + if not filename: + message = 'No filenames matching the pattern {0} found in {1}'.format(filename_pattern,dir) + logging.critical(message) + raise Exception(message) + + nc_file = Dataset('{0}/{1}'.format(dir,filename)) + #read in supergrid longitude and latitude + lon_super = np.asarray(nc_file['x']) #[lat,lon] or [y,x] #.swapaxes(0,1) + lat_super = np.asarray(nc_file['y']) #[lat,lon] or [y,x] #.swapaxes(0,1) + if (lam): + #strip ghost/halo points and return central (A-grid) points + #assuming n_lam_halo_points + lon_super_no_halo = lon_super[2*n_lam_halo_points:lon_super.shape[0]-2*n_lam_halo_points,2*n_lam_halo_points:lon_super.shape[1]-2*n_lam_halo_points] + lat_super_no_halo = lat_super[2*n_lam_halo_points:lat_super.shape[0]-2*n_lam_halo_points,2*n_lam_halo_points:lat_super.shape[1]-2*n_lam_halo_points] + #get the longitude and latitude data for the grid centers by slicing the supergrid + #and taking only odd-indexed values + longitude = lon_super_no_halo[1::2,1::2] + latitude = lat_super_no_halo[1::2,1::2] + else: + #get the longitude and latitude data for the grid centers by slicing the supergrid + #and taking only odd-indexed values + longitude = lon_super[1::2,1::2] + latitude = lat_super[1::2,1::2] + + nc_file.close() + + return (longitude, latitude) + +######################################################################################## +# +######################################################################################## def sph2cart(az, el, r): """Calculate the Cartesian coordiates from spherical coordinates""" @@ -282,6 +407,9 @@ def sph2cart(az, el, r): return (x, y, z) +######################################################################################## +# +######################################################################################## def read_NetCDF_var(nc_file, var_name, i, j): try: var = nc_file[var_name][j,i] @@ -291,6 +419,9 @@ def read_NetCDF_var(nc_file, var_name, i, j): var = missing_value return var +######################################################################################## +# +######################################################################################## def read_NetCDF_surface_var(nc_file, var_name, i, j, old_chgres, vert_dim): if old_chgres: if vert_dim > 0: @@ -325,251 +456,727 @@ def read_NetCDF_surface_var(nc_file, var_name, i, j, old_chgres, vert_dim): var = missing_value return var -def get_UFS_IC_data(dir, grid_dir, tile, i, j, old_chgres): +######################################################################################## +# +######################################################################################## +def get_UFS_IC_data(dir, grid_dir, tile, i, j, old_chgres, lam): """Get the state, surface, and orographic data for the given tile and indices""" #returns dictionaries with the data - state_data = get_UFS_state_data(dir, tile, i, j, old_chgres) - surface_data = get_UFS_surface_data(dir, tile, i, j, old_chgres) - oro_data = get_UFS_oro_data(dir, tile, i, j) vgrid_data = get_UFS_vgrid_data(grid_dir) #only needed for ak, bk to calculate pressure - - #calculate derived quantities - if old_chgres: - #temperature - nlevs = state_data["nlevs"] - gz=state_data["z"]*grav - pn1=np.zeros([nlevs+1]) - temp=np.zeros([nlevs]) - for k in range(nlevs+1): - pn1[k]=np.log(vgrid_data["ak"][k]+state_data["p_surf"]*vgrid_data["bk"][k]) - for k in range(nlevs): - temp[k] = (gz[k]-gz[k+1])/( rdgas*(pn1[k+1]-pn1[k])*(1.+zvir*state_data["qv"][k]) ) - state_data["T"] = temp - state_data["pres"] = np.exp(pn1[0:nlevs]) + state_data = get_UFS_state_data(vgrid_data, dir, tile, i, j, old_chgres, lam) + surface_data = get_UFS_surface_data(dir, tile, i, j, old_chgres, lam) + oro_data = get_UFS_oro_data(dir, tile, i, j, lam) return (state_data, surface_data, oro_data) - -def get_UFS_state_data(dir, tile, i, j, old_chgres): + +######################################################################################## +# +######################################################################################## +def get_UFS_state_data(vgrid, dir, tile, i, j, old_chgres, lam): """Get the state data for the given tile and indices""" - nc_file = Dataset('{0}/{1}'.format(dir,'gfs_data.tile{0}.nc'.format(tile))) - - #the majority of this routine is from Phil Pegion (NOAA PSD) - - # assume model contains one less level than the cold start spectral GFS initial conditions - nlevs=len(nc_file.dimensions['lev'])-1 - - # upper air fields from initial conditions - zh=nc_file['zh'][::-1,j,i] - uw1=nc_file['u_w'][::-1,j,i] - uw2=nc_file['u_w'][::-1,j,i+1] - us1=nc_file['u_s'][::-1,j,i] - us2=nc_file['u_s'][::-1,j+1,i] - vw1=nc_file['v_w'][::-1,j,i] - vw2=nc_file['v_w'][::-1,j,i+1] - vs1=nc_file['v_s'][::-1,j,i] - vs2=nc_file['v_s'][::-1,j+1,i] - ucomp=0.25*(uw1+uw2+us1+us2) # estimate u winds on the A grid - vcomp=0.25*(vw1+vw2+vs1+vs2) # estimate v winds on the A grid - sphum=nc_file['sphum'][::-1,j,i] + if lam: + nc_file_data = Dataset('{0}/{1}'.format(dir,'gfs_data.nc')) + else: + nc_file_data = Dataset('{0}/{1}'.format(dir,'gfs_data.tile{0}.nc'.format(tile))) + + # get nlevs from the gfs_ctrl.nc data + nlevs_model=vgrid["nlevs"] + + # upper air fields from initial conditions (all data are top-first) + zh_rev=nc_file_data['zh'][:,j,i] + sphum_rev=nc_file_data['sphum'][:,j,i] # o3 and qv are taken from ics. - o3=nc_file['o3mr'][::-1,j,i] - liqwat=nc_file['liq_wat'][::-1,j,i] - - # surface pressure - ps=nc_file['ps'][j,i] + o3_rev=nc_file_data['o3mr'][:,j,i] + liqwat_rev=nc_file_data['liq_wat'][:,j,i] + ps_data = nc_file_data['ps'][j,i] - if not old_chgres: - #gfs_data.tileX.nc files created from chgres_cube already containt temperature and pressure profiles(well, surface pressure and delp); use those - #older version of global_chgres did not include these vars - t = nc_file['t'][::-1,j,i] - delp = nc_file['delp'][::-1,j,i] + #The 3D fields above are apparently on grid vertical interfaces. In the file external_ic.F90/get_nggps_ic subroutine in FV3, these fields + #are further processed to get to the vertical grid centers/means. + + # following remap_scalar_nggps in external_ic.F90 + levp_data = len(sphum_rev) - p = np.zeros(nlevs) - p[0] = ps - for k in range(1, nlevs): - p[k] = p[k-1] - delp[k-1] + ak_rev = vgrid["ak"][::-1] + bk_rev = vgrid["bk"][::-1] + ak_rev[0] = np.max([1.0E-9, ak_rev[0]]) + + ptop_data = ak_rev[1] + + pressure_from_data_rev = ak_rev + bk_rev*ps_data + log_pressure_from_data_rev = np.log(pressure_from_data_rev) + + gz_rev = np.zeros(2*levp_data +1) + pn_rev = np.zeros(2*levp_data +1) - nc_file.close() + for k in range(0,levp_data+1): + gz_rev[k] = zh_rev[k]*grav + pn_rev[k] = log_pressure_from_data_rev[k] + k2 = int(np.max([10, levp_data/2])) + for k in range(levp_data+1,levp_data+k2): + #do k=km+2, km+k2 + l = 2*(levp_data) - k + gz_rev[k] = 2.*gz_rev[levp_data] - gz_rev[l] + pn_rev[k] = 2.*pn_rev[levp_data] - pn_rev[l] + + phis = zh_rev[-1]*grav + + for k in range(levp_data+k2-2,0,-1): + #do k=km+k2-1, 2, -1 + if (phis <= gz_rev[k] and phis >= gz_rev[k+1]): + log_ps_calc = pn_rev[k] + (pn_rev[k+1]-pn_rev[k])*(gz_rev[k]-phis)/(gz_rev[k]-gz_rev[k+1]) + break + + ps_calc = np.exp(log_ps_calc) + + pressure_model_interfaces_rev = np.zeros(nlevs_model+1) + log_pressure_model_interfaces_rev = np.zeros(nlevs_model+1) + pressure_model_interfaces_rev[0] = ak_rev[1] + log_pressure_model_interfaces_rev[0] = np.log(pressure_model_interfaces_rev[0]) + for k in range(1,nlevs_model+1): + pressure_model_interfaces_rev[k] = ak_rev[k+1] + bk_rev[k+1]*ps_calc + log_pressure_model_interfaces_rev[k] = np.log(pressure_model_interfaces_rev[k]) + + pressure_thickness_model_rev = np.zeros(nlevs_model) + for k in range(0,nlevs_model): + pressure_thickness_model_rev[k] = pressure_model_interfaces_rev[k+1] - pressure_model_interfaces_rev[k] + + sphum_model_rev = fv3_remap.mappm(levp_data, pressure_from_data_rev[np.newaxis, :], sphum_rev[np.newaxis, :], nlevs_model, pressure_model_interfaces_rev[np.newaxis, :], 1, 1, 0, 8, ptop_data) + sphum_model_rev_3d = fv3_remap.fillq(1, nlevs_model, 1, np.expand_dims(sphum_model_rev, axis=2), pressure_thickness_model_rev[np.newaxis, :]) + sphum_model_rev = sphum_model_rev_3d[:,:,0] + + o3_model_rev = fv3_remap.mappm(levp_data, pressure_from_data_rev[np.newaxis, :], o3_rev[np.newaxis, :], nlevs_model, pressure_model_interfaces_rev[np.newaxis, :], 1, 1, 0, 8, ptop_data) + o3_model_rev_3d = fv3_remap.fillz(1, nlevs_model, 1, np.expand_dims(o3_model_rev, axis=2), pressure_thickness_model_rev[np.newaxis, :]) + o3_model_rev = o3_model_rev_3d[:,:,0] + + liqwat_model_rev = fv3_remap.mappm(levp_data, pressure_from_data_rev[np.newaxis, :], liqwat_rev[np.newaxis, :], nlevs_model, pressure_model_interfaces_rev[np.newaxis, :], 1, 1, 0, 8, ptop_data) + liqwat_model_rev_3d = fv3_remap.fillz(1, nlevs_model, 1, np.expand_dims(liqwat_model_rev, axis=2), pressure_thickness_model_rev[np.newaxis, :]) + liqwat_model_rev = liqwat_model_rev_3d[:,:,0] - #put data in a dictionary if old_chgres: - state = { - "nlevs": nlevs, - "z": zh, - "u": ucomp, - "v": vcomp, - "qv": sphum, - "o3": o3, - "ql": liqwat, - "p_surf": ps - } + gz_fv = np.zeros(nlevs_model+1) + gz_fv[-1] = phis + m = 0 + for k in range(0,nlevs_model): + for l in range(m, levp_data+k2-1): + if ( (log_pressure_model_interfaces_rev[k] <= pn_rev[l+1]) and (log_pressure_model_interfaces_rev[k] >= pn_rev[l]) ): + gz_fv[k] = gz_rev[l] + (gz_rev[l+1]-gz_rev[l])*(log_pressure_model_interfaces_rev[k]-pn_rev[l])/(pn_rev[l+1]-pn_rev[l]) + break + m = l + + temp_model_rev = np.zeros((1,nlevs_model)) + for k in range(0, nlevs_model): + temp_model_rev[0,k] = (gz_fv[k]-gz_fv[k+1])/(rdgas*(log_pressure_model_interfaces_rev[k+1]-log_pressure_model_interfaces_rev[k])*(1.+zvir*sphum_model_rev[0,k]) ) else: - state = { - "nlevs": nlevs, - "z": zh, - "u": ucomp, - "v": vcomp, - "qv": sphum, - "o3": o3, - "ql": liqwat, - "p_surf": ps, - "T": t, - "pres": p - } + temp_rev = nc_file_data['t'][:,j,i] + + temp_model_rev = fv3_remap.mappm(levp_data, pressure_from_data_rev[np.newaxis, :], temp_rev[np.newaxis, :], nlevs_model, pressure_model_interfaces_rev[np.newaxis, :], 1, 1, 2, 4, ptop_data) + + + icewat_model_rev = np.zeros(nlevs_model) + all_liquid_threshold = 273.16 + all_ice_threshold = 233.16 + intermediate_threshold = 258.16 + cloud_ice_mixing_ratio_threshold = 1.0E-5 + for k in range(0, nlevs_model): + cloud_water = liqwat_model_rev[0,k] + if (temp_model_rev[0,k] > all_liquid_threshold): + liqwat_model_rev[0,k] = cloud_water + icewat_model_rev[k] = 0.0 + elif (temp_model_rev[0,k] < all_ice_threshold): + liqwat_model_rev[0,k] = 0.0 + icewat_model_rev[k] = cloud_water + else: + if k == 0: + liqwat_model_rev[0,k] = cloud_water*(temp_model_rev[0,k]-all_ice_threshold)/(all_liquid_threshold - all_ice_threshold) + icewat_model_rev[k] = cloud_water - liqwat_model_rev[0,k] + else: + if (temp_model_rev[0,k] < intermediate_threshold and icewat_model_rev[k-1] > cloud_ice_mixing_ratio_threshold): + liqwat_model_rev[0,k] = 0.0 + icewat_model_rev[k] = cloud_water + else: + liqwat_model_rev[0,k] = cloud_water*(temp_model_rev[0,k]-all_ice_threshold)/(all_liquid_threshold - all_ice_threshold) + icewat_model_rev[k] = cloud_water - liqwat_model_rev[0,k] + (liqwat_model_rev[0,k], dummy_rain, icewat_model_rev[k], dummy_snow) = fv3_remap.mp_auto_conversion(liqwat_model_rev[0,k], icewat_model_rev[k]) + + [u_s, u_n, v_w, v_e] = get_zonal_and_meridional_winds_on_cd_grid(tile, dir, i, j, nc_file_data, lam) + + #put C/D grid zonal/meridional winds on model pressure levels + u_s_model_rev = fv3_remap.mappm(levp_data, pressure_from_data_rev[np.newaxis, :], u_s[np.newaxis, :], nlevs_model, pressure_model_interfaces_rev[np.newaxis, :], 1, 1, -1, 8, ptop_data) + u_n_model_rev = fv3_remap.mappm(levp_data, pressure_from_data_rev[np.newaxis, :], u_n[np.newaxis, :], nlevs_model, pressure_model_interfaces_rev[np.newaxis, :], 1, 1, -1, 8, ptop_data) + v_w_model_rev = fv3_remap.mappm(levp_data, pressure_from_data_rev[np.newaxis, :], v_w[np.newaxis, :], nlevs_model, pressure_model_interfaces_rev[np.newaxis, :], 1, 1, -1, 8, ptop_data) + v_e_model_rev = fv3_remap.mappm(levp_data, pressure_from_data_rev[np.newaxis, :], v_e[np.newaxis, :], nlevs_model, pressure_model_interfaces_rev[np.newaxis, :], 1, 1, -1, 8, ptop_data) + + #put C/D grid zonal/meridional winds on A grid (simple averaging for now, but FV3 has more complex methods that should be implemented) + + u_model_rev = np.zeros(nlevs_model) + v_model_rev = np.zeros(nlevs_model) + u_model_rev = 0.5*(u_s_model_rev + u_n_model_rev) + v_model_rev = 0.5*(v_w_model_rev + v_e_model_rev) + + nc_file_data.close() + + pressure_model_interfaces = pressure_model_interfaces_rev[::-1] + pressure_model = np.zeros(nlevs_model) + for k in range(0,nlevs_model): + #from gmtb_scm_vgrid + pressure_model[k] = ((1.0/(rocp+1.0))*(pressure_model_interfaces[k]**(rocp+1.0) - pressure_model_interfaces[k+1]**(rocp+1.0))/(pressure_model_interfaces[k] - pressure_model_interfaces[k+1]))**(1.0/rocp) + #put data in a dictionary + state = { + "nlevs": nlevs_model, + "zh": zh_rev[nlevs_model:0:-1], + "ua": u_model_rev[0][::-1], + "va": v_model_rev[0][::-1], + "qv": sphum_model_rev[0][::-1], + "o3": o3_model_rev[0][::-1], + "ql": liqwat_model_rev[0][::-1], + "qi": icewat_model_rev[::-1], + "ps": np.asarray(ps_calc), + "ta": temp_model_rev[0,::-1], + "pa": pressure_model, + "pa_i": pressure_model_interfaces + } return state -def get_UFS_surface_data(dir, tile, i, j, old_chgres): +######################################################################################## +# +######################################################################################## +def get_zonal_and_meridional_winds_on_cd_grid(tile, dir, i, j, nc_file_data, lam): + if lam: + filename_pattern = '*grid.tile{0}.halo{1}.nc'.format(tile, n_lam_halo_points) + for f_name in os.listdir(dir): + if fnmatch.fnmatch(f_name, filename_pattern): + filename = f_name + if not filename: + message = 'No filenames matching the pattern {0} found in {1}'.format(filename_pattern,dir) + logging.critical(message) + raise Exception(message) + else: + filename_pattern = '*grid.tile{0}.nc'.format(tile) + + for f_name in os.listdir(dir): + if fnmatch.fnmatch(f_name, filename_pattern): + filename = f_name + if not filename: + message = 'No filenames matching the pattern {0} found in {1}'.format(filename_pattern,dir) + logging.critical(message) + raise Exception(message) + + nc_file_grid = Dataset('{0}/{1}'.format(dir,filename)) + + if (lam): + #strip ghost/halo points and return supergrid + lon_super_data = np.asarray(nc_file_grid['x']) + lat_super_data = np.asarray(nc_file_grid['y']) + #assuming n_lam_halo_points + lon_super = lon_super_data[2*n_lam_halo_points:lon_super_data.shape[0]-2*n_lam_halo_points,2*n_lam_halo_points:lon_super_data.shape[1]-2*n_lam_halo_points] + lat_super = lat_super_data[2*n_lam_halo_points:lat_super_data.shape[0]-2*n_lam_halo_points,2*n_lam_halo_points:lat_super_data.shape[1]-2*n_lam_halo_points] + else: + lon_super = np.asarray(nc_file_grid['x']) #[lat,lon] or [y,x] #.swapaxes(0,1) + lat_super = np.asarray(nc_file_grid['y']) #[lat,lon] or [y,x] #.swapaxes(0,1) + + num_agrid_x = int(0.5*(lon_super.shape[1]-1)) + num_agrid_y = int(0.5*(lon_super.shape[0]-1)) + + #find orientation + #A-grid point + agrid_super_i_index = 2*i + 1 + agrid_super_j_index = 2*j + 1 + point_on_agrid = np.asarray((lon_super[agrid_super_j_index,agrid_super_i_index],lat_super[agrid_super_j_index,agrid_super_i_index])) + + test_dgrid_points = [(lon_super[agrid_super_j_index,agrid_super_i_index+1],lat_super[agrid_super_j_index,agrid_super_i_index+1]),\ + (lon_super[agrid_super_j_index,agrid_super_i_index-1],lat_super[agrid_super_j_index,agrid_super_i_index-1]),\ + (lon_super[agrid_super_j_index+1,agrid_super_i_index],lat_super[agrid_super_j_index+1,agrid_super_i_index]),\ + (lon_super[agrid_super_j_index-1,agrid_super_i_index],lat_super[agrid_super_j_index-1,agrid_super_i_index])] + + test_lon_diff = [p[0] - point_on_agrid[0] for p in test_dgrid_points] + test_lat_diff = [p[1] - point_on_agrid[1] for p in test_dgrid_points] + + east_test_point = np.argmax(test_lon_diff) + north_test_point = np.argmax(test_lat_diff) + + if east_test_point == 0: + #longitude increases most along the positive i axis + if north_test_point == 2: + #latitude increases most along the positive j axis + # ---> j+ north + # | + # V + # i+ east + + #calculation of zonal wind on first (south) D-grid point + p1 = np.asarray((lon_super[2*j,2*i],lat_super[2*j,2*i])) + p2 = np.asarray((lon_super[2*j,2*(i+1)],lat_super[2*j,2*(i+1)])) + p3 = fv3_remap.mid_pt_sphere(p1*deg_to_rad, p2*deg_to_rad) + e1 = fv3_remap.get_unit_vect2(p1*deg_to_rad, p2*deg_to_rad) + (ex, ey) = fv3_remap.get_latlon_vector(p3) + u_s = nc_file_data['u_s'][:,j,i]*fv3_remap.inner_prod(e1, ex) + nc_file_data['v_s'][:,j,i]*fv3_remap.inner_prod(e1, ey) + + #calculation of zonal wind on second (north) D-grid point + p1 = np.asarray((lon_super[2*(j+1),2*i],lat_super[2*(j+1),2*i,])) + p2 = np.asarray((lon_super[2*(j+1),2*(i+1)],lat_super[2*(j+1),2*(i+1)])) + p3 = fv3_remap.mid_pt_sphere(p1*deg_to_rad, p2*deg_to_rad) + e1 = fv3_remap.get_unit_vect2(p1*deg_to_rad, p2*deg_to_rad) + (ex, ey) = fv3_remap.get_latlon_vector(p3) + u_n = nc_file_data['u_s'][:,j+1,i]*fv3_remap.inner_prod(e1, ex) + nc_file_data['v_s'][:,j+1,i]*fv3_remap.inner_prod(e1, ey) + + #calculation of meridionial wind on first (west) D-grid point + p1 = np.asarray((lon_super[2*j,2*i],lat_super[2*j,2*i])) + p2 = np.asarray((lon_super[2*(j+1),2*i],lat_super[2*(j+1),2*i])) + p3 = fv3_remap.mid_pt_sphere(p1*deg_to_rad, p2*deg_to_rad) + e1 = fv3_remap.get_unit_vect2(p1*deg_to_rad, p2*deg_to_rad) + (ex, ey) = fv3_remap.get_latlon_vector(p3) + v_w = nc_file_data['u_w'][:,j,i]*fv3_remap.inner_prod(e1, ex) + nc_file_data['v_w'][:,j,i]*fv3_remap.inner_prod(e1, ey) + + #calculation of meridionial wind on second (east) D-grid point + p1 = np.asarray((lon_super[2*j,2*(i+1)],lat_super[2*j,2*(i+1)])) + p2 = np.asarray((lon_super[2*(j+1),2*(i+1)],lat_super[2*(j+1),2*(i+1)])) + p3 = fv3_remap.mid_pt_sphere(p1*deg_to_rad, p2*deg_to_rad) + e1 = fv3_remap.get_unit_vect2(p1*deg_to_rad, p2*deg_to_rad) + (ex, ey) = fv3_remap.get_latlon_vector(p3) + v_e = nc_file_data['u_w'][:,j,i+1]*fv3_remap.inner_prod(e1, ex) + nc_file_data['v_w'][:,j,i+1]*fv3_remap.inner_prod(e1, ey) + elif north_test_point == 3: + #latitude increases most along the negative j axis + # <--- j- north + # | + # V + # i+ east + #calculation of zonal wind on first (south) D-grid point + p1 = np.asarray((lon_super[2*j,2*i],lat_super[2*j,2*i])) + p2 = np.asarray((lon_super[2*j,2*(i+1)],lat_super[2*j,2*(i+1)])) + p3 = fv3_remap.mid_pt_sphere(p1*deg_to_rad, p2*deg_to_rad) + e1 = fv3_remap.get_unit_vect2(p1*deg_to_rad, p2*deg_to_rad) + (ex, ey) = fv3_remap.get_latlon_vector(p3) + u_s = nc_file_data['u_s'][:,j,i]*fv3_remap.inner_prod(e1, ex) + nc_file_data['v_s'][:,j,i]*fv3_remap.inner_prod(e1, ey) + + #calculation of zonal wind on second (north) D-grid point + p1 = np.asarray((lon_super[2*(j-1),2*i],lat_super[2*(j-1),2*i])) + p2 = np.asarray((lon_super[2*(j-1),2*(i+1)],lat_super[2*(j-1),2*(i+1)])) + p3 = fv3_remap.mid_pt_sphere(p1*deg_to_rad, p2*deg_to_rad) + e1 = fv3_remap.get_unit_vect2(p1*deg_to_rad, p2*deg_to_rad) + (ex, ey) = fv3_remap.get_latlon_vector(p3) + u_n = nc_file_data['u_s'][:,j-1,i]*fv3_remap.inner_prod(e1, ex) + nc_file_data['v_s'][:,j-1,i]*fv3_remap.inner_prod(e1, ey) + + #calculation of meridionial wind on first (west) D-grid point + p1 = np.asarray((lon_super[2*j,2*i],lat_super[2*j,2*i])) + p2 = np.asarray((lon_super[2*(j-1),2*i],lat_super[2*(j-1),2*i])) + p3 = fv3_remap.mid_pt_sphere(p1*deg_to_rad, p2*deg_to_rad) + e1 = fv3_remap.get_unit_vect2(p1*deg_to_rad, p2*deg_to_rad) + (ex, ey) = fv3_remap.get_latlon_vector(p3) + v_w = nc_file_data['u_w'][:,j,i]*fv3_remap.inner_prod(e1, ex) + nc_file_data['v_w'][:,j,i]*fv3_remap.inner_prod(e1, ey) + + #calculation of meridionial wind on second (east) D-grid point + p1 = np.asarray((lon_super[2*j,2*(i+1)],lat_super[2*j,2*(i+1)])) + p2 = np.asarray((lon_super[2*(j-1),2*(i+1)],lat_super[2*(j-1),2*(i+1)])) + p3 = fv3_remap.mid_pt_sphere(p1*deg_to_rad, p2*deg_to_rad) + e1 = fv3_remap.get_unit_vect2(p1*deg_to_rad, p2*deg_to_rad) + (ex, ey) = fv3_remap.get_latlon_vector(p3) + v_e = nc_file_data['u_w'][:,j,i+1]*fv3_remap.inner_prod(e1, ex) + nc_file_data['v_w'][:,j,i+1]*fv3_remap.inner_prod(e1, ey) + else: + print('unknown grid orientation') + elif east_test_point == 1: + #longitude increases most along the negative i axis + if north_test_point == 2: + #latitude increases most along the positive j axis + # i- east + # ^ + # | + # ---> j+ north + #calculation of zonal wind on first (south) D-grid point + p1 = np.asarray((lon_super[2*j,2*i],lat_super[2*j,2*i])) + p2 = np.asarray((lon_super[2*j,2*(i-1)],lat_super[2*j,2*(i-1)])) + p3 = fv3_remap.mid_pt_sphere(p1*deg_to_rad, p2*deg_to_rad) + e1 = fv3_remap.get_unit_vect2(p1*deg_to_rad, p2*deg_to_rad) + (ex, ey) = fv3_remap.get_latlon_vector(p3) + u_s = nc_file_data['u_s'][:,j,i]*fv3_remap.inner_prod(e1, ex) + nc_file_data['v_s'][:,j,i]*fv3_remap.inner_prod(e1, ey) + + #calculation of zonal wind on second (north) D-grid point + p1 = np.asarray((lon_super[2*(j+1),2*i],lat_super[2*(j+1),2*i])) + p2 = np.asarray((lon_super[2*(j+1),2*(i-1)],lat_super[2*(j+1),2*(i-1)])) + p3 = fv3_remap.mid_pt_sphere(p1*deg_to_rad, p2*deg_to_rad) + e1 = fv3_remap.get_unit_vect2(p1*deg_to_rad, p2*deg_to_rad) + (ex, ey) = fv3_remap.get_latlon_vector(p3) + u_n = nc_file_data['u_s'][:,j+1,i]*fv3_remap.inner_prod(e1, ex) + nc_file_data['v_s'][:,j+1,i]*fv3_remap.inner_prod(e1, ey) + + #calculation of meridionial wind on first (west) D-grid point + p1 = np.asarray((lon_super[2*j,2*i],lat_super[2*j,2*i])) + p2 = np.asarray((lon_super[2*(j+1),2*i],lat_super[2*(j+1),2*i])) + p3 = fv3_remap.mid_pt_sphere(p1*deg_to_rad, p2*deg_to_rad) + e1 = fv3_remap.get_unit_vect2(p1*deg_to_rad, p2*deg_to_rad) + (ex, ey) = fv3_remap.get_latlon_vector(p3) + v_w = nc_file_data['u_w'][:,j,i]*fv3_remap.inner_prod(e1, ex) + nc_file_data['v_w'][:,j,i]*fv3_remap.inner_prod(e1, ey) + + #calculation of meridionial wind on second (east) D-grid point + p1 = np.asarray((lon_super[2*j,2*(i-1)],lat_super[2*j,2*(i-1)])) + p2 = np.asarray((lon_super[2*(j+1),2*(i-1)],lat_super[2*(j+1),2*(i-1)])) + p3 = fv3_remap.mid_pt_sphere(p1*deg_to_rad, p2*deg_to_rad) + e1 = fv3_remap.get_unit_vect2(p1*deg_to_rad, p2*deg_to_rad) + (ex, ey) = fv3_remap.get_latlon_vector(p3) + v_e = nc_file_data['u_w'][:,j,i-1]*fv3_remap.inner_prod(e1, ex) + nc_file_data['v_w'][:,j,i-1]*fv3_remap.inner_prod(e1, ey) + elif north_test_point == 3: + #latitude increases most along the negative j axis + # i- east + # ^ + # | + # <--- j- north + #calculation of zonal wind on first (south) D-grid point + p1 = np.asarray((lon_super[2*j,2*i],lat_super[2*j,2*i])) + p2 = np.asarray((lon_super[2*j,2*(i-1)],lat_super[2*j,2*(i-1)])) + p3 = fv3_remap.mid_pt_sphere(p1*deg_to_rad, p2*deg_to_rad) + e1 = fv3_remap.get_unit_vect2(p1*deg_to_rad, p2*deg_to_rad) + (ex, ey) = fv3_remap.get_latlon_vector(p3) + u_s = nc_file_data['u_s'][:,j,i]*fv3_remap.inner_prod(e1, ex) + nc_file_data['v_s'][:,j,i]*fv3_remap.inner_prod(e1, ey) + + #calculation of zonal wind on second (north) D-grid point + p1 = np.asarray((lon_super[2*(j-1),2*i],lat_super[2*(j-1),2*i])) + p2 = np.asarray((lon_super[2*(j-1),2*(i-1)],lat_super[2*(j-1),2*(i-1)])) + p3 = fv3_remap.mid_pt_sphere(p1*deg_to_rad, p2*deg_to_rad) + e1 = fv3_remap.get_unit_vect2(p1*deg_to_rad, p2*deg_to_rad) + (ex, ey) = fv3_remap.get_latlon_vector(p3) + u_n = nc_file_data['u_s'][:,j-1,i]*fv3_remap.inner_prod(e1, ex) + nc_file_data['v_s'][:,j-1,i]*fv3_remap.inner_prod(e1, ey) + + #calculation of meridionial wind on first (west) D-grid point + p1 = np.asarray((lon_super[2*j,2*i],lat_super[2*j,2*i])) + p2 = np.asarray((lon_super[2*(j-1),2*i],lat_super[2*(j-1),2*i])) + p3 = fv3_remap.mid_pt_sphere(p1*deg_to_rad, p2*deg_to_rad) + e1 = fv3_remap.get_unit_vect2(p1*deg_to_rad, p2*deg_to_rad) + (ex, ey) = fv3_remap.get_latlon_vector(p3) + v_w = nc_file_data['u_w'][:,j,i]*fv3_remap.inner_prod(e1, ex) + nc_file_data['v_w'][:,j,i]*fv3_remap.inner_prod(e1, ey) + + #calculation of meridionial wind on second (east) D-grid point + p1 = np.asarray((lon_super[2*j,2*(i-1)],lat_super[2*j,2*(i-1)])) + p2 = np.asarray((lon_super[2*(j-1),2*(i-1)],lat_super[2*(j-1),2*(i-1)])) + p3 = fv3_remap.mid_pt_sphere(p1*deg_to_rad, p2*deg_to_rad) + e1 = fv3_remap.get_unit_vect2(p1*deg_to_rad, p2*deg_to_rad) + (ex, ey) = fv3_remap.get_latlon_vector(p3) + v_e = nc_file_data['u_w'][:,j,i-1]*fv3_remap.inner_prod(e1, ex) + nc_file_data['v_w'][:,j,i-1]*fv3_remap.inner_prod(e1, ey) + else: + print('unknown grid orientation') + elif east_test_point == 2: + #longitude increases most along the positive j axis + if north_test_point == 0: + #latitude increases most along the positive i axis + # ---> j+ east + # | + # V + # i+ north + #calculation of zonal wind on first (south) D-grid point + p1 = np.asarray((lon_super[2*j,2*i],lat_super[2*j,2*i])) + p2 = np.asarray((lon_super[2*(j+1),2*i],lat_super[2*(j+1),2*i])) + p3 = fv3_remap.mid_pt_sphere(p1*deg_to_rad, p2*deg_to_rad) + e1 = fv3_remap.get_unit_vect2(p1*deg_to_rad, p2*deg_to_rad) + (ex, ey) = fv3_remap.get_latlon_vector(p3) + u_s = nc_file_data['u_s'][:,j,i]*fv3_remap.inner_prod(e1, ex) + nc_file_data['v_s'][:,j,i]*fv3_remap.inner_prod(e1, ey) + + #calculation of zonal wind on second (north) D-grid point + p1 = np.asarray((lon_super[2*j,2*(i+1)],lat_super[2*j,2*(i+1)])) + p2 = np.asarray((lon_super[2*(j+1),2*(i+1)],lat_super[2*(j+1),2*(i+1)])) + p3 = fv3_remap.mid_pt_sphere(p1*deg_to_rad, p2*deg_to_rad) + e1 = fv3_remap.get_unit_vect2(p1*deg_to_rad, p2*deg_to_rad) + (ex, ey) = fv3_remap.get_latlon_vector(p3) + u_n = nc_file_data['u_s'][:,j,i+1]*fv3_remap.inner_prod(e1, ex) + nc_file_data['v_s'][:,j,i+1]*fv3_remap.inner_prod(e1, ey) + + #calculation of meridionial wind on first (west) D-grid point + p1 = np.asarray((lon_super[2*j,2*i],lat_super[2*j,2*i])) + p2 = np.asarray((lon_super[2*j,2*(i+1)],lat_super[2*j,2*(i+1)])) + p3 = fv3_remap.mid_pt_sphere(p1*deg_to_rad, p2*deg_to_rad) + e1 = fv3_remap.get_unit_vect2(p1*deg_to_rad, p2*deg_to_rad) + (ex, ey) = fv3_remap.get_latlon_vector(p3) + v_w = nc_file_data['u_w'][:,j,i]*fv3_remap.inner_prod(e1, ex) + nc_file_data['v_w'][:,j,i]*fv3_remap.inner_prod(e1, ey) + + #calculation of meridionial wind on second (east) D-grid point + p1 = np.asarray((lon_super[2*(j+1),2*i],lat_super[2*(j+1),2*i])) + p2 = np.asarray((lon_super[2*(j+1),2*(i+1)],lat_super[2*(j+1),2*(i+1)])) + p3 = fv3_remap.mid_pt_sphere(p1*deg_to_rad, p2*deg_to_rad) + e1 = fv3_remap.get_unit_vect2(p1*deg_to_rad, p2*deg_to_rad) + (ex, ey) = fv3_remap.get_latlon_vector(p3) + v_e = nc_file_data['u_w'][:,j+1,i]*fv3_remap.inner_prod(e1, ex) + nc_file_data['v_w'][:,j+1,i]*fv3_remap.inner_prod(e1, ey) + elif north_test_point == 1: + #latitude increases most along the negative i axis + # i- north + # ^ + # | + # ---> j+ east + #calculation of zonal wind on first (south) D-grid point + p1 = np.asarray((lon_super[2*j,2*i],lat_super[2*j,2*i])) + p2 = np.asarray((lon_super[2*(j+1),2*i],lat_super[2*(j+1),2*i])) + p3 = fv3_remap.mid_pt_sphere(p1*deg_to_rad, p2*deg_to_rad) + e1 = fv3_remap.get_unit_vect2(p1*deg_to_rad, p2*deg_to_rad) + (ex, ey) = fv3_remap.get_latlon_vector(p3) + u_s = nc_file_data['u_s'][:,j,i]*fv3_remap.inner_prod(e1, ex) + nc_file_data['v_s'][:,j,i]*fv3_remap.inner_prod(e1, ey) + + #calculation of zonal wind on second (north) D-grid point + p1 = np.asarray((lon_super[2*j,2*(i-1)],lat_super[2*j,2*(i-1)])) + p2 = np.asarray((lon_super[2*(j+1),2*(i-1)],lat_super[2*(j+1),2*(i-1)])) + p3 = fv3_remap.mid_pt_sphere(p1*deg_to_rad, p2*deg_to_rad) + e1 = fv3_remap.get_unit_vect2(p1*deg_to_rad, p2*deg_to_rad) + (ex, ey) = fv3_remap.get_latlon_vector(p3) + u_n = nc_file_data['u_s'][:,j,i-1]*fv3_remap.inner_prod(e1, ex) + nc_file_data['v_s'][:,j,i-1]*fv3_remap.inner_prod(e1, ey) + + #calculation of meridionial wind on first (west) D-grid point + p1 = np.asarray((lon_super[2*j,2*i],lat_super[2*j,2*i])) + p2 = np.asarray((lon_super[2*j,2*(i-1)],lat_super[2*j,2*(i-1)])) + p3 = fv3_remap.mid_pt_sphere(p1*deg_to_rad, p2*deg_to_rad) + e1 = fv3_remap.get_unit_vect2(p1*deg_to_rad, p2*deg_to_rad) + (ex, ey) = fv3_remap.get_latlon_vector(p3) + v_w = nc_file_data['u_w'][:,j,i]*fv3_remap.inner_prod(e1, ex) + nc_file_data['v_w'][:,j,i]*fv3_remap.inner_prod(e1, ey) + + #calculation of meridionial wind on second (east) D-grid point + p1 = np.asarray((lon_super[2*(j+1),2*i],lat_super[2*(j+1),2*i])) + p2 = np.asarray((lon_super[2*(j+1),2*(i-1)],lat_super[2*(j+1),2*(i-1)])) + p3 = fv3_remap.mid_pt_sphere(p1*deg_to_rad, p2*deg_to_rad) + e1 = fv3_remap.get_unit_vect2(p1*deg_to_rad, p2*deg_to_rad) + (ex, ey) = fv3_remap.get_latlon_vector(p3) + v_e = nc_file_data['u_w'][:,j+1,i]*fv3_remap.inner_prod(e1, ex) + nc_file_data['v_w'][:,j+1,i]*fv3_remap.inner_prod(e1, ey) + else: + print('unknown grid orientation') + elif east_test_point == 3: + #longitude increases most along the negative j axis + if north_test_point == 0: + #latitude increases most along the positive i axis + # <--- j- east + # | + # V + # i+ north + #calculation of zonal wind on first (south) D-grid point + p1 = np.asarray((lon_super[2*j,2*i],lat_super[2*j,2*i])) + p2 = np.asarray((lon_super[2*(j-1),2*i],lat_super[2*(j-1),2*i])) + p3 = fv3_remap.mid_pt_sphere(p1*deg_to_rad, p2*deg_to_rad) + e1 = fv3_remap.get_unit_vect2(p1*deg_to_rad, p2*deg_to_rad) + (ex, ey) = fv3_remap.get_latlon_vector(p3) + u_s = nc_file_data['u_s'][:,j,i]*fv3_remap.inner_prod(e1, ex) + nc_file_data['v_s'][:,j,i]*fv3_remap.inner_prod(e1, ey) + + #calculation of zonal wind on second (north) D-grid point + p1 = np.asarray((lon_super[2*j,2*(i+1)],lat_super[2*j,2*(i+1)])) + p2 = np.asarray((lon_super[2*(j-1),2*(i+1)],lat_super[2*(j-1),2*(i+1)])) + p3 = fv3_remap.mid_pt_sphere(p1*deg_to_rad, p2*deg_to_rad) + e1 = fv3_remap.get_unit_vect2(p1*deg_to_rad, p2*deg_to_rad) + (ex, ey) = fv3_remap.get_latlon_vector(p3) + u_n = nc_file_data['u_s'][:,j,i+1]*fv3_remap.inner_prod(e1, ex) + nc_file_data['v_s'][:,j,i+1]*fv3_remap.inner_prod(e1, ey) + + #calculation of meridionial wind on first (west) D-grid point + p1 = np.asarray((lon_super[2*j,2*i],lat_super[2*j,2*i])) + p2 = np.asarray((lon_super[2*j,2*(i+1)],lat_super[2*j,2*(i+1)])) + p3 = fv3_remap.mid_pt_sphere(p1*deg_to_rad, p2*deg_to_rad) + e1 = fv3_remap.get_unit_vect2(p1*deg_to_rad, p2*deg_to_rad) + (ex, ey) = fv3_remap.get_latlon_vector(p3) + v_w = nc_file_data['u_w'][:,j,i]*fv3_remap.inner_prod(e1, ex) + nc_file_data['v_w'][:,j,i]*fv3_remap.inner_prod(e1, ey) + + #calculation of meridionial wind on second (east) D-grid point + p1 = np.asarray((lon_super[2*(j-1),2*i],lat_super[2*(j-1),2*i])) + p2 = np.asarray((lon_super[2*(j-1),2*(i+1)],lat_super[2*(j-1),2*(i+1)])) + p3 = fv3_remap.mid_pt_sphere(p1*deg_to_rad, p2*deg_to_rad) + e1 = fv3_remap.get_unit_vect2(p1*deg_to_rad, p2*deg_to_rad) + (ex, ey) = fv3_remap.get_latlon_vector(p3) + v_e = nc_file_data['u_w'][:,j-1,i]*fv3_remap.inner_prod(e1, ex) + nc_file_data['v_w'][:,j-1,i]*fv3_remap.inner_prod(e1, ey) + elif north_test_point == 1: + #latitude increases most along the negative i axis + # i- north + # ^ + # | + # <--- j- east + #calculation of zonal wind on first (south) D-grid point + p1 = np.asarray((lon_super[2*j,2*i],lat_super[2*j,2*i])) + p2 = np.asarray((lon_super[2*(j-1),2*i],lat_super[2*(j-1),2*i])) + p3 = fv3_remap.mid_pt_sphere(p1*deg_to_rad, p2*deg_to_rad) + e1 = fv3_remap.get_unit_vect2(p1*deg_to_rad, p2*deg_to_rad) + (ex, ey) = fv3_remap.get_latlon_vector(p3) + u_s = nc_file_data['u_s'][:,j,i]*fv3_remap.inner_prod(e1, ex) + nc_file_data['v_s'][:,j,i]*fv3_remap.inner_prod(e1, ey) + + #calculation of zonal wind on second (north) D-grid point + p1 = np.asarray((lon_super[2*j,2*(i-1)],lat_super[2*j,2*(i-1)])) + p2 = np.asarray((lon_super[2*(j-1),2*(i-1)],lat_super[2*(j-1),2*(i-1)])) + p3 = fv3_remap.mid_pt_sphere(p1*deg_to_rad, p2*deg_to_rad) + e1 = fv3_remap.get_unit_vect2(p1*deg_to_rad, p2*deg_to_rad) + (ex, ey) = fv3_remap.get_latlon_vector(p3) + u_n = nc_file_data['u_s'][:,j,i-1]*fv3_remap.inner_prod(e1, ex) + nc_file_data['v_s'][:,j,i-1]*fv3_remap.inner_prod(e1, ey) + + #calculation of meridionial wind on first (west) D-grid point + p1 = np.asarray((lon_super[2*j,2*i],lat_super[2*j,2*i])) + p2 = np.asarray((lon_super[2*j,2*(i-1)],lat_super[2*j,2*(i-1)])) + p3 = fv3_remap.mid_pt_sphere(p1*deg_to_rad, p2*deg_to_rad) + e1 = fv3_remap.get_unit_vect2(p1*deg_to_rad, p2*deg_to_rad) + (ex, ey) = fv3_remap.get_latlon_vector(p3) + v_w = nc_file_data['u_w'][:,j,i]*fv3_remap.inner_prod(e1, ex) + nc_file_data['v_w'][:,j,i]*fv3_remap.inner_prod(e1, ey) + + #calculation of meridionial wind on second (east) D-grid point + p1 = np.asarray((lon_super[2*(j-1),2*i],lat_super[2*(j-1),2*i])) + p2 = np.asarray((lon_super[2*(j-1),2*(i-1)],lat_super[2*(j-1),2*(i-1)])) + p3 = fv3_remap.mid_pt_sphere(p1*deg_to_rad, p2*deg_to_rad) + e1 = fv3_remap.get_unit_vect2(p1*deg_to_rad, p2*deg_to_rad) + (ex, ey) = fv3_remap.get_latlon_vector(p3) + v_e = nc_file_data['u_w'][:,j-1,i]*fv3_remap.inner_prod(e1, ex) + nc_file_data['v_w'][:,j-1,i]*fv3_remap.inner_prod(e1, ey) + else: + print('unknown grid orientation') + + + nc_file_grid.close() + + return [u_s, u_n, v_w, v_e] + +######################################################################################## +# +######################################################################################## +def get_UFS_surface_data(dir, tile, i, j, old_chgres, lam): """Get the surface data for the given tile and indices""" - nc_file = Dataset('{0}/{1}'.format(dir,'sfc_data.tile{0}.nc'.format(tile))) + if lam: + nc_file = Dataset('{0}/{1}'.format(dir,'sfc_data.nc')) + else: + nc_file = Dataset('{0}/{1}'.format(dir,'sfc_data.tile{0}.nc'.format(tile))) #FV3/io/FV3GFS_io.F90/sfc_prop_restart_read was used as reference for variables that can be read in - #read in scalars (would be 2D variables in a 3D model) - - # surface properties (assuming Noah LSM; may contain variables needed for fractional land fraction) - tsfco_in = read_NetCDF_surface_var(nc_file, 'tsea', i, j, old_chgres, 0) - tg3_in = read_NetCDF_surface_var(nc_file, 'tg3', i, j, old_chgres, 0) + # + # read in scalars (2D) + # + + # Noah LSM ( may contain variables needed for fractional land fraction) + tsfco_in = read_NetCDF_surface_var(nc_file, 'tsea', i, j, old_chgres, 0) + tg3_in = read_NetCDF_surface_var(nc_file, 'tg3', i, j, old_chgres, 0) uustar_in = read_NetCDF_surface_var(nc_file, 'uustar', i, j, old_chgres, 0) - alvsf_in = read_NetCDF_surface_var(nc_file, 'alvsf', i, j, old_chgres, 0) - alvwf_in = read_NetCDF_surface_var(nc_file, 'alvwf', i, j, old_chgres, 0) - alnsf_in = read_NetCDF_surface_var(nc_file, 'alnsf', i, j, old_chgres, 0) - alnwf_in = read_NetCDF_surface_var(nc_file, 'alnwf', i, j, old_chgres, 0) - facsf_in = read_NetCDF_surface_var(nc_file, 'facsf', i, j, old_chgres, 0) - facwf_in = read_NetCDF_surface_var(nc_file, 'facwf', i, j, old_chgres, 0) - styp_in = read_NetCDF_surface_var(nc_file, 'stype', i, j, old_chgres, 0) - slope_in = read_NetCDF_surface_var(nc_file, 'slope', i, j, old_chgres, 0) - vtyp_in = read_NetCDF_surface_var(nc_file, 'vtype', i, j, old_chgres, 0) - vfrac_in = read_NetCDF_surface_var(nc_file, 'vfrac', i, j, old_chgres, 0) + alvsf_in = read_NetCDF_surface_var(nc_file, 'alvsf', i, j, old_chgres, 0) + alvwf_in = read_NetCDF_surface_var(nc_file, 'alvwf', i, j, old_chgres, 0) + alnsf_in = read_NetCDF_surface_var(nc_file, 'alnsf', i, j, old_chgres, 0) + alnwf_in = read_NetCDF_surface_var(nc_file, 'alnwf', i, j, old_chgres, 0) + facsf_in = read_NetCDF_surface_var(nc_file, 'facsf', i, j, old_chgres, 0) + facwf_in = read_NetCDF_surface_var(nc_file, 'facwf', i, j, old_chgres, 0) + styp_in = read_NetCDF_surface_var(nc_file, 'stype', i, j, old_chgres, 0) + slope_in = read_NetCDF_surface_var(nc_file, 'slope', i, j, old_chgres, 0) + vtyp_in = read_NetCDF_surface_var(nc_file, 'vtype', i, j, old_chgres, 0) + vfrac_in = read_NetCDF_surface_var(nc_file, 'vfrac', i, j, old_chgres, 0) shdmin_in = read_NetCDF_surface_var(nc_file, 'shdmin', i, j, old_chgres, 0) shdmax_in = read_NetCDF_surface_var(nc_file, 'shdmax', i, j, old_chgres, 0) - zorlw_in = read_NetCDF_surface_var(nc_file, 'zorl', i, j, old_chgres, 0) - slmsk_in = read_NetCDF_surface_var(nc_file, 'slmsk', i, j, old_chgres, 0) + zorlo_in = read_NetCDF_surface_var(nc_file, 'zorl', i, j, old_chgres, 0) + slmsk_in = read_NetCDF_surface_var(nc_file, 'slmsk', i, j, old_chgres, 0) canopy_in = read_NetCDF_surface_var(nc_file, 'canopy', i, j, old_chgres, 0) - hice_in = read_NetCDF_surface_var(nc_file, 'hice', i, j, old_chgres, 0) - fice_in = read_NetCDF_surface_var(nc_file, 'fice', i, j, old_chgres, 0) - tisfc_in = read_NetCDF_surface_var(nc_file, 'tisfc', i, j, old_chgres, 0) + hice_in = read_NetCDF_surface_var(nc_file, 'hice', i, j, old_chgres, 0) + fice_in = read_NetCDF_surface_var(nc_file, 'fice', i, j, old_chgres, 0) + tisfc_in = read_NetCDF_surface_var(nc_file, 'tisfc', i, j, old_chgres, 0) snwdph_in = read_NetCDF_surface_var(nc_file, 'snwdph', i, j, old_chgres, 0) snoalb_in = read_NetCDF_surface_var(nc_file, 'snoalb', i, j, old_chgres, 0) sheleg_in = read_NetCDF_surface_var(nc_file, 'sheleg', i, j, old_chgres, 0) - f10m_in = read_NetCDF_surface_var(nc_file, 'f10m', i, j, old_chgres, 0) - t2m_in = read_NetCDF_surface_var(nc_file, 't2m', i, j, old_chgres, 0) - q2m_in = read_NetCDF_surface_var(nc_file, 'q2m', i, j, old_chgres, 0) - ffmm_in = read_NetCDF_surface_var(nc_file, 'ffmm', i, j, old_chgres, 0) - ffhh_in = read_NetCDF_surface_var(nc_file, 'ffhh', i, j, old_chgres, 0) - tprcp_in = read_NetCDF_surface_var(nc_file, 'tprcp', i, j, old_chgres, 0) + f10m_in = read_NetCDF_surface_var(nc_file, 'f10m', i, j, old_chgres, 0) + t2m_in = read_NetCDF_surface_var(nc_file, 't2m', i, j, old_chgres, 0) + q2m_in = read_NetCDF_surface_var(nc_file, 'q2m', i, j, old_chgres, 0) + ffmm_in = read_NetCDF_surface_var(nc_file, 'ffmm', i, j, old_chgres, 0) + ffhh_in = read_NetCDF_surface_var(nc_file, 'ffhh', i, j, old_chgres, 0) + tprcp_in = read_NetCDF_surface_var(nc_file, 'tprcp', i, j, old_chgres, 0) srflag_in = read_NetCDF_surface_var(nc_file, 'srflag', i, j, old_chgres, 0) sncovr_in = read_NetCDF_surface_var(nc_file, 'sncovr', i, j, old_chgres, 0) - tsfcl_in = read_NetCDF_surface_var(nc_file, 'tsfcl', i, j, old_chgres, 0) - zorll_in = read_NetCDF_surface_var(nc_file, 'zorll', i, j, old_chgres, 0) - zorli_in = read_NetCDF_surface_var(nc_file, 'zorli', i, j, old_chgres, 0) - - #present when cplwav = T - zorlwav_in = read_NetCDF_surface_var(nc_file, 'zorlwav', i, j, old_chgres, 0) - - #NSST variables that may be in the surface file - tref_in = read_NetCDF_surface_var(nc_file, 'tref', i, j, old_chgres, 0) - z_c_in = read_NetCDF_surface_var(nc_file, 'z_c', i, j, old_chgres, 0) - c_0_in = read_NetCDF_surface_var(nc_file, 'c_0', i, j, old_chgres, 0) - c_d_in = read_NetCDF_surface_var(nc_file, 'c_d', i, j, old_chgres, 0) - w_0_in = read_NetCDF_surface_var(nc_file, 'w_0', i, j, old_chgres, 0) - w_d_in = read_NetCDF_surface_var(nc_file, 'w_d', i, j, old_chgres, 0) - xt_in = read_NetCDF_surface_var(nc_file, 'xt', i, j, old_chgres, 0) - xs_in = read_NetCDF_surface_var(nc_file, 'xs', i, j, old_chgres, 0) - xu_in = read_NetCDF_surface_var(nc_file, 'xu', i, j, old_chgres, 0) - xv_in = read_NetCDF_surface_var(nc_file, 'xv', i, j, old_chgres, 0) - xz_in = read_NetCDF_surface_var(nc_file, 'xz', i, j, old_chgres, 0) - zm_in = read_NetCDF_surface_var(nc_file, 'zm', i, j, old_chgres, 0) - xtts_in = read_NetCDF_surface_var(nc_file, 'xtts', i, j, old_chgres, 0) - xzts_in = read_NetCDF_surface_var(nc_file, 'xzts', i, j, old_chgres, 0) - d_conv_in = read_NetCDF_surface_var(nc_file, 'd_conv', i, j, old_chgres, 0) - ifd_in = read_NetCDF_surface_var(nc_file, 'ifd', i, j, old_chgres, 0) + tsfcl_in = read_NetCDF_surface_var(nc_file, 'tsfcl', i, j, old_chgres, 0) + zorll_in = read_NetCDF_surface_var(nc_file, 'zorll', i, j, old_chgres, 0) + zorli_in = read_NetCDF_surface_var(nc_file, 'zorli', i, j, old_chgres, 0) + + # present when cplwav = T + zorlw_in = read_NetCDF_surface_var(nc_file, 'zorlw', i, j, old_chgres, 0) + + # NSST + tref_in = read_NetCDF_surface_var(nc_file, 'tref', i, j, old_chgres, 0) + z_c_in = read_NetCDF_surface_var(nc_file, 'z_c', i, j, old_chgres, 0) + c_0_in = read_NetCDF_surface_var(nc_file, 'c_0', i, j, old_chgres, 0) + c_d_in = read_NetCDF_surface_var(nc_file, 'c_d', i, j, old_chgres, 0) + w_0_in = read_NetCDF_surface_var(nc_file, 'w_0', i, j, old_chgres, 0) + w_d_in = read_NetCDF_surface_var(nc_file, 'w_d', i, j, old_chgres, 0) + xt_in = read_NetCDF_surface_var(nc_file, 'xt', i, j, old_chgres, 0) + xs_in = read_NetCDF_surface_var(nc_file, 'xs', i, j, old_chgres, 0) + xu_in = read_NetCDF_surface_var(nc_file, 'xu', i, j, old_chgres, 0) + xv_in = read_NetCDF_surface_var(nc_file, 'xv', i, j, old_chgres, 0) + xz_in = read_NetCDF_surface_var(nc_file, 'xz', i, j, old_chgres, 0) + zm_in = read_NetCDF_surface_var(nc_file, 'zm', i, j, old_chgres, 0) + xtts_in = read_NetCDF_surface_var(nc_file, 'xtts', i, j, old_chgres, 0) + xzts_in = read_NetCDF_surface_var(nc_file, 'xzts', i, j, old_chgres, 0) + d_conv_in = read_NetCDF_surface_var(nc_file, 'd_conv', i, j, old_chgres, 0) + ifd_in = read_NetCDF_surface_var(nc_file, 'ifd', i, j, old_chgres, 0) dt_cool_in = read_NetCDF_surface_var(nc_file, 'dt_cool', i, j, old_chgres, 0) - qrain_in = read_NetCDF_surface_var(nc_file, 'qrain', i, j, old_chgres, 0) - - #NoahMP variables that may be in the surface file - snowxy_in = read_NetCDF_surface_var(nc_file, 'snowxy', i, j, old_chgres, 0) - tvxy_in = read_NetCDF_surface_var(nc_file, 'tvxy', i, j, old_chgres, 0) - tgxy_in = read_NetCDF_surface_var(nc_file, 'tgxy', i, j, old_chgres, 0) - canicexy_in = read_NetCDF_surface_var(nc_file, 'canicexy', i, j, old_chgres, 0) - canliqxy_in = read_NetCDF_surface_var(nc_file, 'canliqxy', i, j, old_chgres, 0) - eahxy_in = read_NetCDF_surface_var(nc_file, 'eahxy', i, j, old_chgres, 0) - tahxy_in = read_NetCDF_surface_var(nc_file, 'tahxy', i, j, old_chgres, 0) - cmxy_in = read_NetCDF_surface_var(nc_file, 'cmxy', i, j, old_chgres, 0) - chxy_in = read_NetCDF_surface_var(nc_file, 'chxy', i, j, old_chgres, 0) - fwetxy_in = read_NetCDF_surface_var(nc_file, 'fwetxy', i, j, old_chgres, 0) - sneqvoxy_in = read_NetCDF_surface_var(nc_file, 'sneqvoxy', i, j, old_chgres, 0) - alboldxy_in = read_NetCDF_surface_var(nc_file, 'alboldxy', i, j, old_chgres, 0) - qsnowxy_in = read_NetCDF_surface_var(nc_file, 'qsnowxy', i, j, old_chgres, 0) - wslakexy_in = read_NetCDF_surface_var(nc_file, 'wslakexy', i, j, old_chgres, 0) - zwtxy_in = read_NetCDF_surface_var(nc_file, 'zwtxy', i, j, old_chgres, 0) - waxy_in = read_NetCDF_surface_var(nc_file, 'waxy', i, j, old_chgres, 0) - wtxy_in = read_NetCDF_surface_var(nc_file, 'wtxy', i, j, old_chgres, 0) - lfmassxy_in = read_NetCDF_surface_var(nc_file, 'lfmassxy', i, j, old_chgres, 0) - rtmassxy_in = read_NetCDF_surface_var(nc_file, 'rtmassxy', i, j, old_chgres, 0) - stmassxy_in = read_NetCDF_surface_var(nc_file, 'stmassxy', i, j, old_chgres, 0) - woodxy_in = read_NetCDF_surface_var(nc_file, 'woodxy', i, j, old_chgres, 0) - stblcpxy_in = read_NetCDF_surface_var(nc_file, 'stblcpxy', i, j, old_chgres, 0) - fastcpxy_in = read_NetCDF_surface_var(nc_file, 'fastcpxy', i, j, old_chgres, 0) - xsaixy_in = read_NetCDF_surface_var(nc_file, 'xsaixy', i, j, old_chgres, 0) - xlaixy_in = read_NetCDF_surface_var(nc_file, 'xlaixy', i, j, old_chgres, 0) - taussxy_in = read_NetCDF_surface_var(nc_file, 'taussxy', i, j, old_chgres, 0) - smcwtdxy_in = read_NetCDF_surface_var(nc_file, 'smcwtdxy', i, j, old_chgres, 0) + qrain_in = read_NetCDF_surface_var(nc_file, 'qrain', i, j, old_chgres, 0) + + # NoahMP LSM + snowxy_in = read_NetCDF_surface_var(nc_file, 'snowxy', i, j, old_chgres, 0) + tvxy_in = read_NetCDF_surface_var(nc_file, 'tvxy', i, j, old_chgres, 0) + tgxy_in = read_NetCDF_surface_var(nc_file, 'tgxy', i, j, old_chgres, 0) + canicexy_in = read_NetCDF_surface_var(nc_file, 'canicexy', i, j, old_chgres, 0) + canliqxy_in = read_NetCDF_surface_var(nc_file, 'canliqxy', i, j, old_chgres, 0) + eahxy_in = read_NetCDF_surface_var(nc_file, 'eahxy', i, j, old_chgres, 0) + tahxy_in = read_NetCDF_surface_var(nc_file, 'tahxy', i, j, old_chgres, 0) + cmxy_in = read_NetCDF_surface_var(nc_file, 'cmxy', i, j, old_chgres, 0) + chxy_in = read_NetCDF_surface_var(nc_file, 'chxy', i, j, old_chgres, 0) + fwetxy_in = read_NetCDF_surface_var(nc_file, 'fwetxy', i, j, old_chgres, 0) + sneqvoxy_in = read_NetCDF_surface_var(nc_file, 'sneqvoxy', i, j, old_chgres, 0) + alboldxy_in = read_NetCDF_surface_var(nc_file, 'alboldxy', i, j, old_chgres, 0) + qsnowxy_in = read_NetCDF_surface_var(nc_file, 'qsnowxy', i, j, old_chgres, 0) + wslakexy_in = read_NetCDF_surface_var(nc_file, 'wslakexy', i, j, old_chgres, 0) + zwtxy_in = read_NetCDF_surface_var(nc_file, 'zwtxy', i, j, old_chgres, 0) + waxy_in = read_NetCDF_surface_var(nc_file, 'waxy', i, j, old_chgres, 0) + wtxy_in = read_NetCDF_surface_var(nc_file, 'wtxy', i, j, old_chgres, 0) + lfmassxy_in = read_NetCDF_surface_var(nc_file, 'lfmassxy', i, j, old_chgres, 0) + rtmassxy_in = read_NetCDF_surface_var(nc_file, 'rtmassxy', i, j, old_chgres, 0) + stmassxy_in = read_NetCDF_surface_var(nc_file, 'stmassxy', i, j, old_chgres, 0) + woodxy_in = read_NetCDF_surface_var(nc_file, 'woodxy', i, j, old_chgres, 0) + stblcpxy_in = read_NetCDF_surface_var(nc_file, 'stblcpxy', i, j, old_chgres, 0) + fastcpxy_in = read_NetCDF_surface_var(nc_file, 'fastcpxy', i, j, old_chgres, 0) + xsaixy_in = read_NetCDF_surface_var(nc_file, 'xsaixy', i, j, old_chgres, 0) + xlaixy_in = read_NetCDF_surface_var(nc_file, 'xlaixy', i, j, old_chgres, 0) + taussxy_in = read_NetCDF_surface_var(nc_file, 'taussxy', i, j, old_chgres, 0) + smcwtdxy_in = read_NetCDF_surface_var(nc_file, 'smcwtdxy', i, j, old_chgres, 0) deeprechxy_in = read_NetCDF_surface_var(nc_file, 'deeprechxy', i, j, old_chgres, 0) - rechxy_in = read_NetCDF_surface_var(nc_file, 'rechxy', i, j, old_chgres, 0) - albdvis_in = read_NetCDF_surface_var(nc_file, 'albdvis', i, j, old_chgres, 0) - albdnir_in = read_NetCDF_surface_var(nc_file, 'albdnir', i, j, old_chgres, 0) - albivis_in = read_NetCDF_surface_var(nc_file, 'albivis', i, j, old_chgres, 0) - albinir_in = read_NetCDF_surface_var(nc_file, 'albinir', i, j, old_chgres, 0) - emiss_in = read_NetCDF_surface_var(nc_file, 'emiss', i, j, old_chgres, 0) - - #RUC LSM variables that may be in the surface file - wetness_in = read_NetCDF_surface_var(nc_file, 'wetness', i, j, old_chgres, 0) - clw_surf_land_in = read_NetCDF_surface_var(nc_file, 'clw_surf_land', i, j, old_chgres, 0) - clw_surf_ice_in = read_NetCDF_surface_var(nc_file, 'clw_surf_ice', i, j, old_chgres, 0) - qwv_surf_land_in = read_NetCDF_surface_var(nc_file, 'qwv_surf_land', i, j, old_chgres, 0) - qwv_surf_ice_in = read_NetCDF_surface_var(nc_file, 'qwv_surf_ice', i, j, old_chgres, 0) - tsnow_land_in = read_NetCDF_surface_var(nc_file, 'tsnow_land', i, j, old_chgres, 0) - tsnow_ice_in = read_NetCDF_surface_var(nc_file, 'tsnow_ice', i, j, old_chgres, 0) + rechxy_in = read_NetCDF_surface_var(nc_file, 'rechxy', i, j, old_chgres, 0) + + # RUC LSM + wetness_in = read_NetCDF_surface_var(nc_file, 'wetness', i, j, old_chgres, 0) + clw_surf_land_in = read_NetCDF_surface_var(nc_file, 'clw_surf_land', i, j, old_chgres, 0) + clw_surf_ice_in = read_NetCDF_surface_var(nc_file, 'clw_surf_ice', i, j, old_chgres, 0) + qwv_surf_land_in = read_NetCDF_surface_var(nc_file, 'qwv_surf_land', i, j, old_chgres, 0) + qwv_surf_ice_in = read_NetCDF_surface_var(nc_file, 'qwv_surf_ice', i, j, old_chgres, 0) + tsnow_land_in = read_NetCDF_surface_var(nc_file, 'tsnow_land', i, j, old_chgres, 0) + tsnow_ice_in = read_NetCDF_surface_var(nc_file, 'tsnow_ice', i, j, old_chgres, 0) snowfall_acc_land_in = read_NetCDF_surface_var(nc_file, 'snowfall_acc_land', i, j, old_chgres, 0) - snowfall_acc_ice_in = read_NetCDF_surface_var(nc_file, 'snowfall_acc_ice', i, j, old_chgres, 0) - sncovr_ice_in = read_NetCDF_surface_var(nc_file, 'sncovr_ice', i, j, old_chgres, 0) - lai_in = read_NetCDF_surface_var(nc_file, 'lai', i, j, old_chgres, 0) - - #read in profiles (would be 3D variables in a 3D model) - - #land_state + snowfall_acc_ice_in = read_NetCDF_surface_var(nc_file, 'snowfall_acc_ice', i, j, old_chgres, 0) + sfalb_lnd_in = read_NetCDF_surface_var(nc_file, 'sfalb_lnd', i, j, old_chgres, 0) + sfalb_lnd_bck_in = read_NetCDF_surface_var(nc_file, 'sfalb_lnd_bck', i, j, old_chgres, 0) + sfalb_ice_in = read_NetCDF_surface_var(nc_file, 'sfalb_ice', i, j, old_chgres, 0) + lai_in = read_NetCDF_surface_var(nc_file, 'lai', i, j, old_chgres, 0) + albdirvis_ice_in = read_NetCDF_surface_var(nc_file, 'albdirvis_ice', i, j, old_chgres, 0) + albdirnir_ice_in = read_NetCDF_surface_var(nc_file, 'albdirnir_ice', i, j, old_chgres, 0) + albdifvis_ice_in = read_NetCDF_surface_var(nc_file, 'albdifvis_ice', i, j, old_chgres, 0) + albdifnir_ice_in = read_NetCDF_surface_var(nc_file, 'albdifnir_ice', i, j, old_chgres, 0) + emis_lnd_in = read_NetCDF_surface_var(nc_file, 'emis_lnd', i, j, old_chgres, 0) + emis_ice_in = read_NetCDF_surface_var(nc_file, 'emis_ice', i, j, old_chgres, 0) + + # + # read in profiles (3D) + # + + # land_state stc_in = read_NetCDF_surface_var(nc_file, 'stc', i, j, old_chgres, missing_variable_soil_layers) smc_in = read_NetCDF_surface_var(nc_file, 'smc', i, j, old_chgres, missing_variable_soil_layers) slc_in = read_NetCDF_surface_var(nc_file, 'slc', i, j, old_chgres, missing_variable_soil_layers) - #NoahMP 3D variables + # NoahMP LSM snicexy_in = read_NetCDF_surface_var(nc_file, 'snicexy', i, j, old_chgres, missing_variable_snow_layers) snliqxy_in = read_NetCDF_surface_var(nc_file, 'snliqxy', i, j, old_chgres, missing_variable_snow_layers) - tsnoxy_in = read_NetCDF_surface_var(nc_file, 'tsnoxy', i, j, old_chgres, missing_variable_snow_layers) + tsnoxy_in = read_NetCDF_surface_var(nc_file, 'tsnoxy', i, j, old_chgres, missing_variable_snow_layers) smoiseq_in = read_NetCDF_surface_var(nc_file, 'smoiseq', i, j, old_chgres, missing_variable_soil_layers) zsnsoxy_in = read_NetCDF_surface_var(nc_file, 'zsnsoxy', i, j, old_chgres, missing_variable_soil_layers + missing_variable_snow_layers) - #RUC LSM 3D variables - tslb_in = read_NetCDF_surface_var(nc_file, 'tslb', i, j, old_chgres, missing_variable_soil_layers) + # RUC LSM + tslb_in = read_NetCDF_surface_var(nc_file, 'tslb', i, j, old_chgres, missing_variable_soil_layers) smois_in = read_NetCDF_surface_var(nc_file, 'smois', i, j, old_chgres, missing_variable_soil_layers) - sh2o_in = read_NetCDF_surface_var(nc_file, 'sh2o', i, j, old_chgres, missing_variable_soil_layers) - smfr_in = read_NetCDF_surface_var(nc_file, 'smfr', i, j, old_chgres, missing_variable_soil_layers) - flfr_in = read_NetCDF_surface_var(nc_file, 'flfr', i, j, old_chgres, missing_variable_soil_layers) + sh2o_in = read_NetCDF_surface_var(nc_file, 'sh2o', i, j, old_chgres, missing_variable_soil_layers) + smfr_in = read_NetCDF_surface_var(nc_file, 'smfr', i, j, old_chgres, missing_variable_soil_layers) + flfr_in = read_NetCDF_surface_var(nc_file, 'flfr', i, j, old_chgres, missing_variable_soil_layers) - #fractional grid 3D variables + # fractional grid tiice_in = read_NetCDF_surface_var(nc_file, 'tiice', i, j, old_chgres, missing_variable_ice_layers) - #print("zorlwav_in = {}".format(zorlwav_in)) - + # nc_file.close() #put data in a dictionary surface = { - #Noah LSM + # Noah LSM "tsfco": tsfco_in, "tg3": tg3_in, "uustar": uustar_in, @@ -579,21 +1186,21 @@ def get_UFS_surface_data(dir, tile, i, j, old_chgres): "alnwf": alnwf_in, "facsf": facsf_in, "facwf": facwf_in, - "styp": styp_in, - "slope": slope_in, - "vtyp": vtyp_in, - "vfrac": vfrac_in, + "soiltyp": styp_in, + "slopetyp": slope_in, + "vegtyp": vtyp_in, + "vegfrac": vfrac_in, "shdmin": shdmin_in, "shdmax": shdmax_in, - "zorlw": zorlw_in, + "z0": zorlo_in, "slmsk": slmsk_in, "canopy": canopy_in, "hice": hice_in, "fice": fice_in, "tisfc": tisfc_in, - "snwdph": snwdph_in, + "snowd": snwdph_in, "snoalb": snoalb_in, - "sheleg": sheleg_in, + "weasd": sheleg_in, "f10m": f10m_in, "t2m": t2m_in, "q2m": q2m_in, @@ -606,7 +1213,7 @@ def get_UFS_surface_data(dir, tile, i, j, old_chgres): "zorll": zorll_in, "zorli": zorli_in, #cplwav - "zorlwav": zorlwav_in, + "zorlw": zorlw_in, #NSST "tref": tref_in, "z_c": z_c_in, @@ -656,12 +1263,7 @@ def get_UFS_surface_data(dir, tile, i, j, old_chgres): "smcwtdxy": smcwtdxy_in, "deeprechxy": deeprechxy_in, "rechxy": rechxy_in, - "albdvis": albdvis_in, - "albdnir": albdnir_in, - "albivis": albivis_in, - "albinir": albinir_in, - "emiss": emiss_in, - #RUC LSM + # RUC LSM 2D "wetness": wetness_in, "clw_surf_land": clw_surf_land_in, "clw_surf_ice": clw_surf_ice_in, @@ -671,8 +1273,16 @@ def get_UFS_surface_data(dir, tile, i, j, old_chgres): "tsnow_ice": tsnow_ice_in, "snowfall_acc_land": snowfall_acc_land_in, "snowfall_acc_ice": snowfall_acc_ice_in, - "sncovr_ice": sncovr_ice_in, + "sfalb_lnd": sfalb_lnd_in, + "sfalb_lnd_bck": sfalb_lnd_bck_in, + "sfalb_ice": sfalb_ice_in, "lai": lai_in, + "albdirvis_ice": albdirvis_ice_in, + "albdirnir_ice": albdirnir_ice_in, + "albdifvis_ice": albdifvis_ice_in, + "albdifnir_ice": albdifnir_ice_in, + "emis_lnd": emis_lnd_in, + "emis_ice": emis_ice_in, #Noah LSM 3D "stc": stc_in, "smc": smc_in, @@ -694,99 +1304,128 @@ def get_UFS_surface_data(dir, tile, i, j, old_chgres): } return surface -def get_UFS_oro_data(dir, tile, i, j): +######################################################################################## +# +######################################################################################## +def get_UFS_oro_data(dir, tile, i, j, lam): """Get the orographic data for the given tile and indices""" - filename_pattern = 'oro_data.tile{0}.nc'.format(tile) - for f_name in os.listdir(dir): - if fnmatch.fnmatch(f_name, filename_pattern): - filename = f_name - - nc_file = Dataset('{0}/{1}'.format(dir,filename)) + if lam: + nc_file = Dataset('{0}/{1}'.format(dir,'oro_data.nc')) + else: + filename_pattern = 'oro_data.tile{0}.nc'.format(tile) + for f_name in os.listdir(dir): + if fnmatch.fnmatch(f_name, filename_pattern): + filename = f_name + + nc_file = Dataset('{0}/{1}'.format(dir,filename)) # orographyic properties - stddev_in = read_NetCDF_var(nc_file, "stddev", i, j) - convexity_in = read_NetCDF_var(nc_file, "convexity", i, j) - oa1_in = read_NetCDF_var(nc_file, "oa1", i, j) - oa2_in = read_NetCDF_var(nc_file, "oa2", i, j) - oa3_in = read_NetCDF_var(nc_file, "oa3", i, j) - oa4_in = read_NetCDF_var(nc_file, "oa4", i, j) - ol1_in = read_NetCDF_var(nc_file, "ol1", i, j) - ol2_in = read_NetCDF_var(nc_file, "ol2", i, j) - ol3_in = read_NetCDF_var(nc_file, "ol3", i, j) - ol4_in = read_NetCDF_var(nc_file, "ol4", i, j) - theta_in = read_NetCDF_var(nc_file, "theta", i, j) - gamma_in = read_NetCDF_var(nc_file, "gamma", i, j) - sigma_in = read_NetCDF_var(nc_file, "sigma", i, j) - elvmax_in = read_NetCDF_var(nc_file, "elvmax", i, j) - orog_filt_in = read_NetCDF_var(nc_file, "orog_filt", i, j) - orog_raw_in = read_NetCDF_var(nc_file, "orog_raw", i, j) + stddev_in = read_NetCDF_var(nc_file, "stddev", i, j) + convexity_in = read_NetCDF_var(nc_file, "convexity", i, j) + oa1_in = read_NetCDF_var(nc_file, "oa1", i, j) + oa2_in = read_NetCDF_var(nc_file, "oa2", i, j) + oa3_in = read_NetCDF_var(nc_file, "oa3", i, j) + oa4_in = read_NetCDF_var(nc_file, "oa4", i, j) + ol1_in = read_NetCDF_var(nc_file, "ol1", i, j) + ol2_in = read_NetCDF_var(nc_file, "ol2", i, j) + ol3_in = read_NetCDF_var(nc_file, "ol3", i, j) + ol4_in = read_NetCDF_var(nc_file, "ol4", i, j) + theta_in = read_NetCDF_var(nc_file, "theta", i, j) + gamma_in = read_NetCDF_var(nc_file, "gamma", i, j) + sigma_in = read_NetCDF_var(nc_file, "sigma", i, j) + elvmax_in = read_NetCDF_var(nc_file, "elvmax", i, j) + orog_filt_in = read_NetCDF_var(nc_file, "orog_filt", i, j) + orog_raw_in = read_NetCDF_var(nc_file, "orog_raw", i, j) #fractional landmask variables - land_frac_in = read_NetCDF_var(nc_file, "land_frac", i, j) - #lake variables - lake_frac_in = read_NetCDF_var(nc_file, "lake_frac", i, j) + land_frac_in = read_NetCDF_var(nc_file, "land_frac", i, j) + #lake variables (optional) + lake_frac_in = read_NetCDF_var(nc_file, "lake_frac", i, j) lake_depth_in = read_NetCDF_var(nc_file, "lake_depth", i, j) - + + # nc_file.close() - #put data in a dictionary - oro = { - "stddev": stddev_in, - "convexity": convexity_in, - "oa1": oa1_in, - "oa2": oa2_in, - "oa3": oa3_in, - "oa4": oa4_in, - "ol1": ol1_in, - "ol2": ol2_in, - "ol3": ol3_in, - "ol4": ol4_in, - "theta": theta_in, - "gamma": gamma_in, - "sigma": sigma_in, - "elvmax": elvmax_in, - "orog_filt": orog_filt_in, - "orog_raw": orog_raw_in, - "land_frac": land_frac_in, - "lake_frac": lake_frac_in, - "lake_depth": lake_depth_in - } + # Store data in a dictionary + oro = {"stddev": stddev_in, + "convexity": convexity_in, + "oa1": oa1_in, + "oa2": oa2_in, + "oa3": oa3_in, + "oa4": oa4_in, + "ol1": ol1_in, + "ol2": ol2_in, + "ol3": ol3_in, + "ol4": ol4_in, + "theta": theta_in, + "gamma": gamma_in, + "sigma": sigma_in, + "elvmax": elvmax_in, + "oro": orog_filt_in, + "oro_uf": orog_raw_in, + "landfrac": land_frac_in, + "lakefrac": lake_frac_in, + "lakedepth": lake_depth_in} + return oro +######################################################################################## +# +######################################################################################## def get_UFS_vgrid_data(dir): """Get the vertical grid data for resolution of the data within the IC directory""" nc_file = Dataset('{0}/{1}'.format(dir,'gfs_ctrl.nc')) # vertical coordinate definition + # GJF: it looks like there is an extra level on top that represents 0 Pa, otherwise these values are for vertical grid interfaces ak=nc_file['vcoord'][0,::-1] bk=nc_file['vcoord'][1,::-1] + #GJF: in external_ic.F90, when external_eta is true (which it apparently is for FV3GFS runs), the top value is ignored + #ak = ak[0:len(ak)-1] + #bk = bk[0:len(bk)-1] + nc_file.close() vgrid = { "ak": ak, - "bk": bk + "bk": bk, + "nlevs": len(ak)-2 #full grid levels are interfaces - 1 and there is an extra level on top (subtract 2) } return vgrid -def get_UFS_grid_area(dir, tile, i, j): +######################################################################################## +# +######################################################################################## +def get_UFS_grid_area(dir, tile, i, j, lam): """Get the horizontal grid cell area for the given tile and indices""" #this information is in the supergrid files - filename_pattern = '*grid.tile{0}.nc'.format(tile) - - for f_name in os.listdir(dir): - if fnmatch.fnmatch(f_name, filename_pattern): - filename = f_name - if not filename: - message = 'No filenames matching the pattern {0} found in {1}'.format(filename_pattern,dir) - logging.critical(message) - raise Exception(message) - + if lam: + filename_pattern = '*grid.tile{0}.halo{1}.nc'.format(tile, n_lam_halo_points) + for f_name in os.listdir(dir): + if fnmatch.fnmatch(f_name, filename_pattern): + filename = f_name + if not filename: + message = 'No filenames matching the pattern {0} found in {1}'.format(filename_pattern,dir) + logging.critical(message) + raise Exception(message) + else: + filename_pattern = '*grid.tile{0}.nc'.format(tile) + + for f_name in os.listdir(dir): + if fnmatch.fnmatch(f_name, filename_pattern): + filename = f_name + if not filename: + message = 'No filenames matching the pattern {0} found in {1}'.format(filename_pattern,dir) + logging.critical(message) + raise Exception(message) + nc_file = Dataset('{0}/{1}'.format(dir,filename)) + # extract out area of grid cell #calculate supergrid indices from regular grid indices @@ -794,1291 +1433,1307 @@ def get_UFS_grid_area(dir, tile, i, j): ipt2 = i*2+1 #from Phil Pegion: the area is calculated by adding up the 4 components of the contained supergrid cells - area_in=nc_file['area'][jpt2-1:jpt2+1,ipt2-1:ipt2+1] + if lam: + area_data = nc_file['area'][:,:] + area_data_no_halo = area_data[2*n_lam_halo_points:area_data.shape[0]-2*n_lam_halo_points,2*n_lam_halo_points:area_data.shape[1]-2*n_lam_halo_points] + area_in = area_data_no_halo[jpt2-1:jpt2+1,ipt2-1:ipt2+1] + else: + area_in=nc_file['area'][jpt2-1:jpt2+1,ipt2-1:ipt2+1] return area_in.sum() -def get_UFS_forcing_data(nlevs): +######################################################################################## +# +######################################################################################## +def search_in_dict(listin,name): + for count, dictionary in enumerate(listin): + if dictionary["name"] == name: + return count + +######################################################################################## +# +######################################################################################## +def get_UFS_forcing_data(nlevs, state_IC, location, use_nearest, forcing_dir, grid_dir, + tile, i, j, lam, save_comp_data): """Get the horizontal and vertical advective tendencies for the given tile and indices""" - - #Note: this is a placeholder function that sets forcing to 0, but will need to be filled out in the future from custom FV3 output - - ntimes = 1 - - time = np.zeros(ntimes) - w_ls = np.zeros((nlevs,ntimes),dtype=float) - omega = np.zeros((nlevs,ntimes),dtype=float) - u_g = np.zeros((nlevs,ntimes),dtype=float) - v_g = np.zeros((nlevs,ntimes),dtype=float) - u_nudge = np.zeros((nlevs,ntimes),dtype=float) - v_nudge = np.zeros((nlevs,ntimes),dtype=float) - T_nudge = np.zeros((nlevs,ntimes),dtype=float) - thil_nudge = np.zeros((nlevs,ntimes),dtype=float) - qt_nudge = np.zeros((nlevs,ntimes),dtype=float) - rad_heating = np.zeros((nlevs,ntimes),dtype=float) - h_advec_thil = np.zeros((nlevs,ntimes),dtype=float) - v_advec_thil = np.zeros((nlevs,ntimes),dtype=float) - h_advec_qt = np.zeros((nlevs,ntimes),dtype=float) - v_advec_qt = np.zeros((nlevs,ntimes),dtype=float) - - forcing = { - "time": time, - "w_ls": w_ls, - "omega": omega, - "u_g": u_g, - "v_g": v_g, - "u_nudge": u_nudge, - "v_nudge": v_nudge, - "T_nudge": T_nudge, - "thil_nudge": thil_nudge, - "qt_nudge": qt_nudge, - "rad_heating": rad_heating, - "h_advec_thil": h_advec_thil, - "v_advec_thil": v_advec_thil, - "h_advec_qt": h_advec_qt, - "v_advec_qt": v_advec_qt - } - - return forcing - -def add_noahmp_coldstart(surface, date): - """Add cold-start ICs for the NoahMP LSM from Noah LSM variables""" - - #use cold start section of FV3/io/FV3GFS_io.F90 to initialize NoahMP-specific variables (this is a python port of the Fortran code in that file) - - #MPTABLE.TBL uses a namelist format, so can use f90nml to read it in - mptable_nml_all = f90nml.read(os.path.join(NOAHMP_TABLES_DIR, 'MPTABLE.TBL')) - #MPTABLE.TBL contains data (with distinct namelists) for USGS and MODIS data; looks like MODIS is the operational - mptable_nml_active = mptable_nml_all['noah_mp_modis_parameters'] #alternative is mptable_nml_all['noah_mp_usgs_parameters'] - - #operational values; change if necessary (or read from somewhere?) - n_snow_layers = 3 - n_soil_layers = 4 - - #thickness of each soil level - dzs = np.array([0.1,0.3,0.6,1.0]) - - #bottom depth of each soil level - zsoil = np.array([-0.1,-0.4,-1.0,-2.0]) - - #initialize all NoahMP vars as missing - surface["tvxy"] = missing_value - surface["tgxy"] = missing_value - surface["tahxy"] = missing_value - surface["canicexy"] = missing_value - surface["canliqxy"] = missing_value - surface["eahxy"] = missing_value - surface["cmxy"] = missing_value - surface["chxy"] = missing_value - surface["fwetxy"] = missing_value - surface["sneqvoxy"] = missing_value - surface["alboldxy"] = missing_value - surface["qsnowxy"] = missing_value - surface["wslakexy"] = missing_value - surface["taussxy"] = missing_value - surface["waxy"] = missing_value - surface["wtxy"] = missing_value - surface["zwtxy"] = missing_value - surface["xlaixy"] = missing_value - surface["xsaixy"] = missing_value - - surface["lfmassxy"] = missing_value - surface["stmassxy"] = missing_value - surface["rtmassxy"] = missing_value - surface["woodxy"] = missing_value - surface["stblcpxy"] = missing_value - surface["fastcpxy"] = missing_value - surface["smcwtdxy"] = missing_value - surface["deeprechxy"] = missing_value - surface["rechxy"] = missing_value - - surface["snowxy"] = missing_value - surface["snicexy"] = np.ones(n_snow_layers)*missing_value - surface["snliqxy"] = np.ones(n_snow_layers)*missing_value - surface["tsnoxy"] = np.ones(n_snow_layers)*missing_value - surface["smoiseq"] = np.ones(n_soil_layers)*missing_value - surface["zsnsoxy"] = np.ones(n_snow_layers + n_soil_layers)*missing_value - - if surface["slmsk"] > 0.01: - surface["tvxy"] = surface["tsfco"] - surface["tgxy"] = surface["tsfco"] - surface["tahxy"] = surface["tsfco"] - - if (surface["snwdph"] > 0.01 and surface["tsfco"] > 273.15 ): - surface["tvxy"] = 273.15 - surface["tgxy"] = 273.15 - surface["tahxy"]= 273.15 - - surface["canicexy"] = 0.0 - surface["canliqxy"] = surface["canopy"] - surface["eahxy"] = 2000.0 - - # eahxy = psfc*qv/(0.622+qv); qv is mixing ratio, converted from sepcific - # humidity specific humidity /(1.0 - specific humidity) + + # Determine UFS history file format (tiled/quilted) + if lam: + atm_ftag = 'atmf*.tile{0}.nc'.format(tile) + sfc_ftag = 'sfcf*.tile{0}.nc'.format(tile) + else: + atm_ftag = 'atmf*.nc' + sfc_ftag = 'sfcf*.nc' + + # Get list of UFS history files with 3D ATMospheric state variables. + atm_filenames = [] + for f_name in os.listdir(forcing_dir): + if fnmatch.fnmatch(f_name, atm_ftag): + atm_filenames.append(f_name) + if not atm_filenames: + message = 'No filenames matching the pattern {0} found in {1}'. \ + format(atm_ftag,forcing_dir) + logging.critical(message) + raise Exception(message) + atm_filenames = sorted(atm_filenames) + n_filesA = len(atm_filenames) + + # Get list of UFS history files with 2D fields. + sfc_filenames = [] + for f_name in os.listdir(forcing_dir): + if fnmatch.fnmatch(f_name, sfc_ftag): + sfc_filenames.append(f_name) + if not sfc_filenames: + message = 'No filenames matching the pattern {0} found in {1}'. \ + format(sfc_ftag,forcing_dir) + logging.critical(message) + raise Exception(message) + sfc_filenames = sorted(sfc_filenames) + n_filesS = len(sfc_filenames) + + if (n_filesS == n_filesA): + n_files = n_filesA + else: + message = 'Number of UFS 2D/3D history files is inconsistent' + logging.critical(message) + raise Exception(message) + + # Physical constants (used by FV3 remapping functions) + kord_tm = -9 + kord_tr = 9 + t_min = 184.0 + q_min = 0.0 + sec_in_hr = 3600. + + #################################################################################### + # + # Read in atmospheric state, atmf*.nc history files. + # + #################################################################################### + + # Find nearest point on UFS history file (quilted) grid. + if use_nearest: + (tile_jj, tile_ii, point_lon, point_lat, dist_min) = find_loc_indices(location, forcing_dir, -999, lam) + print('The closest point has indices [{0},{1}]'.format(tile_ii,tile_jj)) + print('This index has a central longitude/latitude of [{0},{1}]'.format(point_lon,point_lat)) + print('This grid cell is approximately {0} km away from the desired location of {1} {2}'.format(dist_min/1.0E3,location[0],location[1])) + + # + ps = [] + p_lev = [] + p_lay = [] + t_lay = [] + qv_lay = [] + u_lay = [] + v_lay = [] + time_hr = [] + + # Get grid from UFS IC data + (ic_grid_lon, ic_grid_lat) = get_initial_lon_lat_grid(grid_dir, tile, lam) + + # Read in 3D UFS history files + for count, filename in enumerate(atm_filenames, start=1): + nc_file = Dataset('{0}/{1}'.format(forcing_dir,filename)) + nc_file.set_always_mask(False) - surface["cmxy"] = 0.0 - surface["chxy"] = 0.0 - surface["fwetxy"] = 0.0 - surface["sneqvoxy"] = surface["sheleg"] # mm - surface["alboldxy"] = 0.65 - surface["qsnowxy"] = 0.0 + # Check if UFS history file grid is different than UFS initial-condition grid. + if not use_nearest: + try: + data_grid_lon = nc_file['lon'][:,:] + data_grid_lat = nc_file['lat'][:,:] + except: + data_grid_lon = nc_file['grid_xt'][:,:] + data_grid_lat = nc_file['grid_yt'][:,:] + equal_grids = False + if (ic_grid_lon.shape == data_grid_lon.shape and \ + ic_grid_lat.shape == ic_grid_lat.shape): + if (np.equal(ic_grid_lon,data_grid_lon).all() and \ + np.equal(ic_grid_lat,data_grid_lat).all()): + equal_grids = True + + # If necessary, remap history file (data_grid) to IC file (ic_grid). + if (not equal_grids): + print('Regridding {} onto native grid: regridding progress = {}%'. \ + format(filename, 100.0*count/(2*n_files))) + + grid_in = {'lon': data_grid_lon, 'lat': data_grid_lat} + grid_out = {'lon': np.reshape(ic_grid_lon[j,i],(-1,1)), 'lat': \ + np.reshape(ic_grid_lat[j,i],(-1,1))} + regridder = xesmf.Regridder(grid_in, grid_out, 'bilinear') + ps_data = regridder(nc_file['pressfc'][0,:,:]) + t_data = regridder(nc_file['tmp'][0,::-1,:,:]) + qv_data = regridder(nc_file['spfh'][0,::-1,:,:]) + u_data = regridder(nc_file['ugrd'][0,::-1,:,:]) + v_data = regridder(nc_file['vgrd'][0,::-1,:,:]) + i_get = 0 + j_get = 0 + # Same grids for history file (data_grid) to IC file (ic_grid). + else: + ps_data = nc_file['pressfc'][0,:,:] + t_data = nc_file['tmp'][0,::-1,:,:] + qv_data = nc_file['spfh'][0,::-1,:,:] + u_data = nc_file['ugrd'][0,::-1,:,:] + v_data = nc_file['vgrd'][0,::-1,:,:] + i_get = i + j_get = j + else: + print('Using nearest UFS point {} progress = {}%'.format(filename, 100.0*count/(2*n_files))) + ps_data = nc_file['pressfc'][0,:,:] + t_data = nc_file['tmp'][0,::-1,:,:] + qv_data = nc_file['spfh'][0,::-1,:,:] + u_data = nc_file['ugrd'][0,::-1,:,:] + v_data = nc_file['vgrd'][0,::-1,:,:] + j_get = tile_jj + i_get = tile_ii + + # Compute and store vertical grid information. + ak = getattr(nc_file, "ak")[::-1] + bk = getattr(nc_file, "bk")[::-1] + ps.append(ps_data[j_get,i_get]) + nlevs = len(nc_file.dimensions['pfull']) + p_interface = np.zeros(nlevs+1) + for k in range(nlevs+1): + p_interface[k]=ak[k]+ps[-1]*bk[k] + p_lev.append(p_interface) + p_layer = np.zeros(nlevs) + for k in range(nlevs): + p_layer[k] = ((1.0/(rocp+1.0))*(p_interface[k]**(rocp+1.0) - \ + p_interface[k+1]**(rocp+1.0))/(p_interface[k] - \ + p_interface[k+1]))**(1.0/rocp) + p_lay.append(p_layer) + + # Store state variables. + t_lay.append(t_data[:,j_get,i_get]) + qv_lay.append(qv_data[:,j_get,i_get]) + u_lay.append(u_data[:,j_get,i_get]) + v_lay.append(v_data[:,j_get,i_get]) + time_hr.append(nc_file['time'][0]) - surface["wslakexy"] = 0.0 - surface["taussxy"] = 0.0 - surface["waxy"] = 4900.0 - surface["wtxy"] = surface["waxy"] - surface["zwtxy"] = (25.0 + 2.0) - surface["waxy"] / 1000.0 /0.2 + # Close file + nc_file.close() + + # Convert from python list to numpy array + ps = np.asarray(ps) + p_lev = np.asarray(p_lev) + p_lay = np.asarray(p_lay) + t_lay = np.asarray(t_lay) + qv_lay = np.asarray(qv_lay) + u_lay = np.asarray(u_lay) + v_lay = np.asarray(v_lay) + tv_lay = t_lay*(1.0 + zvir*qv_lay) + time_hr = np.asarray(time_hr) + + # Read in 2D UFS history files + vars2d =[{"name":"spfh2m"}, {"name":"tmp2m"}, \ + {"name":"dswrf_ave"}, {"name":"ulwrf_ave"},\ + {"name":"lhtfl_ave"}, {"name":"shtfl_ave"},\ + {"name":"dswrf"}, {"name":"ulwrf"},\ + {"name":"lhtfl"}, {"name":"shtfl"},\ + {"name":"pwat"}, {"name":"vgrd10m"},\ + {"name":"ugrd10m"}] + for var2d in vars2d: var2d["values"] = [] + + for count, filename in enumerate(sfc_filenames, start=1): + nc_file = Dataset('{0}/{1}'.format(forcing_dir,filename)) + nc_file.set_always_mask(False) - vegtyp = np.int(surface['vtyp']) - if (vegtyp == 0): - vegtyp = 7 - if ((vegtyp == mptable_nml_active['ISBARREN']) or (vegtyp == mptable_nml_active['ISSNOW']) or (vegtyp == mptable_nml_active['ISURBAN']) or (vegtyp == mptable_nml_active['ISWATER'])) : - surface["xlaixy"] = 0.0 - surface["xsaixy"] = 0.0 - - surface["lfmassxy"] = 0.0 - surface["stmassxy"] = 0.0 - surface["rtmassxy"] = 0.0 - - surface["woodxy"] = 0.0 - surface["stblcpxy"] = 0.0 - surface["fastcpxy"] = 0.0 + # Check if UFS history file grid is different than UFS initial-condition grid. + if not use_nearest: + try: + data_grid_lon = nc_file['lon'][:,:] + data_grid_lat = nc_file['lat'][:,:] + except: + data_grid_lon = nc_file['grid_xt'][:,:] + data_grid_lat = nc_file['grid_yt'][:,:] + equal_grids = False + if (ic_grid_lon.shape == data_grid_lon.shape and \ + ic_grid_lat.shape == ic_grid_lat.shape): + if (np.equal(ic_grid_lon,data_grid_lon).all() and \ + np.equal(ic_grid_lat,data_grid_lat).all()): + equal_grids = True + + # If necessary, remap history file (data_grid) to IC file (ic_grid). + if (not equal_grids): + print('Regridding {} onto native grid: regridding progress = {}%'. \ + format(filename, 50+50.0*count/(n_files))) + + grid_in = {'lon': data_grid_lon, 'lat': data_grid_lat} + grid_out = {'lon': np.reshape(ic_grid_lon[j,i],(-1,1)), 'lat': \ + np.reshape(ic_grid_lat[j,i],(-1,1))} + regridder = xesmf.Regridder(grid_in, grid_out, 'bilinear') + i_get = 0 + j_get = 0 + # Same grids for history file (data_grid) to IC file (ic_grid). + else: + i_get = i + j_get = j else: - #laim gives monthly values for each of the vegetation types - laim = np.array(mptable_nml_active['LAIM']).reshape(12,20) - - #be sure to use month-1, vegtyp-1 since python is 0-indexed - surface["xlaixy"] = np.amax([laim[date["month"]-1,vegtyp-1],0.05]) - surface["xsaixy"] = np.amax([surface["xlaixy"]*0.1,0.05]) - - sla = np.array(mptable_nml_active['SLA']) - masslai = 1000.0 / np.amax([sla[vegtyp-1],1.0]) - surface["lfmassxy"] = surface["xlaixy"]*masslai - masssai = 1000.0 / 3.0 - surface["stmassxy"] = surface["xsaixy"]*masssai - - surface["rtmassxy"] = 500.0 + print('Using nearest UFS point {} progress = {}%'.format(filename, 50+50.0*count/(n_files))) + j_get = tile_jj + i_get = tile_ii - surface["woodxy"] = 500.0 - surface["stblcpxy"] = 1000.0 - surface["fastcpxy"] = 1000.0 - - if ( vegtyp == mptable_nml_active['ISSNOW'] ): - for k in range(n_soil_layers): - surface["stc"][k] = np.amin([surface["stc"][k],np.amin([surface["tg3"],263.15])]) - surface["smc"][k] = 1 - surface["slc"][k] = 0 + for var2d in vars2d: + if not use_nearest: + data = regridder(nc_file[var2d["name"]][0,:,:]) + else: + data = nc_file[var2d["name"]][0,:,:] + var2d["values"].append(data[j_get,i_get]) + var2d["units"] = nc_file[var2d["name"]].getncattr(name="units") + var2d["long_name"] = nc_file[var2d["name"]].getncattr(name="long_name") + + nc_file.close() + + # Convert to numpy arrays + for var2d in vars2d: + var2d["values"] = np.asarray(var2d["values"]) + + # + # Create dictionary with full "Native" state (IC@t=0,ATMF*@t>0) + # + ps_IC = np.zeros([1]) + ps_IC[0] = state_IC["ps"] + pi_IC = np.zeros([1,nlevs+1]) + pi_IC[0,:] = state_IC["pa_i"] + p_IC = np.zeros([1,nlevs]) + p_IC[0,:] = state_IC["pa"] + t_IC = np.zeros([1,nlevs]) + t_IC[0,:] = state_IC["ta"] + qv_IC = np.zeros([1,nlevs]) + qv_IC[0,:] = state_IC["qv"] + u_IC = np.zeros([1,nlevs]) + u_IC[0,:] = state_IC["ua"] + v_IC = np.zeros([1,nlevs]) + v_IC[0,:] = state_IC["va"] + tv_IC = t_IC*(1.0 + zvir*qv_IC) + stateNATIVE = {"time": np.concatenate((np.asarray([0.]), time_hr[:])), \ + "ps": np.concatenate((ps_IC, ps), axis=0), \ + "p_lev": np.concatenate((pi_IC, p_lev), axis=0), \ + "p_lay": np.concatenate((p_IC, p_lay), axis=0), \ + "t_lay": np.concatenate((t_IC, t_lay), axis=0), \ + "qv_lay": np.concatenate((qv_IC, qv_lay), axis=0), \ + "u_lay": np.concatenate((u_IC, u_lay), axis=0), \ + "v_lay": np.concatenate((v_IC, v_lay), axis=0), \ + "tv_lay": np.concatenate((tv_IC, tv_lay), axis=0)} + + #################################################################################### + # + # The "total" advection, where "total" = "advective + remapping", can be computed + # directly by taking the difference across time. + # The advective part is the piece needed to force the SCM, which we can "back-out" + # by computing the "remapping" component, and removing it from the total. + # + # At initial-time (ICs) + # - Remap IC state to vertical grid of first UFS history file. + # + # At subsequent time(s) + # - Remap UFS state at current time-step to vertical grid of subsequent time-step + # (used for differencing) + # + # This "REGRID"ed state is used to remove the impact vertical remapping on the + # change of state. + # + # *NOTE* The first UFS history file is AFTER the first physics timestep. Subsequent + # history files are controlled by "output_fh" in the UFS. + # + #################################################################################### + + # + nlevs = len(p_lay[0,:]) + dummy = np.zeros(1) + from_p = np.zeros([1,nlevs+1]) + to_p = np.zeros([1,nlevs+1]) + log_from_p = np.zeros([1,nlevs+1]) + log_to_p = np.zeros([1,nlevs+1]) + dp2 = np.zeros([1,nlevs]) + tv_rev = np.zeros([1,nlevs]) + qv_rev = np.zeros([1,nlevs]) + u_rev = np.zeros([1,nlevs]) + v_rev = np.zeros([1,nlevs]) + tv_layr = np.zeros([n_files+1,nlevs]) + qv_layr = np.zeros([n_files+1,nlevs]) + u_layr = np.zeros([n_files+1,nlevs]) + v_layr = np.zeros([n_files+1,nlevs]) + p_layr = np.zeros([n_files+1,nlevs]) + p_levr = np.zeros([n_files+1,nlevs+1]) + + # + # First timestep... + # + + # Interpolation range + from_p[0,:] = state_IC["pa_i"][::-1] + to_p[0,:] = p_lev[0,::-1] + log_from_p[0,:] = np.log(state_IC["pa_i"][::-1]) + log_to_p[0,:] = np.log(p_lev[0,::-1]) + + # IC Virtual Temperature on vertical-grid of first UFS history file. + tv_init = state_IC["ta"]*(1.0 + zvir*state_IC["qv"]) + tv_init_rev = tv_init[::-1] + tv_rev_new = fv3_remap.map_scalar(nlevs, log_from_p, tv_init_rev[np.newaxis, :], \ + dummy, nlevs, log_to_p, 0, 0, 1, \ + np.abs(kord_tm), t_min) + + # IC Specific humidity on vertical-grid of first UFS history file. + qv_init_rev = state_IC["qv"][::-1] + for k in range(0,nlevs): dp2[0,k] = from_p[0,k+1] - from_p[0,k] + qv_rev_new = fv3_remap.map1_q2(nlevs, from_p, qv_init_rev[np.newaxis, :], \ + nlevs, to_p, dp2, 0, 0, 0, kord_tr, q_min) + + # IC Zonal wind on vertical-grid of first UFS history file. + u_init_rev = state_IC["ua"][::-1] + u_rev_new = fv3_remap.map1_ppm(nlevs, from_p, u_init_rev[np.newaxis, :], 0.0, \ + nlevs, to_p, 0, 0, -1, kord_tm ) + + # IC Meridional wind on vertical-grid of first UFS history file. + v_init_rev = state_IC["va"][::-1] + v_rev_new = fv3_remap.map1_ppm(nlevs, from_p, v_init_rev[np.newaxis, :], 0.0, \ + nlevs, to_p, 0, 0, -1, kord_tm ) + + # Store + p_layr[0,:] = p_lay[0,:] + p_levr[0,:] = p_lev[0,:] + v_layr[0,:] = v_rev_new[0,::-1] + u_layr[0,:] = u_rev_new[0,::-1] + tv_layr[0,:] = tv_rev_new[0,::-1] + qv_layr[0,:] = qv_rev_new[0,::-1] + + # + # Subsequent timestep(s)... + # (current state on vertical grid of subsequent time-step(s). Used for differencing) + # + + # + for t in range(n_files-1): + # + from_p[0,:] = p_lev[t,::-1] + to_p[0,:] = p_lev[t+1,::-1] + log_from_p[0,:] = np.log(p_lev[t,::-1]) + log_to_p[0,:] = np.log(p_lev[t+1,::-1]) + + # Virtual Temperature @ time > 0 + tv_rev[0,:] = tv_lay[t,::-1] + tv_rev_new = fv3_remap.map_scalar(nlevs, log_from_p, tv_rev, dummy, nlevs, \ + log_to_p, 0, 0, 1, np.abs(kord_tm), t_min) + # Specific humidity @ time > 0 + qv_rev[0,:] = qv_lay[t,::-1] + for k in range(0,nlevs): dp2[0,k] = to_p[0,k+1] - to_p[0,k] + qv_rev_new = fv3_remap.map1_q2(nlevs, from_p, qv_rev, nlevs, to_p, dp2, \ + 0, 0, 0, kord_tr, q_min) + # Zonal wind @ time > 0 + u_rev[0,:] = u_lay[t,::-1] + u_rev_new = fv3_remap.map1_ppm(nlevs, from_p, u_rev, 0.0, nlevs, to_p, \ + 0, 0, -1, kord_tm ) + # Meridional wind @ time > 0 + v_rev[0,:] = v_lay[t,::-1] + v_rev_new = fv3_remap.map1_ppm(nlevs, from_p, v_rev, 0.0, nlevs, to_p, \ + 0, 0, -1, kord_tm ) + + # Store + p_layr[t+1,:] = p_lay[t+1,:] + p_levr[t+1,:] = p_lev[t+1,:] + tv_layr[t+1,:] = tv_rev_new[0,::-1] + qv_layr[t+1,:] = qv_rev_new[0,::-1] + u_layr[t+1,:] = u_rev_new[0,::-1] + v_layr[t+1,:] = v_rev_new[0,::-1] + + # + p_layr[t+2,:] = p_layr[t+1,:] + p_levr[t+2,:] = p_levr[t+1,:] + tv_layr[t+2,:] = tv_layr[t+1,:] + qv_layr[t+2,:] = qv_layr[t+1,:] + u_layr[t+2,:] = u_layr[t+1,:] + v_layr[t+2,:] = v_layr[t+1,:] + + # Temperature + t_layr = tv_layr/(1.0 + zvir*qv_layr) + + # Create dictionary with "Regridded" state + stateREGRID = {"time": np.concatenate((np.asarray([0.]), time_hr[:])), \ + "ps": np.concatenate((ps[0:1], ps), axis=0), \ + "p_lev": p_levr, \ + "p_lay": p_layr, \ + "t_lay": t_layr, \ + "qv_lay": qv_layr, \ + "u_lay": u_layr, \ + "v_lay": v_layr, \ + "tv_lay": tv_layr } + + #################################################################################### + # + # Compute tendencies advective = total - remapping + # + #################################################################################### + + # + dtdt_adv = np.zeros([n_files+1,nlevs]) + dqvdt_adv = np.zeros([n_files+1,nlevs]) + dudt_adv = np.zeros([n_files+1,nlevs]) + dvdt_adv = np.zeros([n_files+1,nlevs]) + pres_adv = np.zeros([n_files+1,nlevs]) + pres_i_adv = np.zeros([n_files+1,nlevs+1]) + tend_remap = np.zeros([1,nlevs]) + tend_total = np.zeros([1,nlevs]) + + # + for t in range(n_files): + # + dtime_sec = (stateNATIVE["time"][t+1] - stateNATIVE["time"][t])*sec_in_hr + # + pres_adv[t,:] = stateNATIVE["p_lay"][t,:] + pres_i_adv[t,:] = stateNATIVE["p_lev"][t,:] + # + tend_total[0,:] = stateREGRID["t_lay"][t+1,:] - stateREGRID["t_lay"][t,:] + tend_remap[0,:] = stateREGRID["t_lay"][t,:] - stateNATIVE["t_lay"][t,:] + dtdt_adv[t,:] = (tend_total[0,:] - tend_remap[0,:]) / dtime_sec + # + tend_total[0,:] = stateREGRID["qv_lay"][t+1,:] - stateREGRID["qv_lay"][t,:] + tend_remap[0,:] = stateREGRID["qv_lay"][t,:] - stateNATIVE["qv_lay"][t,:] + dqvdt_adv[t,:] = (tend_total[0,:] - tend_remap[0,:]) / dtime_sec + # + tend_total[0,:] = stateREGRID["u_lay"][t+1,:] - stateREGRID["u_lay"][t,:] + tend_remap[0,:] = stateREGRID["u_lay"][t,:] - stateNATIVE["u_lay"][t,:] + dudt_adv[t,:] = (tend_total[0,:] - tend_remap[0,:]) / dtime_sec + # + tend_total[0,:] = stateREGRID["v_lay"][t+1,:] - stateREGRID["v_lay"][t,:] + tend_remap[0,:] = stateREGRID["v_lay"][t,:] - stateNATIVE["v_lay"][t,:] + dvdt_adv[t,:] = (tend_total[0,:] - tend_remap[0,:]) / dtime_sec + + # + dtdt_adv[t+1,:] = dtdt_adv[t,:] + dqvdt_adv[t+1,:] = dqvdt_adv[t,:] + dudt_adv[t+1,:] = dudt_adv[t,:] + dvdt_adv[t+1,:] = dvdt_adv[t,:] + pres_adv[t+1,:] = pres_adv[t,:] + pres_i_adv[t+1,:] = pres_i_adv[t,:] + + if save_comp_data: + # + t_layr = np.zeros([n_files+1,nlevs]) + qv_layr = np.zeros([n_files+1,nlevs]) + u_layr = np.zeros([n_files+1,nlevs]) + v_layr = np.zeros([n_files+1,nlevs]) + p_layr = np.zeros([n_files+1,nlevs]) + + # + for t in range(0,n_files): + from_p[0,:] = stateNATIVE["p_lev"][t,::-1] + to_p[0,:] = stateNATIVE["p_lev"][1,::-1] + log_from_p[0,:] = np.log(from_p[0,:]) + log_to_p[0,:] = np.log(to_p[0,:]) + p_layr[t,:] = stateNATIVE["p_lay"][1,::-1] + for k in range(0,nlevs): dp2[0,k] = to_p[0,k+1] - to_p[0,k] + t_layr[t,:] = fv3_remap.map_scalar(nlevs, log_from_p, stateNATIVE["t_lay"][t:t+1,::-1], \ + dummy, nlevs, log_to_p, 0, 0, 1, np.abs(kord_tm), t_min) + qv_layr[t,:] = fv3_remap.map1_q2(nlevs, from_p, stateNATIVE["qv_lay"][t:t+1,::-1], \ + nlevs, to_p, dp2, 0, 0, 0, kord_tr, q_min) + u_layr[t,:] = fv3_remap.map1_ppm(nlevs, from_p, stateNATIVE["u_lay"][t:t+1,::-1], \ + 0.0, nlevs, to_p, 0, 0, -1, kord_tm) + v_layr[t,:] = fv3_remap.map1_ppm(nlevs, from_p, stateNATIVE["v_lay"][t:t+1,::-1], \ + 0.0, nlevs, to_p, 0, 0, -1, kord_tm) + + t_layr[t+1,:] = t_layr[t,:] + qv_layr[t+1,:] = qv_layr[t,:] + u_layr[t+1,:] = u_layr[t,:] + v_layr[t+1,:] = v_layr[t,:] + p_layr[t+1,:] = p_layr[t,:] + + #################################################################################### + # + # if we had atmf,sfcf files at every timestep (and the SCM timestep is made to match + # the UFS), then dqvdt_adv should be applied uninterpolated for each time step. If + # atmf and sfcf files represent time averages over the previous diagnostic period, + # and if forcing terms are interpolatd in time in the SCM, then dqvdt_adv should + # represent the forcing values in the middle of time[t] and time[t+1] from atmf/sfcf. + # That way, the time-averaged applied forcing from time[t] to time[t+1] in the SCM + # will be equal to what is derived from atmf/sfcf. (preference should be to have + # option to remove time-interpolation of forcing such that the constant forcing + # applied converged to time-step values as the diag interval approaches the time + # step) + # + #################################################################################### + time_method = 'constant_simple' #this is not implemented in the SCM code yet + #time_method = 'constant_interp' + #time_method = 'gradient' #this produced wonky results in the SCM; avoid until investigated more + + if (time_method == 'constant_simple'): + print('Forcing should not be interpolated in time. Rather, forcing should held constant at their current values until the next forcing interval is reached.') + ntimes = n_files + time = np.zeros(ntimes) - snd = surface["snwdph"]/1000.0 # go to m from snwdph + p_s = np.zeros((ntimes),dtype=float) + pressure_forc = np.zeros((nlevs,ntimes),dtype=float) + tot_advec_T = np.zeros((nlevs,ntimes),dtype=float) + tot_advec_qv = np.zeros((nlevs,ntimes),dtype=float) + tot_advec_u = np.zeros((nlevs,ntimes),dtype=float) + tot_advec_v = np.zeros((nlevs,ntimes),dtype=float) - if (surface["sheleg"] != 0.0 and snd == 0.0 ): - snd = surface["sheleg"]/1000.0 - - if (vegtyp == 15): # land ice in MODIS/IGBP - if ( surface["sheleg"] < 0.1): - surface["sheleg"] = 0.1 - snd = 0.01 + p_s[0] = ps[0] + pressure_forc[:,0] = pres_adv[0,:] + tot_advec_T[:,0] = dtdt_adv[0,:] + tot_advec_qv[:,0] = dqvdt_adv[0,:] + tot_advec_u[:,0] = dudt_adv[0,:] + tot_advec_v[:,0] = dvdt_adv[0,:] - dzsno = np.zeros(n_snow_layers) - if (snd < 0.025 ): - surface["snowxy"] = 0.0 - dzsno[:] = 0.0 - elif (snd >= 0.025 and snd <= 0.05 ): - surface["snowxy"] = -1.0 - dzsno[-1] = snd - elif (snd > 0.05 and snd <= 0.10 ): - surface["snowxy"] = -2.0 - dzsno[-2] = 0.5*snd - dzsno[-1] = 0.5*snd - elif (snd > 0.10 and snd <= 0.25 ): - surface["snowxy"] = -2.0 - dzsno[-2] = 0.05 - dzsno[-1] = snd - 0.05 - elif (snd > 0.25 and snd <= 0.45 ): - surface["snowxy"] = -3.0 - dzsno[-3] = 0.05 - dzsno[-2] = 0.5*(snd-0.05) - dzsno[-1] = 0.5*(snd-0.05) - elif (snd > 0.45): - surface["snowxy"] = -3.0 - dzsno[-3] = 0.05 - dzsno[-2] = 0.20 - dzsno[-1] = snd - 0.05 - 0.20 - else: - message = 'problem with the logic assigning snow layers.' - logging.critical(message) - raise Exception(message) + for t in range(1,n_files): + time[t] = sec_in_hr*time_hr[t-1] + p_s[t] = ps[t] + pressure_forc[:,t] = pres_adv[t,:] + tot_advec_T[:,t] = dtdt_adv[t,:] + tot_advec_qv[:,t] = dqvdt_adv[t,:] + tot_advec_u[:,t] = dudt_adv[t,:] + tot_advec_v[:,t] = dvdt_adv[t,:] + elif (time_method == 'constant_interp'): + print('Forcing can be interpolated in time, but the time values are chosen such that forcing will effectively be held consant during a diagnostic time interval.') + ntimes = 2*n_files - surface["tsnoxy"][:] = 0.0 - surface["snicexy"][:] = 0.0 - surface["snliqxy"][:] = 0.0 - surface["zsnsoxy"][:] = 0.0 + time_setback = 1.0 #s - isnow = np.int(surface["snowxy"] + n_snow_layers) - dzsnso = np.zeros(n_snow_layers + n_soil_layers) - for k in range(isnow, n_snow_layers): - surface["tsnoxy"][k] = surface["tgxy"] - surface["snliqxy"][k] = 0.0 - surface["snicexy"][k] = 1.00 * dzsno[k] * surface["sheleg"]/snd #this line causes a warning + time = np.zeros(ntimes) + p_s = np.zeros((ntimes),dtype=float) + pressure_forc = np.zeros((nlevs,ntimes),dtype=float) + tot_advec_T = np.zeros((nlevs,ntimes),dtype=float) + tot_advec_qv = np.zeros((nlevs,ntimes),dtype=float) + tot_advec_u = np.zeros((nlevs,ntimes),dtype=float) + tot_advec_v = np.zeros((nlevs,ntimes),dtype=float) - dzsnso[k] = -dzsno[k] - - for k in range(n_snow_layers, n_snow_layers + n_soil_layers): - dzsnso[k] = -dzs[k - n_snow_layers] + time[0] = 0.0 + time[1] = sec_in_hr*time_hr[0] - time_setback #forcing period should extend from beginning of diagnostic period to right BEFORE the next one + p_s[0] = ps[0] + p_s[1] = p_s[0] + pressure_forc[:,0] = pres_adv[0,:] + pressure_forc[:,1] = pressure_forc[:,0] + tot_advec_T[:,0] = dtdt_adv[0,:] + tot_advec_T[:,1] = tot_advec_T[:,0] + tot_advec_qv[:,0] = dqvdt_adv[0,:] + tot_advec_qv[:,1] = tot_advec_qv[:,0] + tot_advec_u[:,0] = dudt_adv[0,:] + tot_advec_u[:,1] = tot_advec_u[:,0] + tot_advec_v[:,0] = dvdt_adv[0,:] + tot_advec_v[:,1] = tot_advec_v[:,0] - surface["zsnsoxy"][isnow] = dzsnso[isnow] - for k in range(isnow+1,n_snow_layers + n_soil_layers): - surface["zsnsoxy"][k] = surface["zsnsoxy"][k-1] + dzsnso[k] - - soilparm = read_noahmp_soil_table() + for t in range(1,n_files): + time[2*t] = sec_in_hr*time_hr[t-1] + time[2*t+1] = sec_in_hr*time_hr[t] - time_setback + p_s[2*t] = ps[t] + p_s[2*t+1] = p_s[2*t] + pressure_forc[:,2*t] = pres_adv[t,:] + pressure_forc[:,2*t+1] = pressure_forc[:,2*t] + tot_advec_T[:,2*t] = dtdt_adv[t,:] + tot_advec_T[:,2*t+1] = tot_advec_T[:,2*t] + tot_advec_qv[:,2*t] = dqvdt_adv[t,:] + tot_advec_qv[:,2*t+1] = tot_advec_qv[:,2*t] + tot_advec_u[:,2*t] = dudt_adv[t,:] + tot_advec_u[:,2*t+1] = tot_advec_u[:,2*t] + tot_advec_v[:,2*t] = dvdt_adv[t,:] + tot_advec_v[:,2*t+1] = tot_advec_v[:,2*t] + # + #p_s[2*t-1] = 0.5*(p_s[2*t] + p_s[2*t-1]) + #pressure_forc[:,2*t-1] = 0.5*(pressure_forc[:,2*t] + pressure_forc[:,2*t-1]) + #tot_advec_T[:,2*t-1] = 0.5*(tot_advec_T[:,2*t] + tot_advec_T[:,2*t-1]) + #tot_advec_qv[:,2*t-1] = 0.5*(tot_advec_qv[:,2*t] + tot_advec_qv[:,2*t-1]) + #tot_advec_u[:,2*t-1] = 0.5*(tot_advec_u[:,2*t] + tot_advec_u[:,2*t-1]) + #tot_advec_v[:,2*t-1] = 0.5*(tot_advec_v[:,2*t] + tot_advec_v[:,2*t-1]) + + + elif (time_method == 'gradient'): #this produced wonky results in the SCM; avoid until investigated more + print('Forcing can be interpolated in time since the forcing terms are assumed to follow a constant time-gradient.') - soiltyp = int(surface["styp"]) - if (soiltyp != 0): - #find the index of the soiltype from the "index" field - index = soilparm["index"].index(soiltyp) - bexp = soilparm["bb"][index] - smcmax = soilparm["maxsmc"][index] - smcwlt = soilparm["wltsmc"][index] - dwsat = soilparm["satdw"][index] - dksat = soilparm["satdk"][index] - psisat = -soilparm["satpsi"][index] + ntimes = 2*n_files + 1 + time = np.zeros(ntimes) + p_s = np.zeros((ntimes),dtype=float) + pressure_forc = np.zeros((nlevs,ntimes),dtype=float) + tot_advec_T = np.zeros((nlevs,ntimes),dtype=float) + tot_advec_qv = np.zeros((nlevs,ntimes),dtype=float) + tot_advec_u = np.zeros((nlevs,ntimes),dtype=float) + tot_advec_v = np.zeros((nlevs,ntimes),dtype=float) - if (vegtyp == mptable_nml_active['ISURBAN']): - smcmax = 0.45 - smcwlt = 0.40 + p_s[0] = state_IC['ps'] + pressure_forc[:,0] = state_IC['pa'] + tot_advec_T[:,0] = 0.0 + tot_advec_qv[:,0] = 0.0 + tot_advec_u[:,0] = 0.0 + tot_advec_v[:,0] = 0.0 - if ((bexp > 0.0) and (smcmax > 0.0) and (-psisat > 0.0 )): - for k in range(n_soil_layers): - if ( k == 0 ): - ddz = -zsoil[k+1] * 0.5 - elif ( k < n_soil_layers-1 ): - ddz = (zsoil[k-1] - zsoil[k+1] ) * 0.5 - else: - ddz = zsoil[k-1] - zsoil[k] -# ! -# ! Use newton-raphson method to find eq soil moisture -# ! - expon = bexp +1. - aa = dwsat/ddz - bb = dksat / smcmax ** expon - - smc = 0.5 * smcmax - for iter in range(100): - func = (smc - smcmax) * aa + bb * smc ** expon - dfunc = aa + bb * expon * smc ** bexp - dx = func/dfunc - smc = smc - dx - if ( abs (dx) < 1.e-6): - break - - surface["smoiseq"][k] = np.amin([np.amax([smc,1.e-4]),smcmax*0.99]) - else: - surface["smoiseq"][:] = smcmax + for t in range(n_files): + time[2*t + 1] = time[2*t] + 0.5*(sec_in_hr*time_hr[t] - time[2*t]) + time[2*t + 2] = sec_in_hr*time_hr[t] + + p_s[2*t+1] = ps[t] + pressure_forc[:,2*t+1] = pres_adv[t,:] + tot_advec_T[:,2*t+1] = dtdt_adv[t,:] + tot_advec_qv[:,2*t+1] = dqvdt_adv[t,:] + tot_advec_u[:,2*t+1] = dudt_adv[t,:] + tot_advec_v[:,2*t+1] = dvdt_adv[t,:] + + #calculate gradient in time and extrapolate for time (2t + 2) + grad = (p_s[2*t + 1] - p_s[2*t])/(time[2*t + 1] - time[2*t]) + p_s[2*t + 2] = p_s[2*t + 1] + grad*(time[2*t + 2] - time[2*t + 1]) + + for k in range(nlevs): + grad = (pressure_forc[k,2*t + 1] - pressure_forc[k, 2*t])/(time[2*t + 1] - time[2*t]) + pressure_forc[k,2*t + 2] = pressure_forc[k,2*t+1] + grad*(time[2*t + 2] - time[2*t + 1]) + grad = (tot_advec_T[k,2*t + 1] - tot_advec_T[k, 2*t])/(time[2*t + 1] - time[2*t]) + tot_advec_T[k,2*t + 2] = tot_advec_T[k,2*t+1] + grad*(time[2*t + 2] - time[2*t + 1]) + grad = (tot_advec_qv[k,2*t + 1] - tot_advec_qv[k, 2*t])/(time[2*t + 1] - time[2*t]) + tot_advec_qv[k,2*t + 2] = tot_advec_qv[k,2*t+1] + grad*(time[2*t + 2] - time[2*t + 1]) + grad = (tot_advec_u[k,2*t + 1] - tot_advec_u[k, 2*t])/(time[2*t + 1] - time[2*t]) + tot_advec_u[k,2*t + 2] = tot_advec_u[k,2*t+1] + grad*(time[2*t + 2] - time[2*t + 1]) + grad = (tot_advec_v[k,2*t + 1] - tot_advec_v[k, 2*t])/(time[2*t + 1] - time[2*t]) + tot_advec_v[k,2*t + 2] = tot_advec_v[k,2*t+1] + grad*(time[2*t + 2] - time[2*t + 1]) + else: + print('Unrecognized forcing time method. Exiting.') + exit() - surface["smcwtdxy"] = smcmax - surface["deeprechxy"] = 0.0 - surface["rechxy"] = 0.0 - - return surface + # + w_ls = np.zeros((nlevs,ntimes),dtype=float) + omega = np.zeros((nlevs,ntimes),dtype=float) + rad_heating = np.zeros((nlevs,ntimes),dtype=float) -def read_noahmp_soil_table(): - """Read values from SOILPARM.TBL for NoahMP LSM ICs""" - #returns a dictionary with data - - #two different datasets are included in the table - choices = ["STAS","STAS-RUC"] - - #get all lines of the file - with open(os.path.join(NOAHMP_TABLES_DIR, 'SOILPARM.TBL'), 'r') as f: - lineList = f.readlines() - f.close() - - #find the line where the desired data starts - line_index = 0 - for line in lineList: - line_index += 1 - #hardcoded to look for choices[0]; swap choices[0] for choices[1] to use choices[1] below - m = re.match(choices[0],line) and not re.match(choices[1],line) - if m: - start_index = line_index - break - - #get the data for each variable from the lines - n_soil_types = int(lineList[start_index].split()[0].split(',')[0]) - soil_index = [] - bb = [] - drysmc = [] - f11 = [] - maxsmc = [] - refsmc = [] - satpsi = [] - satdk = [] - satdw = [] - wltsmc = [] - qtz = [] - name = [] - for line in lineList[start_index+1:start_index+n_soil_types+1]: - values = line.strip().split(',') - soil_index.append(int(values[0])) - bb.append(float(values[1])) - drysmc.append(float(values[2])) - f11.append(float(values[3])) - maxsmc.append(float(values[4])) - refsmc.append(float(values[5])) - satpsi.append(float(values[6])) - satdk.append(float(values[7])) - satdw.append(float(values[8])) - wltsmc.append(float(values[9])) - qtz.append(float(values[10])) - name.append(values[11].strip()) - - soilparm = { - "index": soil_index, - "bb": bb, - "drysmc": drysmc, - "f11": f11, - "maxsmc": maxsmc, - "refsmc": refsmc, - "satpsi": satpsi, - "satdk": satdk, - "satdw": satdw, - "wltsmc": wltsmc, - "qtz": qtz, - "name": name + forcing = { + "time": time, + "wa": w_ls.swapaxes(0,1), + "wap": omega.swapaxes(0,1), + "tnta_rad": rad_heating.swapaxes(0,1), + "ps_forc": np.ones(ntimes)*ps[0], + "pa_forc": pressure_forc.swapaxes(0,1), + "tnta_adv": tot_advec_T.swapaxes(0,1), + "tnqv_adv": tot_advec_qv.swapaxes(0,1), + "tnua_adv": tot_advec_u.swapaxes(0,1), + "tnva_adv": tot_advec_v.swapaxes(0,1) } - return soilparm + if (save_comp_data): + comp_data = { + "time": stateNATIVE["time"]*sec_in_hr, + "pa" : p_layr[:,::-1], + "ta" : t_layr[:,::-1], + "qv" : qv_layr[:,::-1], + "ua" : u_layr[:,::-1], + "va" : v_layr[:,::-1], + "vars2d":vars2d} + else: + comp_data = {} -def write_SCM_case_file(state, surface, oro, forcing, case, date): - """Write all data to a netCDF file that the SCM can read""" - #expects the data to write, the name of the generated file, and the date corresponding to the ICs - - real_type = np.float64 - int_type = np.int32 - - nlevs = state["nlevs"] - nsoil = len(surface["stc"]) - nsnow = len(surface["snicexy"]) - nice = len(surface["tiice"]) - - nc_file = Dataset(os.path.join(PROCESSED_CASE_DIR, case + '.nc'), 'w', format='NETCDF4') - nc_file.description = "FV3GFS model profile input (no forcing)" - nc_file.missing_value = missing_value - - #create groups for scalars, intitialization, and forcing + return (forcing, comp_data, stateREGRID) - scalar_grp = nc_file.createGroup("scalars") - initial_grp = nc_file.createGroup("initial") - forcing_grp = nc_file.createGroup("forcing") - - #create dimensions and write them out +######################################################################################## +# +######################################################################################## +def write_SCM_case_file(state, surface, oro, forcing, case, date, stateREGRID): + """Write all data to a netCDF file in the DEPHY-SCM format""" - time_dim = nc_file.createDimension('time', None) - time_var = nc_file.createVariable('time', real_type, ('time',)) - time_var[:] = forcing["time"] - time_var.units = 's' - time_var.description = 'elapsed time since the beginning of the simulation' + # Working types + wp = np.float64 + wi = np.int32 - levels_dim = nc_file.createDimension('levels', None) - levels_var = nc_file.createVariable('levels', real_type, ('levels',)) - levels_var[:] = state["pres"] - levels_var.units = 'Pa' - levels_var.description = 'pressure levels' - - soil_dim = nc_file.createDimension('nsoil',None) - soil_depth_var = nc_file.createVariable('soil_depth', real_type, ('nsoil',)) - soil_depth_var[:] = [0.1,0.4,1.0,2.0] - soil_depth_var.units = 'm' - soil_depth_var.description = 'depth of bottom of soil layers' - - snow_dim = nc_file.createDimension('nsnow',None) - soil_plus_snow_dim = nc_file.createDimension('nsoil_plus_nsnow',None) - ice_dim = nc_file.createDimension('nice',None) - - #initial group + # Local switches + forcing_on = 1 + forcing_off = 0 + + # Output file + com = 'mkdir -p ' + PROCESSED_CASE_DIR + print(com) + os.system(com) + fileOUT = os.path.join(PROCESSED_CASE_DIR, case + '_SCM_driver.nc') + + nc_file = Dataset(fileOUT, 'w', format='NETCDF3_CLASSIC') + nc_file.description = "FV3GFS model profile input (UFS forcings)" + + nc_file.missing_value = missing_value + + start_date = datetime(date["year"],date["month"],date["day"],date["hour"],date["minute"],date["second"]) + + # + # Create surface type string (Saved as GLOBAL attribute) + # + if surface["slmsk"] > 1.5: + surface_string = 'ice' + elif surface["slmsk"] > 0.5: + surface_string = 'land' + else: + surface_string = 'ocean' + + # + # Global file attributes. + # + runtime = timedelta(seconds=forcing['time'][-1]) + end_date = start_date + runtime + end_date_string = end_date.strftime("%Y-%m-%d %H:%M:%S") + start_date_string = start_date.strftime("%Y-%m-%d %H:%M:%S") + # + loc_string = str(round(surface["lon"],2)) + "E" + str(round(surface["lat"],2)) + "N" + case_string = 'UFS_' + start_date_string + '_' + loc_string + # + 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 = '' + nc_file.start_date = start_date_string + nc_file.end_date = end_date_string + nc_file.forcing_scale = -1 + nc_file.radiation = "off" + nc_file.adv_ta = forcing_off + nc_file.adv_qv = forcing_off + nc_file.adv_ua = forcing_off + nc_file.adv_va = forcing_off + 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.forc_wa = forcing_off + nc_file.forc_wap = 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.adv_ta = forcing_on + nc_file.adv_qv = forcing_on + nc_file.adv_ua = forcing_on + nc_file.adv_va = forcing_on + # + nc_file.surface_forcing_temp = 'none' + nc_file.surface_forcing_moisture = 'none' + nc_file.surface_forcing_wind = 'none' + nc_file.surface_forcing_lsm = 'none' #'noah' #'noahmp' #'ruc' + nc_file.surface_forcing_lsm = 'lsm' + # Set file dimension + time_dim = nc_file.createDimension('time', len(forcing['time'])) + timei_dim = nc_file.createDimension('t0', 1) + lev_dim = nc_file.createDimension('lev', state["nlevs"]) + soil_dim = nc_file.createDimension('nsoil', len(surface["stc"])) + snow_dim = nc_file.createDimension('nsnow', len(surface["snicexy"])) + nslsnw_dim = nc_file.createDimension('nsoil_plus_nsnow',len(surface["snicexy"]) + len(surface["stc"])) + ice_dim = nc_file.createDimension('nice', len(surface["tiice"])) + + # + 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[:] = forcing['time'] + # + lev_var = nc_file.createVariable('lev', wp, ('lev')) + lev_var.units = 'm' + lev_var.standard_name = 'height' + lev_var[:] = 0.0 + + # + lon_var = nc_file.createVariable('lon', wp, ('time')) + lon_var.units = 'degrees_east' + lon_var.standard_name = 'longitude' + lon_var[:] = surface["lon"] + + # + lat_var = nc_file.createVariable('lat', wp, ('time')) + lat_var.units = 'degrees_north' + lat_var.standard_name = 'latitude' + lat_var[:] = surface["lat"] + + # + 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[:] = [0.1,0.4,1.0,2.0] + # + theta_oro = nc_file.createVariable('theta_oro',wp, ('t0')) + theta_oro.units = "deg" + theta_oro.standard_name = "angle with respect to east of maximum subgrid orographic variations" + theta_oro[:] = oro["theta"] + # + z0_var = nc_file.createVariable('zorl', wp, ('time')) + z0_var.units = "cm" + z0_var.standard_name = 'surface_roughness_length_for_momentum_in_air' + z0_var[:] = surface["z0"] + # + zorlw_var = nc_file.createVariable('zorlw', wp, ('t0')) + zorlw_var.units = "cm" + zorlw_var.standard_name = "surface roughness length over ocean" + zorlw_var[:] = surface["z0"] + # + zorll_var = nc_file.createVariable('zorll', wp, ('t0')) + zorll_var.units = "cm" + zorll_var.standard_name = "surface roughness length over land" + zorll_var[:] = surface["zorll"] + # + zorli_var = nc_file.createVariable('zorli', wp, ('t0')) + zorli_var.units = "cm" + zorli_var.standard_name = "surface roughness length over ice" + zorli_var[:] = surface["zorli"] + # + zorlwav_var = nc_file.createVariable('zorlwav', wp, ('time')) + zorlwav_var.units = "cm" + zorlwav_var.standard_name = 'surface_roughness_length_from_wave_model' + zorlwav_var[:] = surface["zorlw"] + + # + # Variables to be output to SCM input file. Only fields that come directly from forcing, + # surface, state, and oro. Fields that get renamed are done above. + # + dict = {} + dict.update(date) + dict.update(surface) + dict.update(state) + dict.update(oro) + dict.update(forcing) + + ######################################################################################## + # + # Dictonary format: + # {"name": "", "type", "dimd": (), "units": "", "desc": ""} + # + ######################################################################################## + var_dict = [{"name": "orog", "type":wp, "dimd": ('t0' ), "units": "m", "desc": "surface_altitude"},\ + {"name": "zh", "type":wp, "dimd": ('t0', 'lev'), "units": "m", "desc": "height"},\ + {"name": "pa", "type":wp, "dimd": ('t0', 'lev'), "units": "Pa", "desc": "air_ressure"}, \ + {"name": "ta", "type":wp, "dimd": ('t0', 'lev'), "units": "K", "desc": "air_temperature","default_value": stateREGRID["t_lay"][1,:], "override": True}, \ + {"name": "theta", "type":wp, "dimd": ('t0', 'lev'), "units": "K", "desc": "air_potential_temperature"}, \ + {"name": "thetal", "type":wp, "dimd": ('t0', 'lev'), "units": "K", "desc": "air_liquid_potential_temperature"}, \ + {"name": "rv", "type":wp, "dimd": ('t0', 'lev'), "units": "kg kg-1", "desc": "humidity_mixing_ratio"}, \ + {"name": "rl", "type":wp, "dimd": ('t0', 'lev'), "units": "kg kg-1", "desc": "cloud_liquid_water_mixing_ratio"}, \ + {"name": "ri", "type":wp, "dimd": ('t0', 'lev'), "units": "kg kg-1", "desc": "cloud_ice_water_mixing_ratio"}, \ + {"name": "rt", "type":wp, "dimd": ('t0', 'lev'), "units": "kg kg-1", "desc": "water_mixing_ratio"}, \ + {"name": "qv", "type":wp, "dimd": ('t0', 'lev'), "units": "kg kg-1", "desc": "specific_humidity","default_value": stateREGRID["qv_lay"][1,:], "override": True}, \ + {"name": "ql", "type":wp, "dimd": ('t0', 'lev'), "units": "kg kg-1", "desc": "mass_fraction_of_cloud_liquid_water_in_air"}, \ + {"name": "qi", "type":wp, "dimd": ('t0', 'lev'), "units": "kg kg-1", "desc": "mass_fraction_of_cloud_ice_water_in_air", "default_value": 0.0}, \ + {"name": "qt", "type":wp, "dimd": ('t0', 'lev'), "units": "kg kg-1", "desc": "mass_fraction_of_water_in_air"}, \ + {"name": "hur", "type":wp, "dimd": ('t0', 'lev'), "units": "%", "desc": "relative_humidity"}, \ + {"name": "tke", "type":wp, "dimd": ('t0', 'lev'), "units": "m2 s-2", "desc": "specific_turbulen_kinetic_energy", "default_value": 0.0}, \ + {"name": "ua", "type":wp, "dimd": ('t0', 'lev'), "units": "m s-1", "desc": "eastward_wind", "default_value": stateREGRID["u_lay"][1,:], "override": True}, \ + {"name": "va", "type":wp, "dimd": ('t0', 'lev'), "units": "m s-1", "desc": "northward_wind", "default_value": stateREGRID["v_lay"][1,:], "override": True}, \ + {"name": "ts", "type":wp, "dimd": ('t0' ), "units": "K", "desc": "surface_temperature"},\ + {"name": "tskin", "type":wp, "dimd": ('t0' ), "units": "K", "desc": "surface_skin_pressure"}, \ + {"name": "ps", "type":wp, "dimd": ('t0' ), "units": "Pa", "desc": "surface_air_pressure"}, \ + {"name": "beta", "type":wp, "dimd": ('t0' ), "units": "m", "desc": "soil_water_stress_factor"}, \ + {"name": "mrsos", "type":wp, "dimd": ('t0' ), "units": "kg m-2", "desc": "mass_content_of_water_in_soil_layer"}, \ + {"name": "o3", "type":wp, "dimd": ('t0', 'lev'), "units": "kg kg-1", "desc": "mole_fraction_of_ozone_in_air"}, \ + {"name": "sza", "type":wp, "dimd": ('t0' ), "units": "degree", "desc": "solar_zenith_angle"}, \ + {"name": "io", "type":wp, "dimd": ('t0' ), "units": "W m-2", "desc": "solar_irradiance"}, \ + {"name": "alb", "type":wp, "dimd": ('t0' ), "units": "1", "desc": "surface_albedo"}, \ + {"name": "emis", "type":wp, "dimd": ('t0' ), "units": "1", "desc": "surface_longwave_emissivity"}, \ + {"name": "slmsk", "type":wp, "dimd": ('t0' ), "units": "none", "desc": "land_sea_ice_mask"}] + # + var_frc = [{"name": "zh_forc", "type":wp, "dimd": ('time', 'lev'), "units": "m", "desc": "height_forcing","default_value": 1.},\ + {"name": "pa_forc", "type":wp, "dimd": ('time', 'lev'), "units": "Pa", "desc": "air_pressure_forcing"}, \ + {"name": "wa", "type":wp, "dimd": ('time', 'lev'), "units": "m s-1", "desc": "upward_air_velocity"}, \ + {"name": "wap", "type":wp, "dimd": ('time', 'lev'), "units": "Pa s-1", "desc": "lagrangian_tendency_of_air_pressure"}, \ + {"name": "ug", "type":wp, "dimd": ('time', 'lev'), "units": "m s-1", "desc": "geostrophic_eastward_wind"}, \ + {"name": "vg", "type":wp, "dimd": ('time', 'lev'), "units": "m s-1", "desc": "geostrophic_northward_wind"}, \ + {"name": "tnua_adv", "type":wp, "dimd": ('time', 'lev'), "units": "m s-2", "desc": "tendency_of_eastward_wind_due_to_advection"},\ + {"name": "tnva_adv", "type":wp, "dimd": ('time', 'lev'), "units": "m s-2", "desc": "tendency_of_northward_wind_due_to_advection"}, \ + {"name": "tnta_adv", "type":wp, "dimd": ('time', 'lev'), "units": "K s-1", "desc": "tendency_of_air_temperature_due_to_advection"}, \ + {"name": "tntheta_adv", "type":wp, "dimd": ('time', 'lev'), "units": "K s-1", "desc": "tendency_of_air_potential_temperature_due_to_advection"}, \ + {"name": "tnthetal_adv", "type":wp, "dimd": ('time', 'lev'), "units": "K s-1", "desc": "tendency_of_air_liquid_potential_temperature_due_to_advection"}, \ + {"name": "tnqv_adv", "type":wp, "dimd": ('time', 'lev'), "units": "kg kg-1 s-1", "desc": "tendency_of_specific_humidity_due_to_advection"},\ + {"name": "tnqt_adv", "type":wp, "dimd": ('time', 'lev'), "units": "kg kg-1 s-1", "desc": "tendency_of_mass_fraction_of_water_in_air_due_to_advection"},\ + {"name": "tnrv_adv", "type":wp, "dimd": ('time', 'lev'), "units": "kg kg-1 s-1", "desc": "tendency_of_humidity_mixing_ratio_due_to_advection"},\ + {"name": "tnrt_adv", "type":wp, "dimd": ('time', 'lev'), "units": "kg kg-1 s-1", "desc": "tendency_of_water_mixing_ratio_due_to_advection"},\ + {"name": "tnta_rad", "type":wp, "dimd": ('time', 'lev'), "units": "K s-1", "desc": "tendency_of_air_temperature_due_to_radiative_heating"}, \ + {"name": "tntheta_rad", "type":wp, "dimd": ('time', 'lev'), "units": "K s-1", "desc": "tendency_of_potential_air_temperature_due_to_radiative_heating"}, \ + {"name": "tnthetal_rad", "type":wp, "dimd": ('time', 'lev'), "units": "K s-1", "desc": "tendency_of_air_liquid_potential_temperature_due_to_radiative_heating"}, \ + {"name": "ta_nud", "type":wp, "dimd": ('time', 'lev'), "units": "K", "desc": "nudging_air_temperature"}, \ + {"name": "theta_nud", "type":wp, "dimd": ('time', 'lev'), "units": "K", "desc": "nudging_air_potential_temperature"}, \ + {"name": "thetal_nud", "type":wp, "dimd": ('time', 'lev'), "units": "K", "desc": "nudging_air_liquid_potential_temperature"}, \ + {"name": "qt_nud", "type":wp, "dimd": ('time', 'lev'), "units": "kg kg-1", "desc": "nudging_mass_fraction_of_water_in_air"}, \ + {"name": "rv_nud", "type":wp, "dimd": ('time', 'lev'), "units": "m s-1", "desc": "nudging_humidity_mixing_ratio"}, \ + {"name": "rt_nud", "type":wp, "dimd": ('time', 'lev'), "units": "m s-1", "desc": "nudging_water_mixing_ratio"}, \ + {"name": "ua_nud", "type":wp, "dimd": ('time', 'lev'), "units": "m s-1", "desc": "nudging_eastward_wind"}, \ + {"name": "va_nud", "type":wp, "dimd": ('time', 'lev'), "units": "m s-1", "desc": "nudging_northward_wind"}, \ + {"name": "hfss", "type":wp, "dimd": ('time' ), "units": "W m-2", "desc": "surface_upward_sensible_heat_flux"}, \ + {"name": "hfls", "type":wp, "dimd": ('time' ), "units": "W m-2", "desc": "surface_upward_latent_heat_flux"}, \ + {"name": "wpthetap_s", "type":wp, "dimd": ('time' ), "units": "K m s-1", "desc": "surface_upward_potential_temperature_flux"}, \ + {"name": "wpqvp_s", "type":wp, "dimd": ('time' ), "units": "m s-1", "desc": "surface_upward_specific_humidity_flux"}, \ + {"name": "wpqtp_s", "type":wp, "dimd": ('time' ), "units": "m s-1", "desc": "surface_upward_water_mass_fraction_flux"}, \ + {"name": "wprvp_s", "type":wp, "dimd": ('time' ), "units": "m s-1", "desc": "surface_upward_humidity_mixing_ratio_flux"}, \ + {"name": "wprtp_s", "type":wp, "dimd": ('time' ), "units": "m s-1", "desc": "surface_upward_water_mixing_ratio_flux"}, \ + {"name": "ts_forc", "type":wp, "dimd": ('time' ), "units": "K", "desc": "forcing_surface_temperature"},\ + {"name": "ps_forc", "type":wp, "dimd": ('time' ), "units": "Pa", "desc": "forcing_surface_air_pressure"},\ + {"name": "uustar", "type":wp, "dimd": ('time' ), "units": "m s-1", "desc": "surface_friction_velocity"}, \ + {"name": "z0h", "type":wp, "dimd": ('time' ), "units": "m", "desc": "surface_roughness_length_for_heat_in_air"}, \ + {"name": "z0q", "type":wp, "dimd": ('time' ), "units": "m", "desc": "surface_roughness_length_for_humidity_in_air"}, \ + {"name": "mrsos_forc", "type":wp, "dimd": ('time' ), "units": "kg m-2", "desc": "forcing_mass_content_of_water_in_soil_layer"}] + + # + var_oro = [{"name": "area", "type":wp, "dimd": ('t0'), "units": "m 2-1", "desc": "grid_cell_area"},\ + {"name": "stddev", "type":wp, "dimd": ('t0'), "units": "m", "desc": "standard deviation of subgrid orography"}, \ + {"name": "convexity", "type":wp, "dimd": ('t0'), "units": "none", "desc": "convexity of subgrid orography"}, \ + {"name": "oa1", "type":wp, "dimd": ('t0'), "units": "none", "desc": "assymetry of subgrid orography 1"}, \ + {"name": "oa2", "type":wp, "dimd": ('t0'), "units": "none", "desc": "assymetry of subgrid orography 2"}, \ + {"name": "oa3", "type":wp, "dimd": ('t0'), "units": "none", "desc": "assymetry of subgrid orography 3"}, \ + {"name": "oa4", "type":wp, "dimd": ('t0'), "units": "none", "desc": "assymetry of subgrid orography 4"}, \ + {"name": "ol1", "type":wp, "dimd": ('t0'), "units": "none", "desc": "fraction of grid box with subgrid orography higher than critical height 1"}, \ + {"name": "ol2", "type":wp, "dimd": ('t0'), "units": "none", "desc": "fraction of grid box with subgrid orography higher than critical height 2"}, \ + {"name": "ol3", "type":wp, "dimd": ('t0'), "units": "none", "desc": "fraction of grid box with subgrid orography higher than critical height 3"}, \ + {"name": "ol4", "type":wp, "dimd": ('t0'), "units": "none", "desc": "fraction of grid box with subgrid orography higher than critical height 4"}, \ + {"name": "sigma", "type":wp, "dimd": ('t0'), "units": "none", "desc": "slope of subgrid orography"}, \ + {"name": "gamma", "type":wp, "dimd": ('t0'), "units": "none", "desc": "anisotropy of subgrid orography"}, \ + {"name": "elvmax", "type":wp, "dimd": ('t0'), "units": "m", "desc": "maximum of subgrid orography"}, \ + {"name": "oro", "type":wp, "dimd": ('t0'), "units": "m", "desc": "orography"}, \ + {"name": "oro_uf", "type":wp, "dimd": ('t0'), "units": "m", "desc": "unfiltered orography"}, \ + {"name": "landfrac", "type":wp, "dimd": ('t0'), "units": "none", "desc": "fraction of horizontal grid area occupied by land"}, \ + {"name": "lakefrac", "type":wp, "dimd": ('t0'), "units": "none", "desc": "fraction of horizontal grid area occupied by lake", "default_value":0}, \ + {"name": "lakedepth", "type":wp, "dimd": ('t0'), "units": "none", "desc": "lake depth", "default_value":0}] + # + var_nsst = [{"name": "tref", "type":wp, "dimd": ('t0'), "units": "K", "desc": "sea surface reference temperature for NSST"}, \ + {"name": "z_c", "type":wp, "dimd": ('t0'), "units": "m", "desc": "sub-layer cooling thickness for NSST"}, \ + {"name": "c_0", "type":wp, "dimd": ('t0'), "units": "none", "desc": "coefficient 1 to calculate d(Tz)/d(Ts) for NSST"}, \ + {"name": "c_d", "type":wp, "dimd": ('t0'), "units": "nonw", "desc": "coefficient 2 to calculate d(Tz)/d(Ts) for NSST"}, \ + {"name": "w_0", "type":wp, "dimd": ('t0'), "units": "none", "desc": "coefficient 3 to calculate d(Tz)/d(Ts) for NSST"}, \ + {"name": "w_d", "type":wp, "dimd": ('t0'), "units": "none", "desc": "coefficient 4 to calculate d(Tz)/d(Ts) for NSST"}, \ + {"name": "xt", "type":wp, "dimd": ('t0'), "units": "K m", "desc": "heat content in diurnal thermocline layer for NSST"}, \ + {"name": "xs", "type":wp, "dimd": ('t0'), "units": "ppt m", "desc": "salinity content in diurnal thermocline layer for NSST"}, \ + {"name": "xu", "type":wp, "dimd": ('t0'), "units": "m2 s-1", "desc": "u-current in diurnal thermocline layer for NSST"}, \ + {"name": "xv", "type":wp, "dimd": ('t0'), "units": "m2 s-1", "desc": "v-current in diurnal thermocline layer for NSST"}, \ + {"name": "xz", "type":wp, "dimd": ('t0'), "units": "m", "desc": "thickness of diurnal thermocline layer for NSST"}, \ + {"name": "zm" , "type":wp, "dimd": ('t0'), "units": "m", "desc": "thickness of ocean mixed layer for NSST"}, \ + {"name": "xtts", "type":wp, "dimd": ('t0'), "units": "m", "desc": "sensitivity of diurnal thermocline layer heat content to surface temperature [d(xt)/d(ts)] for NSST"},\ + {"name": "xzts", "type":wp, "dimd": ('t0'), "units": "m K-1", "desc": "sensitivity of diurnal thermocline layer thickness to surface temperature [d(xz)/d(ts)] for NSST"}, \ + {"name": "d_conv", "type":wp, "dimd": ('t0'), "units": "m", "desc": "thickness of free convection layer for NSST"}, \ + {"name": "ifd", "type":wp, "dimd": ('t0'), "units": "none", "desc": "index to start DTM run for NSST"}, \ + {"name": "dt_cool", "type":wp, "dimd": ('t0'), "units": "K", "desc": "sub-layer cooling amount for NSST"}, \ + {"name": "qrain", "type":wp, "dimd": ('t0'), "units": "W m-2", "desc": "sensible heat due to rainfall for NSST"}] + # + var_frgd = [{"name": "tiice", "type":wp, "dimd": ('t0','nice'), "units": "K", "desc": "sea ice internal temperature"}] + # + var_noah = [{"name": "vegsrc", "type":wi, "dimd": ('t0'), "units": "none", "desc": "vegetation source (1-2)", "default_value": 1}, \ + {"name": "tsfco", "type":wp, "dimd": ('t0'), "units": "K", "desc": "sea/skin/ice surface temperature"}, \ + {"name": "weasd", "type":wp, "dimd": ('t0'), "units": "mm", "desc": "water equivalent accumulated snow depth"}, \ + {"name": "tg3", "type":wp, "dimd": ('t0'), "units": "K", "desc": "deep soil temperature"}, \ + {"name": "alvsf", "type":wp, "dimd": ('t0'), "units": "none", "desc": "60 degree vis albedo with strong cosz dependency"}, \ + {"name": "alnsf", "type":wp, "dimd": ('t0'), "units": "none", "desc": "60 degree nir albedo with strong cosz dependency"}, \ + {"name": "alvwf", "type":wp, "dimd": ('t0'), "units": "none", "desc": "60 degree vis albedo with weak cosz dependency"}, \ + {"name": "alnwf", "type":wp, "dimd": ('t0'), "units": "none", "desc": "60 degree nir albedo with weak cosz dependency"}, \ + {"name": "facsf", "type":wp, "dimd": ('t0'), "units": "none", "desc": "fractional coverage with strong cosz dependency"}, \ + {"name": "facwf", "type":wp, "dimd": ('t0'), "units": "none", "desc": "fractional coverage with weak cosz dependency"}, \ + {"name": "vegfrac", "type":wp, "dimd": ('t0'), "units": "none", "desc": "vegetation fraction"}, \ + {"name": "canopy", "type":wp, "dimd": ('t0'), "units": "kg m-2", "desc": "amount of water stored in canopy"}, \ + {"name": "f10m", "type":wp, "dimd": ('t0'), "units": "none", "desc": "ratio of sigma level 1 wind and 10m wind"}, \ + {"name": "t2m", "type":wp, "dimd": ('t0'), "units": "K", "desc": "2-meter absolute temperature"}, \ + {"name": "q2m", "type":wp, "dimd": ('t0'), "units": "kg kg-1", "desc": "2-meter specific humidity"}, \ + {"name": "vegtyp", "type":wi, "dimd": ('t0'), "units": "none", "desc": "vegetation type (1-12)"}, \ + {"name": "soiltyp", "type":wi, "dimd": ('t0'), "units": "none", "desc": "soil type (1-12)"}, \ + {"name": "ffmm", "type":wp, "dimd": ('t0'), "units": "none", "desc": "Monin-Obukhov similarity function for momentum"}, \ + {"name": "ffhh", "type":wp, "dimd": ('t0'), "units": "none", "desc": "Monin-Obukhov similarity function for heat"}, \ + {"name": "hice", "type":wp, "dimd": ('t0'), "units": "m", "desc": "sea ice thickness"}, \ + {"name": "fice", "type":wp, "dimd": ('t0'), "units": "none", "desc": "ice fraction"}, \ + {"name": "tisfc", "type":wp, "dimd": ('t0'), "units": "K", "desc": "ice surface temperature"}, \ + {"name": "tprcp", "type":wp, "dimd": ('t0'), "units": "m", "desc": "instantaneous total precipitation amount"}, \ + {"name": "srflag", "type":wp, "dimd": ('t0'), "units": "none", "desc": "snow/rain flag for precipitation"}, \ + {"name": "snowd", "type":wp, "dimd": ('t0'), "units": "mm", "desc": "water equivalent snow depth"}, \ + {"name": "shdmin", "type":wp, "dimd": ('t0'), "units": "none", "desc": "minimum vegetation fraction"}, \ + {"name": "shdmax", "type":wp, "dimd": ('t0'), "units": "none", "desc": "maximum vegetation fraction"}, \ + {"name": "slopetyp", "type":wi, "dimd": ('t0'), "units": "none", "desc": "slope type (1-9)"}, \ + {"name": "snoalb", "type":wp, "dimd": ('t0'), "units": "none", "desc": "maximum snow albedo"}, \ + {"name": "sncovr", "type":wp, "dimd": ('t0'), "units": "none", "desc": "surface snow area fraction"}, \ + {"name": "tsfcl", "type":wp, "dimd": ('t0'), "units": "K", "desc": "surface skin temperature over land"}, \ + {"name": "stc", "type":wp, "dimd": ('t0','nsoil'), "units": "K", "desc": "initial profile of soil liquid moisture"}, \ + {"name": "smc", "type":wp, "dimd": ('t0','nsoil'), "units": "kg", "desc": "initial profile of soil moisture"}, \ + {"name": "slc", "type":wp, "dimd": ('t0','nsoil'), "units": "kg", "desc": "initial profile of soil temperature"}] + # + var_noahmp=[{"name": "tvxy", "type":wp, "dimd": ('t0'), "units": "K", "desc": "vegetation temperature for NoahMP"}, \ + {"name": "tgxy", "type":wp, "dimd": ('t0'), "units": "K", "desc": "ground temperature for NoahMP"}, \ + {"name": "tahxy", "type":wp, "dimd": ('t0'), "units": "K", "desc": "canopy air temperature for NoahMP"}, \ + {"name": "canicexy", "type":wp, "dimd": ('t0'), "units": "mm", "desc": "canopy intercepted ice mass for NoahMP"}, \ + {"name": "canliqxy", "type":wp, "dimd": ('t0'), "units": "mm", "desc": "canopy intercepted liquid water for NoahMP"}, \ + {"name": "eahxy", "type":wp, "dimd": ('t0'), "units": "Pa", "desc": "canopy air vapor pressure for NoahMP"}, \ + {"name": "cmxy", "type":wp, "dimd": ('t0'), "units": "none", "desc": "surface drag coefficient for momentum for NoahMP"}, \ + {"name": "chxy", "type":wp, "dimd": ('t0'), "units": "none", "desc": "surface exchange coeff heat & moisture for NoahMP"}, \ + {"name": "fwetxy", "type":wp, "dimd": ('t0'), "units": "none", "desc": "area fraction of canopy that is wetted/snowed for NoahMP"}, \ + {"name": "sneqvoxy", "type":wp, "dimd": ('t0'), "units": "mm", "desc": "snow mass at previous time step for NoahMP"}, \ + {"name": "alboldxy", "type":wp, "dimd": ('t0'), "units": "none", "desc": "snow albedo at previous time step for NoahMP"}, \ + {"name": "qsnowxy", "type":wp, "dimd": ('t0'), "units": "mm s-1", "desc": "snow precipitation rate at surface for NoahMP"}, \ + {"name": "wslakexy", "type":wp, "dimd": ('t0'), "units": "mm", "desc": "lake water storage for NoahMP"}, \ + {"name": "taussxy", "type":wp, "dimd": ('t0'), "units": "none", "desc": "non-dimensional snow age for NoahMP"}, \ + {"name": "waxy", "type":wp, "dimd": ('t0'), "units": "mm", "desc": "water storage in aquifer for NoahMP"}, \ + {"name": "wtxy", "type":wp, "dimd": ('t0'), "units": "mm", "desc": "water storage in aquifer and saturated soil for NoahMP"}, \ + {"name": "zwtxy", "type":wp, "dimd": ('t0'), "units": "m", "desc": "water table depth for NoahMP"}, \ + {"name": "xlaixy", "type":wp, "dimd": ('t0'), "units": "none", "desc": "leaf area index for NoahMP"}, \ + {"name": "xsaixy", "type":wp, "dimd": ('t0'), "units": "none", "desc": "stem area index for NoahMP"}, \ + {"name": "lfmassxy", "type":wp, "dimd": ('t0'), "units": "g m-2", "desc": "leaf mass for NoahMP"}, \ + {"name": "stmassxy", "type":wp, "dimd": ('t0'), "units": "g m-2", "desc": "stem mass for NoahMP"}, \ + {"name": "rtmassxy", "type":wp, "dimd": ('t0'), "units": "g m-2", "desc": "fine root mass for NoahMP"}, \ + {"name": "woodxy", "type":wp, "dimd": ('t0'), "units": "g m-2", "desc": "wood mass including woody roots for NoahMP"}, \ + {"name": "stblcpxy", "type":wp, "dimd": ('t0'), "units": "g m-2", "desc": "stable carbon in deep soil for NoahMP"}, \ + {"name": "fastcpxy", "type":wp, "dimd": ('t0'), "units": "g m-2", "desc": "short-lived carbon in shallow soil for NoahMP"}, \ + {"name": "smcwtdxy", "type":wp, "dimd": ('t0'), "units": "m3 m-3", "desc": "soil water content between the bottom of the soil and the water table for NoahMP"}, \ + {"name": "deeprechxy", "type":wp, "dimd": ('t0'), "units": "m", "desc": "recharge to or from the water table when deep for NoahMP"}, \ + {"name": "rechxy", "type":wp, "dimd": ('t0'), "units": "m", "desc": "recharge to or from the water table when shallow for NoahMP"}, \ + {"name": "snowxy", "type":wp, "dimd": ('t0'), "units": "none", "desc": "number of snow layers for NoahMP"}, \ + {"name": "snicexy", "type":wp, "dimd": ('t0','nsnow'), "units": "mm", "desc": "initial profile of snow layer ice"}, \ + {"name": "snliqxy", "type":wp, "dimd": ('t0','nsnow'), "units": "mm", "desc": "initial profile of snow layer liquid"}, \ + {"name": "tsnoxy", "type":wp, "dimd": ('t0','nsnow'), "units": "K", "desc": "initial profile of snow layer temperature"}, \ + {"name": "smoiseq", "type":wp, "dimd": ('t0','nsoil'), "units": "m3 m-3", "desc": "initial profile of equilibrium soil water content"}, \ + {"name": "zsnsoxy", "type":wp, "dimd": ('t0','nsoil_plus_nsnow'), "units": "m","desc": "layer bottom depth from snow surface"}] + # + var_ruc = [{"name": "wetness", "type":wp, "dimd": ('t0'), "units": "none", "desc": "normalized soil wetness for RUC LSM"}, \ + {"name": "lai", "type":wp, "dimd": ('t0'), "units": "none", "desc": "leaf area index for RUC LSM"}, \ + {"name": "clw_surf_land", "type":wp, "dimd": ('t0'), "units": "kg kg-1", "desc": "cloud condensed water mixing ratio at surface over land for RUC LSM"},\ + {"name": "clw_surf_ice", "type":wp, "dimd": ('t0'), "units": "kg kg-1", "desc": "cloud condensed water mixing ratio at surface over ice for RUC LSM"},\ + {"name": "qwv_surf_land", "type":wp, "dimd": ('t0'), "units": "kg kg-1", "desc": "water vapor mixing ratio at surface over land for RUC LSM"},\ + {"name": "qwv_surf_ice", "type":wp, "dimd": ('t0'), "units": "kg kg-1", "desc": "water vapor mixing ratio at surface over ice for RUC LSM"},\ + {"name": "tsnow_land", "type":wp, "dimd": ('t0'), "units": "K", "desc": "snow temperature at the bottom of the first snow layer over land for RUC LSM"},\ + {"name": "tsnow_ice", "type":wp, "dimd": ('t0'), "units": "K", "desc": "snow temperature at the bottom of the first snow layer over ice for RUC LSM"},\ + {"name": "snowfall_acc_land","type":wp, "dimd": ('t0'), "units": "kg m-2", "desc": "run-total snow accumulation on the ground over land for RUC LSM"},\ + {"name": "snowfall_acc_ice", "type":wp, "dimd": ('t0'), "units": "kg m-2", "desc": "run-total snow accumulation on the ground over ice for RUC LSM"},\ + {"name": "sfalb_lnd", "type":wp, "dimd": ('t0'), "units": "none", "desc": "surface albedo over land for RUC LSM"},\ + {"name": "sfalb_lnd_bck", "type":wp, "dimd": ('t0'), "units": "none", "desc": "surface snow-free albedo over land for RUC LSM"},\ + {"name": "sfalb_ice", "type":wp, "dimd": ('t0'), "units": "none", "desc": "surface albedo over ice for RUC LSM"},\ + {"name": "emis_lnd", "type":wp, "dimd": ('t0'), "units": "none", "desc": "surface emissivity over land for RUC LSM"},\ + {"name": "emis_ice", "type":wp, "dimd": ('t0'), "units": "none", "desc": "surface emissivity over ice for RUC LSM"}, \ + {"name": "tslb", "type":wp, "dimd": ('t0','nsoil'), "units": "K", "desc": "soil temperature for RUC LSM"}, \ + {"name": "smois", "type":wp, "dimd": ('t0','nsoil'), "units": "none", "desc": "volume fraction of soil moisture for RUC LSM"}, \ + {"name": "sh2o", "type":wp, "dimd": ('t0','nsoil'), "units": "none", "desc": "volume fraction of unfrozen soil moisture for RUC LSM"}, \ + {"name": "smfr", "type":wp, "dimd": ('t0','nsoil'), "units": "none", "desc": "volume fraction of frozen soil moisture for RUC LSM"}, + {"name": "flfr", "type":wp, "dimd": ('t0','nsoil'), "units": "none", "desc": "flag for frozen soil physics for RUC LSM"}] + + # + var_dict.extend(var_frc) + var_dict.extend(var_oro) + var_dict.extend(var_nsst) + var_dict.extend(var_frgd) + var_dict.extend(var_ruc) + var_dict.extend(var_noah) + var_dict.extend(var_noahmp) + + # + for var in var_dict: + if (var["name"] in dict): + var_temp = nc_file.createVariable(var["name"], var["type"], var["dimd"]) + var_temp.units = var["units"] + var_temp.standard_name = var["desc"] + var_temp[:] = dict[var["name"]] + elif "default_value" in var: + var_temp = nc_file.createVariable(var["name"], var["type"], var["dimd"]) + var_temp.units = var["units"] + var_temp.standard_name = var["desc"] + var_temp[:] = var["default_value"] + if "override" in var: + var_temp[:] = var["default_value"] + # + # Close file + # + nc_file.close() + + return(fileOUT) + +######################################################################################## +def write_comparison_file(comp_data, case_name, date, surface): + """Write UFS history file data to netCDF file for comparison""" + + wp = np.float64 + wi = np.int32 + + nlevs = comp_data["pa"].shape[1] + ntime = comp_data["pa"].shape[0] + + start_date = datetime(date["year"],date["month"],date["day"],date["hour"],date["minute"],date["second"]) + start_date_string = start_date.strftime("%Y%m%d%H%M%S") + + loc_string = str(round(surface["lon"],2)) + "E" + str(round(surface["lat"],2)) + "N" + case_string = 'UFS_' + start_date_string + '_' + loc_string + + com = 'mkdir -p ' + COMPARISON_DATA_DIR + print(com) + os.system(com) + nc_file = Dataset(os.path.join(COMPARISON_DATA_DIR, case_name + '_comp_data.nc'), 'w', format='NETCDF3_CLASSIC') + nc_file.case = case_string + nc_file.title = 'UFS history file data for ' + case_string + nc_file.reference = '' + nc_file.author = 'Grant J. Firl' + nc_file.version = 'Created on ' + datetime.today().strftime('%Y-%m-%d-%H:%M:%S') + nc_file.script = os.path.basename(__file__) + nc_file.startDate = start_date_string + + # Dimensions + lev_dim = nc_file.createDimension('lev', size=nlevs) + time_dim = nc_file.createDimension('time', size=ntime) + time_ufs_history_dim = nc_file.createDimension('time_ufs_history', size=ntime-1) + + # Varaibles + time_var = nc_file.createVariable('time', wp, ('time',)) + time_var.units = 'second' + time_var.long_name = 'history file time' + time_var[:] = comp_data['time'] + + time2_var = nc_file.createVariable('time_ufs_history', wp, ('time_ufs_history',)) + time2_var.units = 'second' + time2_var.long_name = 'UFS history file time' + time2_var[:] = comp_data['time'][1::] - temperature_var = initial_grp.createVariable('temp', real_type, ('levels',)) - temperature_var[:] = state["T"][0:nlevs] + lev_var = nc_file.createVariable('levs', wp, ('time','lev',)) + lev_var.units = 'Pa' + lev_var.long_name = 'pressure' + lev_var[:,:] = comp_data["pa"] + + temperature_var = nc_file.createVariable('temp', wp, ('time', 'lev',)) temperature_var.units = 'K' - temperature_var.description = 'initial profile of absolute temperature' - - qt_var = initial_grp.createVariable('qt', real_type, ('levels',)) - qt_var[:] = state["qv"][0:nlevs] - qt_var.units = 'kg kg^-1' - qt_var.description = 'initial profile of total water specific humidity' - - ql_var = initial_grp.createVariable('ql', real_type, ('levels',)) - ql_var[:] = state["ql"][0:nlevs] - ql_var.units = 'kg kg^-1' - ql_var.description = 'initial profile of liquid water specific humidity' - - qi_var = initial_grp.createVariable('qi', real_type, ('levels',)) - qi_var[:] = 0.0 - qi_var.units = 'kg kg^-1' - qi_var.description = 'initial profile of ice water specific humidity' - - u_var = initial_grp.createVariable('u', real_type, ('levels',)) - u_var[:] = state["u"][0:nlevs] - u_var.units = 'm s^-1' - u_var.description = 'initial profile of E-W horizontal wind' - - v_var = initial_grp.createVariable('v', real_type, ('levels',)) - v_var[:] = state["v"][0:nlevs] - v_var.units = 'm s^-1' - v_var.description = 'initial profile of N-S horizontal wind' - - tke_var = initial_grp.createVariable('tke', real_type, ('levels',)) - tke_var[:] = 0.0 - tke_var.units = 'm^2 s^-2' - tke_var.description = 'initial profile of turbulence kinetic energy' - - ozone_var = initial_grp.createVariable('ozone', real_type, ('levels',)) - ozone_var[:] = state["o3"][0:nlevs] - ozone_var.units = 'kg kg^-1' - ozone_var.description = 'initial profile of ozone mass mixing ratio' - - stc_var = initial_grp.createVariable('stc',real_type,('nsoil',)) - stc_var[:] = surface["stc"][0:nsoil] - stc_var.units = "K" - stc_var.description = "initial profile of soil temperature" - - smc_var = initial_grp.createVariable('smc',real_type,('nsoil',)) - smc_var[:] = surface["smc"][0:nsoil] - smc_var.units = "kg" - smc_var.description = "initial profile of soil moisture" - - slc_var = initial_grp.createVariable('slc',real_type,('nsoil',)) - slc_var[:] = surface["slc"][0:nsoil] - slc_var.units = "kg" - slc_var.description = "initial profile of soil liquid moisture" - - snicexy_var = initial_grp.createVariable('snicexy',real_type,('nsnow',)) - snicexy_var[:] = surface["snicexy"][0:nsnow] - snicexy_var.units = "mm" - snicexy_var.description = "initial profile of snow layer ice" - - snliqxy_var = initial_grp.createVariable('snliqxy',real_type,('nsnow',)) - snliqxy_var[:] = surface["snliqxy"][0:nsnow] - snliqxy_var.units = "mm" - snliqxy_var.description = "initial profile of snow layer liquid" - - tsnoxy_var = initial_grp.createVariable('tsnoxy',real_type,('nsnow',)) - tsnoxy_var[:] = surface["tsnoxy"][0:nsnow] - tsnoxy_var.units = "K" - tsnoxy_var.description = "initial profile of snow layer temperature" - - smoiseq_var = initial_grp.createVariable('smoiseq',real_type,('nsoil',)) - smoiseq_var[:] = surface["smoiseq"][0:nsoil] - smoiseq_var.units = "m3 m-3" - smoiseq_var.description = "initial profile of equilibrium soil water content" - - zsnsoxy_var = initial_grp.createVariable('zsnsoxy',real_type,('nsoil_plus_nsnow',)) - zsnsoxy_var[:] = surface["zsnsoxy"][0:nsoil + nsnow] - zsnsoxy_var.units = "m" - zsnsoxy_var.description = "layer bottom depth from snow surface" - - tiice_var = initial_grp.createVariable('tiice',real_type,('nice',)) - tiice_var[:] = surface["tiice"][0:nice] - tiice_var.units = "K" - tiice_var.description = "sea ice internal temperature" - - tslb_var = initial_grp.createVariable('tslb',real_type,('nsoil',)) - tslb_var[:] = surface["tslb"][0:nsoil] - tslb_var.units = "K" - tslb_var.description = "soil temperature for RUC LSM" - - smois_var = initial_grp.createVariable('smois',real_type,('nsoil',)) - smois_var[:] = surface["smois"][0:nsoil] - smois_var.units = "None" - smois_var.description = "volume fraction of soil moisture for RUC LSM" - - sh2o_var = initial_grp.createVariable('sh2o',real_type,('nsoil',)) - sh2o_var[:] = surface["sh2o"][0:nsoil] - sh2o_var.units = "None" - sh2o_var.description = "volume fraction of unfrozen soil moisture for RUC LSM" - - smfr_var = initial_grp.createVariable('smfr',real_type,('nsoil',)) - smfr_var[:] = surface["smfr"][0:nsoil] - smfr_var.units = "None" - smfr_var.description = "volume fraction of frozen soil moisture for RUC LSM" - - flfr_var = initial_grp.createVariable('flfr',real_type,('nsoil',)) - flfr_var[:] = surface["flfr"][0:nsoil] - flfr_var.units = "None" - flfr_var.description = "flag for frozen soil physics for RUC LSM" - - #forcing group - - p_surf_var = forcing_grp.createVariable('p_surf', real_type, ('time',)) - p_surf_var[:] = state["p_surf"] - p_surf_var.units = 'Pa' - p_surf_var.description = 'surface pressure' - - T_surf_var = forcing_grp.createVariable('T_surf', real_type, ('time',)) - T_surf_var[:] = missing_value - T_surf_var.units = 'K' - T_surf_var.description = 'surface absolute temperature forcing' - - w_ls_var = forcing_grp.createVariable('w_ls', real_type, ('levels','time',)) - w_ls_var[:] = forcing["w_ls"] - w_ls_var.units = 'm s^-1' - w_ls_var.description = 'large scale vertical velocity' - - omega_var = forcing_grp.createVariable('omega', real_type, ('levels','time',)) - omega_var[:] = forcing["omega"] - omega_var.units = 'Pa s^-1' - omega_var.description = 'large scale pressure vertical velocity' - - u_g_var = forcing_grp.createVariable('u_g', real_type, ('levels','time',)) - u_g_var[:] = forcing["u_g"] - u_g_var.units = 'm s^-1' - u_g_var.description = 'large scale geostrophic E-W wind' - - v_g_var = forcing_grp.createVariable('v_g', real_type, ('levels','time',)) - v_g_var[:] = forcing["v_g"] - v_g_var.units = 'm s^-1' - v_g_var.description = 'large scale geostrophic N-S wind' - - u_nudge_var = forcing_grp.createVariable('u_nudge', real_type, ('levels','time',)) - u_nudge_var[:] = forcing["u_nudge"] - u_nudge_var.units = 'm s^-1' - u_nudge_var.description = 'E-W wind to nudge toward' - - v_nudge_var = forcing_grp.createVariable('v_nudge', real_type, ('levels','time',)) - v_nudge_var[:] = forcing["v_nudge"] - v_nudge_var.units = 'm s^-1' - v_nudge_var.description = 'N-S wind to nudge toward' - - T_nudge_var = forcing_grp.createVariable('T_nudge', real_type, ('levels','time',)) - T_nudge_var[:] = forcing["T_nudge"] - T_nudge_var.units = 'K' - T_nudge_var.description = 'absolute temperature to nudge toward' - - thil_nudge_var = forcing_grp.createVariable('thil_nudge', real_type, ('levels','time',)) - thil_nudge_var[:] = forcing["thil_nudge"] - thil_nudge_var.units = 'K' - thil_nudge_var.description = 'potential temperature to nudge toward' - - qt_nudge_var = forcing_grp.createVariable('qt_nudge', real_type, ('levels','time',)) - qt_nudge_var[:] = forcing["qt_nudge"] - qt_nudge_var.units = 'kg kg^-1' - qt_nudge_var.description = 'q_t to nudge toward' - - rad_heating_var = forcing_grp.createVariable('dT_dt_rad', real_type, ('levels','time',)) - rad_heating_var[:] = forcing["rad_heating"] - rad_heating_var.units = 'K s^-1' - rad_heating_var.description = 'prescribed radiative heating rate' - - h_advec_thil_var = forcing_grp.createVariable('h_advec_thetail', real_type, ('levels','time',)) - h_advec_thil_var[:] = forcing["h_advec_thil"] - h_advec_thil_var.units = 'K s^-1' - h_advec_thil_var.description = 'prescribed theta_il tendency due to horizontal advection' - - v_advec_thil_var = forcing_grp.createVariable('v_advec_thetail', real_type, ('levels','time',)) - v_advec_thil_var[:] = forcing["v_advec_thil"] - v_advec_thil_var.units = 'K s^-1' - v_advec_thil_var.description = 'prescribed theta_il tendency due to vertical advection' - - h_advec_qt_var = forcing_grp.createVariable('h_advec_qt', real_type, ('levels','time',)) - h_advec_qt_var[:] = forcing["h_advec_qt"] - h_advec_qt_var.units = 'kg kg^-1 s^-1' - h_advec_qt_var.description = 'prescribed q_t tendency due to horizontal advection' - - v_advec_qt_var = forcing_grp.createVariable('v_advec_qt', real_type, ('levels','time',)) - v_advec_qt_var[:] = forcing["v_advec_qt"] - v_advec_qt_var.units = 'kg kg^-1 s^-1' - v_advec_qt_var.description = 'prescribed q_t tendency due to vertical advection' - - #scalar group - year_var = scalar_grp.createVariable('init_year',int_type) - year_var[:] = date["year"] - year_var.units = "years" - year_var.description = "year at time of initial values" - - month_var = scalar_grp.createVariable('init_month',int_type) - month_var[:] = date["month"] - month_var.units = "months" - month_var.description = "month at time of initial values" - - day_var = scalar_grp.createVariable('init_day',int_type) - day_var[:] = date["day"] - day_var.units = "days" - day_var.description = "day at time of initial values" - - hour_var = scalar_grp.createVariable('init_hour',int_type) - hour_var[:] = date["hour"] - hour_var.units = "hours" - hour_var.description = "hour at time of initial values" - - minute_var = scalar_grp.createVariable('init_minute',int_type) - minute_var[:] = date["minute"] - minute_var.units = "minutes" - minute_var.description = "minute at time of initial values" - - second_var = scalar_grp.createVariable('init_second',int_type) - second_var[:] = 0.0 - second_var.units = "seconds" - second_var.description = "second at time of initial values" - - lat_var = scalar_grp.createVariable('lat', real_type) - lat_var[:] = surface["lat"] - lat_var.units = 'degrees N' - lat_var.description = 'latitude of column' - - lon_var = scalar_grp.createVariable('lon', real_type) - lon_var[:] = surface["lon"] - lon_var.units = 'degrees E' - lon_var.description = 'longitude of column' - - area = scalar_grp.createVariable('area', real_type) - area[:] = surface["area"] - area.units = "m^2" - area.description = "grid cell area" - - #Noah initial parameters - - tsfco = scalar_grp.createVariable('tsfco',real_type) - tsfco[:] = surface["tsfco"] - tsfco.units = "K" - tsfco.description = "sea surface temperature OR surface skin temperature over land OR sea ice surface skin temperature (depends on value of slmsk)" - - vegsrc = scalar_grp.createVariable('vegsrc',int_type) - vegsrc[:] = 1 #when would this be 2? - vegsrc.description = "vegetation soure (1-2)" - - vegtyp = scalar_grp.createVariable('vegtyp',int_type) - vegtyp[:] = surface["vtyp"] - vegtyp.description = "vegetation type (1-12)" - - soiltyp = scalar_grp.createVariable('soiltyp',int_type) - soiltyp[:] = surface["styp"] - soiltyp.description = "soil type (1-12)" - - slopetyp = scalar_grp.createVariable('slopetyp',int_type) - slopetyp[:] = surface["slope"] - slopetyp.description = "slope type (1-9)" - - vegfrac = scalar_grp.createVariable('vegfrac',real_type) - vegfrac[:] = surface["vfrac"] - vegfrac.description = "vegetation fraction" - - shdmin = scalar_grp.createVariable('shdmin',real_type) - shdmin[:] = surface["shdmin"] - shdmin.description = "minimum vegetation fraction" - - shdmax = scalar_grp.createVariable('shdmax',real_type) - shdmax[:] = surface["shdmax"] - shdmax.description = "maximum vegetation fraction" - - zorlw = scalar_grp.createVariable('zorlw',real_type) - zorlw[:] = surface["zorlw"] - zorlw.units = "cm" - zorlw.description = "surface roughness length over ocean" - - islmsk = scalar_grp.createVariable('slmsk',real_type) - islmsk[:] = surface["slmsk"] - islmsk.description = "land-sea-ice mask" - - canopy = scalar_grp.createVariable('canopy',real_type) - canopy[:] = surface["canopy"] - canopy.units = "kg m-2" - canopy.description = "amount of water stored in canopy" - - hice = scalar_grp.createVariable('hice',real_type) - hice[:] = surface["hice"] - hice.units = "m" - hice.description = "sea ice thickness" - - fice = scalar_grp.createVariable('fice',real_type) - fice[:] = surface["fice"] - fice.description = "ice fraction" - - tisfc = scalar_grp.createVariable('tisfc',real_type) - tisfc[:] = surface["tisfc"] - tisfc.units = "K" - tisfc.description = "ice surface temperature" - - snwdph = scalar_grp.createVariable('snwdph',real_type) - snwdph[:] = surface["snwdph"] - snwdph.units = "mm" - snwdph.description = "water equivalent snow depth" - - snoalb = scalar_grp.createVariable('snoalb',real_type) - snoalb[:] = surface["snoalb"] - snoalb.description = "maximum snow albedo" - - tg3 = scalar_grp.createVariable('tg3',real_type) - tg3[:] = surface["tg3"] - tg3.units = "K" - tg3.description = "deep soil temperature" - - uustar = scalar_grp.createVariable('uustar',real_type) - uustar[:] = surface["uustar"] - uustar.units = "m s-1" - uustar.description = "friction velocity" - - alvsf = scalar_grp.createVariable('alvsf',real_type) - alvsf[:] = surface["alvsf"] - alvsf.units = "None" - alvsf.description = "60 degree vis albedo with strong cosz dependency" - - alnsf = scalar_grp.createVariable('alnsf',real_type) - alnsf[:] = surface["alnsf"] - alnsf.units = "None" - alnsf.description = "60 degree nir albedo with strong cosz dependency" - - alvwf = scalar_grp.createVariable('alvwf',real_type) - alvwf[:] = surface["alvwf"] - alvwf.units = "None" - alvwf.description = "60 degree vis albedo with weak cosz dependency" - - alnwf = scalar_grp.createVariable('alnwf',real_type) - alnwf[:] = surface["alnwf"] - alnwf.units = "None" - alnwf.description = "60 degree nir albedo with weak cosz dependency" - - facsf = scalar_grp.createVariable('facsf',real_type) - facsf[:] = surface["facsf"] - facsf.units = "None" - facsf.description = "fractional coverage with strong cosz dependency" - - facwf = scalar_grp.createVariable('facwf',real_type) - facwf[:] = surface["facwf"] - facwf.units = "None" - facwf.description = "fractional coverage with weak cosz dependency" - - weasd = scalar_grp.createVariable('weasd',real_type) - weasd[:] = surface["sheleg"] - weasd.units = "mm" - weasd.description = "water equivalent accumulated snow depth" - - f10m = scalar_grp.createVariable('f10m',real_type) - f10m[:] = surface["f10m"] - f10m.units = "None" - f10m.description = "ratio of sigma level 1 wind and 10m wind" - - t2m = scalar_grp.createVariable('t2m',real_type) - t2m[:] = surface["t2m"] - t2m.units = "K" - t2m.description = "2-meter absolute temperature" - - q2m = scalar_grp.createVariable('q2m',real_type) - q2m[:] = surface["q2m"] - q2m.units = "kg kg-1" - q2m.description = "2-meter specific humidity" - - ffmm = scalar_grp.createVariable('ffmm',real_type) - ffmm[:] = surface["ffmm"] - ffmm.units = "None" - ffmm.description = "Monin-Obukhov similarity function for momentum" - - ffhh = scalar_grp.createVariable('ffhh',real_type) - ffhh[:] = surface["ffhh"] - ffhh.units = "None" - ffhh.description = "Monin-Obukhov similarity function for heat" - - tprcp = scalar_grp.createVariable('tprcp',real_type) - tprcp[:] = surface["tprcp"] - tprcp.units = "m" - tprcp.description = "instantaneous total precipitation amount" - - srflag = scalar_grp.createVariable('srflag',real_type) - srflag[:] = surface["srflag"] - srflag.units = "None" - srflag.description = "snow/rain flag for precipitation" - - sncovr = scalar_grp.createVariable('sncovr',real_type) - sncovr[:] = surface["sncovr"] - sncovr.units = "None" - sncovr.description = "surface snow area fraction" - - tsfcl = scalar_grp.createVariable('tsfcl',real_type) - tsfcl[:] = surface["tsfcl"] - tsfcl.units = "K" - tsfcl.description = "surface skin temperature over land" - - zorll = scalar_grp.createVariable('zorll',real_type) - zorll[:] = surface["zorll"] - zorll.units = "cm" - zorll.description = "surface roughness length over land" - - zorli = scalar_grp.createVariable('zorli',real_type) - zorli[:] = surface["zorli"] - zorli.units = "cm" - zorli.description = "surface roughness length over ice" - - zorlwav = scalar_grp.createVariable('zorlwav',real_type) - zorlwav[:] = surface["zorlwav"] - zorlwav.units = "cm" - zorlwav.description = "surface roughness length from wave model" - - #Orography initial parameters - - stddev = scalar_grp.createVariable('stddev',real_type) - stddev[:] = oro["stddev"] - stddev.units = "m" - stddev.description = "standard deviation of subgrid orography" - - convexity = scalar_grp.createVariable('convexity',real_type) - convexity[:] = oro["convexity"] - convexity.units = "" - convexity.description = "convexity of subgrid orography" - - oa1 = scalar_grp.createVariable('oa1',real_type) - oa1[:] = oro["oa1"] - oa1.units = "" - oa1.description = "assymetry of subgrid orography 1" - - oa2 = scalar_grp.createVariable('oa2',real_type) - oa2[:] = oro["oa2"] - oa2.units = "" - oa2.description = "assymetry of subgrid orography 2" - - oa3 = scalar_grp.createVariable('oa3',real_type) - oa3[:] = oro["oa3"] - oa3.units = "" - oa3.description = "assymetry of subgrid orography 3" - - oa4 = scalar_grp.createVariable('oa4',real_type) - oa4[:] = oro["oa4"] - oa4.units = "" - oa4.description = "assymetry of subgrid orography 4" - - ol1 = scalar_grp.createVariable('ol1',real_type) - ol1[:] = oro["ol1"] - ol1.units = "" - ol1.description = "fraction of grid box with subgrid orography higher than critical height 1" - - ol2 = scalar_grp.createVariable('ol2',real_type) - ol2[:] = oro["ol2"] - ol2.units = "" - ol2.description = "fraction of grid box with subgrid orography higher than critical height 2" - - ol3 = scalar_grp.createVariable('ol3',real_type) - ol3[:] = oro["ol3"] - ol3.units = "" - ol3.description = "fraction of grid box with subgrid orography higher than critical height 3" - - ol4 = scalar_grp.createVariable('ol4',real_type) - ol4[:] = oro["ol4"] - ol4.units = "" - ol4.description = "fraction of grid box with subgrid orography higher than critical height 4" - - theta = scalar_grp.createVariable('theta',real_type) - theta[:] = oro["theta"] - theta.units = "deg" - theta.description = "angle with respect to east of maximum subgrid orographic variations" - - gamma = scalar_grp.createVariable('gamma',real_type) - gamma[:] = oro["gamma"] - gamma.units = "" - gamma.description = "anisotropy of subgrid orography" - - sigma = scalar_grp.createVariable('sigma',real_type) - sigma[:] = oro["sigma"] - sigma.units = "" - sigma.description = "slope of subgrid orography" - - elvmax = scalar_grp.createVariable('elvmax',real_type) - elvmax[:] = oro["elvmax"] - elvmax.units = "m" - elvmax.description = "maximum of subgrid orography" - - orog_filt = scalar_grp.createVariable('oro',real_type) - orog_filt[:] = oro["orog_filt"] - orog_filt.units = "m" - orog_filt.description = "orography" - - orog_raw = scalar_grp.createVariable('oro_uf',real_type) - orog_raw[:] = oro["orog_raw"] - orog_raw.units = "m" - orog_raw.description = "unfiltered orography" - - land_frac = scalar_grp.createVariable('landfrac',real_type) - land_frac[:] = oro["land_frac"] - land_frac.units = "None" - land_frac.description = "fraction of horizontal grid area occupied by land" - - lake_frac = scalar_grp.createVariable('lakefrac',real_type) - lake_frac[:] = oro["lake_frac"] - lake_frac.units = "None" - lake_frac.description = "fraction of horizontal grid area occupied by lake" - - lake_depth = scalar_grp.createVariable('lakedepth',real_type) - lake_depth[:] = oro["lake_depth"] - lake_depth.units = "m" - lake_depth.description = "lake depth" - - #NoahMP initial scalar parameters - tvxy = scalar_grp.createVariable('tvxy',real_type) - tvxy[:] = surface["tvxy"] - tvxy.units = "K" - tvxy.description = "vegetation temperature" - - tgxy = scalar_grp.createVariable('tgxy',real_type) - tgxy[:] = surface["tgxy"] - tgxy.units = "K" - tgxy.description = "ground temperature for NoahMP" - - tahxy = scalar_grp.createVariable('tahxy',real_type) - tahxy[:] = surface["tahxy"] - tahxy.units = "K" - tahxy.description = "canopy air temperature" - - canicexy = scalar_grp.createVariable('canicexy',real_type) - canicexy[:] = surface["canicexy"] - canicexy.units = "mm" - canicexy.description = "canopy intercepted ice mass" - - canliqxy = scalar_grp.createVariable('canliqxy',real_type) - canliqxy[:] = surface["canliqxy"] - canliqxy.units = "mm" - canliqxy.description = "canopy intercepted liquid water" - - eahxy = scalar_grp.createVariable('eahxy',real_type) - eahxy[:] = surface["eahxy"] - eahxy.units = "Pa" - eahxy.description = "canopy air vapor pressure" - - cmxy = scalar_grp.createVariable('cmxy',real_type) - cmxy[:] = surface["cmxy"] - cmxy.units = "" - cmxy.description = "surface drag coefficient for momentum for NoahMP" - - chxy = scalar_grp.createVariable('chxy',real_type) - chxy[:] = surface["chxy"] - chxy.units = "" - chxy.description = "surface exchange coeff heat & moisture for NoahMP" - - fwetxy = scalar_grp.createVariable('fwetxy',real_type) - fwetxy[:] = surface["fwetxy"] - fwetxy.units = "" - fwetxy.description = "area fraction of canopy that is wetted/snowed" - - sneqvoxy = scalar_grp.createVariable('sneqvoxy',real_type) - sneqvoxy[:] = surface["sneqvoxy"] - sneqvoxy.units = "mm" - sneqvoxy.description = "snow mass at previous time step" - - alboldxy = scalar_grp.createVariable('alboldxy',real_type) - alboldxy[:] = surface["alboldxy"] - alboldxy.units = "" - alboldxy.description = "snow albedo at previous time step" - - qsnowxy = scalar_grp.createVariable('qsnowxy',real_type) - qsnowxy[:] = surface["qsnowxy"] - qsnowxy.units = "mm s-1" - qsnowxy.description = "snow precipitation rate at surface" - - wslakexy = scalar_grp.createVariable('wslakexy',real_type) - wslakexy[:] = surface["wslakexy"] - wslakexy.units = "mm" - wslakexy.description = "lake water storage" - - taussxy = scalar_grp.createVariable('taussxy',real_type) - taussxy[:] = surface["taussxy"] - taussxy.units = "" - taussxy.description = "non-dimensional snow age" - - waxy = scalar_grp.createVariable('waxy',real_type) - waxy[:] = surface["waxy"] - waxy.units = "mm" - waxy.description = "water storage in aquifer" - - wtxy = scalar_grp.createVariable('wtxy',real_type) - wtxy[:] = surface["wtxy"] - wtxy.units = "mm" - wtxy.description = "water storage in aquifer and saturated soil" - - zwtxy = scalar_grp.createVariable('zwtxy',real_type) - zwtxy[:] = surface["zwtxy"] - zwtxy.units = "m" - zwtxy.description = "water table depth" - - xlaixy = scalar_grp.createVariable('xlaixy',real_type) - xlaixy[:] = surface["xlaixy"] - xlaixy.units = "" - xlaixy.description = "leaf area index" - - xsaixy = scalar_grp.createVariable('xsaixy',real_type) - xsaixy[:] = surface["xsaixy"] - xsaixy.units = "" - xsaixy.description = "stem area index" - - lfmassxy = scalar_grp.createVariable('lfmassxy',real_type) - lfmassxy[:] = surface["lfmassxy"] - lfmassxy.units = "g m-2" - lfmassxy.description = "leaf mass" - - stmassxy = scalar_grp.createVariable('stmassxy',real_type) - stmassxy[:] = surface["stmassxy"] - stmassxy.units = "g m-2" - stmassxy.description = "stem mass" - - rtmassxy = scalar_grp.createVariable('rtmassxy',real_type) - rtmassxy[:] = surface["rtmassxy"] - rtmassxy.units = "g m-2" - rtmassxy.description = "fine root mass" - - woodxy = scalar_grp.createVariable('woodxy',real_type) - woodxy[:] = surface["woodxy"] - woodxy.units = "g m-2" - woodxy.description = "wood mass including woody roots" - - stblcpxy = scalar_grp.createVariable('stblcpxy',real_type) - stblcpxy[:] = surface["stblcpxy"] - stblcpxy.units = "g m-2" - stblcpxy.description = "stable carbon in deep soil" - - fastcpxy = scalar_grp.createVariable('fastcpxy',real_type) - fastcpxy[:] = surface["fastcpxy"] - fastcpxy.units = "g m-2" - fastcpxy.description = "short-lived carbon in shallow soil" - - smcwtdxy = scalar_grp.createVariable('smcwtdxy',real_type) - smcwtdxy[:] = surface["smcwtdxy"] - smcwtdxy.units = "m3 m-3" - smcwtdxy.description = "soil water content between the bottom of the soil and the water table" - - deeprechxy = scalar_grp.createVariable('deeprechxy',real_type) - deeprechxy[:] = surface["deeprechxy"] - deeprechxy.units = "m" - deeprechxy.description = "recharge to or from the water table when deep" - - rechxy = scalar_grp.createVariable('rechxy',real_type) - rechxy[:] = surface["rechxy"] - rechxy.units = "m" - rechxy.description = "recharge to or from the water table when shallow" - - snowxy = scalar_grp.createVariable('snowxy',real_type) - snowxy[:] = surface["snowxy"] - snowxy.units = "" - snowxy.description = "number of snow layers" - - albdvis = scalar_grp.createVariable('albdvis',real_type) - albdvis[:] = surface["albdvis"] - albdvis.units = "" - albdvis.description = "surface albedo direct visible" - - albdnir = scalar_grp.createVariable('albdnir',real_type) - albdnir[:] = surface["albdnir"] - albdnir.units = "" - albdnir.description = "surface albedo direct near-infrared" - - albivis = scalar_grp.createVariable('albivis',real_type) - albivis[:] = surface["albivis"] - albivis.units = "" - albivis.description = "surface albedo diffuse visible" - - albinir = scalar_grp.createVariable('albinir',real_type) - albinir[:] = surface["albinir"] - albinir.units = "" - albinir.description = "surface albedo diffuse near-infrared" - - emiss = scalar_grp.createVariable('emiss',real_type) - emiss[:] = surface["emiss"] - emiss.units = "" - emiss.description = "surface emissivity" - - #NSST initial scalar parameters - tref = scalar_grp.createVariable('tref',real_type) - tref[:] = surface["tref"] - tref.units = "K" - tref.description = "sea surface reference temperature for NSST" - - z_c = scalar_grp.createVariable('z_c',real_type) - z_c[:] = surface["z_c"] - z_c.units = "m" - z_c.description = "sub-layer cooling thickness for NSST" - - c_0 = scalar_grp.createVariable('c_0',real_type) - c_0[:] = surface["c_0"] - c_0.units = "" - c_0.description = "coefficient 1 to calculate d(Tz)/d(Ts) for NSST" - - c_d = scalar_grp.createVariable('c_d',real_type) - c_d[:] = surface["c_d"] - c_d.units = "" - c_d.description = "coefficient 2 to calculate d(Tz)/d(Ts) for NSST" - - w_0 = scalar_grp.createVariable('w_0',real_type) - w_0[:] = surface["w_0"] - w_0.units = "" - w_0.description = "coefficient 3 to calculate d(Tz)/d(Ts) for NSST" - - w_d = scalar_grp.createVariable('w_d',real_type) - w_d[:] = surface["w_d"] - w_d.units = "" - w_d.description = "coefficient 4 to calculate d(Tz)/d(Ts) for NSST" - - xt = scalar_grp.createVariable('xt',real_type) - xt[:] = surface["xt"] - xt.units = "K m" - xt.description = "heat content in diurnal thermocline layer for NSST" - - xs = scalar_grp.createVariable('xs',real_type) - xs[:] = surface["xs"] - xs.units = "ppt m" - xs.description = "salinity content in diurnal thermocline layer for NSST" - - xu = scalar_grp.createVariable('xu',real_type) - xu[:] = surface["xu"] - xu.units = "m2 s-1" - xu.description = "u-current in diurnal thermocline layer for NSST" - - xv = scalar_grp.createVariable('xv',real_type) - xv[:] = surface["xv"] - xv.units = "m2 s-1" - xv.description = "v-current in diurnal thermocline layer for NSST" - - xz = scalar_grp.createVariable('xz',real_type) - xz[:] = surface["xz"] - xz.units = "m" - xz.description = "thickness of diurnal thermocline layer for NSST" - - zm = scalar_grp.createVariable('zm',real_type) - zm[:] = surface["zm"] - zm.units = "m" - zm.description = "thickness of ocean mixed layer for NSST" - - xtts = scalar_grp.createVariable('xtts',real_type) - xtts[:] = surface["xtts"] - xtts.units = "m" - xtts.description = "sensitivity of diurnal thermocline layer heat content to surface temperature [d(xt)/d(ts)] for NSST" - - xzts = scalar_grp.createVariable('xzts',real_type) - xzts[:] = surface["xzts"] - xzts.units = "m K-1" - xzts.description = "sensitivity of diurnal thermocline layer thickness to surface temperature [d(xz)/d(ts)] for NSST" - - d_conv = scalar_grp.createVariable('d_conv',real_type) - d_conv[:] = surface["d_conv"] - d_conv.units = "m" - d_conv.description = "thickness of free convection layer for NSST" - - ifd = scalar_grp.createVariable('ifd',real_type) - ifd[:] = surface["ifd"] - ifd.units = "" - ifd.description = "index to start DTM run for NSST" - - dt_cool = scalar_grp.createVariable('dt_cool',real_type) - dt_cool[:] = surface["dt_cool"] - dt_cool.units = "K" - dt_cool.description = "sub-layer cooling amount for NSST" - - qrain = scalar_grp.createVariable('qrain',real_type) - qrain[:] = surface["qrain"] - qrain.units = "W" - qrain.description = "sensible heat due to rainfall for NSST" - - #RUC LSM - wetness = scalar_grp.createVariable('wetness',real_type) - wetness[:] = surface["wetness"] - wetness.units = "" - wetness.description = "normalized soil wetness for RUC LSM" - - clw_surf_land = scalar_grp.createVariable('clw_surf_land',real_type) - clw_surf_land[:] = surface["clw_surf_land"] - clw_surf_land.units = "kg kg-1" - clw_surf_land.description = "cloud condensed water mixing ratio at surface over land for RUC LSM" - - clw_surf_ice = scalar_grp.createVariable('clw_surf_ice',real_type) - clw_surf_ice[:] = surface["clw_surf_ice"] - clw_surf_ice.units = "kg kg-1" - clw_surf_ice.description = "cloud condensed water mixing ratio at surface over ice for RUC LSM" - - qwv_surf_land = scalar_grp.createVariable('qwv_surf_land',real_type) - qwv_surf_land[:] = surface["qwv_surf_land"] - qwv_surf_land.units = "kg kg-1" - qwv_surf_land.description = "water vapor mixing ratio at surface over land for RUC LSM" - - qwv_surf_ice = scalar_grp.createVariable('qwv_surf_ice',real_type) - qwv_surf_ice[:] = surface["qwv_surf_ice"] - qwv_surf_ice.units = "kg kg-1" - qwv_surf_ice.description = "water vapor mixing ratio at surface over ice for RUC LSM" - - tsnow_land = scalar_grp.createVariable('tsnow_land',real_type) - tsnow_land[:] = surface["tsnow_land"] - tsnow_land.units = "K" - tsnow_land.description = "snow temperature at the bottom of the first snow layer over land for RUC LSM" - - tsnow_ice = scalar_grp.createVariable('tsnow_ice',real_type) - tsnow_ice[:] = surface["tsnow_ice"] - tsnow_ice.units = "K" - tsnow_ice.description = "snow temperature at the bottom of the first snow layer over ice for RUC LSM" - - snowfall_acc_land = scalar_grp.createVariable('snowfall_acc_land',real_type) - snowfall_acc_land[:] = surface["snowfall_acc_land"] - snowfall_acc_land.units = "kg m-2" - snowfall_acc_land.description = "run-total snow accumulation on the ground over land for RUC LSM" - - snowfall_acc_ice = scalar_grp.createVariable('snowfall_acc_ice',real_type) - snowfall_acc_ice[:] = surface["snowfall_acc_ice"] - snowfall_acc_ice.units = "kg m-2" - snowfall_acc_ice.description = "run-total snow accumulation on the ground over ice for RUC LSM" - - sncovr_ice = scalar_grp.createVariable('sncovr_ice',real_type) - sncovr_ice[:] = surface["sncovr_ice"] - sncovr_ice.units = "" - sncovr_ice.description = "surface snow area fraction over ice for RUC LSM" - - lai = scalar_grp.createVariable('lai',real_type) - lai[:] = surface["lai"] - lai.units = "" - lai.description = "leaf area index for RUC LSM" + temperature_var.long_name = 'Temperature' + temperature_var[:,:] = comp_data["ta"] + + qv_var = nc_file.createVariable('qv', wp, ('time', 'lev',)) + qv_var.units = 'kg kg-1' + qv_var.long_name = 'specific humidity' + qv_var[:,:] = comp_data["qv"] + + u_var = nc_file.createVariable('u', wp, ('time', 'lev',)) + u_var.units = 'm s-1' + u_var.long_name = 'zonal wind' + u_var[:,:] = comp_data["ua"] + + v_var = nc_file.createVariable('v', wp, ('time', 'lev',)) + v_var.units = 'm s-1' + v_var.long_name = 'meridional wind' + v_var[:,:] = comp_data["va"] + + for var2d in comp_data["vars2d"]: + tempVar = nc_file.createVariable(var2d["name"], wp, ('time_ufs_history')) + tempVar.units = var2d["units"] + tempVar.long_name = var2d["long_name"] + tempVar[:] = var2d["values"] + + nc_file.close() + + return + +######################################################################################## +# +######################################################################################## +def find_date(forcing_dir): + + atm_ftag = 'atmf*.nc' + + atm_filenames = [] + for f_name in os.listdir(forcing_dir): + if fnmatch.fnmatch(f_name, atm_ftag): + atm_filenames.append(f_name) + if not atm_filenames: + message = 'No filenames matching the pattern {0} found in {1}'.format(atm_ftag,forcing_dir) + logging.critical(message) + raise Exception(message) + atm_filenames = sorted(atm_filenames) + + nc_file = Dataset('{0}/{1}'.format(forcing_dir,atm_filenames[0])) + + #starting date is in the units attribute of time + + date_string = nc_file['time'].getncattr('units').split('since ')[1] #should be in format YYYY-MM-DD HH:MM:SS nc_file.close() + + date_dict = {} + date_dict["year"] = int(date_string[0:4]) + date_dict["month"] = int(date_string[5:7]) + date_dict["day"] = int(date_string[8:10]) + date_dict["hour"] = int(date_string[11:13]) + date_dict["minute"] = int(date_string[14:16]) + date_dict["second"] = int(date_string[17:]) + + return date_dict +######################################################################################## +# +######################################################################################## def main(): setup_logging() #read in arguments - (location, indices, date, in_dir, grid_dir, tile, area, noahmp, case_name, old_chgres) = parse_arguments() + (location, indices, date, in_dir, grid_dir, forcing_dir, tile, area, case_name, + old_chgres, lam, save_comp, use_nearest) = parse_arguments() #find tile containing the point using the supergrid if no tile is specified + #if not tile and not lam: if not tile: - tile = find_tile(location, grid_dir) + tile = int(find_tile(location, grid_dir, lam)) if tile < 0: message = 'No tile was found for location {0}'.format(location) logging.critical(message) raise Exception(message) - print 'Tile found: {0}'.format(tile) + print('Tile found: {0}'.format(tile)) #find index of closest point in the tile if indices are not specified if not indices: - (tile_j, tile_i, point_lon, point_lat, dist_min) = find_loc_indices(location, grid_dir, tile) - print 'The closest point in tile {0} has indices [{1},{2}]'.format(tile,tile_i,tile_j) - print 'This index has a central longitude/latitude of [{0},{1}]'.format(point_lon,point_lat) - print 'This grid cell is approximately {0} km away from the desired location of {1} {2}'.format(dist_min/1.0E3,location[0],location[1]) + (tile_j, tile_i, point_lon, point_lat, dist_min) = find_loc_indices(location, grid_dir, tile, lam) + print('The closest point in tile {0} has indices [{1},{2}]'.format(tile,tile_i,tile_j)) + print('This index has a central longitude/latitude of [{0},{1}]'.format(point_lon,point_lat)) + print('This grid cell is approximately {0} km away from the desired location of {1} {2}'.format(dist_min/1.0E3,location[0],location[1])) else: tile_i = indices[0] tile_j = indices[1] #still need to grab the lon/lat if the tile and indices are supplied - (point_lon, point_lat) = find_lon_lat_of_indices(indices, grid_dir, tile) + (point_lon, point_lat) = find_lon_lat_of_indices(indices, grid_dir, tile, lam) - print 'This index has a central longitude/latitude of [{0},{1}]'.format(point_lon,point_lat) - - #get UFS IC data (TODO: flag to read in RESTART data rather than IC data and implement different file reads) - (state_data, surface_data, oro_data) = get_UFS_IC_data(in_dir, grid_dir, tile, tile_i, tile_j, old_chgres) + print('This index has a central longitude/latitude of [{0},{1}]'.format(point_lon,point_lat)) - #cold start NoahMP variables - if (noahmp): - surface_data = add_noahmp_coldstart(surface_data, date) + # get UFS IC data (TODO: flag to read in RESTART data rather than IC data and implement + # different file reads) + (state_data, surface_data, oro_data) = get_UFS_IC_data(in_dir, grid_dir, tile, tile_i,\ + tile_j, old_chgres, lam) + + if not date: + # date was not included on command line; look in atmf* file for initial date + date = find_date(forcing_dir) + #get grid cell area if not given if not area: - area = get_UFS_grid_area(grid_dir, tile, tile_i, tile_j) + area = get_UFS_grid_area(grid_dir, tile, tile_i, tile_j, lam) surface_data["area"] = area - - surface_data["lon"] = point_lon - surface_data["lat"] = point_lat - - #get UFS forcing data (zeros for now; only placeholder) - forcing_data = get_UFS_forcing_data(state_data["nlevs"]) - - #write SCM case file - write_SCM_case_file(state_data, surface_data, oro_data, forcing_data, case_name, date) - + surface_data["lon"] = point_lon + surface_data["lat"] = point_lat + + # Get UFS forcing data + (forcing_data, comp_data, stateREGRID) = get_UFS_forcing_data(state_data["nlevs"], state_data, \ + location, use_nearest, forcing_dir, \ + grid_dir, tile, tile_i, tile_j, lam,\ + save_comp) + + # Write SCM case file + fileOUT = write_SCM_case_file(state_data, surface_data, oro_data, forcing_data, case_name, date, \ + stateREGRID) + + # read in and remap the state variables to the first history file pressure profile and + # write them out to compare SCM output to (atmf for state variables and sfcf for physics + # tendencies) + if (save_comp): + write_comparison_file(comp_data, case_name, date, surface_data) if __name__ == '__main__': main() diff --git a/scm/etc/scripts/UFS_LSM_param.py b/scm/etc/scripts/UFS_LSM_param.py index de6efd964..f17372e1b 100755 --- a/scm/etc/scripts/UFS_LSM_param.py +++ b/scm/etc/scripts/UFS_LSM_param.py @@ -31,6 +31,7 @@ group1.add_argument('-l', '--location', help='longitude and latitude in degress E and N, respectively, separated by a space', nargs=2, type=float) group1.add_argument('-ij','--index', help='i,j indices within the tile (if known - bypasses search for closest model point to lon/lat location)', nargs=2, type=int) parser.add_argument('-g', '--grid_dir', help='directory path containing FV3 tile supergrid files', required=True) +parser.add_argument('-ic','--lsm_dir', help='directory path containing FV3 tile IC files', required=True) parser.add_argument('-t', '--tile', help='tile of desired point (if known - bypasses tile search if present)', type=int, choices=range(1,7)) ############################################################################### @@ -43,6 +44,7 @@ def parse_arguments(): location = args.location index = args.index grid_dir = args.grid_dir + lsm_dir = args.lsm_dir tile = args.tile #validate args @@ -50,6 +52,10 @@ def parse_arguments(): message = 'The directory {0} does not exist'.format(grid_dir) logging.critical(message) raise Exception(message) + if not os.path.exists(lsm_dir): + message = 'The directory {0} does not exist'.format(lsm_dir) + logging.critical(message) + raise Exception(message) if not index: if not 0 <= location[0] <= 360 : @@ -62,7 +68,7 @@ def parse_arguments(): logging.critical(message) raise Exception(message) - return (location, index, grid_dir, tile) + return (location, index, grid_dir, lsm_dir, tile) def setup_logging(): """Sets up the logging module.""" @@ -108,20 +114,20 @@ def find_tile(loc, dir): edge_1_lon = longitude[0,:] edge_1_lat = latitude[0,:] - edge_1 = zip(edge_1_lon, edge_1_lat) + edge_1 = list(zip(edge_1_lon, edge_1_lat)) edge_2_lon = longitude[:,-1] edge_2_lat = latitude[:,-1] - edge_2 = zip(edge_2_lon, edge_2_lat) + edge_2 = list(zip(edge_2_lon, edge_2_lat)) edge_3_lon = longitude[-1,:] edge_3_lat = latitude[-1,:] - edge_3 = zip(edge_3_lon, edge_3_lat) + edge_3 = list(zip(edge_3_lon, edge_3_lat)) edge_3.reverse() #need to reverse the direction of this edge to form a regular polygon edge_4_lon = longitude[:,0] edge_4_lat = latitude[:,0] - edge_4 = zip(edge_4_lon, edge_4_lat) + edge_4 = list(zip(edge_4_lon, edge_4_lat)) edge_4.reverse() #need to reverse the direction of this edge to form a regular polygon polygon_points = edge_1 + edge_2 + edge_3 + edge_4 @@ -231,9 +237,9 @@ def find_lon_lat_of_indices(indices, dir, tile): return (longitude[indices[1],indices[0]], latitude[indices[1],indices[0]]) -def get_UFS_surface_fix_data(dir, tile, i, j): +def get_UFS_surface_fix_data(fix_dir, tile, i, j): - fix_dir = dir + '/fix_sfc' + #fix_dir = dir + '/fix_sfc' filename_pattern = '*facsf.tile{0}.nc'.format(tile) for f_name in os.listdir(fix_dir): @@ -388,36 +394,36 @@ def main(): setup_logging() #read in arguments - (location, indices, grid_dir, tile) = parse_arguments() + (location, indices, grid_dir, lsm_dir, tile) = parse_arguments() #find tile containing the point using the supergrid if no tile is specified if not tile: - tile = find_tile(location, grid_dir) + tile = int(find_tile(location, grid_dir)) if tile < 0: message = 'No tile was found for location {0}'.format(location) logging.critical(message) raise Exception(message) - print 'Tile found: {0}'.format(tile) + print('Tile found: {0}'.format(tile)) #find index of closest point in the tile if indices are not specified if not indices: (tile_j, tile_i, point_lon, point_lat, dist_min) = find_loc_indices(location, grid_dir, tile) - print 'The closest point in tile {0} has indices [{1},{2}]'.format(tile,tile_i,tile_j) - print 'This index has a central longitude/latitude of [{0},{1}]'.format(point_lon,point_lat) - print 'This grid cell is approximately {0} km away from the desired location of {1} {2}'.format(dist_min/1.0E3,location[0],location[1]) + print('The closest point in tile {0} has indices [{1},{2}]'.format(tile,tile_i,tile_j)) + print('This index has a central longitude/latitude of [{0},{1}]'.format(point_lon,point_lat)) + print('This grid cell is approximately {0} km away from the desired location of {1} {2}'.format(dist_min/1.0E3,location[0],location[1])) else: tile_i = indices[0] tile_j = indices[1] #still need to grab the lon/lat if the tile and indices are supplied (point_lon, point_lat) = find_lon_lat_of_indices(indices, grid_dir, tile) - print 'This index has a central longitude/latitude of [{0},{1}]'.format(point_lon,point_lat) + print('This index has a central longitude/latitude of [{0},{1}]'.format(point_lon,point_lat)) #get grid cell area if not given #area = get_UFS_grid_area(grid_dir, tile, tile_i, tile_j) - (facsf, facwf, max_snow_alb, alvsf, alvwf, alnsf, alnwf, substrate_t, veg_greenness, max_veg_greenness, min_veg_greenness, slope_type, soil_type, veg_type) = get_UFS_surface_fix_data(grid_dir, tile, tile_i, tile_j) + (facsf, facwf, max_snow_alb, alvsf, alvwf, alnsf, alnwf, substrate_t, veg_greenness, max_veg_greenness, min_veg_greenness, slope_type, soil_type, veg_type) = get_UFS_surface_fix_data(lsm_dir, tile, tile_i, tile_j) print("facsf,facwf={0},{1}".format(facsf,facwf)) print("maximum_snow_albedo={}".format(max_snow_alb)) diff --git a/scm/etc/scripts/UFS_forcing_ensemble_generator.py b/scm/etc/scripts/UFS_forcing_ensemble_generator.py new file mode 100755 index 000000000..d057dc6cf --- /dev/null +++ b/scm/etc/scripts/UFS_forcing_ensemble_generator.py @@ -0,0 +1,190 @@ +#!/usr/bin/env python + +############################################################################### +# Dependencies +############################################################################### +import argparse +import os +from netCDF4 import Dataset +import xarray as xr +import numpy as np +import random + +############################################################################### +# Argument list +############################################################################### +parser = argparse.ArgumentParser() +parser.add_argument('-d', '--dir', help='path to UFS Regression Test output', required=True) +parser.add_argument('-n', '--case_name', help='name of case', required=True) +parser.add_argument('-lonl', '--lon_limits', help='longitude range, separated by a space', nargs=2, type=float, required=False) +parser.add_argument('-latl', '--lat_limits', help='latitude range, separated by a space', nargs=2, type=float, required=False) +parser.add_argument('-lons', '--lon_list', help='longitudes, separated by a space', nargs='*', type=float, required=False) +parser.add_argument('-lats', '--lat_list', help='latitudes, separated by a space', nargs='*', type=float, required=False) +parser.add_argument('-nens', '--nensmembers', help='number of SCM UFS ensemble memebers to create', type=int, required=False) +parser.add_argument('-dt', '--timestep', help='SCM timestep, in seconds', type=int, default = 3600) +parser.add_argument('-cres', '--C_RES', help='UFS spatial resolution', type=int, default = 96) +parser.add_argument('-sdf', '--suite', help='CCPP suite definition file to use for ensemble', default = 'SCM_GFS_v16') +parser.add_argument('-sc', '--save_comp', help='flag to save a file with UFS data for comparisons', action='store_true') +parser.add_argument('-near', '--use_nearest', help='flag to indicate using the nearest UFS history file gridpoint, no regridding',action='store_true') + +############################################################################### +# Main program +############################################################################### +def main(): + # Get command line arguments + args = parser.parse_args() + + # This asssumes using UFS Weather Model Regression Test output. + args.dir_ic = args.dir + "/INPUT/" + args.dir_grid = args.dir + "/INPUT/" + args.dir_forcing = args.dir + + # Error checking + if (args.lon_limits and args.lon_list): + print("ERROR: Can't provide explicit longitude(s) AND a longitude range") + exit() + if (args.lat_limits and args.lat_list): + print("ERROR: Can't provide explicit latitude(s) AND a latitude range") + exit() + if (args.lon_limits or args.lat_limits) and not args.nensmembers: + print("ERROR: Longitude/Latitude range provided, but NOT ensemble count.") + exit() + + if (args.nensmembers): + npts = args.nensmembers + if (args.lat_list or args.lon_list): + print("ERROR: Can't provide explicit lon/lat range AND number of points for ensemble generation.") + exit() + else: + if (args.lon_list and args.lat_list): + if (len(args.lon_list) == len(args.lat_list)): + npts = len(args.lon_list) + else: + print("ERROR: Number of longitude/latitudes are inconsistent") + exit() + + ########################################################################### + # + # Set longitude/latitude + # + ########################################################################### + if (args.nensmembers): + rng1 = np.zeros((npts), dtype=float) + rng2 = np.zeros((npts), dtype=float) + lons = np.zeros((npts), dtype=float) + lats = np.zeros((npts), dtype=float) + for ipt in range(npts): + # Here the seed is set to give the same set of points each time. + random.seed(ipt) + rng1[ipt] = random.randint(1,1000)*0.001 + rng2[ipt] = random.randint(2,1000)*0.001 + # + if args.lat_limits: + lats[ipt] = args.lat_limits[0] + (args.lat_limits[1]-args.lat_limits[0])*rng1[ipt] + else: + lats[ipt] = rng1[ipt]*180-90 + if args.lon_limits: + lons[ipt] = args.lon_limits[0] + (args.lon_limits[1]-args.lon_limits[0])*rng2[ipt] + else: + lons[ipt] = rng2[ipt]*360 + ########################################################################### + # + # Use longitude and latitude provided + # + ########################################################################### + else: + lons = np.asarray(args.lon_list) + lats = np.asarray(args.lat_list) + + ########################################################################### + # + # Create SCM case configuration (etc/case_config) file. + # + ########################################################################### + # + case_config =[{"name": "input_type", "values": str(1)}, \ + {"name": "dt", "values": str(args.timestep)}, \ + {"name": "C_RES", "values": str(args.C_RES)}] + + # What, if any, options neeed to be passsed to UFS_IC_generator.py? + com_config = '' + if args.save_comp: com_config = com_config + ' -sc' + if args.use_nearest: com_config = com_config + ' -near' + + # Create inputs to SCM + case_list = "" + case_list_nf = "" + count = 0 + run_list = [] + for pt in range(0,npts): + # Call UFS_IC_generator.py + case_name = args.case_name +"_n" + str(pt).zfill(3) + file_scminput = "../../data/processed_case_input/"+case_name+"_SCM_driver.nc" + com = "./UFS_IC_generator.py -l " +str(lons[pt]) + " " + str(lats[pt]) + \ + " -i " + args.dir_ic + " -g " + args.dir_grid + " -f " + args.dir_forcing + " -n " + case_name + com_config + print(com) + os.system(com) + + # Add case to ensemble list. + case_list = case_list + '"'+case_name+'"' + if (count != npts-1): case_list = case_list + ', ' + + # What is the surface type? (get from SCM input file) + dataset = xr.open_dataset(file_scminput) + sfc_type = int(np.round_(dataset.slmsk.values[0])) + + # Create case_config file(s) + fileOUT = "../../etc/case_config/"+case_name+".nml" + fileID = open(fileOUT, 'w') + fileID.write('$case_config') + fileID.write('\n') + fileID.write('case_name = ' + "'" + case_name + "',") + fileID.write('\n') + fileID.write('sfc_type = ' + str(sfc_type) + ",") + fileID.write('\n') + for opts in case_config: + fileID.write(opts["name"] + ' = ' + opts["values"] + ",") + fileID.write('\n') + fileID.write('$end') + fileID.write('\n') + fileID.close() + + # Add case to dictionary to be used by run_scm.py + run_list.append({"case": case_name, "suite": args.suite}) + + # + count = count + 1 + + ########################################################################### + # + # Create "multirun file list" needed by run_scm.py + # + ########################################################################### + com = "mkdir -p ../../bin/" + print(com) + os.system(com) + fileOUT = "scm_ufsens_"+args.case_name+".py" + fileID = open("../../bin/"+fileOUT, 'w') + fileID.write('run_list = [') + fileID.write('\n') + for run in run_list: + #print(' {"case": "' , run["case"] , '", "suite": "' , run["suite"] , '"},') + fileID.write(' {"case": "' + run["case"] + '", "suite": "' + run["suite"] + '"},') + fileID.write('\n') + fileID.write(' ]') + fileID.close() + + ########################################################################### + # + # Display run commands + # + ########################################################################### + print("-------------------------------------------------------------------------------------------") + print("Command(s) to execute in ccpp-scm/scm/bin/: ") + print(" ") + print("./run_scm.py --npz_type gfs --file " + fileOUT + " --timestep " + str(args.timestep)) + print("") + print("-------------------------------------------------------------------------------------------") + +if __name__ == '__main__': + main() diff --git a/scm/etc/scripts/fv3_remap.py b/scm/etc/scripts/fv3_remap.py new file mode 100755 index 000000000..ab384fa0a --- /dev/null +++ b/scm/etc/scripts/fv3_remap.py @@ -0,0 +1,1681 @@ +#!/usr/bin/env python + +import numpy as np +import math + +r3 = 1./3. +r23 = 2./3. +r12 = 1./12. + +def ppm_limiters(dm, a4, itot, lmt): + # INPUT PARAMETERS: + #real , intent(in):: dm(*) !< Linear slope + #integer, intent(in) :: itot !< Total Longitudes + #integer, intent(in) :: lmt !< 0: Standard PPM constraint 1: Improved full monotonicity constraint + # !< (Lin) 2: Positive definite constraint + # !< 3: do nothing (return immediately) + #! INPUT/OUTPUT PARAMETERS: + # real , intent(inout) :: a4(4,*) !< PPM array AA <-- a4(1,i) AL <-- a4(2,i) AR <-- a4(3,i) A6 <-- a4(4,i) + # ! LOCAL VARIABLES: + # real qmp + # real da1, da2, a6da + # real fmin + # integer i + + #! Developer: S.-J. Lin + if (lmt == 3): + return a4 + + if (lmt == 0): + #! Standard PPM constraint + for i in range(0,itot): + if(dm[i] == 0.): + a4[1,i] = a4[0,i] + a4[2,i] = a4[0,i] + a4[3,i] = 0. + else: + da1 = a4[2,i] - a4[1,i] + da2 = da1*da1 + a6da = a4[3,i]*da1 + if(a6da < -da2): + a4[3,i] = 3.*(a4[1,i]-a4[0,i]) + a4[2,i] = a4[1,i] - a4[3,i] + elif(a6da > da2): + a4[3,i] = 3.*(a4[2,i]-a4[0,i]) + a4[1,i] = a4[2,i] - a4[3,i] + elif (lmt == 1): + #! Improved full monotonicity constraint (Lin 2004) + #! Note: no need to provide first guess of A6 <-- a4(4,i) + for i in range(0,itot): + qmp = 2.*dm[i] + a4[1,i] = a4[0,i]-np.sign(qmp)*np.abs(np.min([np.abs(qmp),np.abs(a4[1,i]-a4[0,i])])) + a4[2,i] = a4[0,i]+np.sign(qmp)*np.abs(np.min([np.abs(qmp),np.abs(a4[2,i]-a4[0,i])])) + a4[3,i] = 3.*( 2.*a4[0,i] - (a4[1,i]+a4[2,i]) ) + elif (lmt == 2): + #! Positive definite constraint + for i in range(0,itot): + if( np.abs(a4[2,i]-a4[1,i]) < -a4[3,i] ): + fmin = a4[0,i]+0.25*(a4[2,i]-a4[1,i])**2/a4[3,i]+a4[3,i]*r12 + if( fmin < 0.): + if(a4[0,i] < a4[2,i] and a4[0,i] < a4[1,i]): + a4[2,i] = a4[0,i] + a4[1,i] = a4[0,i] + a4[3,i] = 0. + elif(a4[2,i] > a4[1,i]): + a4[3,i] = 3.*(a4[1,i]-a4[0,i]) + a4[2,i] = a4[1,i] - a4[3,i] + else: + a4[3,i] = 3.*(a4[2,i]-a4[0,i]) + a4[1,i] = a4[2,i] - a4[3,i] + return a4 + +def cs_limiters(im, extm, a4, iv): + #integer, intent(in) :: im + #integer, intent(in) :: iv + #logical, intent(in) :: extm(im) + #real , intent(inout) :: a4(4,im) !< PPM array + #! LOCAL VARIABLES: + #real da1, da2, a6da + #integer i + + if (iv == 0): + #! Positive definite constraint + for i in range(0,im): + if (a4[0,i] <= 0.): + a4[1,i] = a4[0,i] + a4[2,i] = a4[0,i] + a4[3,i] = 0. + else: + if (np.abs(a4[2,i]-a4[1,i]) < -a4[3,i]): + if ((a4[0,i]+0.25*(a4[2,i]-a4[1,i])**2/a4[3,i]+a4[3,i]*r12) < 0.): + #! local minimum is negative + if (a4[0,i] < a4[2,i] and a4[0,i] < a4[1,i]): + a4[2,i] = a4[0,i] + a4[1,i] = a4[0,i] + a4[3,i] = 0. + elif (a4[2,i] > a4[1,i]): + a4[3,i] = 3.*(a4[1,i]-a4[0,i]) + a4[2,i] = a4[1,i] - a4[3,i] + else: + a4[3,i] = 3.*(a4[2,i]-a4[0,i]) + a4[1,i] = a4[2,i] - a4[3,i] + elif (iv == 1): + for i in range(0,im): + if ((a4[0,i]-a4[1,i])*(a4[0,i]-a4[2,i]) >= 0.): + a4[1,i] = a4[0,i] + a4[2,i] = a4[0,i] + a4[3,i] = 0. + else: + da1 = a4[2,i] - a4[1,i] + da2 = da1**2 + a6da = a4[3,i]*da1 + if (a6da < -da2): + a4[3,i] = 3.*(a4[1,i]-a4[0,i]) + a4[2,i] = a4[1,i] - a4[3,i] + elif (a6da > da2): + a4[3,i] = 3.*(a4[2,i]-a4[0,i]) + a4[1,i] = a4[2,i] - a4[3,i] + else: + #! Standard PPM constraint + for i in range(0,im): + if (extm[i]): + a4[1,i] = a4[0,i] + a4[2,i] = a4[0,i] + a4[3,i] = 0. + else: + da1 = a4[2,i] - a4[1,i] + da2 = da1**2 + a6da = a4[3,i]*da1 + if (a6da < -da2): + a4[3,i] = 3.*(a4[1,i]-a4[0,i]) + a4[2,i] = a4[1,i] - a4[3,i] + elif (a6da > da2): + a4[3,i] = 3.*(a4[2,i]-a4[0,i]) + a4[1,i] = a4[2,i] - a4[3,i] + return a4 + +def ppm_profile(a4, delp, km, i1, i2, iv, kord): + + #! INPUT PARAMETERS: + #integer, intent(in):: iv !< iv =-1: winds iv = 0: positive definite scalars iv = 1: others iv = 2: temp (if remap_t) and w (iv=-2) + #integer, intent(in):: i1 !< Starting longitude + #integer, intent(in):: i2 !< Finishing longitude + #integer, intent(in):: km !< Vertical dimension + #integer, intent(in):: kord !< Order (or more accurately method no.): + #real , intent(in):: delp(i1:i2,km) !< Layer pressure thickness + #!INPUT/OUTPUT PARAMETERS: + #real , intent(inout):: a4(4,i1:i2,km) !< Interpolated values + #! DESCRIPTION: + #! + #! Perform the piecewise parabolic reconstruction + #! + #! !REVISION HISTORY: + #! S.-J. Lin revised at GFDL 2007 + #!----------------------------------------------------------------------- + #! local arrays: + it = i2 - i1 + 1 + + dc = np.zeros((it,km)) + h2 = np.zeros((it,km)) + delq = np.zeros((it,km)) + df2 = np.zeros((it,km)) + d4 = np.zeros((it,km)) + #real dc(i1:i2,km) + #real h2(i1:i2,km) + #real delq(i1:i2,km) + #real df2(i1:i2,km) + #real d4(i1:i2,km) + + #! local scalars: + #integer i, k, km1, lmt, it + #real fac + #real a1, a2, c1, c2, c3, d1, d2 + #real qm, dq, lac, qmp, pmp + + + + km1 = km - 1 + + for k in range(1,km): + for i in range(i1-1,i2): + delq[i,k-1] = a4[0,i,k] - a4[0,i,k-1] + d4[i,k ] = delp[i,k-1] + delp[i,k] + + for k in range(1,km1): + for i in range(i1-1,i2): + c1 = (delp[i,k-1]+0.5*delp[i,k])/d4[i,k+1] + c2 = (delp[i,k+1]+0.5*delp[i,k])/d4[i,k] + df2[i,k] = delp[i,k]*(c1*delq[i,k] + c2*delq[i,k-1]) / (d4[i,k]+delp[i,k+1]) + dc[i,k] = np.sign(df2[i,k])*np.abs(np.min([np.abs(df2[i,k]), np.max([a4[0,i,k-1],a4[0,i,k],a4[0,i,k+1]])-a4[0,i,k], a4[0,i,k]-np.min([a4[0,i,k-1],a4[0,i,k],a4[0,i,k+1]])])) + + #!----------------------------------------------------------- + #! 4th order interpolation of the provisional cell edge value + #!----------------------------------------------------------- + + for k in range(2,km1): + for i in range(i1-1,i2): + c1 = delq[i,k-1]*delp[i,k-1] / d4[i,k] + a1 = d4[i,k-1] / (d4[i,k] + delp[i,k-1]) + a2 = d4[i,k+1] / (d4[i,k] + delp[i,k]) + a4[1,i,k] = a4[0,i,k-1] + c1 + 2./(d4[i,k-1]+d4[i,k+1]) * (delp[i,k]*(c1*(a1 - a2)+a2*dc[i,k-1]) - delp[i,k-1]*a1*dc[i,k]) + + #! Area preserving cubic with 2nd deriv. = 0 at the boundaries + #! Top + for i in range(i1-1,i2): + d1 = delp[i,1] + d2 = delp[i,2] + qm = (d2*a4[0,i,0]+d1*a4[0,i,1]) / (d1+d2) + dq = 2.*(a4[0,i,1]-a4[0,i,0]) / (d1+d2) + c1 = 4.*(a4[1,i,2]-qm-d2*dq) / ( d2*(2.*d2*d2+d1*(d2+3.*d1)) ) + c3 = dq - 0.5*c1*(d2*(5.*d1+d2)-3.*d1*d1) + a4[1,i,1] = qm - 0.25*c1*d1*d2*(d2+3.*d1) + #! Top edge: + #!------------------------------------------------------- + a4[1,i,0] = d1*(2.*c1*d1**2-c3) + a4[1,i,1] + #!------------------------------------------------------- + #! a4[2,i,1] = (12./7.)*a4[1,i,1]-(13./14.)*a4[1,i,2]+(3./14.)*a4[1,i,3] + #!------------------------------------------------------- + #! No over- and undershoot condition + a4[1,i,1] = np.max([a4[1,i,1], np.min([a4[0,i,0], a4[0,i,1]])]) + a4[1,i,1] = np.min([a4[1,i,1], np.max([a4[0,i,0], a4[0,i,1]])]) + dc[i,0] = 0.5*(a4[1,i,1] - a4[0,i,0]) + + #! Enforce monotonicity within the top layer + + if (iv == 0): + for i in range(i1-1,i2): + a4[1,i,0] = np.max([0., a4[1,i,0]]) + a4[1,i,1] = np.max([0., a4[1,i,1]]) + elif (iv == -1): + for i in range(i1-1,i2): + if (a4[1,i,0]*a4[0,i,0] <= 0. ): + a4[1,i,0] = 0. + elif (np.abs(iv) == 2): + for i in range(i1-1,i2): + a4[1,i,0] = a4[0,i,0] + a4[2,i,0] = a4[0,i,0] + + #! Bottom + #! Area preserving cubic with 2nd deriv. = 0 at the surface + for i in range(i1-1,i2): + d1 = delp[i,km-1] + d2 = delp[i,km1-1] + qm = (d2*a4[0,i,km-1]+d1*a4[0,i,km1-1]) / (d1+d2) + dq = 2.*(a4[0,i,km1-1]-a4[0,i,km-1]) / (d1+d2) + c1 = (a4[1,i,km1-1]-qm-d2*dq) / (d2*(2.*d2*d2+d1*(d2+3.*d1))) + c3 = dq - 2.0*c1*(d2*(5.*d1+d2)-3.*d1*d1) + a4[1,i,km-1] = qm - c1*d1*d2*(d2+3.*d1) + #! Bottom edge: + #!----------------------------------------------------- + a4[2,i,km-1] = d1*(8.*c1*d1**2-c3) + a4[1,i,km-1] + #! dc[i,km] = 0.5*(a4[3,i,km] - a4[1,i,km]) + #!----------------------------------------------------- + #! a4[3,i,km] = (12./7.)*a4[1,i,km]-(13./14.)*a4[1,i,km-1]+(3./14.)*a4[1,i,km-2] + #! No over- and under-shoot condition + a4[1,i,km-1] = np.max([a4[1,i,km-1], np.min([a4[0,i,km-1], a4[0,i,km1-1]])]) + a4[1,i,km-1] = np.min([a4[1,i,km-1], np.max([a4[0,i,km-1], a4[0,i,km1-1]])]) + dc[i,km-1] = 0.5*(a4[0,i,km-1] - a4[1,i,km-1]) + + #! Enforce constraint on the "slope" at the surface + + ##ifdef BOT_MONO + # do i=i1,i2 + # a4(4,i,km) = 0 + # if( a4(3,i,km) * a4(1,i,km) <= 0. ) a4(3,i,km) = 0. + # d1 = a4(1,i,km) - a4(2,i,km) + # d2 = a4(3,i,km) - a4(1,i,km) + # if ( d1*d2 < 0. ) then + # a4(2,i,km) = a4(1,i,km) + # a4(3,i,km) = a4(1,i,km) + # else + # dq = sign(min(abs(d1),abs(d2),0.5*abs(delq(i,km-1))), d1) + # a4(2,i,km) = a4(1,i,km) - dq + # a4(3,i,km) = a4(1,i,km) + dq + # endif + # enddo + ##else + if (iv == 0): + for i in range(i1-1,i2): + a4[1,i,km-1] = np.max([0.,a4[1,i,km-1]]) + a4[2,i,km-1] = np.max([0.,a4[2,i,km-1]]) + elif (iv < 0): + for i in range(i1-1,i2): + if (a4[0,i,km-1]*a4[2,i,km-1] <= 0.): + a4[2,i,km-1] = 0. + ##endif + + for k in range(0,km1): + for i in range(i1-1,i2): + a4[2,i,k] = a4[1,i,k+1] + + #!----------------------------------------------------------- + #! f(s) = AL + s*[(AR-AL) + A6*(1-s)] ( 0 <= s <= 1 ) + #!----------------------------------------------------------- + #! Top 2 and bottom 2 layers always use monotonic mapping + for k in range(0,2): + for i in range(i1-1,i2): + a4[3,i,k] = 3.*(2.*a4[0,i,k] - (a4[1,i,k]+a4[2,i,k])) + a4[:,:,k] = ppm_limiters(dc[:,k], a4[:,:,k], it, 0) + + if (kord >= 7): + #!----------------------- + #! Huynh's 2nd constraint + #!----------------------- + for k in range(1,km1): + for i in range(i1-1,i2): + #! Method#1 + #! h2[i,k] = delq[i,k] - delq[i,k-1] + #! Method#2 - better + h2[i,k] = 2.*(dc[i,k+1]/delp[i,k+1] - dc[i,k-1]/delp[i,k-1]) / (delp[i,k]+0.5*(delp[i,k-1]+delp[i,k+1])) * delp[i,k]**2 + #! Method#3 + #!!! h2[i,k] = dc[i,k+1] - dc[i,k-1] + fac = 1.5 #! original quasi-monotone + + for k in range(2,km-2): + for i in range(i1-1,i2): + #! Right edges + #! qmp = a4[1,i,k] + 2.0*delq[i,k-1] + #! lac = a4[1,i,k] + fac*h2[i,k-1] + 0.5*delq[i,k-1] + pmp = 2.*dc[i,k] + qmp = a4[0,i,k] + pmp + lac = a4[0,i,k] + fac*h2[i,k-1] + dc[i,k] + a4[2,i,k] = np.min([np.max([a4[2,i,k], np.min([a4[0,i,k], qmp, lac])]), np.max([a4[0,i,k], qmp, lac])]) + #! Left edges + #! qmp = a4[1,i,k] - 2.0*delq[i,k] + #! lac = a4[1,i,k] + fac*h2[i,k+1] - 0.5*delq[i,k] + #! + qmp = a4[0,i,k] - pmp + lac = a4[0,i,k] + fac*h2[i,k+1] - dc[i,k] + a4[1,i,k] = np.min([np.max([a4[1,i,k], np.min([a4[0,i,k], qmp, lac])]), np.max([a4[0,i,k], qmp, lac])]) + #!------------- + #! Recompute A6 + #!------------- + a4[3,i,k] = 3.*(2.*a4[0,i,k] - (a4[1,i,k]+a4[2,i,k])) + #! Additional constraint to ensure positivity when kord=7 + if (iv == 0 and kord >= 6): + a4[:,:,k] = ppm_limiters(dc[:,k], a4[:,:,k], it, 2) + else: + lmt = kord - 3 + lmt = np.max([0, lmt]) + if (iv == 0): + lmt = np.min([2, lmt]) + + for k in range(2,km-2): + if( kord != 4): + for i in range(i1-1,i2): + a4[3,i,k] = 3.*(2.*a4[0,i,k] - (a4[1,i,k]+a4[2,i,k])) + + if(kord != 6): + a4[:,:,k] = ppm_limiters(dc[:,k], a4[:,:,k], it, lmt) + + for k in range(km1-1,km): + for i in range(i1-1,i2): + a4[3,i,k] = 3.*(2.*a4[0,i,k] - (a4[1,i,k]+a4[2,i,k])) + a4[:,:,k] = ppm_limiters(dc[:,k], a4[:,:,k], it, 0) + + return a4 + +def scalar_profile(qs, a4, delp, km, i1, i2, iv, kord, qmin): + #! Optimized vertical profile reconstruction: + #! Latest: Apr 2008 S.-J. Lin, NOAA/GFDL + #integer, intent(in):: i1, i2 + #integer, intent(in):: km !< vertical dimension + #integer, intent(in):: iv !< iv =-1: winds iv = 0: positive definite scalars iv = 1: others + #integer, intent(in):: kord + #real, intent(in) :: qs(i1:i2) + #real, intent(in) :: delp(i1:i2,km) !< Layer pressure thickness + #real, intent(inout):: a4(4,i1:i2,km) !< Interpolated values + #real, intent(in):: qmin + #!----------------------------------------------------------------------- + im = i2 - i1 + 1 + extm = np.zeros([im,km],dtype=bool) + ext5 = np.zeros([im,km],dtype=bool) + ext6 = np.zeros([im,km],dtype=bool) + + gam = np.zeros([im,km]) + q = np.zeros([im,km+1]) + d4 = np.zeros([im]) + + #logical, dimension(i1:i2,km):: extm, ext5, ext6 + #real gam(i1:i2,km) + #real q(i1:i2,km+1) + #real d4(i1:i2) + #real bet, a_bot, grat + #real pmp_1, lac_1, pmp_2, lac_2, x0, x1 + #integer i, k, im + + if (iv == -2): + for i in range(0,im): + gam[i,1] = 0.5 + q[i,0] = 1.5*a4[0,i,0] + for k in range(1,km-1): + for i in range(0,im): + grat = delp[i,k-1] / delp[i,k] + bet = 2. + grat + grat - gam[i,k] + q[i,k] = (3.*(a4[0,i,k-1]+a4[0,i,k]) - q[i,k-1])/bet + gam[i,k+1] = grat / bet + for i in range(0,im): + grat = delp[i,km-2] / delp[i,km-1] + q[i,km-1] = (3.*(a4[0,i,km-2]+a4[0,i,km-1]) - grat*qs[i] - q[i,km-2]) / (2. + grat + grat - gam[i,km-1]) + q[i,km] = qs[i] + for k in range(km-2,-1,-1): + for i in range(0,im): + q[i,k] = q[i,k] - gam[i,k+1]*q[i,k+1] + else: + for i in range(0,im): + grat = delp[i,1] / delp[i,0] #! grid ratio + bet = grat*(grat+0.5) + q[i,0] = ((grat+grat)*(grat+1.)*a4[0,i,0] + a4[0,i,1]) / bet + gam[i,0] = ( 1. + grat*(grat+1.5) ) / bet + for k in range(1,km): + for i in range(0,im): + d4[i] = delp[i,k-1] / delp[i,k] + bet = 2. + d4[i] + d4[i] - gam[i,k-1] + q[i,k] = ( 3.*(a4[0,i,k-1]+d4[i]*a4[0,i,k]) - q[i,k-1] )/bet + gam[i,k] = d4[i] / bet + for i in range(0,im): + a_bot = 1. + d4[i]*(d4[i]+1.5) + q[i,km] = (2.*d4[i]*(d4[i]+1.)*a4[0,i,km-1]+a4[0,i,km-2]-a_bot*q[i,km-1]) / ( d4[i]*(d4[i]+0.5) - a_bot*gam[i,km-1]) + for k in range(km-1,-1,-1): + for i in range(0,im): + q[i,k] = q[i,k] - gam[i,k]*q[i,k+1] + + + #!----- Perfectly linear scheme -------------------------------- + if (np.abs(kord) > 16): + for k in range(0,km): + for i in range(0,im): + a4[1,i,k] = q[i,k] + a4[2,i,k] = q[i,k+1] + a4[3,i,k] = 3.*(2.*a4[0,i,k] - (a4[1,i,k]+a4[2,i,k])) + return a4 + + #!----- Perfectly linear scheme -------------------------------- + #!------------------ + #! Apply constraints + #!------------------ + + #! Apply *large-scale* constraints + for i in range(0,im): + q[i,1] = np.min([q[i,1], np.max([a4[0,i,0], a4[0,i,1]])]) + q[i,1] = np.max([q[i,1], np.min([a4[0,i,0], a4[0,i,1]])]) + + for k in range(1,km): + for i in range(0,im): + gam[i,k] = a4[0,i,k] - a4[0,i,k-1] + + #! Interior: + for k in range(2,km-1): + for i in range(0,im): + if (gam[i,k-1]*gam[i,k+1] > 0.): + #! Apply large-scale constraint to ALL fields if not local max/min + q[i,k] = np.min([q[i,k], np.max([a4[0,i,k-1],a4[0,i,k]])]) + q[i,k] = np.max([q[i,k], np.min([a4[0,i,k-1],a4[0,i,k]])]) + else: + if (gam[i,k-1] > 0): + #! There exists a local max + q[i,k] = np.max([q[i,k], np.min([a4[0,i,k-1],a4[0,i,k]])]) + else: + #! There exists a local min + q[i,k] = np.min([q[i,k], np.max([a4[0,i,k-1],a4[0,i,k]])]) + if (iv == 0): + q[i,k] = np.max([0., q[i,k]]) + + #! Bottom: + for i in range(0,im): + q[i,km-1] = np.min([q[i,km-1], np.max([a4[0,i,km-2], a4[0,i,km-1]])]) + q[i,km-1] = np.max([q[i,km-1], np.min([a4[0,i,km-2], a4[0,i,km-1]])]) + + for k in range(0,km): + for i in range(0,im): + a4[1,i,k] = q[i,k ] + a4[2,i,k] = q[i,k+1] + + for k in range(0,km): + if (k == 0 or k == km-1): + for i in range(0,im): + extm[i,k] = (a4[1,i,k]-a4[0,i,k]) * (a4[2,i,k]-a4[0,i,k]) > 0. + else: + for i in range(0,im): + extm[i,k] = gam[i,k]*gam[i,k+1] < 0. + if ( np.abs(kord) > 9 ): + for i in range(0,im): + x0 = 2.*a4[0,i,k] - (a4[1,i,k]+a4[2,i,k]) + x1 = np.abs(a4[1,i,k]-a4[2,i,k]) + a4[3,i,k] = 3.*x0 + ext5[i,k] = np.abs(x0) > x1 + ext6[i,k] = np.abs(a4[3,i,k]) > x1 + + #!--------------------------- + #! Apply subgrid constraints: + #!--------------------------- + #! f(s) = AL + s*[(AR-AL) + A6*(1-s)] ( 0 <= s <= 1 ) + #! Top 2 and bottom 2 layers always use monotonic mapping + + if (iv == 0): + for i in range(0,im): + a4[1,i,0] = np.max([0., a4[1,i,0]]) + elif (iv == -1): + for i in range(0,im): + if ( a4[1,i,0]*a4[0,i,0] <= 0. ): + a4[1,i,0] = 0. + elif (iv == 2): + for i in range(0,im): + a4[1,i,0] = a4[0,i,0] + a4[2,i,0] = a4[0,i,0] + a4[3,i,0] = 0. + + if (iv != 2): + for i in range(0,im): + a4[3,i,0] = 3.*(2.*a4[0,i,0] - (a4[1,i,0]+a4[2,i,0])) + a4[:,:,0] = cs_limiters(im, extm[:,0], a4[:,:,0], 1) + + #! k=1 + for i in range(0,im): + a4[3,i,1] = 3.*(2.*a4[0,i,1] - (a4[1,i,1]+a4[2,i,1])) + a4[:,:,1] = cs_limiters(im, extm[:,1], a4[:,:,1], 2) + + #!------------------------------------- + #! Huynh's 2nd constraint for interior: + #!------------------------------------- + for k in range(2,km-2): + if (np.abs(kord) < 9): + for i in range(0,im): + #! Left edges + pmp_1 = a4[0,i,k] - 2.*gam[i,k+1] + lac_1 = pmp_1 + 1.5*gam[i,k+2] + a4[1,i,k] = np.min([np.max([a4[1,i,k], np.min([a4[0,i,k], pmp_1, lac_1])]), np.max([a4[0,i,k], pmp_1, lac_1])]) + #! Right edges + pmp_2 = a4[0,i,k] + 2.*gam[i,k] + lac_2 = pmp_2 - 1.5*gam[i,k-1] + a4[2,i,k] = np.min([np.max([a4[2,i,k], np.min([a4[0,i,k], pmp_2, lac_2])]), np.max([a4[0,i,k], pmp_2, lac_2])]) + + a4[3,i,k] = 3.*(2.*a4[0,i,k] - (a4[1,i,k]+a4[2,i,k])) + elif (np.abs(kord) == 9): + for i in range(0,im): + if (extm[i,k] and extm[i,k-1]): + #! grid-scale 2-delta-z wave detected + a4[1,i,k] = a4[0,i,k] + a4[2,i,k] = a4[0,i,k] + a4[3,i,k] = 0. + elif (extm[i,k] and extm[i,k+1]): + #! grid-scale 2-delta-z wave detected + a4[1,i,k] = a4[0,i,k] + a4[2,i,k] = a4[0,i,k] + a4[3,i,k] = 0. + elif (extm[i,k] and a4[0,i,k] < qmin): + #! grid-scale 2-delta-z wave detected + a4[1,i,k] = a4[0,i,k] + a4[2,i,k] = a4[0,i,k] + a4[3,i,k] = 0. + else: + a4[3,i,k] = 3.*(2.*a4[0,i,k] - (a4[1,i,k]+a4[2,i,k])) + #! Check within the smooth region if subgrid profile is non-monotonic + if(np.abs(a4[3,i,k]) > np.abs(a4[1,i,k]-a4[2,i,k])): + pmp_1 = a4[0,i,k] - 2.*gam[i,k+1] + lac_1 = pmp_1 + 1.5*gam[i,k+2] + a4[1,i,k] = np.min([np.max([a4[1,i,k], np.min([a4[0,i,k], pmp_1, lac_1])]), np.max([a4[0,i,k], pmp_1, lac_1])]) + pmp_2 = a4[0,i,k] + 2.*gam[i,k] + lac_2 = pmp_2 - 1.5*gam[i,k-1] + a4[2,i,k] = np.min([np.max([a4[2,i,k], np.min([a4[0,i,k], pmp_2, lac_2])]), np.max([a4[0,i,k], pmp_2, lac_2])]) + a4[3,i,k] = 3.*(2.*a4[0,i,k] - (a4[1,i,k]+a4[2,i,k])) + + elif (np.abs(kord) == 10): + for i in range(0,im): + if (ext5[i,k]): + if (ext5[i,k-1] or ext5[i,k+1]): + a4[1,i,k] = a4[0,i,k] + a4[2,i,k] = a4[0,i,k] + elif (ext6[i,k-1] or ext6[i,k+1]): + pmp_1 = a4[0,i,k] - 2.*gam[i,k+1] + lac_1 = pmp_1 + 1.5*gam[i,k+2] + a4[1,i,k] = np.min([np.max([a4[1,i,k], np.min([a4[0,i,k], pmp_1, lac_1])]), np.max([a4[0,i,k], pmp_1, lac_1])]) + pmp_2 = a4[1,i,k] + 2.*gam[i,k] + lac_2 = pmp_2 - 1.5*gam[i,k-1] + a4[2,i,k] = np.min([np.max([a4[2,i,k], np.min([a4[0,i,k], pmp_2, lac_2])]), np.max([a4[0,i,k], pmp_2, lac_2])]) + elif (ext6[i,k]): + if (ext5[i,k-1] or ext5[i,k+1]): + pmp_1 = a4[0,i,k] - 2.*gam[i,k+1] + lac_1 = pmp_1 + 1.5*gam[i,k+2] + a4[1,i,k] = np.min([np.max([a4[1,i,k], np.min([a4[0,i,k], pmp_1, lac_1])]), np.max([a4[0,i,k], pmp_1, lac_1])]) + pmp_2 = a4[0,i,k] + 2.*gam[i,k] + lac_2 = pmp_2 - 1.5*gam[i,k-1] + a4[2,i,k] = np.min([np.max([a4[2,i,k], np.min([a4[0,i,k], pmp_2, lac_2])]), np.max([a4[0,i,k], pmp_2, lac_2])]) + for i in range(0,im): + a4[3,i,k] = 3.*(2.*a4[0,i,k] - (a4[1,i,k]+a4[2,i,k])) + elif (np.abs(kord) == 12): + for i in range(0,im): + if (extm[i,k]): + a4[1,i,k] = a4[0,i,k] + a4[2,i,k] = a4[0,i,k] + a4[3,i,k] = 0. + else: #! not a local extremum + a4[3,i,k] = 6.*a4[0,i,k] - 3.*(a4[1,i,k]+a4[2,i,k]) + #! Check within the smooth region if subgrid profile is non-monotonic + if (np.abs(a4[3,i,k]) > np.abs(a4[1,i,k]-a4[2,i,k])): + pmp_1 = a4[0,i,k] - 2.*gam[i,k+1] + lac_1 = pmp_1 + 1.5*gam[i,k+2] + a4[1,i,k] = np.min([np.max([a4[1,i,k], np.min([a4[0,i,k], pmp_1, lac_1])]), np.max([a4[0,i,k], pmp_1, lac_1])]) + pmp_2 = a4[0,i,k] + 2.*gam[i,k] + lac_2 = pmp_2 - 1.5*gam[i,k-1] + a4[2,i,k] = np.min([np.max([a4[2,i,k], np.min([a4[0,i,k], pmp_2, lac_2])]), np.max([a4[0,i,k], pmp_2, lac_2])]) + a4[3,i,k] = 6.*a4[0,i,k] - 3.*(a4[1,i,k]+a4[2,i,k]) + elif (np.abs(kord) == 13): + for i in range(0,im): + if (ext6[i,k]): + if (ext6[i,k-1] and ext6[i,k+1]): + #! grid-scale 2-delta-z wave detected + a4[1,i,k] = a4[0,i,k] + a4[2,i,k] = a4[0,i,k] + for i in range(0,im): + a4[3,i,k] = 3.*(2.*a4[0,i,k] - (a4[1,i,k]+a4[2,i,k])) + elif (np.abs(kord) == 14): + for i in range(0,im): + a4[3,i,k] = 3.*(2.*a4[0,i,k] - (a4[1,i,k]+a4[2,i,k])) + elif (np.abs(kord) == 15): #! Revised abs(kord)=9 scheme + for i in range(0,im): + if (ext5[i,k] and ext5[i,k-1]): + a4[1,i,k] = a4[0,i,k] + a4[2,i,k] = a4[0,i,k] + elif (ext5[i,k] and ext5[i,k+1]): + a4[1,i,k] = a4[0,i,k] + a4[2,i,k] = a4[0,i,k] + elif (ext5[i,k] and a4[0,i,k] < qmin): + a4[1,i,k] = a4[0,i,k] + a4[2,i,k] = a4[0,i,k] + elif (ext6[i,k]): + pmp_1 = a4[0,i,k] - 2.*gam[i,k+1] + lac_1 = pmp_1 + 1.5*gam[i,k+2] + a4[1,i,k] = np.min([np.max([a4[1,i,k], np.min([a4[0,i,k], pmp_1, lac_1])]), np.max([a4[0,i,k], pmp_1, lac_1])]) + pmp_2 = a4[0,i,k] + 2.*gam[i,k] + lac_2 = pmp_2 - 1.5*gam[i,k-1] + a4[2,i,k] = np.min([np.max([a4[2,i,k], np.min([a4[0,i,k], pmp_2, lac_2])]), np.max([a4[0,i,k], pmp_2, lac_2])]) + for i in range(0,im): + a4[3,i,k] = 3.*(2.*a4[0,i,k] - (a4[1,i,k]+a4[2,i,k])) + elif (np.abs(kord) == 16): + for i in range(0,im): + if (ext5[i,k]): + if (ext5[i,k-1] or ext5[i,k+1]): + a4[1,i,k] = a4[0,i,k] + a4[2,i,k] = a4[0,i,k] + elif (ext6[i,k-1] or ext6[i,k+1]): + #! Left edges + pmp_1 = a4[0,i,k] - 2.*gam[i,k+1] + lac_1 = pmp_1 + 1.5*gam[i,k+2] + a4[1,i,k] = np.min([np.max([a4[1,i,k], np.min([a4[0,i,k], pmp_1, lac_1])]), np.max([a4[0,i,k], pmp_1, lac_1])]) + #! Right edges + pmp_2 = a4[0,i,k] + 2.*gam[i,k] + lac_2 = pmp_2 - 1.5*gam[i,k-1] + a4[2,i,k] = np.min([np.max([a4[2,i,k], np.min([a4[0,i,k], pmp_2, lac_2])]), np.max([a4[0,i,k], pmp_2, lac_2])]) + for i in range(0,im): + a4[3,i,k] = 3.*(2.*a4[0,i,k] - (a4[1,i,k]+a4[2,i,k])) + else: #! kord = 11, 13 + for i in range(0,im): + if (ext5[i,k] and (ext5[i,k-1] or ext5[i,k+1] or a4[0,i,k] < qmin)): + #! Noisy region: + a4[1,i,k] = a4[0,i,k] + a4[2,i,k] = a4[0,i,k] + a4[3,i,k] = 0. + else: + a4[3,i,k] = 3.*(2.*a4[0,i,k] - (a4[1,i,k]+a4[2,i,k])) + + #! Additional constraint to ensure positivity + if (iv == 0): + a4[:,:,k] = cs_limiters(im, extm[:,k], a4[:,:,k], 0) + + ####end for k in range(3,km-2) + + #!---------------------------------- + #! Bottom layer subgrid constraints: + #!---------------------------------- + if (iv == 0): + for i in range(0,im): + a4[2,i,km-1] = np.max([0., a4[2,i,km-1]]) + elif (iv == -1): + for i in range(0,im): + if (a4[2,i,km-1]*a4[0,i,km-1] <= 0.): + a4[2,i,km-1] = 0. + + for k in range(km-2,km): + for i in range(0,im): + a4[3,i,k] = 3.*(2.*a4[0,i,k] - (a4[1,i,k]+a4[2,i,k])) + if (k == (km-2)): + a4[:,:,k] = cs_limiters(im, extm[:,k], a4[:,:,k], 2) + if (k == km-1): + a4[:,:,k] = cs_limiters(im, extm[:,k], a4[:,:,k], 1) + + return a4 + +def map_scalar(km, pe1, q1, qs, kn, pe2, i1, i2, iv, kord, q_min): + #! iv=1 + #integer, intent(in) :: i1 !< Starting longitude + #integer, intent(in) :: i2 !< Finishing longitude + #integer, intent(in) :: iv !< Mode: 0 == constituents 1 == temp 2 == remap temp with cs scheme + #integer, intent(in) :: kord !< Method order + #integer, intent(in) :: km !< Original vertical dimension + #integer, intent(in) :: kn !< Target vertical dimension + #real, intent(in) :: qs(i1:i2) !< bottom BC + #real, intent(in) :: pe1(i1:i2,km+1) !< pressure at layer edges from model top to bottom surface in the original vertical coordinate + #real, intent(in) :: pe2(i1:i2,kn+1) !< pressure at layer edges from model top to bottom surface in the new vertical coordinate + #real, intent(in) :: q1(ibeg:iend,km) !< Field input + #! INPUT/OUTPUT PARAMETERS: + #real, intent(inout):: q2(ibeg:iend,kn) !< Field output + + im = i2 - i1 + 1 + q2 = np.zeros([im,kn]) + #real, intent(in):: q_min + + #! DESCRIPTION: + #! IV = 0: constituents + #! pe1: pressure at layer edges (from model top to bottom surface) + #! in the original vertical coordinate + #! pe2: pressure at layer edges (from model top to bottom surface) + #! in the new vertical coordinate + #! LOCAL VARIABLES: + dp1 = np.zeros([im,km]) + q4 = np.zeros([4,im,km]) + #real dp1(i1:i2,km) + #real q4(4,i1:i2,km) + #real pl, pr, qsum, dp, esl + #integer i, k, l, m, k0 + qsum = 0. + + for k in range(0,km): + for i in range(0,im): + dp1[i,k] = pe1[i,k+1] - pe1[i,k] + q4[0,i,k] = q1[i,k] + + #! Compute vertical subgrid distribution + if (kord > 7): + #print qs, q4, dp1, km, i1, i2, iv, kord, q_min + q4 = scalar_profile(qs, q4, dp1, km, i1, i2, iv, kord, q_min) + else: + q4 = ppm_profile(q4, dp1, km, i1, i2, iv, kord) + + for i in range(0,im): + k0 = 0 + for k in range(0,kn): + next_k = False + for l in range(k0,km): #AKA l-loop + #! locate the top edge: pe2(i,k) + if (pe2[i,k] >= pe1[i,l] and pe2[i,k] <= pe1[i,l+1]): + pl = (pe2[i,k]-pe1[i,l]) / dp1[i,l] + if (pe2[i,k+1] <= pe1[i,l+1]): + #! entire new grid is within the original grid + pr = (pe2[i,k+1]-pe1[i,l]) / dp1[i,l] + q2[i,k] = q4[1,i,l] + 0.5*(q4[3,i,l]+q4[2,i,l]-q4[1,i,l]) * (pr+pl)-q4[3,i,l]*r3*(pr*(pr+pl)+pl**2) + k0 = l + next_k = True + break + #goto 555 #(next iteration of "for k in range(0,kn):" loop) + else: + #! Fractional area... + qsum = (pe1[i,l+1]-pe2[i,k])*(q4[1,i,l]+0.5*(q4[3,i,l]+q4[2,i,l]-q4[1,i,l])*(1.+pl)-q4[3,i,l]*(r3*(1.+pl*(1.+pl)))) + for m in range(l+1,km): #AKA m-loop + #! locate the bottom edge: pe2(i,k+1) + if (pe2[i,k+1] > pe1[i,m+1]): + #! Whole layer + qsum = qsum + dp1[i,m]*q4[0,i,m] + else: + dp = pe2[i,k+1]-pe1[i,m] + esl = dp / dp1[i,m] + qsum = qsum + dp*(q4[1,i,m]+0.5*esl*(q4[2,i,m]-q4[1,i,m]+q4[3,i,m]*(1.-r23*esl))) + k0 = m + #goto 123 #(exit out of l-loop) + break + else: + #GJF: the following if statement is not in the fv_mapz, but it captures the case where pe2[kn] > pe1[km] where the m loop is not entered; without this, the lowest layer values are weird + if (l+1 == km): + dp = pe2[i,kn]-pe1[i,km] + esl = dp / dp1[i,km-1] + qsum = qsum + dp*(q4[1,i,km-1]+0.5*esl*(q4[2,i,km-1]-q4[1,i,km-1]+q4[3,i,km-1]*(1.-r23*esl))) + break #handles goto 123 statement below (exits out of l-loop even if m-loop successfully completes) + #continue + break + #goto 123 #(right before going to next iteration of "for k in range(1,kn):" loop) + if not next_k: + q2[i,k] = qsum / (pe2[i,k+1] - pe2[i,k]) #AKA label 123 + + return q2 + +def map1_q2 (km, pe1, q1, kn, pe2, dp2, i1, i2, iv, kord, q_min): + #! INPUT PARAMETERS: + #integer, intent(in) :: i1, i2 + #integer, intent(in) :: iv !< Mode: 0 == constituents 1 == ??? + #integer, intent(in) :: kord + #integer, intent(in) :: km !< Original vertical dimension + #integer, intent(in) :: kn !< Target vertical dimension + #real, intent(in) :: pe1(i1:i2,km+1) !< pressure at layer edges from model top to bottom surface in the original vertical coordinate + #real, intent(in) :: pe2(i1:i2,kn+1) !< pressure at layer edges from model top to bottom surface in the new vertical coordinate + #real, intent(in) :: q1(i1:i2,km) !< Field input + #real, intent(in) :: dp2(i1:i2,kn) + #real, intent(in) :: q_min + #! INPUT/OUTPUT PARAMETERS: + im = i2 - i1 + 1 + q2 = np.zeros([im,kn]) + #real, intent(inout):: q2(i1:i2,kn) !< Field output + #! LOCAL VARIABLES: + im = i2 - i1 + 1 + qs = np.zeros([im]) + dp1 = np.zeros([im,km]) + q4 = np.zeros([4,im,km]) + #real qs(i1:i2) + #real dp1(i1:i2,km) + #real q4(4,i1:i2,km) + #real pl, pr, qsum, dp, esl + #integer i, k, l, m, k0 + qsum = 0. + for k in range(0,km): + for i in range(0,im): + dp1[i,k] = pe1[i,k+1] - pe1[i,k] + q4[0,i,k] = q1[i,k] + + #! Compute vertical subgrid distribution + if (kord > 7): + q4 = scalar_profile (qs, q4, dp1, km, i1, i2, iv, kord, q_min) + else: + q4 = ppm_profile (q4, dp1, km, i1, i2, iv, kord) + + #! Mapping + for i in range(0,im): + k0 = 0 + for k in range(0,kn): + next_k = False + #print 'k new = ',k + for l in range(k0,km): + #print 'l old = ',l + #! locate the top edge: pe2(i,k) + if (pe2[i,k] >= pe1[i,l] and pe2[i,k] <= pe1[i,l+1]): + pl = (pe2[i,k]-pe1[i,l]) / dp1[i,l] + if (pe2[i,k+1] <= pe1[i,l+1]): + #! entire new grid is within the original grid + pr = (pe2[i,k+1]-pe1[i,l]) / dp1[i,l] + q2[i,k] = q4[1,i,l] + 0.5*(q4[3,i,l]+q4[2,i,l]-q4[1,i,l])*(pr+pl)-q4[3,i,l]*r3*(pr*(pr+pl)+pl**2) + k0 = l + next_k = True + #print 'new grid within old; q2 = ', q2[i,k] + break + #goto 555 #next k-loop iteration + else: + #! Fractional area... + #print k, (pe1[i,l+1]-pe2[i,k]), (q4[1,i,l]+0.5*(q4[3,i,l]+q4[2,i,l]-q4[1,i,l])*(1.+pl)-q4[3,i,l]*(r3*(1.+pl*(1.+pl)))), dp2[i,k] + qsum = (pe1[i,l+1]-pe2[i,k])*(q4[1,i,l]+0.5*(q4[3,i,l]+q4[2,i,l]-q4[1,i,l])*(1.+pl)-q4[3,i,l]*(r3*(1.+pl*(1.+pl)))) + for m in range(l+1,km): + #! locate the bottom edge: pe2(i,k+1) + if (pe2[i,k+1] > pe1[i,m+1]): + #! Whole layer.. + qsum = qsum + dp1[i,m]*q4[0,i,m] + #print 'whole layer, m = ',m + else: + dp = pe2[i,k+1]-pe1[i,m] + esl = dp / dp1[i,m] + qsum = qsum + dp*(q4[1,i,m]+0.5*esl*(q4[2,i,m]-q4[1,i,m]+q4[3,i,m]*(1.-r23*esl))) + k0 = m + #print 'partial layer, m = ',m + #goto 123 #end l-loop + break + else: + #GJF: the following if statement is not in the fv_mapz, but it captures the case where pe2[kn] > pe1[km] where the m loop is not entered; without this, the lowest layer values are weird + if (l+1 == km): + dp = pe2[i,kn]-pe1[i,km] + esl = dp / dp1[i,km-1] + qsum = qsum + dp*(q4[1,i,km-1]+0.5*esl*(q4[2,i,km-1]-q4[1,i,km-1]+q4[3,i,km-1]*(1.-r23*esl))) + break + + break + #goto 123 #end l-loop + if not next_k: + q2[i,k] = qsum / dp2[i,k] #formerly labeled 123 + #print 'result q2 ', q2[i,k] + #print q2 + #exit() + return q2 + +def cs_profile(qs, a4, delp, km, i1, i2, iv, kord): + #! Optimized vertical profile reconstruction: + #! Latest: Apr 2008 S.-J. Lin, NOAA/GFDL + #integer, intent(in):: i1, i2 + #integer, intent(in):: km !< vertical dimension + #integer, intent(in):: iv !< iv =-1: winds iv = 0: positive definite scalars iv = 1: others + #integer, intent(in):: kord + #real, intent(in) :: qs(i1:i2) + #real, intent(in) :: delp(i1:i2,km) !< Layer pressure thickness + #real, intent(inout):: a4(4,i1:i2,km) !< Interpolated values + #real, intent(in):: qmin + #!----------------------------------------------------------------------- + im = i2 - i1 + 1 + extm = np.zeros([im,km],dtype=bool) + ext5 = np.zeros([im,km],dtype=bool) + ext6 = np.zeros([im,km],dtype=bool) + + gam = np.zeros([im,km]) + q = np.zeros([im,km+1]) + d4 = np.zeros([im]) + + #logical, dimension(i1:i2,km):: extm, ext5, ext6 + #real gam(i1:i2,km) + #real q(i1:i2,km+1) + #real d4(i1:i2) + #real bet, a_bot, grat + #real pmp_1, lac_1, pmp_2, lac_2, x0, x1 + #integer i, k, im + + if (iv == -2): + for i in range(0,im): + gam[i,1] = 0.5 + q[i,0] = 1.5*a4[0,i,0] + for k in range(1,km-1): + for i in range(0,im): + grat = delp[i,k-1] / delp[i,k] + bet = 2. + grat + grat - gam[i,k] + q[i,k] = (3.*(a4[0,i,k-1]+a4[0,i,k]) - q[i,k-1])/bet + gam[i,k+1] = grat / bet + for i in range(0,im): + grat = delp[i,km-2] / delp[i,km-1] + q[i,km-1] = (3.*(a4[0,i,km-2]+a4[0,i,km-1]) - grat*qs[i] - q[i,km-2]) / (2. + grat + grat - gam[i,km-1]) + q[i,km] = qs[i] + for k in range(km-2,-1,-1): + for i in range(0,im): + q[i,k] = q[i,k] - gam[i,k+1]*q[i,k+1] + else: + for i in range(0,im): + grat = delp[i,1] / delp[i,0] #! grid ratio + bet = grat*(grat+0.5) + q[i,0] = ((grat+grat)*(grat+1.)*a4[0,i,0] + a4[0,i,1]) / bet + gam[i,0] = ( 1. + grat*(grat+1.5) ) / bet + for k in range(1,km): + for i in range(0,im): + d4[i] = delp[i,k-1] / delp[i,k] + bet = 2. + d4[i] + d4[i] - gam[i,k-1] + q[i,k] = ( 3.*(a4[0,i,k-1]+d4[i]*a4[0,i,k]) - q[i,k-1] )/bet + gam[i,k] = d4[i] / bet + for i in range(0,im): + a_bot = 1. + d4[i]*(d4[i]+1.5) + q[i,km] = (2.*d4[i]*(d4[i]+1.)*a4[0,i,km-1]+a4[0,i,km-2]-a_bot*q[i,km-1]) / ( d4[i]*(d4[i]+0.5) - a_bot*gam[i,km-1]) + for k in range(km-1,-1,-1): + for i in range(0,im): + q[i,k] = q[i,k] - gam[i,k]*q[i,k+1] + + + #!----- Perfectly linear scheme -------------------------------- + if (np.abs(kord) > 16): + for k in range(0,km): + for i in range(0,im): + a4[1,i,k] = q[i,k] + a4[2,i,k] = q[i,k+1] + a4[3,i,k] = 3.*(2.*a4[0,i,k] - (a4[1,i,k]+a4[2,i,k])) + return a4 + + #!----- Perfectly linear scheme -------------------------------- + #!------------------ + #! Apply constraints + #!------------------ + + #! Apply *large-scale* constraints + for i in range(0,im): + q[i,1] = np.min([q[i,1], np.max([a4[0,i,0], a4[0,i,1]])]) + q[i,1] = np.max([q[i,1], np.min([a4[0,i,0], a4[0,i,1]])]) + + for k in range(1,km): + for i in range(0,im): + gam[i,k] = a4[0,i,k] - a4[0,i,k-1] + + #! Interior: + for k in range(2,km-1): + for i in range(0,im): + if (gam[i,k-1]*gam[i,k+1] > 0.): + #! Apply large-scale constraint to ALL fields if not local max/min + q[i,k] = np.min([q[i,k], np.max([a4[0,i,k-1],a4[0,i,k]])]) + q[i,k] = np.max([q[i,k], np.min([a4[0,i,k-1],a4[0,i,k]])]) + else: + if (gam[i,k-1] > 0): + #! There exists a local max + q[i,k] = np.max([q[i,k], np.min([a4[0,i,k-1],a4[0,i,k]])]) + else: + #! There exists a local min + q[i,k] = np.min([q[i,k], np.max([a4[0,i,k-1],a4[0,i,k]])]) + if (iv == 0): + q[i,k] = np.max([0., q[i,k]]) + + #! Bottom: + for i in range(0,im): + q[i,km-1] = np.min([q[i,km-1], np.max([a4[0,i,km-2], a4[0,i,km-1]])]) + q[i,km-1] = np.max([q[i,km-1], np.min([a4[0,i,km-2], a4[0,i,km-1]])]) + + for k in range(0,km): + for i in range(0,im): + a4[1,i,k] = q[i,k ] + a4[2,i,k] = q[i,k+1] + + for k in range(0,km): + if (k == 0 or k == km-1): + for i in range(0,im): + extm[i,k] = (a4[1,i,k]-a4[0,i,k]) * (a4[2,i,k]-a4[0,i,k]) > 0. + else: + for i in range(0,im): + extm[i,k] = gam[i,k]*gam[i,k+1] < 0. + if ( np.abs(kord) > 9 ): + for i in range(0,im): + x0 = 2.*a4[0,i,k] - (a4[1,i,k]+a4[2,i,k]) + x1 = np.abs(a4[1,i,k]-a4[2,i,k]) + a4[3,i,k] = 3.*x0 + ext5[i,k] = np.abs(x0) > x1 + ext6[i,k] = np.abs(a4[3,i,k]) > x1 + + #!--------------------------- + #! Apply subgrid constraints: + #!--------------------------- + #! f(s) = AL + s*[(AR-AL) + A6*(1-s)] ( 0 <= s <= 1 ) + #! Top 2 and bottom 2 layers always use monotonic mapping + + if (iv == 0): + for i in range(0,im): + a4[1,i,0] = np.max([0., a4[1,i,0]]) + elif (iv == -1): + for i in range(0,im): + if ( a4[1,i,0]*a4[0,i,0] <= 0. ): + a4[1,i,0] = 0. + elif (iv == 2): + for i in range(0,im): + a4[1,i,0] = a4[0,i,0] + a4[2,i,0] = a4[0,i,0] + a4[3,i,0] = 0. + + if (iv != 2): + for i in range(0,im): + a4[3,i,0] = 3.*(2.*a4[0,i,0] - (a4[1,i,0]+a4[2,i,0])) + a4[:,:,0] = cs_limiters(im, extm[:,0], a4[:,:,0], 1) + + #! k=1 + for i in range(0,im): + a4[3,i,1] = 3.*(2.*a4[0,i,1] - (a4[1,i,1]+a4[2,i,1])) + a4[:,:,1] = cs_limiters(im, extm[:,1], a4[:,:,1], 2) + + #!------------------------------------- + #! Huynh's 2nd constraint for interior: + #!------------------------------------- + for k in range(2,km-2): + if (np.abs(kord) < 9): + for i in range(0,im): + #! Left edges + pmp_1 = a4[0,i,k] - 2.*gam[i,k+1] + lac_1 = pmp_1 + 1.5*gam[i,k+2] + a4[1,i,k] = np.min([np.max([a4[1,i,k], np.min([a4[0,i,k], pmp_1, lac_1])]), np.max([a4[0,i,k], pmp_1, lac_1])]) + #! Right edges + pmp_2 = a4[0,i,k] + 2.*gam[i,k] + lac_2 = pmp_2 - 1.5*gam[i,k-1] + a4[2,i,k] = np.min([np.max([a4[2,i,k], np.min([a4[0,i,k], pmp_2, lac_2])]), np.max([a4[0,i,k], pmp_2, lac_2])]) + + a4[3,i,k] = 3.*(2.*a4[0,i,k] - (a4[1,i,k]+a4[2,i,k])) + elif (np.abs(kord) == 9): + for i in range(0,im): + if (extm[i,k] and extm[i,k-1]): + #! grid-scale 2-delta-z wave detected + a4[1,i,k] = a4[0,i,k] + a4[2,i,k] = a4[0,i,k] + a4[3,i,k] = 0. + elif (extm[i,k] and extm[i,k+1]): + #! grid-scale 2-delta-z wave detected + a4[1,i,k] = a4[0,i,k] + a4[2,i,k] = a4[0,i,k] + a4[3,i,k] = 0. + else: + a4[3,i,k] = 6.*a4[0,i,k] - 3.*(a4[1,i,k]+a4[2,i,k]) + #! Check within the smooth region if subgrid profile is non-monotonic + if(np.abs(a4[3,i,k]) > np.abs(a4[1,i,k]-a4[2,i,k])): + pmp_1 = a4[0,i,k] - 2.*gam[i,k+1] + lac_1 = pmp_1 + 1.5*gam[i,k+2] + a4[1,i,k] = np.min([np.max([a4[1,i,k], np.min([a4[0,i,k], pmp_1, lac_1])]), np.max([a4[0,i,k], pmp_1, lac_1])]) + pmp_2 = a4[0,i,k] + 2.*gam[i,k] + lac_2 = pmp_2 - 1.5*gam[i,k-1] + a4[2,i,k] = np.min([np.max([a4[2,i,k], np.min([a4[0,i,k], pmp_2, lac_2])]), np.max([a4[0,i,k], pmp_2, lac_2])]) + a4[3,i,k] = 6.*a4[0,i,k] - 3.*(a4[1,i,k]+a4[2,i,k]) + + elif (np.abs(kord) == 10): + for i in range(0,im): + if (ext5[i,k]): + if (ext5[i,k-1] or ext5[i,k+1]): + a4[1,i,k] = a4[0,i,k] + a4[2,i,k] = a4[0,i,k] + elif (ext6[i,k-1] or ext6[i,k+1]): + pmp_1 = a4[0,i,k] - 2.*gam[i,k+1] + lac_1 = pmp_1 + 1.5*gam[i,k+2] + a4[1,i,k] = np.min([np.max([a4[1,i,k], np.min([a4[0,i,k], pmp_1, lac_1])]), np.max([a4[0,i,k], pmp_1, lac_1])]) + pmp_2 = a4[1,i,k] + 2.*gam[i,k] + lac_2 = pmp_2 - 1.5*gam[i,k-1] + a4[2,i,k] = np.min([np.max([a4[2,i,k], np.min([a4[0,i,k], pmp_2, lac_2])]), np.max([a4[0,i,k], pmp_2, lac_2])]) + elif (ext6[i,k]): + if (ext5[i,k-1] or ext5[i,k+1]): + pmp_1 = a4[0,i,k] - 2.*gam[i,k+1] + lac_1 = pmp_1 + 1.5*gam[i,k+2] + a4[1,i,k] = np.min([np.max([a4[1,i,k], np.min([a4[0,i,k], pmp_1, lac_1])]), np.max([a4[0,i,k], pmp_1, lac_1])]) + pmp_2 = a4[0,i,k] + 2.*gam[i,k] + lac_2 = pmp_2 - 1.5*gam[i,k-1] + a4[2,i,k] = np.min([np.max([a4[2,i,k], np.min([a4[0,i,k], pmp_2, lac_2])]), np.max([a4[0,i,k], pmp_2, lac_2])]) + for i in range(0,im): + a4[3,i,k] = 3.*(2.*a4[0,i,k] - (a4[1,i,k]+a4[2,i,k])) + elif (np.abs(kord) == 12): + for i in range(0,im): + if (extm[i,k]): + a4[1,i,k] = a4[0,i,k] + a4[2,i,k] = a4[0,i,k] + a4[3,i,k] = 0. + else: #! not a local extremum + a4[3,i,k] = 6.*a4[0,i,k] - 3.*(a4[1,i,k]+a4[2,i,k]) + #! Check within the smooth region if subgrid profile is non-monotonic + if (np.abs(a4[3,i,k]) > np.abs(a4[1,i,k]-a4[2,i,k])): + pmp_1 = a4[0,i,k] - 2.*gam[i,k+1] + lac_1 = pmp_1 + 1.5*gam[i,k+2] + a4[1,i,k] = np.min([np.max([a4[1,i,k], np.min([a4[0,i,k], pmp_1, lac_1])]), np.max([a4[0,i,k], pmp_1, lac_1])]) + pmp_2 = a4[0,i,k] + 2.*gam[i,k] + lac_2 = pmp_2 - 1.5*gam[i,k-1] + a4[2,i,k] = np.min([np.max([a4[2,i,k], np.min([a4[0,i,k], pmp_2, lac_2])]), np.max([a4[0,i,k], pmp_2, lac_2])]) + a4[3,i,k] = 6.*a4[0,i,k] - 3.*(a4[1,i,k]+a4[2,i,k]) + elif (np.abs(kord) == 13): + for i in range(0,im): + if (ext6[i,k]): + if (ext6[i,k-1] and ext6[i,k+1]): + #! grid-scale 2-delta-z wave detected + a4[1,i,k] = a4[0,i,k] + a4[2,i,k] = a4[0,i,k] + for i in range(0,im): + a4[3,i,k] = 3.*(2.*a4[0,i,k] - (a4[1,i,k]+a4[2,i,k])) + elif (np.abs(kord) == 14): + for i in range(0,im): + a4[3,i,k] = 3.*(2.*a4[0,i,k] - (a4[1,i,k]+a4[2,i,k])) + elif (np.abs(kord) == 15): #! Revised abs(kord)=9 scheme + for i in range(0,im): + if (ext5[i,k] ): + if (ext5[i,k-1] or ext5[i,k+1]): + a4[1,i,k] = a4[0,i,k] + a4[2,i,k] = a4[0,i,k] + elif (ext6[i,k]): + #! Check within the smooth region if subgrid profile is non-monotonic + pmp_1 = a4[0,i,k] - 2.*gam[i,k+1] + lac_1 = pmp_1 + 1.5*gam[i,k+2] + a4[1,i,k] = np.min([np.max([a4[1,i,k], np.min([a4[0,i,k], pmp_1, lac_1])]), np.max([a4[0,i,k], pmp_1, lac_1])]) + pmp_2 = a4[0,i,k] + 2.*gam[i,k] + lac_2 = pmp_2 - 1.5*gam[i,k-1] + a4[2,i,k] = np.min([np.max([a4[2,i,k], np.min([a4[0,i,k], pmp_2, lac_2])]), np.max([a4[0,i,k], pmp_2, lac_2])]) + for i in range(0,im): + a4[3,i,k] = 3.*(2.*a4[0,i,k] - (a4[1,i,k]+a4[2,i,k])) + elif (np.abs(kord) == 16): + for i in range(0,im): + if (ext5[i,k]): + if (ext5[i,k-1] or ext5[i,k+1]): + a4[1,i,k] = a4[0,i,k] + a4[2,i,k] = a4[0,i,k] + elif (ext6[i,k-1] or ext6[i,k+1]): + #! Left edges + pmp_1 = a4[0,i,k] - 2.*gam[i,k+1] + lac_1 = pmp_1 + 1.5*gam[i,k+2] + a4[1,i,k] = np.min([np.max([a4[1,i,k], np.min([a4[0,i,k], pmp_1, lac_1])]), np.max([a4[0,i,k], pmp_1, lac_1])]) + #! Right edges + pmp_2 = a4[0,i,k] + 2.*gam[i,k] + lac_2 = pmp_2 - 1.5*gam[i,k-1] + a4[2,i,k] = np.min([np.max([a4[2,i,k], np.min([a4[0,i,k], pmp_2, lac_2])]), np.max([a4[0,i,k], pmp_2, lac_2])]) + for i in range(0,im): + a4[3,i,k] = 3.*(2.*a4[0,i,k] - (a4[1,i,k]+a4[2,i,k])) + else: #! kord = 11 + for i in range(0,im): + if (ext5[i,k] and (ext5[i,k-1] or ext5[i,k+1])): + #! Noisy region: + a4[1,i,k] = a4[0,i,k] + a4[2,i,k] = a4[0,i,k] + a4[3,i,k] = 0. + else: + a4[3,i,k] = 3.*(2.*a4[0,i,k] - (a4[1,i,k]+a4[2,i,k])) + + #! Additional constraint to ensure positivity + if (iv == 0): + a4[:,:,k] = cs_limiters(im, extm[:,k], a4[:,:,k], 0) + + ####end for k in range(3,km-2) + + #!---------------------------------- + #! Bottom layer subgrid constraints: + #!---------------------------------- + if (iv == 0): + for i in range(0,im): + a4[2,i,km-1] = np.max([0., a4[2,i,km-1]]) + elif (iv == -1): + for i in range(0,im): + if (a4[2,i,km-1]*a4[0,i,km-1] <= 0.): + a4[2,i,km-1] = 0. + + for k in range(km-2,km): + for i in range(0,im): + a4[3,i,k] = 3.*(2.*a4[0,i,k] - (a4[1,i,k]+a4[2,i,k])) + if (k == (km-2)): + a4[:,:,k] = cs_limiters(im, extm[:,k], a4[:,:,k], 2) + if (k == km-1): + a4[:,:,k] = cs_limiters(im, extm[:,k], a4[:,:,k], 1) + + return a4 + +def mappm (km, pe1, q1, kn, pe2, i1, i2, iv, kord, ptop): + #! IV = 0: constituents + #! IV = 1: potential temp + #! IV =-1: winds + + #! Mass flux preserving mapping: q1(im,km) -> q2(im,kn) + + #! pe1: pressure at layer edges (from model top to bottom surface) + #! in the original vertical coordinate + #! pe2: pressure at layer edges (from model top to bottom surface) + #! in the new vertical coordinate + + # integer, intent(in):: i1, i2, km, kn, kord, iv + # real, intent(in ):: pe1(i1:i2,km+1), pe2(i1:i2,kn+1) !< pe1: pressure at layer edges from model top to bottom + # !! surface in the ORIGINAL vertical coordinate + # !< pe2: pressure at layer edges from model top to bottom + # !! surface in the NEW vertical coordinate + #! Mass flux preserving mapping: q1(im,km) -> q2(im,kn) + # real, intent(in ):: q1(i1:i2,km) + # real, intent(out):: q2(i1:i2,kn) + # real, intent(IN) :: ptop + #! local + # real qs(i1:i2) + # real dp1(i1:i2,km) + # real a4(4,i1:i2,km) + # integer i, k, l + # integer k0, k1 + # real pl, pr, tt, delp, qsum, dpsum, esl + im = i2 - i1 + 1 + dp1 = np.zeros([im,km]) + a4 = np.zeros([4,im,km]) + q2 = np.zeros([im,kn]) + qs = np.zeros(im) + + for k in range(0,km): + for i in range(0,im): + dp1[i,k] = pe1[i,k+1] - pe1[i,k] + a4[0,i,k] = q1[i,k] + + if ( kord > 7 ): + a4 = cs_profile( qs, a4, dp1, km, i1, i2, iv, kord ) + else: + a4 = ppm_profile( a4, dp1, km, i1, i2, iv, kord ) + + #!------------------------------------ + #! Lowest layer: constant distribution + #!------------------------------------ + ##ifdef NGGPS_SUBMITTED + # do i=i1,i2 + # a4(2,i,km) = q1(i,km) + # a4(3,i,km) = q1(i,km) + # a4(4,i,km) = 0. + # enddo + #endif + qsum = 0. + for i in range(0,im): + k0 = 0 + for k in range(0,kn): + next_k = False + if (pe2[i,k] <= pe1[i,0]): + #! above old ptop + q2[i,k] = q1[i,0] + elif (pe2[i,k] >= pe1[i,km]): + #! Entire grid below old ps + ##ifdef NGGPS_SUBMITTED + # q2(i,k) = a4(3,i,km) ! this is not good. + #else + q2[i,k] = q1[i,km-1] + #endif + else: + for l in range(k0,km): + #! locate the top edge at pe2(i,k) + if ( pe2[i,k] >= pe1[i,l] and pe2[i,k] <= pe1[i,l+1]): + k0 = l + pl = (pe2[i,k]-pe1[i,l]) / dp1[i,l] + if (pe2[i,k+1] <= pe1[i,l+1]): + #! entire new grid is within the original grid + pr = (pe2[i,k+1]-pe1[i,l]) / dp1[i,l] + tt = r3*(pr*(pr+pl)+pl**2) + q2[i,k] = a4[1,i,l] + 0.5*(a4[3,i,l]+a4[2,i,l]-a4[1,i,l])*(pr+pl)-a4[3,i,l]*tt + next_k = True + break + #goto 555 + else: + #! Fractional area... + delp = pe1[i,l+1] - pe2[i,k] + tt = r3*(1.+pl*(1.+pl)) + qsum = delp*(a4[1,i,l]+0.5*(a4[3,i,l]+a4[2,i,l]-a4[1,i,l])*(1.+pl)-a4[3,i,l]*tt) + dpsum = delp + k1 = l + 1 + break + #goto 111 + if not next_k: + #labeled 111 + for l in range(k1,km): + if( pe2[i,k+1] > pe1[i,l+1] ): + #! Whole layer.. + qsum = qsum + dp1[i,l]*q1[i,l] + dpsum = dpsum + dp1[i,l] + else: + delp = pe2[i,k+1]-pe1[i,l] + esl = delp / dp1[i,l] + qsum = qsum + delp * (a4[1,i,l]+0.5*esl*(a4[2,i,l]-a4[1,i,l]+a4[3,i,l]*(1.-r23*esl))) + dpsum = dpsum + delp + k0 = l + break #goto 123 + else: #when l-loop completes without breaking + delp = pe2[i,k+1] - pe1[i,km] #should this be km? + if (delp > 0.): + #! Extended below old ps + ##ifdef NGGPS_SUBMITTED + #qsum = qsum + delp * a4(3,i,km) ! not good. + ##else + qsum = qsum + delp * q1[i,km-1] # should this be km-1? + ##endif + dpsum = dpsum + delp + q2[i,k] = qsum / dpsum #formerly labeled 123 + + return q2 + +def map1_ppm(km, pe1, q1, qs, kn, pe2, i1, i2, iv, kord): +# subroutine map1_ppm( km, pe1, q1, qs, & +# kn, pe2, q2, i1, i2, & +# j, ibeg, iend, jbeg, jend, iv, kord) +# integer, intent(in) :: i1 !< Starting longitude +# integer, intent(in) :: i2 !< Finishing longitude +# integer, intent(in) :: iv !< Mode: 0 == constituents 1 == ??? 2 == remap temp with cs scheme +# integer, intent(in) :: kord !< Method order +# integer, intent(in) :: j !< Current latitude +# integer, intent(in) :: ibeg, iend, jbeg, jend +# integer, intent(in) :: km !< Original vertical dimension +# integer, intent(in) :: kn !< Target vertical dimension +# real, intent(in) :: qs(i1:i2) !< bottom BC +# real, intent(in) :: pe1(i1:i2,km+1) !< pressure at layer edges from model top to bottom surface in the original vertical coordinate +# real, intent(in) :: pe2(i1:i2,kn+1) !< pressure at layer edges from model top to bottom surface in the new vertical coordinate +# real, intent(in) :: q1(ibeg:iend,jbeg:jend,km) !< Field input +# ! INPUT/OUTPUT PARAMETERS: +# real, intent(inout):: q2(ibeg:iend,jbeg:jend,kn) !< Field output +# +# ! DESCRIPTION: +# ! IV = 0: constituents +# ! pe1: pressure at layer edges (from model top to bottom surface) +# ! in the original vertical coordinate +# ! pe2: pressure at layer edges (from model top to bottom surface) +# ! in the new vertical coordinate +# +# ! LOCAL VARIABLES: +# real dp1(i1:i2,km) +# real q4(4,i1:i2,km) +# real pl, pr, qsum, dp, esl +# integer i, k, l, m, k0 +# + im = i2 - i1 + 1 + q2 = np.zeros([im,kn]) + + qs = np.zeros([im]) + dp1 = np.zeros([im,km]) + q4 = np.zeros([4,im,km]) + qsum = 0. + for k in range(0,km): + for i in range(i1-1,i2): + dp1[i,k] = pe1[i,k+1] - pe1[i,k] + q4[0,i,k] = q1[i,k] +# ! Compute vertical subgrid distribution + if (kord > 7): + q4 = cs_profile( qs, q4, dp1, km, i1, i2, iv, kord ) + else: + q4 = ppm_profile( q4, dp1, km, i1, i2, iv, kord ) + + for i in range(i1-1,i2): + k0 = 0 + for k in range(0,kn): + next_k = False + for l in range(k0,km): + # ! locate the top edge: pe2(i,k) + if( pe2[i,k] >= pe1[i,l] and pe2[i,k] <= pe1[i,l+1] ): + pl = (pe2[i,k]-pe1[i,l]) / dp1[i,l] + if( pe2[i,k+1] <= pe1[i,l+1] ): + # ! entire new grid is within the original grid + pr = (pe2[i,k+1]-pe1[i,l]) / dp1[i,l] + q2[i,k] = q4[1,i,l] + 0.5*(q4[3,i,l]+q4[2,i,l]-q4[1,i,l])*(pr+pl)-q4[3,i,l]*r3*(pr*(pr+pl)+pl**2) + k0 = l + next_k = True + #print 'new grid within old; q2 = ', q2[i,k] + break + #goto 555 #next k-loop iteration + else: + # ! Fractional area... + qsum = (pe1[i,l+1]-pe2[i,k])*(q4[1,i,l]+0.5*(q4[3,i,l]+q4[2,i,l]-q4[1,i,l])*(1.+pl)-q4[3,i,l]*(r3*(1.+pl*(1.+pl)))) + for m in range(l+1,km): # was do m = l+1,km + # ! locate the bottom edge: pe2(i,k+1) + if( pe2[i,k+1] > pe1[i,m+1] ): + # ! Whole layer + qsum = qsum + dp1[i,m]*q4[0,i,m] + else: + dp = pe2[i,k+1]-pe1[i,m] + esl = dp / dp1[i,m] + qsum = qsum + dp*(q4[1,i,m]+0.5*esl*(q4[2,i,m]-q4[1,i,m]+q4[3,i,m]*(1.-r23*esl))) + k0 = m + # goto 123 + break + else: + #GJF: the following if statement is not in the fv_mapz, but it captures the case where pe2[kn] > pe1[km] where the m loop is not entered; without this, the lowest layer values are weird + if (l+1 == km): + dp = pe2[i,kn]-pe1[i,km] + esl = dp / dp1[i,km-1] + qsum = qsum + dp*(q4[1,i,km-1]+0.5*esl*(q4[2,i,km-1]-q4[1,i,km-1]+q4[3,i,km-1]*(1.-r23*esl))) + break + + break + #goto 123 #end l-loop + if not next_k: + q2[i,k] = qsum / ( pe2[i,k+1] - pe2[i,k] ) #formerly labeled 123 + + return q2 + + +def fillq(im, km, nq, q, dp): + + for ic in range(0,nq): + for k in range(km-1,0,-1): + k1 = k-1 + for i in range(0,im): + if( q[i,k,ic] < 0. ): + q[i,k1,ic] = q[i,k1,ic] + q[i,k,ic]*dp[i,k]/dp[i,k1] + q[i,k ,ic] = 0. + + #! Top down: + for k in range(0,km-1): + k1 = k+1 + for i in range(0,im): + if( q[i,k,ic] < 0. ): + q[i,k1,ic] = q[i,k1,ic] + q[i,k,ic]*dp[i,k]/dp[i,k1] + q[i,k ,ic] = 0. + + return q + +def fillz(im, km, nq, q, dp): + #integer, intent(in):: im !< No. of longitudes + #integer, intent(in):: km !< No. of levels + #integer, intent(in):: nq !< Total number of tracers + #real , intent(in):: dp(im,km) !< pressure thickness + #real , intent(inout) :: q(im,km,nq) !< tracer mixing ratio + #! LOCAL VARIABLES: + #logical:: zfix(im) + #real :: dm(km) + #integer i, k, ic, k1 + #real qup, qly, dup, dq, sum0, sum1, fac + + dm = np.zeros([km]) + + #print ('orig q') + #print q + + for ic in range(0,nq): + for i in range(0,im): + #top layer + if( q[i,0,ic] < 0. ): + q[i,1,ic] = q[i,1,ic] + q[i,0,ic]*dp[i,0]/dp[i,1] + q[i,0,ic] = 0. + #! Interior + zfix = [False] * im + for k in range(1,km-1): + for i in range(0,im): + if( q[i,k,ic] < 0. ): + #print('neg in layer',k,q[i,k,ic]) + zfix[i] = True + if ( q[i,k-1,ic] > 0. ): + #print('borrow from above') + #! Borrow from above + dq = np.min( [q[i,k-1,ic]*dp[i,k-1], -q[i,k,ic]*dp[i,k]] ) + q[i,k-1,ic] = q[i,k-1,ic] - dq/dp[i,k-1] + q[i,k ,ic] = q[i,k ,ic] + dq/dp[i,k ] + if ( q[i,k,ic] < 0.0 and q[i,k+1,ic] > 0. ): + #! Borrow from below: + #print('borrow from below') + dq = np.min ( [q[i,k+1,ic]*dp[i,k+1], -q[i,k,ic]*dp[i,k]] ) + q[i,k+1,ic] = q[i,k+1,ic] - dq/dp[i,k+1] + q[i,k ,ic] = q[i,k ,ic] + dq/dp[i,k ] + #print ('new q',q[i,k ,ic]) + #! Bottom layer + k = km-1 + for i in range(0,im): + if( q[i,k,ic] < 0. and q[i,k-1,ic] > 0.): + zfix[i] = True + #! Borrow from above + qup = q[i,k-1,ic]*dp[i,k-1] + qly = -q[i,k ,ic]*dp[i,k ] + dup = np.min([qly, qup]) + q[i,k-1,ic] = q[i,k-1,ic] - dup/dp[i,k-1] + q[i,k, ic] = q[i,k, ic] + dup/dp[i,k ] + + #! Perform final check and non-local fix if needed + for i in range(0,im): + if ( zfix[i] ): + sum0 = 0. + for k in range(1,km): + dm[k] = q[i,k,ic]*dp[i,k] + sum0 = sum0 + dm[k] + #print('sum0',sum0) + if ( sum0 > 0. ): + sum1 = 0. + for k in range(1,km): + sum1 = sum1 + np.max([0., dm[k]]) + fac = sum0 / sum1 + #print('fac',fac) + for k in range(1,km): + q[i,k,ic] = np.max([0., fac*dm[k]/dp[i,k]]) + + return q + +def mp_auto_conversion(ql, qi): + qi0_max = 2.0E-3 + ql0_max = 2.5E-3 + qr = 0.0 + qs = 0.0 + + #! Convert excess cloud water into rain: + if ( ql > ql0_max ): + qr = ql - ql0_max + ql = ql0_max + #! Convert excess cloud ice into snow: + if ( qi > qi0_max ): + qs = qi - qi0_max + qi = qi0_max + + return (ql, qr, qi, qs) + +def latlon2xyz(p): + +#real(kind=R_GRID), intent(in) :: p(2) +#real(kind=R_GRID), intent(out):: e(3) + +#integer n +#real (f_p):: q(2) +#real (f_p):: e1, e2, e3 + + e = np.zeros(3) + + e1 = math.cos(p[1]) * math.cos(p[0]) + e2 = math.cos(p[1]) * math.sin(p[0]) + e3 = math.sin(p[1]) +#!----------------------------------- +#! Truncate to the desired precision: +#!----------------------------------- + e = [e1, e2, e3] + + return e + +def mid_pt3_cart(p1, p2): +# real(kind=R_GRID), intent(IN) :: p1(3), p2(3) +# real(kind=R_GRID), intent(OUT) :: e(3) +#! +# real (f_p):: q1(3), q2(3) +# real (f_p):: dd, e1, e2, e3 +# integer k + + e = np.zeros(3) + + # do k=1,3 + # q1(k) = p1(k) + # q2(k) = p2(k) + # enddo + + e1 = p1[0] + p2[0] + e2 = p1[1] + p2[1] + e3 = p1[2] + p2[2] + + dd = math.sqrt( e1**2 + e2**2 + e3**2 ) + e1 = e1 / dd + e2 = e2 / dd + e3 = e3 / dd + + e = [e1, e2, e3] + + return e + +def cart_to_latlon(q): +#! vector version of cart_to_latlon1 +#integer, intent(in):: np +#real(kind=R_GRID), intent(inout):: q(3,np) +#real(kind=R_GRID), intent(inout):: xs(np), ys(np) +#! local +#real(kind=R_GRID), parameter:: esl=1.d-10 +#real (f_p):: p(3) +#real (f_p):: dist, lat, lon +#integer i,k + esl = 1.0E-10 + + dist = math.sqrt(q[0]**2 + q[1]**2 + q[2]**2) + q = np.divide(q,dist) + + if ( (abs(q[0])+abs(q[1])) < esl ): + lon = 0.0 + else: + lon = math.atan2( q[1], q[0] ) #! range [-pi,pi] + + + if ( lon < 0.): + lon = 2*math.pi + lon + + #! RIGHT_HAND system: + lat = math.asin(q[2]) + + return (lon, lat) + +def mid_pt_sphere(p1, p2): +# real(kind=R_GRID) , intent(IN) :: p1(2), p2(2) +# real(kind=R_GRID) , intent(OUT) :: pm(2) +#!------------------------------------------ +# real(kind=R_GRID) e1(3), e2(3), e3(3) + + pm = np.zeros(2) + + e1 = latlon2xyz(p1) + e2 = latlon2xyz(p2) + e3 = mid_pt3_cart(e1, e2) + (pm[0], pm[1]) = cart_to_latlon(e3) + + return pm + +def vect_cross(p1, p2): + #real(kind=R_GRID), intent(in) :: p1(3), p2(3) + #real(kind=R_GRID), intent(out):: e(3) + e = np.zeros(3) + + e[0] = p1[1]*p2[2] - p1[2]*p2[1] + e[1] = p1[2]*p2[0] - p1[0]*p2[2] + e[2] = p1[0]*p2[1] - p1[1]*p2[0] + + return e + +def normalize_vect(e): + + #real(kind=R_GRID), intent(inout):: e(3) + #real(f_p):: pdot + #integer k + + pdot = e[0]**2 + e[1]**2 + e[2]**2 + pdot = math.sqrt( pdot ) + e = e/pdot + + return e + +def get_unit_vect2( e1, e2): + #real(kind=R_GRID), intent(in) :: e1(2), e2(2) + #real(kind=R_GRID), intent(out):: uc(3) !< unit vector e1--->e2 +#! Local: + #real(kind=R_GRID), dimension(3):: pc, p1, p2, p3 + uc = np.zeros(3) + +#! RIGHT_HAND system: + p1 = latlon2xyz(e1) + p2 = latlon2xyz(e2) + + pc = mid_pt3_cart(p1, p2) + p3 = vect_cross(p2, p1) + uc = vect_cross(pc, p3) + uc = normalize_vect( uc ) + + return uc + +def get_latlon_vector(pp): + #real(kind=R_GRID), intent(IN) :: pp(2) + #real(kind=R_GRID), intent(OUT) :: elon(3), elat(3) + elon = np.zeros(3) + elat = np.zeros(3) + + elon[0] = -math.sin(pp[0]) + elon[1] = math.cos(pp[0]) + elon[2] = 0.0 + elat[0] = -math.sin(pp[1])*math.cos(pp[0]) + elat[1] = -math.sin(pp[1])*math.sin(pp[0]) +#!!! RIGHT_HAND + elat[2] = math.cos(pp[1]) +#! Left-hand system needed to be consistent with rest of the codes +#! elat[2] = -math.cos(pp[1]) + + return (elon, elat) + +def inner_prod(v1, v2): + #real(kind=R_GRID),intent(in):: v1(3), v2(3) + #real (f_p) :: vp1(3), vp2(3), prod16 + #integer k + + return v1[0]*v2[0] + v1[1]*v2[1] + v1[2]*v2[2] diff --git a/scm/src/fv_eta.h b/scm/src/fv_eta.h index 7df22b11b..66660fb96 100644 --- a/scm/src/fv_eta.h +++ b/scm/src/fv_eta.h @@ -10,7 +10,7 @@ !* (at your option) any later version. !* !* The FV3 dynamical core is distributed in the hope that it will be -!* useful, but WITHOUT ANYWARRANTY; without even the implied warranty +!* useful, but WITHOUT ANY WARRANTY; without even the implied warranty !* of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. !* See the GNU General Public License for more details. !* @@ -18,6 +18,7 @@ !* License along with the FV3 dynamical core. !* If not, see . !*********************************************************************** + #ifndef _FV_ETA_ #define _FV_ETA__ @@ -42,11 +43,15 @@ real a63meso(64),b63meso(64) real a64(65),b64(65) real a64gfs(65),b64gfs(65) + real a65(66),b65(66) ! kgao: L65 with enhanced surface resolution by xi chen real a68(69),b68(69) ! cjg: grid with enhanced PBL resolution real a96(97),b96(97) ! cjg: grid with enhanced PBL resolution + real a88(89),b88(89) ! kgao: grid with enhanced PBL resolution + real a75(76),b75(76) ! kgao: emc grid with enhanced PBL resolution real a100(101),b100(101) real a104(105),b104(105) real a125(126),b125(126) + real a127(128),b127(128) !----------------------------------------------- ! GFDL AM2-L24: modified by SJL at the model top @@ -455,39 +460,53 @@ 0.94565, 0.95762, 0.96827, & 0.97771, 0.98608, 0.99347, 1./ -! NAM levels - data a60/200., 1311.4934, 2424.6044, 3541.7594,& - 4662.9584, 5790.2234, 6932.6534, 8095.3034,& - 9278.1734, 10501.4834, 11755.1234, 13049.2034,& - 14403.9434, 15809.2334, 17315.6234, 18953.4434,& - 20783.3534, 22815.4634, 25059.8834, 27567.1634,& - 30148.42896047, 32193.91776039, 33237.35176644, 33332.15200668,& - 32747.34688095, 31710.06232008, 30381.0344269, 28858.71577772,& - 27218.00439794, 25500.31691133, 23734.52294749, 21947.3406187,& - 20167.06984021, 18396.08144096, 16688.20978135, 15067.73749198,& - 13564.49530178, 12183.34512952, 10928.24869364, 9815.02787644,& - 8821.38325756, 7943.05793658, 7181.90985128, 6500.94645341,& - 5932.84856135, 5420.87683616, 4959.15585353, 4522.15047657,& - 4103.63596619, 3703.72540955, 3322.52525084, 2953.65688391,& - 2597.18532669, 2253.10764634, 1915.10585833, 1583.14516612,& - 1257.18953818, 937.3977544 , 623.60136981, 311.11085215,& - 0. / - data b60/0., 0., 0., 0., 0.,& - 0. , 0. , 0. , 0. , 0. ,& - 0. , 0. , 0. , 0. , 0. ,& - 0. , 0. , 0. , 0. , 0. ,& - 0.0014653 , 0.01021565, 0.0301554 , 0.06025816, 0.09756877,& - 0.13994493, 0.18550048, 0.23318371, 0.2819159 , 0.33120838,& - 0.38067633, 0.42985641, 0.47816985, 0.52569303, 0.57109611,& - 0.61383996, 0.6532309 , 0.68922093, 0.72177094, 0.75052515,& - 0.77610288, 0.79864598, 0.81813309, 0.83553022, 0.85001773,& - 0.86305395, 0.8747947 , 0.88589325, 0.89650986, 0.9066434 ,& - 0.91629284, 0.92562094, 0.93462705, 0.94331221, 0.95183659,& - 0.96020153, 0.96840839, 0.97645359, 0.98434181, 0.99219119, 1. / + data a60/ 1.7861000000e-01, 1.0805100000e+00, 3.9647100000e+00, & + 9.7516000000e+00, 1.9816580000e+01, 3.6695950000e+01, & + 6.2550570000e+01, 9.9199620000e+01, 1.4792505000e+02, & + 2.0947487000e+02, 2.8422571000e+02, 3.7241721000e+02, & + 4.7437835000e+02, 5.9070236000e+02, 7.2236063000e+02, & + 8.7076746000e+02, 1.0378138800e+03, 1.2258877300e+03, & + 1.4378924600e+03, 1.6772726600e+03, 1.9480506400e+03, & + 2.2548762700e+03, 2.6030909400e+03, 2.9988059200e+03, & + 3.4489952300e+03, 3.9616028900e+03, 4.5456641600e+03, & + 5.2114401700e+03, 5.9705644000e+03, 6.8361981800e+03, & + 7.8231906000e+03, 8.9482351000e+03, 1.0230010660e+04, & + 1.1689289750e+04, 1.3348986860e+04, 1.5234111060e+04, & + 1.7371573230e+04, 1.9789784580e+04, 2.2005564550e+04, & + 2.3550115120e+04, 2.4468583320e+04, 2.4800548800e+04, & + 2.4582445070e+04, 2.3849999620e+04, 2.2640519740e+04, & + 2.0994737150e+04, 1.8957848730e+04, 1.6579413230e+04, & + 1.4080071030e+04, 1.1753630920e+04, 9.6516996300e+03, & + 7.7938009300e+03, 6.1769062800e+03, 4.7874276000e+03, & + 3.6050497500e+03, 2.6059860700e+03, 1.7668328200e+03, & + 1.0656131200e+03, 4.8226201000e+02, 0.0000000000e+00, & + 0.0000000000e+00 / + + data b60/ 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & + 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & + 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & + 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & + 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & + 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & + 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & + 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & + 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & + 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & + 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & + 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & + 0.0000000000e+00, 0.0000000000e+00, 5.0600000000e-03, & + 2.0080000000e-02, 4.4900000000e-02, 7.9360000000e-02, & + 1.2326000000e-01, 1.7634000000e-01, 2.3820000000e-01, & + 3.0827000000e-01, 3.8581000000e-01, 4.6989000000e-01, & + 5.5393000000e-01, 6.2958000000e-01, 6.9642000000e-01, & + 7.5458000000e-01, 8.0463000000e-01, 8.4728000000e-01, & + 8.8335000000e-01, 9.1368000000e-01, 9.3905000000e-01, & + 9.6020000000e-01, 9.7775000000e-01, 9.9223000000e-01, & + 1.0000000000e+00 / ! This is activated by USE_GFSL63 -! Thfollowing L63 setting is the same as NCEP GFS's L64 except the top +! The following L63 setting is the same as NCEP GFS's L64 except the top ! 3 layers data a63/64.247, 137.790, 221.958, & 318.266, 428.434, 554.424, & @@ -668,6 +687,51 @@ 0.87352, 0.91502, 0.95235, & 0.98511, 1.00000 / + data a65/1.00000000, 5.13470268, 14.04240036, & + 30.72783852, 53.79505539, 82.45489502, & + 117.05598450, 158.62843323, 208.79000854, & + 270.02725220, 345.50848389, 438.41940308, & + 551.85266113, 689.25054932, 854.40936279, & + 1051.47802734, 1284.95031738, 1559.65148926, & + 1880.71691895, 2253.56542969, 2683.86547852, & + 3177.49560547, 3740.49951172, 4379.03613281, & + 5099.32617188, 5907.59326172, 6810.00781250, & + 7812.62353516, 8921.31933594, 10141.73632812,& + 11285.93066406, 12188.79101562, 12884.30078125,& + 13400.11523438, 13758.84960938, 13979.10351562,& + 14076.26074219, 14063.13085938, 13950.45507812,& + 13747.31445312, 13461.45410156, 13099.54199219,& + 12667.38183594, 12170.08203125, 11612.18847656,& + 10997.79980469, 10330.65039062, 9611.05468750, & + 8843.30371094, 8045.85009766, 7236.31152344, & + 6424.55712891, 5606.50927734, 4778.05908203, & + 3944.97241211, 3146.77514648, 2416.63354492, & + 1778.22607422, 1246.21462402, 826.51950684, & + 511.21385254, 290.74072876, 150.00000000, & + 68.89300000, 14.99899865, 0.00000000 / + + data b65/0.00000000, 0.00000000, 0.00000000, & + 0.00000000, 0.00000000, 0.00000000, & + 0.00000000, 0.00000000, 0.00000000, & + 0.00000000, 0.00000000, 0.00000000, & + 0.00000000, 0.00000000, 0.00000000, & + 0.00000000, 0.00000000, 0.00000000, & + 0.00000000, 0.00000000, 0.00000000, & + 0.00000000, 0.00000000, 0.00000000, & + 0.00000000, 0.00000000, 0.00000000, & + 0.00000000, 0.00000000, 0.00000000, & + 0.00193294, 0.00749994, 0.01640714, & + 0.02841953, 0.04334756, 0.06103661, & + 0.08135860, 0.10420541, 0.12948355, & + 0.15711005, 0.18700911, 0.21910952, & + 0.25334257, 0.28964061, 0.32793567, & + 0.36815873, 0.41023913, 0.45429301, & + 0.50016892, 0.54688859, 0.59356427, & + 0.63976413, 0.68518244, 0.72950502, & + 0.77231618, 0.81251526, 0.84921405, & + 0.88174411, 0.90978803, 0.93327247, & + 0.95249488, 0.96783525, 0.97980107, & + 0.98896214, 0.99575002, 1.00000000 / !-->cjg data a68/1.00000, 2.68881, 5.15524, & 8.86683, 14.20349, 22.00278, & @@ -785,6 +849,129 @@ 0.97918, 0.98723, 0.99460, & 1.00000 / !<--cjg + +!---> kgao: remove top layers from l96 + data a88/65.28397, & + 95.48274, 137.90344, 196.76073, & + 277.45330, 386.81095, 533.37018, & + 727.67600, 982.60677, 1313.71685, & + 1739.59104, 2282.20281, 2967.26766, & + 3824.58158, 4888.33404, 6197.38450, & + 7795.49158, 9731.48414, 11969.71024, & + 14502.88894, 17304.52434, 20134.76139, & + 22536.63814, 24252.54459, 25230.65591, & + 25585.72044, 25539.91412, 25178.87141, & + 24644.84493, 23978.98781, 23245.49366, & + 22492.11600, 21709.93990, 20949.64473, & + 20225.94258, 19513.31158, 18829.32485, & + 18192.62250, 17589.39396, 17003.45386, & + 16439.01774, 15903.91204, 15396.39758, & + 14908.02140, 14430.65897, 13967.88643, & + 13524.16667, 13098.30227, 12687.56457, & + 12287.08757, 11894.41553, 11511.54106, & + 11139.22483, 10776.01912, 10419.75711, & + 10067.11881, 9716.63489, 9369.61967, & + 9026.69066, 8687.29884, 8350.04978, & + 8013.20925, 7677.12187, 7343.12994, & + 7011.62844, 6681.98102, 6353.09764, & + 6025.10535, 5699.10089, 5375.54503, & + 5053.63074, 4732.62740, 4413.38037, & + 4096.62775, 3781.79777, 3468.45371, & + 3157.19882, 2848.25306, 2541.19150, & + 2236.21942, 1933.50628, 1632.83741, & + 1334.35954, 1038.16655, 744.22318, & + 452.71094, 194.91899, 0.00000, & + 0.00000 / + + data b88/0.00000, & + 0.00000, 0.00000, 0.00000, & + 0.00000, 0.00000, 0.00000, & + 0.00000, 0.00000, 0.00000, & + 0.00000, 0.00000, 0.00000, & + 0.00000, 0.00000, 0.00000, & + 0.00000, 0.00000, 0.00000, & + 0.00000, 0.00000, 0.00193, & + 0.00974, 0.02538, 0.04876, & + 0.07817, 0.11081, 0.14514, & + 0.18007, 0.21486, 0.24866, & + 0.28088, 0.31158, 0.34030, & + 0.36701, 0.39210, 0.41554, & + 0.43733, 0.45774, 0.47707, & + 0.49540, 0.51275, 0.52922, & + 0.54495, 0.56007, 0.57459, & + 0.58850, 0.60186, 0.61471, & + 0.62715, 0.63922, 0.65095, & + 0.66235, 0.67348, 0.68438, & + 0.69510, 0.70570, 0.71616, & + 0.72651, 0.73675, 0.74691, & + 0.75700, 0.76704, 0.77701, & + 0.78690, 0.79672, 0.80649, & + 0.81620, 0.82585, 0.83542, & + 0.84492, 0.85437, 0.86375, & + 0.87305, 0.88229, 0.89146, & + 0.90056, 0.90958, 0.91854, & + 0.92742, 0.93623, 0.94497, & + 0.95364, 0.96223, 0.97074, & + 0.97918, 0.98723, 0.99460, & + 1.00000 / +!<--- kgao: end of a88/b88 + +!---> kgao: EMC L75 config + + data a75/200.0, 572.419, 1104.437, & + 1760.239, 2499.052, 3300.438, & + 4161.36, 5090.598, 6114.272, & + 7241.963, 8489.481, 9855.825, & + 11338.34, 12682.56, 13688.97, & + 14422.61, 14934.2, 15263.88, & + 15443.77, 15499.9, 15453.61, & + 15322.6, 15121.64, 14863.23, & + 14557.97, 14214.93, 13841.91, & + 13445.62, 13031.86, 12605.65, & + 12171.31, 11732.57, 11292.65, & + 10854.29, 10419.82, 9991.243, & + 9570.207, 9158.088, 8756.019, & + 8364.893, 7985.424, 7618.15, & + 7263.452, 6921.581, 6592.674, & + 6276.763, 5963.31, 5652.806, & + 5345.765, 5042.658, 4743.966, & + 4450.172, 4161.769, 3879.194, & + 3602.911, 3333.365, 3071.016, & + 2816.274, 2569.556, 2331.264, & + 2101.816, 1881.57, 1670.887, & + 1470.119, 1279.627, 1099.702, & + 930.651, 772.757, 626.305, & + 491.525, 368.641, 257.862, & + 159.399, 73.396, 0.001, & + 0.0/ + data b75/0.0, 0.0, 0.0, & + 0.0, 0.0, 0.0, & + 0.0, 0.0, 0.0, & + 0.0, 0.0, 0.0, & + 0.0, 0.00250213, 0.00944449,& + 0.02010732, 0.03390246, 0.0503391, & + 0.06899972, 0.08952269, 0.1115907, & + 0.134922, 0.1592647, 0.1843923, & + 0.2101002, 0.2362043, 0.2625384, & + 0.2889538, 0.3153166, 0.3415084, & + 0.3674242, 0.3929729, 0.4180741, & + 0.4426602, 0.4666739, 0.4900666, & + 0.5127994, 0.5348418, 0.5561699, & + 0.5767674, 0.5966232, 0.6157322, & + 0.6340936, 0.6517111, 0.668592, & + 0.6847468, 0.7007225, 0.7164985, & + 0.7320531, 0.7473667, 0.7624187, & + 0.7771889, 0.7916558, 0.8058007, & + 0.819604, 0.8330461, 0.8461072, & + 0.8587694, 0.8710147, 0.8828254, & + 0.8941834, 0.9050727, 0.9154776, & + 0.9253828, 0.9347721, 0.9436326, & + 0.9519511, 0.9597148, 0.966911, & + 0.9735298, 0.9795609, 0.9849954, & + 0.9898235, 0.9940391, 0.9976355, & + 1.0/ +! <--- kgao: end of a75/b75 + ! ! Ultra high troposphere resolution data a100/100.00000, 300.00000, 800.00000, & @@ -859,79 +1046,79 @@ 0.99223, 1.00000 / data a104/ & - 1.8827062944e-01, 7.7977549145e-01, 2.1950593583e+00, & - 4.9874566624e+00, 9.8041418997e+00, 1.7019717163e+01, & - 2.7216579591e+01, 4.0518628401e+01, 5.6749646818e+01, & - 7.5513868331e+01, 9.6315093333e+01, 1.1866706195e+02, & - 1.4216835396e+02, 1.6653733709e+02, 1.9161605772e+02, & - 2.1735580129e+02, 2.4379516604e+02, 2.7103771847e+02, & - 2.9923284173e+02, 3.2856100952e+02, 3.5922338766e+02, & - 3.9143507908e+02, 4.2542117983e+02, 4.6141487902e+02, & - 4.9965698106e+02, 5.4039638379e+02, 5.8389118154e+02, & - 6.3041016829e+02, 6.8023459505e+02, 7.3366009144e+02, & - 7.9099869949e+02, 8.5258099392e+02, 9.1875827946e+02, & - 9.8990486716e+02, 1.0664204381e+03, 1.1487325074e+03, & - 1.2372990044e+03, 1.3326109855e+03, 1.4351954993e+03, & - 1.5456186222e+03, 1.6644886848e+03, 1.7924597105e+03, & - 1.9302350870e+03, 2.0785714934e+03, 2.2382831070e+03, & - 2.4102461133e+03, 2.5954035462e+03, 2.7947704856e+03, & - 3.0094396408e+03, 3.2405873512e+03, 3.4894800360e+03, & - 3.7574811281e+03, 4.0460585279e+03, 4.3567926151e+03, & - 4.6913848588e+03, 5.0516670674e+03, 5.4396113207e+03, & - 5.8573406270e+03, 6.3071403487e+03, 6.7914704368e+03, & - 7.3129785102e+03, 7.8745138115e+03, 8.4791420557e+03, & - 9.1301611750e+03, 9.8311179338e+03, 1.0585825354e+04, & - 1.1398380836e+04, 1.2273184781e+04, 1.3214959424e+04, & - 1.4228767429e+04, 1.5320029596e+04, 1.6494540743e+04, & - 1.7758482452e+04, 1.9118430825e+04, 2.0422798801e+04, & - 2.1520147587e+04, 2.2416813461e+04, 2.3118184510e+04, & - 2.3628790785e+04, 2.3952411814e+04, 2.4092209011e+04, & - 2.4050892106e+04, 2.3830930156e+04, 2.3434818358e+04, & - 2.2865410898e+04, 2.2126326004e+04, 2.1222420323e+04, & - 2.0160313690e+04, 1.8948920926e+04, 1.7599915822e+04, & - 1.6128019809e+04, 1.4550987232e+04, 1.2889169132e+04, & - 1.1164595563e+04, 9.4227665517e+03, 7.7259097899e+03, & - 6.1538244381e+03, 4.7808126007e+03, 3.5967415552e+03, & - 2.5886394104e+03, 1.7415964865e+03, 1.0393721271e+03, & - 4.6478852032e+02, 7.0308342481e-13, 0.0000000000e+00 / + 1.8827062944e-01, 7.7977549145e-01, 2.1950593583e+00, & + 4.9874566624e+00, 9.8041418997e+00, 1.7019717163e+01, & + 2.7216579591e+01, 4.0518628401e+01, 5.6749646818e+01, & + 7.5513868331e+01, 9.6315093333e+01, 1.1866706195e+02, & + 1.4216835396e+02, 1.6653733709e+02, 1.9161605772e+02, & + 2.1735580129e+02, 2.4379516604e+02, 2.7103771847e+02, & + 2.9923284173e+02, 3.2856100952e+02, 3.5922338766e+02, & + 3.9143507908e+02, 4.2542117983e+02, 4.6141487902e+02, & + 4.9965698106e+02, 5.4039638379e+02, 5.8389118154e+02, & + 6.3041016829e+02, 6.8023459505e+02, 7.3366009144e+02, & + 7.9099869949e+02, 8.5258099392e+02, 9.1875827946e+02, & + 9.8990486716e+02, 1.0664204381e+03, 1.1487325074e+03, & + 1.2372990044e+03, 1.3326109855e+03, 1.4351954993e+03, & + 1.5456186222e+03, 1.6644886848e+03, 1.7924597105e+03, & + 1.9302350870e+03, 2.0785714934e+03, 2.2382831070e+03, & + 2.4102461133e+03, 2.5954035462e+03, 2.7947704856e+03, & + 3.0094396408e+03, 3.2405873512e+03, 3.4894800360e+03, & + 3.7574811281e+03, 4.0460585279e+03, 4.3567926151e+03, & + 4.6913848588e+03, 5.0516670674e+03, 5.4396113207e+03, & + 5.8573406270e+03, 6.3071403487e+03, 6.7914704368e+03, & + 7.3129785102e+03, 7.8745138115e+03, 8.4791420557e+03, & + 9.1301611750e+03, 9.8311179338e+03, 1.0585825354e+04, & + 1.1398380836e+04, 1.2273184781e+04, 1.3214959424e+04, & + 1.4228767429e+04, 1.5320029596e+04, 1.6494540743e+04, & + 1.7758482452e+04, 1.9118430825e+04, 2.0422798801e+04, & + 2.1520147587e+04, 2.2416813461e+04, 2.3118184510e+04, & + 2.3628790785e+04, 2.3952411814e+04, 2.4092209011e+04, & + 2.4050892106e+04, 2.3830930156e+04, 2.3434818358e+04, & + 2.2865410898e+04, 2.2126326004e+04, 2.1222420323e+04, & + 2.0160313690e+04, 1.8948920926e+04, 1.7599915822e+04, & + 1.6128019809e+04, 1.4550987232e+04, 1.2889169132e+04, & + 1.1164595563e+04, 9.4227665517e+03, 7.7259097899e+03, & + 6.1538244381e+03, 4.7808126007e+03, 3.5967415552e+03, & + 2.5886394104e+03, 1.7415964865e+03, 1.0393721271e+03, & + 4.6478852032e+02, 7.0308342481e-13, 0.0000000000e+00 / data b104/ & - 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & - 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & - 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & - 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & - 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & - 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & - 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & - 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & - 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & - 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & - 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & - 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & - 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & - 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & - 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & - 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & - 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & - 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & - 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & - 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & - 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & - 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & - 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & - 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & - 0.0000000000e+00, 0.0000000000e+00, 1.5648447298e-03, & - 6.2617046389e-03, 1.4104157933e-02, 2.5118187415e-02, & - 3.9340510972e-02, 5.6816335609e-02, 7.7596328431e-02, & - 1.0173255472e-01, 1.2927309709e-01, 1.6025505622e-01, & - 1.9469566981e-01, 2.3258141217e-01, 2.7385520518e-01, & - 3.1840233814e-01, 3.6603639170e-01, 4.1648734767e-01, & - 4.6939496013e-01, 5.2431098738e-01, 5.8071350676e-01, & - 6.3803478105e-01, 6.9495048840e-01, 7.4963750338e-01, & - 7.9975208897e-01, 8.4315257576e-01, 8.8034012292e-01, & - 9.1184389721e-01, 9.3821231526e-01, 9.6000677644e-01, & - 9.7779792223e-01, 9.9216315122e-01, 1.0000000000e+00 / + 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & + 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & + 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & + 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & + 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & + 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & + 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & + 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & + 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & + 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & + 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & + 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & + 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & + 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & + 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & + 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & + 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & + 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & + 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & + 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & + 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & + 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & + 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & + 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & + 0.0000000000e+00, 0.0000000000e+00, 1.5648447298e-03, & + 6.2617046389e-03, 1.4104157933e-02, 2.5118187415e-02, & + 3.9340510972e-02, 5.6816335609e-02, 7.7596328431e-02, & + 1.0173255472e-01, 1.2927309709e-01, 1.6025505622e-01, & + 1.9469566981e-01, 2.3258141217e-01, 2.7385520518e-01, & + 3.1840233814e-01, 3.6603639170e-01, 4.1648734767e-01, & + 4.6939496013e-01, 5.2431098738e-01, 5.8071350676e-01, & + 6.3803478105e-01, 6.9495048840e-01, 7.4963750338e-01, & + 7.9975208897e-01, 8.4315257576e-01, 8.8034012292e-01, & + 9.1184389721e-01, 9.3821231526e-01, 9.6000677644e-01, & + 9.7779792223e-01, 9.9216315122e-01, 1.0000000000e+00 / ! IFS-like L125(top 12 levels removed from IFSL137) data a125/ 64., & @@ -980,5 +1167,74 @@ 0.984542, 0.988500, 0.991984, 0.995003, 0.997630, 1.000000 / + data a127/ & + 0.99900, 1.60500, 2.53200, 3.92400, & + 5.97600, 8.94700, 13.17700, 19.09600, & + 27.24300, 38.27600, 52.98400, 72.29300, & + 97.26900, 129.11000, 169.13500, 218.76700, & + 279.50600, 352.89400, 440.48100, 543.78200, & + 664.23600, 803.16400, 961.73400, 1140.93100, & + 1341.53800, 1564.11900, 1809.02800, 2076.41500, & + 2366.25200, 2678.37200, 3012.51000, 3368.36300, & + 3745.64600, 4144.16400, 4563.88100, 5004.99500, & + 5468.01700, 5953.84800, 6463.86400, 7000.00000, & + 7563.49400, 8150.66100, 8756.52900, 9376.14100, & + 10004.55300, 10636.85100, 11268.15700, 11893.63900, & + 12508.51900, 13108.09100, 13687.72700, 14242.89000, & + 14769.15300, 15262.20200, 15717.85900, 16132.09000, & + 16501.01800, 16820.93800, 17088.32400, 17299.85200, & + 17453.08400, 17548.35000, 17586.77100, 17569.69700, & + 17498.69700, 17375.56100, 17202.29900, 16981.13700, & + 16714.50400, 16405.02000, 16055.48500, 15668.86000, & + 15248.24700, 14796.86800, 14318.04000, 13815.15000, & + 13291.62900, 12750.92400, 12196.46800, 11631.65900, & + 11059.82700, 10484.20800, 9907.92700, 9333.96700, & + 8765.15500, 8204.14200, 7653.38700, 7115.14700, & + 6591.46800, 6084.17600, 5594.87600, 5124.94900, & + 4675.55400, 4247.63300, 3841.91800, 3458.93300, & + 3099.01000, 2762.29700, 2448.76800, 2158.23800, & + 1890.37500, 1644.71200, 1420.66100, 1217.52800, & + 1034.52400, 870.77800, 725.34800, 597.23500, & + 485.39200, 388.73400, 306.14900, 236.50200, & + 178.65100, 131.44700, 93.74000, 64.39200, & + 42.27400, 26.27400, 15.30200, 8.28700, & + 4.19000, 1.99400, 0.81000, 0.23200, & + 0.02900, 0.00000, 0.00000, 0.00000 / + + + data b127/ & + 0.000000000, 0.000000000, 0.000000000, 0.000000000, & + 0.000000000, 0.000000000, 0.000000000, 0.000000000, & + 0.000000000, 0.000000000, 0.000000000, 0.000000000, & + 0.000000000, 0.000000000, 0.000000000, 0.000000000, & + 0.000000000, 0.000000000, 0.000000000, 0.000000000, & + 0.000000000, 0.000000000, 0.000000000, 0.000000000, & + 0.000000000, 0.000000000, 0.000000000, 0.000000000, & + 0.000000000, 0.000000000, 0.000000000, 0.000000000, & + 0.000000000, 0.000000000, 0.000000000, 0.000000000, & + 0.000000000, 0.000000000, 0.000000000, 0.000000000, & + 0.000010180, 0.000081410, 0.000274690, 0.000650780, & + 0.001270090, 0.002192480, 0.003477130, 0.005182280, & + 0.007365040, 0.010081200, 0.013384920, 0.017328570, & + 0.021962390, 0.027334280, 0.033489540, 0.040470560, & + 0.048316610, 0.057063580, 0.066743720, 0.077385480, & + 0.089006290, 0.101593970, 0.115126180, 0.129576220, & + 0.144912940, 0.161100800, 0.178099890, 0.195866050, & + 0.214351120, 0.233503070, 0.253266330, 0.273582160, & + 0.294388980, 0.315622900, 0.337218050, 0.359107230, & + 0.381222370, 0.403495070, 0.425857160, 0.448241260, & + 0.470581260, 0.492812960, 0.514874340, 0.536706210, & + 0.558252450, 0.579460500, 0.600281540, 0.620670740, & + 0.640587510, 0.659995680, 0.678863350, 0.697163110, & + 0.714872000, 0.731971260, 0.748446460, 0.764287110, & + 0.779486660, 0.794042170, 0.807954130, 0.821226300, & + 0.833865170, 0.845880090, 0.857282640, 0.868086640, & + 0.878307700, 0.887963240, 0.897071780, 0.905653240, & + 0.913728360, 0.921318710, 0.928446350, 0.935133760, & + 0.941403690, 0.947278860, 0.952782090, 0.957935990, & + 0.962762950, 0.967285100, 0.971524000, 0.975500880, & + 0.979236420, 0.982750770, 0.986062530, 0.989185090, & + 0.992129920, 0.994907680, 0.997528200, 1.000000000 / + #endif _FV_ETA_ diff --git a/scm/src/run_scm.py b/scm/src/run_scm.py index c7a7b63f2..0d04edd25 100755 --- a/scm/src/run_scm.py +++ b/scm/src/run_scm.py @@ -9,7 +9,7 @@ import subprocess import sys import time -from suite_info import suite, suite_list +from suite_info import suite_list from netCDF4 import Dataset import importlib @@ -208,7 +208,7 @@ def find_gdb(): class Experiment(object): - def __init__(self, case, suite, runtime, runtime_mult, levels, npz_type, vert_coord_file, case_data_dir, n_itt_out, n_itt_diag): + def __init__(self, case, suite, runtime, runtime_mult, levels, npz_type, vert_coord_file, case_data_dir, n_itt_out, n_itt_diag, timestep): """Initialize experiment. This routine does most of the work, including setting and checking the experiment configuration (namelist).""" @@ -309,11 +309,11 @@ def __init__(self, case, suite, runtime, runtime_mult, levels, npz_type, vert_co self._n_itt_diag = n_itt_diag else: self._n_itt_diag = DEFAULT_DIAG_PERIOD - - if suite.timestep is not None: - self._timestep = suite.timestep + + if timestep: + self._timestep = timestep else: - self._timestep = None + self._timestep = suite.timestep @property def name(self): @@ -866,7 +866,7 @@ def main(): irun, len(run_list), run["case"], run["suite"], active_suite.namelist)) # exp = Experiment(run["case"], active_suite, runtime, runtime_mult, levels, \ - npz_type, vert_coord_file, case_data_dir, n_itt_out, n_itt_diag) + npz_type, vert_coord_file, case_data_dir, n_itt_out, n_itt_diag, timestep) # exp_dir = exp.setup_rundir() if len(run_list) > 1: diff --git a/scm/src/scm_input.F90 b/scm/src/scm_input.F90 index dd4f4df38..dcb18fc21 100644 --- a/scm/src/scm_input.F90 +++ b/scm/src/scm_input.F90 @@ -1302,7 +1302,8 @@ subroutine get_case_init_DEPHY(scm_state, scm_input) if (trim(input_surfaceForcingLSM) == "lsm") then !if model ICs are included in the file - + scm_state%lsm_ics = .true. + !variables with vertical extent allocate(input_ozone (input_n_lev, input_n_init_times), & input_stc (input_n_soil, input_n_init_times), & diff --git a/scm/src/scm_vgrid.F90 b/scm/src/scm_vgrid.F90 index bde37775d..f827f89f9 100644 --- a/scm/src/scm_vgrid.F90 +++ b/scm/src/scm_vgrid.F90 @@ -350,6 +350,14 @@ subroutine get_FV3_vgrid(scm_input, scm_state) scm_state%b_k(k) = b64(k) enddo endif + ! xi chen's l65 + case (65) + ks = 29 + do k=1,km+1 + scm_state%a_k(k) = a65(k) + scm_state%b_k(k) = b65(k) + enddo + !-->cjg case (68) ks = 27 @@ -361,11 +369,23 @@ subroutine get_FV3_vgrid(scm_input, scm_state) ptop = 1. stretch_fac = 1.03 auto_routine = 1 - case (75) ! HS-SGO test configuration - pint = 100.E2 - ptop = 10.E2 - stretch_fac = 1.035 - auto_routine = 6 + ! kgao: introduce EMC's L75 config + case (75) + if (trim(scm_state%npz_type) == 'emc') then + ! EMC's L75 config + ks = 12 + do k=1,km+1 + scm_state%a_k(k) = a75(k) + scm_state%b_k(k) = b75(k) + enddo + else + ! HS-SGO test configuration + pint = 100.E2 + ptop = 10.E2 + stretch_fac = 1.035 + auto_routine = 6 + endif + case (79) ! N = 10, M=5 if (trim(scm_state%npz_type) == 'gcrm') then pint = 100.E2 @@ -377,7 +397,14 @@ subroutine get_FV3_vgrid(scm_input, scm_state) stretch_fac = 1.03 auto_routine = 1 endif - case (90) ! super-duper cell + ! kgao L88 + case (88) + ks = 20 !19 bug fix + do k=1,km+1 + scm_state%a_k(k) = a88(k) + scm_state%b_k(k) = b88(k) + enddo + case (90) ! super-duper cell ptop = 40.e2 stretch_fac = 1.025 auto_routine = 2 @@ -421,16 +448,24 @@ subroutine get_FV3_vgrid(scm_input, scm_state) scm_state%b_k(k) = b125(k) enddo case (127) ! N = 10, M=5 - if (trim(scm_state%npz_type) == 'hitop') then - ptop = 1. - stretch_fac = 1.03 - auto_routine = 2 - else - ptop = 1. - pint = 75.E2 - stretch_fac = 1.028 - auto_routine = 6 - endif + if (trim(scm_state%npz_type) == 'hitop') then + ptop = 1. + stretch_fac = 1.03 + auto_routine = 2 + elseif (trim(scm_state%npz_type) == 'gfs') then + ks = 39 + ptop = a127(1) + pint = a127(ks+1) + do k=1,km+1 + scm_state%a_k(k) = a127(k) + scm_state%b_k(k) = b127(k) + enddo + else + ptop = 1. + pint = 75.E2 + stretch_fac = 1.028 + auto_routine = 6 + endif case (151) !LES applications ptop = 75.e2