Back to home page

darwin3

 
 

    


Warning, /doc/examples/baroclinic_gyre/baroclinic_gyre.rst is written in an unsupported language. File is not indexed.

view on githubraw file Latest commit 0bad585a on 2022-02-16 18:55:09 UTC
94151a9b18 Jeff*0001 
                0002 .. _tutorial_baroclinic_gyre:
                0003 
                0004 Baroclinic Ocean Gyre
                0005 =====================
                0006 
                0007 (in directory: :filelink:`verification/tutorial_baroclinic_gyre`)
                0008 
                0009 This section describes an example experiment using MITgcm to simulate a
ce0d9af5ea Jeff*0010 baroclinic, wind and buoyancy-forced, double-gyre ocean circulation. Unlike tutorial
                0011 :ref:`Barotropic Ocean Gyre <sec_eg_baro>`, which used a Cartesian grid and a single vertical
                0012 layer, here the grid employs spherical polar coordinates with 15 vertical layers.
94151a9b18 Jeff*0013 The configuration is similar to the double-gyre setup first solved numerically
                0014 in Cox and Bryan (1984) :cite:`cox:84`: the model is configured to
                0015 represent an enclosed sector of fluid on a sphere, spanning the tropics to mid-latitudes,
                0016 :math:`60^{\circ} \times 60^{\circ}` in lateral extent.
                0017 The fluid is :math:`1.8` km deep and is forced by a zonal wind
                0018 stress which is constant in time, :math:`\tau_{\lambda}`, varying sinusoidally in the
                0019 north-south direction. The Coriolis parameter, :math:`f`, is defined
                0020 according to latitude :math:`\varphi`
                0021 
                0022 .. math::
                0023    f(\varphi) = 2 \Omega \sin( \varphi )
                0024 
                0025 with the rotation rate, :math:`\Omega` set to :math:`\frac{2 \pi}{86164} \text{s}^{-1}` (i.e., corresponding the to standard Earth rotation rate).
                0026 The sinusoidal wind-stress variations are defined according to
                0027 
                0028 .. math::
                0029    \tau_{\lambda}(\varphi) = -\tau_{0}\cos \left(2 \pi \frac{\varphi-\varphi_o}{L_{\varphi}} \right)
                0030 
                0031 where :math:`L_{\varphi}` is the lateral domain extent
                0032 (:math:`60^{\circ}`), :math:`\varphi_o` is set to :math:`15^{\circ} \text{N}` and :math:`\tau_0` is :math:`0.1 \text{ N m}^{-2}`.
                0033 :numref:`baroclinic_gyre_config` summarizes the
                0034 configuration simulated. As indicated by the axes in the lower left of the figure, the
                0035 model code works internally in a locally orthogonal coordinate
                0036 :math:`(x,y,z)`. For this experiment description the local orthogonal
                0037 model coordinate :math:`(x,y,z)` is synonymous with the coordinates
                0038 :math:`(\lambda,\varphi,r)` shown in :numref:`sphere_coor`.
                0039 Initially the fluid is stratified
                0040 with a reference potential temperature profile that varies from :math:`\theta=30 \text{ } ^{\circ}`\ C
                0041 in the surface layer to :math:`\theta=2 \text{ } ^{\circ}`\ C in the bottom layer.
                0042 The equation of state used in this experiment is linear:
                0043 
                0044 .. math::
                0045    \rho = \rho_{0} ( 1 - \alpha_{\theta}\theta^{\prime} )
                0046   :label: rho_lineareos
                0047 
                0048 which is implemented in the model as a density anomaly equation
                0049 
                0050 .. math::
                0051    \rho^{\prime} = -\rho_{0}\alpha_{\theta}\theta^{\prime}
                0052    :label: rhoprime_lineareos
                0053 
                0054 with :math:`\rho_{0}=999.8\,{\rm kg\,m}^{-3}` and
                0055 :math:`\alpha_{\theta}=2\times10^{-4}\,{\rm K}^{-1}`.
                0056 Given the linear equation of state, in this configuration the model state variable for temperature is
                0057 equivalent to either in-situ temperature, :math:`T`, or potential
                0058 temperature, :math:`\theta`. For consistency with later examples, in
                0059 which the equation of state is non-linear, here we use the variable :math:`\theta` to
                0060 represent temperature.
                0061 
                0062   .. figure:: figs/baroclinic_gyre_config.png
                0063       :width: 95%
                0064       :align: center
                0065       :alt: baroclinic gyre configuration
                0066       :name: baroclinic_gyre_config
                0067 
                0068       Schematic of simulation domain and wind-stress forcing function for baroclinic gyre numerical experiment. The domain is enclosed by solid walls.
                0069 
                0070 Temperature is restored in the surface layer to a linear profile:
                0071 
                0072 .. math::
                0073    {\cal F}_\theta = - \frac{1}{\tau_{\theta}} (\theta-\theta^*), \phantom{WWW}
0bad585a21 Navi*0074    \theta^* = \frac{\theta_{\rm max} - \theta_{\rm min}}{L_\varphi} (\varphi - \varphi_o)
94151a9b18 Jeff*0075    :label: baroc_restore_theta
                0076 
0bad585a21 Navi*0077 where the relaxation timescale :math:`\tau_{\theta} = 30` days and :math:`\theta_{\rm max}=30^{\circ}` C, :math:`\theta_{\rm min}=0^{\circ}` C.
94151a9b18 Jeff*0078 
                0079 .. _baroc_eq_solved:
                0080 
                0081 Equations solved
                0082 ----------------
                0083 
                0084 For this problem the implicit free surface, **HPE**
                0085 form of the equations (see :numref:`hydro_and_quasihydro`; :numref:`press_meth_linear`)
                0086 described in Marshall et al. (1997) :cite:`marshall:97a` are
                0087 employed. The flow is three-dimensional with just temperature,
                0088 :math:`\theta`, as an active tracer.
                0089 The viscous and diffusive terms provides viscous dissipation
                0090 and a diffusive sub-grid scale closure for the momentum and temperature equations, respectively.
                0091 A wind-stress momentum forcing is added to the
                0092 momentum equation for the zonal flow, :math:`u`. Other terms in the
                0093 model are explicitly switched off for this experiment configuration (see
                0094 :numref:`sec_eg_baroclinic_code_config`). This yields an active set of
                0095 equations solved in this configuration, written in spherical polar
                0096 coordinates as follows:
                0097 
                0098 .. math::
                0099    \frac{Du}{Dt} - fv -\frac{uv}{a}\tan{\varphi} +
                0100    \frac{1}{\rho_c a \cos{\varphi}}\frac{\partial p^{\prime}}{\partial \lambda} +
0bad585a21 Navi*0101     \nabla _h \cdot (-A_{h}  \nabla _h u) + \frac{\partial}{\partial z} \left( -A_{z}\frac{\partial u}{\partial z} \right)
94151a9b18 Jeff*0102    =  \mathcal{F}_u
                0103    :label: baroc_gyre_umom
                0104 
                0105 .. math::
                0106    \frac{Dv}{Dt} + fu + \frac{u^2}{a}\tan{\varphi} +
                0107    \frac{1}{\rho_c a}\frac{\partial p^{\prime}}{\partial \varphi} +
0bad585a21 Navi*0108     \nabla _h \cdot (-A_{h}  \nabla _h v) + \frac{\partial}{\partial z} \left( -A_{z}\frac{\partial v}{\partial z} \right)
94151a9b18 Jeff*0109    = \mathcal{F}_v
                0110    :label: baroc_gyre_vmom
                0111 
                0112 .. math::
                0113    \frac{\partial \eta}{\partial t} + \frac{1}{a \cos{\varphi}}  \left( \frac{\partial H \widehat{u}}{\partial \lambda} +
                0114    \frac{\partial H \widehat{v} \cos{\varphi}}{\partial \varphi} \right) = 0
                0115    :label: baroc_gyre_cont
                0116 
                0117 .. math::
0bad585a21 Navi*0118    \frac{D\theta}{Dt} +  \nabla _h \cdot (-\kappa_{h}  \nabla _h \theta)
94151a9b18 Jeff*0119    + \frac{\partial}{\partial z} \left( -\kappa_{z}\frac{\partial \theta}{\partial z} \right)
                0120    = \mathcal{F}_\theta
                0121    :label: barooc_gyre_theta
                0122 
                0123 .. math::
                0124    p^{\prime} =    g\rho_{c} \eta + \int^{0}_{z} g \rho^{\prime} dz
                0125    :label: baroc_gyre_press
                0126 
                0127 where :math:`u` and :math:`v` are the components of the horizontal flow
                0128 vector :math:`\vec{u}` on the sphere
                0129 (:math:`u=\dot{\lambda},v=\dot{\varphi}`), :math:`a` is the distance from the center of the Earth,
                0130 :math:`\rho_c` is a fluid density (which appears in the momentum equations,
                0131 and can be set differently than :math:`\rho_0` in :eq:`rhoprime_lineareos`),
                0132 :math:`A_h` and :math:`A_v` are horizontal and vertical viscosity, and
                0133 :math:`\kappa_h` and :math:`\kappa_v` are horizontal and vertical diffusivity, respectively.
                0134 The terms :math:`H\widehat{u}` and :math:`H\widehat{v}` are the components of the
                0135 vertical integral term given in equation :eq:`free-surface` and explained
                0136 in more detail in :numref:`press_meth_linear`.
                0137 However, for the problem presented here, the continuity relation
                0138 :eq:`baroc_gyre_cont` differs from the general form
                0139 given in :numref:`press_meth_linear`, equation :eq:`linear-free-surface=P-E`
                0140 because the source terms
                0141 :math:`{\mathcal P}-{\mathcal E}+{\mathcal R}` are all zero.
                0142 
                0143 The forcing terms :math:`\mathcal{F}_u`, :math:`\mathcal{F}_v`, and :math:`\mathcal{F}_\theta` are
                0144 applied as source terms in the model surface layer and are zero in the interior.
                0145 The windstress forcing, :math:`{\mathcal F}_u` and :math:`{\mathcal F}_v`, is
                0146 applied in the zonal and meridional momentum
0bad585a21 Navi*0147 equations, respectively; in this configuration, :math:`\mathcal{F}_u = \tau_x / (\rho_c\Delta z_s)`
94151a9b18 Jeff*0148 (where :math:`\Delta z_s` is the depth of the surface model gridcell), and
                0149 :math:`\mathcal{F}_v = 0`. Similarly, :math:`\mathcal{F}_\theta` is applied in the temperature equation,
                0150 as given by :eq:`baroc_restore_theta`.
                0151 
                0152 In :eq:`baroc_gyre_press` the pressure field, :math:`p^{\prime}`, is separated into a barotropic
                0153 part due to variations in sea-surface height, :math:`\eta`, and a
                0154 hydrostatic part due to variations in density, :math:`\rho^{\prime}`,
                0155 integrated through the water column. Note the :math:`g` in the first term on the right hand side is
                0156 MITgcm parameter :varlink:`gBaro` whereas in the seond term :math:`g` is parameter :varlink:`gravity`;
                0157 allowing for different gravity constants here is useful, for example, if one wanted to slow down external gravity waves.
                0158 
                0159 In the momentum equations, lateral and vertical boundary conditions for
0bad585a21 Navi*0160 the :math:`\nabla_{h}^{2}` and :math:`\partial_z^2` operators are specified in the
94151a9b18 Jeff*0161 runtime configuration - see :numref:`sec_eg_baroclinic_code_config`.
                0162 For temperature, the boundary condition along the bottom and sidewalls is zero-flux.
                0163 
                0164 Discrete Numerical Configuration
                0165 --------------------------------
                0166 
                0167 The domain is discretized with a uniform grid spacing in latitude and
                0168 longitude :math:`\Delta \lambda=\Delta \varphi=1^{\circ}`, so that there
                0169 are 60 active ocean grid cells in the zonal and meridional directions. As in tutorial
                0170 :ref:`Barotropic Ocean Gyre <sec_eg_baro>`, a border row of land cells surrounds the
                0171 ocean domain, so the full numerical grid size is 62\ :math:`\times`\ 62 in the horizontal.
                0172 The domain has 15 levels in the vertical, varying from :math:`\Delta z = 50` m deep in the surface layer
                0173 to 190 m deep in the bottom layer, as shown by the faint red lines in :numref:`baroclinic_gyre_config`.
                0174 The internal, locally orthogonal,
                0175 model coordinate variables :math:`x` and :math:`y` are initialized from
                0176 the values of :math:`\lambda`, :math:`\varphi`, :math:`\Delta \lambda`
                0177 and :math:`\Delta \varphi` in radians according to:
                0178 
                0179 .. math::
                0180    \begin{aligned} x &= a\cos(\varphi)\lambda, \phantom{WWW} \Delta x = a\cos(\varphi)\Delta \lambda \\
                0181    y &= a\varphi, \phantom{WWWWWW} \Delta y =  a\Delta \varphi \end{aligned}
                0182 
                0183 See :numref:`operators` for additional description of spherical coordinates.
                0184 
                0185 As described in :numref:`tracer_eqns`, the time evolution of
                0186 potential temperature :math:`\theta` in :eq:`barooc_gyre_theta`
                0187 is evaluated prognostically. The centered
                0188 second-order scheme with Adams-Bashforth II time stepping described in
                0189 :numref:`sub_tracer_eqns_ab` is used to step forward the
                0190 temperature equation.
                0191 
                0192 Prognostic terms in the momentum equations are
                0193 solved using flux form as described in :numref:`flux-form_momentum_equations`.
                0194 The pressure forces that drive
0bad585a21 Navi*0195 the fluid motions, :math:`\partial_{\lambda} p^\prime`
                0196 and :math:`\partial_{\varphi} p^\prime`, are found by
94151a9b18 Jeff*0197 summing pressure due to surface elevation :math:`\eta` and the
                0198 hydrostatic pressure, as discussed in :numref:`baroc_eq_solved`.
                0199 The hydrostatic part of the pressure is
                0200 diagnosed explicitly by integrating density.
                0201 The sea-surface height is found by solving implicitly the 2-D (elliptic) surface pressure equation
                0202 (see :numref:`press_meth_linear`).
                0203 
                0204 Numerical Stability Criteria
                0205 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                0206 
                0207 The analysis in this section is similar to that discussed in
                0208 tutorial :ref:`Barotropic Ocean Gyre <barotropic_gyre_stab_crit>`,
                0209 albeit with some added wrinkles. In this experiment, we not only have a larger model domain extent, with greater variation
                0210 in the Coriolis parameter between the southernmost and northernmost gridpoints, but also significant variation
                0211 in the grid :math:`\Delta x` spacing.
                0212 
                0213 In order to choose an appropriate time step, note that our smallest gridcells (i.e., in the far north)
                0214 have :math:`\Delta x \approx 29` km, which
                0215 is similar to our grid spacing in tutorial :ref:`Barotropic Ocean Gyre <barotropic_gyre_stab_crit>`. Thus, using the advective
0bad585a21 Navi*0216 CFL condition, first assuming our solution will achieve maximum horizontal advection :math:`|c_{\rm max}|` ~ 1 ms\ :sup:`-1`)
94151a9b18 Jeff*0217 
                0218 .. math::
0bad585a21 Navi*0219    S_{\rm adv} = 2 \left( \frac{ |c_{\rm max}| \Delta t}{ \Delta x} \right) < 0.5 \text{ for stability}
94151a9b18 Jeff*0220    :label: eq_baroc_cfl_stability
                0221 
                0222 we choose the same time step as in tutorial :ref:`Barotropic Ocean Gyre <barotropic_gyre_stab_crit>`,
0bad585a21 Navi*0223 :math:`\Delta t` = 1200 s (= 20 minutes), resulting in :math:`S_{\rm adv} = 0.08`.
94151a9b18 Jeff*0224 Also note this time step is stable for propagation of internal gravity waves:
                0225 approximating the propagation speed as :math:`\sqrt{g' h}` where :math:`g'` is reduced gravity (our maximum
                0226 :math:`\Delta \rho` using our linear equation of state is
                0227 :math:`\rho_{0} \alpha_{\theta} \Delta \theta = 6` kg/m\ :sup:`3`) and :math:`h` is the upper layer depth
0bad585a21 Navi*0228 (we'll assume 150 m), produces an estimated propagation speed generally less than :math:`|c_{\rm max}| = 3` ms\ :sup:`--1`
94151a9b18 Jeff*0229 (see Adcroft 1995 :cite:`adcroft:95` or Gill 1982 :cite:`gill:82`), thus still comfortably below the threshold.
                0230 
                0231 Using our chosen value of :math:`\Delta t`, numerical stability for inertial oscillations using Adams-Bashforth II
                0232 
                0233 .. math::
0bad585a21 Navi*0234    S_{\rm inert} = f {\Delta t} < 0.5 \text{ for stability}
94151a9b18 Jeff*0235    :label: eq_baroc_inertial_stability
                0236 
                0237 evaluates to 0.17 for the largest :math:`f` value in our domain (:math:`1.4\times10^{-4}` s\ :sup:`--1`),
                0238 below the stability threshold.
                0239 
                0240 To choose a horizontal Laplacian eddy viscosity :math:`A_{h}`, note that the largest :math:`\Delta x`
                0241 value in our domain (i.e., in the south) is :math:`\approx 110` km. With the Munk boundary width as follows,
                0242 
                0243 .. math::
0bad585a21 Navi*0244    M = \frac{2\pi}{\sqrt{3}}  \left( \frac { A_{h} }{ \beta } \right) ^{\frac{1}{3}}
94151a9b18 Jeff*0245    :label: baroc_munk_layer
                0246 
                0247 in order to to have a well resolved boundary current in the subtropical gyre we will set
                0248 :math:`A_{h} = 5000` m\ :sup:`2` s\ :sup:`--1`. This results in a boundary current
                0249 resolved across two to three grid cells in the southern portion of the domain.
                0250 
                0251 Given that our choice for :math:`A_{h}` in this experiment is an order of magnitude larger than in
                0252 tutorial :ref:`Barotropic Ocean Gyre <barotropic_gyre_stab_crit>`,
                0253 let's re-examine the stability of horizontal Laplacian friction:
                0254 
                0255 .. math::
0bad585a21 Navi*0256    S_{\rm Lh} = 2 \left( 4 \frac{A_{h} \Delta t}{{\Delta x}^2} \right)  < 0.6 \text{ for stability}
94151a9b18 Jeff*0257    :label: baroc_laplacian_stability
                0258 
                0259 evaluates to 0.057 for our smallest :math:`\Delta x`, which is below the stability threshold.
                0260 Note this same stability test also applies to horizontal Laplacian diffusion of tracers, with :math:`\kappa_{h}` replacing
                0261 :math:`A_{h}`, but we will choose :math:`\kappa_{h} \ll A_{h}` so this should not pose any stability issues.
                0262 
                0263 Finally, stability of vertical diffusion of momentum:
                0264 
                0265 .. math::
0bad585a21 Navi*0266    S_{\rm Lv} = 4 \frac{A_{v} \Delta t}{{\Delta z}^2} < 0.6 \text{ for stability}
94151a9b18 Jeff*0267    :label: baroc_laplacian_v_stability
                0268 
                0269 Here we will choose :math:`A_{v} = 1\times10^{-2}` m\ :sup:`2` s\ :sup:`--1`,
9c8516d9da Jeff*0270 so :math:`S_{lv}` evaluates to 0.02 for our minimum :math:`\Delta z`,
94151a9b18 Jeff*0271 well below the stability threshold. Note if we were to use Adams Bashforth II for diffusion of tracers
                0272 the same check would apply, with :math:`\kappa_{v}` replacing :math:`A_{v}`. However, we will instead choose
                0273 an implicit scheme for computing vertical diffusion of tracers (see :numref:`baroc_input_data`), which is unconditionally stable.
                0274 
                0275 .. _sec_eg_baroclinic_code_config:
                0276 
                0277 Configuration
                0278 -------------
                0279 
                0280 The model configuration for this experiment resides under the directory :filelink:`verification/tutorial_baroclinic_gyre/`.
                0281 
                0282 The experiment files
                0283 
                0284  - :filelink:`verification/tutorial_baroclinic_gyre/code/packages.conf`
                0285  - :filelink:`verification/tutorial_baroclinic_gyre/code/SIZE.h`
                0286  - :filelink:`verification/tutorial_baroclinic_gyre/code/DIAGNOSTICS_SIZE.h`
                0287  - :filelink:`verification/tutorial_baroclinic_gyre/input/data`
                0288  - :filelink:`verification/tutorial_baroclinic_gyre/input/data.pkg`
                0289  - :filelink:`verification/tutorial_baroclinic_gyre/input/data.mnc`
                0290  - :filelink:`verification/tutorial_baroclinic_gyre/input/data.diagnostics`
                0291  - :filelink:`verification/tutorial_baroclinic_gyre/input/eedata`
                0292  - verification/tutorial_baroclinic_gyre/input/bathy.bin
                0293  - verification/tutorial_baroclinic_gyre/input/windx_cosy.bin
                0294  - verification/tutorial_baroclinic_gyre/input/SST_relax.bin
                0295 
                0296 contain the code customizations, parameter settings, and input data files for this
                0297 experiment. Below we describe these customizations in detail.
                0298 
                0299 .. _tut_baroc_code_config:
                0300 
                0301 Compile-time Configuration
                0302 ~~~~~~~~~~~~~~~~~~~~~~~~~~
                0303 
                0304 File :filelink:`code/packages.conf <verification/tutorial_baroclinic_gyre/code/packages.conf>`
                0305 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                0306 
                0307 .. literalinclude:: ../../../verification/tutorial_baroclinic_gyre/code/packages.conf
                0308     :linenos:
                0309     :caption: verification/tutorial_baroclinic_gyre/code/packages.conf
                0310 
                0311 Here we specify which MITgcm packages we want to include in our configuration. ``gfd``
                0312 is a pre-defined "package group" (see :ref:`using_packages`)
                0313 of standard packages necessary for most setups; it is also the :ref:`default compiled packages <default_pkg_list>` setting
                0314 and the minimum set of packages necessary for GFD-type setups.
                0315 In addition to package group ``gfd`` we include two additional packages (individual packages, not package groups), :filelink:`mnc </pkg/mnc>`
                0316 and :filelink:`diagnostics </pkg/diagnostics>`. Package :filelink:`mnc </pkg/mnc>` is required
                0317 for output to be dumped in `netCDF <http://www.unidata.ucar.edu/software/netcdf>`_ format. Package :filelink:`diagnostics </pkg/diagnostics>`
                0318 allows one to choose output from a extensive list of model diagnostics, and specify output frequency, with multiple time averaging or snapshot options available.
                0319 Without this package enabled, output is limited to a small number of snapshot output fields. Subsequent tutorial experiments will explore the use
                0320 of packages which expand the physical and scientific capabilities of MITgcm, e.g., such as physical parameterizations or modeling capabilities
                0321 for tracers, ice, etc., that are not compiled unless specified.
                0322 
                0323 .. _baroc_code_size:
                0324 
                0325 File :filelink:`code/SIZE.h <verification/tutorial_baroclinic_gyre/code/SIZE.h>`
                0326 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                0327 
                0328 .. literalinclude:: ../../../verification/tutorial_baroclinic_gyre/code/SIZE.h
                0329     :linenos:
                0330     :caption: verification/tutorial_baroclinic_gyre/code/SIZE.h
                0331 
                0332 For this second tutorial, we will break the model domain into multiple tiles. Although initially we will
                0333 run the model on a single processor, a multi-tiled setup
                0334 is required when we demonstrate how to run the model using either
                0335 `MPI <https://en.wikipedia.org/wiki/Message_Passing_Interface>`_ or using multiple threads.
                0336 
                0337 The following lines calculate the horizontal size of the global model domain (NOT to be edited).
                0338 Our values for :filelink:`SIZE.h <verification/tutorial_baroclinic_gyre/code/SIZE.h>` parameters
                0339 below must multiply so that our horizontal model domain is 62\ :math:`\times`\ 62:
                0340 
                0341  .. literalinclude:: ../../../verification/tutorial_baroclinic_gyre/code/SIZE.h
                0342        :start-at: sNx*nSx
                0343        :end-at: sNy*nSy
                0344        :lineno-match:
                0345 
                0346 Now let's look at all individual :filelink:`SIZE.h <verification/tutorial_baroclinic_gyre/code/SIZE.h>` parameter settings.
                0347 
                0348 - Although our model domain is 62\ :math:`\times`\ 62, here we specify the size of a single tile to be one-half that
                0349   in both :math:`x` and :math:`y`. Thus, the model requires four of these tiles to cover the full ocean sector domain
                0350   (see below, where we set :varlink:`nSx` and :varlink:`nSy`). Note that the grid
                0351   can only be subdivided into tiles in the horizontal dimensions, not in the vertical.
                0352 
                0353   .. literalinclude:: ../../../verification/tutorial_baroclinic_gyre/code/SIZE.h
                0354        :start-at: sNx =
                0355        :end-at: sNy =
                0356        :lineno-match:
                0357 
                0358 - As in tutorial :ref:`Barotropic Ocean Gyre <barotropic_gyre_stab_crit>`, here we set the overlap extent of a model tile
                0359   to the value 2 in both :math:`x` and :math:`y`. In other words, although our model tiles are sized 31\ :math:`\times`\ 31,
                0360   in MITgcm array storage there are an additional 2 border rows surrounding
                0361   each tile which contain model data from neighboring tiles.
                0362   Some horizontal advection schemes and other parameter and setup choices
                0363   require a larger overlap setting (see :numref:`adv_scheme_summary`).
                0364   In our configuration, we are using a second-order center-differences advection scheme (the MITgcm default)
                0365   which does not requires setting a overlap beyond the MITgcm minimum 2.
                0366 
                0367   .. literalinclude:: ../../../verification/tutorial_barotropic_gyre/code/SIZE.h
                0368        :start-at: OLx =
                0369        :end-at: OLy =
                0370        :lineno-match:
                0371 
                0372 - These lines set parameters :varlink:`nSx` and :varlink:`nSy`,
                0373   the number of model tiles in the :math:`x` and :math:`y` directions, respectively,
                0374   which execute on a single process. Initially, we will run the model on a single core,
                0375   thus both :varlink:`nSx` and :varlink:`nSy` are set to 2 so that all :math:`2 \times 2 = 4` tiles are integrated forward in time.
                0376 
                0377   .. literalinclude:: ../../../verification/tutorial_baroclinic_gyre/code/SIZE.h
                0378        :start-at: nSx =
                0379        :end-at: nSy =
                0380        :lineno-match:
                0381 
                0382 - These lines set parameters :varlink:`nPx` and :varlink:`nPy`, the number of processes
                0383   to use in the :math:`x` and :math:`y` directions, respectively.
                0384   As noted, initially we will run using a single process, so for now these parameters are both set to 1.
                0385 
                0386   .. literalinclude:: ../../../verification/tutorial_baroclinic_gyre/code/SIZE.h
                0387        :start-at: nPx =
                0388        :end-at: nPy =
                0389        :lineno-match:
                0390 
                0391 - Here we tell the model we are using 15 vertical levels.
                0392 
                0393   .. literalinclude:: ../../../verification/tutorial_baroclinic_gyre/code/SIZE.h
                0394        :start-at: Nr  =
                0395        :end-at: Nr  =
                0396        :lineno-match:
                0397 
                0398 File :filelink:`code/DIAGNOSTICS_SIZE.h <verification/tutorial_baroclinic_gyre/code/DIAGNOSTICS_SIZE.h>`
                0399 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                0400 
                0401 .. literalinclude:: ../../../verification/tutorial_baroclinic_gyre/code/DIAGNOSTICS_SIZE.h
                0402     :linenos:
                0403     :caption: verification/tutorial_baroclinic_gyre/code/DIAGNOSTICS_SIZE.h
                0404 
                0405 In the default version :filelink:`/pkg/diagnostics/DIAGNOSTICS_SIZE.h` the storage array for diagnostics is purposely
                0406 set quite small, in other words forcing the user to assess how many diagnostics will be computed and thus choose an appropriate
                0407 size for a storage array. In the above file we have modified the value of parameter :varlink:`numDiags`:
                0408 
                0409   .. literalinclude:: ../../../verification/tutorial_baroclinic_gyre/code/DIAGNOSTICS_SIZE.h
                0410        :start-at: numDiags =
                0411        :end-at: numDiags =
                0412        :lineno-match:
                0413 
                0414 from its default value ``1*Nr``, which would only allow a single 3-D diagnostic to be computed and saved, to ``20*Nr``,
                0415 which will permit up to some combination of up to 20 3-D diagnostics or 300 2-D diagnostic fields.
                0416 
                0417 Run-time Configuration
                0418 ~~~~~~~~~~~~~~~~~~~~~~
                0419 
                0420 .. _baroc_input_data:
                0421 
                0422 File :filelink:`input/data <verification/tutorial_baroclinic_gyre/input/data>`
                0423 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                0424 
                0425 .. literalinclude:: ../../../verification/tutorial_baroclinic_gyre/input/data
                0426     :linenos:
                0427     :caption: verification/tutorial_baroclinic_gyre/input/data
                0428 
                0429 Parameters for this configuration
                0430 are set as follows.
                0431 
                0432 PARM01 - Continuous equation parameters
                0433 #######################################
                0434 
                0435 - These lines set parameters :varlink:`viscAh` and :varlink:`viscAr`, the horizontal and vertical Laplacian viscosities respectively,
                0436   to :math:`5000` m\ :sup:`2` s\ :sup:`--1` and :math:`1 \times 10^{-2}` m\ :sup:`2` s\ :sup:`--1`. Note the subscript :math:`r`
                0437   is used for the vertical, reflecting MITgcm's generic :math:`r`-vertical coordinate capability (i.e., the model is capable of
                0438   using either a :math:`z`-coordinate or a :math:`p`-coordinate system).
                0439 
                0440   .. literalinclude:: ../../../verification/tutorial_baroclinic_gyre/input/data
                0441        :start-at: viscAh
                0442        :end-at: viscAr
                0443        :lineno-match:
                0444 
                0445 - These lines set parameters to specify the boundary conditions for momentum on the model domain sidewalls and bottom.
                0446   Parameter :varlink:`no_slip_sides` is set to ``.TRUE.``, i.e., no-slip lateral boundary conditions (the default), which will yield a Munk (1950) :cite:`munk:50` western boundary solution.
                0447   Parameter :varlink:`no_slip_bottom` is set to ``.FALSE.``, i.e., free-slip bottom boundary condition (default is true).
                0448   If instead of a Munk layer we desired a Stommel (1948) :cite:`stommel:48` western boundary layer solution, we would opt for free-slip lateral boundary conditions and no-slip conditions along the bottom.
                0449 
                0450   .. literalinclude:: ../../../verification/tutorial_baroclinic_gyre/input/data
                0451        :start-at: slip_sides
                0452        :end-at: slip_bottom
                0453        :lineno-match:
                0454 
                0455 - These lines set parameters :varlink:`diffKhT` and :varlink:`diffKrT`,
                0456   the horizontal and vertical Laplacian temperature diffusivities respectively,
                0457   to :math:`1000` m\ :sup:`2` s\ :sup:`--1` and :math:`1 \times 10^{-5}` m\ :sup:`2` s\ :sup:`--1`.The boundary condition on this
                0458   operator is zero-flux at all boundaries.
                0459 
                0460   .. literalinclude:: ../../../verification/tutorial_baroclinic_gyre/input/data
                0461        :start-at: diffKhT
                0462        :end-at: diffKrT
                0463        :lineno-match:
                0464 
                0465 - By default, MITgcm does not apply any parameterization to mix statically unstable columns of water. In a coarse resolution, hydrostatic
                0466   configuration, typically such a parameterization is desired. We recommend a scheme which
                0467   simply applies (presumably, large) vertical diffusivity between statically unstable grid cells in the vertical. This vertical diffusivity
                0468   is set by parameter :varlink:`ivdc_kappa`, which here we set to :math:`1.0` m\ :sup:`2` s\ :sup:`--1`. This scheme requires that
                0469   :varlink:`implicitDiffusion` is set to ``.TRUE.`` (see :numref:`implicit-backward-stepping`;
                0470   more specifically, applying a large vertical diffusivity to represent convective mixing
                0471   requires the use of an implicit
                0472   time-stepping method for vertical diffusion, rather than Adams Bashforth II).
                0473   Alternatively, a traditional convective adjustment scheme is available; this can be activated
                0474   through the :varlink:`cAdjFreq` parameter, see :numref:`ocean_convection_parms`.
                0475 
                0476   .. literalinclude:: ../../../verification/tutorial_baroclinic_gyre/input/data
                0477        :start-at: ivdc
                0478        :end-at: implicitDiff
                0479        :lineno-match:
                0480 
                0481 .. _tut_baroc_linear_eos:
                0482 
                0483 - The following parameters tell the model to use a linear equation of state.
                0484   Note a list of :varlink:`Nr` (=15, from :filelink:`SIZE.h <verification/tutorial_baroclinic_gyre/code/SIZE.h>`)
                0485   potential temperature values in :sup:`o`\ C is specified for parameter :varlink:`tRef`, ordered from surface to depth.
                0486   :varlink:`tRef` is used for two purposes here.
0bad585a21 Navi*0487   First, anomalies in density are computed using this reference :math:`\theta`, :math:`\theta'(x,y,z) = \theta(x,y,z) - \theta_{\rm ref}(z)`;
94151a9b18 Jeff*0488   see use in :eq:`rho_lineareos` and :eq:`rhoprime_lineareos`.
                0489   Second, the model will use these reference temperatures for its initial state, as we are not providing a pickup file
                0490   nor specifying an initial temperature hydrographic file (in later tutorials we will demonstrate how to do so).
                0491   For each depth level the initial and reference profiles will be uniform in :math:`x` and :math:`y`.
                0492   Note when checking static stability or computing :math:`N^2`, the density gradient resulting from these specified reference levels
                0493   is added to :math:`\partial \rho' / \partial z` from :eq:`rhoprime_lineareos`.
                0494   Finally, we set the thermal expansion coefficient :math:`\alpha_{\theta}` (:varlink:`tAlpha`)
                0495   as used in :eq:`rho_lineareos` and :eq:`rhoprime_lineareos`, while setting
                0496   the haline contraction coefficient (:varlink:`sBeta`) to zero (see :eq:`rho_lineareos`, which omits a salinity contribution to the
                0497   linear equation of state; like tutorial :ref:`Barotropic Ocean Gyre <sec_eg_baro>`,
                0498   salinity is not included as a tracer in this very idealized model setup).
                0499 
                0500   .. literalinclude:: ../../../verification/tutorial_baroclinic_gyre/input/data
                0501        :start-at: eosType
                0502        :end-at: sBeta
                0503        :lineno-match:
                0504 
                0505 - This line sets parameter :math:`\rho_0` (:varlink:`rhoNil`) to 999.8 kg/m\ :sup:`3`, the surface reference density for our linear equation of state,
                0506   i.e., the density of water at tRef(k=1). This value will also be used
                0507   as :math:`\rho_c` (parameter :varlink:`rhoConst`) in :eq:`baroc_gyre_umom`-:eq:`baroc_gyre_press`,
                0508   lacking a separate explicit assignment of :varlink:`rhoConst` in ``data``.
                0509   Note this value is the model default value for :varlink:`rhoNil`.
                0510 
                0511   .. literalinclude:: ../../../verification/tutorial_baroclinic_gyre/input/data
                0512        :start-at: rhoNil
                0513        :end-at: rhoNil
                0514        :lineno-match:
                0515 
                0516 - This line sets parameter :varlink:`gravity`, the acceleration due to gravity :math:`g` in :eq:`baroc_gyre_press`, and this value will also
                0517   be used to set :varlink:`gBaro`, the barotopic (i.e., free surface-related)
                0518   gravity parameter which we set in tutorial :ref:`Barotropic Ocean Gyre <barotropic_gyre_stab_crit>`.
                0519   This is the MITgcm default value.
                0520 
                0521   .. literalinclude:: ../../../verification/tutorial_baroclinic_gyre/input/data
                0522        :start-at: gravity
                0523        :end-at: gravity
                0524        :lineno-match:
                0525 
                0526 - These lines set parameters which prescribe the linearized free surface formulation,
                0527   similar to tutorial :ref:`Barotropic Ocean Gyre <barotropic_gyre_stab_crit>`. Note
                0528   we have added parameter :varlink:`exactConserv`, set to ``.TRUE.``: this instructs the model to
                0529   recompute divergence after the pressure solver step, ensuring volume conservation of the free surface solution
                0530   (the model default is NOT to recompute divergence, but given the small numerical cost, we typically recommend doing so).
                0531 
                0532   .. literalinclude:: ../../../verification/tutorial_baroclinic_gyre/input/data
                0533        :start-at: rigidLid
                0534        :end-at: exactConserv
                0535        :lineno-match:
                0536 
                0537 - As in tutorial :ref:`Barotropic Ocean Gyre <barotropic_gyre_stab_crit>`, we
                

** Warning **

Wide character in print at /usr/local/share/lxr/source line 1030, <$git> line 539.

0538 suppress MITgcm’s forward time integration of salt in the tracer equations. 0539 0540 .. literalinclude:: ../../../verification/tutorial_baroclinic_gyre/input/data 0541 :start-at: saltStepping 0542 :end-at: saltStepping 0543 :lineno-match: 0544 0545 PARM02 - Elliptic solver parameters 0546 ################################### 0547 0548 These parameters are unchanged from tutorial :ref:`Barotropic Ocean Gyre <barotropic_gyre_stab_crit>`. 0549 0550 .. _baroc_parm03: 0551 0552 PARM03 - Time stepping parameters 0553 ################################# 0554 0555 - In tutorial :ref:`Barotropic Ocean Gyre <barotropic_gyre_stab_crit>` we specified a starting iteration number :varlink:`nIter0` 0556 and a number of time steps to integrate, :varlink:`nTimeSteps`. Here we opt to use another approach to control run start and duration: 0557 we set a :varlink:`startTime` and :varlink:`endTime`, both in units of seconds. Given a starting time of 0.0, the model starts 0558 from rest using specified initial values of temperature (here, as previously noted, from the :varlink:`tRef` parameter) rather than attempting 0559 to restart from a saved checkpoint file. The specified value for :varlink:`endTime`, 12000.0 seconds 0560 is equivalent to 10 time steps, set for testing purposes. 0561 To integrate over a longer, more physically relevant period of time, uncomment the :varlink:`endTime` and :varlink:`monitorFreq` lines 0562 located near the end of this parameter block. Note, for simplicity, our units for these time choices assume a 360-day "year" 0563 and 30-day "month" (although lacking a seasonal cycle in our forcing, defining a "year" is immaterial; we will demonstrate how to apply time-varying 0564 forcings in later tutorials). 0565 0566 .. literalinclude:: ../../../verification/tutorial_baroclinic_gyre/input/data 0567 :start-at: startTime 0568 :end-at: endTime 0569 :lineno-match: 0570 0571 .. literalinclude:: ../../../verification/tutorial_baroclinic_gyre/input/data 0572 :start-at: for longer 0573 :end-at: Freq=2592 0574 :lineno-match: 0575 0576 - Remaining time stepping parameter choices (specifically, :math:`\Delta t`, 0577 checkpoint frequency, output frequency, and monitor settings) 0578 are described in tutorial :ref:`Barotropic Ocean Gyre <barotropic_gyre_stab_crit>`; 0579 refer to the description :ref:`here <baro_time_stepping_parms>`. 0580 0581 .. literalinclude:: ../../../verification/tutorial_baroclinic_gyre/input/data 0582 :start-at: deltaT 0583 :end-at: monitorSelect 0584 :lineno-match: 0585 0586 - The parameter :varlink:`tauThetaClimRelax` sets the time scale, in seconds, 0587 for restoring potential temperature in the model's top surface layer (see :eq:`baroc_restore_theta`). 0588 Our choice here of 2,592,000 seconds is equal to 30 days. 0589 0590 .. literalinclude:: ../../../verification/tutorial_baroclinic_gyre/input/data 0591 :start-at: tauTheta 0592 :end-at: tauTheta 0593 :lineno-match: 0594 0595 PARM04 - Gridding parameters 0596 ############################ 0597 0598 - This line sets parameter :varlink:`usingSphericalPolarGrid`, which specifies that the simulation will use spherical polar coordinates 0599 (and affects the interpretation of other grid coordinate parameters). 0600 0601 .. literalinclude:: ../../../verification/tutorial_baroclinic_gyre/input/data 0602 :start-at: usingSpherical 0603 :end-at: usingSpherical 0604 :lineno-match: 0605 0606 - These lines set the horizontal grid spacing, as vectors :varlink:`delX` and :varlink:`delY` 0607 (i.e., :math:`\Delta x` and :math:`\Delta y` respectively), with units of degrees 0608 as dictated by our choice :varlink:`usingSphericalPolarGrid`. 0609 As before, this syntax indicates that we specify 62 values in both the :math:`x` and :math:`y` directions, which matches the 0610 global domain size as specified in :filelink:`SIZE.h <verification/tutorial_barotropic_gyre/code/SIZE.h>`. 0611 Our ocean sector domain starts at :math:`0^\circ` longitude and :math:`15^\circ` N; accounting for a surrounding land 0612 row of cells, we thus set the origin in longitude to :math:`-1.0^\circ` and in latitude to :math:`14.0^\circ`. 0613 Again note that our origin specifies the southern and western edges of the gridcell, not the cell center location. 0614 Setting the origin in latitude is critical given that it affects the Coriolis parameter :math:`f` 0615 (which appears in :eq:`baroc_gyre_umom` and :eq:`baroc_gyre_vmom`); the default value for :varlink:`ygOrigin` is :math:`0.0^\circ`. 0616 Note that setting :varlink:`xgOrigin` is optional, given that absolute longitude does not appear in the equation discretization. 0617 0618 .. literalinclude:: ../../../verification/tutorial_baroclinic_gyre/input/data 0619 :start-at: delX 0620 :end-at: ygOrigin 0621 :lineno-match: 0622 0623 - This line sets parameter :varlink:`delR`, the vertical grid spacing in the :math:`z`-coordinate (i.e., :math:`\Delta z`), 0624 to a vector of 15 depths (in meters), from 50 m in the surface layer to a bottom layer depth of 190 m. The sum of these 0625 specified depths equals 1800 m, the full depth :math:`H` of our idealized ocean sector. 0626 0627 .. literalinclude:: ../../../verification/tutorial_baroclinic_gyre/input/data 0628 :start-at: delR 0629 :end-at: delR 0630 :lineno-match: 0631 0632 PARM05 - Input datasets 0633 ####################### 0634 0635 - Similar to tutorial :ref:`Barotropic Ocean Gyre <barotropic_gyre_stab_crit>`, these lines specify filenames for bathymetry 0636 and surface wind stress forcing files. 0637 0638 .. literalinclude:: ../../../verification/tutorial_baroclinic_gyre/input/data 0639 :start-at: bathyFile 0640 :end-at: zonalWindFile 0641 :lineno-match: 0642 0643 - This line specifies parameter :varlink:`thetaClimFile`, the filename for the (2-D) restoring temperature field. 0644 0645 .. literalinclude:: ../../../verification/tutorial_baroclinic_gyre/input/data 0646 :start-at: thetaClimFile 0647 :end-at: thetaClimFile 0648 :lineno-match: 0649 0650 File :filelink:`input/data.pkg <verification/tutorial_baroclinic_gyre/input/data.pkg>` 0651 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 0652 0653 .. literalinclude:: ../../../verification/tutorial_baroclinic_gyre/input/data.pkg 0654 :linenos: 0655 :caption: verification/tutorial_baroclinic_gyre/input/data.pkg 0656 0657 Here we activate two MITgcm packages that are not included with the model by default: 0658 package :filelink:`mnc <pkg/mnc>` (see :numref:`pkg_mnc`) specifies that model output should be written in `netCDF <http://www.unidata.ucar.edu/software/netcdf>`_ format, 0659 and package :filelink:`diagnostics <pkg/diagnostics>` (see :numref:`sub_outp_pkg_diagnostics`) allows user-selectable diagnostic output. 0660 The boolean parameters set are :varlink:`useMNC` and :varlink:`useDiagnostics`, respectively. 0661 Note these add-on packages also need to be specified when the model is compiled, see :numref:`tut_baroc_code_config`. 0662 Apart from these two additional packages, only standard packages (i.e., those compiled in MITgcm by default) are required for this setup. 0663 0664 .. _baroc_datamnc: 0665 0666 File :filelink:`input/data.mnc <verification/tutorial_baroclinic_gyre/input/data.mnc>` 0667 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 0668 0669 .. literalinclude:: ../../../verification/tutorial_baroclinic_gyre/input/data.mnc 0670 :linenos: 0671 :caption: verification/tutorial_baroclinic_gyre/input/data.mnc 0672 0673 This file sets parameters which affect package :filelink:`pkg/mnc` behavior; in fact, with :filelink:`pkg/mnc` enabled, it is required 0674 (many packages look for file ``data.«PACKAGENAME»`` and will terminate if not present). 0675 By setting the parameter :varlink:`monitor_mnc` to ``.FALSE.`` 0676 we are specifying NOT to create separate `netCDF <http://www.unidata.ucar.edu/software/netcdf>`_ 0677 output files for :filelink:`pkg/monitor` output, but rather to include this monitor output in the standard output file 0678 (see :numref:`baro_gyre_build_run`). See :numref:`pkg_mnc_inputs` for a complete 0679 listing of :filelink:`pkg/mnc` namelist parameters and their default settings. 0680 ce0d9af5ea Jeff*0681 Unlike raw binary output, which overwrites any existing files, when using mnc output the model will create new directories if the parameters 0682 :varlink:`mnc_use_outdir` and :varlink:`mnc_outdir_str` are set, as above; the model will append a 4-digit number to :varlink:`mnc_outdir_str`, 0683 starting at 0001, incrementing as needed if existing directories already exist. 0684 If these parameters are NOT set, the model will terminate with an error if one attempts 0685 to overwrite an existing ``.nc`` file (in other words, to re-run in an previous run directory, 0686 one must delete all ``*.nc`` files before restarting). Note that our subdirectory name choice ``mnc_test_`` is required 0687 by :ref:`MITgcm automated testing <code_testing_protocols>` protocols, and can be changed to something more mnemonic, if desired. 0688 0689 In general, it is good practice to write diagnostic output into subdirectories, to keep the top run directory 0690 less "cluttered"; some unix file systems do not respond well when very large numbers of files are produced, which can 0691 occur in setups divided into many tiles and/or when many diagnostics are selected for output. 94151a9b18 Jeff*0692 0693 .. _baroc_diags_list: 0694 0695 File :filelink:`input/data.diagnostics <verification/tutorial_baroclinic_gyre/input/data.diagnostics>` 0696 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 0697 0698 .. literalinclude:: ../../../verification/tutorial_baroclinic_gyre/input/data.diagnostics 0699 :linenos: 0700 :caption: verification/tutorial_baroclinic_gyre/input/data.diagnostics 0701 0702 .. _baroc_diags_parms: 0703 0704 DIAGNOSTICS_LIST - Diagnostic Package Choices 0705 ############################################# 0706 0707 In this section we specify what diagnostics we want to compute, how frequently to compute them, and the name of output files. 0708 Multiple diagnostic fields can be grouped into individual files (i.e., an individual output file here is associated with a 'list' of diagnostics). 0709 0710 .. literalinclude:: ../../../verification/tutorial_baroclinic_gyre/input/data.diagnostics 0711 :start-at: fields(1:3,1 0712 :end-at: frequency(1 0713 :lineno-match: 0714 0715 The above lines tell MITgcm that our first list will consist of three diagnostic variables: 0716 0717 - ETAN - the linearized free surface height (m) 0718 - TRELAX - the heat flux entering the ocean due to surface temperature relaxation (W/m\ :sup:`2`) 0719 - MXLDEPTH - the depth of the mixed layer (m), as defined here by a given magnitude decrease 0720 in density from the surface (we'll use the model default for :math:`\Delta \rho`) 0721 0722 Note that all these diagnostic 0723 fields are 2-D output. **2-D and 3-D diagnostics CANNOT be mixed in a diagnostics list.** 0724 These variables are specified in parameter :varlink:`fields`: the first index is specified as ``1:«NUMBER_OF_DIAGS»``, the second index 0725 designates this for diagnostics list 1. Next, the output filename for diagnostics list 1 is specified in variable :varlink:`fileName`. Finally, 0726 for this list we specify variable :varlink:`frequency` to provide time-averaged output every 31,104,000 seconds, 0727 i.e., once per year. Had we entered 0728 a negative value for :varlink:`frequency`, MITgcm would have instead written snapshot data at this interval. 0729 Next, we set up a second diagnostics list for several 3-D diagnostics. 0730 0731 .. literalinclude:: ../../../verification/tutorial_baroclinic_gyre/input/data.diagnostics 0732 :start-at: fields(1:5,2 0733 :end-at: frequency(2 0734 :lineno-match: 0735 0736 The diagnostics in list 2 are: 0737 0738 - THETA - potential temperature (:sup:`o`\ C ) 0739 - PHYHYD - hydrostatic pressure potential anomaly (m\ :sup:`2`/s\ :sup:`2`) 0740 - UVEL, VVEL, WVEL - the zonal, meridional, and vertical velocity components respectively (m/s) 0741 0742 Here we did not specify parameter :varlink:`levels`, so all depth levels will be included in the output. 0743 An example of syntax to limit which depths are output is ``levels(1:5,2) = 1.,2.,3.,``, which would dump just the top three levels. 0744 We again specify an output file name via parameter :varlink:`fileName`, and specify a time-average period of one year 0745 through parameter :varlink:`frequency`. 0746 0747 .. _baroc_stat_diags: 0748 0749 DIAG_STATIS_PARMS - Diagnostic Per Level Statistics 0750 ################################################### 0751 0752 It is also possible to request output statistics averaged for global mean and by level average (for 3-D diagnostics) over the full domain, 0753 and/or for a pre-defined :math:`(x,y)` region of the model grid. The statistics computed for each diagnostic are as follows: 0754 0755 - (area weighted) mean (in both space and time, if time-averaged frequency is selected) 0756 - (area weighted) standard deviation 0757 - minimum value 0758 - maximum value 0759 - volume of the area used in the calculation (multiplied by the number of time steps if time-averaged). 0760 0761 While these statistics could in theory also be calculated (by the user) from 2-D and 3-D :varlink:`DIAGNOSTICS_LIST` output, the advantage 0762 is that much higher frequency statistical output can be achieved without filling up copious amounts of disk space. 0763 0764 Options for namelist :varlink:`DIAG_STATIS_PARMS` are set as follows: 0765 0766 .. literalinclude:: ../../../verification/tutorial_baroclinic_gyre/input/data.diagnostics 0767 :start-at: stat_fields(1 0768 :end-at: stat_freq 0769 :lineno-match: 0770 0771 The syntax here is analogous with :varlink:`DIAGNOSTICS_LIST` namelist parameters, except the parameter names begin with ``stat`` 0772 (here, :varlink:`stat_fields`, :varlink:`stat_fName`, :varlink:`stat_freq`). Frequency can be set to snapshot or time-averaged output, 0773 and multiple lists of diagnostics (i.e., separate output files) can be specified. The only major difference from 0774 :varlink:`DIAGNOSTICS_LIST` syntax is that 2-D and 3-D diagnostics can be mixed in a list. 0775 As noted, it is possible to select limited horizontal regions of interest, in addition to the full domain calculation. 0776 0777 File :filelink:`input/eedata <verification/tutorial_baroclinic_gyre/input/eedata>` 0778 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 0779 .. literalinclude:: ../../../verification/tutorial_baroclinic_gyre/input/eedata 0780 :linenos: 0781 :caption: verification/tutorial_baroclinic_gyre/input/eedata 0782 0783 As shown, this file is configured for a single-threaded run, but will be modified later in this tutorial for a multi-threaded setup 0784 (:numref:`baroc_openmp`). 0785 0786 .. _baroc_gyre_bathy_file: 0787 0788 Files ``input/bathy.bin``, ``input/windx_cosy.bin`` 0789 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 0790 83cdbd2346 Jeff*0791 The purpose and format of these files is similar to tutorial :ref:`Barotropic Ocean Gyre <baro_gyre_bathy_file>`, ce0d9af5ea Jeff*0792 and were generated by matlab script :filelink:`verification/tutorial_baroclinic_gyre/input/gendata.m` 0793 (alternatively, python script :filelink:`gendata.py <verification/tutorial_baroclinic_gyre/input/gendata.py>`). 83cdbd2346 Jeff*0794 See :numref:`sec_mitgcm_inp_file_format` for additional information on MITgcm input data file format specifications. 94151a9b18 Jeff*0795 0796 File ``input/SST_relax.bin`` 0797 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 0798 83cdbd2346 Jeff*0799 This file specifies a 2-D(:math:`x,y`) map of surface relaxation temperature values, ce0d9af5ea Jeff*0800 as generated by :filelink:`verification/tutorial_baroclinic_gyre/input/gendata.m` or 0801 :filelink:`gendata.py <verification/tutorial_baroclinic_gyre/input/gendata.py>`. 94151a9b18 Jeff*0802 0803 .. _building_tutorial_baroc: 0804 0805 Building and running the model 0806 ------------------------------ 0807 0808 To build and run the model on a single processor, follow the procedure outlined in :numref:`baro_gyre_build_run`. 0809 To run the model for a longer period (i.e., to obtain a reasonable solution; for testing purposes, 0810 by default the model is set to run only a few time steps) uncomment the lines in ``data`` which specify 0811 larger numbers for parameters :varlink:`endTime` and :varlink:`monitorFreq`. This will run the model for 100 years, which 0812 will likely take several hours on a single processor (depending on your computer specs); below we also give instructions for running the model 0813 in parallel either using `MPI <https://en.wikipedia.org/wiki/Message_Passing_Interface>`_ 0814 or multi-threaded (`OpenMP <https://en.wikipedia.org/wiki/OpenMP>`_), which 0815 will cut down run time significantly. 0816 0817 Output Files 0818 ~~~~~~~~~~~~ 0819 0820 As in tutorial :ref:`sec_eg_baro`, standard output is produced (redirected into 0821 file ``output.txt`` as specified in :numref:`baro_gyre_build_run`); like before, this file 0822 includes model startup information, parameters, etc. (see :numref:`barotropic_gyre_std_out`). 0823 And because we set :varlink:`monitor_mnc` ``=.FALSE.`` in :ref:`data.mnc <baroc_datamnc>`, 0824 our standard output file will include all monitor statistics output. Note monitor statistics and cg2d 0825 information are evaluated over the global domain, despite the bifurcation of the grid into four separate tiles. 0826 As before, the file ``STDERR.0000`` will contain a log of any run-time errors. 0827 0828 With :filelink:`pkg/mnc` compiled and activated in ``data.pkg``, other output is 0829 in `netCDF <http://www.unidata.ucar.edu/software/netcdf>`_ format: grid information, 0830 snapshot output specified in ``data``, diagnostics output specified in ``data.diagnostics`` 0831 and separate files containing hydrostatic pressure data (see below). 0832 There are two notable differences from standard binary output. Recall that we specified 0833 that the grid was subdivided into four separate tiles (in :ref:`SIZE.h <baroc_code_size>`); 0834 instead of a ``.XXX.YYY.`` file naming scheme for different tiles (as discussed :ref:`here <tut_barotropic_tilenaming>`), 0835 with :filelink:`pkg/nmc` the file names contain ``.t«nnn».`` where «nnn» is the 0836 tile number. Secondly, model data from multiple 0837 time snapshots (or periods) is included in a single file. Although an iteration 0838 number is still part of the file name (here, ``0000000000``), 0839 this is the iteration number at the start of the run (instead of 0840 marking the specific iteration number for the data contained in the file, as the case 0841 for standard binary output). Note that if you dump data frequently, standard binary can produce 0842 huge quantities of separate files, whereas using `netCDF <http://www.unidata.ucar.edu/software/netcdf>`_ 0843 will greatly reduce the number of files. On the other hand, the 0844 `netCDF <http://www.unidata.ucar.edu/software/netcdf>`_ files created can instead become quite large. 0845 0846 To more easily process and plot our results as a single array over the full domain, ce0d9af5ea Jeff*0847 we will first reassemble the individual tiles into new `netCDF <http://www.unidata.ucar.edu/software/netcdf>`_ format global data files. 0848 To accomplish this, we will make use of utility script :filelink:`utils/python/MITgcmutils/scripts/gluemncbig`. 0849 From the output run (top) directory, type: 0850 0851 .. _baroc_gluemnc_steps: 94151a9b18 Jeff*0852 0853 :: 0854 0855 % ln -s ../../../utils/python/MITgcmutils/scripts/gluemncbig . 0856 % ./gluemncbig -o grid.nc mnc_test_*/grid.t*.nc 0857 % ./gluemncbig -o state.nc mnc_test_*/state*.t*.nc 0858 % ./gluemncbig -o dynDiag.nc mnc_test_*/dynDiag*.t*.nc 0859 % ./gluemncbig -o surfDiag.nc mnc_test_*/surfDiag*.t*.nc 0860 % ./gluemncbig -o phiHyd.nc mnc_test_*/phiHyd*.t*.nc 0861 % ./gluemncbig -o phiHydLow.nc mnc_test_*/phiHydLow*.t*.nc ce0d9af5ea Jeff*0862 % ln -s mnc_test_0001/dynStDiag.0000000000.t001.nc dynStDiag.nc 94151a9b18 Jeff*0863 ce0d9af5ea Jeff*0864 For help using this utility, type ``gluemncbig --help`` (note, this utility requires python). 94151a9b18 Jeff*0865 The files ``grid.nc``, ``state.nc``, etc. are concatenated from the separate ``t001``, ``t002``, ``t003``, ``t004`` files ce0d9af5ea Jeff*0866 into global grid files of horizontal dimension 62\ :math:`\times`\ 62. ``gluemncbig`` is a fairly intelligent script, and by inserting the wildcards 0867 in the path/filename specification, it will grab the most recent run (in case you have started up runs multiple times in this directory, 0868 thus having ``mnc_test_0001``, ``mnc_test_0002``, etc. directories present; see :numref:`baroc_datamnc`). 0869 Note that the last line above is simply making 0870 a link to a file in the ``mnc_test_0001`` output subdirectory; this is the :ref:`statistical-dynamical diagnostics <baroc_stat_diags>` 0871 output, which is already assembled over the global domain (and also note here we are required to be specific which ``mnc_test_`` directory to link from). 0872 For convenience we simply place the link at the top level 0873 of the run directory, where the other assembled ``.nc`` files are saved by ``gluemncbig``. 94151a9b18 Jeff*0874 0875 Let's proceed through the netcdf output that is produced. 0876 0877 - ``grid.nc`` - includes all the model grid variables used by MITgcm. 0878 This includes the grid cell center points and separation (:varlink:`XC`, :varlink:`YC`, :varlink:`dxC`, :varlink:`dyC`), 0879 corner point locations and separation (:varlink:`XG`, :varlink:`YG`, :varlink:`dxG`, :varlink:`dyG`), 0880 the separation between velocity points (:varlink:`dyU`, :varlink:`dxV`), 0881 vertical coordinate location and separation (:varlink:`RC`, :varlink:`RF`, :varlink:`drC`, :varlink:`drF`), 0882 grid cell areas (:varlink:`rA`, :varlink:`rAw`, :varlink:`rAs`, :varlink:`rAz`), 0883 and bathymetry information (:varlink:`Depth`, :varlink:`HFacC`, :varlink:`HFacW`, :varlink:`HFacS)`. 0884 See :numref:`spatial_discret_dyn_eq` for definitions and description of the C grid staggering of these variables. 0885 There are also grid variables in vector form that are not used in the MITgcm source code 0886 (X, Y, Xp1, Yp1, Z, Zp1, Zu, Zl); see description in ``grid.nc``. The variables named p1 include an additional data point 0887 and are dimensioned +1 larger than the standard array size; for example, ``Xp1`` is the longitude of the gridcell left corner, and 0888 includes an extra data point for the last gridcell's right corner longitude. 0889 0890 - ``state.nc`` - includes snapshots of state variables U, V, W, Temp, S, and Eta 0891 at model times T in seconds (variable iter(T) stores the model iteration corresponding with these model times). 0892 Also included are vector forms of grid variables X, Y, Z, Xp1, Yp1, and Zl. 0893 As mentioned, in model output-by-tile files, e.g., ``state.0000000000.t001.nc``, the iteration number ``0000000000`` is the parameter :varlink:`nIter0` for the model run 0894 (recall, we initialized our model with :varlink:`nIter0` =0). 0895 Snapshots of model state are written for model iterations 0, 25920, 51840, ... 0896 according to our ``data`` file parameter choice :varlink:`dumpFreq` (:varlink:`dumpFreq`/:varlink:`deltaT` = 25920). 0897 0898 - ``surfDiag.nc`` - includes output diagnostics as specified from list 1 in 0899 :ref:`data.diagnostics <baroc_diags_list>`. 0900 Here we specified that list 1 include 2-D diagnostics ``ETAN``, ``TRELAX``, and ``MXLDEPTH``. 0901 Also includes an array of model times corresponding to the end of the time-average period, the iteration 0902 number corresponding to these model times, and vector forms of grid variables which describe these data. 0903 A Z index is included in the output arrays, even though 0904 its dimension is one (given that this list contains only 2-D fields). 0905 0906 - ``dynDiag.nc`` - similar to ``surfDiag.nc`` except this file contains the time-averaged 3-D diagnostics 0907 we specified in list 2 of :ref:`data.diagnostics <baroc_diags_list>`: 0908 ``THETA``, ``PHIHYD``, ``UVEL``, ``VVEL``, ``WVEL``. 0909 ce0d9af5ea Jeff*0910 - ``dynStDiag.nc`` - includes output statistical-dynamical diagnostics as specified in the ``DIAG_STATIS_PARMS`` section of 0911 :filelink:`data.diagnostics <verification/tutorial_baroclinic_gyre/input/data.diagnostics>`. Like ``surfDiag.nc`` it also 0912 includes an array of model times and corresponding iteration numbers for each time-average period end. Output variables are 3-D: 0913 (time, region, depth). In :filelink:`data.diagnostics <verification/tutorial_baroclinic_gyre/input/data.diagnostics>`, 0914 we have not defined any additional regions (and by default only global output is produced, "region 1"). Depth-integrated statistics 0915 are computed (in which case the depth subscript has a range of one element; this is also the case for surface diagnostics such as ``TRELAX``), 0916 but output is also tabulated at each depth for some variables (i.e., the depth subscript will range from 1 to :varlink:`Nr`). 0917 94151a9b18 Jeff*0918 - ``phiHyd.nc``, ``phiHydLow.nc`` - these files contain a snapshot 3-D field of hydrostatic 0919 pressure potential anomaly (:math:`p'/\rho_c`, see :numref:`finding_the_pressure_field`) 0920 and a snapshot 2-D field of bottom hydrostatic pressure potential anomaly, respectively. 0921 These are technically not MITgcm state variables, as they are computed `during` the time step 0922 (normal snapshot state variables are dumped `after` the time step), 0923 ergo they are not included in file ``state.nc``. Like ``state.nc`` output however 0924 these fields are written at interval according to 0925 :varlink:`dumpFreq`, except are not written out at time :varlink:`nIter0` (i.e., have one time 0926 record fewer than ``state.nc``). Also note when writing standard binary output, these filenames begin as ``PH`` and ``PHL`` respectively. 0927 9c8516d9da Jeff*0928 .. _phi_hyd_discussion: 0929 94151a9b18 Jeff*0930 The hydrostatic pressure potential anomaly :math:`\phi'` is computed as follows: 0931 0932 .. math:: \phi' = \frac{1}{\rho_c} \left( \rho_c g \eta + \int_{z}^{0} (\rho - \rho_0) g dz \right) 0933 0934 following :eq:`rho_lineareos`, :eq:`rhoprime_lineareos` and :eq:`baroc_gyre_press`. Note that with the linear free surface approximation, 0935 the contribution of the free surface position :math:`\eta` to :math:`\phi'` involves the constant density :math:`\rho_c` 0936 and not the density anomaly :math:`\rho'`, in contrast with contributions from below :math:`z=0`. 0937 0938 Several additional files are output in standard binary format. These are: 0939 0940 ``RhoRef.data, RhoRef.meta`` - this is a 1-D (k=1...\ :varlink:`Nr`) array of reference density, defined as: 0941 0bad585a21 Navi*0942 .. math:: \rho_{\rm ref}(k) = \rho_0 \big[ 1 - \alpha_{\theta} (\theta_{\rm ref}(k) - \theta_{\rm ref}(1)) \big] 94151a9b18 Jeff*0943 0944 ``PHrefC.data, PHrefC.meta, PHrefF.data, PHrefF.meta`` - these are 1-D (k=1...\ :varlink:`Nr` for PHrefC and 0945 k=1...\ :varlink:`Nr`\ +1 for PHrefF) arrays containing a reference

** Warning **

Wide character in print at /usr/local/share/lxr/source line 1030, <$git> line 947.

0946 hydrostatic “pressure potential” :math:`\phi = p/\rho_c` (see :numref:`finding_the_pressure_field`). 0947 Using a linear equation of state, ``PHrefC`` is simply :math:`\frac{\rho_c g |z|}{\rho_c}`, 0948 with output computed at the midpoint of each vertical cell, whereas ``PHrefF`` 0949 is computed at the surface and bottom of each vertical cell. 0950 Note that these quantities are not especially useful when using a linear equation of state 0951 (to compute the full hydrostatic pressure potential, one would use ``RhoRef`` and 0952 integrate downward, and add ``phiHyd``, rather than use these fields), 0953 but are of greater utility using a non-linear equation of state. 0954 0955 ``pickup.ckptA.001.001.data``, ``pickup.ckptA.001.001.meta``, ``pickup.0000518400.001.001.data``, ``pickup.0000518400.001.001.meta`` etc. - as 0956 described in detail in :ref:`tutorial Barotropic Gyre <barot_describe_checkp>`, 0957 these are temporary and permanent checkpoint files, output in binary format. Note that separate checkpoint files are written for each model tile. 0958 0959 And finally, because we are using the diagnostics package, upon startup the file ``available_diagnostics.log`` 0960 will be generated. This (plain text) file contains a list of all diagnostics available for output in this setup, including a description of each diagnostic and its units, 0961 and the number of levels for which the diagnostic is available (i.e., 2-D or 3-D field). This list of available diagnostics will change based 0962 on what packages are included in the setup. For example, if your setup includes a seaice package, many seaice diagnostics ce0d9af5ea Jeff*0963 will be listed in ``available_diagnostics.log`` that are not available for the :ref:`tutorial Baroclinic Gyre <tutorial_baroclinic_gyre>` setup. 94151a9b18 Jeff*0964 0965 .. _baroc_mpi: 0966 0967 Running with MPI 0968 ---------------- 0969 0970 In the :filelink:`verification/tutorial_baroclinic_gyre/code` directory 0971 there is a alternate file :filelink:`verification/tutorial_baroclinic_gyre/code/SIZE.h_mpi`. 0972 Overwrite :filelink:`verification/tutorial_baroclinic_gyre/code/SIZE.h` with this file 0973 and re-compile the model from scratch (the most simple approach is to create a new build directory ``build_mpi``; 0974 if instead you wanted to re-compile in your existing build directory, you should 0975 ``make CLEAN`` first, which will delete any existing files and dependencies you had created previously): 0976 0977 :: 0978 0979 % ../../../tools/genmake2 -mods ../code -mpi -of=«/PATH/TO/OPTFILE» 0980 % make depend 0981 % make 0982 0983 Note we have added the option ``-mpi`` to the :filelink:`genmake2 <tools/genmake2>` command that generates the makefile. 0984 A successful build requires MPI libraries installed on your system, and you may need to add to your ``$PATH`` environment variable 0985 and/or set environment variable ``$MPI_INC_DIR`` (for more details, see :numref:`build_mpi`). If there is a problem 0986 finding `MPI <https://en.wikipedia.org/wiki/Message_Passing_Interface>`_ libraries, :filelink:`genmake2 <tools/genmake2>` output will complain. 0987 ce0d9af5ea Jeff*0988 Several lines in :filelink:`verification/tutorial_baroclinic_gyre/code/SIZE.h_mpi` are different from the standard version. 94151a9b18 Jeff*0989 First, we change :varlink:`nSx` and :varlink:`nSy` to 1, so that each process integrates the model for a single tile. 0990 0991 .. literalinclude:: ../../../verification/tutorial_baroclinic_gyre/code/SIZE.h_mpi 0992 :start-at: nSx = 0993 :end-at: nSy = 0994 :lineno-match: 0995 0996 Next, we we change :varlink:`nPx` and :varlink:`nPy` so that we use two processes in each dimension, for a total of :math:`2*2 = 4` processes. 0997 Effectively, we have subdivided the model grid into four separate tiles, and the model equations are solved in parallel on four separate processes 0998 (presumably, on a unique physical processor or core). Because of the overlap regions 0999 (i.e., gridpoints along the tile edges are duplicated in two or more tiles), and limitations 1000 in the transfer speed of data between processes, the model will not run 4\ :math:`\times` faster, but should be at least 2-3\ :math:`\times` faster than running 1001 on a single process. 1002 1003 .. literalinclude:: ../../../verification/tutorial_baroclinic_gyre/code/SIZE.h_mpi 1004 :start-at: nPx = 1005 :end-at: nPy = 1006 :lineno-match: 1007 1008 Finally, to run the model (from your run directory), using four processes running in parallel: 1009 1010 :: 1011 1012 % mpirun -np 4 ../build_mpi/mitgcmuv 1013 1014 On some systems the `MPI <https://en.wikipedia.org/wiki/Message_Passing_Interface>`_ 1015 run command (and the subsequent command-line option ``-np``) might be something other than ``mpirun``; ask your local system administrator. 1016 When using a large `HPC <https://en.wikipedia.org/wiki/Supercomputer>`_ cluster, ce0d9af5ea Jeff*1017 prior steps might be required to allocate four processor cores to your job, and/or it might be necessary to 94151a9b18 Jeff*1018 write this command within a batch scheduler script; again, check with your local system documentation or system administrator. ce0d9af5ea Jeff*1019 If four cores are not available when you execute the above ``mpirun`` command, an error will occur. 1020 1021 When running in parallel, :filelink:`pkg/mnc` output will create separate output subdirectories for each 1022 process, assuming option :varlink:`mnc_use_outdir` 1023 is set to ``TRUE`` (here, by specifying ``-np 4`` four directories will be created, one for each 1024 tile -- ``mnc_test_00001`` through ``mnc_test_00004`` -- the first time 1025 the model is run). The (global) statistical-dynamical diagnostics output file will be written in only the first of these directories. 1026 The ``gluemncbig`` steps outlined :ref:`above <baroc_gluemnc_steps>` remain unchanged (if in doubt, one can always 1027 tell ``gluemncbig`` which specific directories to read, 1028 e.g., in bash ``mnc_test_{0009..0012}`` will grab only directories 0009, 0010, 0011, 0012). 1029 Also note it is no longer necessary to redirect standard output 94151a9b18 Jeff*1030 to a file such as ``output.txt``; rather, separate ``STDOUT.xxxx`` and ``STDERR.xxxx`` 1031 files are created by each process, where ``xxxx`` is the process number (starting from ``0000``). ce0d9af5ea Jeff*1032 Other than some additional `MPI <https://en.wikipedia.org/wiki/Message_Passing_Interface>`_-related information, 1033 the standard output content is similar to that from the single-process run. 94151a9b18 Jeff*1034 1035 .. _baroc_openmp: 1036 1037 Running with OpenMP 1038 ------------------- 1039 1040 To run multi-threaded (using shared memory, `OpenMP <https://en.wikipedia.org/wiki/OpenMP>`_), 1041 the original :filelink:`SIZE.h <verification/tutorial_baroclinic_gyre/code/SIZE.h>` file is used. 1042 In our example, for compatibility with MITgcm :ref:`testing protocols <code_testing_protocols>`, we will 1043 run using two separate threads, but the user should feel free to experiment using four threads if their local machine contains four cores. 1044 Like the :ref:`previous section <baroc_mpi>` we must first re-compile the executable from scratch, 1045 using a special command line option (for this configuration, ``-omp``). However it is not necessary to specify 1046 how many threads at compile-time (unlike `MPI <https://en.wikipedia.org/wiki/Message_Passing_Interface>`_, which requires specific processor count 1047 information to be set in :filelink:`SIZE.h <verification/tutorial_baroclinic_gyre/code/SIZE.h>`). 1048 Create and navigate into a new build directory ``build_openmp`` and type: 1049 1050 :: 1051 1052 % ../../../tools/genmake2 -mods ../code -omp -of=«/PATH/TO/OPTFILE» 1053 % make depend 1054 % make 1055 1056 In a run directory, overwrite the contents of :filelink:`eedata <verification/tutorial_baroclinic_gyre/input/eedata>` with file 1057 :filelink:`verification/tutorial_baroclinic_gyre/input/eedata.mth`. The parameter :varlink:`nTy` is changed; we now specify to 1058 use two threads across the :math:`y`-domain. Since our model domain is subdivided into four tiles, each thread will now 1059 integrate two tiles in the :math:`x`-domain. Alternatively, to run a multi-threaded example using four threads, both lines should be set to 2. 1060 1061 .. literalinclude:: ../../../verification/tutorial_baroclinic_gyre/input/eedata.mth 1062 :start-at: nTx= 1063 :end-at: nTy= 1064 :lineno-match: 1065 1066 To run the model, we first need to set two `environment variables <https://en.wikipedia.org/wiki/Environment_variable>`_, before invoking the executable: 1067 1068 :: 1069 1070 % export OMP_STACKSIZE=400M 1071 % export OMP_NUM_THREADS=2 1072 % ../build_openmp/mitgcmuv >output.txt 1073 1074 Your system's `environment variables <https://en.wikipedia.org/wiki/Environment_variable>`_ may differ from above; 1075 see :numref:`running_openmp` and/or ask your system administrator 1076 (also note, above is `bash shell <https://en.wikipedia.org/wiki/Bash_(Unix_shell)>`_ syntax; 1077 different syntax is required for `C shell <https://en.wikipedia.org/wiki/C_shell>`_). The important point to note is that 1078 we must tell the operating system environment how many threads will be used, prior to running the executable. 1079 The total number of threads set in ``OMP_NUM_THREADS`` must match :varlink:`nTx` * :varlink:`nTy` as specified in file ``eedata``. 1080 Moreover, the model domain must be subdivided into sufficient number of tiles in :filelink:`SIZE.h <verification/tutorial_baroclinic_gyre/code/SIZE.h>` 1081 through the choices of :varlink:`nSx` and :varlink:`nSy`: the number of tiles (:varlink:`nSx` * :varlink:`nSy`) must be equal to or greater than the number of threads. 1082 More specifically, :varlink:`nSx` must be equal to or an integer multiple of :varlink:`nTx`, and :varlink:`nSy` must be equal to or an integer multiple of :varlink:`nTy`. 1083 1084 Also note that at this time, :filelink:`pkg/mnc` is automatically disabled for multi-threaded setups, so output 1085 is dumped in standard binary format (i.e., using :filelink:`pkg/msdio`). You will receive a gentle warning message if you run 1086 this multi-threaded setup and keep :varlink:`useMNC` set to ``.TRUE.`` in ``data.pkg``. 1087 The full filenames for grid variables (e.g., ``XC``, ``YC``, etc.), snapshot output (e.g., ``Eta``, ``T``, ``PHL``) 1088 and :filelink:`pkg/diagnostics` output (e.g., ``surfDiag``, ``oceStDiag``, etc.) include a suffix 1089 that contains the time iteration number and tile identification (tile 001 includes ``.001.001`` in the filename, 1090 tile 002 ``.002.001``, tile 003 ``.001.002``, and tile 004 ``.002.002``). 1091 Unfortunately there is no analogous script 1092 to :filelink:`utils/python/MITgcmutils/scripts/gluemncbig` to concatenate raw binary files, but it is relatively straightforward 1093 to do so in matlab (reading in files using :filelink:`utils/matlab/rdmds.m`), or equally simple in python -- or, one could simply set 1094 :varlink:`globalFiles` to ``.TRUE.`` and the model will output global files for you (note, this global option is not available for :filelink:`pkg/mnc` output). 1095 One additional difference between :filelink:`pkg/msdio` and 1096 :filelink:`pkg/mnc` is that :ref:`Diagnostics Per Level Statistics <baroc_stat_diags>` are written in plain text, not binary, with :filelink:`pkg/msdio`. 1097 ce0d9af5ea Jeff*1098 .. _baroclinic_gyre_solution: 1099 94151a9b18 Jeff*1100 Model solution 1101 -------------- 1102 1103 In this section, we will examine details of the model solution, ce0d9af5ea Jeff*1104 using monthly and annual mean time average data provided in diagnostics files ``dynStDiag.nc``, ``dynDiag.nc``, and ``surfDiag.nc``. 1105 See companion :filelink:`matlab <verification/tutorial_baroclinic_gyre/analysis/matlab_plots.m>` 1106 or :filelink:`python <verification/tutorial_baroclinic_gyre/analysis/python_plots.py>` 1107 (or :filelink:`python using xarray <verification/tutorial_baroclinic_gyre/analysis/python_xr_plots.py>`) 1108 script which shows the code to read output `netCDF <http://www.unidata.ucar.edu/software/netcdf>`_ files 1109 and create figures shown in this section. 94151a9b18 Jeff*1110 1111 Our ocean sector model is forced mechanically by wind stress and thermodynamically 1112 though temperature relaxation at the surface. As such, 1113 we expect our solution to not only exhibit wind-driven gyres in the upper layers, 1114 but also include a deep, overturning circulation. Our focus in this section 1115 will be on the former; this component of the solution equilibrates on a time scale of decades, 1116 more or less, whereas the deep cell depends on a slower, diffusive timescale. 1117 We will begin by examining some of our :ref:`Diagnostics Per Level Statistics <baroc_stat_diags>` output, to assess 1118 how close we are to equilibration at different ocean model levels. Recall we've requested 1119 these statistics to be computed monthly. 1120 1121 Load diagnostics ``TRELAX_ave``, ``THETA_lv_avg``, and ``THETA_lv_std`` from file ``dynStDiag.nc``. 1122 In :numref:`baroclinic_gyre_trelax_timeseries`\a 1123 we plot the global model surface mean heat flux (``TRELAX_ave``) as a function of time. 1124 At the beginning of the run, 1125 we observe that the ocean is cooling dramatically; this is mainly because our ocean surface layer is 1126 initialized to a uniform :math:`30^{\circ}` C (as specified :ref:`here <tut_baroc_linear_eos>`), which results in 1127 very strong relaxation initially in the northern portion of ocean model, where the 1128 restoring temperature is just above :math:`0^{\circ}` C. 1129 (As an aside comment, such large initialization shocks are often best avoided 1130 if possible, as they may cause model instability, which 1131 may necessitate smaller time steps at model onset and/or more realistic initial conditions.) 1132 However, this initial burst of cooling quickly diminishes over the first decade 1133 of integration, as the surface layer approaches temperature values close to the specified profile; 1134 see :numref:`baroclinic_gyre_trelax_timeseries`\b 1135 where the mean temperature at surface, thermocline, and abyssal depth are plotted as a function of time. 1136 Note that while the total heat flux shows that the global heat content is slowly decreasing, 1137 even after 100 years, the temperature of the deepest water is slowly warming. 1138 In :numref:`baroclinic_gyre_trelax_timeseries`\c we plot standard deviation of temperature 1139 (by level) over time. Given that each level is initialized at uniform temperature, 1140 initially the standard deviation is zero, but should tend to level off at some non-zero 1141 value over time, as the solution at each depth equilibrates. 1142 Not surprisingly, the largest gradients in temperature exist at the surface, whereas in the 1143 abyss the differences in temperature are quite small. 1144 In summary, we conclude that while the surface appears to approach equilibrium rapidly, 1145 even after 100 years there are changes occurring in deep circulation, presumably related 1146 to the meridional overturning circulation. 1147 We leave it as an exercise to the reader to 1148 integrate the solution further and/or examine and calculate the meridional overturning circulation strength over time. 1149 1150 .. figure:: figs/trelax_theta_timeseries.png 1151 :width: 100% 1152 :align: center 1153 :alt: baroclinic gyre surface heat flux 1154 :name: baroclinic_gyre_trelax_timeseries 1155 ce0d9af5ea Jeff*1156 a\) Surface heat flux due to temperature restoring, negative values indicate heat flux out of the ocean; 1157 b) and c) potential temperature mean and standard deviation by level, respectively. 94151a9b18 Jeff*1158 1159 Next, let's examine the effect of wind stress on the ocean's upper layers. 1160 Given the orientation of the wind stress and its variation over a full sine wave as shown in :numref:`baroclinic_gyre_config` 1161 (crudely mimicking easterlies in the tropics, mid-latitude westerlies, and polar easterlies), 1162 we anticipate a double-gyre solution, with a subtropical gyre and a subpolar gyre. 1163 Let's begin by examining the free surface solution (load diagnostics ``ETAN`` and ``TRELAX`` from file ``surfDiag.nc``). 1164 In :numref:`baroclinic_gyre_trelax_freesurface` we show contours of free surface height 1165 (``ETAN``; this is what we plotted in our :ref:`barotropic gyre tutorial solution <barotropic_gyre_solution>`) 1166 overlaying a 2-D color plot of ``TRELAX`` ce0d9af5ea Jeff*1167 (blue is where heat is released from the ocean, red where heat enters the ocean), averaged over year 100. 94151a9b18 Jeff*1168 Note that a subtropical gyre is readily apparent, as suggested by geostropic currents in balance with 1169 the free surface elevation (not shown, but the reader is encouraged to load diagnostics ``UVEL`` and ``VVEL`` 1170 and plot the circulation at various levels). Heat is entering the ocean mainly along the southern boundary, 1171 where upwelling of cold water is occurring, but also along the boundary current between :math:`50^{\circ}`\ N and :math:`65^{\circ}`\ N, where we 1172 would expect southward flow (i.e., advecting water that is colder than the local restoring temperature). 1173 Heat is exiting the ocean where the western boundary current transports warm water northward, 1174 before turning eastward into the basin 1175 at :math:`40^{\circ}`\ N, and also weakly throughout the higher latitude bands, 1176 where deeper mixed layers occur (not shown, but variations in mixed layer 1177 depth can be easily visualized by loading diagnostic ``MXLDEPTH``). 1178 1179 .. figure:: figs/trelax_freesurface.png ce0d9af5ea Jeff*1180 :width: 80% 94151a9b18 Jeff*1181 :align: center 1182 :alt: baroclinic gyre free surface and relaxation 1183 :name: baroclinic_gyre_trelax_freesurface 1184 ce0d9af5ea Jeff*1185 Contours of free surface height (m) averaged over year 100; shading is surface heat flux due to 1186 temperature restoring (W/m\ :sup:`2`), blue indicating cooling. 94151a9b18 Jeff*1187 0bad585a21 Navi*1188 So what happened to our model solution subpolar gyre? Let's compute depth-integrated velocity :math:`U_{\rm bt}, V_{\rm bt}` 94151a9b18 Jeff*1189 (units: m\ :sup:`2` s\ :sup:`-1`) and use it calculate the barotropic transport streamfunction: 1190 0bad585a21 Navi*1191 .. math:: U_{\rm bt} = - \frac{\partial \Psi}{\partial y}, \phantom{WW} V_{\rm bt} = \frac{\partial \Psi}{\partial x} 94151a9b18 Jeff*1192 0bad585a21 Navi*1193 Compute :math:`U_{\rm bt}` by summing the diagnostic ``UVEL`` multiplied by gridcell depth 94151a9b18 Jeff*1194 (``grid.nc`` variable :varlink:`drF`, i.e., 1195 the separation between gridcell faces in the vertical). Now do a cumulative sum of 0bad585a21 Navi*1196 :math:`-U_{\rm bt}` times the gridcell spacing the in the :math:`y` direction (you 94151a9b18 Jeff*1197 will need to load ``grid.nc`` variable :varlink:`dyG`, the separation between gridcell faces in :math:`y`). 1198 A plot of the resulting :math:`\Psi` field is shown in :numref:`baroclinic_gyre_psi`. 0bad585a21 Navi*1199 Note one could also cumulative sum :math:`V_{\rm bt}` times the grid spacing in the :math:`x`-direction and obtain a similar result. 94151a9b18 Jeff*1200 1201 .. figure:: figs/baroc_psi.png ce0d9af5ea Jeff*1202 :width: 80% 94151a9b18 Jeff*1203 :align: center 1204 :alt: baroclinic gyre barotropic streamfunction 1205 :name: baroclinic_gyre_psi 1206 1207 Barotropic streamfunction (Sv) as computed over year 100. 1208 1209 When velocities are integrated over depth, the subpolar gyre is readily apparent, 1210 as might be expected given our wind stress forcing profile. The pattern in :numref:`baroclinic_gyre_psi` in fact resembles 1211 the double-gyre free surface solution we observed in :numref:`baro_jet_solution` 1212 from tutorial :ref:`sec_eg_baro`, when our model grid was only a single layer in the vertical. 1213 1214 Is the magnitude of :math:`\Psi` 1215 we obtain in our solution reasonable? To check this, consider the Sverdrup transport: 1216 0bad585a21 Navi*1217 .. math:: \rho v_{\rm bt} = \hat{\boldsymbol{k}} \cdot \frac{ \nabla \times \vec{\boldsymbol{\tau}}}{\beta} 94151a9b18 Jeff*1218 1219 If we plug in a typical mid-latitude value for :math:`\beta` (:math:`2 \times 10^{-11}` m\ :sup:`-1` s\ :sup:`-1`) 0bad585a21 Navi*

** Warning **

Wide character in print at /usr/local/share/lxr/source line 1030, <$git> line 1221.

1220 and note that :math:`\tau` varies by :math:`0.1` Nm\ :sup:`—2` over :math:`15^{\circ}` latitude, 94151a9b18 Jeff*1221 and multiply by the width of our ocean sector, we obtain an estimate of approximately 20 Sv. 1222 This estimate agrees reasonably well with the strength of the circulation in :numref:`baroclinic_gyre_psi`. 1223 1224 Finally, let's examine the model solution potential temperature field averaged over year 100. 1225 Read in diagnostic ``THETA`` from the file ``dynDiag.nc``. :numref:`baroclinic_gyre_thetaplots`\a shows a plan view of temperature 1226 at 220 m depth (vertical level k=4). :numref:`baroclinic_gyre_thetaplots`\b shows a slice in the :math:`xz` plane at :math:`28.5^{\circ}`\ N 1227 (:math:`y`-dimension j=15), through the center of the subtropical gyre. 1228 1229 .. figure:: figs/baroc_thetaplots.png 1230 :width: 100% 1231 :align: center 1232 :alt: baroclinic gyre plots of theta 1233 :name: baroclinic_gyre_thetaplots 1234 1235 Contour plot of potential temperature at year 100 a) at a depth of 220 m and b) through a section at :math:`28.5^{\circ}`\ N. Contour interval is 2K. 1236 1237 The dynamics of the subtropical gyre are governed by 1238 Ventilated Thermocline Theory (see, for example, Pedlosky (1996) :cite:`pedlosky:96` or 1239 Vallis (2017) :cite:`vallis:17`). Note the presence of warm "mode water" on the western side of the basin; 1240 the contours of the warm water in the southern half of the sector crudely align with the free surface 1241 heights we observed in :numref:`baroclinic_gyre_psi`. In :numref:`baroclinic_gyre_thetaplots`\b note 1242 the presence of a thermocline, i.e., the bunching up of the contours 1243 between 200 m and 400 m depth, with weak stratification below the thermocline. 1244 What sets the penetration depth of the subtropical gyre? Following a simple advective scaling argument 1245 (see Vallis (2017) :cite:`vallis:17` or Cushman-Roisin and Beckers (2011) :cite:`cushmanroisin:11`; ce0d9af5ea Jeff*1246 this scaling is obtained via thermal wind and the linearized barotropic vorticity equation), 94151a9b18 Jeff*1247 the depth of the thermocline :math:`h` should scale as: 1248 0bad585a21 Navi*1249 .. math:: h = \left( \frac{w_{\rm Ek} f^2 L_x}{\beta \Delta b} \right) ^2 = \left( \frac{(\tau / L_y) f L_x}{\beta \rho'} \right) ^2 94151a9b18 Jeff*1250 0bad585a21 Navi*1251 where :math:`w_{\rm Ek}` is a representive value for Ekman pumping, :math:`\Delta b = g \rho' / \rho_0` 94151a9b18 Jeff*1252 is the variation in buoyancy across the gyre, 1253 and :math:`L_x` and :math:`L_y` are length scales in the 1254 :math:`x` and :math:`y` directions, respectively. 1255 Plugging in applicable values at :math:`30^{\circ}`\ N, 1256 we obtain an estimate for :math:`h` of 200 m, which agrees quite well with that observed in :numref:`baroclinic_gyre_thetaplots`\b. 1257