Skip to content

Commit 69e767e

Browse files
authored
WOMBAT: Fix up dicp and dicr tracers (#38)
* Set dicp stf equal to dic stf * Allow dicr to go negative
1 parent 0b4e8f5 commit 69e767e

File tree

2 files changed

+24
-62
lines changed

2 files changed

+24
-62
lines changed

generic_tracers/generic_WOMBATlite.F90

Lines changed: 12 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -212,7 +212,7 @@ module generic_WOMBATlite
212212
sio2, &
213213
co2_csurf, co2_alpha, co2_sc_no, pco2_csurf, &
214214
o2_csurf, o2_alpha, o2_sc_no, &
215-
no3_vstf, dic_vstf, dicp_vstf, alk_vstf
215+
no3_vstf, dic_vstf, alk_vstf
216216

217217
real, dimension(:,:,:), allocatable :: &
218218
htotal, &
@@ -276,7 +276,6 @@ module generic_WOMBATlite
276276
real, dimension(:,:,:), allocatable :: &
277277
f_dic, &
278278
f_dicr, &
279-
f_dicp, &
280279
f_alk, &
281280
f_no3, &
282281
f_phy, &
@@ -357,7 +356,6 @@ module generic_WOMBATlite
357356
real, dimension(:,:), pointer :: &
358357
p_no3_stf, &
359358
p_dic_stf, &
360-
p_dicp_stf, &
361359
p_alk_stf
362360

363361
!-----------------------------------------------------------------------
@@ -1682,18 +1680,14 @@ subroutine user_add_tracers(tracer_list)
16821680
flux_virtual = .true.)
16831681

16841682
! DICp (preformed Dissolved inorganic carbon)
1683+
! dts: Note, we use flux_virtual=.true. only to ensure that an stf array is allocated for dicp.
1684+
! The dicp stf is set to equal the dic stf in update_from_coupler.
16851685
!-----------------------------------------------------------------------
16861686
call g_tracer_add(tracer_list, package_name, &
16871687
name = 'dicp', &
16881688
longname = 'preformed Dissolved Inorganic Carbon', &
16891689
units = 'mol/kg', &
16901690
prog = .true., &
1691-
flux_gas = .true., &
1692-
flux_gas_name = 'co2_pre_flux', &
1693-
flux_gas_type = 'air_sea_gas_flux_generic', &
1694-
flux_gas_molwt = WTMCO2, &
1695-
flux_gas_param = (/ as_coeff_wombatlite, 9.7561e-06 /), & ! dts: param(2) converts Pa -> atm
1696-
flux_gas_restart_file = 'ocean_wombatlite_airsea_flux.res.nc', &
16971691
flux_virtual = .true.)
16981692

16991693
! DICr (remineralised dissolved inorganic carbon)
@@ -1809,6 +1803,10 @@ subroutine generic_WOMBATlite_update_from_coupler(tracer_list, ilb, jlb, salt_fl
18091803
integer, intent(in) :: ilb, jlb
18101804
real, dimension(ilb:,jlb:), intent(in) :: salt_flux_added
18111805

1806+
integer :: isc, iec, jsc, jec, isd, ied, jsd, jed, nk, ntau
1807+
1808+
call g_tracer_get_common(isc, iec, jsc, jec, isd, ied, jsd, jed, nk, ntau)
1809+
18121810
! Account for virtual fluxes due to salt flux restoring/correction
18131811
!-----------------------------------------------------------------------
18141812
call g_tracer_get_pointer(tracer_list, 'no3', 'stf', wombat%p_no3_stf)
@@ -1819,14 +1817,13 @@ subroutine generic_WOMBATlite_update_from_coupler(tracer_list, ilb, jlb, salt_fl
18191817
wombat%dic_vstf(:,:) = (wombat%dic_global / wombat%sal_global) * salt_flux_added(:,:) ! [mol/m2/s]
18201818
wombat%p_dic_stf(:,:) = wombat%p_dic_stf(:,:) + wombat%dic_vstf(:,:) ! [mol/m2/s]
18211819

1822-
call g_tracer_get_pointer(tracer_list, 'dicp', 'stf', wombat%p_dicp_stf)
1823-
wombat%dicp_vstf(:,:) = (wombat%dic_global / wombat%sal_global) * salt_flux_added(:,:) ! [mol/m2/s]
1824-
wombat%p_dicp_stf(:,:) = wombat%p_dicp_stf(:,:) + wombat%dicp_vstf(:,:) ! [mol/m2/s]
1825-
18261820
call g_tracer_get_pointer(tracer_list, 'alk', 'stf', wombat%p_alk_stf)
18271821
wombat%alk_vstf(:,:) = (wombat%alk_global / wombat%sal_global) * salt_flux_added(:,:) ! [mol/m2/s]
18281822
wombat%p_alk_stf(:,:) = wombat%p_alk_stf(:,:) + wombat%alk_vstf(:,:) ! [mol/m2/s]
18291823

1824+
! Set dicp stf equal to dic stf
1825+
call g_tracer_set_values(tracer_list, 'dicp', 'stf', wombat%p_dic_stf, isd, jsd)
1826+
18301827
end subroutine generic_WOMBATlite_update_from_coupler
18311828

18321829
!#######################################################################
@@ -2183,8 +2180,6 @@ subroutine generic_WOMBATlite_update_from_source(tracer_list, Temp, Salt, &
21832180

21842181
call g_tracer_set_values(tracer_list, 'dic', 'alpha', wombat%co2_alpha, isd, jsd)
21852182
call g_tracer_set_values(tracer_list, 'dic', 'csurf', wombat%co2_csurf, isd, jsd)
2186-
call g_tracer_set_values(tracer_list, 'dicp', 'alpha', wombat%co2_alpha, isd, jsd)
2187-
call g_tracer_set_values(tracer_list, 'dicp', 'csurf', wombat%co2_csurf, isd, jsd)
21882183

21892184
wombat%co2_star(:,:,1) = wombat%co2_csurf(:,:)
21902185

@@ -2344,10 +2339,7 @@ subroutine generic_WOMBATlite_update_from_source(tracer_list, Temp, Salt, &
23442339
positive=.true.) ! [mol/kg]
23452340
call g_tracer_get_values(tracer_list, 'dic', 'field', wombat%f_dic, isd, jsd, ntau=tau, &
23462341
positive=.true.) ! [mol/kg]
2347-
call g_tracer_get_values(tracer_list, 'dicr', 'field', wombat%f_dicr, isd, jsd, ntau=tau, &
2348-
positive=.true.) ! [mol/kg]
2349-
call g_tracer_get_values(tracer_list, 'dicp', 'field', wombat%f_dicp, isd, jsd, ntau=tau, &
2350-
positive=.true.) ! [mol/kg]
2342+
call g_tracer_get_values(tracer_list, 'dicr', 'field', wombat%f_dicr, isd, jsd, ntau=tau) ! [mol/kg]
23512343
call g_tracer_get_values(tracer_list, 'alk', 'field', wombat%f_alk, isd, jsd, ntau=tau, &
23522344
positive=.true.) ! [mol/kg]
23532345

@@ -3131,7 +3123,6 @@ subroutine generic_WOMBATlite_update_from_source(tracer_list, Temp, Salt, &
31313123
- wombat%f_dic(i,j,k) ) * grid_tmask(i,j,k)
31323124
wombat%f_alk(i,j,k) = wombat%f_alk(i,j,k) + wombat%alk_correct(i,j,k)
31333125
wombat%f_dic(i,j,k) = wombat%f_dic(i,j,k) + wombat%dic_correct(i,j,k)
3134-
wombat%f_dicp(i,j,k) = max(wombat%dic_min * mmol_m3_to_mol_kg, wombat%f_dic(i,j,k))
31353126
enddo
31363127
enddo; enddo
31373128

@@ -3320,7 +3311,7 @@ subroutine generic_WOMBATlite_update_from_source(tracer_list, Temp, Salt, &
33203311
rmask=grid_tmask(:,:,1), is_in=isc, js_in=jsc, ie_in=iec, je_in=jec)
33213312

33223313
if (wombat%id_dicp_vstf .gt. 0) &
3323-
used = g_send_data(wombat%id_dicp_vstf, wombat%dicp_vstf, model_time, &
3314+
used = g_send_data(wombat%id_dicp_vstf, wombat%dic_vstf, model_time, &
33243315
rmask=grid_tmask(:,:,1), is_in=isc, js_in=jsc, ie_in=iec, je_in=jec)
33253316

33263317
if (wombat%id_alk_vstf .gt. 0) &
@@ -3792,8 +3783,6 @@ subroutine generic_WOMBATlite_set_boundary_values(tracer_list, SST, SSS, rho, il
37923783

37933784
call g_tracer_set_values(tracer_list, 'dic', 'alpha', wombat%co2_alpha, isd, jsd)
37943785
call g_tracer_set_values(tracer_list, 'dic', 'csurf', wombat%co2_csurf, isd, jsd)
3795-
call g_tracer_set_values(tracer_list, 'dicp', 'alpha', wombat%co2_alpha, isd, jsd)
3796-
call g_tracer_set_values(tracer_list, 'dicp', 'csurf', wombat%co2_csurf, isd, jsd)
37973786

37983787
! nnz: If source is called uncomment the following
37993788
wombat%init = .false. !nnz: This is necessary since the above calls appear in source subroutine too.
@@ -3821,10 +3810,6 @@ subroutine generic_WOMBATlite_set_boundary_values(tracer_list, SST, SSS, rho, il
38213810
call g_tracer_set_values(tracer_list, 'dic', 'csurf', wombat%co2_csurf, isd, jsd)
38223811
call g_tracer_set_values(tracer_list, 'dic', 'sc_no', wombat%co2_sc_no, isd, jsd)
38233812

3824-
call g_tracer_set_values(tracer_list, 'dicp', 'alpha', wombat%co2_alpha, isd, jsd)
3825-
call g_tracer_set_values(tracer_list, 'dicp', 'csurf', wombat%co2_csurf, isd, jsd)
3826-
call g_tracer_set_values(tracer_list, 'dicp', 'sc_no', wombat%co2_sc_no, isd, jsd)
3827-
38283813
call g_tracer_get_values(tracer_list, 'o2', 'alpha', wombat%o2_alpha, isd, jsd)
38293814
call g_tracer_get_values(tracer_list, 'o2', 'csurf', wombat%o2_csurf ,isd, jsd)
38303815

@@ -3942,11 +3927,9 @@ subroutine user_allocate_arrays
39423927
allocate(wombat%o2_sc_no(isd:ied, jsd:jed)); wombat%o2_sc_no(:,:)=0.0
39433928
allocate(wombat%no3_vstf(isd:ied, jsd:jed)); wombat%no3_vstf(:,:)=0.0
39443929
allocate(wombat%dic_vstf(isd:ied, jsd:jed)); wombat%dic_vstf(:,:)=0.0
3945-
allocate(wombat%dicp_vstf(isd:ied, jsd:jed)); wombat%dicp_vstf(:,:)=0.0
39463930
allocate(wombat%alk_vstf(isd:ied, jsd:jed)); wombat%alk_vstf(:,:)=0.0
39473931

39483932
allocate(wombat%f_dic(isd:ied, jsd:jed, 1:nk)); wombat%f_dic(:,:,:)=0.0
3949-
allocate(wombat%f_dicp(isd:ied, jsd:jed, 1:nk)); wombat%f_dicp(:,:,:)=0.0
39503933
allocate(wombat%f_dicr(isd:ied, jsd:jed, 1:nk)); wombat%f_dicr(:,:,:)=0.0
39513934
allocate(wombat%f_alk(isd:ied, jsd:jed, 1:nk)); wombat%f_alk(:,:,:)=0.0
39523935
allocate(wombat%f_no3(isd:ied, jsd:jed, 1:nk)); wombat%f_no3(:,:,:)=0.0
@@ -4088,12 +4071,10 @@ subroutine user_deallocate_arrays
40884071
wombat%o2_sc_no, &
40894072
wombat%no3_vstf, &
40904073
wombat%dic_vstf, &
4091-
wombat%dicp_vstf, &
40924074
wombat%alk_vstf)
40934075

40944076
deallocate( &
40954077
wombat%f_dic, &
4096-
wombat%f_dicp, &
40974078
wombat%f_dicr, &
40984079
wombat%f_alk, &
40994080
wombat%f_no3, &

generic_tracers/generic_WOMBATmid.F90

Lines changed: 12 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -240,7 +240,7 @@ module generic_WOMBATmid
240240
sio2, &
241241
co2_csurf, co2_alpha, co2_sc_no, pco2_csurf, &
242242
o2_csurf, o2_alpha, o2_sc_no, &
243-
no3_vstf, dic_vstf, dicp_vstf, alk_vstf
243+
no3_vstf, dic_vstf, alk_vstf
244244

245245
real, dimension(:,:,:), allocatable :: &
246246
htotal, &
@@ -303,7 +303,6 @@ module generic_WOMBATmid
303303
real, dimension(:,:,:), allocatable :: &
304304
f_dic, &
305305
f_dicr, &
306-
f_dicp, &
307306
f_alk, &
308307
f_no3, &
309308
f_phy, &
@@ -424,7 +423,6 @@ module generic_WOMBATmid
424423
real, dimension(:,:), pointer :: &
425424
p_no3_stf, &
426425
p_dic_stf, &
427-
p_dicp_stf, &
428426
p_alk_stf
429427

430428
!-----------------------------------------------------------------------
@@ -2107,18 +2105,14 @@ subroutine user_add_tracers(tracer_list)
21072105
flux_virtual = .true.)
21082106

21092107
! DICp (preformed Dissolved inorganic carbon)
2108+
! dts: Note, we use flux_virtual=.true. only to ensure that an stf array is allocated for dicp.
2109+
! The dicp stf is set to equal the dic stf in update_from_coupler.
21102110
!-----------------------------------------------------------------------
21112111
call g_tracer_add(tracer_list, package_name, &
21122112
name = 'dicp', &
21132113
longname = 'preformed Dissolved Inorganic Carbon', &
21142114
units = 'mol/kg', &
21152115
prog = .true., &
2116-
flux_gas = .true., &
2117-
flux_gas_name = 'co2_pre_flux', &
2118-
flux_gas_type = 'air_sea_gas_flux_generic', &
2119-
flux_gas_molwt = WTMCO2, &
2120-
flux_gas_param = (/ as_coeff_wombatmid, 9.7561e-06 /), & ! dts: param(2) converts Pa -> atm
2121-
flux_gas_restart_file = 'ocean_wombatmid_airsea_flux.res.nc', &
21222116
flux_virtual = .true.)
21232117

21242118
! DICr (remineralised dissolved inorganic carbon)
@@ -2234,6 +2228,10 @@ subroutine generic_WOMBATmid_update_from_coupler(tracer_list, ilb, jlb, salt_flu
22342228
integer, intent(in) :: ilb, jlb
22352229
real, dimension(ilb:,jlb:), intent(in) :: salt_flux_added
22362230

2231+
integer :: isc, iec, jsc, jec, isd, ied, jsd, jed, nk, ntau
2232+
2233+
call g_tracer_get_common(isc, iec, jsc, jec, isd, ied, jsd, jed, nk, ntau)
2234+
22372235
! Account for virtual fluxes due to salt flux restoring/correction
22382236
!-----------------------------------------------------------------------
22392237
call g_tracer_get_pointer(tracer_list, 'no3', 'stf', wombat%p_no3_stf)
@@ -2244,14 +2242,13 @@ subroutine generic_WOMBATmid_update_from_coupler(tracer_list, ilb, jlb, salt_flu
22442242
wombat%dic_vstf(:,:) = (wombat%dic_global / wombat%sal_global) * salt_flux_added(:,:) ! [mol/m2/s]
22452243
wombat%p_dic_stf(:,:) = wombat%p_dic_stf(:,:) + wombat%dic_vstf(:,:) ! [mol/m2/s]
22462244

2247-
call g_tracer_get_pointer(tracer_list, 'dicp', 'stf', wombat%p_dicp_stf)
2248-
wombat%dicp_vstf(:,:) = (wombat%dic_global / wombat%sal_global) * salt_flux_added(:,:) ! [mol/m2/s]
2249-
wombat%p_dicp_stf(:,:) = wombat%p_dicp_stf(:,:) + wombat%dicp_vstf(:,:) ! [mol/m2/s]
2250-
22512245
call g_tracer_get_pointer(tracer_list, 'alk', 'stf', wombat%p_alk_stf)
22522246
wombat%alk_vstf(:,:) = (wombat%alk_global / wombat%sal_global) * salt_flux_added(:,:) ! [mol/m2/s]
22532247
wombat%p_alk_stf(:,:) = wombat%p_alk_stf(:,:) + wombat%alk_vstf(:,:) ! [mol/m2/s]
22542248

2249+
! Set dicp stf equal to dic stf
2250+
call g_tracer_set_values(tracer_list, 'dicp', 'stf', wombat%p_dic_stf, isd, jsd)
2251+
22552252
end subroutine generic_WOMBATmid_update_from_coupler
22562253

22572254
!#######################################################################
@@ -2617,8 +2614,6 @@ subroutine generic_WOMBATmid_update_from_source(tracer_list, Temp, Salt, &
26172614

26182615
call g_tracer_set_values(tracer_list, 'dic', 'alpha', wombat%co2_alpha, isd, jsd)
26192616
call g_tracer_set_values(tracer_list, 'dic', 'csurf', wombat%co2_csurf, isd, jsd)
2620-
call g_tracer_set_values(tracer_list, 'dicp', 'alpha', wombat%co2_alpha, isd, jsd)
2621-
call g_tracer_set_values(tracer_list, 'dicp', 'csurf', wombat%co2_csurf, isd, jsd)
26222617

26232618
wombat%co2_star(:,:,1) = wombat%co2_csurf(:,:)
26242619

@@ -2822,10 +2817,7 @@ subroutine generic_WOMBATmid_update_from_source(tracer_list, Temp, Salt, &
28222817
positive=.true.) ! [mol/kg]
28232818
call g_tracer_get_values(tracer_list, 'dic', 'field', wombat%f_dic, isd, jsd, ntau=tau, &
28242819
positive=.true.) ! [mol/kg]
2825-
call g_tracer_get_values(tracer_list, 'dicr', 'field', wombat%f_dicr, isd, jsd, ntau=tau, &
2826-
positive=.true.) ! [mol/kg]
2827-
call g_tracer_get_values(tracer_list, 'dicp', 'field', wombat%f_dicp, isd, jsd, ntau=tau, &
2828-
positive=.true.) ! [mol/kg]
2820+
call g_tracer_get_values(tracer_list, 'dicr', 'field', wombat%f_dicr, isd, jsd, ntau=tau) ! [mol/kg]
28292821
call g_tracer_get_values(tracer_list, 'alk', 'field', wombat%f_alk, isd, jsd, ntau=tau, &
28302822
positive=.true.) ! [mol/kg]
28312823

@@ -3899,7 +3891,6 @@ subroutine generic_WOMBATmid_update_from_source(tracer_list, Temp, Salt, &
38993891
- wombat%f_dic(i,j,k) ) * grid_tmask(i,j,k)
39003892
wombat%f_alk(i,j,k) = wombat%f_alk(i,j,k) + wombat%alk_correct(i,j,k)
39013893
wombat%f_dic(i,j,k) = wombat%f_dic(i,j,k) + wombat%dic_correct(i,j,k)
3902-
wombat%f_dicp(i,j,k) = max(wombat%dic_min * mmol_m3_to_mol_kg, wombat%f_dic(i,j,k))
39033894
enddo
39043895
enddo; enddo
39053896

@@ -4093,7 +4084,7 @@ subroutine generic_WOMBATmid_update_from_source(tracer_list, Temp, Salt, &
40934084
rmask=grid_tmask(:,:,1), is_in=isc, js_in=jsc, ie_in=iec, je_in=jec)
40944085

40954086
if (wombat%id_dicp_vstf .gt. 0) &
4096-
used = g_send_data(wombat%id_dicp_vstf, wombat%dicp_vstf, model_time, &
4087+
used = g_send_data(wombat%id_dicp_vstf, wombat%dic_vstf, model_time, &
40974088
rmask=grid_tmask(:,:,1), is_in=isc, js_in=jsc, ie_in=iec, je_in=jec)
40984089

40994090
if (wombat%id_alk_vstf .gt. 0) &
@@ -4701,8 +4692,6 @@ subroutine generic_WOMBATmid_set_boundary_values(tracer_list, SST, SSS, rho, ilb
47014692

47024693
call g_tracer_set_values(tracer_list, 'dic', 'alpha', wombat%co2_alpha, isd, jsd)
47034694
call g_tracer_set_values(tracer_list, 'dic', 'csurf', wombat%co2_csurf, isd, jsd)
4704-
call g_tracer_set_values(tracer_list, 'dicp', 'alpha', wombat%co2_alpha, isd, jsd)
4705-
call g_tracer_set_values(tracer_list, 'dicp', 'csurf', wombat%co2_csurf, isd, jsd)
47064695

47074696
! nnz: If source is called uncomment the following
47084697
wombat%init = .false. !nnz: This is necessary since the above calls appear in source subroutine too.
@@ -4730,10 +4719,6 @@ subroutine generic_WOMBATmid_set_boundary_values(tracer_list, SST, SSS, rho, ilb
47304719
call g_tracer_set_values(tracer_list, 'dic', 'csurf', wombat%co2_csurf, isd, jsd)
47314720
call g_tracer_set_values(tracer_list, 'dic', 'sc_no', wombat%co2_sc_no, isd, jsd)
47324721

4733-
call g_tracer_set_values(tracer_list, 'dicp', 'alpha', wombat%co2_alpha, isd, jsd)
4734-
call g_tracer_set_values(tracer_list, 'dicp', 'csurf', wombat%co2_csurf, isd, jsd)
4735-
call g_tracer_set_values(tracer_list, 'dicp', 'sc_no', wombat%co2_sc_no, isd, jsd)
4736-
47374722
call g_tracer_get_values(tracer_list, 'o2', 'alpha', wombat%o2_alpha, isd, jsd)
47384723
call g_tracer_get_values(tracer_list, 'o2', 'csurf', wombat%o2_csurf ,isd, jsd)
47394724

@@ -4851,11 +4836,9 @@ subroutine user_allocate_arrays
48514836
allocate(wombat%o2_sc_no(isd:ied, jsd:jed)); wombat%o2_sc_no(:,:)=0.0
48524837
allocate(wombat%no3_vstf(isd:ied, jsd:jed)); wombat%no3_vstf(:,:)=0.0
48534838
allocate(wombat%dic_vstf(isd:ied, jsd:jed)); wombat%dic_vstf(:,:)=0.0
4854-
allocate(wombat%dicp_vstf(isd:ied, jsd:jed)); wombat%dicp_vstf(:,:)=0.0
48554839
allocate(wombat%alk_vstf(isd:ied, jsd:jed)); wombat%alk_vstf(:,:)=0.0
48564840

48574841
allocate(wombat%f_dic(isd:ied, jsd:jed, 1:nk)); wombat%f_dic(:,:,:)=0.0
4858-
allocate(wombat%f_dicp(isd:ied, jsd:jed, 1:nk)); wombat%f_dicp(:,:,:)=0.0
48594842
allocate(wombat%f_dicr(isd:ied, jsd:jed, 1:nk)); wombat%f_dicr(:,:,:)=0.0
48604843
allocate(wombat%f_alk(isd:ied, jsd:jed, 1:nk)); wombat%f_alk(:,:,:)=0.0
48614844
allocate(wombat%f_no3(isd:ied, jsd:jed, 1:nk)); wombat%f_no3(:,:,:)=0.0
@@ -5036,12 +5019,10 @@ subroutine user_deallocate_arrays
50365019
wombat%o2_sc_no, &
50375020
wombat%no3_vstf, &
50385021
wombat%dic_vstf, &
5039-
wombat%dicp_vstf, &
50405022
wombat%alk_vstf)
50415023

50425024
deallocate( &
50435025
wombat%f_dic, &
5044-
wombat%f_dicp, &
50455026
wombat%f_dicr, &
50465027
wombat%f_alk, &
50475028
wombat%f_no3, &

0 commit comments

Comments
 (0)