p4zlys.F90 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  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
  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 p4zche ! Chemical model
  26. USE iom ! I/O manager
  27. IMPLICIT NONE
  28. PRIVATE
  29. PUBLIC p4z_lys ! called in trcsms_pisces.F90
  30. PUBLIC p4z_lys_init ! called in trcsms_pisces.F90
  31. !! * Shared module variables
  32. REAL(wp), PUBLIC :: kdca !: diss. rate constant calcite
  33. REAL(wp), PUBLIC :: nca !: order of reaction for calcite dissolution
  34. !! * Module variables
  35. REAL(wp) :: calcon = 1.03E-2 !: mean calcite concentration [Ca2+] in sea water [mole/kg solution]
  36. INTEGER :: rmtss !: number of seconds per month
  37. !!----------------------------------------------------------------------
  38. !! NEMO/TOP 3.3 , NEMO Consortium (2010)
  39. !! $Id: p4zlys.F90 3321 2012-03-05 17:10:55Z cetlod $
  40. !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt)
  41. !!----------------------------------------------------------------------
  42. CONTAINS
  43. SUBROUTINE p4z_lys( kt, knt )
  44. !!---------------------------------------------------------------------
  45. !! *** ROUTINE p4z_lys ***
  46. !!
  47. !! ** Purpose : CALCULATES DEGREE OF CACO3 SATURATION IN THE WATER
  48. !! COLUMN, DISSOLUTION/PRECIPITATION OF CACO3 AND LOSS
  49. !! OF CACO3 TO THE CACO3 SEDIMENT POOL.
  50. !!
  51. !! ** Method : - ???
  52. !!---------------------------------------------------------------------
  53. !
  54. INTEGER, INTENT(in) :: kt, knt ! ocean time step
  55. INTEGER :: ji, jj, jk
  56. REAL(wp) :: zdispot, zfact, zcalcon
  57. REAL(wp) :: zomegaca, zexcess, zexcess0
  58. CHARACTER (len=25) :: charout
  59. REAL(wp), POINTER, DIMENSION(:,:,:) :: zco3, zco3sat, zcaldiss, zhinit, zhi
  60. !!---------------------------------------------------------------------
  61. !
  62. IF( nn_timing == 1 ) CALL timing_start('p4z_lys')
  63. !
  64. CALL wrk_alloc( jpi, jpj, jpk, zco3, zco3sat, zcaldiss, zhinit, zhi )
  65. !
  66. zco3 (:,:,:) = 0.
  67. zcaldiss(:,:,:) = 0.
  68. zhinit(:,:,:) = hi(:,:,:) * 1000. / ( rhop(:,:,:) + rtrn )
  69. ! -------------------------------------------
  70. ! COMPUTE [CO3--] and [H+] CONCENTRATIONS
  71. ! -------------------------------------------
  72. CALL p4z_che_solve_hi( zhinit, zhi )
  73. DO jk = 1, jpkm1
  74. DO jj = 1, jpj
  75. DO ji = 1, jpi
  76. zco3(ji,jj,jk) = trb(ji,jj,jk,jpdic) * ak13(ji,jj,jk) * ak23(ji,jj,jk) / (zhi(ji,jj,jk)**2 &
  77. & + ak13(ji,jj,jk) * zhi(ji,jj,jk) + ak13(ji,jj,jk) * ak23(ji,jj,jk) + rtrn )
  78. hi(ji,jj,jk) = zhi(ji,jj,jk) * rhop(ji,jj,jk) / 1000.
  79. END DO
  80. END DO
  81. END DO
  82. ! ---------------------------------------------------------
  83. ! CALCULATE DEGREE OF CACO3 SATURATION AND CORRESPONDING
  84. ! DISSOLOUTION AND PRECIPITATION OF CACO3 (BE AWARE OF
  85. ! MGCO3)
  86. ! ---------------------------------------------------------
  87. DO jk = 1, jpkm1
  88. DO jj = 1, jpj
  89. DO ji = 1, jpi
  90. ! DEVIATION OF [CO3--] FROM SATURATION VALUE
  91. ! Salinity dependance in zomegaca and divide by rhop/1000 to have good units
  92. zcalcon = calcon * ( tsn(ji,jj,jk,jp_sal) / 35._wp )
  93. zfact = rhop(ji,jj,jk) / 1000._wp
  94. zomegaca = ( zcalcon * zco3(ji,jj,jk) ) / ( aksp(ji,jj,jk) * zfact + rtrn )
  95. zco3sat(ji,jj,jk) = aksp(ji,jj,jk) * zfact / ( zcalcon + rtrn )
  96. ! SET DEGREE OF UNDER-/SUPERSATURATION
  97. excess(ji,jj,jk) = 1._wp - zomegaca
  98. zexcess0 = MAX( 0., excess(ji,jj,jk) )
  99. zexcess = zexcess0**nca
  100. ! AMOUNT CACO3 (12C) THAT RE-ENTERS SOLUTION
  101. ! (ACCORDING TO THIS FORMULATION ALSO SOME PARTICULATE
  102. ! CACO3 GETS DISSOLVED EVEN IN THE CASE OF OVERSATURATION)
  103. zdispot = kdca * zexcess * trb(ji,jj,jk,jpcal)
  104. # if defined key_degrad
  105. zdispot = zdispot * facvol(ji,jj,jk)
  106. # endif
  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. tra(ji,jj,jk,jptal) = tra(ji,jj,jk,jptal) + 2. * zcaldiss(ji,jj,jk)
  112. tra(ji,jj,jk,jpcal) = tra(ji,jj,jk,jpcal) - zcaldiss(ji,jj,jk)
  113. tra(ji,jj,jk,jpdic) = tra(ji,jj,jk,jpdic) + zcaldiss(ji,jj,jk)
  114. END DO
  115. END DO
  116. END DO
  117. !
  118. IF( lk_iomput .AND. knt == nrdttrc ) THEN
  119. IF( iom_use( "PH" ) ) CALL iom_put( "PH" , -1. * LOG10( MAX( rtrn, hi(:,:,:) ) ) * tmask(:,:,:) )
  120. IF( iom_use( "CO3" ) ) CALL iom_put( "CO3" , zco3(:,:,:) * 1.e+3 * tmask(:,:,:) )
  121. IF( iom_use( "CO3sat" ) ) CALL iom_put( "CO3sat", zco3sat(:,:,:) * 1.e+3 * tmask(:,:,:) )
  122. IF( iom_use( "DCAL" ) ) CALL iom_put( "DCAL" , zcaldiss(:,:,:) * 1.e+3 * rfact2r * tmask(:,:,:) )
  123. ELSE
  124. IF( ln_diatrc ) THEN
  125. trc3d(:,:,:,jp_pcs0_3d ) = -1. * LOG10( hi(:,:,:) ) * tmask(:,:,:)
  126. trc3d(:,:,:,jp_pcs0_3d + 1) = zco3(:,:,:) * tmask(:,:,:)
  127. trc3d(:,:,:,jp_pcs0_3d + 2) = zco3sat(:,:,:) * tmask(:,:,:)
  128. ENDIF
  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. CALL wrk_dealloc( jpi, jpj, jpk, zco3, zcaldiss, zhinit, zhi, zco3sat )
  138. !
  139. IF( nn_timing == 1 ) CALL timing_stop('p4z_lys')
  140. !
  141. END SUBROUTINE p4z_lys
  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 output status for namelist read
  155. NAMELIST/nampiscal/ kdca, nca
  156. !!----------------------------------------------------------------------
  157. REWIND( numnatp_ref ) ! Namelist nampiscal in reference namelist : Pisces CaCO3 dissolution
  158. READ ( numnatp_ref, nampiscal, IOSTAT = ios, ERR = 901)
  159. 901 IF( ios /= 0 ) CALL ctl_nam ( ios , 'nampiscal in reference namelist', lwp )
  160. REWIND( numnatp_cfg ) ! Namelist nampiscal in configuration namelist : Pisces CaCO3 dissolution
  161. READ ( numnatp_cfg, nampiscal, IOSTAT = ios, ERR = 902 )
  162. 902 IF( ios /= 0 ) CALL ctl_nam ( ios , 'nampiscal in configuration namelist', lwp )
  163. IF(lwm) WRITE ( numonp, nampiscal )
  164. IF(lwp) THEN ! control print
  165. WRITE(numout,*) ' '
  166. WRITE(numout,*) ' Namelist parameters for CaCO3 dissolution, nampiscal'
  167. WRITE(numout,*) ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~'
  168. WRITE(numout,*) ' diss. rate constant calcite (per month) kdca =', kdca
  169. WRITE(numout,*) ' order of reaction for calcite dissolution nca =', nca
  170. ENDIF
  171. ! Number of seconds per month
  172. rmtss = nyear_len(1) * rday / raamo
  173. !
  174. END SUBROUTINE p4z_lys_init
  175. #else
  176. !!======================================================================
  177. !! Dummy module : No PISCES bio-model
  178. !!======================================================================
  179. CONTAINS
  180. SUBROUTINE p4z_lys( kt ) ! Empty routine
  181. INTEGER, INTENT( in ) :: kt
  182. WRITE(*,*) 'p4z_lys: You should not have seen this print! error?', kt
  183. END SUBROUTINE p4z_lys
  184. #endif
  185. !!======================================================================
  186. END MODULE p4zlys