Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
a111632
Initial commit
jeffflick Sep 30, 2013
456c21b
Merge tag 'dev/master/2014.06.23' into testing
underwoo Jun 23, 2014
bf92d6f
Merge branch 'user/z1l/bugfix' into testing
underwoo Jun 26, 2014
f69a5c6
Merge tag 'dev/master/2014.07.01' into testing
underwoo Jul 1, 2014
b4f2d78
Merge "testing" into master for tikal_201406 release
underwoo Jul 1, 2014
a8436ee
Merge for Ulm release (21.0.0)
underwoo Dec 15, 2014
f7371f2
This commit fixes a bug that was leading to non-conservation of passi…
Aug 23, 2016
5e8de22
Changed so that ea(i,j,k=1) is set by dThickness so that negative thi…
Aug 24, 2016
fa8e954
Continued work to fix conservation with passive tracer conservation. …
Sep 6, 2016
dfd22a2
Start testing conservation with new applyTracerBoundaryFluxesInOut
Sep 6, 2016
9e5dc3d
Tracers still not conserving. Suspect that for some reason, h_orig is…
Sep 6, 2016
145060a
Passive tracers are now conserved. A test case treating salinity like…
Sep 6, 2016
5271591
Testing pseudo-salt tracer
Sep 7, 2016
17235bc
Testing pseudo-salt tracer
Sep 7, 2016
ffbe44e
Differences exist between salinity and pseudo-salinity stocks. All si…
Sep 7, 2016
36acb8a
Differences between salt and pseudo-salt may be due to differences be…
Sep 8, 2016
982c373
Pseudo salt and salt have very small differences. Suspect difference …
Sep 13, 2016
b9a0416
Resolve conflicts with NOAA-GFDL dev/master
Sep 13, 2016
cd3a96d
Merge branch 'master' of github.com:NOAA-GFDL/MOM6 into vertical_trac…
Sep 13, 2016
179dbaf
The previously mentioned applyTracerBoundaryFluxesInOut has been test…
Sep 13, 2016
6381e6b
Move some code around to make it easier to incorporate into generic t…
Sep 15, 2016
f38bd7b
Moved some lines around to make sure that applyTracerBoundaryFluxesIn…
Sep 15, 2016
e0ceede
Applied the fix for the generic tracer package, needs testing to conf…
Sep 16, 2016
8105945
Make sure everything is synced
Sep 16, 2016
9cf6b64
Validated that applyTracerBoundaryFluxesInOut works as expected with …
Sep 21, 2016
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/core/MOM.F90
Original file line number Diff line number Diff line change
Expand Up @@ -2073,7 +2073,7 @@ subroutine initialize_MOM(Time, param_file, dirs, CS, Time_in)
(LEN_TRIM(dirs%input_filename) == 1))
call tracer_flow_control_init(.not.new_sim, Time, G, GV, CS%h, param_file, &
CS%diag, CS%OBC, CS%tracer_flow_CSp, CS%sponge_CSp, &
CS%ALE_sponge_CSp, CS%diag_to_Z_CSp)
CS%ALE_sponge_CSp, CS%diag_to_Z_CSp, CS%tv)

call cpu_clock_begin(id_clock_pass_init)
call do_group_pass(CS%pass_uv_T_S_h, G%Domain)
Expand Down
14 changes: 10 additions & 4 deletions src/core/MOM_forcing_type.F90
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,10 @@ module MOM_forcing_type
vprec => NULL(), & !< virtual liquid precip associated w/ SSS restoring ( kg/(m^2 s) )
lrunoff => NULL(), & !< liquid river runoff entering ocean ( kg/(m^2 s) )
frunoff => NULL(), & !< frozen river runoff (calving) entering ocean ( kg/(m^2 s) )
seaice_melt => NULL() !< seaice melt (positive) or formation (negative) ( kg/(m^2 s) )
seaice_melt => NULL(), & !< seaice melt (positive) or formation (negative) ( kg/(m^2 s) )
netMassIn => NULL(), & !< Sum of water mass flux out of the ocean ( kg/(m^2 s) )
netMassOut => NULL(), & !< Net water mass flux into of the ocean ( kg/(m^2 s) )
netSalt => NULL() !< Net salt entering the ocean

! heat associated with water crossing ocean surface
real, pointer, dimension(:,:) :: &
Expand Down Expand Up @@ -410,7 +413,6 @@ subroutine extractFluxes1d(G, GV, fluxes, optics, nsw, j, dt,
netMassInOut(i) = GV%kg_m2_to_H * netMassInOut(i)
netMassOut(i) = GV%kg_m2_to_H * netMassOut(i)


! surface heat fluxes from radiation and turbulent fluxes (K * H)
! (H=m for Bouss, H=kg/m2 for non-Bouss)
net_heat(i) = scale * dt * J_m2_to_H * &
Expand Down Expand Up @@ -488,9 +490,10 @@ subroutine extractFluxes1d(G, GV, fluxes, optics, nsw, j, dt,
! Convert salt_flux from kg (salt)/(m^2 * s) to
! Boussinesq: (ppt * m)
! non-Bouss: (g/m^2)
if (ASSOCIATED(fluxes%salt_flux)) &
if (ASSOCIATED(fluxes%salt_flux)) then
Net_salt(i) = (scale * dt * (1000.0 * fluxes%salt_flux(i,j))) * GV%kg_m2_to_H

fluxes%netSalt(i,j) = Net_salt(i)
endif
! Diagnostics follow...

! Initialize heat_content_massin that is diagnosed in mixedlayer_convection or
Expand Down Expand Up @@ -2186,6 +2189,9 @@ subroutine allocate_forcing_type(G, fluxes, stress, ustar, water, heat, shelf, p
call myAlloc(fluxes%lrunoff,isd,ied,jsd,jed, water)
call myAlloc(fluxes%frunoff,isd,ied,jsd,jed, water)
call myAlloc(fluxes%seaice_melt,isd,ied,jsd,jed, water)
call myAlloc(fluxes%netMassOut,isd,ied,jsd,jed, water)
call myAlloc(fluxes%netMassIn,isd,ied,jsd,jed, water)
call myAlloc(fluxes%netSalt,isd,ied,jsd,jed, water)

call myAlloc(fluxes%sw,isd,ied,jsd,jed, heat)
call myAlloc(fluxes%lw,isd,ied,jsd,jed, heat)
Expand Down
15 changes: 7 additions & 8 deletions src/parameterizations/vertical/MOM_diabatic_aux.F90
Original file line number Diff line number Diff line change
Expand Up @@ -100,9 +100,9 @@ module MOM_diabatic_aux
!! at the river mouths to "rivermix_depth" meters
real :: rivermix_depth = 0.0 !< The depth to which rivers are mixed if
!! do_rivermix = T, in m.
real :: minimum_forcing_depth = 0.001 !< The smallest depth over which forcing is
real, public :: minimum_forcing_depth = 0.001 !< The smallest depth over which forcing is
!! applied, in m.
real :: evap_CFL_limit = 0.8 !< The largest fraction of a layer that can be
real, public :: evap_CFL_limit = 0.8 !< The largest fraction of a layer that can be
!! evaporated in one time-step (non-dim).

logical :: reclaim_frazil !< If true, try to use any frazil heat deficit to
Expand Down Expand Up @@ -574,7 +574,6 @@ subroutine triDiagTS(G, GV, is, ie, js, je, hold, ea, eb, T, S)
real :: c1(SZIB_(G),SZK_(G)) ! tridiagonal solver.
real :: h_tr, b_denom_1
integer :: i, j, k

!$OMP parallel do default(none) shared(is,ie,js,je,G,GV,hold,eb,T,S,ea) &
!$OMP private(h_tr,b1,d1,c1,b_denom_1)
do j=js,je
Expand Down Expand Up @@ -803,15 +802,14 @@ end subroutine diagnoseMLDbyDensityDifference
!> Update the thickness, temperature, and salinity due to thermodynamic
!! boundary forcing (contained in fluxes type) applied to h, tv%T and tv%S,
!! and calculate the TKE implications of this heating.
subroutine applyBoundaryFluxesInOut(CS, G, GV, dt, fluxes, optics, ea, h, tv, &
subroutine applyBoundaryFluxesInOut(CS, G, GV, dt, fluxes, optics, h, tv, &
aggregate_FW_forcing, cTKE, dSV_dT, dSV_dS)
type(diabatic_aux_CS), pointer :: CS !< Control structure for diabatic_aux
type(ocean_grid_type), intent(in) :: G !< Grid structure
type(verticalGrid_type), intent(in) :: GV !< ocean vertical grid structure
type(verticalGrid_type), intent(in) :: GV !< ocean vertical grid structure
real, intent(in) :: dt !< Time-step over which forcing is applied (s)
type(forcing), intent(inout) :: fluxes !< Surface fluxes container
type(optics_type), pointer :: optics !< Optical properties container
real, dimension(SZI_(G),SZJ_(G),SZK_(G)), intent(inout) :: ea !< The entrainment distance at interfaces (H units)
real, dimension(SZI_(G),SZJ_(G),SZK_(G)), intent(inout) :: h !< Layer thickness in H units
type(thermo_var_ptrs), intent(inout) :: tv !< Thermodynamics container
!> If False, treat in/out fluxes separately.
Expand Down Expand Up @@ -945,13 +943,15 @@ subroutine applyBoundaryFluxesInOut(CS, G, GV, dt, fluxes, optics, ea, h, tv, &

! ea is for passive tracers
do i=is,ie
ea(i,j,1) = netMassInOut(i)
! ea(i,j,1) = netMassInOut(i)
if (aggregate_FW_forcing) then
netMassOut(i) = netMassInOut(i)
netMassIn(i) = 0.
else
netMassIn(i) = netMassInOut(i) - netMassOut(i)
endif
fluxes%netMassOut(i,j) = netMassOut(i)
fluxes%netMassIn(i,j) = netMassIn(i)
enddo

! Apply the surface boundary fluxes in three steps:
Expand All @@ -973,7 +973,6 @@ subroutine applyBoundaryFluxesInOut(CS, G, GV, dt, fluxes, optics, ea, h, tv, &
! Update the forcing by the part to be consumed within the present k-layer.
! If fractionOfForcing = 1, then updated netMassIn, netHeat, and netSalt vanish.
netMassIn(i) = netMassIn(i) - dThickness

! This line accounts for the temperature of the mass exchange
Temp_in = T2d(i,k)
Salin_in = 0.0
Expand Down
80 changes: 64 additions & 16 deletions src/parameterizations/vertical/MOM_diabatic_driver.F90
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ module MOM_diabatic_driver
use MOM_ALE_sponge, only : apply_ALE_sponge, ALE_sponge_CS
use MOM_time_manager, only : operator(<=), time_type ! for testing itides (BDM)
use MOM_tracer_flow_control, only : call_tracer_column_fns, tracer_flow_control_CS
use MOM_tracer_diabatic, only : tracer_vertdiff
use MOM_variables, only : thermo_var_ptrs, vertvisc_type, accel_diag_ptrs
use MOM_variables, only : cont_diag_ptrs, MOM_thermovar_chksum, p3d
use MOM_verticalGrid, only : verticalGrid_type
Expand Down Expand Up @@ -141,6 +142,8 @@ module MOM_diabatic_driver
!! is statically unstable.
logical :: debug !< If true, write verbose checksums for debugging purposes.
logical :: debugConservation !< If true, monitor conservation and extrema.
logical :: tracer_tridiag !< If true, use tracer_vertdiff instead of tridiagTS for
!< vertical diffusion of T and S
logical :: debug_energy_req ! If true, test the mixing energy requirement code.
type(diag_ctrl), pointer :: diag !< structure used to regulate timing of diagnostic output
real :: MLDdensityDifference !< Density difference used to determine MLD_user
Expand Down Expand Up @@ -244,6 +247,7 @@ subroutine diabatic(u, v, h, tv, fluxes, visc, ADp, CDp, dt, G, GV, CS)
! one time step (m for Bouss, kg/m^2 for non-Bouss)
Kd, & ! diapycnal diffusivity of layers (m^2/sec)
h_orig, & ! initial layer thicknesses (m for Bouss, kg/m^2 for non-Bouss)
h_prebound, & ! initial layer thicknesses (m for Bouss, kg/m^2 for non-Bouss)
hold, & ! layer thickness before diapycnal entrainment, and later
! the initial layer thicknesses (if a mixed layer is used),
! (m for Bouss, kg/m^2 for non-Bouss)
Expand Down Expand Up @@ -411,6 +415,7 @@ subroutine diabatic(u, v, h, tv, fluxes, visc, ADp, CDp, dt, G, GV, CS)
if (CS%debugConservation) call MOM_state_stats('geothermal', u, v, h, tv%T, tv%S, G)
endif


! Whenever thickness changes let the diag manager know, target grids
! for vertical remapping may need to be regenerated.
call diag_update_target_grids(CS%diag)
Expand Down Expand Up @@ -719,7 +724,7 @@ subroutine diabatic(u, v, h, tv, fluxes, visc, ADp, CDp, dt, G, GV, CS)
if (CS%useALEalgorithm) then
call cpu_clock_begin(id_clock_remap)

! Changes made to following fields: ea(:,:,1), h, tv%T and tv%S.
! Changes made to following fields: h, tv%T and tv%S.

! save prior values for diagnostics
if(CS%boundary_forcing_tendency_diag) then
Expand All @@ -730,10 +735,14 @@ subroutine diabatic(u, v, h, tv, fluxes, visc, ADp, CDp, dt, G, GV, CS)
enddo ; enddo ; enddo
endif

do k=1,nz ; do j=js,je ; do i=is,ie
h_prebound(i,j,k) = h(i,j,k)
enddo ; enddo ; enddo
!$OMP parallel do default(none) shared(is,ie,js,je,nz,h_orig,h,eaml,ebml)
if (CS%use_energetic_PBL) then

call applyBoundaryFluxesInOut(CS%diabatic_aux_CSp, G, GV, dt, fluxes, CS%optics, &
ea, h, tv, CS%aggregate_FW_forcing, cTKE, dSV_dT, dSV_dS)
h, tv, CS%aggregate_FW_forcing, cTKE, dSV_dT, dSV_dS)


if (CS%debug) then
call hchksum(ea, "after applyBoundaryFluxes ea",G%HI,haloshift=0)
Expand Down Expand Up @@ -782,9 +791,8 @@ subroutine diabatic(u, v, h, tv, fluxes, visc, ADp, CDp, dt, G, GV, CS)
endif

else

call applyBoundaryFluxesInOut(CS%diabatic_aux_CSp, G, GV, dt, fluxes, CS%optics, &
ea, h, tv, CS%aggregate_FW_forcing)
h, tv, CS%aggregate_FW_forcing)

endif ! endif for CS%use_energetic_PBL

Expand All @@ -804,7 +812,6 @@ subroutine diabatic(u, v, h, tv, fluxes, visc, ADp, CDp, dt, G, GV, CS)

endif ! endif for (CS%useALEalgorithm)


! Update h according to divergence of the difference between
! ea and eb. We keep a record of the original h in hold.
! In the following, the checks for negative values are to guard
Expand Down Expand Up @@ -926,7 +933,12 @@ subroutine diabatic(u, v, h, tv, fluxes, visc, ADp, CDp, dt, G, GV, CS)
! This simpler form allows T & S to be too dense for the layers
! between the buffer layers and the interior.
! Changes: T, S
call triDiagTS(G, GV, is, ie, js, je, hold, ea, eb, tv%T, tv%S)
if (CS%tracer_tridiag) then
call tracer_vertdiff(hold, ea, eb, dt, tv%T, G, GV)
call tracer_vertdiff(hold, ea, eb, dt, tv%S, G, GV)
else
call triDiagTS(G, GV, is, ie, js, je, hold, ea, eb, tv%T, tv%S)
endif
endif ! massless_match_targets
call cpu_clock_end(id_clock_tridiag)

Expand Down Expand Up @@ -1005,7 +1017,12 @@ subroutine diabatic(u, v, h, tv, fluxes, visc, ADp, CDp, dt, G, GV, CS)
endif

! Changes T and S via the tridiagonal solver; no change to h
call triDiagTS(G, GV, is, ie, js, je, hold, ea, eb, tv%T, tv%S)
if(CS%tracer_tridiag) then
call tracer_vertdiff(hold, ea, eb, dt, tv%T, G, GV)
call tracer_vertdiff(hold, ea, eb, dt, tv%S, G, GV)
else
call triDiagTS(G, GV, is, ie, js, je, hold, ea, eb, tv%T, tv%S)
endif

! diagnose temperature, salinity, heat, and salt tendencies
if(CS%diabatic_diff_tendency_diag) then
Expand Down Expand Up @@ -1071,7 +1088,6 @@ subroutine diabatic(u, v, h, tv, fluxes, visc, ADp, CDp, dt, G, GV, CS)
enddo ; enddo ; enddo
endif


! mixing of passive tracers from massless boundary layers to interior
call cpu_clock_begin(id_clock_tracers)
if (CS%mix_boundary_tracers) then
Expand Down Expand Up @@ -1122,8 +1138,19 @@ subroutine diabatic(u, v, h, tv, fluxes, visc, ADp, CDp, dt, G, GV, CS)
enddo ; enddo
do i=is,ie ; eatr(i,j,1) = ea(i,j,1) ; enddo
enddo
call call_tracer_column_fns(hold, h, eatr, ebtr, fluxes, dt, G, GV, tv, &
CS%optics, CS%tracer_flow_CSp)


if (CS%useALEalgorithm) then
! For passive tracers, the changes in thickness due to boundary fluxes has yet to be applied
! so hold should be h_orig
call call_tracer_column_fns(h_prebound, h, ea, eb, fluxes, dt, G, GV, tv, &
CS%optics, CS%tracer_flow_CSp, CS%debug, &
evap_CFL_limit = CS%diabatic_aux_CSp%evap_CFL_limit, &
minimum_forcing_depth = CS%diabatic_aux_CSp%minimum_forcing_depth)
else
call call_tracer_column_fns(hold, h, eatr, ebtr, fluxes, dt, G, GV, tv, &
CS%optics, CS%tracer_flow_CSp, CS%debug)
endif

elseif (associated(visc%Kd_extra_S)) then ! extra diffusivity for passive tracers

Expand All @@ -1144,12 +1171,28 @@ subroutine diabatic(u, v, h, tv, fluxes, visc, ADp, CDp, dt, G, GV, CS)
ebtr(i,j,k-1) = eb(i,j,k-1) + add_ent
eatr(i,j,k) = ea(i,j,k) + add_ent
enddo ; enddo ; enddo
call call_tracer_column_fns(hold, h, eatr, ebtr, fluxes, dt, G, GV, tv, &
CS%optics, CS%tracer_flow_CSp)
if (CS%useALEalgorithm) then
! For passive tracers, the changes in thickness due to boundary fluxes has yet to be applied
call call_tracer_column_fns(h_prebound, h, eatr, ebtr, fluxes, dt, G, GV, tv, &
CS%optics, CS%tracer_flow_CSp, CS%debug,&
evap_CFL_limit = CS%diabatic_aux_CSp%evap_CFL_limit, &
minimum_forcing_depth = CS%diabatic_aux_CSp%minimum_forcing_depth)
else
call call_tracer_column_fns(hold, h, eatr, ebtr, fluxes, dt, G, GV, tv, &
CS%optics, CS%tracer_flow_CSp, CS%debug)
endif

else
call call_tracer_column_fns(hold, h, ea, eb, fluxes, dt, G, GV, tv, &
CS%optics, CS%tracer_flow_CSp)
if (CS%useALEalgorithm) then
! For passive tracers, the changes in thickness due to boundary fluxes has yet to be applied
call call_tracer_column_fns(h_prebound, h, eatr, ebtr, fluxes, dt, G, GV, tv, &
CS%optics, CS%tracer_flow_CSp, CS%debug, &
evap_CFL_limit = CS%diabatic_aux_CSp%evap_CFL_limit, &
minimum_forcing_depth = CS%diabatic_aux_CSp%minimum_forcing_depth)
else
call call_tracer_column_fns(hold, h, ea, eb, fluxes, dt, G, GV, tv, &
CS%optics, CS%tracer_flow_CSp, CS%debug)
endif

endif ! (CS%mix_boundary_tracers)

Expand Down Expand Up @@ -1436,7 +1479,7 @@ subroutine adiabatic(h, tv, fluxes, dt, G, GV, CS)
zeros(:,:,:) = 0.0

call call_tracer_column_fns(h, h, zeros, zeros, fluxes, dt, G, GV, tv, &
CS%optics, CS%tracer_flow_CSp)
CS%optics, CS%tracer_flow_CSp, CS%debug)

end subroutine adiabatic

Expand Down Expand Up @@ -1870,6 +1913,11 @@ subroutine diabatic_driver_init(Time, G, GV, param_file, useALEalgorithm, diag,
"entrainment at the bottom is at least sqrt(Kd_BBL_tr*dt) \n"//&
"over the same distance.", units="m2 s-1", default=0.)
endif

call get_param(param_file, mod, "TRACER_TRIDIAG", CS%tracer_tridiag, &
"If true, use the passive tracer tridiagonal solver for T and S\n", &
default=.false.)


! Register all available diagnostics for this module.
if (GV%Boussinesq) then ; thickness_units = "meter"
Expand Down
25 changes: 20 additions & 5 deletions src/tracer/DOME_tracer.F90
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ module DOME_tracer
use MOM_time_manager, only : time_type, get_time
use MOM_tracer_registry, only : register_tracer, tracer_registry_type
use MOM_tracer_registry, only : add_tracer_diagnostics, add_tracer_OBC_values
use MOM_tracer_registry, only : tracer_vertdiff
use MOM_tracer_diabatic, only : tracer_vertdiff, applyTracerBoundaryFluxesInOut
use MOM_variables, only : surface
use MOM_verticalGrid, only : verticalGrid_type

Expand Down Expand Up @@ -415,13 +415,16 @@ subroutine initialize_DOME_tracer(restart, day, G, GV, h, diag, OBC, CS, &

end subroutine initialize_DOME_tracer

subroutine DOME_tracer_column_physics(h_old, h_new, ea, eb, fluxes, dt, G, GV, CS)
subroutine DOME_tracer_column_physics(h_old, h_new, ea, eb, fluxes, dt, G, GV, CS, &
evap_CFL_limit, minimum_forcing_depth)
type(ocean_grid_type), intent(in) :: G
type(verticalGrid_type), intent(in) :: GV
real, dimension(SZI_(G),SZJ_(G),SZK_(G)), intent(in) :: h_old, h_new, ea, eb
type(forcing), intent(in) :: fluxes
real, intent(in) :: dt
type(DOME_tracer_CS), pointer :: CS
real, optional,intent(in) :: evap_CFL_limit
real, optional,intent(in) :: minimum_forcing_depth
! This subroutine applies diapycnal diffusion and any other column
! tracer physics or chemistry to the tracers from this file.
! This is a simple example of a set of advected passive tracers.
Expand All @@ -447,14 +450,26 @@ subroutine DOME_tracer_column_physics(h_old, h_new, ea, eb, fluxes, dt, G, GV,

real :: b1(SZI_(G)) ! b1 and c1 are variables used by the
real :: c1(SZI_(G),SZK_(G)) ! tridiagonal solver.
real, dimension(SZI_(G),SZJ_(G),SZK_(G)) :: h_work ! Used so that h can be modified
integer :: i, j, k, is, ie, js, je, nz, m
is = G%isc ; ie = G%iec ; js = G%jsc ; je = G%jec ; nz = GV%ke

if (.not.associated(CS)) return

do m=1,NTR
call tracer_vertdiff(h_old, ea, eb, dt, CS%tr(:,:,:,m), G, GV)
enddo
if (present(evap_CFL_limit) .and. present(minimum_forcing_depth)) then
do m=1,NTR
do k=1,nz ;do j=js,je ; do i=is,ie
h_work(i,j,k) = h_old(i,j,k)
enddo ; enddo ; enddo;
call applyTracerBoundaryFluxesInOut(G, GV, CS%tr(:,:,:,m) , dt, fluxes, h_work, &
evap_CFL_limit, minimum_forcing_depth)
call tracer_vertdiff(h_work, ea, eb, dt, CS%tr(:,:,:,m), G, GV)
enddo
else
do m=1,NTR
call tracer_vertdiff(h_old, ea, eb, dt, CS%tr(:,:,:,m), G, GV)
enddo
endif

if (CS%mask_tracers) then
do m = 1,NTR ; if (CS%id_tracer(m) > 0) then
Expand Down
Loading