[3443] | 1 | MODULE 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 |
---|
[13899] | 22 | USE prtctl ! print control for debugging |
---|
[3443] | 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 | |
---|
| 45 | CONTAINS |
---|
| 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 | |
---|
[13899] | 77 | DO_3D( 1, 1, 1, 1, 1, jpkm1 ) |
---|
[12377] | 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 | |
---|
[13899] | 89 | DO_3D( 1, 1, 1, 1, 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 ')") |
---|
[13899] | 132 | CALL prt_ctl_info( charout, cdcomp = 'top' ) |
---|
| 133 | CALL prt_ctl(tab4d_1=tr(:,:,:,:,Krhs), mask1=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] | 164 | 901 IF( ios /= 0 ) CALL ctl_nam ( ios , 'nampiscal in reference namelist' ) |
---|
[4147] | 165 | READ ( numnatp_cfg, nampiscal, IOSTAT = ios, ERR = 902 ) |
---|
[11536] | 166 | 902 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] | 181 | END MODULE p4zlys |
---|