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.
p4zlys.F90 in branches/2015/dev_r5803_NOC_WAD/NEMOGCM/NEMO/TOP_SRC/PISCES/P4Z – NEMO

source: branches/2015/dev_r5803_NOC_WAD/NEMOGCM/NEMO/TOP_SRC/PISCES/P4Z/p4zlys.F90 @ 5870

Last change on this file since 5870 was 5870, checked in by acc, 8 years ago

Branch 2015/dev_r5803_NOC_WAD. Merge in trunk changes from 5803 to 5869 in preparation for merge. Also tidied and reorganised some wetting and drying code. Renamed wadlmt.F90 to wetdry.F90. Wetting drying code changes restricted to domzgr.F90, domvvl.F90 nemogcm.F90 sshwzv.F90, dynspg_ts.F90, wetdry.F90 and dynhpg.F90. Code passes full SETTE tests with ln_wd=.false.. Still awaiting test case for checking with ln_wd=.false.

File size: 10.1 KB
Line 
1MODULE p4zlys
2   !!======================================================================
3   !!                         ***  MODULE p4zlys  ***
4   !! TOP :   PISCES
5   !!======================================================================
6   !! History :    -   !  1988-07  (E. MAIER-REIMER) Original code
7   !!              -   !  1998     (O. Aumont) additions
8   !!              -   !  1999     (C. Le Quere) modifications
9   !!             1.0  !  2004     (O. Aumont) modifications
10   !!             2.0  !  2007-12  (C. Ethe, G. Madec)  F90
11   !!                  !  2011-02  (J. Simeon, J. Orr)  Calcon salinity dependence
12   !!             3.4  !  2011-06  (O. Aumont, C. Ethe) Improvment of calcite dissolution
13   !!----------------------------------------------------------------------
14#if defined key_pisces
15   !!----------------------------------------------------------------------
16   !!   'key_pisces'                                       PISCES bio-model
17   !!----------------------------------------------------------------------
18   !!   p4z_lys        :   Compute the CaCO3 dissolution
19   !!   p4z_lys_init   :   Read the namelist parameters
20   !!----------------------------------------------------------------------
21   USE oce_trc         !  shared variables between ocean and passive tracers
22   USE trc             !  passive tracers common variables
23   USE sms_pisces      !  PISCES Source Minus Sink variables
24   USE prtctl_trc      !  print control for debugging
25   USE iom             !  I/O manager
26
27   IMPLICIT NONE
28   PRIVATE
29
30   PUBLIC   p4z_lys         ! called in trcsms_pisces.F90
31   PUBLIC   p4z_lys_init    ! called in trcsms_pisces.F90
32
33   !! * Shared module variables
34   REAL(wp), PUBLIC :: kdca !: diss. rate constant calcite
35   REAL(wp), PUBLIC :: nca  !: order of reaction for calcite dissolution
36
37   !! * Module variables
38   REAL(wp) :: calcon = 1.03E-2           !: mean calcite concentration [Ca2+] in sea water [mole/kg solution]
39 
40   INTEGER  :: rmtss                      !: number of seconds per month
41
42   !!----------------------------------------------------------------------
43   !! NEMO/TOP 3.3 , NEMO Consortium (2010)
44   !! $Id: p4zlys.F90 3321 2012-03-05 17:10:55Z cetlod $
45   !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt)
46   !!----------------------------------------------------------------------
47
48CONTAINS
49
50   SUBROUTINE p4z_lys( kt, knt )
51      !!---------------------------------------------------------------------
52      !!                     ***  ROUTINE p4z_lys  ***
53      !!
54      !! ** Purpose :   CALCULATES DEGREE OF CACO3 SATURATION IN THE WATER
55      !!                COLUMN, DISSOLUTION/PRECIPITATION OF CACO3 AND LOSS
56      !!                OF CACO3 TO THE CACO3 SEDIMENT POOL.
57      !!
58      !! ** Method  : - ???
59      !!---------------------------------------------------------------------
60      !
61      INTEGER, INTENT(in) ::   kt, knt ! ocean time step
62      INTEGER  ::   ji, jj, jk, jn
63      REAL(wp) ::   zalk, zdic, zph, zah2
64      REAL(wp) ::   zdispot, zfact, zcalcon, zalka, zaldi
65      REAL(wp) ::   zomegaca, zexcess, zexcess0
66      CHARACTER (len=25) :: charout
67      REAL(wp), POINTER, DIMENSION(:,:,:) :: zco3, zcaldiss   
68      !!---------------------------------------------------------------------
69      !
70      IF( nn_timing == 1 )  CALL timing_start('p4z_lys')
71      !
72      CALL wrk_alloc( jpi, jpj, jpk, zco3, zcaldiss )
73      !
74      zco3    (:,:,:) = 0.
75      zcaldiss(:,:,:) = 0.
76      !     -------------------------------------------
77      !     COMPUTE [CO3--] and [H+] CONCENTRATIONS
78      !     -------------------------------------------
79     
80      DO jn = 1, 5                               !  BEGIN OF ITERATION
81         !
82         DO jk = 1, jpkm1
83            DO jj = 1, jpj
84               DO ji = 1, jpi
85                  zfact = rhop(ji,jj,jk) / 1000. + rtrn
86                  zph  = hi(ji,jj,jk) * tmask(ji,jj,jk) / zfact + ( 1.-tmask(ji,jj,jk) ) * 1.e-9 ! [H+]
87                  zdic  = trb(ji,jj,jk,jpdic) / zfact
88                  zalka = trb(ji,jj,jk,jptal) / zfact
89                  ! CALCULATE [ALK]([CO3--], [HCO3-])
90                  zalk  = zalka - ( akw3(ji,jj,jk) / zph - zph + borat(ji,jj,jk) / ( 1. + zph / akb3(ji,jj,jk) ) )
91                  ! CALCULATE [H+] and [CO3--]
92                  zaldi = zdic - zalk
93                  zah2  = SQRT( zaldi * zaldi + 4.* ( zalk * ak23(ji,jj,jk) / ak13(ji,jj,jk) ) * ( zdic + zaldi ) )
94                  zah2  = 0.5 * ak13(ji,jj,jk) / zalk * ( zaldi + zah2 )
95                  !
96                  zco3(ji,jj,jk) = zalk / ( 2. + zah2 / ak23(ji,jj,jk) ) * zfact
97                  hi(ji,jj,jk)   = zah2 * zfact
98               END DO
99            END DO
100         END DO
101         !
102      END DO 
103
104      !     ---------------------------------------------------------
105      !        CALCULATE DEGREE OF CACO3 SATURATION AND CORRESPONDING
106      !        DISSOLOUTION AND PRECIPITATION OF CACO3 (BE AWARE OF
107      !        MGCO3)
108      !     ---------------------------------------------------------
109
110      DO jk = 1, jpkm1
111         DO jj = 1, jpj
112            DO ji = 1, jpi
113
114               ! DEVIATION OF [CO3--] FROM SATURATION VALUE
115               ! Salinity dependance in zomegaca and divide by rhop/1000 to have good units
116               zcalcon  = calcon * ( tsn(ji,jj,jk,jp_sal) / 35._wp )
117               zfact    = rhop(ji,jj,jk) / 1000._wp
118               zomegaca = ( zcalcon * zco3(ji,jj,jk) * zfact ) / aksp(ji,jj,jk) 
119
120               ! SET DEGREE OF UNDER-/SUPERSATURATION
121               excess(ji,jj,jk) = 1._wp - zomegaca
122               zexcess0 = MAX( 0., excess(ji,jj,jk) )
123               zexcess  = zexcess0**nca
124
125               ! AMOUNT CACO3 (12C) THAT RE-ENTERS SOLUTION
126               !       (ACCORDING TO THIS FORMULATION ALSO SOME PARTICULATE
127               !       CACO3 GETS DISSOLVED EVEN IN THE CASE OF OVERSATURATION)
128               zdispot = kdca * zexcess * trb(ji,jj,jk,jpcal)
129# if defined key_degrad
130               zdispot = zdispot * facvol(ji,jj,jk)
131# endif
132              !  CHANGE OF [CO3--] , [ALK], PARTICULATE [CACO3],
133              !       AND [SUM(CO2)] DUE TO CACO3 DISSOLUTION/PRECIPITATION
134              zcaldiss(ji,jj,jk)  = zdispot * rfact2 / rmtss ! calcite dissolution
135              zco3(ji,jj,jk)      = zco3(ji,jj,jk) + zcaldiss(ji,jj,jk)
136              !
137              tra(ji,jj,jk,jptal) = tra(ji,jj,jk,jptal) + 2. * zcaldiss(ji,jj,jk)
138              tra(ji,jj,jk,jpcal) = tra(ji,jj,jk,jpcal) -      zcaldiss(ji,jj,jk)
139              tra(ji,jj,jk,jpdic) = tra(ji,jj,jk,jpdic) +      zcaldiss(ji,jj,jk)
140            END DO
141         END DO
142      END DO
143      !
144
145      IF( lk_iomput .AND. knt == nrdttrc ) THEN
146         IF( iom_use( "PH"     ) ) CALL iom_put( "PH"    , -1. * LOG10( hi(:,:,:) )          * tmask(:,:,:) )
147         IF( iom_use( "CO3"    ) ) CALL iom_put( "CO3"   , zco3(:,:,:) * 1.e+3               * tmask(:,:,:) )
148         IF( iom_use( "CO3sat" ) ) CALL iom_put( "CO3sat", aksp(:,:,:) * 1.e+3 / calcon      * tmask(:,:,:) )
149         IF( iom_use( "DCAL"   ) ) CALL iom_put( "DCAL"  , zcaldiss(:,:,:) * 1.e+3 * rfact2r   * tmask(:,:,:) )
150      ELSE
151         trc3d(:,:,:,jp_pcs0_3d    ) = -1. * LOG10( hi(:,:,:) ) * tmask(:,:,:)
152         trc3d(:,:,:,jp_pcs0_3d + 1) = zco3(:,:,:)              * tmask(:,:,:)
153         trc3d(:,:,:,jp_pcs0_3d + 2) = aksp(:,:,:) / calcon     * tmask(:,:,:)
154      ENDIF
155      !
156      IF(ln_ctl)   THEN  ! print mean trends (used for debugging)
157        WRITE(charout, FMT="('lys ')")
158        CALL prt_ctl_trc_info(charout)
159        CALL prt_ctl_trc(tab4d=tra, mask=tmask, clinfo=ctrcnm)
160      ENDIF
161      !
162      CALL wrk_dealloc( jpi, jpj, jpk, zco3, zcaldiss )
163      !
164      IF( nn_timing == 1 )  CALL timing_stop('p4z_lys')
165      !
166   END SUBROUTINE p4z_lys
167
168   SUBROUTINE p4z_lys_init
169
170      !!----------------------------------------------------------------------
171      !!                  ***  ROUTINE p4z_lys_init  ***
172      !!
173      !! ** Purpose :   Initialization of CaCO3 dissolution parameters
174      !!
175      !! ** Method  :   Read the nampiscal namelist and check the parameters
176      !!      called at the first timestep (nittrc000)
177      !!
178      !! ** input   :   Namelist nampiscal
179      !!
180      !!----------------------------------------------------------------------
181      INTEGER  ::  ji, jj, jk
182      INTEGER  ::  ios                 ! Local integer output status for namelist read
183      REAL(wp) ::  zcaralk, zbicarb, zco3
184      REAL(wp) ::  ztmas, ztmas1
185
186      NAMELIST/nampiscal/ kdca, nca
187      !!----------------------------------------------------------------------
188
189      REWIND( numnatp_ref )              ! Namelist nampiscal in reference namelist : Pisces CaCO3 dissolution
190      READ  ( numnatp_ref, nampiscal, IOSTAT = ios, ERR = 901)
191901   IF( ios /= 0 ) CALL ctl_nam ( ios , 'nampiscal in reference namelist', lwp )
192
193      REWIND( numnatp_cfg )              ! Namelist nampiscal in configuration namelist : Pisces CaCO3 dissolution
194      READ  ( numnatp_cfg, nampiscal, IOSTAT = ios, ERR = 902 )
195902   IF( ios /= 0 ) CALL ctl_nam ( ios , 'nampiscal in configuration namelist', lwp )
196      IF(lwm) WRITE ( numonp, nampiscal )
197
198      IF(lwp) THEN                         ! control print
199         WRITE(numout,*) ' '
200         WRITE(numout,*) ' Namelist parameters for CaCO3 dissolution, nampiscal'
201         WRITE(numout,*) ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~'
202         WRITE(numout,*) '    diss. rate constant calcite (per month)   kdca      =', kdca
203         WRITE(numout,*) '    order of reaction for calcite dissolution nca       =', nca
204      ENDIF
205
206      ! Number of seconds per month
207      rmtss =  nyear_len(1) * rday / raamo
208      !
209   END SUBROUTINE p4z_lys_init
210
211#else
212   !!======================================================================
213   !!  Dummy module :                                   No PISCES bio-model
214   !!======================================================================
215CONTAINS
216   SUBROUTINE p4z_lys( kt )                   ! Empty routine
217      INTEGER, INTENT( in ) ::   kt
218      WRITE(*,*) 'p4z_lys: You should not have seen this print! error?', kt
219   END SUBROUTINE p4z_lys
220#endif 
221   !!======================================================================
222END MODULE p4zlys
Note: See TracBrowser for help on using the repository browser.