p4zche.F90 38 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855
  1. MODULE p4zche
  2. !!======================================================================
  3. !! *** MODULE p4zche ***
  4. !! TOP : PISCES Sea water chemistry computed following OCMIP protocol
  5. !!======================================================================
  6. !! History : OPA ! 1988 (E. Maier-Reimer) Original code
  7. !! - ! 1998 (O. Aumont) addition
  8. !! - ! 1999 (C. Le Quere) modification
  9. !! NEMO 1.0 ! 2004 (O. Aumont) modification
  10. !! - ! 2006 (R. Gangsto) modification
  11. !! 2.0 ! 2007-12 (C. Ethe, G. Madec) F90
  12. !! ! 2011-02 (J. Simeon, J.Orr ) update O2 solubility constants
  13. !! 3.6 ! 2016-03 (O. Aumont) Change chemistry to MOCSY standards
  14. !!----------------------------------------------------------------------
  15. #if defined key_pisces
  16. !!----------------------------------------------------------------------
  17. !! 'key_pisces*' PISCES bio-model
  18. !!----------------------------------------------------------------------
  19. !! p4z_che : Sea water chemistry computed following OCMIP protocol
  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 lib_mpp ! MPP library
  25. USE eosbn2, ONLY : nn_eos
  26. IMPLICIT NONE
  27. PRIVATE
  28. PUBLIC p4z_che !
  29. PUBLIC p4z_che_alloc !
  30. PUBLIC p4z_che_ahini !
  31. PUBLIC p4z_che_solve_hi !
  32. REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: sio3eq ! chemistry of Si
  33. REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: fekeq ! chemistry of Fe
  34. REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: chemc ! Solubilities of O2 and CO2
  35. REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: chemo2 ! Solubilities of O2 and CO2
  36. REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:,:) :: fesol ! solubility of Fe
  37. REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: tempis ! In situ temperature
  38. REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: salinprac ! Practical salinity
  39. REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: akb3 !: ???
  40. REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: akw3 !: ???
  41. REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: akf3 !: ???
  42. REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: aks3 !: ???
  43. REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: ak1p3 !: ???
  44. REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: ak2p3 !: ???
  45. REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: ak3p3 !: ???
  46. REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: aksi3 !: ???
  47. REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: borat !: ???
  48. REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: fluorid !: ???
  49. REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: sulfat !: ???
  50. !!* Variable for chemistry of the CO2 cycle
  51. REAL(wp), PUBLIC :: atcox = 0.20946 ! units atm
  52. REAL(wp) :: o2atm = 1. / ( 1000. * 0.20946 )
  53. REAL(wp) :: rgas = 83.14472 ! universal gas constants
  54. REAL(wp) :: oxyco = 1. / 22.4144 ! converts from liters of an ideal gas to moles
  55. ! ! coeff. for seawater pressure correction : millero 95
  56. ! ! AGRIF doesn't like the DATA instruction
  57. REAL(wp) :: devk10 = -25.5
  58. REAL(wp) :: devk11 = -15.82
  59. REAL(wp) :: devk12 = -29.48
  60. REAL(wp) :: devk13 = -20.02
  61. REAL(wp) :: devk14 = -18.03
  62. REAL(wp) :: devk15 = -9.78
  63. REAL(wp) :: devk16 = -48.76
  64. REAL(wp) :: devk17 = -14.51
  65. REAL(wp) :: devk18 = -23.12
  66. REAL(wp) :: devk19 = -26.57
  67. REAL(wp) :: devk110 = -29.48
  68. !
  69. REAL(wp) :: devk20 = 0.1271
  70. REAL(wp) :: devk21 = -0.0219
  71. REAL(wp) :: devk22 = 0.1622
  72. REAL(wp) :: devk23 = 0.1119
  73. REAL(wp) :: devk24 = 0.0466
  74. REAL(wp) :: devk25 = -0.0090
  75. REAL(wp) :: devk26 = 0.5304
  76. REAL(wp) :: devk27 = 0.1211
  77. REAL(wp) :: devk28 = 0.1758
  78. REAL(wp) :: devk29 = 0.2020
  79. REAL(wp) :: devk210 = 0.1622
  80. !
  81. REAL(wp) :: devk30 = 0.
  82. REAL(wp) :: devk31 = 0.
  83. REAL(wp) :: devk32 = 2.608E-3
  84. REAL(wp) :: devk33 = -1.409e-3
  85. REAL(wp) :: devk34 = 0.316e-3
  86. REAL(wp) :: devk35 = -0.942e-3
  87. REAL(wp) :: devk36 = 0.
  88. REAL(wp) :: devk37 = -0.321e-3
  89. REAL(wp) :: devk38 = -2.647e-3
  90. REAL(wp) :: devk39 = -3.042e-3
  91. REAL(wp) :: devk310 = -2.6080e-3
  92. !
  93. REAL(wp) :: devk40 = -3.08E-3
  94. REAL(wp) :: devk41 = 1.13E-3
  95. REAL(wp) :: devk42 = -2.84E-3
  96. REAL(wp) :: devk43 = -5.13E-3
  97. REAL(wp) :: devk44 = -4.53e-3
  98. REAL(wp) :: devk45 = -3.91e-3
  99. REAL(wp) :: devk46 = -11.76e-3
  100. REAL(wp) :: devk47 = -2.67e-3
  101. REAL(wp) :: devk48 = -5.15e-3
  102. REAL(wp) :: devk49 = -4.08e-3
  103. REAL(wp) :: devk410 = -2.84e-3
  104. !
  105. REAL(wp) :: devk50 = 0.0877E-3
  106. REAL(wp) :: devk51 = -0.1475E-3
  107. REAL(wp) :: devk52 = 0.
  108. REAL(wp) :: devk53 = 0.0794E-3
  109. REAL(wp) :: devk54 = 0.09e-3
  110. REAL(wp) :: devk55 = 0.054e-3
  111. REAL(wp) :: devk56 = 0.3692E-3
  112. REAL(wp) :: devk57 = 0.0427e-3
  113. REAL(wp) :: devk58 = 0.09e-3
  114. REAL(wp) :: devk59 = 0.0714e-3
  115. REAL(wp) :: devk510 = 0.0
  116. !
  117. ! General parameters
  118. REAL(wp), PARAMETER :: pp_rdel_ah_target = 1.E-4_wp
  119. REAL(wp), PARAMETER :: pp_ln10 = 2.302585092994045684018_wp
  120. ! Maximum number of iterations for each method
  121. INTEGER, PARAMETER :: jp_maxniter_atgen = 20
  122. ! Bookkeeping variables for each method
  123. ! - SOLVE_AT_GENERAL
  124. INTEGER :: niter_atgen = jp_maxniter_atgen
  125. !!* Substitution
  126. #include "top_substitute.h90"
  127. !!----------------------------------------------------------------------
  128. !! NEMO/TOP 3.3 , NEMO Consortium (2010)
  129. !! $Id: p4zche.F90 3977 2017-02-20 14:03:23Z ufla $
  130. !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt)
  131. !!----------------------------------------------------------------------
  132. CONTAINS
  133. SUBROUTINE p4z_che
  134. !!---------------------------------------------------------------------
  135. !! *** ROUTINE p4z_che ***
  136. !!
  137. !! ** Purpose : Sea water chemistry computed following OCMIP protocol
  138. !!
  139. !! ** Method : - ...
  140. !!---------------------------------------------------------------------
  141. INTEGER :: ji, jj, jk
  142. REAL(wp) :: ztkel, ztkel1, zt , zsal , zsal2 , zbuf1 , zbuf2
  143. REAL(wp) :: ztgg , ztgg2, ztgg3 , ztgg4 , ztgg5
  144. REAL(wp) :: zpres, ztc , zcl , zcpexp, zoxy , zcpexp2
  145. REAL(wp) :: zsqrt, ztr , zlogt , zcek1, zc1, zplat
  146. REAL(wp) :: zis , zis2 , zsal15, zisqrt, za1, za2
  147. REAL(wp) :: zckb , zck1 , zck2 , zckw , zak1 , zak2 , zakb , zaksp0, zakw
  148. REAL(wp) :: zck1p, zck2p, zck3p, zcksi, zak1p, zak2p, zak3p, zaksi
  149. REAL(wp) :: zst , zft , zcks , zckf , zaksp1
  150. REAL(wp) :: total2free, free2SWS, total2SWS, SWS2total
  151. !!---------------------------------------------------------------------
  152. !
  153. IF( nn_timing == 1 ) CALL timing_start('p4z_che')
  154. !
  155. ! Computation of chemical constants require practical salinity
  156. ! Thus, when TEOS08 is used, absolute salinity is converted to
  157. ! practical salinity
  158. ! -------------------------------------------------------------
  159. IF (nn_eos == -1) THEN
  160. salinprac(:,:,:) = tsn(:,:,:,jp_sal) * 35.0 / 35.16504
  161. ELSE
  162. salinprac(:,:,:) = tsn(:,:,:,jp_sal)
  163. ENDIF
  164. !
  165. ! Computations of chemical constants require in situ temperature
  166. ! Here a quite simple formulation is used to convert
  167. ! potential temperature to in situ temperature. The errors is less than
  168. ! 0.04°C relative to an exact computation
  169. ! ---------------------------------------------------------------------
  170. DO jk = 1, jpk
  171. DO jj = 1, jpj
  172. DO ji = 1, jpi
  173. zpres = fsdept(ji,jj,jk) / 1000.
  174. za1 = 0.04 * ( 1.0 + 0.185 * tsn(ji,jj,jk,jp_tem) + 0.035 * (salinprac(ji,jj,jk) - 35.0) )
  175. za2 = 0.0075 * ( 1.0 - tsn(ji,jj,jk,jp_tem) / 30.0 )
  176. tempis(ji,jj,jk) = tsn(ji,jj,jk,jp_tem) - za1 * zpres + za2 * zpres**2
  177. END DO
  178. END DO
  179. END DO
  180. !
  181. ! CHEMICAL CONSTANTS - SURFACE LAYER
  182. ! ----------------------------------
  183. !CDIR NOVERRCHK
  184. DO jj = 1, jpj
  185. !CDIR NOVERRCHK
  186. DO ji = 1, jpi
  187. ! ! SET ABSOLUTE TEMPERATURE
  188. ztkel = tempis(ji,jj,1) + 273.15
  189. zt = ztkel * 0.01
  190. zsal = salinprac(ji,jj,1) + ( 1.- tmask(ji,jj,1) ) * 35.
  191. ! ! LN(K0) OF SOLUBILITY OF CO2 (EQ. 12, WEISS, 1980)
  192. ! ! AND FOR THE ATMOSPHERE FOR NON IDEAL GAS
  193. zcek1 = 9345.17/ztkel - 60.2409 + 23.3585 * LOG(zt) + zsal*(0.023517 - 0.00023656*ztkel &
  194. & + 0.0047036e-4*ztkel**2)
  195. chemc(ji,jj,1) = EXP( zcek1 ) * 1E-6 * rhop(ji,jj,1) / 1000. ! mol/(L atm)
  196. chemc(ji,jj,2) = -1636.75 + 12.0408*ztkel - 0.0327957*ztkel**2 + 0.0000316528*ztkel**3
  197. chemc(ji,jj,3) = 57.7 - 0.118*ztkel
  198. !
  199. END DO
  200. END DO
  201. ! OXYGEN SOLUBILITY - DEEP OCEAN
  202. ! -------------------------------
  203. !CDIR NOVERRCHK
  204. DO jk = 1, jpk
  205. !CDIR NOVERRCHK
  206. DO jj = 1, jpj
  207. !CDIR NOVERRCHK
  208. DO ji = 1, jpi
  209. ztkel = tempis(ji,jj,jk) + 273.15
  210. zsal = salinprac(ji,jj,jk) + ( 1.- tmask(ji,jj,jk) ) * 35.
  211. zsal2 = zsal * zsal
  212. ztgg = LOG( ( 298.15 - tempis(ji,jj,jk) ) / ztkel ) ! Set the GORDON & GARCIA scaled temperature
  213. ztgg2 = ztgg * ztgg
  214. ztgg3 = ztgg2 * ztgg
  215. ztgg4 = ztgg3 * ztgg
  216. ztgg5 = ztgg4 * ztgg
  217. zoxy = 2.00856 + 3.22400 * ztgg + 3.99063 * ztgg2 + 4.80299 * ztgg3 &
  218. & + 9.78188e-1 * ztgg4 + 1.71069 * ztgg5 + zsal * ( -6.24097e-3 &
  219. & - 6.93498e-3 * ztgg - 6.90358e-3 * ztgg2 - 4.29155e-3 * ztgg3 ) &
  220. & - 3.11680e-7 * zsal2
  221. chemo2(ji,jj,jk) = ( EXP( zoxy ) * o2atm ) * oxyco * atcox ! mol/(L atm)
  222. END DO
  223. END DO
  224. END DO
  225. ! CHEMICAL CONSTANTS - DEEP OCEAN
  226. ! -------------------------------
  227. !CDIR NOVERRCHK
  228. DO jk = 1, jpk
  229. !CDIR NOVERRCHK
  230. DO jj = 1, jpj
  231. !CDIR NOVERRCHK
  232. DO ji = 1, jpi
  233. ! SET PRESSION ACCORDING TO SAUNDER (1980)
  234. zplat = SIN ( ABS(gphit(ji,jj)*3.141592654/180.) )
  235. zc1 = 5.92E-3 + zplat**2 * 5.25E-3
  236. zpres = ((1-zc1)-SQRT(((1-zc1)**2)-(8.84E-6*fsdept(ji,jj,jk)))) / 4.42E-6
  237. zpres = zpres / 10.0
  238. ! SET ABSOLUTE TEMPERATURE
  239. ztkel = tempis(ji,jj,jk) + 273.15
  240. zsal = salinprac(ji,jj,jk) + ( 1.-tmask(ji,jj,jk) ) * 35.
  241. zsqrt = SQRT( zsal )
  242. zsal15 = zsqrt * zsal
  243. zlogt = LOG( ztkel )
  244. ztr = 1. / ztkel
  245. zis = 19.924 * zsal / ( 1000.- 1.005 * zsal )
  246. zis2 = zis * zis
  247. zisqrt = SQRT( zis )
  248. ztc = tempis(ji,jj,jk) + ( 1.- tmask(ji,jj,jk) ) * 20.
  249. ! CHLORINITY (WOOSTER ET AL., 1969)
  250. zcl = zsal / 1.80655
  251. ! TOTAL SULFATE CONCENTR. [MOLES/kg soln]
  252. zst = 0.14 * zcl /96.062
  253. ! TOTAL FLUORIDE CONCENTR. [MOLES/kg soln]
  254. zft = 0.000067 * zcl /18.9984
  255. ! DISSOCIATION CONSTANT FOR SULFATES on free H scale (Dickson 1990)
  256. zcks = EXP(-4276.1 * ztr + 141.328 - 23.093 * zlogt &
  257. & + (-13856. * ztr + 324.57 - 47.986 * zlogt) * zisqrt &
  258. & + (35474. * ztr - 771.54 + 114.723 * zlogt) * zis &
  259. & - 2698. * ztr * zis**1.5 + 1776.* ztr * zis2 &
  260. & + LOG(1.0 - 0.001005 * zsal))
  261. ! DISSOCIATION CONSTANT FOR FLUORIDES on free H scale (Dickson and Riley 79)
  262. zckf = EXP( 1590.2*ztr - 12.641 + 1.525*zisqrt &
  263. & + LOG(1.0d0 - 0.001005d0*zsal) &
  264. & + LOG(1.0d0 + zst/zcks))
  265. ! DISSOCIATION CONSTANT FOR CARBONATE AND BORATE
  266. zckb= (-8966.90 - 2890.53*zsqrt - 77.942*zsal &
  267. & + 1.728*zsal15 - 0.0996*zsal*zsal)*ztr &
  268. & + (148.0248 + 137.1942*zsqrt + 1.62142*zsal) &
  269. & + (-24.4344 - 25.085*zsqrt - 0.2474*zsal) &
  270. & * zlogt + 0.053105*zsqrt*ztkel
  271. ! DISSOCIATION COEFFICIENT FOR CARBONATE ACCORDING TO
  272. ! MEHRBACH (1973) REFIT BY MILLERO (1995), seawater scale
  273. zck1 = -1.0*(3633.86*ztr - 61.2172 + 9.6777*zlogt &
  274. - 0.011555*zsal + 0.0001152*zsal*zsal)
  275. zck2 = -1.0*(471.78*ztr + 25.9290 - 3.16967*zlogt &
  276. - 0.01781*zsal + 0.0001122*zsal*zsal)
  277. ! PKW (H2O) (MILLERO, 1995) from composite data
  278. zckw = -13847.26 * ztr + 148.9652 - 23.6521 * zlogt + ( 118.67 * ztr &
  279. - 5.977 + 1.0495 * zlogt ) * zsqrt - 0.01615 * zsal
  280. ! CONSTANTS FOR PHOSPHATE (MILLERO, 1995)
  281. zck1p = -4576.752*ztr + 115.540 - 18.453*zlogt &
  282. & + (-106.736*ztr + 0.69171) * zsqrt &
  283. & + (-0.65643*ztr - 0.01844) * zsal
  284. zck2p = -8814.715*ztr + 172.1033 - 27.927*zlogt &
  285. & + (-160.340*ztr + 1.3566)*zsqrt &
  286. & + (0.37335*ztr - 0.05778)*zsal
  287. zck3p = -3070.75*ztr - 18.126 &
  288. & + (17.27039*ztr + 2.81197) * zsqrt &
  289. & + (-44.99486*ztr - 0.09984) * zsal
  290. ! CONSTANT FOR SILICATE, MILLERO (1995)
  291. zcksi = -8904.2*ztr + 117.400 - 19.334*zlogt &
  292. & + (-458.79*ztr + 3.5913) * zisqrt &
  293. & + (188.74*ztr - 1.5998) * zis &
  294. & + (-12.1652*ztr + 0.07871) * zis2 &
  295. & + LOG(1.0 - 0.001005*zsal)
  296. ! APPARENT SOLUBILITY PRODUCT K'SP OF CALCITE IN SEAWATER
  297. ! (S=27-43, T=2-25 DEG C) at pres =0 (atmos. pressure) (MUCCI 1983)
  298. zaksp0 = -171.9065 -0.077993*ztkel + 2839.319*ztr + 71.595*LOG10( ztkel ) &
  299. & + (-0.77712 + 0.00284263*ztkel + 178.34*ztr) * zsqrt &
  300. & - 0.07711*zsal + 0.0041249*zsal15
  301. ! CONVERT FROM DIFFERENT PH SCALES
  302. total2free = 1.0/(1.0 + zst/zcks)
  303. free2SWS = 1. + zst/zcks + zft/(zckf*total2free)
  304. total2SWS = total2free * free2SWS
  305. SWS2total = 1.0 / total2SWS
  306. ! K1, K2 OF CARBONIC ACID, KB OF BORIC ACID, KW (H2O) (LIT.?)
  307. zak1 = 10**(zck1) * total2SWS
  308. zak2 = 10**(zck2) * total2SWS
  309. zakb = EXP( zckb ) * total2SWS
  310. zakw = EXP( zckw )
  311. zaksp1 = 10**(zaksp0)
  312. zak1p = exp( zck1p )
  313. zak2p = exp( zck2p )
  314. zak3p = exp( zck3p )
  315. zaksi = exp( zcksi )
  316. zckf = zckf * total2SWS
  317. ! FORMULA FOR CPEXP AFTER EDMOND & GIESKES (1970)
  318. ! (REFERENCE TO CULBERSON & PYTKOQICZ (1968) AS MADE
  319. ! IN BROECKER ET AL. (1982) IS INCORRECT; HERE RGAS IS
  320. ! TAKEN TENFOLD TO CORRECT FOR THE NOTATION OF pres IN
  321. ! DBAR INSTEAD OF BAR AND THE EXPRESSION FOR CPEXP IS
  322. ! MULTIPLIED BY LN(10.) TO ALLOW USE OF EXP-FUNCTION
  323. ! WITH BASIS E IN THE FORMULA FOR AKSPP (CF. EDMOND
  324. ! & GIESKES (1970), P. 1285-1286 (THE SMALL
  325. ! FORMULA ON P. 1286 IS RIGHT AND CONSISTENT WITH THE
  326. ! SIGN IN PARTIAL MOLAR VOLUME CHANGE AS SHOWN ON P. 1285))
  327. zcpexp = zpres / (rgas*ztkel)
  328. zcpexp2 = zpres * zcpexp
  329. ! KB OF BORIC ACID, K1,K2 OF CARBONIC ACID PRESSURE
  330. ! CORRECTION AFTER CULBERSON AND PYTKOWICZ (1968)
  331. ! (CF. BROECKER ET AL., 1982)
  332. zbuf1 = - ( devk10 + devk20 * ztc + devk30 * ztc * ztc )
  333. zbuf2 = 0.5 * ( devk40 + devk50 * ztc )
  334. ak13(ji,jj,jk) = zak1 * EXP( zbuf1 * zcpexp + zbuf2 * zcpexp2 )
  335. zbuf1 = - ( devk11 + devk21 * ztc + devk31 * ztc * ztc )
  336. zbuf2 = 0.5 * ( devk41 + devk51 * ztc )
  337. ak23(ji,jj,jk) = zak2 * EXP( zbuf1 * zcpexp + zbuf2 * zcpexp2 )
  338. zbuf1 = - ( devk12 + devk22 * ztc + devk32 * ztc * ztc )
  339. zbuf2 = 0.5 * ( devk42 + devk52 * ztc )
  340. akb3(ji,jj,jk) = zakb * EXP( zbuf1 * zcpexp + zbuf2 * zcpexp2 )
  341. zbuf1 = - ( devk13 + devk23 * ztc + devk33 * ztc * ztc )
  342. zbuf2 = 0.5 * ( devk43 + devk53 * ztc )
  343. akw3(ji,jj,jk) = zakw * EXP( zbuf1 * zcpexp + zbuf2 * zcpexp2 )
  344. zbuf1 = - ( devk14 + devk24 * ztc + devk34 * ztc * ztc )
  345. zbuf2 = 0.5 * ( devk44 + devk54 * ztc )
  346. aks3(ji,jj,jk) = zcks * EXP( zbuf1 * zcpexp + zbuf2 * zcpexp2 )
  347. zbuf1 = - ( devk15 + devk25 * ztc + devk35 * ztc * ztc )
  348. zbuf2 = 0.5 * ( devk45 + devk55 * ztc )
  349. akf3(ji,jj,jk) = zckf * EXP( zbuf1 * zcpexp + zbuf2 * zcpexp2 )
  350. zbuf1 = - ( devk17 + devk27 * ztc + devk37 * ztc * ztc )
  351. zbuf2 = 0.5 * ( devk47 + devk57 * ztc )
  352. ak1p3(ji,jj,jk) = zak1p * EXP( zbuf1 * zcpexp + zbuf2 * zcpexp2 )
  353. zbuf1 = - ( devk18 + devk28 * ztc + devk38 * ztc * ztc )
  354. zbuf2 = 0.5 * ( devk48 + devk58 * ztc )
  355. ak2p3(ji,jj,jk) = zak2p * EXP( zbuf1 * zcpexp + zbuf2 * zcpexp2 )
  356. zbuf1 = - ( devk19 + devk29 * ztc + devk39 * ztc * ztc )
  357. zbuf2 = 0.5 * ( devk49 + devk59 * ztc )
  358. ak3p3(ji,jj,jk) = zak3p * EXP( zbuf1 * zcpexp + zbuf2 * zcpexp2 )
  359. zbuf1 = - ( devk110 + devk210 * ztc + devk310 * ztc * ztc )
  360. zbuf2 = 0.5 * ( devk410 + devk510 * ztc )
  361. aksi3(ji,jj,jk) = zaksi * EXP( zbuf1 * zcpexp + zbuf2 * zcpexp2 )
  362. ! CONVERT FROM DIFFERENT PH SCALES
  363. total2free = 1.0/(1.0 + zst/aks3(ji,jj,jk))
  364. free2SWS = 1. + zst/aks3(ji,jj,jk) + zft/akf3(ji,jj,jk)
  365. total2SWS = total2free * free2SWS
  366. SWS2total = 1.0 / total2SWS
  367. ! Convert to total scale
  368. ak13(ji,jj,jk) = ak13(ji,jj,jk) * SWS2total
  369. ak23(ji,jj,jk) = ak23(ji,jj,jk) * SWS2total
  370. akb3(ji,jj,jk) = akb3(ji,jj,jk) * SWS2total
  371. akw3(ji,jj,jk) = akw3(ji,jj,jk) * SWS2total
  372. ak1p3(ji,jj,jk) = ak1p3(ji,jj,jk) * SWS2total
  373. ak2p3(ji,jj,jk) = ak2p3(ji,jj,jk) * SWS2total
  374. ak3p3(ji,jj,jk) = ak3p3(ji,jj,jk) * SWS2total
  375. aksi3(ji,jj,jk) = aksi3(ji,jj,jk) * SWS2total
  376. akf3(ji,jj,jk) = akf3(ji,jj,jk) / total2free
  377. ! APPARENT SOLUBILITY PRODUCT K'SP OF CALCITE
  378. ! AS FUNCTION OF PRESSURE FOLLOWING MILLERO
  379. ! (P. 1285) AND BERNER (1976)
  380. zbuf1 = - ( devk16 + devk26 * ztc + devk36 * ztc * ztc )
  381. zbuf2 = 0.5 * ( devk46 + devk56 * ztc )
  382. aksp(ji,jj,jk) = zaksp1 * EXP( zbuf1 * zcpexp + zbuf2 * zcpexp2 )
  383. ! TOTAL F, S, and BORATE CONCENTR. [MOLES/L]
  384. borat(ji,jj,jk) = 0.0002414 * zcl / 10.811
  385. sulfat(ji,jj,jk) = zst
  386. fluorid(ji,jj,jk) = zft
  387. ! Iron and SIO3 saturation concentration from ...
  388. sio3eq(ji,jj,jk) = EXP( LOG( 10.) * ( 6.44 - 968. / ztkel ) ) * 1.e-6
  389. fekeq (ji,jj,jk) = 10**( 17.27 - 1565.7 / ztkel )
  390. ! Liu and Millero (1999) only valid 5 - 50 degC
  391. ztkel1 = MAX( 5. , tempis(ji,jj,jk) ) + 273.16
  392. fesol(ji,jj,jk,1) = 10**((-13.486) - (0.1856* (zis**0.5)) + (0.3073*zis) + (5254.0/ztkel1))
  393. fesol(ji,jj,jk,2) = 10**(2.517 - (0.885*(zis**0.5)) + (0.2139 * zis) - (1320.0/ztkel1) )
  394. fesol(ji,jj,jk,3) = 10**(0.4511 - (0.3305*(zis**0.5)) - (1996.0/ztkel1) )
  395. fesol(ji,jj,jk,4) = 10**(-0.2965 - (0.7881*(zis**0.5)) - (4086.0/ztkel1) )
  396. fesol(ji,jj,jk,5) = 10**(4.4466 - (0.8505*(zis**0.5)) - (7980.0/ztkel1) )
  397. END DO
  398. END DO
  399. END DO
  400. !
  401. IF( nn_timing == 1 ) CALL timing_stop('p4z_che')
  402. !
  403. END SUBROUTINE p4z_che
  404. SUBROUTINE p4z_che_ahini( p_hini )
  405. !!---------------------------------------------------------------------
  406. !! *** ROUTINE ahini_for_at ***
  407. !!
  408. !! Subroutine returns the root for the 2nd order approximation of the
  409. !! DIC -- B_T -- A_CB equation for [H+] (reformulated as a cubic
  410. !! polynomial) around the local minimum, if it exists.
  411. !! Returns * 1E-03_wp if p_alkcb <= 0
  412. !! * 1E-10_wp if p_alkcb >= 2*p_dictot + p_bortot
  413. !! * 1E-07_wp if 0 < p_alkcb < 2*p_dictot + p_bortot
  414. !! and the 2nd order approximation does not have
  415. !! a solution
  416. !!---------------------------------------------------------------------
  417. REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(OUT) :: p_hini
  418. INTEGER :: ji, jj, jk
  419. REAL(wp) :: zca1, zba1
  420. REAL(wp) :: zd, zsqrtd, zhmin
  421. REAL(wp) :: za2, za1, za0
  422. REAL(wp) :: p_dictot, p_bortot, p_alkcb
  423. IF( nn_timing == 1 ) CALL timing_start('p4z_che_ahini')
  424. !
  425. DO jk = 1, jpk
  426. DO jj = 1, jpj
  427. DO ji = 1, jpi
  428. p_alkcb = trb(ji,jj,jk,jptal) * 1000. / (rhop(ji,jj,jk) + rtrn)
  429. p_dictot = trb(ji,jj,jk,jpdic) * 1000. / (rhop(ji,jj,jk) + rtrn)
  430. p_bortot = borat(ji,jj,jk)
  431. IF (p_alkcb <= 0.) THEN
  432. p_hini(ji,jj,jk) = 1.e-3
  433. ELSEIF (p_alkcb >= (2.*p_dictot + p_bortot)) THEN
  434. p_hini(ji,jj,jk) = 1.e-10_wp
  435. ELSE
  436. zca1 = p_dictot/( p_alkcb + rtrn )
  437. zba1 = p_bortot/ (p_alkcb + rtrn )
  438. ! Coefficients of the cubic polynomial
  439. za2 = aKb3(ji,jj,jk)*(1. - zba1) + ak13(ji,jj,jk)*(1.-zca1)
  440. za1 = ak13(ji,jj,jk)*akb3(ji,jj,jk)*(1. - zba1 - zca1) &
  441. & + ak13(ji,jj,jk)*ak23(ji,jj,jk)*(1. - (zca1+zca1))
  442. za0 = ak13(ji,jj,jk)*ak23(ji,jj,jk)*akb3(ji,jj,jk)*(1. - zba1 - (zca1+zca1))
  443. ! Taylor expansion around the minimum
  444. zd = za2*za2 - 3.*za1 ! Discriminant of the quadratic equation
  445. ! for the minimum close to the root
  446. IF(zd > 0.) THEN ! If the discriminant is positive
  447. zsqrtd = SQRT(zd)
  448. IF(za2 < 0) THEN
  449. zhmin = (-za2 + zsqrtd)/3.
  450. ELSE
  451. zhmin = -za1/(za2 + zsqrtd)
  452. ENDIF
  453. p_hini(ji,jj,jk) = zhmin + SQRT(-(za0 + zhmin*(za1 + zhmin*(za2 + zhmin)))/zsqrtd)
  454. ELSE
  455. p_hini(ji,jj,jk) = 1.e-7
  456. ENDIF
  457. !
  458. ENDIF
  459. END DO
  460. END DO
  461. END DO
  462. !
  463. IF( nn_timing == 1 ) CALL timing_stop('p4z_che_ahini')
  464. !
  465. END SUBROUTINE p4z_che_ahini
  466. !===============================================================================
  467. SUBROUTINE anw_infsup( p_alknw_inf, p_alknw_sup )
  468. ! Subroutine returns the lower and upper bounds of "non-water-selfionization"
  469. ! contributions to total alkalinity (the infimum and the supremum), i.e
  470. ! inf(TA - [OH-] + [H+]) and sup(TA - [OH-] + [H+])
  471. ! Argument variables
  472. REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(OUT) :: p_alknw_inf
  473. REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(OUT) :: p_alknw_sup
  474. p_alknw_inf(:,:,:) = -trb(:,:,:,jppo4) * 1000. / (rhop(:,:,:) + rtrn) - sulfat(:,:,:) &
  475. & - fluorid(:,:,:)
  476. p_alknw_sup(:,:,:) = (2. * trb(:,:,:,jpdic) + 2. * trb(:,:,:,jppo4) + trb(:,:,:,jpsil) ) &
  477. & * 1000. / (rhop(:,:,:) + rtrn) + borat(:,:,:)
  478. END SUBROUTINE anw_infsup
  479. SUBROUTINE p4z_che_solve_hi( p_hini, zhi )
  480. ! Universal pH solver that converges from any given initial value,
  481. ! determines upper an lower bounds for the solution if required
  482. ! Argument variables
  483. !--------------------
  484. REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(IN) :: p_hini
  485. REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(OUT) :: zhi
  486. ! Local variables
  487. !-----------------
  488. INTEGER :: ji, jj, jk, jn
  489. REAL(wp) :: zh_ini, zh, zh_prev, zh_lnfactor
  490. REAL(wp) :: zdelta, zh_delta
  491. REAL(wp) :: zeqn, zdeqndh, zalka
  492. REAL(wp) :: aphscale
  493. REAL(wp) :: znumer_dic, zdnumer_dic, zdenom_dic, zalk_dic, zdalk_dic
  494. REAL(wp) :: znumer_bor, zdnumer_bor, zdenom_bor, zalk_bor, zdalk_bor
  495. REAL(wp) :: znumer_po4, zdnumer_po4, zdenom_po4, zalk_po4, zdalk_po4
  496. REAL(wp) :: znumer_sil, zdnumer_sil, zdenom_sil, zalk_sil, zdalk_sil
  497. REAL(wp) :: znumer_so4, zdnumer_so4, zdenom_so4, zalk_so4, zdalk_so4
  498. REAL(wp) :: znumer_flu, zdnumer_flu, zdenom_flu, zalk_flu, zdalk_flu
  499. REAL(wp) :: zalk_wat, zdalk_wat
  500. REAL(wp) :: zfact, p_alktot, zdic, zbot, zpt, zst, zft, zsit
  501. LOGICAL :: l_exitnow
  502. REAL(wp), PARAMETER :: pz_exp_threshold = 1.0
  503. REAL(wp), POINTER, DIMENSION(:,:,:) :: zalknw_inf, zalknw_sup, rmask, zh_min, zh_max, zeqn_absmin
  504. IF( nn_timing == 1 ) CALL timing_start('p4z_che_solve_hi')
  505. ! Allocate temporary workspace
  506. CALL wrk_alloc( jpi, jpj, jpk, zalknw_inf, zalknw_sup, rmask )
  507. CALL wrk_alloc( jpi, jpj, jpk, zh_min, zh_max, zeqn_absmin )
  508. CALL anw_infsup( zalknw_inf, zalknw_sup )
  509. rmask(:,:,:) = tmask(:,:,:)
  510. zhi(:,:,:) = 0.
  511. ! TOTAL H+ scale: conversion factor for Htot = aphscale * Hfree
  512. DO jk = 1, jpk
  513. DO jj = 1, jpj
  514. DO ji = 1, jpi
  515. IF (rmask(ji,jj,jk) == 1.) THEN
  516. p_alktot = trb(ji,jj,jk,jptal) * 1000. / (rhop(ji,jj,jk) + rtrn)
  517. aphscale = 1. + sulfat(ji,jj,jk)/aks3(ji,jj,jk)
  518. zh_ini = p_hini(ji,jj,jk)
  519. zdelta = (p_alktot-zalknw_inf(ji,jj,jk))**2 + 4.*akw3(ji,jj,jk)/aphscale
  520. IF(p_alktot >= zalknw_inf(ji,jj,jk)) THEN
  521. zh_min(ji,jj,jk) = 2.*akw3(ji,jj,jk) /( p_alktot-zalknw_inf(ji,jj,jk) + SQRT(zdelta) )
  522. ELSE
  523. zh_min(ji,jj,jk) = aphscale*(-(p_alktot-zalknw_inf(ji,jj,jk)) + SQRT(zdelta) ) / 2.
  524. ENDIF
  525. zdelta = (p_alktot-zalknw_sup(ji,jj,jk))**2 + 4.*akw3(ji,jj,jk)/aphscale
  526. IF(p_alktot <= zalknw_sup(ji,jj,jk)) THEN
  527. zh_max(ji,jj,jk) = aphscale*(-(p_alktot-zalknw_sup(ji,jj,jk)) + SQRT(zdelta) ) / 2.
  528. ELSE
  529. zh_max(ji,jj,jk) = 2.*akw3(ji,jj,jk) /( p_alktot-zalknw_sup(ji,jj,jk) + SQRT(zdelta) )
  530. ENDIF
  531. zhi(ji,jj,jk) = MAX(MIN(zh_max(ji,jj,jk), zh_ini), zh_min(ji,jj,jk))
  532. ENDIF
  533. END DO
  534. END DO
  535. END DO
  536. zeqn_absmin(:,:,:) = HUGE(1._wp)
  537. DO jn = 1, jp_maxniter_atgen
  538. DO jk = 1, jpk
  539. DO jj = 1, jpj
  540. DO ji = 1, jpi
  541. IF (rmask(ji,jj,jk) == 1.) THEN
  542. zfact = rhop(ji,jj,jk) / 1000. + rtrn
  543. p_alktot = trb(ji,jj,jk,jptal) / zfact
  544. zdic = trb(ji,jj,jk,jpdic) / zfact
  545. zbot = borat(ji,jj,jk)
  546. zpt = trb(ji,jj,jk,jppo4) / zfact * po4r
  547. zsit = trb(ji,jj,jk,jpsil) / zfact
  548. zst = sulfat (ji,jj,jk)
  549. zft = fluorid(ji,jj,jk)
  550. aphscale = 1. + sulfat(ji,jj,jk)/aks3(ji,jj,jk)
  551. zh = zhi(ji,jj,jk)
  552. zh_prev = zh
  553. ! H2CO3 - HCO3 - CO3 : n=2, m=0
  554. znumer_dic = 2.*ak13(ji,jj,jk)*ak23(ji,jj,jk) + zh*ak13(ji,jj,jk)
  555. zdenom_dic = ak13(ji,jj,jk)*ak23(ji,jj,jk) + zh*(ak13(ji,jj,jk) + zh)
  556. zalk_dic = zdic * (znumer_dic/zdenom_dic)
  557. zdnumer_dic = ak13(ji,jj,jk)*ak13(ji,jj,jk)*ak23(ji,jj,jk) + zh &
  558. *(4.*ak13(ji,jj,jk)*ak23(ji,jj,jk) + zh*ak13(ji,jj,jk))
  559. zdalk_dic = -zdic*(zdnumer_dic/zdenom_dic**2)
  560. ! B(OH)3 - B(OH)4 : n=1, m=0
  561. znumer_bor = akb3(ji,jj,jk)
  562. zdenom_bor = akb3(ji,jj,jk) + zh
  563. zalk_bor = zbot * (znumer_bor/zdenom_bor)
  564. zdnumer_bor = akb3(ji,jj,jk)
  565. zdalk_bor = -zbot*(zdnumer_bor/zdenom_bor**2)
  566. ! H3PO4 - H2PO4 - HPO4 - PO4 : n=3, m=1
  567. znumer_po4 = 3.*ak1p3(ji,jj,jk)*ak2p3(ji,jj,jk)*ak3p3(ji,jj,jk) &
  568. & + zh*(2.*ak1p3(ji,jj,jk)*ak2p3(ji,jj,jk) + zh* ak1p3(ji,jj,jk))
  569. zdenom_po4 = ak1p3(ji,jj,jk)*ak2p3(ji,jj,jk)*ak3p3(ji,jj,jk) &
  570. & + zh*( ak1p3(ji,jj,jk)*ak2p3(ji,jj,jk) + zh*(ak1p3(ji,jj,jk) + zh))
  571. zalk_po4 = zpt * (znumer_po4/zdenom_po4 - 1.) ! Zero level of H3PO4 = 1
  572. zdnumer_po4 = ak1p3(ji,jj,jk)*ak2p3(ji,jj,jk)*ak1p3(ji,jj,jk)*ak2p3(ji,jj,jk)*ak3p3(ji,jj,jk) &
  573. & + zh*(4.*ak1p3(ji,jj,jk)*ak1p3(ji,jj,jk)*ak2p3(ji,jj,jk)*ak3p3(ji,jj,jk) &
  574. & + zh*(9.*ak1p3(ji,jj,jk)*ak2p3(ji,jj,jk)*ak3p3(ji,jj,jk) &
  575. & + ak1p3(ji,jj,jk)*ak1p3(ji,jj,jk)*ak2p3(ji,jj,jk) &
  576. & + zh*(4.*ak1p3(ji,jj,jk)*ak2p3(ji,jj,jk) + zh * ak1p3(ji,jj,jk) ) ) )
  577. zdalk_po4 = -zpt * (zdnumer_po4/zdenom_po4**2)
  578. ! H4SiO4 - H3SiO4 : n=1, m=0
  579. znumer_sil = aksi3(ji,jj,jk)
  580. zdenom_sil = aksi3(ji,jj,jk) + zh
  581. zalk_sil = zsit * (znumer_sil/zdenom_sil)
  582. zdnumer_sil = aksi3(ji,jj,jk)
  583. zdalk_sil = -zsit * (zdnumer_sil/zdenom_sil**2)
  584. ! HSO4 - SO4 : n=1, m=1
  585. aphscale = 1.0 + zst/aks3(ji,jj,jk)
  586. znumer_so4 = aks3(ji,jj,jk) * aphscale
  587. zdenom_so4 = aks3(ji,jj,jk) * aphscale + zh
  588. zalk_so4 = zst * (znumer_so4/zdenom_so4 - 1.)
  589. zdnumer_so4 = aks3(ji,jj,jk)
  590. zdalk_so4 = -zst * (zdnumer_so4/zdenom_so4**2)
  591. ! HF - F : n=1, m=1
  592. znumer_flu = akf3(ji,jj,jk)
  593. zdenom_flu = akf3(ji,jj,jk) + zh
  594. zalk_flu = zft * (znumer_flu/zdenom_flu - 1.)
  595. zdnumer_flu = akf3(ji,jj,jk)
  596. zdalk_flu = -zft * (zdnumer_flu/zdenom_flu**2)
  597. ! H2O - OH
  598. aphscale = 1.0 + zst/aks3(ji,jj,jk)
  599. zalk_wat = akw3(ji,jj,jk)/zh - zh/aphscale
  600. zdalk_wat = -akw3(ji,jj,jk)/zh**2 - 1./aphscale
  601. ! CALCULATE [ALK]([CO3--], [HCO3-])
  602. zeqn = zalk_dic + zalk_bor + zalk_po4 + zalk_sil &
  603. & + zalk_so4 + zalk_flu &
  604. & + zalk_wat - p_alktot
  605. zalka = p_alktot - (zalk_bor + zalk_po4 + zalk_sil &
  606. & + zalk_so4 + zalk_flu + zalk_wat)
  607. zdeqndh = zdalk_dic + zdalk_bor + zdalk_po4 + zdalk_sil &
  608. & + zdalk_so4 + zdalk_flu + zdalk_wat
  609. ! Adapt bracketing interval
  610. IF(zeqn > 0._wp) THEN
  611. zh_min(ji,jj,jk) = zh_prev
  612. ELSEIF(zeqn < 0._wp) THEN
  613. zh_max(ji,jj,jk) = zh_prev
  614. ENDIF
  615. IF(ABS(zeqn) >= 0.5_wp*zeqn_absmin(ji,jj,jk)) THEN
  616. ! if the function evaluation at the current point is
  617. ! not decreasing faster than with a bisection step (at least linearly)
  618. ! in absolute value take one bisection step on [ph_min, ph_max]
  619. ! ph_new = (ph_min + ph_max)/2d0
  620. !
  621. ! In terms of [H]_new:
  622. ! [H]_new = 10**(-ph_new)
  623. ! = 10**(-(ph_min + ph_max)/2d0)
  624. ! = SQRT(10**(-(ph_min + phmax)))
  625. ! = SQRT(zh_max * zh_min)
  626. zh = SQRT(zh_max(ji,jj,jk) * zh_min(ji,jj,jk))
  627. zh_lnfactor = (zh - zh_prev)/zh_prev ! Required to test convergence below
  628. ELSE
  629. ! dzeqn/dpH = dzeqn/d[H] * d[H]/dpH
  630. ! = -zdeqndh * LOG(10) * [H]
  631. ! \Delta pH = -zeqn/(zdeqndh*d[H]/dpH) = zeqn/(zdeqndh*[H]*LOG(10))
  632. !
  633. ! pH_new = pH_old + \deltapH
  634. !
  635. ! [H]_new = 10**(-pH_new)
  636. ! = 10**(-pH_old - \Delta pH)
  637. ! = [H]_old * 10**(-zeqn/(zdeqndh*[H]_old*LOG(10)))
  638. ! = [H]_old * EXP(-LOG(10)*zeqn/(zdeqndh*[H]_old*LOG(10)))
  639. ! = [H]_old * EXP(-zeqn/(zdeqndh*[H]_old))
  640. zh_lnfactor = -zeqn/(zdeqndh*zh_prev)
  641. IF(ABS(zh_lnfactor) > pz_exp_threshold) THEN
  642. zh = zh_prev*EXP(zh_lnfactor)
  643. ELSE
  644. zh_delta = zh_lnfactor*zh_prev
  645. zh = zh_prev + zh_delta
  646. ENDIF
  647. IF( zh < zh_min(ji,jj,jk) ) THEN
  648. ! if [H]_new < [H]_min
  649. ! i.e., if ph_new > ph_max then
  650. ! take one bisection step on [ph_prev, ph_max]
  651. ! ph_new = (ph_prev + ph_max)/2d0
  652. ! In terms of [H]_new:
  653. ! [H]_new = 10**(-ph_new)
  654. ! = 10**(-(ph_prev + ph_max)/2d0)
  655. ! = SQRT(10**(-(ph_prev + phmax)))
  656. ! = SQRT([H]_old*10**(-ph_max))
  657. ! = SQRT([H]_old * zh_min)
  658. zh = SQRT(zh_prev * zh_min(ji,jj,jk))
  659. zh_lnfactor = (zh - zh_prev)/zh_prev ! Required to test convergence below
  660. ENDIF
  661. IF( zh > zh_max(ji,jj,jk) ) THEN
  662. ! if [H]_new > [H]_max
  663. ! i.e., if ph_new < ph_min, then
  664. ! take one bisection step on [ph_min, ph_prev]
  665. ! ph_new = (ph_prev + ph_min)/2d0
  666. ! In terms of [H]_new:
  667. ! [H]_new = 10**(-ph_new)
  668. ! = 10**(-(ph_prev + ph_min)/2d0)
  669. ! = SQRT(10**(-(ph_prev + ph_min)))
  670. ! = SQRT([H]_old*10**(-ph_min))
  671. ! = SQRT([H]_old * zhmax)
  672. zh = SQRT(zh_prev * zh_max(ji,jj,jk))
  673. zh_lnfactor = (zh - zh_prev)/zh_prev ! Required to test convergence below
  674. ENDIF
  675. ENDIF
  676. zeqn_absmin(ji,jj,jk) = MIN( ABS(zeqn), zeqn_absmin(ji,jj,jk))
  677. ! Stop iterations once |\delta{[H]}/[H]| < rdel
  678. ! <=> |(zh - zh_prev)/zh_prev| = |EXP(-zeqn/(zdeqndh*zh_prev)) -1| < rdel
  679. ! |EXP(-zeqn/(zdeqndh*zh_prev)) -1| ~ |zeqn/(zdeqndh*zh_prev)|
  680. ! Alternatively:
  681. ! |\Delta pH| = |zeqn/(zdeqndh*zh_prev*LOG(10))|
  682. ! ~ 1/LOG(10) * |\Delta [H]|/[H]
  683. ! < 1/LOG(10) * rdel
  684. ! Hence |zeqn/(zdeqndh*zh)| < rdel
  685. ! rdel <-- pp_rdel_ah_target
  686. l_exitnow = (ABS(zh_lnfactor) < pp_rdel_ah_target)
  687. IF(l_exitnow) THEN
  688. rmask(ji,jj,jk) = 0.
  689. ENDIF
  690. zhi(ji,jj,jk) = zh
  691. IF(jn >= jp_maxniter_atgen) THEN
  692. zhi(ji,jj,jk) = -1._wp
  693. ENDIF
  694. ENDIF
  695. END DO
  696. END DO
  697. END DO
  698. END DO
  699. !
  700. CALL wrk_dealloc( jpi, jpj, jpk, zalknw_inf, zalknw_sup, rmask )
  701. CALL wrk_dealloc( jpi, jpj, jpk, zh_min, zh_max, zeqn_absmin )
  702. IF( nn_timing == 1 ) CALL timing_stop('p4z_che_solve_hi')
  703. END SUBROUTINE p4z_che_solve_hi
  704. INTEGER FUNCTION p4z_che_alloc()
  705. !!----------------------------------------------------------------------
  706. !! *** ROUTINE p4z_che_alloc ***
  707. !!----------------------------------------------------------------------
  708. INTEGER :: ierr(3) ! Local variables
  709. !!----------------------------------------------------------------------
  710. ierr(:) = 0
  711. ALLOCATE( sio3eq(jpi,jpj,jpk), fekeq(jpi,jpj,jpk), chemc(jpi,jpj,3), chemo2(jpi,jpj,jpk), STAT=ierr(1) )
  712. ALLOCATE( akb3(jpi,jpj,jpk) , tempis(jpi, jpj, jpk), &
  713. & akw3(jpi,jpj,jpk) , borat (jpi,jpj,jpk) , &
  714. & aks3(jpi,jpj,jpk) , akf3(jpi,jpj,jpk) , &
  715. & ak1p3(jpi,jpj,jpk) , ak2p3(jpi,jpj,jpk) , &
  716. & ak3p3(jpi,jpj,jpk) , aksi3(jpi,jpj,jpk) , &
  717. & fluorid(jpi,jpj,jpk) , sulfat(jpi,jpj,jpk) , &
  718. & salinprac(jpi,jpj,jpk), STAT=ierr(2) )
  719. ALLOCATE( fesol(jpi,jpj,jpk,5), STAT=ierr(3) )
  720. !* Variable for chemistry of the CO2 cycle
  721. p4z_che_alloc = MAXVAL( ierr )
  722. !
  723. IF( p4z_che_alloc /= 0 ) CALL ctl_warn('p4z_che_alloc : failed to allocate arrays.')
  724. !
  725. END FUNCTION p4z_che_alloc
  726. #else
  727. !!======================================================================
  728. !! Dummy module : No PISCES bio-model
  729. !!======================================================================
  730. CONTAINS
  731. SUBROUTINE p4z_che( kt ) ! Empty routine
  732. INTEGER, INTENT(in) :: kt
  733. WRITE(*,*) 'p4z_che: You should not have seen this print! error?', kt
  734. END SUBROUTINE p4z_che
  735. #endif
  736. !!======================================================================
  737. END MODULE p4zche