MOM6
MOM_continuity.F90
1 !> Solve the layer continuity equation.
3 
4 ! This file is part of MOM6. See LICENSE.md for the license.
5 
6 use mom_continuity_ppm, only : continuity_ppm, continuity_ppm_init
7 use mom_continuity_ppm, only : continuity_ppm_stencil
8 use mom_continuity_ppm, only : continuity_ppm_end, continuity_ppm_cs
9 use mom_diag_mediator, only : time_type, diag_ctrl
10 use mom_error_handler, only : mom_error, mom_mesg, fatal, warning, is_root_pe
12 use mom_string_functions, only : uppercase
13 use mom_grid, only : ocean_grid_type
16 use mom_variables, only : bt_cont_type
18 
19 implicit none ; private
20 
21 #include <MOM_memory.h>
22 
23 public continuity, continuity_init, continuity_end, continuity_stencil
24 
25 !> Control structure for mom_continuity
26 type, public :: continuity_cs ; private
27  integer :: continuity_scheme !< Selects the discretization for the continuity solver.
28  !! Valid values are:
29  !! - PPM - A directionally split piecewise parabolic reconstruction solver.
30  !! The default, PPM, seems most appropriate for use with our current
31  !! time-splitting strategies.
32  type(continuity_ppm_cs), pointer :: ppm_csp => null() !< Control structure for mom_continuity_ppm
33 end type continuity_cs
34 
35 integer, parameter :: ppm_scheme = 1 !< Enumerated constant to select PPM
36 character(len=20), parameter :: ppm_string = "PPM" !< String to select PPM
37 
38 contains
39 
40 !> Time steps the layer thicknesses, using a monotonically limited, directionally split PPM scheme,
41 !! based on Lin (1994).
42 subroutine continuity(u, v, hin, h, uh, vh, dt, G, GV, US, CS, uhbt, vhbt, OBC, &
43  visc_rem_u, visc_rem_v, u_cor, v_cor, BT_cont)
44  type(ocean_grid_type), intent(inout) :: G !< Ocean grid structure.
45  type(verticalgrid_type), intent(in) :: GV !< Vertical grid structure.
46  real, dimension(SZIB_(G),SZJ_(G),SZK_(G)), &
47  intent(in) :: u !< Zonal velocity [L T-1 ~> m s-1].
48  real, dimension(SZI_(G),SZJB_(G),SZK_(G)), &
49  intent(in) :: v !< Meridional velocity [L T-1 ~> m s-1].
50  real, dimension(SZI_(G),SZJ_(G),SZK_(G)), &
51  intent(in) :: hin !< Initial layer thickness [H ~> m or kg m-2].
52  real, dimension(SZI_(G),SZJ_(G),SZK_(G)), &
53  intent(inout) :: h !< Final layer thickness [H ~> m or kg m-2].
54  real, dimension(SZIB_(G),SZJ_(G),SZK_(G)), &
55  intent(out) :: uh !< Volume flux through zonal faces =
56  !! u*h*dy [H L2 T-1 ~> m3 s-1 or kg s-1].
57  real, dimension(SZI_(G),SZJB_(G),SZK_(G)), &
58  intent(out) :: vh !< Volume flux through meridional faces =
59  !! v*h*dx [H L2 T-1 ~> m3 s-1 or kg s-1].
60  real, intent(in) :: dt !< Time increment [T ~> s].
61  type(unit_scale_type), intent(in) :: US !< A dimensional unit scaling type
62  type(continuity_cs), pointer :: CS !< Control structure for mom_continuity.
63  real, dimension(SZIB_(G),SZJ_(G)), &
64  optional, intent(in) :: uhbt !< The vertically summed volume
65  !! flux through zonal faces [H L2 T-1 ~> m3 s-1 or kg s-1].
66  real, dimension(SZI_(G),SZJB_(G)), &
67  optional, intent(in) :: vhbt !< The vertically summed volume
68  !! flux through meridional faces [H L2 T-1 ~> m3 s-1 or kg s-1].
69  type(ocean_obc_type), &
70  optional, pointer :: OBC !< Open boundaries control structure.
71  real, dimension(SZIB_(G),SZJ_(G),SZK_(G)), &
72  optional, intent(in) :: visc_rem_u !< Both the fraction of
73  !! zonal momentum that remains after a time-step of viscosity, and the fraction of a time-step's
74  !! worth of a barotropic acceleration that a layer experiences after viscosity is applied.
75  !! Non-dimensional between 0 (at the bottom) and 1 (far above the bottom).
76  real, dimension(SZI_(G),SZJB_(G),SZK_(G)), &
77  optional, intent(in) :: visc_rem_v !< Both the fraction of
78  !! meridional momentum that remains after a time-step of viscosity, and the fraction of a time-step's
79  !! worth of a barotropic acceleration that a layer experiences after viscosity is applied.
80  !! Non-dimensional between 0 (at the bottom) and 1 (far above the bottom).
81  real, dimension(SZIB_(G),SZJ_(G),SZK_(G)), &
82  optional, intent(out) :: u_cor !< The zonal velocities that
83  !! give uhbt as the depth-integrated transport [L T-1 ~> m s-1].
84  real, dimension(SZI_(G),SZJB_(G),SZK_(G)), &
85  optional, intent(out) :: v_cor !< The meridional velocities that
86  !! give vhbt as the depth-integrated transport [L T-1 ~> m s-1].
87  type(bt_cont_type), &
88  optional, pointer :: BT_cont !< A structure with elements
89  !! that describe the effective open face areas as a function of barotropic flow.
90 
91  if (present(visc_rem_u) .neqv. present(visc_rem_v)) call mom_error(fatal, &
92  "MOM_continuity: Either both visc_rem_u and visc_rem_v or neither"// &
93  " one must be present in call to continuity.")
94  if (present(u_cor) .neqv. present(v_cor)) call mom_error(fatal, &
95  "MOM_continuity: Either both u_cor and v_cor or neither"// &
96  " one must be present in call to continuity.")
97 
98  if (cs%continuity_scheme == ppm_scheme) then
99  call continuity_ppm(u, v, hin, h, uh, vh, dt, g, gv, us, cs%PPM_CSp, uhbt, vhbt, obc, &
100  visc_rem_u, visc_rem_v, u_cor, v_cor, bt_cont=bt_cont)
101  else
102  call mom_error(fatal, "continuity: Unrecognized value of continuity_scheme")
103  endif
104 
105 end subroutine continuity
106 
107 !> Initializes continuity_cs
108 subroutine continuity_init(Time, G, GV, US, param_file, diag, CS)
109  type(time_type), target, intent(in) :: Time !< Current model time.
110  type(ocean_grid_type), intent(in) :: G !< Ocean grid structure.
111  type(verticalgrid_type), intent(in) :: GV !< Vertical grid structure.
112  type(unit_scale_type), intent(in) :: US !< A dimensional unit scaling type
113  type(param_file_type), intent(in) :: param_file !< Parameter file handles.
114  type(diag_ctrl), target, intent(inout) :: diag !< Diagnostics control structure.
115  type(continuity_cs), pointer :: CS !< Control structure for mom_continuity.
116 
117  ! This include declares and sets the variable "version".
118 # include "version_variable.h"
119  character(len=40) :: mdl = "MOM_continuity" ! This module's name.
120  character(len=20) :: tmpstr
121 
122  if (associated(cs)) then
123  call mom_error(warning, "continuity_init called with associated control structure.")
124  return
125  endif
126  allocate(cs)
127 
128  ! Read all relevant parameters and write them to the model log.
129  call log_version(param_file, mdl, version, "")
130  call get_param(param_file, mdl, "CONTINUITY_SCHEME", tmpstr, &
131  "CONTINUITY_SCHEME selects the discretization for the "//&
132  "continuity solver. The only valid value currently is: \n"//&
133  "\t PPM - use a positive-definite (or monotonic) \n"//&
134  "\t piecewise parabolic reconstruction solver.", &
135  default=ppm_string)
136 
137  tmpstr = uppercase(tmpstr) ; cs%continuity_scheme = 0
138  select case (trim(tmpstr))
139  case (ppm_string) ; cs%continuity_scheme = ppm_scheme
140  case default
141  call mom_mesg('continuity_init: CONTINUITY_SCHEME ="'//trim(tmpstr)//'"', 0)
142  call mom_mesg("continuity_init: The only valid value is currently "// &
143  trim(ppm_string), 0)
144  call mom_error(fatal, "continuity_init: Unrecognized setting "// &
145  "#define CONTINUITY_SCHEME "//trim(tmpstr)//" found in input file.")
146  end select
147 
148  if (cs%continuity_scheme == ppm_scheme) then
149  call continuity_ppm_init(time, g, gv, us, param_file, diag, cs%PPM_CSp)
150  endif
151 
152 end subroutine continuity_init
153 
154 
155 !> continuity_stencil returns the continuity solver stencil size
156 function continuity_stencil(CS) result(stencil)
157  type(continuity_cs), pointer :: CS !< Module's control structure.
158  integer :: stencil !< The continuity solver stencil size with the current settings.
159 
160  stencil = 1
161 
162  if (cs%continuity_scheme == ppm_scheme) then
163  stencil = continuity_ppm_stencil(cs%PPM_CSp)
164  endif
165 
166 end function continuity_stencil
167 
168 !> Destructor for continuity_cs.
169 subroutine continuity_end(CS)
170  type(continuity_cs), pointer :: CS !< Control structure for mom_continuity.
171 
172  if (cs%continuity_scheme == ppm_scheme) then
173  call continuity_ppm_end(cs%PPM_CSp)
174  endif
175 
176  deallocate(cs)
177 
178 end subroutine continuity_end
179 
180 end module mom_continuity
Ocean grid type. See mom_grid for details.
Definition: MOM_grid.F90:26
The following data type a list of diagnostic fields an their variants, as well as variables that cont...
Solve the layer continuity equation.
A structure that can be parsed to read and document run-time parameters.
Provides the ocean grid type.
Definition: MOM_grid.F90:2
The MOM6 facility to parse input files for runtime parameters.
Container for information about the summed layer transports and how they will vary as the barotropic ...
Control structure for mom_continuity_ppm.
Describes various unit conversion factors.
Control structure for mom_continuity.
Provides a transparent unit rescaling type to facilitate dimensional consistency testing.
The subroutines here provide convenient wrappers to the fms diag_manager interfaces with additional d...
Routines for error handling and I/O management.
An overloaded interface to log version information about modules.
Describes the vertical ocean grid, including unit conversion factors.
Solve the layer continuity equation using the PPM method for layer fluxes.
Controls where open boundary conditions are applied.
Handy functions for manipulating strings.
Provides a transparent vertical ocean grid type and supporting routines.
Provides transparent structures with groups of MOM6 variables and supporting routines.
An overloaded interface to read and log the values of various types of parameters.