MOM6
generic_tracer_utils.F90
1 !> g_tracer_utils module consists of core utility subroutines to be used by
2 !! all generic tracer modules. These include the lowest level functions
3 !! for adding, allocating memory, and record keeping of individual generic
4 !! tracers irrespective of their physical/chemical nature.
6 
7  use coupler_types_mod, only: coupler_2d_bc_type
8  use time_manager_mod, only : time_type
9  use field_manager_mod, only: fm_string_len
10  use mom_diag_mediator, only : g_diag_ctrl=>diag_ctrl
11 
12 implicit none ; private
13 
14  !> Each generic tracer node is an instant of a FORTRAN type with the following member variables.
15  !! These member fields are supposed to uniquely define an individual tracer.
16  !! One such type shall be instantiated for EACH individual tracer.
18  !> Tracer concentration field in space (and time)
19  !! MOM keeps the prognostic tracer fields at 3 time levels, hence 4D.
20  real, pointer, dimension(:,:,:,:) :: field => null()
21  !> Tracer concentration in river runoff
22  real, allocatable, dimension(:,:) :: trunoff
23  logical :: requires_restart = .true. !< Unknown
24  character(len=fm_string_len) :: src_file !< Tracer source filename
25  character(len=fm_string_len) :: src_var_name !< Tracer source variable name
26  character(len=fm_string_len) :: src_var_unit !< Tracer source variable units
27  character(len=fm_string_len) :: src_var_gridspec !< Tracer source grid file name
28  integer :: src_var_record !< Unknown
29  logical :: requires_src_info = .false. !< Unknown
30  real :: src_var_unit_conversion = 1.0 !< This factor depends on the tracer. Ask Jasmin
31  real :: src_var_valid_min = 0.0 !< Unknown
32  end type g_tracer_type
33 
34  !> Unknown
36  integer :: dummy !< A dummy member, not part of the API
37  end type g_diag_type
38 
39  !> The following type fields are common to ALL generic tracers and hence has to be instantiated only once
41 ! type(g_diag_ctrl) :: diag_CS !< Unknown
42  !> Domain extents
43  integer :: isd !< Start index of the data domain in the i-direction
44  integer :: jsd !< Start index of the data domain in the j-direction
45  end type g_tracer_common
46 
47  !> Unknown dangerous module data!
48  type(g_tracer_common), target, save :: g_tracer_com
49 
50  public :: g_tracer_type
51  public :: g_tracer_flux_init
52  public :: g_tracer_set_values
53  public :: g_tracer_get_values
54  public :: g_tracer_get_pointer
55  public :: g_tracer_get_common
56  public :: g_tracer_set_common
57  public :: g_tracer_set_csdiag
58  public :: g_tracer_send_diag
59  public :: g_tracer_get_name
60  public :: g_tracer_get_alias
61  public :: g_tracer_get_next
62  public :: g_tracer_is_prog
63  public :: g_diag_type
64 
65  !> Set the values of various (array) members of the tracer node g_tracer_type
66  !!
67  !! This function is overloaded to set the values of the following member variables
69  module procedure g_tracer_set_real
70  module procedure g_tracer_set_2d
71  module procedure g_tracer_set_3d
72  module procedure g_tracer_set_4d
73  end interface
74 
75  !> Reverse of interface g_tracer_set_values for getting the tracer member arrays in the argument value
76  !!
77  !! This means "get the values of array %field_name for tracer tracer_name and put them in argument array_out"
79  module procedure g_tracer_get_4d_val
80  module procedure g_tracer_get_3d_val
81  module procedure g_tracer_get_2d_val
82  module procedure g_tracer_get_real
83  module procedure g_tracer_get_string
84  end interface
85 
86  !> Return the pointer to the requested field of a particular tracer
87  !!
88  !! This means "get the pointer of array %field_name for tracer tracer_name in argument array_ptr"
90  module procedure g_tracer_get_4d
91  module procedure g_tracer_get_3d
92  module procedure g_tracer_get_2d
93  end interface
94 
95 contains
96 
97  !> Unknown
98  subroutine g_tracer_flux_init(g_tracer)
99  type(g_tracer_type), pointer :: g_tracer !< Pointer to this tracer node
100  end subroutine g_tracer_flux_init
101 
102  !> Unknown
103  subroutine g_tracer_set_csdiag(diag_CS)
104  type(g_diag_ctrl), target,intent(in) :: diag_cs !< Unknown
105  end subroutine g_tracer_set_csdiag
106 
107  subroutine g_tracer_set_common(isc,iec,jsc,jec,isd,ied,jsd,jed,nk,ntau,axes,grid_tmask,grid_kmt,init_time)
108  integer, intent(in) :: isc !< Computation start index in i direction
109  integer, intent(in) :: iec !< Computation end index in i direction
110  integer, intent(in) :: jsc !< Computation start index in j direction
111  integer, intent(in) :: jec !< Computation end index in j direction
112  integer, intent(in) :: isd !< Data start index in i direction
113  integer, intent(in) :: ied !< Data end index in i direction
114  integer, intent(in) :: jsd !< Data start index in j direction
115  integer, intent(in) :: jed !< Data end index in j direction
116  integer, intent(in) :: nk !< Number of levels in k direction
117  integer, intent(in) :: ntau !< Unknown
118  integer, intent(in) :: axes(3) !< Domain axes?
119  real, dimension(isd:,jsd:,:),intent(in) :: grid_tmask !< Unknown
120  integer,dimension(isd:,jsd:),intent(in) :: grid_kmt !< Unknown
121  type(time_type), intent(in) :: init_time !< Unknown
122  end subroutine g_tracer_set_common
123 
124  subroutine g_tracer_get_common(isc,iec,jsc,jec,isd,ied,jsd,jed,nk,ntau,&
125  axes,grid_tmask,grid_mask_coast,grid_kmt,init_time,diag_CS)
126  integer, intent(out) :: isc !< Computation start index in i direction
127  integer, intent(out) :: iec !< Computation end index in i direction
128  integer, intent(out) :: jsc !< Computation start index in j direction
129  integer, intent(out) :: jec !< Computation end index in j direction
130  integer, intent(out) :: isd !< Data start index in i direction
131  integer, intent(out) :: ied !< Data end index in i direction
132  integer, intent(out) :: jsd !< Data start index in j direction
133  integer, intent(out) :: jed !< Data end index in j direction
134  integer, intent(out) :: nk !< Number of levels in k direction
135  integer, intent(out) :: ntau !< Unknown
136  integer, optional, intent(out) :: axes(3) !< Unknown
137  type(time_type), optional, intent(out) :: init_time !< Unknown
138  real, optional, dimension(:,:,:), pointer :: grid_tmask !< Unknown
139  integer, optional, dimension(:,:), pointer :: grid_mask_coast !< Unknown
140  integer, optional, dimension(:,:), pointer :: grid_kmt !< Unknown
141  type(g_diag_ctrl), optional, pointer :: diag_cs !< Unknown
142  end subroutine g_tracer_get_common
143 
144  !> Unknown
145  subroutine g_tracer_get_4d(g_tracer_list,name,member,array_ptr)
146  character(len=*), intent(in) :: name !< Unknown
147  character(len=*), intent(in) :: member !< Unknown
148  type(g_tracer_type), pointer :: g_tracer_list !< Unknown
149  real, dimension(:,:,:,:), pointer :: array_ptr !< Unknown
150  end subroutine g_tracer_get_4d
151 
152  !> Unknown
153  subroutine g_tracer_get_3d(g_tracer_list,name,member,array_ptr)
154  character(len=*), intent(in) :: name !< Unknown
155  character(len=*), intent(in) :: member !< Unknown
156  type(g_tracer_type), pointer :: g_tracer_list !< Unknown
157  real, dimension(:,:,:), pointer :: array_ptr !< Unknown
158  end subroutine g_tracer_get_3d
159 
160  !> Unknown
161  subroutine g_tracer_get_2d(g_tracer_list,name,member,array_ptr)
162  character(len=*), intent(in) :: name !< Unknown
163  character(len=*), intent(in) :: member !< Unknown
164  type(g_tracer_type), pointer :: g_tracer_list !< Unknown
165  real, dimension(:,:), pointer :: array_ptr !< Unknown
166  end subroutine g_tracer_get_2d
167 
168  !> Unknown
169  subroutine g_tracer_get_4d_val(g_tracer_list,name,member,array,isd,jsd)
170  character(len=*), intent(in) :: name !< Unknown
171  character(len=*), intent(in) :: member !< Unknown
172  type(g_tracer_type), pointer :: g_tracer_list !< Unknown
173  integer, intent(in) :: isd !< Unknown
174  integer, intent(in) :: jsd !< Unknown
175  real, dimension(isd:,jsd:,:,:), intent(out):: array !< Unknown
176  end subroutine g_tracer_get_4d_val
177 
178  !> Unknown
179  subroutine g_tracer_get_3d_val(g_tracer_list,name,member,array,isd,jsd,ntau,positive)
180  character(len=*), intent(in) :: name !< Unknown
181  character(len=*), intent(in) :: member !< Unknown
182  type(g_tracer_type), pointer :: g_tracer_list !< Unknown
183  integer, intent(in) :: isd !< Unknown
184  integer, intent(in) :: jsd !< Unknown
185  integer, optional, intent(in) :: ntau !< Unknown
186  logical, optional, intent(in) :: positive !< Unknown
187  real, dimension(isd:,jsd:,:), intent(out):: array !< Unknown
188  integer :: tau
189  character(len=fm_string_len), parameter :: sub_name = 'g_tracer_get_3D_val'
190  end subroutine g_tracer_get_3d_val
191 
192  !> Unknown
193  subroutine g_tracer_get_2d_val(g_tracer_list,name,member,array,isd,jsd)
194  character(len=*), intent(in) :: name !< Unknown
195  character(len=*), intent(in) :: member !< Unknown
196  type(g_tracer_type), pointer :: g_tracer_list !< Unknown
197  integer, intent(in) :: isd !< Unknown
198  integer, intent(in) :: jsd !< Unknown
199  real, dimension(isd:,jsd:), intent(out):: array !< Unknown
200  end subroutine g_tracer_get_2d_val
201 
202  !> Unknown
203  subroutine g_tracer_get_real(g_tracer_list,name,member,value)
204  character(len=*), intent(in) :: name !< Unknown
205  character(len=*), intent(in) :: member !< Unknown
206  type(g_tracer_type), pointer :: g_tracer_list !< Unknown
207  real, intent(out):: value !< Unknown
208  end subroutine g_tracer_get_real
209 
210  !> Unknown
211  subroutine g_tracer_get_string(g_tracer_list,name,member,string)
212  character(len=*), intent(in) :: name !< Unknown
213  character(len=*), intent(in) :: member !< Unknown
214  type(g_tracer_type), pointer :: g_tracer_list !< Unknown
215  character(len=fm_string_len), intent(out) :: string !< Unknown
216  end subroutine g_tracer_get_string
217 
218  !> Unknown
219  subroutine g_tracer_set_2d(g_tracer_list,name,member,array,isd,jsd,weight)
220  character(len=*), intent(in) :: name !< Unknown
221  character(len=*), intent(in) :: member !< Unknown
222  type(g_tracer_type), pointer :: g_tracer_list !< Unknown
223  integer, intent(in) :: isd !< Unknown
224  integer, intent(in) :: jsd !< Unknown
225  real, dimension(isd:,jsd:),intent(in) :: array !< Unknown
226  real, optional ,intent(in) :: weight !< Unknown
227  end subroutine g_tracer_set_2d
228 
229  !> Unknown
230  subroutine g_tracer_set_3d(g_tracer_list,name,member,array,isd,jsd,ntau)
231  character(len=*), intent(in) :: name !< Unknown
232  character(len=*), intent(in) :: member !< Unknown
233  type(g_tracer_type), pointer :: g_tracer_list !< Unknown
234  integer, intent(in) :: isd !< Unknown
235  integer, intent(in) :: jsd !< Unknown
236  integer, optional, intent(in) :: ntau !< Unknown
237  real, dimension(isd:,jsd:,:), intent(in) :: array !< Unknown
238  end subroutine g_tracer_set_3d
239 
240  !> Unknown
241  subroutine g_tracer_set_4d(g_tracer_list,name,member,array,isd,jsd)
242  character(len=*), intent(in) :: name !< Unknown
243  character(len=*), intent(in) :: member !< Unknown
244  type(g_tracer_type), pointer :: g_tracer_list !< Unknown
245  integer, intent(in) :: isd !< Unknown
246  integer, intent(in) :: jsd !< Unknown
247  real, dimension(isd:,jsd:,:,:), intent(in) :: array !< Unknown
248  end subroutine g_tracer_set_4d
249 
250  !> Unknown
251  subroutine g_tracer_set_real(g_tracer_list,name,member,value)
252  character(len=*), intent(in) :: name !< Unknown
253  character(len=*), intent(in) :: member !< Unknown
254  type(g_tracer_type), pointer :: g_tracer_list !< Unknown
255  real, intent(in) :: value !< Unknown
256  end subroutine g_tracer_set_real
257 
258  subroutine g_tracer_send_diag(g_tracer_list,model_time,tau)
259  type(g_tracer_type), pointer :: g_tracer_list !< pointer to the head of the generic tracer list
260  type(g_tracer_type), pointer :: g_tracer !< Pointer to tracer node
261  type(time_type), intent(in) :: model_time !< Time
262  integer, intent(in) :: tau !< The time step for the %field 4D field to be reported
263  end subroutine g_tracer_send_diag
264 
265  !> Unknown
266  subroutine g_tracer_get_name(g_tracer,string)
267  type(g_tracer_type), pointer :: g_tracer !< Unknown
268  character(len=*), intent(out) :: string !< Unknown
269  end subroutine g_tracer_get_name
270 
271  !> Unknown
272  subroutine g_tracer_get_alias(g_tracer,string)
273  type(g_tracer_type), pointer :: g_tracer !< Unknown
274  character(len=*), intent(out) :: string !< Unknown
275  end subroutine g_tracer_get_alias
276 
277  !> Is the tracer prognostic?
278  function g_tracer_is_prog(g_tracer)
279  logical :: g_tracer_is_prog
280  type(g_tracer_type), pointer :: g_tracer !< Pointer to tracer node
281  end function g_tracer_is_prog
282 
283  !> get the next tracer in the list
284  subroutine g_tracer_get_next(g_tracer,g_tracer_next)
285  type(g_tracer_type), pointer :: g_tracer !< Pointer to tracer node
286  type(g_tracer_type), pointer :: g_tracer_next !< Pointer to the next tracer node in the list
287  end subroutine g_tracer_get_next
288 
289  !>Vertical Diffusion of a tracer node
290  !!
291  !! This subroutine solves a tridiagonal equation to find and set values of vertically diffused field
292  !! for a tracer node.This is ported from GOLD (vertdiff) and simplified
293  !! Since the surface flux from the atmosphere (%stf) has the units of mol/m^2/sec the resulting
294  !! tracer concentration has units of mol/Kg
295  subroutine g_tracer_vertdiff_g(g_tracer, h_old, ea, eb, dt, kg_m2_to_H, m_to_H, tau, mom)
296  type(g_tracer_type), pointer :: g_tracer !< Unknown
297  !> Layer thickness before entrainment, in m or kg m-2.
298  real, dimension(g_tracer_com%isd:,g_tracer_com%jsd:,:), intent(in) :: h_old
299  !> The amount of fluid entrained from the layer above, in H.
300  real, dimension(g_tracer_com%isd:,g_tracer_com%jsd:,:), intent(in) :: ea
301  !> The amount of fluid entrained from the layer below, in H.
302  real, dimension(g_tracer_com%isd:,g_tracer_com%jsd:,:), intent(in) :: eb
303  real, intent(in) :: dt !< The amount of time covered by this call, in s.
304  real, intent(in) :: kg_m2_to_H !< A conversion factor that translates kg m-2 into
305  !! the units of h_old (H)
306  real, intent(in) :: m_to_H !< A conversion factor that translates m into the units
307  !! of h_old (H).
308  integer, intent(in) :: tau !< Unknown
309  logical, intent(in), optional :: mom !< Unknown
310  end subroutine g_tracer_vertdiff_g
311 
312 end module g_tracer_utils
mom_diag_mediator
The subroutines here provide convenient wrappers to the fms diag_manager interfaces with additional d...
Definition: MOM_diag_mediator.F90:3
g_tracer_utils::g_tracer_common
The following type fields are common to ALL generic tracers and hence has to be instantiated only onc...
Definition: generic_tracer_utils.F90:40
g_tracer_utils::g_tracer_type
Each generic tracer node is an instant of a FORTRAN type with the following member variables....
Definition: generic_tracer_utils.F90:17
g_tracer_utils::g_tracer_get_pointer
Return the pointer to the requested field of a particular tracer.
Definition: generic_tracer_utils.F90:89
g_tracer_utils::g_diag_type
Unknown.
Definition: generic_tracer_utils.F90:35
g_tracer_utils::g_tracer_get_values
Reverse of interface g_tracer_set_values for getting the tracer member arrays in the argument value.
Definition: generic_tracer_utils.F90:78
g_tracer_utils::g_tracer_set_values
Set the values of various (array) members of the tracer node g_tracer_type.
Definition: generic_tracer_utils.F90:68
mom_diag_mediator::diag_ctrl
The following data type a list of diagnostic fields an their variants, as well as variables that cont...
Definition: MOM_diag_mediator.F90:240
g_tracer_utils
g_tracer_utils module consists of core utility subroutines to be used by all generic tracer modules....
Definition: generic_tracer_utils.F90:5