From 0d5e14f0c548120f64a90ba3259b3e823af39ea2 Mon Sep 17 00:00:00 2001 From: Mark Petersen Date: Mon, 30 Mar 2020 06:12:00 -0600 Subject: [PATCH 1/9] original script from Luke --- .../ocean/scripts/make_vertical_grid.py | 103 ++++++++++++++++++ 1 file changed, 103 insertions(+) create mode 100755 testing_and_setup/compass/ocean/scripts/make_vertical_grid.py diff --git a/testing_and_setup/compass/ocean/scripts/make_vertical_grid.py b/testing_and_setup/compass/ocean/scripts/make_vertical_grid.py new file mode 100755 index 0000000000..61459ece37 --- /dev/null +++ b/testing_and_setup/compass/ocean/scripts/make_vertical_grid.py @@ -0,0 +1,103 @@ +def dz_z(z,Hmax,epsilon,dzmax): + import numpy as np + return dzmax*np.tanh(-z*np.pi/Hmax) + epsilon + +from netCDF4 import Dataset +import numpy as np +""" +Write vertical grid to a netcdf file +""" +def create_vertical_grid(bottom_depth, nz, dz1, dz2, maxit=1000, + epsilon=1e-2, outFile='MPAS-Ocean_vertical_grid.nc'): + + # open a new netCDF file for writing. + ncfile = Dataset(outFile,'w') + # create the depth_t dimension. + ncfile.createDimension('dim_layer',nz) + + refBottomDepth = ncfile.createVariable('refBottomDepth',np.dtype('float64').char,('dim_layer')) + refMidDepth = ncfile.createVariable('refMidDepth',np.dtype('float64').char,('dim_layer')) + refLayerThickness = ncfile.createVariable('refLayerThickness',np.dtype('float64').char,('dim_layer')) + + Hmax = bottom_depth + nLayers = 0 + + layerThickness = np.zeros(nz) + dz = [epsilon] + z = [0] + count=0 + + while nLayers != nz and count < maxit: + zval = -epsilon + dz = [epsilon] + z = [0] + nLayers = 0 + while zval > -Hmax: + difference = dz_z(zval,Hmax,epsilon,dz2) - zval + while abs(difference) > 0.3: + zval -= epsilon + difference = dz_z(zval,Hmax,epsilon,dz2) -z[nLayers] + zval + z.append(zval) + dz.append(dz_z(zval,Hmax,epsilon,dz2)) + nLayers += 1 + zval -= epsilon + + dz_arr = np.asarray(dz) + ind = abs(dz_arr - dz1).argmin() + + dztemp = dz_arr[ind:] + nLayers = len(dztemp) + change = nz-nLayers + dz2 -= float(change) + count += 1 + + if count >= maxit: + print("Error: grid did not converge, adjust parameters") + else: + layerThickness[:nLayers] = dztemp + + nVertLevels = nz + botDepth = np.zeros(nVertLevels) + midDepth = np.zeros(nVertLevels) + botDepth[0] = layerThickness[0] + midDepth[0] = 0.5*layerThickness[0] + + for i in range(1,nVertLevels): + botDepth[i] = botDepth[i-1] + layerThickness[i] + midDepth[i] = midDepth[i-1] + 0.5*(layerThickness[i] + layerThickness[i-1]) + + refBottomDepth[:] = botDepth + refMidDepth[:] = midDepth + refLayerThickness[:] = layerThickness[:nVertLevels] + + ncfile.close() + +if __name__ == "__main__": + import argparse + parser = argparse.ArgumentParser(description=__doc__, + formatter_class=argparse.RawTextHelpFormatter) + parser.add_argument("-o", "--output_file_pattern", dest="output_filename_pattern", + default='MPAS-Ocean_vertical_grid.nc', + help="MPAS Filename pattern for file output of vertical grid.", metavar="NAME") + parser.add_argument("-bd", "--bottom_depth", dest="bottom_depth", + help="bottom depth for the chosen vertical coordinate", + type=float,required=True) + parser.add_argument("-nz", "--num_vert_levels", dest="nz", + help="Number of vertical levels for the grid", type=int, + required=True) + parser.add_argument("-dz1", "--layer1_thickness", dest="dz1", + help="Target thickness of the first layer", + type=float, required=True) + parser.add_argument("-dz2", "--maxLayer_thickness", dest="dz2", + help="Target maximum thickness in column", + type=float, required=True) + parser.add_argument("-eps", "--error_tolerance", dest="epsilon", + help="Threshold for iterations", type=float, default=1e-2) + parser.add_argument("-maxit", "--max_iterations", dest="maxit", + help="maximum number of iterations for grid convergences", + type=int, default=1000) + args = parser.parse_args() + + create_vertical_grid(args.bottom_depth,args.nz,args.dz1, + args.dz2,maxit=args.maxit,epsilon=args.epsilon, + outFile=args.output_filename_pattern) From c11d2c65e35c16e09cf0ad594353341035533b09 Mon Sep 17 00:00:00 2001 From: Mark Petersen Date: Mon, 30 Mar 2020 07:50:26 -0600 Subject: [PATCH 2/9] Add 64 layer to domains, add plotting, set parameters --- .../mode_init/Registry_global_ocean.xml | 6 +- .../ARM60to10/init/config_initial_state.xml | 2 +- .../ARM60to6/init/config_initial_state.xml | 2 +- .../EC60to30/init/config_initial_state.xml | 54 +---- .../EC60to30/init/define_vertical_grid.py | 1 + .../EC60to30wISC/init/define_vertical_grid.py | 1 + .../QU240/init/define_vertical_grid.py | 1 + .../QU240wISC/init/define_vertical_grid.py | 1 + .../config_files/config_base_mesh.xml | 2 +- .../config_files/config_initial_state.xml | 12 +- .../config_files_ISC/config_initial_state.xml | 19 +- .../ocean/jigsaw_to_MPAS/build_mesh.py | 3 +- .../ocean/scripts/make_vertical_grid.py | 103 --------- .../define_vertical_grid_64_layers.py | 14 ++ .../vertical_grid/make_vertical_grid.py | 198 ++++++++++++++++++ 15 files changed, 245 insertions(+), 174 deletions(-) mode change 100644 => 120000 testing_and_setup/compass/ocean/global_ocean/EC60to30/init/config_initial_state.xml create mode 120000 testing_and_setup/compass/ocean/global_ocean/EC60to30/init/define_vertical_grid.py create mode 120000 testing_and_setup/compass/ocean/global_ocean/EC60to30wISC/init/define_vertical_grid.py create mode 120000 testing_and_setup/compass/ocean/global_ocean/QU240/init/define_vertical_grid.py create mode 120000 testing_and_setup/compass/ocean/global_ocean/QU240wISC/init/define_vertical_grid.py delete mode 100755 testing_and_setup/compass/ocean/scripts/make_vertical_grid.py create mode 100755 testing_and_setup/compass/ocean/scripts/vertical_grid/define_vertical_grid_64_layers.py create mode 100755 testing_and_setup/compass/ocean/scripts/vertical_grid/make_vertical_grid.py diff --git a/src/core_ocean/mode_init/Registry_global_ocean.xml b/src/core_ocean/mode_init/Registry_global_ocean.xml index 03f4418034..c6422db842 100644 --- a/src/core_ocean/mode_init/Registry_global_ocean.xml +++ b/src/core_ocean/mode_init/Registry_global_ocean.xml @@ -11,15 +11,15 @@ description="Minimum depth where column contains all water-filled cells. The first layer with refBottomDepth greater than this value is included in whole, i.e. no partial bottom cells are used in this layer." possible_values="Any positive real value greater than 0, but typically greater than 10 m." /> - - - diff --git a/testing_and_setup/compass/ocean/global_ocean/ARM60to10/init/config_initial_state.xml b/testing_and_setup/compass/ocean/global_ocean/ARM60to10/init/config_initial_state.xml index 708f1da2f9..5c7c5154d7 120000 --- a/testing_and_setup/compass/ocean/global_ocean/ARM60to10/init/config_initial_state.xml +++ b/testing_and_setup/compass/ocean/global_ocean/ARM60to10/init/config_initial_state.xml @@ -1 +1 @@ -../../config_files/config_initial_state_60_layers.xml \ No newline at end of file +../../config_files/config_initial_state.xml \ No newline at end of file diff --git a/testing_and_setup/compass/ocean/global_ocean/ARM60to6/init/config_initial_state.xml b/testing_and_setup/compass/ocean/global_ocean/ARM60to6/init/config_initial_state.xml index 708f1da2f9..5c7c5154d7 120000 --- a/testing_and_setup/compass/ocean/global_ocean/ARM60to6/init/config_initial_state.xml +++ b/testing_and_setup/compass/ocean/global_ocean/ARM60to6/init/config_initial_state.xml @@ -1 +1 @@ -../../config_files/config_initial_state_60_layers.xml \ No newline at end of file +../../config_files/config_initial_state.xml \ No newline at end of file diff --git a/testing_and_setup/compass/ocean/global_ocean/EC60to30/init/config_initial_state.xml b/testing_and_setup/compass/ocean/global_ocean/EC60to30/init/config_initial_state.xml deleted file mode 100644 index 87c01a0c1c..0000000000 --- a/testing_and_setup/compass/ocean/global_ocean/EC60to30/init/config_initial_state.xml +++ /dev/null @@ -1,53 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -