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
MODULE p4zagg
!!======================================================================
!! *** MODULE p4zagg ***
!! TOP : PISCES aggregation of particles (DOC, POC, GOC)
!! 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
!! 3.6 ! 2015-05 (O. Aumont) PISCES quota
!!----------------------------------------------------------------------
!!----------------------------------------------------------------------
!! p4z_agg : Compute aggregation of particles
!!----------------------------------------------------------------------
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 prtctl ! print control for debugging
IMPLICIT NONE
PRIVATE
PUBLIC p4z_agg ! called in p4zbio.F90
!! * Substitutions
# include "do_loop_substitute.h90"
!!----------------------------------------------------------------------
!! NEMO/TOP 4.0 , NEMO Consortium (2018)
!! $Id: p4zagg.F90 15459 2021-10-29 08:19:18Z cetlod $
!! Software governed by the CeCILL license (see ./LICENSE)
!!----------------------------------------------------------------------
CONTAINS
SUBROUTINE p4z_agg ( kt, knt, Kbb, Krhs )
!!---------------------------------------------------------------------
!! *** ROUTINE p4z_agg ***
!!
!! ** Purpose : Compute aggregation of particle. Aggregation by
!! brownian motion, differential settling and shear
!! are considered.
!!
!! ** Method : - Aggregation rates are computed assuming a fixed and
!! constant size spectrum in the different particulate
!! pools. The coagulation rates have been computed
!! externally using dedicated programs (O. Aumont). They
!! are hard-coded because they can't be changed
!! independently of each other.
!!---------------------------------------------------------------------
INTEGER, INTENT(in) :: kt, knt !
INTEGER, INTENT(in) :: Kbb, Krhs ! time level indices
!
INTEGER :: ji, jj, jk
REAL(wp) :: zagg, zagg1, zagg2, zagg3, zagg4
REAL(wp) :: zaggpoc1, zaggpoc2, zaggpoc3, zaggpoc4
REAL(wp) :: zaggpoc , zaggfe, zaggdoc, zaggdoc2, zaggdoc3
REAL(wp) :: zaggpon , zaggdon, zaggdon2, zaggdon3
REAL(wp) :: zaggpop, zaggdop, zaggdop2, zaggdop3
REAL(wp) :: zaggtmp, zfact, zmax
CHARACTER (len=25) :: charout
!!---------------------------------------------------------------------
!
IF( ln_timing ) CALL timing_start('p4z_agg')
!
! Exchange between organic matter compartments due to
! coagulation/disaggregation
! ---------------------------------------------------
! PISCES part
IF( ln_p4z ) THEN
!
DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1 )
!
zfact = xstep * xdiss(ji,jj,jk)
! Part I : Coagulation dependent on turbulence
! The stickiness has been assumed to be 0.1
! Part I : Coagulation dependent on turbulence
zagg1 = 12.5 * zfact * tr(ji,jj,jk,jppoc,Kbb) * tr(ji,jj,jk,jppoc,Kbb)
zagg2 = 169.7 * zfact * tr(ji,jj,jk,jppoc,Kbb) * tr(ji,jj,jk,jpgoc,Kbb)
! Part II : Differential settling
! Aggregation of small into large particles
! The stickiness has been assumed to be 0.1
zagg3 = 8.63 * xstep * tr(ji,jj,jk,jppoc,Kbb) * tr(ji,jj,jk,jppoc,Kbb)
zagg4 = 132.8 * xstep * tr(ji,jj,jk,jppoc,Kbb) * tr(ji,jj,jk,jpgoc,Kbb)
zagg = zagg1 + zagg2 + zagg3 + zagg4
zaggfe = zagg * tr(ji,jj,jk,jpsfe,Kbb) / ( tr(ji,jj,jk,jppoc,Kbb) + rtrn )
! Aggregation of DOC to POC :
! 1st term is shear aggregation of DOC-DOC
! 2nd term is shear aggregation of DOC-POC
! 3rd term is differential settling of DOC-POC
! 1/3 of DOC is supposed to experience aggregation (HMW)
zaggdoc = ( ( 12.0 * 0.3 * tr(ji,jj,jk,jpdoc,Kbb) + 9.05 * tr(ji,jj,jk,jppoc,Kbb) ) * zfact &
& + 2.49 * xstep * tr(ji,jj,jk,jppoc,Kbb) ) * 0.3 * tr(ji,jj,jk,jpdoc,Kbb)
! transfer of DOC to GOC :
! 1st term is shear aggregation
! 1/3 of DOC is supposed to experience aggregation (HMW)
zaggdoc2 = ( 1.94 * zfact + 1.37 * xstep ) * tr(ji,jj,jk,jpgoc,Kbb) * 0.3 * tr(ji,jj,jk,jpdoc,Kbb)
! tranfer of DOC to POC due to brownian motion
! The temperature dependency has been omitted.
zaggdoc3 = ( 127.8 * 0.3 * tr(ji,jj,jk,jpdoc,Kbb) + 725.7 * tr(ji,jj,jk,jppoc,Kbb) ) * xstep * 0.3 * tr(ji,jj,jk,jpdoc,Kbb)
! Update the trends
tr(ji,jj,jk,jppoc,Krhs) = tr(ji,jj,jk,jppoc,Krhs) - zagg + zaggdoc + zaggdoc3
tr(ji,jj,jk,jpgoc,Krhs) = tr(ji,jj,jk,jpgoc,Krhs) + zagg + zaggdoc2
tr(ji,jj,jk,jpsfe,Krhs) = tr(ji,jj,jk,jpsfe,Krhs) - zaggfe
tr(ji,jj,jk,jpbfe,Krhs) = tr(ji,jj,jk,jpbfe,Krhs) + zaggfe
tr(ji,jj,jk,jpdoc,Krhs) = tr(ji,jj,jk,jpdoc,Krhs) - zaggdoc - zaggdoc2 - zaggdoc3
!
conspoc(ji,jj,jk) = conspoc(ji,jj,jk) - zagg + zaggdoc + zaggdoc3
prodgoc(ji,jj,jk) = prodgoc(ji,jj,jk) + zagg + zaggdoc2
!
END_3D
ELSE ! ln_p5z
! PISCES-QUOTA part
!
DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1 )
!
zfact = xstep * xdiss(ji,jj,jk)
! Part I : Coagulation dependent on turbulence
! The stickiness has been assumed to be 0.1
zaggtmp = 25.9 * zfact * tr(ji,jj,jk,jppoc,Kbb)
zaggpoc1 = zaggtmp * tr(ji,jj,jk,jppoc,Kbb)
zaggtmp = 4452. * zfact * tr(ji,jj,jk,jpgoc,Kbb)
zaggpoc2 = zaggtmp * tr(ji,jj,jk,jppoc,Kbb)
! Part II : Differential settling
! The stickiness has been assumed to be 0.1
! Aggregation of small into large particles
zaggtmp = 47.1 * xstep * tr(ji,jj,jk,jpgoc,Kbb)
zaggpoc3 = zaggtmp * tr(ji,jj,jk,jppoc,Kbb)
zaggtmp = 3.3 * xstep * tr(ji,jj,jk,jppoc,Kbb)
zaggpoc4 = zaggtmp * tr(ji,jj,jk,jppoc,Kbb)
zaggpoc = zaggpoc1 + zaggpoc2 + zaggpoc3 + zaggpoc4
zaggpon = zaggpoc * tr(ji,jj,jk,jppon,Kbb) / ( tr(ji,jj,jk,jppoc,Kbb) + rtrn)
zaggpop = zaggpoc * tr(ji,jj,jk,jppop,Kbb) / ( tr(ji,jj,jk,jppoc,Kbb) + rtrn)
zaggfe = zaggpoc * tr(ji,jj,jk,jpsfe,Kbb) / ( tr(ji,jj,jk,jppoc,Kbb) + rtrn )
! Aggregation of DOC to POC :
! 1st term is shear aggregation of DOC-DOC
! 2nd term is shear aggregation of DOC-POC
! 3rd term is differential settling of DOC-POC
! 1/3 of DOC is supposed to experience aggregation (HMW)
zaggtmp = ( ( 0.37 * 0.3 * tr(ji,jj,jk,jpdoc,Kbb) + 20.5 * tr(ji,jj,jk,jppoc,Kbb) ) * zfact &
& + 0.15 * xstep * tr(ji,jj,jk,jppoc,Kbb) )
zaggdoc = zaggtmp * 0.3 * tr(ji,jj,jk,jpdoc,Kbb)
zaggdon = zaggtmp * 0.3 * tr(ji,jj,jk,jpdon,Kbb)
zaggdop = zaggtmp * 0.3 * tr(ji,jj,jk,jpdop,Kbb)
! transfer of DOC to GOC :
! 1st term is shear aggregation
! 2nd term is differential settling
! 1/3 of DOC is supposed to experience aggregation (HMW)
zaggtmp = 655.4 * zfact * tr(ji,jj,jk,jpgoc,Kbb)
zaggdoc2 = zaggtmp * 0.3 * tr(ji,jj,jk,jpdoc,Kbb)
zaggdon2 = zaggtmp * 0.3 * tr(ji,jj,jk,jpdon,Kbb)
zaggdop2 = zaggtmp * 0.3 * tr(ji,jj,jk,jpdop,Kbb)
! tranfer of DOC to POC due to brownian motion
! 1/3 of DOC is supposed to experience aggregation (HMW)
zaggtmp = ( 260.2 * 0.3 * tr(ji,jj,jk,jpdoc,Kbb) + 418.5 * tr(ji,jj,jk,jppoc,Kbb) ) * xstep
zaggdoc3 = zaggtmp * 0.3 * tr(ji,jj,jk,jpdoc,Kbb)
zaggdon3 = zaggtmp * 0.3 * tr(ji,jj,jk,jpdon,Kbb)
zaggdop3 = zaggtmp * 0.3 * tr(ji,jj,jk,jpdop,Kbb)
! Update the trends
tr(ji,jj,jk,jppoc,Krhs) = tr(ji,jj,jk,jppoc,Krhs) - zaggpoc + zaggdoc + zaggdoc3
tr(ji,jj,jk,jppon,Krhs) = tr(ji,jj,jk,jppon,Krhs) - zaggpon + zaggdon + zaggdon3
tr(ji,jj,jk,jppop,Krhs) = tr(ji,jj,jk,jppop,Krhs) - zaggpop + zaggdop + zaggdop3
tr(ji,jj,jk,jpgoc,Krhs) = tr(ji,jj,jk,jpgoc,Krhs) + zaggpoc + zaggdoc2
tr(ji,jj,jk,jpgon,Krhs) = tr(ji,jj,jk,jpgon,Krhs) + zaggpon + zaggdon2
tr(ji,jj,jk,jpgop,Krhs) = tr(ji,jj,jk,jpgop,Krhs) + zaggpop + zaggdop2
tr(ji,jj,jk,jpsfe,Krhs) = tr(ji,jj,jk,jpsfe,Krhs) - zaggfe
tr(ji,jj,jk,jpbfe,Krhs) = tr(ji,jj,jk,jpbfe,Krhs) + zaggfe
tr(ji,jj,jk,jpdoc,Krhs) = tr(ji,jj,jk,jpdoc,Krhs) - zaggdoc - zaggdoc2 - zaggdoc3
tr(ji,jj,jk,jpdon,Krhs) = tr(ji,jj,jk,jpdon,Krhs) - zaggdon - zaggdon2 - zaggdon3
tr(ji,jj,jk,jpdop,Krhs) = tr(ji,jj,jk,jpdop,Krhs) - zaggdop - zaggdop2 - zaggdop3
!
conspoc(ji,jj,jk) = conspoc(ji,jj,jk) - zaggpoc + zaggdoc + zaggdoc3
prodgoc(ji,jj,jk) = prodgoc(ji,jj,jk) + zaggpoc + zaggdoc2
!
END_3D
!
ENDIF
!
IF(sn_cfctl%l_prttrc) THEN ! print mean trends (used for debugging)
WRITE(charout, FMT="('agg')")
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_agg')
!
END SUBROUTINE p4z_agg
!!======================================================================
END MODULE p4zagg