source: NEMO/branches/2019/fix_sn_cfctl_ticket2328/src/TOP/PISCES/P4Z/p4zagg.F90 @ 11869

Last change on this file since 11869 was 11869, checked in by acc, 11 months ago

Branch 2019/fix_sn_cfctl_ticket2328. Changes to enable correct functionality for the sn_cfctl%l_mppout and sn_cfctl%l_mpptop options. These changes also introduce a sn_cfctl%l_oasout option to toggle the OASIS setup information (sbccpl.F90, only) which was yet another misuse of ln_ctl. The next step may be to remove most references to ln_ctl altogether and provide a single control mechanism. TBD. See ticket #2328

  • Property svn:keywords set to Id
File size: 9.1 KB
Line 
1MODULE p4zagg
2   !!======================================================================
3   !!                         ***  MODULE p4zagg  ***
4   !! TOP :  PISCES  aggregation of particles
5   !!======================================================================
6   !! History :   1.0  !  2004     (O. Aumont) Original code
7   !!             2.0  !  2007-12  (C. Ethe, G. Madec)  F90
8   !!             3.4  !  2011-06  (O. Aumont, C. Ethe) Change aggregation formula
9   !!             3.5  !  2012-07  (O. Aumont) Introduce potential time-splitting
10   !!             3.6  !  2015-05  (O. Aumont) PISCES quota
11   !!----------------------------------------------------------------------
12
13   !!----------------------------------------------------------------------
14   !!   p4z_agg       :  Compute aggregation of particles
15   !!----------------------------------------------------------------------
16   USE oce_trc         !  shared variables between ocean and passive tracers
17   USE trc             !  passive tracers common variables
18   USE sms_pisces      !  PISCES Source Minus Sink variables
19   USE prtctl_trc      !  print control for debugging
20
21   IMPLICIT NONE
22   PRIVATE
23
24   PUBLIC   p4z_agg         ! called in p4zbio.F90
25
26   !!----------------------------------------------------------------------
27   !! NEMO/TOP 4.0 , NEMO Consortium (2018)
28   !! $Id$
29   !! Software governed by the CeCILL license (see ./LICENSE)
30   !!----------------------------------------------------------------------
31CONTAINS
32
33   SUBROUTINE p4z_agg ( kt, knt )
34      !!---------------------------------------------------------------------
35      !!                     ***  ROUTINE p4z_agg  ***
36      !!
37      !! ** Purpose :   Compute aggregation of particles
38      !!
39      !! ** Method  : - ???
40      !!---------------------------------------------------------------------
41      INTEGER, INTENT(in) ::   kt, knt   !
42      !
43      INTEGER  ::   ji, jj, jk
44      REAL(wp) ::   zagg, zagg1, zagg2, zagg3, zagg4
45      REAL(wp) ::   zaggpoc1, zaggpoc2, zaggpoc3, zaggpoc4
46      REAL(wp) ::   zaggpoc , zaggfe, zaggdoc, zaggdoc2, zaggdoc3
47      REAL(wp) ::   zaggpon , zaggdon, zaggdon2, zaggdon3
48      REAL(wp) ::   zaggpop, zaggdop, zaggdop2, zaggdop3
49      REAL(wp) ::   zaggtmp, zfact, zmax
50      CHARACTER (len=25) :: charout
51      !!---------------------------------------------------------------------
52      !
53      IF( ln_timing )   CALL timing_start('p4z_agg')
54      !
55      !  Exchange between organic matter compartments due to coagulation/disaggregation
56      !  ---------------------------------------------------
57      IF( ln_p4z ) THEN
58         !
59         DO jk = 1, jpkm1
60            DO jj = 1, jpj
61               DO ji = 1, jpi
62                  !
63                  zfact = xstep * xdiss(ji,jj,jk)
64                  !  Part I : Coagulation dependent on turbulence
65                  zagg1 = 25.9  * zfact * trb(ji,jj,jk,jppoc) * trb(ji,jj,jk,jppoc)
66                  zagg2 = 4452. * zfact * trb(ji,jj,jk,jppoc) * trb(ji,jj,jk,jpgoc)
67
68                  ! Part II : Differential settling
69
70                  !  Aggregation of small into large particles
71                  zagg3 =  47.1 * xstep * trb(ji,jj,jk,jppoc) * trb(ji,jj,jk,jpgoc)
72                  zagg4 =  3.3  * xstep * trb(ji,jj,jk,jppoc) * trb(ji,jj,jk,jppoc)
73
74                  zagg   = zagg1 + zagg2 + zagg3 + zagg4
75                  zaggfe = zagg * trb(ji,jj,jk,jpsfe) / ( trb(ji,jj,jk,jppoc) + rtrn )
76
77                  ! Aggregation of DOC to POC :
78                  ! 1st term is shear aggregation of DOC-DOC
79                  ! 2nd term is shear aggregation of DOC-POC
80                  ! 3rd term is differential settling of DOC-POC
81                  zaggdoc  = ( ( 0.369 * 0.3 * trb(ji,jj,jk,jpdoc) + 102.4 * trb(ji,jj,jk,jppoc) ) * zfact       &
82                  &            + 2.4 * xstep * trb(ji,jj,jk,jppoc) ) * 0.3 * trb(ji,jj,jk,jpdoc)
83                  ! transfer of DOC to GOC :
84                  ! 1st term is shear aggregation
85                  ! 2nd term is differential settling
86                  zaggdoc2 = ( 3.53E3 * zfact + 0.1 * xstep ) * trb(ji,jj,jk,jpgoc) * 0.3 * trb(ji,jj,jk,jpdoc)
87                  ! tranfer of DOC to POC due to brownian motion
88                  zaggdoc3 =  114. * 0.3 * trb(ji,jj,jk,jpdoc) *xstep * 0.3 * trb(ji,jj,jk,jpdoc)
89
90                  !  Update the trends
91                  tra(ji,jj,jk,jppoc) = tra(ji,jj,jk,jppoc) - zagg + zaggdoc + zaggdoc3
92                  tra(ji,jj,jk,jpgoc) = tra(ji,jj,jk,jpgoc) + zagg + zaggdoc2
93                  tra(ji,jj,jk,jpsfe) = tra(ji,jj,jk,jpsfe) - zaggfe
94                  tra(ji,jj,jk,jpbfe) = tra(ji,jj,jk,jpbfe) + zaggfe
95                  tra(ji,jj,jk,jpdoc) = tra(ji,jj,jk,jpdoc) - zaggdoc - zaggdoc2 - zaggdoc3
96                  !
97                  conspoc(ji,jj,jk) = conspoc(ji,jj,jk) - zagg + zaggdoc + zaggdoc3
98                  prodgoc(ji,jj,jk) = prodgoc(ji,jj,jk) + zagg + zaggdoc2
99                  !
100               END DO
101            END DO
102         END DO
103      ELSE    ! ln_p5z
104        !
105         DO jk = 1, jpkm1
106            DO jj = 1, jpj
107               DO ji = 1, jpi
108                  !
109                  zfact = xstep * xdiss(ji,jj,jk)
110                  !  Part I : Coagulation dependent on turbulence
111                  zaggtmp = 25.9  * zfact * trb(ji,jj,jk,jppoc)
112                  zaggpoc1 = zaggtmp * trb(ji,jj,jk,jppoc)
113                  zaggtmp = 4452. * zfact * trb(ji,jj,jk,jpgoc)
114                  zaggpoc2 = zaggtmp * trb(ji,jj,jk,jppoc)
115
116                  ! Part II : Differential settling
117   
118                  !  Aggregation of small into large particles
119                  zaggtmp =  47.1 * xstep * trb(ji,jj,jk,jpgoc)
120                  zaggpoc3 = zaggtmp * trb(ji,jj,jk,jppoc)
121                  zaggtmp =  3.3  * xstep * trb(ji,jj,jk,jppoc)
122                  zaggpoc4 = zaggtmp * trb(ji,jj,jk,jppoc)
123
124                  zaggpoc   = zaggpoc1 + zaggpoc2 + zaggpoc3 + zaggpoc4
125                  zaggpon = zaggpoc * trb(ji,jj,jk,jppon) / ( trb(ji,jj,jk,jppoc) + rtrn)
126                  zaggpop = zaggpoc * trb(ji,jj,jk,jppop) / ( trb(ji,jj,jk,jppoc) + rtrn)
127                  zaggfe = zaggpoc * trb(ji,jj,jk,jpsfe) / ( trb(ji,jj,jk,jppoc)  + rtrn )
128
129                  ! Aggregation of DOC to POC :
130                  ! 1st term is shear aggregation of DOC-DOC
131                  ! 2nd term is shear aggregation of DOC-POC
132                  ! 3rd term is differential settling of DOC-POC
133                  zaggtmp = ( ( 0.369 * 0.3 * trb(ji,jj,jk,jpdoc) + 102.4 * trb(ji,jj,jk,jppoc) ) * zfact       &
134                  &            + 2.4 * xstep * trb(ji,jj,jk,jppoc) )
135                  zaggdoc  = zaggtmp * 0.3 * trb(ji,jj,jk,jpdoc)
136                  zaggdon  = zaggtmp * 0.3 * trb(ji,jj,jk,jpdon)
137                  zaggdop  = zaggtmp * 0.3 * trb(ji,jj,jk,jpdop)
138
139                  ! transfer of DOC to GOC :
140                  ! 1st term is shear aggregation
141                  ! 2nd term is differential settling
142                  zaggtmp = ( 3.53E3 * zfact + 0.1 * xstep ) * trb(ji,jj,jk,jpgoc)
143                  zaggdoc2 = zaggtmp * 0.3 * trb(ji,jj,jk,jpdoc)
144                  zaggdon2 = zaggtmp * 0.3 * trb(ji,jj,jk,jpdon)
145                  zaggdop2 = zaggtmp * 0.3 * trb(ji,jj,jk,jpdop)
146
147                  ! tranfer of DOC to POC due to brownian motion
148                  zaggtmp = ( 114. * 0.3 * trb(ji,jj,jk,jpdoc) ) * xstep
149                  zaggdoc3 =  zaggtmp * 0.3 * trb(ji,jj,jk,jpdoc)
150                  zaggdon3 =  zaggtmp * 0.3 * trb(ji,jj,jk,jpdon)
151                  zaggdop3 =  zaggtmp * 0.3 * trb(ji,jj,jk,jpdop)
152
153                  !  Update the trends
154                  tra(ji,jj,jk,jppoc) = tra(ji,jj,jk,jppoc) - zaggpoc + zaggdoc + zaggdoc3
155                  tra(ji,jj,jk,jppon) = tra(ji,jj,jk,jppon) - zaggpon + zaggdon + zaggdon3
156                  tra(ji,jj,jk,jppop) = tra(ji,jj,jk,jppop) - zaggpop + zaggdop + zaggdop3
157                  tra(ji,jj,jk,jpgoc) = tra(ji,jj,jk,jpgoc) + zaggpoc + zaggdoc2
158                  tra(ji,jj,jk,jpgon) = tra(ji,jj,jk,jpgon) + zaggpon + zaggdon2
159                  tra(ji,jj,jk,jpgop) = tra(ji,jj,jk,jpgop) + zaggpop + zaggdop2
160                  tra(ji,jj,jk,jpsfe) = tra(ji,jj,jk,jpsfe) - zaggfe
161                  tra(ji,jj,jk,jpbfe) = tra(ji,jj,jk,jpbfe) + zaggfe
162                  tra(ji,jj,jk,jpdoc) = tra(ji,jj,jk,jpdoc) - zaggdoc - zaggdoc2 - zaggdoc3
163                  tra(ji,jj,jk,jpdon) = tra(ji,jj,jk,jpdon) - zaggdon - zaggdon2 - zaggdon3
164                  tra(ji,jj,jk,jpdop) = tra(ji,jj,jk,jpdop) - zaggdop - zaggdop2 - zaggdop3
165                  !
166                  conspoc(ji,jj,jk) = conspoc(ji,jj,jk) - zaggpoc + zaggdoc + zaggdoc3
167                  prodgoc(ji,jj,jk) = prodgoc(ji,jj,jk) + zaggpoc + zaggdoc2
168                  !
169               END DO
170            END DO
171         END DO
172         !
173      ENDIF
174      !
175      IF(ln_ctl .OR. sn_cfctl%l_mpptop)   THEN  ! print mean trends (used for debugging)
176         WRITE(charout, FMT="('agg')")
177         CALL prt_ctl_trc_info(charout)
178         CALL prt_ctl_trc(tab4d=tra, mask=tmask, clinfo=ctrcnm)
179      ENDIF
180      !
181      IF( ln_timing )   CALL timing_stop('p4z_agg')
182      !
183   END SUBROUTINE p4z_agg
184
185   !!======================================================================
186END MODULE p4zagg
Note: See TracBrowser for help on using the repository browser.