MOM6
mom_int_tide_input Module Reference

Detailed Description

Calculates energy input to the internal tides.

Data Types

type  int_tide_input_cs
 This control structure holds parameters that regulate internal tide energy inputs. More...
 
type  int_tide_input_type
 This type is used to exchange fields related to the internal tides. More...
 

Functions/Subroutines

subroutine, public set_int_tide_input (u, v, h, tv, fluxes, itide, dt, G, GV, US, CS)
 Sets the model-state dependent internal tide energy sources. More...
 
subroutine find_n2_bottom (h, tv, T_f, S_f, h2, fluxes, G, GV, US, N2_bot)
 Estimates the near-bottom buoyancy frequency (N^2). More...
 
subroutine, public int_tide_input_init (Time, G, GV, US, param_file, diag, CS, itide)
 Initializes the data related to the internal tide input module. More...
 
subroutine, public int_tide_input_end (CS)
 Deallocates any memory related to the internal tide input module. More...
 

Function/Subroutine Documentation

◆ find_n2_bottom()

subroutine mom_int_tide_input::find_n2_bottom ( real, dimension(szi_(g),szj_(g),szk_(g)), intent(in)  h,
type(thermo_var_ptrs), intent(in)  tv,
real, dimension(szi_(g),szj_(g),szk_(g)), intent(in)  T_f,
real, dimension(szi_(g),szj_(g),szk_(g)), intent(in)  S_f,
real, dimension(szi_(g),szj_(g)), intent(in)  h2,
type(forcing), intent(in)  fluxes,
type(ocean_grid_type), intent(in)  G,
type(verticalgrid_type), intent(in)  GV,
type(unit_scale_type), intent(in)  US,
real, dimension( g %isd: g %ied, g %jsd: g %jed), intent(out)  N2_bot 
)
private

Estimates the near-bottom buoyancy frequency (N^2).

Parameters
[in]gThe ocean's grid structure
[in]gvThe ocean's vertical grid structure
[in]usA dimensional unit scaling type
[in]hLayer thicknesses [H ~> m or kg m-2]
[in]tvA structure containing pointers to the thermodynamic fields
[in]t_fTemperature after vertical filtering to smooth out the values in thin layers [degC].
[in]s_fSalinity after vertical filtering to smooth out the values in thin layers [ppt].
[in]h2Bottom topographic roughness [Z2 ~> m2].
[in]fluxesA structure of thermodynamic surface fluxes
[out]n2_botThe squared buoyancy freqency at the ocean bottom [s-2].

Definition at line 153 of file MOM_internal_tide_input.F90.

153  type(ocean_grid_type), intent(in) :: G !< The ocean's grid structure
154  type(verticalGrid_type), intent(in) :: GV !< The ocean's vertical grid structure
155  type(unit_scale_type), intent(in) :: US !< A dimensional unit scaling type
156  real, dimension(SZI_(G),SZJ_(G),SZK_(G)), intent(in) :: h !< Layer thicknesses [H ~> m or kg m-2]
157  type(thermo_var_ptrs), intent(in) :: tv !< A structure containing pointers to the
158  !! thermodynamic fields
159  real, dimension(SZI_(G),SZJ_(G),SZK_(G)), intent(in) :: T_f !< Temperature after vertical filtering to
160  !! smooth out the values in thin layers [degC].
161  real, dimension(SZI_(G),SZJ_(G),SZK_(G)), intent(in) :: S_f !< Salinity after vertical filtering to
162  !! smooth out the values in thin layers [ppt].
163  real, dimension(SZI_(G),SZJ_(G)), intent(in) :: h2 !< Bottom topographic roughness [Z2 ~> m2].
164  type(forcing), intent(in) :: fluxes !< A structure of thermodynamic surface fluxes
165  type(int_tide_input_CS), pointer :: CS !< This module's control structure.
166  real, dimension(SZI_(G),SZJ_(G)), intent(out) :: N2_bot !< The squared buoyancy freqency at the
167  !! ocean bottom [s-2].
168  ! Local variables
169  real, dimension(SZI_(G),SZK_(G)+1) :: &
170  dRho_int ! The unfiltered density differences across interfaces.
171  real, dimension(SZI_(G)) :: &
172  pres, & ! The pressure at each interface [Pa].
173  Temp_int, & ! The temperature at each interface [degC].
174  Salin_int, & ! The salinity at each interface [ppt].
175  drho_bot, &
176  h_amp, & ! The amplitude of topographic roughness [Z ~> m].
177  hb, & ! The depth below a layer [Z ~> m].
178  z_from_bot, & ! The height of a layer center above the bottom [Z ~> m].
179  dRho_dT, & ! The partial derivatives of density with temperature and
180  dRho_dS ! salinity [kg m-3 degC-1] and [kg m-3 ppt-1].
181 
182  real :: dz_int ! The thickness associated with an interface [Z ~> m].
183  real :: G_Rho0 ! The gravitation acceleration divided by the Boussinesq
184  ! density [Z m3 T-2 kg-1 ~> m4 s-2 kg-1].
185  logical :: do_i(SZI_(G)), do_any
186  integer :: i, j, k, is, ie, js, je, nz
187  is = g%isc ; ie = g%iec ; js = g%jsc ; je = g%jec ; nz = g%ke
188  g_rho0 = (us%L_to_Z**2*gv%g_Earth) / gv%Rho0
189 
190  ! Find the (limited) density jump across each interface.
191  do i=is,ie
192  drho_int(i,1) = 0.0 ; drho_int(i,nz+1) = 0.0
193  enddo
194 !$OMP parallel do default(none) shared(is,ie,js,je,nz,tv,fluxes,G,GV,h,T_f,S_f, &
195 !$OMP h2,N2_bot,G_Rho0) &
196 !$OMP private(pres,Temp_Int,Salin_Int,dRho_dT,dRho_dS, &
197 !$OMP hb,dRho_bot,z_from_bot,do_i,h_amp, &
198 !$OMP do_any,dz_int) &
199 !$OMP firstprivate(dRho_int)
200  do j=js,je
201  if (associated(tv%eqn_of_state)) then
202  if (associated(fluxes%p_surf)) then
203  do i=is,ie ; pres(i) = fluxes%p_surf(i,j) ; enddo
204  else
205  do i=is,ie ; pres(i) = 0.0 ; enddo
206  endif
207  do k=2,nz
208  do i=is,ie
209  pres(i) = pres(i) + gv%H_to_Pa*h(i,j,k-1)
210  temp_int(i) = 0.5 * (t_f(i,j,k) + t_f(i,j,k-1))
211  salin_int(i) = 0.5 * (s_f(i,j,k) + s_f(i,j,k-1))
212  enddo
213  call calculate_density_derivs(temp_int, salin_int, pres, &
214  drho_dt(:), drho_ds(:), is, ie-is+1, tv%eqn_of_state)
215  do i=is,ie
216  drho_int(i,k) = max(drho_dt(i)*(t_f(i,j,k) - t_f(i,j,k-1)) + &
217  drho_ds(i)*(s_f(i,j,k) - s_f(i,j,k-1)), 0.0)
218  enddo
219  enddo
220  else
221  do k=2,nz ; do i=is,ie
222  drho_int(i,k) = gv%Rlay(k) - gv%Rlay(k-1)
223  enddo ; enddo
224  endif
225 
226  ! Find the bottom boundary layer stratification.
227  do i=is,ie
228  hb(i) = 0.0 ; drho_bot(i) = 0.0
229  z_from_bot(i) = 0.5*gv%H_to_Z*h(i,j,nz)
230  do_i(i) = (g%mask2dT(i,j) > 0.5)
231  h_amp(i) = sqrt(h2(i,j))
232  enddo
233 
234  do k=nz,2,-1
235  do_any = .false.
236  do i=is,ie ; if (do_i(i)) then
237  dz_int = 0.5*gv%H_to_Z*(h(i,j,k) + h(i,j,k-1))
238  z_from_bot(i) = z_from_bot(i) + dz_int ! middle of the layer above
239 
240  hb(i) = hb(i) + dz_int
241  drho_bot(i) = drho_bot(i) + drho_int(i,k)
242 
243  if (z_from_bot(i) > h_amp(i)) then
244  if (k>2) then
245  ! Always include at least one full layer.
246  hb(i) = hb(i) + 0.5*gv%H_to_Z*(h(i,j,k-1) + h(i,j,k-2))
247  drho_bot(i) = drho_bot(i) + drho_int(i,k-1)
248  endif
249  do_i(i) = .false.
250  else
251  do_any = .true.
252  endif
253  endif ; enddo
254  if (.not.do_any) exit
255  enddo
256 
257  do i=is,ie
258  if (hb(i) > 0.0) then
259  n2_bot(i,j) = (g_rho0 * drho_bot(i)) / hb(i)
260  else ; n2_bot(i,j) = 0.0 ; endif
261  enddo
262  enddo
263 

◆ int_tide_input_end()

subroutine, public mom_int_tide_input::int_tide_input_end ( type(int_tide_input_cs), pointer  CS)

Deallocates any memory related to the internal tide input module.

Parameters
csThis module's control structure, which is deallocated here.

Definition at line 424 of file MOM_internal_tide_input.F90.

424  type(int_tide_input_CS), pointer :: CS !< This module's control structure, which is deallocated here.
425 
426  if (associated(cs)) deallocate(cs)
427 

◆ int_tide_input_init()

subroutine, public mom_int_tide_input::int_tide_input_init ( type(time_type), intent(in)  Time,
type(ocean_grid_type), intent(in)  G,
type(verticalgrid_type), intent(in)  GV,
type(unit_scale_type), intent(in)  US,
type(param_file_type), intent(in)  param_file,
type(diag_ctrl), intent(inout), target  diag,
type(int_tide_input_cs), pointer  CS,
type(int_tide_input_type), pointer  itide 
)

Initializes the data related to the internal tide input module.

Parameters
[in]timeThe current model time
[in]gThe ocean's grid structure
[in]gvThe ocean's vertical grid structure
[in]usA dimensional unit scaling type
[in]param_fileA structure to parse for run-time parameters
[in,out]diagstructure used to regulate diagnostic output.
csThis module's control structure, which is initialized here.
itideA structure containing fields related to the internal tide sources.

Definition at line 268 of file MOM_internal_tide_input.F90.

268  type(time_type), intent(in) :: Time !< The current model time
269  type(ocean_grid_type), intent(in) :: G !< The ocean's grid structure
270  type(verticalGrid_type), intent(in) :: GV !< The ocean's vertical grid structure
271  type(unit_scale_type), intent(in) :: US !< A dimensional unit scaling type
272  type(param_file_type), intent(in) :: param_file !< A structure to parse for run-time parameters
273  type(diag_ctrl), target, intent(inout) :: diag !< structure used to regulate diagnostic output.
274  type(int_tide_input_CS), pointer :: CS !< This module's control structure, which is initialized here.
275  type(int_tide_input_type), pointer :: itide !< A structure containing fields related
276  !! to the internal tide sources.
277  ! Local variables
278  type(vardesc) :: vd
279  logical :: read_tideamp
280 ! This include declares and sets the variable "version".
281 #include "version_variable.h"
282  character(len=40) :: mdl = "MOM_int_tide_input" ! This module's name.
283  character(len=20) :: tmpstr
284  character(len=200) :: filename, tideamp_file, h2_file
285 
286  real :: mask_itidal
287  real :: max_frac_rough ! The fraction relating the maximum topographic roughness
288  ! to the mean depth [nondim]
289  real :: utide ! constant tidal amplitude [m s-1] to be used if
290  ! tidal amplitude file is not present.
291  real :: kappa_h2_factor ! factor for the product of wavenumber * rms sgs height.
292  real :: kappa_itides ! topographic wavenumber and non-dimensional scaling
293  real :: min_zbot_itides ! Minimum ocean depth for internal tide conversion [Z ~> m].
294  integer :: tlen_days !< Time interval from start for adding wave source
295  !! for testing internal tides (BDM)
296  integer :: i, j, is, ie, js, je, isd, ied, jsd, jed
297 
298  if (associated(cs)) then
299  call mom_error(warning, "int_tide_input_init called with an associated "// &
300  "control structure.")
301  return
302  endif
303  if (associated(itide)) then
304  call mom_error(warning, "int_tide_input_init called with an associated "// &
305  "internal tide input type.")
306  return
307  endif
308  allocate(cs)
309  allocate(itide)
310 
311  is = g%isc ; ie = g%iec ; js = g%jsc ; je = g%jec
312  isd = g%isd ; ied = g%ied ; jsd = g%jsd ; jed = g%jed
313 
314  cs%diag => diag
315 
316  ! Read all relevant parameters and write them to the model log.
317  call log_version(param_file, mdl, version, "")
318 
319  call get_param(param_file, mdl, "INPUTDIR", cs%inputdir, default=".")
320  cs%inputdir = slasher(cs%inputdir)
321 
322  call get_param(param_file, mdl, "DEBUG", cs%debug, default=.false., do_not_log=.true.)
323 
324  call get_param(param_file, mdl, "MIN_ZBOT_ITIDES", min_zbot_itides, &
325  "Turn off internal tidal dissipation when the total "//&
326  "ocean depth is less than this value.", units="m", default=0.0, scale=us%m_to_Z)
327  call get_param(param_file, mdl, "KD_SMOOTH", cs%kappa_fill, &
328  "A diapycnal diffusivity that is used to interpolate "//&
329  "more sensible values of T & S into thin layers.", &
330  default=1.0e-6, scale=us%m2_s_to_Z2_T)
331 
332  call get_param(param_file, mdl, "UTIDE", utide, &
333  "The constant tidal amplitude used with INT_TIDE_DISSIPATION.", &
334  units="m s-1", default=0.0)
335 
336  allocate(itide%Nb(isd:ied,jsd:jed)) ; itide%Nb(:,:) = 0.0
337  allocate(itide%h2(isd:ied,jsd:jed)) ; itide%h2(:,:) = 0.0
338  allocate(itide%TKE_itidal_input(isd:ied,jsd:jed)) ; itide%TKE_itidal_input(:,:) = 0.0
339  allocate(itide%tideamp(isd:ied,jsd:jed)) ; itide%tideamp(:,:) = utide
340  allocate(cs%TKE_itidal_coef(isd:ied,jsd:jed)) ; cs%TKE_itidal_coef(:,:) = 0.0
341 
342  call get_param(param_file, mdl, "KAPPA_ITIDES", kappa_itides, &
343  "A topographic wavenumber used with INT_TIDE_DISSIPATION. "//&
344  "The default is 2pi/10 km, as in St.Laurent et al. 2002.", &
345  units="m-1", default=8.e-4*atan(1.0))
346 
347  call get_param(param_file, mdl, "KAPPA_H2_FACTOR", kappa_h2_factor, &
348  "A scaling factor for the roughness amplitude with n"//&
349  "INT_TIDE_DISSIPATION.", units="nondim", default=1.0)
350  call get_param(param_file, mdl, "TKE_ITIDE_MAX", cs%TKE_itide_max, &
351  "The maximum internal tide energy source available to mix "//&
352  "above the bottom boundary layer with INT_TIDE_DISSIPATION.", &
353  units="W m-2", default=1.0e3)
354 
355  call get_param(param_file, mdl, "READ_TIDEAMP", read_tideamp, &
356  "If true, read a file (given by TIDEAMP_FILE) containing "//&
357  "the tidal amplitude with INT_TIDE_DISSIPATION.", default=.false.)
358  if (read_tideamp) then
359  call get_param(param_file, mdl, "TIDEAMP_FILE", tideamp_file, &
360  "The path to the file containing the spatially varying "//&
361  "tidal amplitudes with INT_TIDE_DISSIPATION.", default="tideamp.nc")
362  filename = trim(cs%inputdir) // trim(tideamp_file)
363  call log_param(param_file, mdl, "INPUTDIR/TIDEAMP_FILE", filename)
364  call mom_read_data(filename, 'tideamp', itide%tideamp, g%domain, timelevel=1)
365  endif
366 
367  call get_param(param_file, mdl, "H2_FILE", h2_file, &
368  "The path to the file containing the sub-grid-scale "//&
369  "topographic roughness amplitude with INT_TIDE_DISSIPATION.", &
370  fail_if_missing=.true.)
371  filename = trim(cs%inputdir) // trim(h2_file)
372  call log_param(param_file, mdl, "INPUTDIR/H2_FILE", filename)
373  call mom_read_data(filename, 'h2', itide%h2, g%domain, timelevel=1, scale=us%m_to_Z**2)
374 
375  call get_param(param_file, mdl, "FRACTIONAL_ROUGHNESS_MAX", max_frac_rough, &
376  "The maximum topographic roughness amplitude as a fraction of the mean depth, "//&
377  "or a negative value for no limitations on roughness.", &
378  units="nondim", default=0.1)
379 
380  ! The following parameters are used in testing the internal tide code.
381  call get_param(param_file, mdl, "INTERNAL_TIDE_SOURCE_TEST", cs%int_tide_source_test, &
382  "If true, apply an arbitrary generation site for internal tide testing", &
383  default=.false.)
384  if (cs%int_tide_source_test)then
385  call get_param(param_file, mdl, "INTERNAL_TIDE_SOURCE_X", cs%int_tide_source_x, &
386  "X Location of generation site for internal tide", default=1.)
387  call get_param(param_file, mdl, "INTERNAL_TIDE_SOURCE_Y", cs%int_tide_source_y, &
388  "Y Location of generation site for internal tide", default=1.)
389  call get_param(param_file, mdl, "INTERNAL_TIDE_SOURCE_TLEN_DAYS", tlen_days, &
390  "Time interval from start of experiment for adding wave source", &
391  units="days", default=0)
392  cs%time_max_source = time + set_time(0, days=tlen_days)
393  endif
394 
395  do j=js,je ; do i=is,ie
396  mask_itidal = 1.0
397  if (g%bathyT(i,j) < min_zbot_itides) mask_itidal = 0.0
398 
399  itide%tideamp(i,j) = itide%tideamp(i,j) * mask_itidal * g%mask2dT(i,j)
400 
401  ! Restrict rms topo to a fraction (often 10 percent) of the column depth.
402  if (max_frac_rough >= 0.0) &
403  itide%h2(i,j) = min((max_frac_rough*g%bathyT(i,j))**2, itide%h2(i,j))
404 
405  ! Compute the fixed part of internal tidal forcing; units are [J m-2] here.
406  cs%TKE_itidal_coef(i,j) = 0.5*kappa_h2_factor*gv%Rho0*&
407  kappa_itides * us%Z_to_m**2*itide%h2(i,j) * itide%tideamp(i,j)**2
408  enddo ; enddo
409 
410 
411  cs%id_TKE_itidal = register_diag_field('ocean_model','TKE_itidal_itide',diag%axesT1,time, &
412  'Internal Tide Driven Turbulent Kinetic Energy', 'W m-2')
413 
414  cs%id_Nb = register_diag_field('ocean_model','Nb_itide',diag%axesT1,time, &
415  'Bottom Buoyancy Frequency', 's-1')
416 
417  cs%id_N2_bot = register_diag_field('ocean_model','N2_b_itide',diag%axesT1,time, &
418  'Bottom Buoyancy frequency squared', 's-2', conversion=us%s_to_T**2)
419 

◆ set_int_tide_input()

subroutine, public mom_int_tide_input::set_int_tide_input ( real, dimension( g %isdb: g %iedb, g %jsd: g %jed, g %ke), intent(in)  u,
real, dimension( g %isd: g %ied, g %jsdb: g %jedb, g %ke), intent(in)  v,
real, dimension( g %isd: g %ied, g %jsd: g %jed, g %ke), intent(in)  h,
type(thermo_var_ptrs), intent(in)  tv,
type(forcing), intent(in)  fluxes,
type(int_tide_input_type), intent(inout)  itide,
real, intent(in)  dt,
type(ocean_grid_type), intent(in)  G,
type(verticalgrid_type), intent(in)  GV,
type(unit_scale_type), intent(in)  US,
type(int_tide_input_cs), pointer  CS 
)

Sets the model-state dependent internal tide energy sources.

Parameters
[in]gThe ocean's grid structure
[in]gvThe ocean's vertical grid structure
[in]usA dimensional unit scaling type
[in]uThe zonal velocity [m s-1]
[in]vThe meridional velocity [m s-1]
[in]hLayer thicknesses [H ~> m or kg m-2]
[in]tvA structure containing pointers to the thermodynamic fields
[in]fluxesA structure of thermodynamic surface fluxes
[in,out]itideA structure containing fields related to the internal tide sources.
[in]dtThe time increment [s].
csThis module's control structure.

Definition at line 75 of file MOM_internal_tide_input.F90.

75  type(ocean_grid_type), intent(in) :: G !< The ocean's grid structure
76  type(verticalGrid_type), intent(in) :: GV !< The ocean's vertical grid structure
77  type(unit_scale_type), intent(in) :: US !< A dimensional unit scaling type
78  real, dimension(SZIB_(G),SZJ_(G),SZK_(G)), intent(in) :: u !< The zonal velocity [m s-1]
79  real, dimension(SZI_(G),SZJB_(G),SZK_(G)), intent(in) :: v !< The meridional velocity [m s-1]
80  real, dimension(SZI_(G),SZJ_(G),SZK_(G)), intent(in) :: h !< Layer thicknesses [H ~> m or kg m-2]
81  type(thermo_var_ptrs), intent(in) :: tv !< A structure containing pointers to the
82  !! thermodynamic fields
83  type(forcing), intent(in) :: fluxes !< A structure of thermodynamic surface fluxes
84  type(int_tide_input_type), intent(inout) :: itide !< A structure containing fields related
85  !! to the internal tide sources.
86  real, intent(in) :: dt !< The time increment [s].
87  type(int_tide_input_CS), pointer :: CS !< This module's control structure.
88  ! Local variables
89  real, dimension(SZI_(G),SZJ_(G)) :: &
90  N2_bot ! The bottom squared buoyancy frequency [T-2 ~> s-2].
91 
92  real, dimension(SZI_(G),SZJ_(G),SZK_(G)) :: &
93  T_f, S_f ! The temperature and salinity in [degC] and [ppt] with the values in
94  ! the massless layers filled vertically by diffusion.
95  logical :: use_EOS ! If true, density is calculated from T & S using an
96  ! equation of state.
97  logical :: avg_enabled ! for testing internal tides (BDM)
98  type(time_type) :: time_end !< For use in testing internal tides (BDM)
99 
100 
101  integer :: i, j, k, is, ie, js, je, nz
102  integer :: isd, ied, jsd, jed
103 
104 
105  is = g%isc ; ie = g%iec ; js = g%jsc ; je = g%jec ; nz = g%ke
106  isd = g%isd ; ied = g%ied ; jsd = g%jsd ; jed = g%jed
107 
108  if (.not.associated(cs)) call mom_error(fatal,"set_diffusivity: "//&
109  "Module must be initialized before it is used.")
110 
111  use_eos = associated(tv%eqn_of_state)
112 
113  ! Smooth the properties through massless layers.
114  if (use_eos) then
115  call vert_fill_ts(h, tv%T, tv%S, cs%kappa_fill*dt*us%s_to_T, t_f, s_f, g, gv, larger_h_denom=.true.)
116  endif
117 
118  call find_n2_bottom(h, tv, t_f, s_f, itide%h2, fluxes, g, gv, us, n2_bot)
119 
120  !$OMP parallel do default(shared)
121  do j=js,je ; do i=is,ie
122  itide%Nb(i,j) = g%mask2dT(i,j) * us%s_to_T*sqrt(n2_bot(i,j))
123  itide%TKE_itidal_input(i,j) = min(cs%TKE_itidal_coef(i,j)*itide%Nb(i,j), cs%TKE_itide_max)
124  enddo ; enddo
125 
126  if (cs%int_tide_source_test) then
127  itide%TKE_itidal_input(:,:) = 0.0
128  avg_enabled = query_averaging_enabled(cs%diag, time_end=time_end)
129  if (time_end <= cs%time_max_source) then
130  do j=js,je ; do i=is,ie
131  ! Input an arbitrary energy point source.id_
132  if (((g%geoLonCu(i-1,j)-cs%int_tide_source_x) * (g%geoLonBu(i,j)-cs%int_tide_source_x) <= 0.0) .and. &
133  ((g%geoLatCv(i,j-1)-cs%int_tide_source_y) * (g%geoLatCv(i,j)-cs%int_tide_source_y) <= 0.0)) then
134  itide%TKE_itidal_input(i,j) = 1.0
135  endif
136  enddo ; enddo
137  endif
138  endif
139 
140  if (cs%debug) then
141  call hchksum(n2_bot,"N2_bot",g%HI,haloshift=0, scale=us%s_to_T**2)
142  call hchksum(itide%TKE_itidal_input,"TKE_itidal_input",g%HI,haloshift=0)
143  endif
144 
145  if (cs%id_TKE_itidal > 0) call post_data(cs%id_TKE_itidal, itide%TKE_itidal_input, cs%diag)
146  if (cs%id_Nb > 0) call post_data(cs%id_Nb, itide%Nb, cs%diag)
147  if (cs%id_N2_bot > 0 ) call post_data(cs%id_N2_bot, n2_bot, cs%diag)
148