Forked from
Consortium Members / UKMO / GOSI / GOSI
118 commits behind the upstream repository.
-
Guillaume Samson authored89746a6d
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
p4zagg.F90 10.26 KiB
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