New URL for NEMO forge!   http://forge.nemo-ocean.eu

Since March 2022 along with NEMO 4.2 release, the code development moved to a self-hosted GitLab.
This present forge is now archived and remained online for history.
sedinorg.F90 in NEMO/branches/2021/dev_r14318_RK3_stage1/src/TOP/PISCES/SED – NEMO

source: NEMO/branches/2021/dev_r14318_RK3_stage1/src/TOP/PISCES/SED/sedinorg.F90 @ 15574

Last change on this file since 15574 was 15574, checked in by techene, 3 years ago

#2605 #2715 trunk merged into dev_r14318_RK3_stage1

File size: 5.4 KB
Line 
1MODULE sedinorg
2   !!======================================================================
3   !!              ***  MODULE  sedinorg  ***
4   !!    Sediment : dissolution and reaction in pore water of
5   !!               inorganic species
6   !!=====================================================================
7   !! * Modules used
8   USE sed     ! sediment global variable
9   USE sed_oce
10   USE sedini
11   USE sedmat
12   USE lib_mpp         ! distribued memory computing library
13   USE lib_fortran
14
15   IMPLICIT NONE
16   PRIVATE
17
18   PUBLIC sed_inorg
19
20   !! $Id: seddsr.F90 5215 2015-04-15 16:11:56Z nicolasmartin $
21CONTAINS
22   
23   SUBROUTINE sed_inorg( kt )
24      !!----------------------------------------------------------------------
25      !!                   ***  ROUTINE sed_inorg  ***
26      !!
27      !!  ** Purpose :  computes pore water dissolution and reaction
28      !!
29      !!  ** Methode :  implicit simultaneous computation of undersaturation
30      !!               resulting from diffusive pore water transport and chemical
31      !!               pore water reactions. Solid material is consumed according
32      !!               to redissolution and remineralisation
33      !!
34      !!  ** Remarks :
35      !!              - undersaturation : deviation from saturation concentration
36      !!              - reaction rate   : sink of undersaturation from dissolution
37      !!                                 of solid material
38      !!
39      !!   History :
40      !!        !  98-08 (E. Maier-Reimer, Christoph Heinze )  Original code
41      !!        !  04-10 (N. Emprin, M. Gehlen ) f90
42      !!        !  06-04 (C. Ethe)  Re-organization
43      !!        !  19-08 (O. Aumont) Debugging and improvement of the model
44      !!----------------------------------------------------------------------
45      !! Arguments
46      INTEGER, INTENT(in)  :: kt   ! time step
47      ! --- local variables
48      INTEGER   ::  ji,jk          ! dummy looop indices
49      REAL(wp), DIMENSION(jpoce) ::  zsieq, reac_silf
50      REAL(wp)  ::  zsolid1, zreasat, zco3sat
51      REAL(wp)  ::  zsatur, zsatur2, znusil, zsolcpcl, zsolcpsi, zexcess
52      REAL(wp), DIMENSION(jpoce,jpksed) :: zundsat, zrearat, psms
53      !!
54      !!----------------------------------------------------------------------
55
56      IF( ln_timing )  CALL timing_start('sed_inorg')
57
58      IF( kt == nitsed000 ) THEN
59         IF (lwp) WRITE(numsed,*) ' sed_inorg : Dissolution of CaCO3 and BSi  '
60         IF (lwp) WRITE(numsed,*) ' '
61      ENDIF
62!
63      DO ji = 1, jpoce
64         ! -----------------------------------------------
65         ! Computation of Si solubility
66         ! Param of Ridgwell et al. 2002
67         ! -----------------------------------------------
68
69         zsolcpcl = 0.0
70         zsolcpsi = 0.0
71         DO jk = 1, jpksed
72            zsolcpsi = zsolcpsi + solcp(ji,jk,jsopal) * vols3d(ji,jk)
73            zsolcpcl = zsolcpcl + solcp(ji,jk,jsclay) * vols3d(ji,jk)
74         END DO
75         zsolcpsi = MAX( zsolcpsi, rtrn )
76         zsieq(ji) = sieqs(ji) * MAX(0.2, 1.0 - (0.045 * zsolcpcl / zsolcpsi )**0.58 )
77         reac_silf(ji) = reac_sil * ( 0.05 + 0.055 * ( 1.64 * ( zsolcpcl / zsolcpsi + 0.01 ) )**(-0.75) ) / 1.25 
78      END DO
79
80     
81      DO ji = 1, jpoce
82         DO jk = 2, jpksed
83            zsolid1 = volc(ji,jk,jsopal) * solcp(ji,jk,jsopal)
84            zsatur = MAX(0., ( zsieq(ji) - pwcp(ji,jk,jwsil) ) / zsieq(ji) )
85            zsatur2 = (1.0 + temp(ji) / 400.0 )**37
86            znusil = ( 0.225 * ( 1.0 + temp(ji) / 15.) * zsatur + 0.775 * zsatur2 * zsatur**9.25 )
87            solcp(ji,jk,jsopal) = solcp(ji,jk,jsopal) - reac_silf(ji) * znusil * dtsed * solcp(ji,jk,jsopal)
88            pwcp(ji,jk,jwsil) = pwcp(ji,jk,jwsil) + reac_silf(ji) * znusil * dtsed * zsolid1
89         END DO
90      END DO
91
92      !---------------------------------------------------------------
93      ! Performs CaCO3 particle deposition and redissolution (indice 9)
94      !--------------------------------------------------------------
95
96      ! computes co3por from the updated pwcp concentrations (note [co3por] = mol/l)
97      ! *densSW(l)**2 converts aksps [mol2/kg sol2] into [mol2/l2] to get [undsat] in [mol/l]
98      DO ji = 1, jpoce
99         zco3sat = aksps(ji) * densSW(ji) * densSW(ji) / ( calcon2(ji) + rtrn )
100         saturco3(ji,:) = 1.0 - co3por(ji,:) / ( rtrn + zco3sat )
101         DO jk = 1, jpksed
102            zsolid1 = volc(ji,jk,jscal) * solcp(ji,jk,jscal)
103            zundsat(ji,jk) = MAX( 0., zco3sat - co3por(ji,jk) )
104            zrearat(ji,jk) = ( reac_cal * zsolid1 / ( zco3sat + rtrn ) ) / &
105            &                ( 1. + reac_cal * dtsed * zundsat(ji,jk) / ( zco3sat + rtrn ) )
106         END DO
107      END DO
108
109      psms(:,:) = 0.0
110      ! solves tridiagonal system
111      CALL sed_mat_dsri( jpksed, jwdic, -zrearat(:,:), psms(:,:), dtsed, zundsat )
112
113      ! New solid concentration values (jk=2 to jksed) for cacO3
114      DO jk = 2, jpksed
115         DO ji = 1, jpoce
116            zreasat = zrearat(ji,jk) * dtsed * zundsat(ji,jk) / ( volc(ji,jk,jscal) + rtrn )
117            solcp(ji,jk,jscal) = solcp(ji,jk,jscal) - zreasat
118            zreasat = zrearat(ji,jk) * dtsed * zundsat(ji,jk)
119            ! For DIC
120            pwcp(ji,jk,jwdic)  = pwcp(ji,jk,jwdic) + zreasat
121            ! For alkalinity
122            pwcp(ji,jk,jwalk)  = pwcp(ji,jk,jwalk) + 2.* zreasat
123         ENDDO
124      ENDDO
125
126
127      IF( ln_timing )  CALL timing_stop('sed_inorg')
128!     
129   END SUBROUTINE sed_inorg
130
131END MODULE sedinorg
Note: See TracBrowser for help on using the repository browser.