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/trunk/src/TOP/PISCES/P4Z – NEMO

source: NEMO/trunk/src/TOP/PISCES/P4Z/p4zlys.F90 @ 12587

Last change on this file since 12587 was 12377, checked in by acc, 4 years ago

The big one. Merging all 2019 developments from the option 1 branch back onto the trunk.

This changeset reproduces 2019/dev_r11943_MERGE_2019 on the trunk using a 2-URL merge
onto a working copy of the trunk. I.e.:

svn merge --ignore-ancestry \

svn+ssh://acc@forge.ipsl.jussieu.fr/ipsl/forge/projets/nemo/svn/NEMO/trunk \
svn+ssh://acc@forge.ipsl.jussieu.fr/ipsl/forge/projets/nemo/svn/NEMO/branches/2019/dev_r11943_MERGE_2019 ./

The --ignore-ancestry flag avoids problems that may otherwise arise from the fact that
the merge history been trunk and branch may have been applied in a different order but
care has been taken before this step to ensure that all applicable fixes and updates
are present in the merge branch.

The trunk state just before this step has been branched to releases/release-4.0-HEAD
and that branch has been immediately tagged as releases/release-4.0.2. Any fixes
or additions in response to tickets on 4.0, 4.0.1 or 4.0.2 should be done on
releases/release-4.0-HEAD. From now on future 'point' releases (e.g. 4.0.2) will
remain unchanged with periodic releases as needs demand. Note release-4.0-HEAD is a
transitional naming convention. Future full releases, say 4.2, will have a release-4.2
branch which fulfills this role and the first point release (e.g. 4.2.0) will be made
immediately following the release branch creation.

2020 developments can be started from any trunk revision later than this one.

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