p4zsink.F90 40 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915
  1. MODULE p4zsink
  2. !!======================================================================
  3. !! *** MODULE p4zsink ***
  4. !! TOP : PISCES vertical flux of particulate matter due to gravitational sinking
  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. !!----------------------------------------------------------------------
  11. #if defined key_pisces
  12. !!----------------------------------------------------------------------
  13. !! p4z_sink : Compute vertical flux of particulate matter due to gravitational sinking
  14. !! p4z_sink_init : Unitialisation of sinking speed parameters
  15. !! p4z_sink_alloc : Allocate sinking speed variables
  16. !!----------------------------------------------------------------------
  17. USE oce_trc ! shared variables between ocean and passive tracers
  18. USE trc ! passive tracers common variables
  19. USE sms_pisces ! PISCES Source Minus Sink variables
  20. USE prtctl_trc ! print control for debugging
  21. USE iom ! I/O manager
  22. USE lib_mpp
  23. IMPLICIT NONE
  24. PRIVATE
  25. PUBLIC p4z_sink ! called in p4zbio.F90
  26. PUBLIC p4z_sink_init ! called in trcsms_pisces.F90
  27. PUBLIC p4z_sink_alloc
  28. REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: wsbio3 !: POC sinking speed
  29. REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: wsbio4 !: GOC sinking speed
  30. REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: wscal !: Calcite and BSi sinking speeds
  31. REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: sinking, sinking2 !: POC sinking fluxes
  32. ! ! (different meanings depending on the parameterization)
  33. REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: sinkcal, sinksil !: CaCO3 and BSi sinking fluxes
  34. REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: sinkfer !: Small BFe sinking fluxes
  35. #if ! defined key_kriest
  36. REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: sinkfer2 !: Big iron sinking fluxes
  37. #endif
  38. INTEGER :: ik100
  39. #if defined key_kriest
  40. REAL(wp) :: xkr_sfact !: Sinking factor
  41. REAL(wp) :: xkr_stick !: Stickiness
  42. REAL(wp) :: xkr_nnano !: Nbr of cell in nano size class
  43. REAL(wp) :: xkr_ndiat !: Nbr of cell in diatoms size class
  44. REAL(wp) :: xkr_nmicro !: Nbr of cell in microzoo size class
  45. REAL(wp) :: xkr_nmeso !: Nbr of cell in mesozoo size class
  46. REAL(wp) :: xkr_naggr !: Nbr of cell in aggregates size class
  47. REAL(wp) :: xkr_frac
  48. REAL(wp), PUBLIC :: xkr_dnano !: Size of particles in nano pool
  49. REAL(wp), PUBLIC :: xkr_ddiat !: Size of particles in diatoms pool
  50. REAL(wp), PUBLIC :: xkr_dmicro !: Size of particles in microzoo pool
  51. REAL(wp), PUBLIC :: xkr_dmeso !: Size of particles in mesozoo pool
  52. REAL(wp), PUBLIC :: xkr_daggr !: Size of particles in aggregates pool
  53. REAL(wp), PUBLIC :: xkr_wsbio_min !: min vertical particle speed
  54. REAL(wp), PUBLIC :: xkr_wsbio_max !: max vertical particle speed
  55. REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) :: xnumm !: maximum number of particles in aggregates
  56. #endif
  57. !!* Substitution
  58. # include "top_substitute.h90"
  59. !!----------------------------------------------------------------------
  60. !! NEMO/TOP 3.3 , NEMO Consortium (2010)
  61. !! $Id: p4zsink.F90 3160 2011-11-20 14:27:18Z cetlod $
  62. !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt)
  63. !!----------------------------------------------------------------------
  64. CONTAINS
  65. #if ! defined key_kriest
  66. !!----------------------------------------------------------------------
  67. !! 'standard sinking parameterisation' ???
  68. !!----------------------------------------------------------------------
  69. SUBROUTINE p4z_sink ( kt, knt )
  70. !!---------------------------------------------------------------------
  71. !! *** ROUTINE p4z_sink ***
  72. !!
  73. !! ** Purpose : Compute vertical flux of particulate matter due to
  74. !! gravitational sinking
  75. !!
  76. !! ** Method : - ???
  77. !!---------------------------------------------------------------------
  78. INTEGER, INTENT(in) :: kt, knt
  79. INTEGER :: ji, jj, jk, jit
  80. INTEGER :: iiter1, iiter2
  81. REAL(wp) :: zagg1, zagg2, zagg3, zagg4
  82. REAL(wp) :: zagg , zaggfe, zaggdoc, zaggdoc2, zaggdoc3
  83. REAL(wp) :: zfact, zwsmax, zmax, zstep
  84. CHARACTER (len=25) :: charout
  85. REAL(wp), POINTER, DIMENSION(:,:,:) :: zw3d
  86. REAL(wp), POINTER, DIMENSION(:,: ) :: zw2d
  87. !!---------------------------------------------------------------------
  88. !
  89. IF( nn_timing == 1 ) CALL timing_start('p4z_sink')
  90. !
  91. ! Sinking speeds of detritus is increased with depth as shown
  92. ! by data and from the coagulation theory
  93. ! -----------------------------------------------------------
  94. DO jk = 1, jpkm1
  95. DO jj = 1, jpj
  96. DO ji = 1,jpi
  97. zmax = MAX( heup(ji,jj), hmld(ji,jj) )
  98. zfact = MAX( 0., fsdepw(ji,jj,jk+1) - zmax ) / 5000._wp
  99. wsbio4(ji,jj,jk) = wsbio2 + ( 200.- wsbio2 ) * zfact
  100. END DO
  101. END DO
  102. END DO
  103. ! limit the values of the sinking speeds to avoid numerical instabilities
  104. wsbio3(:,:,:) = wsbio
  105. wscal (:,:,:) = wsbio4(:,:,:)
  106. !
  107. ! OA This is (I hope) a temporary solution for the problem that may
  108. ! OA arise in specific situation where the CFL criterion is broken
  109. ! OA for vertical sedimentation of particles. To avoid this, a time
  110. ! OA splitting algorithm has been coded. A specific maximum
  111. ! OA iteration number is provided and may be specified in the namelist
  112. ! OA This is to avoid very large iteration number when explicit free
  113. ! OA surface is used (for instance). When niter?max is set to 1,
  114. ! OA this computation is skipped. The crude old threshold method is
  115. ! OA then applied. This also happens when niter exceeds nitermax.
  116. IF( MAX( niter1max, niter2max ) == 1 ) THEN
  117. iiter1 = 1
  118. iiter2 = 1
  119. ELSE
  120. iiter1 = 1
  121. iiter2 = 1
  122. DO jk = 1, jpkm1
  123. DO jj = 1, jpj
  124. DO ji = 1, jpi
  125. IF( tmask(ji,jj,jk) == 1) THEN
  126. zwsmax = 0.5 * fse3t(ji,jj,jk) / xstep
  127. iiter1 = MAX( iiter1, INT( wsbio3(ji,jj,jk) / zwsmax ) )
  128. iiter2 = MAX( iiter2, INT( wsbio4(ji,jj,jk) / zwsmax ) )
  129. ENDIF
  130. END DO
  131. END DO
  132. END DO
  133. IF( lk_mpp ) THEN
  134. CALL mpp_max( iiter1 )
  135. CALL mpp_max( iiter2 )
  136. ENDIF
  137. iiter1 = MIN( iiter1, niter1max )
  138. iiter2 = MIN( iiter2, niter2max )
  139. ENDIF
  140. DO jk = 1,jpkm1
  141. DO jj = 1, jpj
  142. DO ji = 1, jpi
  143. IF( tmask(ji,jj,jk) == 1 ) THEN
  144. zwsmax = 0.5 * fse3t(ji,jj,jk) / xstep
  145. wsbio3(ji,jj,jk) = MIN( wsbio3(ji,jj,jk), zwsmax * FLOAT( iiter1 ) )
  146. wsbio4(ji,jj,jk) = MIN( wsbio4(ji,jj,jk), zwsmax * FLOAT( iiter2 ) )
  147. ENDIF
  148. END DO
  149. END DO
  150. END DO
  151. ! Initializa to zero all the sinking arrays
  152. ! -----------------------------------------
  153. sinking (:,:,:) = 0.e0
  154. sinking2(:,:,:) = 0.e0
  155. sinkcal (:,:,:) = 0.e0
  156. sinkfer (:,:,:) = 0.e0
  157. sinksil (:,:,:) = 0.e0
  158. sinkfer2(:,:,:) = 0.e0
  159. ! Compute the sedimentation term using p4zsink2 for all the sinking particles
  160. ! -----------------------------------------------------
  161. DO jit = 1, iiter1
  162. CALL p4z_sink2( wsbio3, sinking , jppoc, iiter1 )
  163. CALL p4z_sink2( wsbio3, sinkfer , jpsfe, iiter1 )
  164. END DO
  165. DO jit = 1, iiter2
  166. CALL p4z_sink2( wsbio4, sinking2, jpgoc, iiter2 )
  167. CALL p4z_sink2( wsbio4, sinkfer2, jpbfe, iiter2 )
  168. CALL p4z_sink2( wsbio4, sinksil , jpgsi, iiter2 )
  169. CALL p4z_sink2( wscal , sinkcal , jpcal, iiter2 )
  170. END DO
  171. ! Exchange between organic matter compartments due to coagulation/disaggregation
  172. ! ---------------------------------------------------
  173. DO jk = 1, jpkm1
  174. DO jj = 1, jpj
  175. DO ji = 1, jpi
  176. !
  177. zstep = xstep
  178. # if defined key_degrad
  179. zstep = zstep * facvol(ji,jj,jk)
  180. # endif
  181. zfact = zstep * xdiss(ji,jj,jk)
  182. ! Part I : Coagulation dependent on turbulence
  183. zagg1 = 25.9 * zfact * trb(ji,jj,jk,jppoc) * trb(ji,jj,jk,jppoc)
  184. zagg2 = 4452. * zfact * trb(ji,jj,jk,jppoc) * trb(ji,jj,jk,jpgoc)
  185. ! Part II : Differential settling
  186. ! Aggregation of small into large particles
  187. zagg3 = 47.1 * zstep * trb(ji,jj,jk,jppoc) * trb(ji,jj,jk,jpgoc)
  188. zagg4 = 3.3 * zstep * trb(ji,jj,jk,jppoc) * trb(ji,jj,jk,jppoc)
  189. zagg = zagg1 + zagg2 + zagg3 + zagg4
  190. zaggfe = zagg * trb(ji,jj,jk,jpsfe) / ( trb(ji,jj,jk,jppoc) + rtrn )
  191. ! Aggregation of DOC to POC :
  192. ! 1st term is shear aggregation of DOC-DOC
  193. ! 2nd term is shear aggregation of DOC-POC
  194. ! 3rd term is differential settling of DOC-POC
  195. zaggdoc = ( ( 0.369 * 0.3 * trb(ji,jj,jk,jpdoc) + 102.4 * trb(ji,jj,jk,jppoc) ) * zfact &
  196. & + 2.4 * zstep * trb(ji,jj,jk,jppoc) ) * 0.3 * trb(ji,jj,jk,jpdoc)
  197. ! transfer of DOC to GOC :
  198. ! 1st term is shear aggregation
  199. ! 2nd term is differential settling
  200. zaggdoc2 = ( 3.53E3 * zfact + 0.1 * zstep ) * trb(ji,jj,jk,jpgoc) * 0.3 * trb(ji,jj,jk,jpdoc)
  201. ! tranfer of DOC to POC due to brownian motion
  202. zaggdoc3 = ( 5095. * trb(ji,jj,jk,jppoc) + 114. * 0.3 * trb(ji,jj,jk,jpdoc) ) *zstep * 0.3 * trb(ji,jj,jk,jpdoc)
  203. ! Update the trends
  204. tra(ji,jj,jk,jppoc) = tra(ji,jj,jk,jppoc) - zagg + zaggdoc + zaggdoc3
  205. tra(ji,jj,jk,jpgoc) = tra(ji,jj,jk,jpgoc) + zagg + zaggdoc2
  206. tra(ji,jj,jk,jpsfe) = tra(ji,jj,jk,jpsfe) - zaggfe
  207. tra(ji,jj,jk,jpbfe) = tra(ji,jj,jk,jpbfe) + zaggfe
  208. tra(ji,jj,jk,jpdoc) = tra(ji,jj,jk,jpdoc) - zaggdoc - zaggdoc2 - zaggdoc3
  209. !
  210. END DO
  211. END DO
  212. END DO
  213. ! Total carbon export per year
  214. IF( iom_use( "tcexp" ) .OR. ( ln_check_mass .AND. kt == nitend .AND. knt == nrdttrc ) ) &
  215. & t_oce_co2_exp = glob_sum( ( sinking(:,:,ik100) + sinking2(:,:,ik100) ) * e1e2t(:,:) * tmask(:,:,1) )
  216. !
  217. IF( lk_iomput ) THEN
  218. IF( knt == nrdttrc ) THEN
  219. CALL wrk_alloc( jpi, jpj, zw2d )
  220. CALL wrk_alloc( jpi, jpj, jpk, zw3d )
  221. zfact = 1.e+3 * rfact2r ! conversion from mol/l/kt to mol/m3/s
  222. !
  223. IF( iom_use( "EPC100" ) ) THEN
  224. zw2d(:,:) = ( sinking(:,:,ik100) + sinking2(:,:,ik100) ) * zfact * tmask(:,:,1) ! Export of carbon at 100m
  225. CALL iom_put( "EPC100" , zw2d )
  226. ENDIF
  227. IF( iom_use( "EPFE100" ) ) THEN
  228. zw2d(:,:) = ( sinkfer(:,:,ik100) + sinkfer2(:,:,ik100) ) * zfact * tmask(:,:,1) ! Export of iron at 100m
  229. CALL iom_put( "EPFE100" , zw2d )
  230. ENDIF
  231. IF( iom_use( "EPCAL100" ) ) THEN
  232. zw2d(:,:) = sinkcal(:,:,ik100) * zfact * tmask(:,:,1) ! Export of calcite at 100m
  233. CALL iom_put( "EPCAL100" , zw2d )
  234. ENDIF
  235. IF( iom_use( "EPSI100" ) ) THEN
  236. zw2d(:,:) = sinksil(:,:,ik100) * zfact * tmask(:,:,1) ! Export of bigenic silica at 100m
  237. CALL iom_put( "EPSI100" , zw2d )
  238. ENDIF
  239. IF( iom_use( "EXPC" ) ) THEN
  240. zw3d(:,:,:) = ( sinking(:,:,:) + sinking2(:,:,:) ) * zfact * tmask(:,:,:) ! Export of carbon in the water column
  241. CALL iom_put( "EXPC" , zw3d )
  242. ENDIF
  243. IF( iom_use( "EXPFE" ) ) THEN
  244. zw3d(:,:,:) = ( sinkfer(:,:,:) + sinkfer2(:,:,:) ) * zfact * tmask(:,:,:) ! Export of iron
  245. CALL iom_put( "EXPFE" , zw3d )
  246. ENDIF
  247. IF( iom_use( "EXPCAL" ) ) THEN
  248. zw3d(:,:,:) = sinkcal(:,:,:) * zfact * tmask(:,:,:) ! Export of calcite
  249. CALL iom_put( "EXPCAL" , zw3d )
  250. ENDIF
  251. IF( iom_use( "EXPSI" ) ) THEN
  252. zw3d(:,:,:) = sinksil(:,:,:) * zfact * tmask(:,:,:) ! Export of bigenic silica
  253. CALL iom_put( "EXPSI" , zw3d )
  254. ENDIF
  255. IF( iom_use( "tcexp" ) ) CALL iom_put( "tcexp" , t_oce_co2_exp * zfact ) ! molC/s
  256. !
  257. CALL wrk_dealloc( jpi, jpj, zw2d )
  258. CALL wrk_dealloc( jpi, jpj, jpk, zw3d )
  259. ENDIF
  260. ELSE
  261. IF( ln_diatrc ) THEN
  262. zfact = 1.e3 * rfact2r
  263. trc2d(:,:,jp_pcs0_2d + 4) = sinking (:,:,ik100) * zfact * tmask(:,:,1)
  264. trc2d(:,:,jp_pcs0_2d + 5) = sinking2(:,:,ik100) * zfact * tmask(:,:,1)
  265. trc2d(:,:,jp_pcs0_2d + 6) = sinkfer (:,:,ik100) * zfact * tmask(:,:,1)
  266. trc2d(:,:,jp_pcs0_2d + 7) = sinkfer2(:,:,ik100) * zfact * tmask(:,:,1)
  267. trc2d(:,:,jp_pcs0_2d + 8) = sinksil (:,:,ik100) * zfact * tmask(:,:,1)
  268. trc2d(:,:,jp_pcs0_2d + 9) = sinkcal (:,:,ik100) * zfact * tmask(:,:,1)
  269. ENDIF
  270. ENDIF
  271. !
  272. IF(ln_ctl) THEN ! print mean trends (used for debugging)
  273. WRITE(charout, FMT="('sink')")
  274. CALL prt_ctl_trc_info(charout)
  275. CALL prt_ctl_trc(tab4d=tra, mask=tmask, clinfo=ctrcnm)
  276. ENDIF
  277. !
  278. IF( nn_timing == 1 ) CALL timing_stop('p4z_sink')
  279. !
  280. END SUBROUTINE p4z_sink
  281. SUBROUTINE p4z_sink_init
  282. !!----------------------------------------------------------------------
  283. !! *** ROUTINE p4z_sink_init ***
  284. !!----------------------------------------------------------------------
  285. INTEGER :: jk
  286. ik100 = 10 ! last level where depth less than 100 m
  287. DO jk = jpkm1, 1, -1
  288. IF( gdept_1d(jk) > 100. ) ik100 = jk - 1
  289. END DO
  290. IF (lwp) WRITE(numout,*)
  291. IF (lwp) WRITE(numout,*) ' Level corresponding to 100m depth ', ik100 + 1
  292. IF (lwp) WRITE(numout,*)
  293. !
  294. t_oce_co2_exp = 0._wp
  295. !
  296. END SUBROUTINE p4z_sink_init
  297. #else
  298. !!----------------------------------------------------------------------
  299. !! 'Kriest sinking parameterisation' key_kriest ???
  300. !!----------------------------------------------------------------------
  301. SUBROUTINE p4z_sink ( kt, knt )
  302. !!---------------------------------------------------------------------
  303. !! *** ROUTINE p4z_sink ***
  304. !!
  305. !! ** Purpose : Compute vertical flux of particulate matter due to
  306. !! gravitational sinking - Kriest parameterization
  307. !!
  308. !! ** Method : - ???
  309. !!---------------------------------------------------------------------
  310. !
  311. INTEGER, INTENT(in) :: kt, knt
  312. !
  313. INTEGER :: ji, jj, jk, jit, niter1, niter2
  314. REAL(wp) :: zagg1, zagg2, zagg3, zagg4, zagg5, zfract, zaggsi, zaggsh
  315. REAL(wp) :: zagg , zaggdoc, zaggdoc1, znumdoc
  316. REAL(wp) :: znum , zeps, zfm, zgm, zsm
  317. REAL(wp) :: zdiv , zdiv1, zdiv2, zdiv3, zdiv4, zdiv5
  318. REAL(wp) :: zval1, zval2, zval3, zval4
  319. REAL(wp) :: zfact
  320. INTEGER :: ik1
  321. CHARACTER (len=25) :: charout
  322. REAL(wp), POINTER, DIMENSION(:,:,:) :: znum3d
  323. REAL(wp), POINTER, DIMENSION(:,:,:) :: zw3d
  324. REAL(wp), POINTER, DIMENSION(:,: ) :: zw2d
  325. !!---------------------------------------------------------------------
  326. !
  327. IF( nn_timing == 1 ) CALL timing_start('p4z_sink')
  328. !
  329. CALL wrk_alloc( jpi, jpj, jpk, znum3d )
  330. !
  331. ! Initialisation of variables used to compute Sinking Speed
  332. ! ---------------------------------------------------------
  333. znum3d(:,:,:) = 0.e0
  334. zval1 = 1. + xkr_zeta
  335. zval2 = 1. + xkr_zeta + xkr_eta
  336. zval3 = 1. + xkr_eta
  337. ! Computation of the vertical sinking speed : Kriest et Evans, 2000
  338. ! -----------------------------------------------------------------
  339. DO jk = 1, jpkm1
  340. DO jj = 1, jpj
  341. DO ji = 1, jpi
  342. IF( tmask(ji,jj,jk) /= 0.e0 ) THEN
  343. znum = trb(ji,jj,jk,jppoc) / ( trb(ji,jj,jk,jpnum) + rtrn ) / xkr_massp
  344. ! -------------- To avoid sinking speed over 50 m/day -------
  345. znum = MIN( xnumm(jk), znum )
  346. znum = MAX( 1.1 , znum )
  347. znum3d(ji,jj,jk) = znum
  348. !------------------------------------------------------------
  349. zeps = ( zval1 * znum - 1. )/ ( znum - 1. )
  350. zfm = xkr_frac**( 1. - zeps )
  351. zgm = xkr_frac**( zval1 - zeps )
  352. zdiv = MAX( 1.e-4, ABS( zeps - zval2 ) ) * SIGN( 1., ( zeps - zval2 ) )
  353. zdiv1 = zeps - zval3
  354. wsbio3(ji,jj,jk) = xkr_wsbio_min * ( zeps - zval1 ) / zdiv &
  355. & - xkr_wsbio_max * zgm * xkr_eta / zdiv
  356. wsbio4(ji,jj,jk) = xkr_wsbio_min * ( zeps-1. ) / zdiv1 &
  357. & - xkr_wsbio_max * zfm * xkr_eta / zdiv1
  358. IF( znum == 1.1) wsbio3(ji,jj,jk) = wsbio4(ji,jj,jk)
  359. ENDIF
  360. END DO
  361. END DO
  362. END DO
  363. wscal(:,:,:) = MAX( wsbio3(:,:,:), 30._wp )
  364. ! INITIALIZE TO ZERO ALL THE SINKING ARRAYS
  365. ! -----------------------------------------
  366. sinking (:,:,:) = 0.e0
  367. sinking2(:,:,:) = 0.e0
  368. sinkcal (:,:,:) = 0.e0
  369. sinkfer (:,:,:) = 0.e0
  370. sinksil (:,:,:) = 0.e0
  371. ! Compute the sedimentation term using p4zsink2 for all the sinking particles
  372. ! -----------------------------------------------------
  373. niter1 = niter1max
  374. niter2 = niter2max
  375. DO jit = 1, niter1
  376. CALL p4z_sink2( wsbio3, sinking , jppoc, niter1 )
  377. CALL p4z_sink2( wsbio3, sinkfer , jpsfe, niter1 )
  378. CALL p4z_sink2( wscal , sinksil , jpgsi, niter1 )
  379. CALL p4z_sink2( wscal , sinkcal , jpcal, niter1 )
  380. END DO
  381. DO jit = 1, niter2
  382. CALL p4z_sink2( wsbio4, sinking2, jpnum, niter2 )
  383. END DO
  384. ! Exchange between organic matter compartments due to coagulation/disaggregation
  385. ! ---------------------------------------------------
  386. zval1 = 1. + xkr_zeta
  387. zval2 = 1. + xkr_eta
  388. zval3 = 3. + xkr_eta
  389. zval4 = 4. + xkr_eta
  390. DO jk = 1,jpkm1
  391. DO jj = 1,jpj
  392. DO ji = 1,jpi
  393. IF( tmask(ji,jj,jk) /= 0.e0 ) THEN
  394. znum = trb(ji,jj,jk,jppoc)/(trb(ji,jj,jk,jpnum)+rtrn) / xkr_massp
  395. !-------------- To avoid sinking speed over 50 m/day -------
  396. znum = min(xnumm(jk),znum)
  397. znum = MAX( 1.1,znum)
  398. !------------------------------------------------------------
  399. zeps = ( zval1 * znum - 1.) / ( znum - 1.)
  400. zdiv = MAX( 1.e-4, ABS( zeps - zval3) ) * SIGN( 1., zeps - zval3 )
  401. zdiv1 = MAX( 1.e-4, ABS( zeps - 4. ) ) * SIGN( 1., zeps - 4. )
  402. zdiv2 = zeps - 2.
  403. zdiv3 = zeps - 3.
  404. zdiv4 = zeps - zval2
  405. zdiv5 = 2.* zeps - zval4
  406. zfm = xkr_frac**( 1.- zeps )
  407. zsm = xkr_frac**xkr_eta
  408. ! Part I : Coagulation dependant on turbulence
  409. ! ----------------------------------------------
  410. zagg1 = 0.163 * trb(ji,jj,jk,jpnum)**2 &
  411. & * 2.*( (zfm-1.)*(zfm*xkr_mass_max**3-xkr_mass_min**3) &
  412. & * (zeps-1)/zdiv1 + 3.*(zfm*xkr_mass_max-xkr_mass_min) &
  413. & * (zfm*xkr_mass_max**2-xkr_mass_min**2) &
  414. & * (zeps-1.)**2/(zdiv2*zdiv3))
  415. zagg2 = 2*0.163*trb(ji,jj,jk,jpnum)**2*zfm* &
  416. & ((xkr_mass_max**3+3.*(xkr_mass_max**2 &
  417. & *xkr_mass_min*(zeps-1.)/zdiv2 &
  418. & +xkr_mass_max*xkr_mass_min**2*(zeps-1.)/zdiv3) &
  419. & +xkr_mass_min**3*(zeps-1)/zdiv1) &
  420. & -zfm*xkr_mass_max**3*(1.+3.*((zeps-1.)/ &
  421. & (zeps-2.)+(zeps-1.)/zdiv3)+(zeps-1.)/zdiv1))
  422. zagg3 = 0.163*trb(ji,jj,jk,jpnum)**2*zfm**2*8. * xkr_mass_max**3
  423. ! Aggregation of small into large particles
  424. ! Part II : Differential settling
  425. ! ----------------------------------------------
  426. zagg4 = 2.*3.141*0.125*trb(ji,jj,jk,jpnum)**2* &
  427. & xkr_wsbio_min*(zeps-1.)**2 &
  428. & *(xkr_mass_min**2*((1.-zsm*zfm)/(zdiv3*zdiv4) &
  429. & -(1.-zfm)/(zdiv*(zeps-1.)))- &
  430. & ((zfm*zfm*xkr_mass_max**2*zsm-xkr_mass_min**2) &
  431. & *xkr_eta)/(zdiv*zdiv3*zdiv5) )
  432. zagg5 = 2.*3.141*0.125*trb(ji,jj,jk,jpnum)**2 &
  433. & *(zeps-1.)*zfm*xkr_wsbio_min &
  434. & *(zsm*(xkr_mass_min**2-zfm*xkr_mass_max**2) &
  435. & /zdiv3-(xkr_mass_min**2-zfm*zsm*xkr_mass_max**2) &
  436. & /zdiv)
  437. !
  438. ! Fractionnation by swimming organisms
  439. ! ------------------------------------
  440. zfract = 2.*3.141*0.125*trb(ji,jj,jk,jpmes)*12./0.12/0.06**3*trb(ji,jj,jk,jpnum) &
  441. & * (0.01/xkr_mass_min)**(1.-zeps)*0.1**2 &
  442. & * 10000.*xstep
  443. ! Aggregation of DOC to small particles
  444. ! --------------------------------------
  445. zaggdoc = 0.83 * trb(ji,jj,jk,jpdoc) * xstep * xdiss(ji,jj,jk) * trb(ji,jj,jk,jpdoc) &
  446. & + 0.005 * 231. * trb(ji,jj,jk,jpdoc) * xstep * trb(ji,jj,jk,jpdoc)
  447. zaggdoc1 = 271. * trb(ji,jj,jk,jppoc) * xstep * xdiss(ji,jj,jk) * trb(ji,jj,jk,jpdoc) &
  448. & + 0.02 * 16706. * trb(ji,jj,jk,jppoc) * xstep * trb(ji,jj,jk,jpdoc)
  449. # if defined key_degrad
  450. zagg1 = zagg1 * facvol(ji,jj,jk)
  451. zagg2 = zagg2 * facvol(ji,jj,jk)
  452. zagg3 = zagg3 * facvol(ji,jj,jk)
  453. zagg4 = zagg4 * facvol(ji,jj,jk)
  454. zagg5 = zagg5 * facvol(ji,jj,jk)
  455. zaggdoc = zaggdoc * facvol(ji,jj,jk)
  456. zaggdoc1 = zaggdoc1 * facvol(ji,jj,jk)
  457. # endif
  458. zaggsh = ( zagg1 + zagg2 + zagg3 ) * rfact2 * xdiss(ji,jj,jk) / 1000.
  459. zaggsi = ( zagg4 + zagg5 ) * xstep / 10.
  460. zagg = 0.5 * xkr_stick * ( zaggsh + zaggsi )
  461. !
  462. znumdoc = trb(ji,jj,jk,jpnum) / ( trb(ji,jj,jk,jppoc) + rtrn )
  463. tra(ji,jj,jk,jppoc) = tra(ji,jj,jk,jppoc) + zaggdoc + zaggdoc1
  464. tra(ji,jj,jk,jpnum) = tra(ji,jj,jk,jpnum) + zfract + zaggdoc / xkr_massp - zagg
  465. tra(ji,jj,jk,jpdoc) = tra(ji,jj,jk,jpdoc) - zaggdoc - zaggdoc1
  466. ENDIF
  467. END DO
  468. END DO
  469. END DO
  470. ! Total primary production per year
  471. t_oce_co2_exp = t_oce_co2_exp + glob_sum( ( sinking(:,:,ik100) * e1e2t(:,:) * tmask(:,:,1) )
  472. !
  473. IF( lk_iomput ) THEN
  474. IF( knt == nrdttrc ) THEN
  475. CALL wrk_alloc( jpi, jpj, zw2d )
  476. CALL wrk_alloc( jpi, jpj, jpk, zw3d )
  477. zfact = 1.e+3 * rfact2r ! conversion from mol/l/kt to mol/m3/s
  478. !
  479. IF( iom_use( "EPC100" ) ) THEN
  480. zw2d(:,:) = sinking(:,:,ik100) * zfact * tmask(:,:,1) ! Export of carbon at 100m
  481. CALL iom_put( "EPC100" , zw2d )
  482. ENDIF
  483. IF( iom_use( "EPN100" ) ) THEN
  484. zw2d(:,:) = sinking2(:,:,ik100) * zfact * tmask(:,:,1) ! Export of number of aggregates ?
  485. CALL iom_put( "EPN100" , zw2d )
  486. ENDIF
  487. IF( iom_use( "EPCAL100" ) ) THEN
  488. zw2d(:,:) = sinkcal(:,:,ik100) * zfact * tmask(:,:,1) ! Export of calcite at 100m
  489. CALL iom_put( "EPCAL100" , zw2d )
  490. ENDIF
  491. IF( iom_use( "EPSI100" ) ) THEN
  492. zw2d(:,:) = sinksil(:,:,ik100) * zfact * tmask(:,:,1) ! Export of bigenic silica at 100m
  493. CALL iom_put( "EPSI100" , zw2d )
  494. ENDIF
  495. IF( iom_use( "EXPC" ) ) THEN
  496. zw3d(:,:,:) = sinking(:,:,:) * zfact * tmask(:,:,:) ! Export of carbon in the water column
  497. CALL iom_put( "EXPC" , zw3d )
  498. ENDIF
  499. IF( iom_use( "EXPN" ) ) THEN
  500. zw3d(:,:,:) = sinking(:,:,:) * zfact * tmask(:,:,:) ! Export of carbon in the water column
  501. CALL iom_put( "EXPN" , zw3d )
  502. ENDIF
  503. IF( iom_use( "EXPCAL" ) ) THEN
  504. zw3d(:,:,:) = sinkcal(:,:,:) * zfact * tmask(:,:,:) ! Export of calcite
  505. CALL iom_put( "EXPCAL" , zw3d )
  506. ENDIF
  507. IF( iom_use( "EXPSI" ) ) THEN
  508. zw3d(:,:,:) = sinksil(:,:,:) * zfact * tmask(:,:,:) ! Export of bigenic silica
  509. CALL iom_put( "EXPSI" , zw3d )
  510. ENDIF
  511. IF( iom_use( "XNUM" ) ) THEN
  512. zw3d(:,:,:) = znum3d(:,:,:) * tmask(:,:,:) ! Number of particles on aggregats
  513. CALL iom_put( "XNUM" , zw3d )
  514. ENDIF
  515. IF( iom_use( "WSC" ) ) THEN
  516. zw3d(:,:,:) = wsbio3(:,:,:) * tmask(:,:,:) ! Sinking speed of carbon particles
  517. CALL iom_put( "WSC" , zw3d )
  518. ENDIF
  519. IF( iom_use( "WSN" ) ) THEN
  520. zw3d(:,:,:) = wsbio4(:,:,:) * tmask(:,:,:) ! Sinking speed of particles number
  521. CALL iom_put( "WSN" , zw3d )
  522. ENDIF
  523. !
  524. CALL wrk_dealloc( jpi, jpj, zw2d )
  525. CALL wrk_dealloc( jpi, jpj, jpk, zw3d )
  526. ELSE
  527. IF( ln_diatrc ) THEN
  528. zfact = 1.e3 * rfact2r
  529. trc2d(:,: ,jp_pcs0_2d + 4) = sinking (:,:,ik100) * zfact * tmask(:,:,1)
  530. trc2d(:,: ,jp_pcs0_2d + 5) = sinking2(:,:,ik100) * zfact * tmask(:,:,1)
  531. trc2d(:,: ,jp_pcs0_2d + 6) = sinkfer (:,:,ik100) * zfact * tmask(:,:,1)
  532. trc2d(:,: ,jp_pcs0_2d + 7) = sinksil (:,:,ik100) * zfact * tmask(:,:,1)
  533. trc2d(:,: ,jp_pcs0_2d + 8) = sinkcal (:,:,ik100) * zfact * tmask(:,:,1)
  534. trc3d(:,:,:,jp_pcs0_3d + 11) = sinking (:,:,:) * zfact * tmask(:,:,:)
  535. trc3d(:,:,:,jp_pcs0_3d + 12) = sinking2(:,:,:) * zfact * tmask(:,:,:)
  536. trc3d(:,:,:,jp_pcs0_3d + 13) = sinksil (:,:,:) * zfact * tmask(:,:,:)
  537. trc3d(:,:,:,jp_pcs0_3d + 14) = sinkcal (:,:,:) * zfact * tmask(:,:,:)
  538. trc3d(:,:,:,jp_pcs0_3d + 15) = znum3d (:,:,:) * tmask(:,:,:)
  539. trc3d(:,:,:,jp_pcs0_3d + 16) = wsbio3 (:,:,:) * tmask(:,:,:)
  540. trc3d(:,:,:,jp_pcs0_3d + 17) = wsbio4 (:,:,:) * tmask(:,:,:)
  541. ENDIF
  542. ENDIF
  543. !
  544. IF(ln_ctl) THEN ! print mean trends (used for debugging)
  545. WRITE(charout, FMT="('sink')")
  546. CALL prt_ctl_trc_info(charout)
  547. CALL prt_ctl_trc(tab4d=tra, mask=tmask, clinfo=ctrcnm)
  548. ENDIF
  549. !
  550. CALL wrk_dealloc( jpi, jpj, jpk, znum3d )
  551. !
  552. IF( nn_timing == 1 ) CALL timing_stop('p4z_sink')
  553. !
  554. END SUBROUTINE p4z_sink
  555. SUBROUTINE p4z_sink_init
  556. !!----------------------------------------------------------------------
  557. !! *** ROUTINE p4z_sink_init ***
  558. !!
  559. !! ** Purpose : Initialization of sinking parameters
  560. !! Kriest parameterization only
  561. !!
  562. !! ** Method : Read the nampiskrs namelist and check the parameters
  563. !! called at the first timestep
  564. !!
  565. !! ** input : Namelist nampiskrs
  566. !!----------------------------------------------------------------------
  567. INTEGER :: jk, jn, kiter
  568. INTEGER :: ios ! Local integer output status for namelist read
  569. REAL(wp) :: znum, zdiv
  570. REAL(wp) :: zws, zwr, zwl,wmax, znummax
  571. REAL(wp) :: zmin, zmax, zl, zr, xacc
  572. !
  573. NAMELIST/nampiskrs/ xkr_sfact, xkr_stick , &
  574. & xkr_nnano, xkr_ndiat, xkr_nmicro, xkr_nmeso, xkr_naggr
  575. !!----------------------------------------------------------------------
  576. !
  577. IF( nn_timing == 1 ) CALL timing_start('p4z_sink_init')
  578. !
  579. REWIND( numnatp_ref ) ! Namelist nampiskrs in reference namelist : Pisces sinking Kriest
  580. READ ( numnatp_ref, nampiskrs, IOSTAT = ios, ERR = 901)
  581. 901 IF( ios /= 0 ) CALL ctl_nam ( ios , 'nampiskrs in reference namelist', lwp )
  582. REWIND( numnatp_cfg ) ! Namelist nampiskrs in configuration namelist : Pisces sinking Kriest
  583. READ ( numnatp_cfg, nampiskrs, IOSTAT = ios, ERR = 902 )
  584. 902 IF( ios /= 0 ) CALL ctl_nam ( ios , 'nampiskrs in configuration namelist', lwp )
  585. IF(lwm) WRITE ( numonp, nampiskrs )
  586. IF(lwp) THEN
  587. WRITE(numout,*)
  588. WRITE(numout,*) ' Namelist : nampiskrs'
  589. WRITE(numout,*) ' Sinking factor xkr_sfact = ', xkr_sfact
  590. WRITE(numout,*) ' Stickiness xkr_stick = ', xkr_stick
  591. WRITE(numout,*) ' Nbr of cell in nano size class xkr_nnano = ', xkr_nnano
  592. WRITE(numout,*) ' Nbr of cell in diatoms size class xkr_ndiat = ', xkr_ndiat
  593. WRITE(numout,*) ' Nbr of cell in microzoo size class xkr_nmicro = ', xkr_nmicro
  594. WRITE(numout,*) ' Nbr of cell in mesozoo size class xkr_nmeso = ', xkr_nmeso
  595. WRITE(numout,*) ' Nbr of cell in aggregates size class xkr_naggr = ', xkr_naggr
  596. ENDIF
  597. ! max and min vertical particle speed
  598. xkr_wsbio_min = xkr_sfact * xkr_mass_min**xkr_eta
  599. xkr_wsbio_max = xkr_sfact * xkr_mass_max**xkr_eta
  600. IF (lwp) WRITE(numout,*) ' max and min vertical particle speed ', xkr_wsbio_min, xkr_wsbio_max
  601. !
  602. ! effect of the sizes of the different living pools on particle numbers
  603. ! nano = 2um-20um -> mean size=6.32 um -> ws=2.596 -> xnum=xnnano=2.337
  604. ! diat and microzoo = 10um-200um -> 44.7 -> 8.732 -> xnum=xndiat=3.718
  605. ! mesozoo = 200um-2mm -> 632.45 -> 45.14 -> xnum=xnmeso=7.147
  606. ! aggregates = 200um-10mm -> 1414 -> 74.34 -> xnum=xnaggr=9.877
  607. ! doc aggregates = 1um
  608. ! ----------------------------------------------------------
  609. xkr_dnano = 1. / ( xkr_massp * xkr_nnano )
  610. xkr_ddiat = 1. / ( xkr_massp * xkr_ndiat )
  611. xkr_dmicro = 1. / ( xkr_massp * xkr_nmicro )
  612. xkr_dmeso = 1. / ( xkr_massp * xkr_nmeso )
  613. xkr_daggr = 1. / ( xkr_massp * xkr_naggr )
  614. !!---------------------------------------------------------------------
  615. !! 'key_kriest' ???
  616. !!---------------------------------------------------------------------
  617. ! COMPUTATION OF THE VERTICAL PROFILE OF MAXIMUM SINKING SPEED
  618. ! Search of the maximum number of particles in aggregates for each k-level.
  619. ! Bissection Method
  620. !--------------------------------------------------------------------
  621. IF (lwp) THEN
  622. WRITE(numout,*)
  623. WRITE(numout,*)' kriest : Compute maximum number of particles in aggregates'
  624. ENDIF
  625. xacc = 0.001_wp
  626. kiter = 50
  627. zmin = 1.10_wp
  628. zmax = xkr_mass_max / xkr_mass_min
  629. xkr_frac = zmax
  630. DO jk = 1,jpk
  631. zl = zmin
  632. zr = zmax
  633. wmax = 0.5 * fse3t(1,1,jk) * rday * float(niter1max) / rfact2
  634. zdiv = xkr_zeta + xkr_eta - xkr_eta * zl
  635. znum = zl - 1.
  636. zwl = xkr_wsbio_min * xkr_zeta / zdiv &
  637. & - ( xkr_wsbio_max * xkr_eta * znum * &
  638. & xkr_frac**( -xkr_zeta / znum ) / zdiv ) &
  639. & - wmax
  640. zdiv = xkr_zeta + xkr_eta - xkr_eta * zr
  641. znum = zr - 1.
  642. zwr = xkr_wsbio_min * xkr_zeta / zdiv &
  643. & - ( xkr_wsbio_max * xkr_eta * znum * &
  644. & xkr_frac**( -xkr_zeta / znum ) / zdiv ) &
  645. & - wmax
  646. iflag: DO jn = 1, kiter
  647. IF ( zwl == 0._wp ) THEN ; znummax = zl
  648. ELSEIF( zwr == 0._wp ) THEN ; znummax = zr
  649. ELSE
  650. znummax = ( zr + zl ) / 2.
  651. zdiv = xkr_zeta + xkr_eta - xkr_eta * znummax
  652. znum = znummax - 1.
  653. zws = xkr_wsbio_min * xkr_zeta / zdiv &
  654. & - ( xkr_wsbio_max * xkr_eta * znum * &
  655. & xkr_frac**( -xkr_zeta / znum ) / zdiv ) &
  656. & - wmax
  657. IF( zws * zwl < 0. ) THEN ; zr = znummax
  658. ELSE ; zl = znummax
  659. ENDIF
  660. zdiv = xkr_zeta + xkr_eta - xkr_eta * zl
  661. znum = zl - 1.
  662. zwl = xkr_wsbio_min * xkr_zeta / zdiv &
  663. & - ( xkr_wsbio_max * xkr_eta * znum * &
  664. & xkr_frac**( -xkr_zeta / znum ) / zdiv ) &
  665. & - wmax
  666. zdiv = xkr_zeta + xkr_eta - xkr_eta * zr
  667. znum = zr - 1.
  668. zwr = xkr_wsbio_min * xkr_zeta / zdiv &
  669. & - ( xkr_wsbio_max * xkr_eta * znum * &
  670. & xkr_frac**( -xkr_zeta / znum ) / zdiv ) &
  671. & - wmax
  672. !
  673. IF ( ABS ( zws ) <= xacc ) EXIT iflag
  674. !
  675. ENDIF
  676. !
  677. END DO iflag
  678. xnumm(jk) = znummax
  679. IF (lwp) WRITE(numout,*) ' jk = ', jk, ' wmax = ', wmax,' xnum max = ', xnumm(jk)
  680. !
  681. END DO
  682. !
  683. ik100 = 10 ! last level where depth less than 100 m
  684. DO jk = jpkm1, 1, -1
  685. IF( gdept_1d(jk) > 100. ) iksed = jk - 1
  686. END DO
  687. IF (lwp) WRITE(numout,*)
  688. IF (lwp) WRITE(numout,*) ' Level corresponding to 100m depth ', ik100 + 1
  689. IF (lwp) WRITE(numout,*)
  690. !
  691. t_oce_co2_exp = 0._wp
  692. !
  693. IF( nn_timing == 1 ) CALL timing_stop('p4z_sink_init')
  694. !
  695. END SUBROUTINE p4z_sink_init
  696. #endif
  697. SUBROUTINE p4z_sink2( pwsink, psinkflx, jp_tra, kiter )
  698. !!---------------------------------------------------------------------
  699. !! *** ROUTINE p4z_sink2 ***
  700. !!
  701. !! ** Purpose : Compute the sedimentation terms for the various sinking
  702. !! particles. The scheme used to compute the trends is based
  703. !! on MUSCL.
  704. !!
  705. !! ** Method : - this ROUTINE compute not exactly the advection but the
  706. !! transport term, i.e. div(u*tra).
  707. !!---------------------------------------------------------------------
  708. !
  709. INTEGER , INTENT(in ) :: jp_tra ! tracer index index
  710. INTEGER , INTENT(in ) :: kiter ! number of iterations for time-splitting
  711. REAL(wp), INTENT(in ), DIMENSION(jpi,jpj,jpk) :: pwsink ! sinking speed
  712. REAL(wp), INTENT(inout), DIMENSION(jpi,jpj,jpk) :: psinkflx ! sinking fluxe
  713. !!
  714. INTEGER :: ji, jj, jk, jn
  715. REAL(wp) :: zigma,zew,zign, zflx, zstep
  716. REAL(wp), POINTER, DIMENSION(:,:,:) :: ztraz, zakz, zwsink2, ztrb
  717. !!---------------------------------------------------------------------
  718. !
  719. IF( nn_timing == 1 ) CALL timing_start('p4z_sink2')
  720. !
  721. ! Allocate temporary workspace
  722. CALL wrk_alloc( jpi, jpj, jpk, ztraz, zakz, zwsink2, ztrb )
  723. zstep = rfact2 / FLOAT( kiter ) / 2.
  724. ztraz(:,:,:) = 0.e0
  725. zakz (:,:,:) = 0.e0
  726. ztrb (:,:,:) = trb(:,:,:,jp_tra)
  727. DO jk = 1, jpkm1
  728. zwsink2(:,:,jk+1) = -pwsink(:,:,jk) / rday * tmask(:,:,jk+1)
  729. END DO
  730. zwsink2(:,:,1) = 0.e0
  731. IF( lk_degrad ) THEN
  732. zwsink2(:,:,:) = zwsink2(:,:,:) * facvol(:,:,:)
  733. ENDIF
  734. ! Vertical advective flux
  735. DO jn = 1, 2
  736. ! first guess of the slopes interior values
  737. DO jk = 2, jpkm1
  738. ztraz(:,:,jk) = ( trb(:,:,jk-1,jp_tra) - trb(:,:,jk,jp_tra) ) * tmask(:,:,jk)
  739. END DO
  740. ztraz(:,:,1 ) = 0.0
  741. ztraz(:,:,jpk) = 0.0
  742. ! slopes
  743. DO jk = 2, jpkm1
  744. DO jj = 1,jpj
  745. DO ji = 1, jpi
  746. zign = 0.25 + SIGN( 0.25, ztraz(ji,jj,jk) * ztraz(ji,jj,jk+1) )
  747. zakz(ji,jj,jk) = ( ztraz(ji,jj,jk) + ztraz(ji,jj,jk+1) ) * zign
  748. END DO
  749. END DO
  750. END DO
  751. ! Slopes limitation
  752. DO jk = 2, jpkm1
  753. DO jj = 1, jpj
  754. DO ji = 1, jpi
  755. zakz(ji,jj,jk) = SIGN( 1., zakz(ji,jj,jk) ) * &
  756. & MIN( ABS( zakz(ji,jj,jk) ), 2. * ABS(ztraz(ji,jj,jk+1)), 2. * ABS(ztraz(ji,jj,jk) ) )
  757. END DO
  758. END DO
  759. END DO
  760. ! vertical advective flux
  761. DO jk = 1, jpkm1
  762. DO jj = 1, jpj
  763. DO ji = 1, jpi
  764. zigma = zwsink2(ji,jj,jk+1) * zstep / fse3w(ji,jj,jk+1)
  765. zew = zwsink2(ji,jj,jk+1)
  766. psinkflx(ji,jj,jk+1) = -zew * ( trb(ji,jj,jk,jp_tra) - 0.5 * ( 1 + zigma ) * zakz(ji,jj,jk) ) * zstep
  767. END DO
  768. END DO
  769. END DO
  770. !
  771. ! Boundary conditions
  772. psinkflx(:,:,1 ) = 0.e0
  773. psinkflx(:,:,jpk) = 0.e0
  774. DO jk=1,jpkm1
  775. DO jj = 1,jpj
  776. DO ji = 1, jpi
  777. zflx = ( psinkflx(ji,jj,jk) - psinkflx(ji,jj,jk+1) ) / fse3t(ji,jj,jk)
  778. trb(ji,jj,jk,jp_tra) = trb(ji,jj,jk,jp_tra) + zflx
  779. END DO
  780. END DO
  781. END DO
  782. ENDDO
  783. DO jk = 1,jpkm1
  784. DO jj = 1,jpj
  785. DO ji = 1, jpi
  786. zflx = ( psinkflx(ji,jj,jk) - psinkflx(ji,jj,jk+1) ) / fse3t(ji,jj,jk)
  787. ztrb(ji,jj,jk) = ztrb(ji,jj,jk) + 2. * zflx
  788. END DO
  789. END DO
  790. END DO
  791. trb(:,:,:,jp_tra) = ztrb(:,:,:)
  792. psinkflx(:,:,:) = 2. * psinkflx(:,:,:)
  793. !
  794. CALL wrk_dealloc( jpi, jpj, jpk, ztraz, zakz, zwsink2, ztrb )
  795. !
  796. IF( nn_timing == 1 ) CALL timing_stop('p4z_sink2')
  797. !
  798. END SUBROUTINE p4z_sink2
  799. INTEGER FUNCTION p4z_sink_alloc()
  800. !!----------------------------------------------------------------------
  801. !! *** ROUTINE p4z_sink_alloc ***
  802. !!----------------------------------------------------------------------
  803. ALLOCATE( wsbio3 (jpi,jpj,jpk) , wsbio4 (jpi,jpj,jpk) , wscal(jpi,jpj,jpk) , &
  804. & sinking(jpi,jpj,jpk) , sinking2(jpi,jpj,jpk) , &
  805. & sinkcal(jpi,jpj,jpk) , sinksil (jpi,jpj,jpk) , &
  806. #if defined key_kriest
  807. & xnumm(jpk) , &
  808. #else
  809. & sinkfer2(jpi,jpj,jpk) , &
  810. #endif
  811. & sinkfer(jpi,jpj,jpk) , STAT=p4z_sink_alloc )
  812. !
  813. IF( p4z_sink_alloc /= 0 ) CALL ctl_warn('p4z_sink_alloc : failed to allocate arrays.')
  814. !
  815. END FUNCTION p4z_sink_alloc
  816. #else
  817. !!======================================================================
  818. !! Dummy module : No PISCES bio-model
  819. !!======================================================================
  820. CONTAINS
  821. SUBROUTINE p4z_sink ! Empty routine
  822. END SUBROUTINE p4z_sink
  823. #endif
  824. !!======================================================================
  825. END MODULE p4zsink