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 NEMO/branches/2019/dev_r11613_ENHANCE-04_namelists_as_internalfiles/src/TOP/PISCES/P4Z – NEMO

source: NEMO/branches/2019/dev_r11613_ENHANCE-04_namelists_as_internalfiles/src/TOP/PISCES/P4Z/p4zlys.F90 @ 11671

Last change on this file since 11671 was 11671, checked in by acc, 5 years ago

Branch 2019/dev_r11613_ENHANCE-04_namelists_as_internalfiles. Final, non-substantive changes to complete this branch. These changes remove all REWIND statements on the old namelist fortran units (now character variables for internal files). These changes have been left until last since they are easily repeated via a script and it may be preferable to use the previous revision for merge purposes and reapply these last changes separately. This branch has been fully SETTE tested.

  • Property svn:keywords set to Id
File size: 8.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   !!             3.6  !  2015-05  (O. Aumont) PISCES quota
14   !!----------------------------------------------------------------------
15   !!   p4z_lys        :   Compute the CaCO3 dissolution
16   !!   p4z_lys_init   :   Read the namelist parameters
17   !!----------------------------------------------------------------------
18   USE oce_trc         !  shared variables between ocean and passive tracers
19   USE trc             !  passive tracers common variables
20   USE sms_pisces      !  PISCES Source Minus Sink variables
21   USE p4zche          !  Chemical model
22   USE prtctl_trc      !  print control for debugging
23   USE iom             !  I/O manager
24
25   IMPLICIT NONE
26   PRIVATE
27
28   PUBLIC   p4z_lys         ! called in trcsms_pisces.F90
29   PUBLIC   p4z_lys_init    ! called in trcsms_pisces.F90
30
31   REAL(wp), PUBLIC ::   kdca   !: diss. rate constant calcite
32   REAL(wp), PUBLIC ::   nca    !: order of reaction for calcite dissolution
33
34   INTEGER  ::   rmtss              ! number of seconds per month
35   REAL(wp) ::   calcon = 1.03E-2   ! mean calcite concentration [Ca2+] in sea water [mole/kg solution]
36 
37   !!----------------------------------------------------------------------
38   !! NEMO/TOP 4.0 , NEMO Consortium (2018)
39   !! $Id$
40   !! Software governed by the CeCILL license (see ./LICENSE)
41   !!----------------------------------------------------------------------
42
43CONTAINS
44
45   SUBROUTINE p4z_lys( kt, knt )
46      !!---------------------------------------------------------------------
47      !!                     ***  ROUTINE p4z_lys  ***
48      !!
49      !! ** Purpose :   CALCULATES DEGREE OF CACO3 SATURATION IN THE WATER
50      !!                COLUMN, DISSOLUTION/PRECIPITATION OF CACO3 AND LOSS
51      !!                OF CACO3 TO THE CACO3 SEDIMENT POOL.
52      !!
53      !! ** Method  : - ???
54      !!---------------------------------------------------------------------
55      INTEGER, INTENT(in) ::   kt, knt   ! ocean time step and ???
56      !
57      INTEGER  ::   ji, jj, jk, jn
58      REAL(wp) ::   zdispot, zfact, zcalcon
59      REAL(wp) ::   zomegaca, zexcess, zexcess0
60      CHARACTER (len=25) ::   charout
61      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   zco3, zcaldiss, zhinit, zhi, zco3sat
62      !!---------------------------------------------------------------------
63      !
64      IF( ln_timing )  CALL timing_start('p4z_lys')
65      !
66      zco3    (:,:,:) = 0.
67      zcaldiss(:,:,:) = 0.
68      zhinit  (:,:,:) = hi(:,:,:) * 1000. / ( rhop(:,:,:) + rtrn )
69      !
70      !     -------------------------------------------
71      !     COMPUTE [CO3--] and [H+] CONCENTRATIONS
72      !     -------------------------------------------
73
74      CALL solve_at_general( zhinit, zhi )
75
76      DO jk = 1, jpkm1
77         DO jj = 1, jpj
78            DO ji = 1, jpi
79               zco3(ji,jj,jk) = trb(ji,jj,jk,jpdic) * ak13(ji,jj,jk) * ak23(ji,jj,jk) / (zhi(ji,jj,jk)**2   &
80                  &             + ak13(ji,jj,jk) * zhi(ji,jj,jk) + ak13(ji,jj,jk) * ak23(ji,jj,jk) + rtrn )
81               hi  (ji,jj,jk) = zhi(ji,jj,jk) * rhop(ji,jj,jk) / 1000.
82            END DO
83         END DO
84      END DO
85
86      !     ---------------------------------------------------------
87      !        CALCULATE DEGREE OF CACO3 SATURATION AND CORRESPONDING
88      !        DISSOLOUTION AND PRECIPITATION OF CACO3 (BE AWARE OF
89      !        MGCO3)
90      !     ---------------------------------------------------------
91
92      DO jk = 1, jpkm1
93         DO jj = 1, jpj
94            DO ji = 1, jpi
95
96               ! DEVIATION OF [CO3--] FROM SATURATION VALUE
97               ! Salinity dependance in zomegaca and divide by rhop/1000 to have good units
98               zcalcon  = calcon * ( salinprac(ji,jj,jk) / 35._wp )
99               zfact    = rhop(ji,jj,jk) / 1000._wp
100               zomegaca = ( zcalcon * zco3(ji,jj,jk) ) / ( aksp(ji,jj,jk) * zfact + rtrn )
101               zco3sat(ji,jj,jk) = aksp(ji,jj,jk) * zfact / ( zcalcon + rtrn )
102
103               ! SET DEGREE OF UNDER-/SUPERSATURATION
104               excess(ji,jj,jk) = 1._wp - zomegaca
105               zexcess0 = MAX( 0., excess(ji,jj,jk) )
106               zexcess  = zexcess0**nca
107
108               ! AMOUNT CACO3 (12C) THAT RE-ENTERS SOLUTION
109               !       (ACCORDING TO THIS FORMULATION ALSO SOME PARTICULATE
110               !       CACO3 GETS DISSOLVED EVEN IN THE CASE OF OVERSATURATION)
111               zdispot = kdca * zexcess * trb(ji,jj,jk,jpcal)
112              !  CHANGE OF [CO3--] , [ALK], PARTICULATE [CACO3],
113              !       AND [SUM(CO2)] DUE TO CACO3 DISSOLUTION/PRECIPITATION
114              zcaldiss(ji,jj,jk)  = zdispot * rfact2 / rmtss ! calcite dissolution
115              !
116              tra(ji,jj,jk,jptal) = tra(ji,jj,jk,jptal) + 2. * zcaldiss(ji,jj,jk)
117              tra(ji,jj,jk,jpcal) = tra(ji,jj,jk,jpcal) -      zcaldiss(ji,jj,jk)
118              tra(ji,jj,jk,jpdic) = tra(ji,jj,jk,jpdic) +      zcaldiss(ji,jj,jk)
119            END DO
120         END DO
121      END DO
122      !
123
124      IF( lk_iomput .AND. knt == nrdttrc ) THEN
125         IF( iom_use( "PH"     ) ) CALL iom_put( "PH"    , -1. * LOG10( MAX( hi(:,:,:), rtrn ) ) * tmask(:,:,:) )
126         IF( iom_use( "CO3"    ) ) CALL iom_put( "CO3"   , zco3(:,:,:)     * 1.e+3               * tmask(:,:,:) )
127         IF( iom_use( "CO3sat" ) ) CALL iom_put( "CO3sat", zco3sat(:,:,:)  * 1.e+3               * tmask(:,:,:) )
128         IF( iom_use( "DCAL"   ) ) CALL iom_put( "DCAL"  , zcaldiss(:,:,:) * 1.e+3 * rfact2r     * tmask(:,:,:) )
129      ENDIF
130      !
131      IF(ln_ctl)   THEN  ! print mean trends (used for debugging)
132        WRITE(charout, FMT="('lys ')")
133        CALL prt_ctl_trc_info(charout)
134        CALL prt_ctl_trc(tab4d=tra, mask=tmask, clinfo=ctrcnm)
135      ENDIF
136      !
137      IF( ln_timing )   CALL timing_stop('p4z_lys')
138      !
139   END SUBROUTINE p4z_lys
140
141
142   SUBROUTINE p4z_lys_init
143      !!----------------------------------------------------------------------
144      !!                  ***  ROUTINE p4z_lys_init  ***
145      !!
146      !! ** Purpose :   Initialization of CaCO3 dissolution parameters
147      !!
148      !! ** Method  :   Read the nampiscal namelist and check the parameters
149      !!      called at the first timestep (nittrc000)
150      !!
151      !! ** input   :   Namelist nampiscal
152      !!
153      !!----------------------------------------------------------------------
154      INTEGER ::   ios   ! Local integer
155      !
156      NAMELIST/nampiscal/ kdca, nca
157      !!----------------------------------------------------------------------
158      IF(lwp) THEN
159         WRITE(numout,*)
160         WRITE(numout,*) 'p4z_lys_init : initialization of CaCO3 dissolution'
161         WRITE(numout,*) '~~~~~~~~~~~~'
162      ENDIF
163      !
164      READ  ( numnatp_ref, nampiscal, IOSTAT = ios, ERR = 901)
165901   IF( ios /= 0 )   CALL ctl_nam ( ios , 'nampiscal in reference namelist' )
166      READ  ( numnatp_cfg, nampiscal, IOSTAT = ios, ERR = 902 )
167902   IF( ios >  0 )   CALL ctl_nam ( ios , 'nampiscal in configuration namelist' )
168      IF(lwm) WRITE( numonp, nampiscal )
169      !
170      IF(lwp) THEN                         ! control print
171         WRITE(numout,*) '   Namelist : nampiscal'
172         WRITE(numout,*) '      diss. rate constant calcite (per month)        kdca =', kdca
173         WRITE(numout,*) '      order of reaction for calcite dissolution      nca  =', nca
174      ENDIF
175      !
176      ! Number of seconds per month
177      rmtss =  nyear_len(1) * rday / raamo
178      !
179   END SUBROUTINE p4z_lys_init
180
181   !!======================================================================
182END MODULE p4zlys
Note: See TracBrowser for help on using the repository browser.