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
MODULE p4zsink
!!======================================================================
!! *** MODULE p4zsink ***
!! TOP : PISCES vertical flux of particulate matter due to
!! gravitational sinking
!! This module is the same for both PISCES and PISCES-QUOTA
!!======================================================================
!! History : 1.0 ! 2004 (O. Aumont) Original code
!! 2.0 ! 2007-12 (C. Ethe, G. Madec) F90
!! 3.4 ! 2011-06 (O. Aumont, C. Ethe) Change aggregation formula
!! 3.5 ! 2012-07 (O. Aumont) Introduce potential time-splitting
!! 4.0 ! 2019 (O. Aumont) an external subroutine is called
!! to compute the impact of sinking
!!----------------------------------------------------------------------
!! p4z_sink : Compute vertical flux of particulate matter due to gravitational sinking
!! p4z_sink_init : Unitialisation of sinking speed parameters
!! p4z_sink_alloc : Allocate sinking speed variables
!!----------------------------------------------------------------------
USE oce_trc ! shared variables between ocean and passive tracers
USE trc ! passive tracers common variables
USE sms_pisces ! PISCES Source Minus Sink variables
USE trcsink ! General routine to compute sedimentation
USE prtctl ! print control for debugging
USE iom ! I/O manager
USE lib_mpp
IMPLICIT NONE
PRIVATE
PUBLIC p4z_sink ! called in p4zbio.F90
PUBLIC p4z_sink_init ! called in trcini_pisces.F90
PUBLIC p4z_sink_alloc ! called in trcini_pisces.F90
REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: sinking, sinking2 !: POC sinking fluxes
! ! (different meanings depending on the parameterization)
REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: sinkingn, sinking2n !: PON sinking fluxes
REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: sinkingp, sinking2p !: POP sinking fluxes
REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: sinkcal, sinksil !: CaCO3 and BSi sinking fluxes
REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: sinkfer !: Small BFe sinking fluxes
REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: sinkfer2 !: Big iron sinking fluxes
INTEGER :: ik100
!! * Substitutions
# include "do_loop_substitute.h90"
# include "domzgr_substitute.h90"
!!----------------------------------------------------------------------
!! NEMO/TOP 4.0 , NEMO Consortium (2018)
!! $Id: p4zsink.F90 15459 2021-10-29 08:19:18Z cetlod $
!! Software governed by the CeCILL license (see ./LICENSE)
!!----------------------------------------------------------------------
CONTAINS
SUBROUTINE p4z_sink ( kt, knt, Kbb, Kmm, Krhs )
!!---------------------------------------------------------------------
!! *** ROUTINE p4z_sink ***
!!
!! ** Purpose : Compute vertical flux of particulate matter due to
!! gravitational sinking.
!!
!! ** Method : - An external advection subroutine is called to compute
!! the impact of sinking on the particles. The tracers
!! concentrations are updated in this subroutine which
!! is mandatory to deal with negative concentrations
!!---------------------------------------------------------------------
INTEGER, INTENT(in) :: kt, knt
INTEGER, INTENT(in) :: Kbb, Kmm, Krhs ! time level indices
INTEGER :: ji, jj, jk
CHARACTER (len=25) :: charout
REAL(wp) :: zmax, zfact
!!---------------------------------------------------------------------
!
IF( ln_timing ) CALL timing_start('p4z_sink')
! Initialization of some global variables
! ---------------------------------------
prodpoc(:,:,:) = 0.
conspoc(:,:,:) = 0.
prodgoc(:,:,:) = 0.
consgoc(:,:,:) = 0.
! Sinking speeds of big detritus is increased with depth as shown
! by data and from the coagulation theory. This is controled by
! wsbio2max and wsbio2scale. If wsbio2max is set to wsbio2, then
! sinking speed is constant with depth.
! CaCO3 and bSi are supposed to sink at the big particles speed
! due to their high density
! ---------------------------------------------------------------
DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1)
zmax = MAX( heup_01(ji,jj), hmld(ji,jj) )
zfact = MAX( 0., gdepw(ji,jj,jk+1,Kmm) - zmax ) / wsbio2scale
wsbio4(ji,jj,jk) = wsbio2 + MAX(0., ( wsbio2max - wsbio2 )) * zfact
END_3D
! Sinking speed of the small particles is always constant
wsbio3(:,:,:) = wsbio
! Initialize to zero all the sinking arrays
! -----------------------------------------
sinking (:,:,:) = 0.e0
sinking2(:,:,:) = 0.e0
sinkcal (:,:,:) = 0.e0
sinkfer (:,:,:) = 0.e0
sinksil (:,:,:) = 0.e0
sinkfer2(:,:,:) = 0.e0
! Compute the sedimentation term using trc_sink for all the sinking particles
! ---------------------------------------------------------------------------
CALL trc_sink( kt, Kbb, Kmm, wsbio3, sinking , jppoc, rfact2 )
CALL trc_sink( kt, Kbb, Kmm, wsbio3, sinkfer , jpsfe, rfact2 )
CALL trc_sink( kt, Kbb, Kmm, wsbio4, sinking2, jpgoc, rfact2 )
CALL trc_sink( kt, Kbb, Kmm, wsbio4, sinkfer2, jpbfe, rfact2 )
CALL trc_sink( kt, Kbb, Kmm, wsbio4, sinksil , jpgsi, rfact2 )
CALL trc_sink( kt, Kbb, Kmm, wsbio4, sinkcal , jpcal, rfact2 )
! PISCES-QUOTA part
IF( ln_p5z ) THEN
sinkingn (:,:,:) = 0.e0
sinking2n(:,:,:) = 0.e0
sinkingp (:,:,:) = 0.e0
sinking2p(:,:,:) = 0.e0
! Compute the sedimentation term using trc_sink for all the sinking particles
! ---------------------------------------------------------------------------
CALL trc_sink( kt, Kbb, Kmm, wsbio3, sinkingn , jppon, rfact2 )
CALL trc_sink( kt, Kbb, Kmm, wsbio3, sinkingp , jppop, rfact2 )
CALL trc_sink( kt, Kbb, Kmm, wsbio4, sinking2n, jpgon, rfact2 )
CALL trc_sink( kt, Kbb, Kmm, wsbio4, sinking2p, jpgop, rfact2 )
ENDIF
! Total carbon export per year
IF( iom_use( "tcexp" ) .OR. ( ln_check_mass .AND. kt == nitend .AND. knt == nrdttrc ) ) &
& t_oce_co2_exp = glob_sum( 'p4zsink', ( sinking(:,:,ik100) + sinking2(:,:,ik100) ) * e1e2t(:,:) * tmask(:,:,1) )
!
IF( lk_iomput .AND. knt == nrdttrc ) THEN
zfact = 1.e+3 * rfact2r ! conversion from mol/l/kt to mol/m3/s
!
CALL iom_put( "EPC100" , ( sinking(:,:,ik100) + sinking2(:,:,ik100) ) * zfact * tmask(:,:,1) ) ! Export of carbon at 100m
CALL iom_put( "EPFE100" , ( sinkfer(:,:,ik100) + sinkfer2(:,:,ik100) ) * zfact * tmask(:,:,1) ) ! Export of iron at 100m
CALL iom_put( "EPCAL100", sinkcal(:,:,ik100) * zfact * tmask(:,:,1) ) ! Export of calcite at 100m
CALL iom_put( "EPSI100" , sinksil(:,:,ik100) * zfact * tmask(:,:,1) ) ! Export of bigenic silica at 100m
CALL iom_put( "EXPC" , ( sinking(:,:,:) + sinking2(:,:,:) ) * zfact * tmask(:,:,:) ) ! Export of carbon in the water column
CALL iom_put( "EXPFE" , ( sinkfer(:,:,:) + sinkfer2(:,:,:) ) * zfact * tmask(:,:,:) ) ! Export of iron
CALL iom_put( "EXPCAL" , sinkcal(:,:,:) * zfact * tmask(:,:,:) ) ! Export of calcite
CALL iom_put( "EXPSI" , sinksil(:,:,:) * zfact * tmask(:,:,:) ) ! Export of bigenic silica
CALL iom_put( "tcexp" , t_oce_co2_exp * zfact ) ! molC/s
!
ENDIF
!
IF(sn_cfctl%l_prttrc) THEN ! print mean trends (used for debugging)
WRITE(charout, FMT="('sink')")
CALL prt_ctl_info( charout, cdcomp = 'top' )
CALL prt_ctl(tab4d_1=tr(:,:,:,:,Krhs), mask1=tmask, clinfo=ctrcnm)
ENDIF
!
IF( ln_timing ) CALL timing_stop('p4z_sink')
!
END SUBROUTINE p4z_sink
SUBROUTINE p4z_sink_init
!!----------------------------------------------------------------------
!! *** ROUTINE p4z_sink_init ***
!!
!! ** Purpose : Initialization of sinking parameters
!!
!! ** Method :
!!
!! ** input :
!!----------------------------------------------------------------------
INTEGER :: jk
!!----------------------------------------------------------------------
!
ik100 = 10 ! last level where depth less than 100 m
DO jk = jpkm1, 1, -1
IF( gdept_1d(jk) > 100. ) ik100 = jk - 1
END DO
IF (lwp) WRITE(numout,*)
IF (lwp) WRITE(numout,*) ' Level corresponding to 100m depth ', ik100 + 1
IF (lwp) WRITE(numout,*)
!
t_oce_co2_exp = 0._wp
!
END SUBROUTINE p4z_sink_init
INTEGER FUNCTION p4z_sink_alloc()
!!----------------------------------------------------------------------
!! *** ROUTINE p4z_sink_alloc ***
!!----------------------------------------------------------------------
INTEGER :: ierr(2)
!!----------------------------------------------------------------------
!
ierr(:) = 0
!
ALLOCATE( sinking(jpi,jpj,jpk) , sinking2(jpi,jpj,jpk) , &
& sinkcal(jpi,jpj,jpk) , sinksil (jpi,jpj,jpk) , &
& sinkfer2(jpi,jpj,jpk) , &
& sinkfer(jpi,jpj,jpk) , STAT=ierr(1) )
!
IF( ln_p5z ) ALLOCATE( sinkingn(jpi,jpj,jpk), sinking2n(jpi,jpj,jpk) , &
& sinkingp(jpi,jpj,jpk), sinking2p(jpi,jpj,jpk) , STAT=ierr(2) )
!
p4z_sink_alloc = MAXVAL( ierr )
IF( p4z_sink_alloc /= 0 ) CALL ctl_stop( 'STOP', 'p4z_sink_alloc : failed to allocate arrays.' )
!
END FUNCTION p4z_sink_alloc
!!======================================================================
END MODULE p4zsink