Skip to content

Commit df5c3d8

Browse files
Mariona Claretjkrasting
authored andcommitted
Vertical intergal diagnostics for inert tracers
1 parent 637ca9a commit df5c3d8

File tree

2 files changed

+108
-16
lines changed

2 files changed

+108
-16
lines changed

generic_tracers/generic_CFC.F90

Lines changed: 62 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -124,12 +124,23 @@ module generic_CFC
124124

125125
type generic_CFC_type
126126
integer :: &
127-
id_fgcfc11 = -1, &
128-
id_fgcfc12 = -1
127+
id_fgcfc11 = -1, &
128+
id_fgcfc12 = -1, &
129+
id_wc_vert_int_cfc11 = -1, &
130+
id_wc_vert_int_cfc12 = -1
131+
132+
real, dimension(:,:), ALLOCATABLE :: &
133+
wc_vert_int_cfc11, &
134+
wc_vert_int_cfc12
135+
129136
real, dimension (:,:), pointer :: &
130137
stf_gas_cfc11, &
131138
stf_gas_cfc12
132139

140+
real, dimension(:,:,:,:), pointer :: &
141+
p_cfc11, &
142+
p_cfc12
143+
133144
end type generic_CFC_type
134145

135146
type(generic_CFC_type) :: cfc
@@ -144,8 +155,6 @@ subroutine generic_CFC_register(tracer_list)
144155
!Specify all prognostic and diagnostic tracers of this modules.
145156
call user_add_tracers(tracer_list)
146157

147-
148-
149158
end subroutine generic_CFC_register
150159

151160
! <SUBROUTINE NAME="generic_CFC_init">
@@ -175,7 +184,7 @@ subroutine generic_CFC_init(tracer_list)
175184
call user_add_params
176185

177186
!Allocate and initiate all the private work arrays used by this module.
178-
! call user_allocate_arrays !None for CFC module currently
187+
call user_allocate_arrays
179188

180189
end subroutine generic_CFC_init
181190

@@ -214,14 +223,33 @@ subroutine generic_CFC_register_diag(diag_list)
214223
init_time, vardesc_temp%longname,vardesc_temp%units, missing_value = missing_value1, &
215224
standard_name="surface_downward_mole_flux_of_cfc12")
216225

226+
vardesc_temp = vardesc("wc_vert_int_cfc11","Total CFC11 vertical integral",'h','1','s','mol m-2','f')
227+
cfc%id_wc_vert_int_cfc11 = register_diag_field(package_name, vardesc_temp%name, axes(1:2),&
228+
init_time, vardesc_temp%longname,vardesc_temp%units, missing_value = missing_value1)
229+
230+
vardesc_temp = vardesc("wc_vert_int_cfc12","Total CFC12 vertical integral",'h','1','s','mol m-2','f')
231+
cfc%id_wc_vert_int_cfc12 = register_diag_field(package_name, vardesc_temp%name, axes(1:2),&
232+
init_time, vardesc_temp%longname,vardesc_temp%units, missing_value = missing_value1)
233+
217234
end subroutine generic_CFC_register_diag
218235

219236

220237
subroutine user_allocate_arrays
221-
!Allocate all the private arrays.
222-
!None for CFC module currently
238+
integer :: isc,iec,jsc,jec,isd,ied,jsd,jed,nk,ntau,n
239+
call g_tracer_get_common(isc,iec,jsc,jec,isd,ied,jsd,jed,nk,ntau)
240+
241+
allocate(cfc%wc_vert_int_cfc11(isd:ied, jsd:jed)) ; cfc%wc_vert_int_cfc11=0.0
242+
allocate(cfc%wc_vert_int_cfc12(isd:ied, jsd:jed)) ; cfc%wc_vert_int_cfc12=0.0
243+
223244
end subroutine user_allocate_arrays
224245

246+
subroutine user_deallocate_arrays
247+
248+
deallocate(cfc%wc_vert_int_cfc11)
249+
deallocate(cfc%wc_vert_int_cfc12)
250+
251+
end subroutine user_deallocate_arrays
252+
225253
!
226254
! This is an internal sub, not a public interface.
227255
! Add all the parameters to be used in this module.
@@ -330,8 +358,6 @@ subroutine user_add_params
330358
!Block Ends: g_tracer_add_param
331359
!===========
332360

333-
334-
335361
end subroutine user_add_params
336362

337363
!
@@ -407,7 +433,6 @@ subroutine user_add_tracers(tracer_list)
407433
diag_field_units = 'mol m-3', &
408434
diag_field_scaling_factor = 1035.0) ! rho = 1035.0 kg/m3, converts mol/kg to mol/m3
409435

410-
411436
end subroutine user_add_tracers
412437

413438
! <SUBROUTINE NAME="generic_CFC_update_from_coupler">
@@ -456,6 +481,7 @@ subroutine generic_CFC_update_from_source(tracer_list,rho_dzt,dzt,hblt_depth,&
456481

457482
character(len=fm_string_len), parameter :: sub_name = 'generic_SF6_update_from_source'
458483
integer :: isc,iec, jsc,jec,isd,ied,jsd,jed,nk,ntau
484+
integer :: i, j, k
459485
real, dimension(:,:,:) ,pointer :: grid_tmask
460486
integer, dimension(:,:),pointer :: mask_coast, grid_kmt
461487

@@ -467,6 +493,20 @@ subroutine generic_CFC_update_from_source(tracer_list,rho_dzt,dzt,hblt_depth,&
467493
call g_tracer_get_pointer(tracer_list,'cfc11','stf_gas',cfc%stf_gas_cfc11)
468494
call g_tracer_get_pointer(tracer_list,'cfc12','stf_gas',cfc%stf_gas_cfc12)
469495

496+
call g_tracer_get_pointer(tracer_list,'cfc11','field', cfc%p_cfc11)
497+
call g_tracer_get_pointer(tracer_list,'cfc12','field', cfc%p_cfc12)
498+
499+
!-- calculate water column vertical integrals
500+
do j = jsc, jec ; do i = isc, iec !{
501+
cfc%wc_vert_int_cfc11(i,j) = 0.0
502+
cfc%wc_vert_int_cfc12(i,j) = 0.0
503+
enddo; enddo !} i,j
504+
505+
do j = jsc, jec ; do i = isc, iec ; do k = 1, nk !{
506+
cfc%wc_vert_int_cfc11(i,j) = cfc%wc_vert_int_cfc11(i,j) + (cfc%p_cfc11(i,j,k,tau) * rho_dzt(i,j,k))
507+
cfc%wc_vert_int_cfc12(i,j) = cfc%wc_vert_int_cfc12(i,j) + (cfc%p_cfc12(i,j,k,tau) * rho_dzt(i,j,k))
508+
enddo; enddo; enddo !} i,j,k
509+
470510
if (cfc%id_fgcfc11 .gt. 0) &
471511
used = g_send_data(cfc%id_fgcfc11, cfc%stf_gas_cfc11, &
472512
model_time, rmask = grid_tmask(:,:,1),&
@@ -477,6 +517,16 @@ subroutine generic_CFC_update_from_source(tracer_list,rho_dzt,dzt,hblt_depth,&
477517
model_time, rmask = grid_tmask(:,:,1),&
478518
is_in=isc, js_in=jsc, ie_in=iec, je_in=jec)
479519

520+
if (cfc%id_wc_vert_int_cfc11 .gt. 0) &
521+
used = g_send_data(cfc%id_wc_vert_int_cfc11, cfc%wc_vert_int_cfc11, &
522+
model_time, rmask = grid_tmask(:,:,1),&
523+
is_in=isc, js_in=jsc, ie_in=iec, je_in=jec)
524+
525+
if (cfc%id_wc_vert_int_cfc12 .gt. 0) &
526+
used = g_send_data(cfc%id_wc_vert_int_cfc12, cfc%wc_vert_int_cfc12, &
527+
model_time, rmask = grid_tmask(:,:,1),&
528+
is_in=isc, js_in=jsc, ie_in=iec, je_in=jec)
529+
480530
return
481531
end subroutine generic_CFC_update_from_source
482532

@@ -655,6 +705,8 @@ end subroutine generic_CFC_set_boundary_values
655705
subroutine generic_CFC_end
656706
character(len=fm_string_len), parameter :: sub_name = 'generic_CFC_end'
657707

708+
call user_deallocate_arrays
709+
658710
end subroutine generic_CFC_end
659711

660712

generic_tracers/generic_SF6.F90

Lines changed: 46 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -108,10 +108,18 @@ module generic_SF6
108108

109109
type generic_SF6_type
110110
integer :: &
111-
id_fgsf6 = -1
111+
id_fgsf6 = -1, &
112+
id_wc_vert_int_sf6 = -1
113+
114+
real, dimension(:,:), ALLOCATABLE :: &
115+
wc_vert_int_sf6
116+
112117
real, dimension (:,:), pointer :: &
113118
stf_gas_sf6
114119

120+
real, dimension(:,:,:,:), pointer :: &
121+
p_sf6
122+
115123
end type generic_SF6_type
116124

117125
type(generic_SF6_type) :: sf6
@@ -157,7 +165,7 @@ subroutine generic_SF6_init(tracer_list)
157165
call user_add_params
158166

159167
!Allocate and initiate all the private work arrays used by this module.
160-
! call user_allocate_arrays !None for SF6 module currently
168+
call user_allocate_arrays !None for SF6 module currently
161169

162170
end subroutine generic_SF6_init
163171

@@ -192,14 +200,27 @@ subroutine generic_SF6_register_diag(diag_list)
192200
init_time, vardesc_temp%longname,vardesc_temp%units, missing_value = missing_value1, &
193201
standard_name="surface_downward_mole_flux_of_sf6")
194202

203+
vardesc_temp = vardesc("wc_vert_int_sf6","Total SF6 vertical integral",'h','1','s','mol m-2','f')
204+
sf6%id_wc_vert_int_sf6 = register_diag_field(package_name, vardesc_temp%name, axes(1:2),&
205+
init_time, vardesc_temp%longname,vardesc_temp%units, missing_value = missing_value1)
206+
195207
end subroutine generic_SF6_register_diag
196208

197209

198210
subroutine user_allocate_arrays
199-
!Allocate all the private arrays.
200-
!None for SF6 module currently
211+
integer :: isc,iec,jsc,jec,isd,ied,jsd,jed,nk,ntau,n
212+
call g_tracer_get_common(isc,iec,jsc,jec,isd,ied,jsd,jed,nk,ntau)
213+
214+
allocate(sf6%wc_vert_int_sf6(isd:ied, jsd:jed)) ; sf6%wc_vert_int_sf6=0.0
215+
201216
end subroutine user_allocate_arrays
202217

218+
subroutine user_deallocate_arrays
219+
220+
deallocate(sf6%wc_vert_int_sf6)
221+
222+
end subroutine user_deallocate_arrays
223+
203224
!
204225
! This is an internal sub, not a public interface.
205226
! Add all the parameters to be used in this module.
@@ -387,6 +408,7 @@ subroutine generic_SF6_update_from_source(tracer_list,rho_dzt,dzt,hblt_depth,&
387408

388409
character(len=fm_string_len), parameter :: sub_name = 'generic_SF6_update_from_source'
389410
integer :: isc,iec, jsc,jec,isd,ied,jsd,jed,nk,ntau
411+
integer :: i,j,k
390412
real, dimension(:,:,:) ,pointer :: grid_tmask
391413
integer, dimension(:,:),pointer :: mask_coast, grid_kmt
392414

@@ -395,13 +417,28 @@ subroutine generic_SF6_update_from_source(tracer_list,rho_dzt,dzt,hblt_depth,&
395417
call g_tracer_get_common(isc,iec,jsc,jec,isd,ied,jsd,jed,nk,ntau,&
396418
grid_tmask=grid_tmask,grid_mask_coast=mask_coast,grid_kmt=grid_kmt)
397419

398-
call g_tracer_get_pointer(tracer_list,'sf6','stf_gas',sf6%stf_gas_sf6)
399-
420+
call g_tracer_get_pointer(tracer_list,'sf6', 'stf_gas', sf6%stf_gas_sf6)
421+
call g_tracer_get_pointer(tracer_list,'sf6', 'field', sf6%p_sf6)
422+
423+
!-- calculate water column vertical integrals
424+
do j = jsc, jec ; do i = isc, iec !{
425+
sf6%wc_vert_int_sf6(i,j) = 0.0
426+
enddo; enddo !} i,j
427+
428+
do j = jsc, jec ; do i = isc, iec ; do k = 1, nk !{
429+
sf6%wc_vert_int_sf6(i,j) = sf6%wc_vert_int_sf6(i,j) + (sf6%p_sf6(i,j,k,tau) * rho_dzt(i,j,k))
430+
enddo; enddo; enddo !} i,j,k
431+
400432
if (sf6%id_fgsf6 .gt. 0) &
401433
used = g_send_data(sf6%id_fgsf6, sf6%stf_gas_sf6, &
402434
model_time, rmask = grid_tmask(:,:,1),&
403435
is_in=isc, js_in=jsc, ie_in=iec, je_in=jec)
404436

437+
if (sf6%id_wc_vert_int_sf6 .gt. 0) &
438+
used = g_send_data(sf6%id_wc_vert_int_sf6, sf6%wc_vert_int_sf6, &
439+
model_time, rmask = grid_tmask(:,:,1),&
440+
is_in=isc, js_in=jsc, ie_in=iec, je_in=jec)
441+
405442
return
406443
end subroutine generic_SF6_update_from_source
407444

@@ -468,6 +505,7 @@ subroutine generic_SF6_set_boundary_values(tracer_list,ST,SSS,rho,ilb,jlb,taum1)
468505
allocate(g_sf6_csurf(isd:ied, jsd:jed)); g_sf6_csurf=0.0
469506
allocate(sc_no(isd:ied, jsd:jed))
470507

508+
471509
!The atmospheric code needs soluabilities in units of mol/m3/atm
472510
!
473511
!MOM
@@ -550,6 +588,8 @@ end subroutine generic_SF6_set_boundary_values
550588
subroutine generic_SF6_end
551589
character(len=fm_string_len), parameter :: sub_name = 'generic_SF6_end'
552590

591+
call user_deallocate_arrays
592+
553593
end subroutine generic_SF6_end
554594

555595

0 commit comments

Comments
 (0)