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 trunk/NEMOGCM/NEMO/TOP_SRC/PISCES/P4Z – NEMO

source: trunk/NEMOGCM/NEMO/TOP_SRC/PISCES/P4Z/p4zlys.F90 @ 4624

Last change on this file since 4624 was 4624, checked in by acc, 10 years ago

#1305. Fix slow start-up problems on some systems by introducing and using lwm logical to restrict output of merged namelists to the first (or only) processor. lwm is true only on the first processor regardless of ln_ctl. Small changes to all flavours of nemogcm.F90 are also required to write namctl and namcfg after the call to mynode which now opens output.namelist.dyn and writes nammpp.

File size: 10.2 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 )
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 ! 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      REAL(wp) ::   zrfact2
67      CHARACTER (len=25) :: charout
68      REAL(wp), POINTER, DIMENSION(:,:,:) :: zco3, zcaldiss   
69      !!---------------------------------------------------------------------
70      !
71      IF( nn_timing == 1 )  CALL timing_start('p4z_lys')
72      !
73      CALL wrk_alloc( jpi, jpj, jpk, zco3, zcaldiss )
74      !
75      zco3    (:,:,:) = 0.
76      zcaldiss(:,:,:) = 0.
77      !     -------------------------------------------
78      !     COMPUTE [CO3--] and [H+] CONCENTRATIONS
79      !     -------------------------------------------
80     
81      DO jn = 1, 5                               !  BEGIN OF ITERATION
82         !
83!CDIR NOVERRCHK
84         DO jk = 1, jpkm1
85!CDIR NOVERRCHK
86            DO jj = 1, jpj
87!CDIR NOVERRCHK
88               DO ji = 1, jpi
89                  zfact = rhop(ji,jj,jk) / 1000. + rtrn
90                  zph  = hi(ji,jj,jk) * tmask(ji,jj,jk) / zfact + ( 1.-tmask(ji,jj,jk) ) * 1.e-9 ! [H+]
91                  zdic  = trn(ji,jj,jk,jpdic) / zfact
92                  zalka = trn(ji,jj,jk,jptal) / zfact
93                  ! CALCULATE [ALK]([CO3--], [HCO3-])
94                  zalk  = zalka - ( akw3(ji,jj,jk) / zph - zph + borat(ji,jj,jk) / ( 1. + zph / akb3(ji,jj,jk) ) )
95                  ! CALCULATE [H+] and [CO3--]
96                  zaldi = zdic - zalk
97                  zah2  = SQRT( zaldi * zaldi + 4.* ( zalk * ak23(ji,jj,jk) / ak13(ji,jj,jk) ) * ( zdic + zaldi ) )
98                  zah2  = 0.5 * ak13(ji,jj,jk) / zalk * ( zaldi + zah2 )
99                  !
100                  zco3(ji,jj,jk) = zalk / ( 2. + zah2 / ak23(ji,jj,jk) ) * zfact
101                  hi(ji,jj,jk)   = zah2 * zfact
102               END DO
103            END DO
104         END DO
105         !
106      END DO 
107
108      !     ---------------------------------------------------------
109      !        CALCULATE DEGREE OF CACO3 SATURATION AND CORRESPONDING
110      !        DISSOLOUTION AND PRECIPITATION OF CACO3 (BE AWARE OF
111      !        MGCO3)
112      !     ---------------------------------------------------------
113
114      DO jk = 1, jpkm1
115         DO jj = 1, jpj
116            DO ji = 1, jpi
117
118               ! DEVIATION OF [CO3--] FROM SATURATION VALUE
119               ! Salinity dependance in zomegaca and divide by rhop/1000 to have good units
120               zcalcon  = calcon * ( tsn(ji,jj,jk,jp_sal) / 35._wp )
121               zfact    = rhop(ji,jj,jk) / 1000._wp
122               zomegaca = ( zcalcon * zco3(ji,jj,jk) * zfact ) / aksp(ji,jj,jk) 
123
124               ! SET DEGREE OF UNDER-/SUPERSATURATION
125               excess(ji,jj,jk) = 1._wp - zomegaca
126               zexcess0 = MAX( 0., excess(ji,jj,jk) )
127               zexcess  = zexcess0**nca
128
129               ! AMOUNT CACO3 (12C) THAT RE-ENTERS SOLUTION
130               !       (ACCORDING TO THIS FORMULATION ALSO SOME PARTICULATE
131               !       CACO3 GETS DISSOLVED EVEN IN THE CASE OF OVERSATURATION)
132               zdispot = kdca * zexcess * trn(ji,jj,jk,jpcal)
133# if defined key_degrad
134               zdispot = zdispot * facvol(ji,jj,jk)
135# endif
136              !  CHANGE OF [CO3--] , [ALK], PARTICULATE [CACO3],
137              !       AND [SUM(CO2)] DUE TO CACO3 DISSOLUTION/PRECIPITATION
138              zcaldiss(ji,jj,jk)  = zdispot / rmtss  ! calcite dissolution
139              zco3(ji,jj,jk)      = zco3(ji,jj,jk) + zcaldiss(ji,jj,jk) * rfact
140              !
141              tra(ji,jj,jk,jptal) = tra(ji,jj,jk,jptal) + 2. * zcaldiss(ji,jj,jk)
142              tra(ji,jj,jk,jpcal) = tra(ji,jj,jk,jpcal) -      zcaldiss(ji,jj,jk)
143              tra(ji,jj,jk,jpdic) = tra(ji,jj,jk,jpdic) +      zcaldiss(ji,jj,jk)
144            END DO
145         END DO
146      END DO
147      !
148      IF( ln_diatrc )  THEN
149         !
150         IF( lk_iomput ) THEN
151            zrfact2 = 1.e3 * rfact2r
152            CALL iom_put( "PH"    , -1. * LOG10( hi(:,:,:) )                * tmask(:,:,:) )
153            CALL iom_put( "CO3"   ,        zco3    (:,:,:) * 1e+3           * tmask(:,:,:) )
154            CALL iom_put( "CO3sat",        aksp    (:,:,:) * 1e+3 / calcon  * tmask(:,:,:) )
155            CALL iom_put( "DCAL"  ,        zcaldiss(:,:,:) * zrfact2        * tmask(:,:,:) )
156         ELSE
157            trc3d(:,:,:,jp_pcs0_3d    ) = -1. * LOG10( hi(:,:,:) ) * tmask(:,:,:)
158            trc3d(:,:,:,jp_pcs0_3d + 1) = zco3(:,:,:)              * tmask(:,:,:)
159            trc3d(:,:,:,jp_pcs0_3d + 2) = aksp(:,:,:) / calcon     * tmask(:,:,:)
160         ENDIF
161         !
162      ENDIF
163      !
164      IF(ln_ctl)   THEN  ! print mean trends (used for debugging)
165        WRITE(charout, FMT="('lys ')")
166        CALL prt_ctl_trc_info(charout)
167        CALL prt_ctl_trc(tab4d=tra, mask=tmask, clinfo=ctrcnm)
168      ENDIF
169      !
170      CALL wrk_dealloc( jpi, jpj, jpk, zco3, zcaldiss )
171      !
172      IF( nn_timing == 1 )  CALL timing_stop('p4z_lys')
173      !
174   END SUBROUTINE p4z_lys
175
176   SUBROUTINE p4z_lys_init
177
178      !!----------------------------------------------------------------------
179      !!                  ***  ROUTINE p4z_lys_init  ***
180      !!
181      !! ** Purpose :   Initialization of CaCO3 dissolution parameters
182      !!
183      !! ** Method  :   Read the nampiscal namelist and check the parameters
184      !!      called at the first timestep (nittrc000)
185      !!
186      !! ** input   :   Namelist nampiscal
187      !!
188      !!----------------------------------------------------------------------
189      INTEGER  ::  ji, jj, jk
190      INTEGER  ::  ios                 ! Local integer output status for namelist read
191      REAL(wp) ::  zcaralk, zbicarb, zco3
192      REAL(wp) ::  ztmas, ztmas1
193
194      NAMELIST/nampiscal/ kdca, nca
195      !!----------------------------------------------------------------------
196
197      REWIND( numnatp_ref )              ! Namelist nampiscal in reference namelist : Pisces CaCO3 dissolution
198      READ  ( numnatp_ref, nampiscal, IOSTAT = ios, ERR = 901)
199901   IF( ios /= 0 ) CALL ctl_nam ( ios , 'nampiscal in reference namelist', lwp )
200
201      REWIND( numnatp_cfg )              ! Namelist nampiscal in configuration namelist : Pisces CaCO3 dissolution
202      READ  ( numnatp_cfg, nampiscal, IOSTAT = ios, ERR = 902 )
203902   IF( ios /= 0 ) CALL ctl_nam ( ios , 'nampiscal in configuration namelist', lwp )
204      IF(lwm) WRITE ( numonp, nampiscal )
205
206      IF(lwp) THEN                         ! control print
207         WRITE(numout,*) ' '
208         WRITE(numout,*) ' Namelist parameters for CaCO3 dissolution, nampiscal'
209         WRITE(numout,*) ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~'
210         WRITE(numout,*) '    diss. rate constant calcite (per month)   kdca      =', kdca
211         WRITE(numout,*) '    order of reaction for calcite dissolution nca       =', nca
212      ENDIF
213
214      ! Number of seconds per month
215      rmtss =  nyear_len(1) * rday / raamo
216      !
217   END SUBROUTINE p4z_lys_init
218
219#else
220   !!======================================================================
221   !!  Dummy module :                                   No PISCES bio-model
222   !!======================================================================
223CONTAINS
224   SUBROUTINE p4z_lys( kt )                   ! Empty routine
225      INTEGER, INTENT( in ) ::   kt
226      WRITE(*,*) 'p4z_lys: You should not have seen this print! error?', kt
227   END SUBROUTINE p4z_lys
228#endif 
229   !!======================================================================
230END MODULE  p4zlys
Note: See TracBrowser for help on using the repository browser.