Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
MODULE trcais
!!======================================================================
!! *** MODULE trcais ***
!! Module for passive tracers in Antarctic ice sheet
!! delivered by iceberg and ice shelf freshwater fluxes
!!======================================================================
!! History : 1.0 ! 2020 (R. Person, O. Aumont, C. Ethe),
!!======================================================================
#if defined key_top
!!----------------------------------------------------------------------
!! 'key_top' TOP model
!!----------------------------------------------------------------------
!! trc_ais : external source of tracers from Antarctic ice sheet
!!----------------------------------------------------------------------
USE par_trc ! passive tracers parameters
USE oce_trc ! shared variables between ocean and passive tracers
USE trc ! passive tracers common variables
USE iom ! I/O manager
USE lib_mpp ! MPP library
USE sbc_oce !
USE isf_oce ! ice shelf melting contribution
USE sbcrnf ! iceberg freshwater flux
USE trcnam ! Namelist read
USE prtctl ! Print control
IMPLICIT NONE
PRIVATE
PUBLIC trc_ais ! called in trcstp.F90 or within TOP modules
PUBLIC trc_ais_ini ! called in trcini.F90
INTEGER , SAVE, PUBLIC :: nb_trcais ! number of tracers in AIS
REAL(wp) , SAVE, PUBLIC :: rn_icbdep ! mean underwater depth of iceberg (in meters)
INTEGER , SAVE, PUBLIC :: icblev ! mean underwater depth of iceberg (in level depth)
INTEGER , SAVE, PUBLIC, ALLOCATABLE, DIMENSION(:) :: n_trc_indais ! index of tracer with AIS freswater flux
REAL(wp) , SAVE, PUBLIC, ALLOCATABLE, DIMENSION(:) :: rf_trafac ! multiplicative factor for AIS tracer values
!! * Substitutions
# include "do_loop_substitute.h90"
# include "domzgr_substitute.h90"
!!----------------------------------------------------------------------
!! NEMO/TOP 4.0 , NEMO Consortium (2018)
!! Software governed by the CeCILL license (see ./LICENSE)
!!----------------------------------------------------------------------
CONTAINS
SUBROUTINE trc_ais_ini
!!---------------------------------------------------------------------
!! *** ROUTINE trc_ais_ini ***
!!
!! ** Purpose : Initialization of passive tracers from the Antartic
!! Ice Sheet delivered by iceberg and ice shelf
!! freshwater flux
!!
!! ** Method : - Read namtsd namelist
!!
!!---------------------------------------------------------------------
INTEGER :: jl, jn, jk ! dummy loop indices
INTEGER :: ierr0, ierr1, ierr2, ierr3 ! temporary integers
INTEGER :: ios ! Local integer output status for namelist read
REAL(wp) , DIMENSION(jpmaxtrc) :: rn_trafac ! multiplicative factor for tracer values
!!
NAMELIST/namtrc_ais/ nn_ais_tr, rn_trafac, rn_icbdep
!!----------------------------------------------------------------------
!
IF( lwp ) THEN
WRITE(numout,*)
WRITE(numout,*) 'trc_ais_ini : Antarctic ice sheet tracer initialization'
WRITE(numout,*) '~~~~~~~~~~~~'
ENDIF
!
IF( .NOT. ln_rnf_icb ) THEN
CALL ctl_stop( 'trc_ais_ini: no iceberg freswater flux in runoff file' ) ; RETURN
ENDIF
!
! Compute the number of tracers to be initialised in iceberg and ice
! shelf freshwater flux
ALLOCATE( n_trc_indais(jptra), STAT=ierr0 )
IF( ierr0 > 0 ) THEN
CALL ctl_stop( 'trc_ais_ini: unable to allocate n_trc_indais' ) ; RETURN
ENDIF
nb_trcais = 0
n_trc_indais(:) = 0
!
! Read Antarctic Ice Sheet Namelist
READ ( numnat_ref, namtrc_ais, IOSTAT = ios, ERR = 901)
901 IF( ios /= 0 ) CALL ctl_nam ( ios , 'namtrc_ais in reference namelist' )
READ ( numnat_cfg, namtrc_ais, IOSTAT = ios, ERR = 902 )
902 IF( ios > 0 ) CALL ctl_nam ( ios , 'namtrc_ais in configuration namelist' )
IF(lwm) WRITE ( numont, namtrc_ais )
!
IF( lwp ) THEN
WRITE(numout,*) ' '
WRITE(numout,*) ' Namelist : namtrc_ais'
WRITE(numout,*) ' Antarctic Ice Sheet tracers option (nn_ais_tr) : ', nn_ais_tr
ENDIF
! compose AIS data indexes
DO jn = 1, jptra
IF( ln_trc_ais(jn) ) THEN
nb_trcais = nb_trcais + 1 ; n_trc_indais(jn) = nb_trcais
ENDIF
END DO
! Print summmary of Antarctic Ice Sheet tracers supply
IF( lwp ) THEN
WRITE(numout,*)
WRITE(numout,'(a,i3)') ' Total tracers to be initialized with AIS freshwater fluxes:', nb_trcais
ENDIF
!
IF( nb_trcais > 0 ) THEN
ALLOCATE( rf_trafac(nb_trcais), STAT=ierr0 )
DO jn = 1, jptra
IF( ln_trc_ais(jn) ) THEN
jl = n_trc_indais(jn)
rf_trafac(jl) = rn_trafac(jn)
IF(lwp) WRITE(numout, 9001) jn, ctrcnm(jn), 'AIS', rn_trafac(jn), rf_trafac(jl)
ENDIF
END DO
ENDIF
9001 FORMAT(2x,i5, 8x, a15, 3x, a3, 5x, e11.3, 5x, e11.3)
!
icblev = 1 ! compute last level where depth less than rn_icbdep (120 m)
DO jk = jpkm1, 1, -1
IF( gdept_1d(jk) > rn_icbdep ) icblev = jk - 1
END DO
IF(lwp) WRITE(numout,*)
IF(lwp) WRITE(numout,*) ' Level corresponding to iceberg depth ', icblev,' ', gdept_1d(icblev+1)
!
END SUBROUTINE trc_ais_ini
SUBROUTINE trc_ais(kt, Kmm, ptr, Krhs)
!!----------------------------------------------------------------------
!! *** ROUTINE trc_ais ***
!!
!! ** Purpose : Apply Antarctic Ice Sheet inputs to tracers
!!
!! ** Method : Read freswater flux from iceberg and ice shelf
!! and update data
!!
!!----------------------------------------------------------------------
!!
INTEGER , INTENT(in) :: kt ! ocean time-step index
INTEGER , INTENT(in) :: Kmm, Krhs ! time level indices
REAL(wp), DIMENSION(jpi,jpj,jpk,jptra,jpt), INTENT(inout) :: ptr ! passive tracers and RHS of tracer equation
!!
INTEGER :: ji, jj, jk, jn, jl ! Loop index
INTEGER :: ikt, ikb ! top and bottom level of the tbl
CHARACTER (len=22) :: charout
REAL(wp) :: zfact, zcalv, zfrac
!!---------------------------------------------------------------------
!
IF( ln_timing ) CALL timing_start('trc_ais')
IF( kt == nit000 .AND. lwp) THEN
WRITE(numout,*)
WRITE(numout,*) 'trc_ais : passive tracers from Antarctic Ice Sheet'
WRITE(numout,*) '~~~~~~~ '
ENDIF
! 0. initialization
SELECT CASE ( nn_ais_tr )
CASE ( 0 ) ! No tracers in Antarctic Ice Sheet (null concentration in AIS)
!
! Iceberg freshwater dilution for tracers with absent iceberg load
IF( ln_rnf_icb ) THEN
DO jn = 1, jptra
IF( ln_trc_ais(jn) ) THEN
jl = n_trc_indais(jn)
DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
zfact = 1. / e3t(ji,jj,1,Kmm)
ptr(ji,jj,jk,jn,Krhs) = ptr(ji,jj,1,jn,Krhs) + fwficb(ji,jj) * r1_rho0 * ptr(ji,jj,1,jn,Kmm) * zfact
END_2D
END IF
END DO
END IF
! Ice shelf freshwater dilution for tracers with absent ice shelf load
IF( ln_isf ) THEN
DO jn = 1, jptra
IF( ln_trc_ais(jn) ) THEN
jl = n_trc_indais(jn)
DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
IF( ln_isfpar_mlt ) THEN
zcalv = fwfisf_par(ji,jj) * r1_rho0 / rhisf_tbl_par(ji,jj)
ikt = misfkt_par(ji,jj)
ikb = misfkb_par(ji,jj)
zfrac = rfrac_tbl_par(ji,jj)
END IF
IF( ln_isfcav_mlt ) THEN
zcalv = fwfisf_cav(ji,jj) * r1_rho0 / rhisf_tbl_cav(ji,jj)
ikt = misfkt_cav(ji,jj)
ikb = misfkb_cav(ji,jj)
zfrac = rfrac_tbl_cav(ji,jj)
END IF
! level fully include in the ice shelf boundary layer
DO jk = ikt, ikb - 1
ptr(ji,jj,jk,jn,Krhs) = ptr(ji,jj,jk,jn,Krhs) + zcalv * ptr(ji,jj,jk,jn,Kmm)
END DO
! level partially include in ice shelf boundary layer
ptr(ji,jj,ikb,jn,Krhs) = ptr(ji,jj,ikb,jn,Krhs) + zcalv * ptr(ji,jj,ikb,jn,Kmm) * zfrac
END_2D
ENDIF
END DO
END IF
!
CASE ( 1 ) ! Specific treatment with an imposed concentration in AIS
!
! source of bgc tracers from iceberg in Southern Ocean
! distributed along the water column until 120 m depth (Person et al., 2019)
IF( ln_rnf_icb ) THEN
DO jn = 1, jptra
IF( ln_trc_ais(jn) ) THEN
jl = n_trc_indais(jn)
DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
DO jk = 1, icblev
zcalv = fwficb(ji,jj) * r1_rho0
ptr(ji,jj,jk,jn,Krhs) = ptr(ji,jj,jk,jn,Krhs) + rf_trafac(jl) * zcalv / gdepw(ji,jj,icblev+1,Kmm)
END DO
END_2D
END IF
END DO
END IF
! source of bgc tracers from ice shelf in the Southern Ocean
! with tbl treated as in Mathiot et al. (2017)
IF( ln_isf ) THEN
DO jn = 1, jptra
IF( ln_trc_ais(jn) ) THEN
jl = n_trc_indais(jn)
DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
IF( ln_isfpar_mlt ) THEN
zcalv = - fwfisf_par(ji,jj) * r1_rho0 / rhisf_tbl_par(ji,jj)
ikt = misfkt_par(ji,jj)
ikb = misfkb_par(ji,jj)
zfrac = rfrac_tbl_par(ji,jj)
END IF
IF( ln_isfcav_mlt ) THEN
zcalv = - fwfisf_cav(ji,jj) * r1_rho0 / rhisf_tbl_cav(ji,jj)
ikt = misfkt_cav(ji,jj)
ikb = misfkb_cav(ji,jj)
zfrac = rfrac_tbl_cav(ji,jj)
END IF
! level fully include in the ice shelf boundary layer
DO jk = ikt, ikb - 1
ptr(ji,jj,jk,jn,Krhs) = ptr(ji,jj,jk,jn,Krhs) + rf_trafac(jl) * zcalv
END DO
! level partially include in ice shelf boundary layer
ptr(ji,jj,ikb,jn,Krhs) = ptr(ji,jj,ikb,jn,Krhs) + rf_trafac(jl) * zcalv * zfrac
END_2D
ENDIF
END DO
END IF
END SELECT
!
IF( ln_timing ) CALL timing_stop('trc_ais')
!
! for debugging
! IF( sn_cfctl%l_prttrc ) THEN ! print mean trends (used for debugging)
! WRITE(charout, FMT="('ais ')")
! CALL prt_ctl_trc_info(charout)
! CALL prt_ctl_trc( tab4d=ptr(:,:,:,:,Krhs), mask=tmask, clinfo=ctrcnm, clinfo2='trd' )
! ENDIF
!
END SUBROUTINE trc_ais
#else
!!----------------------------------------------------------------------
!! Dummy module NO 3D passive tracer data
!!----------------------------------------------------------------------
CONTAINS
SUBROUTINE trc_ais_ini ! Empty routine
END SUBROUTINE trc_ais_ini
SUBROUTINE trc_ais( kt, Kmm, Krhs ) ! Empty routine
INTEGER, INTENT(in) :: kt, Kmm, Krhs ! time level indices
WRITE(*,*) 'trc_ais: You should not have seen this print! error?', kt, Kmm, Krhs
END SUBROUTINE trc_ais
#endif
!!======================================================================
END MODULE trcais