p4zprod.F90 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604
  1. MODULE p4zprod
  2. !!======================================================================
  3. !! *** MODULE p4zprod ***
  4. !! TOP : Growth Rate of the two phytoplanktons groups
  5. !!======================================================================
  6. !! History : 1.0 ! 2004 (O. Aumont) Original code
  7. !! 2.0 ! 2007-12 (C. Ethe, G. Madec) F90
  8. !! 3.4 ! 2011-05 (O. Aumont, C. Ethe) New parameterization of light limitation
  9. !!----------------------------------------------------------------------
  10. #if defined key_pisces
  11. !!----------------------------------------------------------------------
  12. !! 'key_pisces' PISCES bio-model
  13. !!----------------------------------------------------------------------
  14. !! p4z_prod : Compute the growth Rate of the two phytoplanktons groups
  15. !! p4z_prod_init : Initialization of the parameters for growth
  16. !! p4z_prod_alloc : Allocate variables for growth
  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
  21. USE p4zopt ! optical model
  22. USE p4zlim ! Co-limitations of differents nutrients
  23. USE prtctl_trc ! print control for debugging
  24. USE iom ! I/O manager
  25. IMPLICIT NONE
  26. PRIVATE
  27. PUBLIC p4z_prod ! called in p4zbio.F90
  28. PUBLIC p4z_prod_init ! called in trcsms_pisces.F90
  29. PUBLIC p4z_prod_alloc
  30. !! * Shared module variables
  31. LOGICAL , PUBLIC :: ln_newprod !:
  32. REAL(wp), PUBLIC :: pislope !:
  33. REAL(wp), PUBLIC :: pislope2 !:
  34. REAL(wp), PUBLIC :: xadap !:
  35. REAL(wp), PUBLIC :: excret !:
  36. REAL(wp), PUBLIC :: excret2 !:
  37. REAL(wp), PUBLIC :: bresp !:
  38. REAL(wp), PUBLIC :: chlcnm !:
  39. REAL(wp), PUBLIC :: chlcdm !:
  40. REAL(wp), PUBLIC :: chlcmin !:
  41. REAL(wp), PUBLIC :: fecnm !:
  42. REAL(wp), PUBLIC :: fecdm !:
  43. REAL(wp), PUBLIC :: grosip !:
  44. REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: prmax !: optimal production = f(temperature)
  45. REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: quotan !: proxy of N quota in Nanophyto
  46. REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: quotad !: proxy of N quota in diatomee
  47. REAL(wp) :: r1_rday !: 1 / rday
  48. REAL(wp) :: texcret !: 1 - excret
  49. REAL(wp) :: texcret2 !: 1 - excret2
  50. !!* Substitution
  51. # include "top_substitute.h90"
  52. !!----------------------------------------------------------------------
  53. !! NEMO/TOP 3.3 , NEMO Consortium (2010)
  54. !! $Id: p4zprod.F90 3160 2011-11-20 14:27:18Z cetlod $
  55. !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt)
  56. !!----------------------------------------------------------------------
  57. CONTAINS
  58. SUBROUTINE p4z_prod( kt , knt )
  59. !!---------------------------------------------------------------------
  60. !! *** ROUTINE p4z_prod ***
  61. !!
  62. !! ** Purpose : Compute the phytoplankton production depending on
  63. !! light, temperature and nutrient availability
  64. !!
  65. !! ** Method : - ???
  66. !!---------------------------------------------------------------------
  67. !
  68. INTEGER, INTENT(in) :: kt, knt
  69. !
  70. INTEGER :: ji, jj, jk
  71. REAL(wp) :: zsilfac, znanotot, zdiattot, zconctemp, zconctemp2
  72. REAL(wp) :: zratio, zmax, zsilim, ztn, zadap
  73. REAL(wp) :: zlim, zsilfac2, zsiborn, zprod, zproreg, zproreg2
  74. REAL(wp) :: zmxltst, zmxlday, zmaxday
  75. REAL(wp) :: zpislopen , zpislope2n
  76. REAL(wp) :: zrum, zcodel, zargu, zval
  77. REAL(wp) :: zfact
  78. CHARACTER (len=25) :: charout
  79. REAL(wp), POINTER, DIMENSION(:,: ) :: zmixnano, zmixdiat, zstrn, zw2d
  80. REAL(wp), POINTER, DIMENSION(:,:,:) :: zpislopead, zpislopead2, zprdia, zprbio, zprdch, zprnch, zysopt, zw3d
  81. REAL(wp), POINTER, DIMENSION(:,:,:) :: zprorca, zprorcad, zprofed, zprofen, zprochln, zprochld, zpronew, zpronewd
  82. !!---------------------------------------------------------------------
  83. !
  84. IF( nn_timing == 1 ) CALL timing_start('p4z_prod')
  85. !
  86. ! Allocate temporary workspace
  87. CALL wrk_alloc( jpi, jpj, zmixnano, zmixdiat, zstrn )
  88. CALL wrk_alloc( jpi, jpj, jpk, zpislopead, zpislopead2, zprdia, zprbio, zprdch, zprnch, zysopt )
  89. CALL wrk_alloc( jpi, jpj, jpk, zprorca, zprorcad, zprofed, zprofen, zprochln, zprochld, zpronew, zpronewd )
  90. !
  91. zprorca (:,:,:) = 0._wp
  92. zprorcad(:,:,:) = 0._wp
  93. zprofed (:,:,:) = 0._wp
  94. zprofen (:,:,:) = 0._wp
  95. zprochln(:,:,:) = 0._wp
  96. zprochld(:,:,:) = 0._wp
  97. zpronew (:,:,:) = 0._wp
  98. zpronewd(:,:,:) = 0._wp
  99. zprdia (:,:,:) = 0._wp
  100. zprbio (:,:,:) = 0._wp
  101. zprdch (:,:,:) = 0._wp
  102. zprnch (:,:,:) = 0._wp
  103. zysopt (:,:,:) = 0._wp
  104. ! Computation of the optimal production
  105. prmax(:,:,:) = 0.6_wp * r1_rday * tgfunc(:,:,:)
  106. IF( lk_degrad ) prmax(:,:,:) = prmax(:,:,:) * facvol(:,:,:)
  107. ! compute the day length depending on latitude and the day
  108. zrum = REAL( nday_year - 80, wp ) / REAL( nyear_len(1), wp )
  109. zcodel = ASIN( SIN( zrum * rpi * 2._wp ) * SIN( rad * 23.5_wp ) )
  110. ! day length in hours
  111. zstrn(:,:) = 0.
  112. DO jj = 1, jpj
  113. DO ji = 1, jpi
  114. zargu = TAN( zcodel ) * TAN( gphit(ji,jj) * rad )
  115. zargu = MAX( -1., MIN( 1., zargu ) )
  116. zstrn(ji,jj) = MAX( 0.0, 24. - 2. * ACOS( zargu ) / rad / 15. )
  117. END DO
  118. END DO
  119. ! Impact of the day duration on phytoplankton growth
  120. DO jk = 1, jpkm1
  121. DO jj = 1 ,jpj
  122. DO ji = 1, jpi
  123. IF( etot_ndcy(ji,jj,jk) > 1.E-3 ) THEN
  124. zval = MAX( 1., zstrn(ji,jj) )
  125. zval = 1.5 * zval / ( 12. + zval )
  126. zprbio(ji,jj,jk) = prmax(ji,jj,jk) * zval
  127. zprdia(ji,jj,jk) = zprbio(ji,jj,jk)
  128. ENDIF
  129. END DO
  130. END DO
  131. END DO
  132. ! Maximum light intensity
  133. WHERE( zstrn(:,:) < 1.e0 ) zstrn(:,:) = 24.
  134. zstrn(:,:) = 24. / zstrn(:,:)
  135. IF( ln_newprod ) THEN
  136. !CDIR NOVERRCHK
  137. DO jk = 1, jpkm1
  138. !CDIR NOVERRCHK
  139. DO jj = 1, jpj
  140. !CDIR NOVERRCHK
  141. DO ji = 1, jpi
  142. ! Computation of the P-I slope for nanos and diatoms
  143. IF( etot_ndcy(ji,jj,jk) > 1.E-3 ) THEN
  144. ztn = MAX( 0., tsn(ji,jj,jk,jp_tem) - 15. )
  145. zadap = xadap * ztn / ( 2.+ ztn )
  146. zconctemp = MAX( 0.e0 , trb(ji,jj,jk,jpdia) - xsizedia )
  147. zconctemp2 = trb(ji,jj,jk,jpdia) - zconctemp
  148. znanotot = enano(ji,jj,jk) * zstrn(ji,jj)
  149. zdiattot = ediat(ji,jj,jk) * zstrn(ji,jj)
  150. !
  151. zpislopead (ji,jj,jk) = pislope * ( 1.+ zadap * EXP( -znanotot ) ) &
  152. & * trb(ji,jj,jk,jpnch) /( trb(ji,jj,jk,jpphy) * 12. + rtrn)
  153. !
  154. zpislopead2(ji,jj,jk) = (pislope * zconctemp2 + pislope2 * zconctemp) / ( trb(ji,jj,jk,jpdia) + rtrn ) &
  155. & * trb(ji,jj,jk,jpdch) /( trb(ji,jj,jk,jpdia) * 12. + rtrn)
  156. ! Computation of production function for Carbon
  157. ! ---------------------------------------------
  158. zpislopen = zpislopead (ji,jj,jk) / ( ( r1_rday + bresp * r1_rday ) * rday + rtrn)
  159. zpislope2n = zpislopead2(ji,jj,jk) / ( ( r1_rday + bresp * r1_rday ) * rday + rtrn)
  160. zprbio(ji,jj,jk) = zprbio(ji,jj,jk) * ( 1.- EXP( -zpislopen * znanotot ) )
  161. zprdia(ji,jj,jk) = zprdia(ji,jj,jk) * ( 1.- EXP( -zpislope2n * zdiattot ) )
  162. ! Computation of production function for Chlorophyll
  163. !--------------------------------------------------
  164. zmaxday = 1._wp / ( prmax(ji,jj,jk) * rday + rtrn )
  165. zprnch(ji,jj,jk) = prmax(ji,jj,jk) * ( 1.- EXP( -zpislopead (ji,jj,jk) * zmaxday * znanotot ) )
  166. zprdch(ji,jj,jk) = prmax(ji,jj,jk) * ( 1.- EXP( -zpislopead2(ji,jj,jk) * zmaxday * zdiattot ) )
  167. ENDIF
  168. END DO
  169. END DO
  170. END DO
  171. ELSE
  172. !CDIR NOVERRCHK
  173. DO jk = 1, jpkm1
  174. !CDIR NOVERRCHK
  175. DO jj = 1, jpj
  176. !CDIR NOVERRCHK
  177. DO ji = 1, jpi
  178. ! Computation of the P-I slope for nanos and diatoms
  179. IF( etot_ndcy(ji,jj,jk) > 1.E-3 ) THEN
  180. ztn = MAX( 0., tsn(ji,jj,jk,jp_tem) - 15. )
  181. zadap = ztn / ( 2.+ ztn )
  182. zconctemp = MAX( 0.e0 , trb(ji,jj,jk,jpdia) - xsizedia )
  183. zconctemp2 = trb(ji,jj,jk,jpdia) - zconctemp
  184. znanotot = enano(ji,jj,jk) * zstrn(ji,jj)
  185. zdiattot = ediat(ji,jj,jk) * zstrn(ji,jj)
  186. !
  187. zpislopead (ji,jj,jk) = pislope * ( 1.+ zadap * EXP( -znanotot ) ) &
  188. & * trb(ji,jj,jk,jpnch) /( trb(ji,jj,jk,jpphy) * 12. + rtrn)
  189. zpislopead2(ji,jj,jk) = (pislope * zconctemp2 + pislope2 * zconctemp) / ( trb(ji,jj,jk,jpdia) + rtrn ) &
  190. & * trb(ji,jj,jk,jpdch) /( trb(ji,jj,jk,jpdia) * 12. + rtrn)
  191. ! Computation of production function for Carbon
  192. ! ---------------------------------------------
  193. zpislopen = zpislopead(ji,jj,jk) / ( prmax(ji,jj,jk) * rday * xlimphy(ji,jj,jk) + rtrn )
  194. zpislope2n = zpislopead2(ji,jj,jk) / ( prmax(ji,jj,jk) * rday * xlimdia(ji,jj,jk) + rtrn )
  195. zprbio(ji,jj,jk) = zprbio(ji,jj,jk) * ( 1.- EXP( -zpislopen * znanotot ) )
  196. zprdia(ji,jj,jk) = zprdia(ji,jj,jk) * ( 1.- EXP( -zpislope2n * zdiattot ) )
  197. ! Computation of production function for Chlorophyll
  198. !--------------------------------------------------
  199. zprnch(ji,jj,jk) = prmax(ji,jj,jk) * ( 1.- EXP( -zpislopen * znanotot ) )
  200. zprdch(ji,jj,jk) = prmax(ji,jj,jk) * ( 1.- EXP( -zpislope2n * zdiattot ) )
  201. ENDIF
  202. END DO
  203. END DO
  204. END DO
  205. ENDIF
  206. ! Computation of a proxy of the N/C ratio
  207. ! ---------------------------------------
  208. !CDIR NOVERRCHK
  209. DO jk = 1, jpkm1
  210. !CDIR NOVERRCHK
  211. DO jj = 1, jpj
  212. !CDIR NOVERRCHK
  213. DO ji = 1, jpi
  214. zval = MIN( xnanopo4(ji,jj,jk), ( xnanonh4(ji,jj,jk) + xnanono3(ji,jj,jk) ) ) &
  215. & * prmax(ji,jj,jk) / ( zprbio(ji,jj,jk) + rtrn )
  216. quotan(ji,jj,jk) = MIN( 1., 0.2 + 0.8 * zval )
  217. zval = MIN( xdiatpo4(ji,jj,jk), ( xdiatnh4(ji,jj,jk) + xdiatno3(ji,jj,jk) ) ) &
  218. & * prmax(ji,jj,jk) / ( zprdia(ji,jj,jk) + rtrn )
  219. quotad(ji,jj,jk) = MIN( 1., 0.2 + 0.8 * zval )
  220. END DO
  221. END DO
  222. END DO
  223. DO jk = 1, jpkm1
  224. DO jj = 1, jpj
  225. DO ji = 1, jpi
  226. IF( etot_ndcy(ji,jj,jk) > 1.E-3 ) THEN
  227. ! Si/C of diatoms
  228. ! ------------------------
  229. ! Si/C increases with iron stress and silicate availability
  230. ! Si/C is arbitrariliy increased for very high Si concentrations
  231. ! to mimic the very high ratios observed in the Southern Ocean (silpot2)
  232. zlim = trb(ji,jj,jk,jpsil) / ( trb(ji,jj,jk,jpsil) + xksi1 )
  233. zsilim = MIN( zprdia(ji,jj,jk) / ( prmax(ji,jj,jk) + rtrn ), xlimsi(ji,jj,jk) )
  234. zsilfac = 4.4 * EXP( -4.23 * zsilim ) * MAX( 0.e0, MIN( 1., 2.2 * ( zlim - 0.5 ) ) ) + 1.e0
  235. zsiborn = trb(ji,jj,jk,jpsil) * trb(ji,jj,jk,jpsil) * trb(ji,jj,jk,jpsil)
  236. IF (gphit(ji,jj) < -30 ) THEN
  237. zsilfac2 = 1. + 2. * zsiborn / ( zsiborn + xksi2**3 )
  238. ELSE
  239. zsilfac2 = 1. + zsiborn / ( zsiborn + xksi2**3 )
  240. ENDIF
  241. zysopt(ji,jj,jk) = grosip * zlim * zsilfac * zsilfac2
  242. ENDIF
  243. END DO
  244. END DO
  245. END DO
  246. ! Computation of the limitation term due to a mixed layer deeper than the euphotic depth
  247. DO jj = 1, jpj
  248. DO ji = 1, jpi
  249. zmxltst = MAX( 0.e0, hmld(ji,jj) - heup(ji,jj) )
  250. zmxlday = zmxltst * zmxltst * r1_rday
  251. zmixnano(ji,jj) = 1. - zmxlday / ( 1. + zmxlday )
  252. zmixdiat(ji,jj) = 1. - zmxlday / ( 2. + zmxlday )
  253. END DO
  254. END DO
  255. ! Mixed-layer effect on production
  256. ! Sea-ice effect on production
  257. DO jk = 1, jpkm1
  258. DO jj = 1, jpj
  259. DO ji = 1, jpi
  260. IF( fsdepw(ji,jj,jk+1) <= hmld(ji,jj) ) THEN
  261. zprbio(ji,jj,jk) = zprbio(ji,jj,jk) * zmixnano(ji,jj)
  262. zprdia(ji,jj,jk) = zprdia(ji,jj,jk) * zmixdiat(ji,jj)
  263. ENDIF
  264. zprbio(ji,jj,jk) = zprbio(ji,jj,jk) * ( 1. - fr_i(ji,jj) )
  265. zprdia(ji,jj,jk) = zprdia(ji,jj,jk) * ( 1. - fr_i(ji,jj) )
  266. END DO
  267. END DO
  268. END DO
  269. ! Computation of the various production terms
  270. !CDIR NOVERRCHK
  271. DO jk = 1, jpkm1
  272. !CDIR NOVERRCHK
  273. DO jj = 1, jpj
  274. !CDIR NOVERRCHK
  275. DO ji = 1, jpi
  276. IF( etot_ndcy(ji,jj,jk) > 1.E-3 ) THEN
  277. ! production terms for nanophyto.
  278. zprorca(ji,jj,jk) = zprbio(ji,jj,jk) * xlimphy(ji,jj,jk) * trb(ji,jj,jk,jpphy) * rfact2
  279. zpronew(ji,jj,jk) = zprorca(ji,jj,jk) * xnanono3(ji,jj,jk) / ( xnanono3(ji,jj,jk) + xnanonh4(ji,jj,jk) + rtrn )
  280. !
  281. zratio = trb(ji,jj,jk,jpnfe) / ( trb(ji,jj,jk,jpphy) + rtrn )
  282. zratio = zratio / fecnm
  283. zmax = MAX( 0., ( 1. - zratio ) / ABS( 1.05 - zratio ) )
  284. zprofen(ji,jj,jk) = fecnm * prmax(ji,jj,jk) &
  285. & * ( 4. - 4.5 * xlimnfe(ji,jj,jk) / ( xlimnfe(ji,jj,jk) + 0.5 ) ) &
  286. & * biron(ji,jj,jk) / ( biron(ji,jj,jk) + concnfe(ji,jj,jk) ) &
  287. & * zmax * trb(ji,jj,jk,jpphy) * rfact2
  288. ! production terms for diatomees
  289. zprorcad(ji,jj,jk) = zprdia(ji,jj,jk) * xlimdia(ji,jj,jk) * trb(ji,jj,jk,jpdia) * rfact2
  290. zpronewd(ji,jj,jk) = zprorcad(ji,jj,jk) * xdiatno3(ji,jj,jk) / ( xdiatno3(ji,jj,jk) + xdiatnh4(ji,jj,jk) + rtrn )
  291. !
  292. zratio = trb(ji,jj,jk,jpdfe) / ( trb(ji,jj,jk,jpdia) + rtrn )
  293. zratio = zratio / fecdm
  294. zmax = MAX( 0., ( 1. - zratio ) / ABS( 1.05 - zratio ) )
  295. zprofed(ji,jj,jk) = fecdm * prmax(ji,jj,jk) &
  296. & * ( 4. - 4.5 * xlimdfe(ji,jj,jk) / ( xlimdfe(ji,jj,jk) + 0.5 ) ) &
  297. & * biron(ji,jj,jk) / ( biron(ji,jj,jk) + concdfe(ji,jj,jk) ) &
  298. & * zmax * trb(ji,jj,jk,jpdia) * rfact2
  299. ENDIF
  300. END DO
  301. END DO
  302. END DO
  303. !CDIR NOVERRCHK
  304. DO jk = 1, jpkm1
  305. !CDIR NOVERRCHK
  306. DO jj = 1, jpj
  307. !CDIR NOVERRCHK
  308. DO ji = 1, jpi
  309. IF( fsdepw(ji,jj,jk+1) <= hmld(ji,jj) ) THEN
  310. zprnch(ji,jj,jk) = zprnch(ji,jj,jk) * zmixnano(ji,jj)
  311. zprdch(ji,jj,jk) = zprdch(ji,jj,jk) * zmixdiat(ji,jj)
  312. ENDIF
  313. IF( etot_ndcy(ji,jj,jk) > 1.E-3 ) THEN
  314. ! production terms for nanophyto. ( chlorophyll )
  315. znanotot = enano(ji,jj,jk) * zstrn(ji,jj)
  316. zprod = rday * zprorca(ji,jj,jk) * zprnch(ji,jj,jk) * xlimphy(ji,jj,jk)
  317. zprochln(ji,jj,jk) = chlcmin * 12. * zprorca (ji,jj,jk)
  318. zprochln(ji,jj,jk) = zprochln(ji,jj,jk) + (chlcnm-chlcmin) * 12. * zprod / &
  319. & ( zpislopead(ji,jj,jk) * znanotot +rtrn)
  320. ! production terms for diatomees ( chlorophyll )
  321. zdiattot = ediat(ji,jj,jk) * zstrn(ji,jj)
  322. zprod = rday * zprorcad(ji,jj,jk) * zprdch(ji,jj,jk) * xlimdia(ji,jj,jk)
  323. zprochld(ji,jj,jk) = chlcmin * 12. * zprorcad(ji,jj,jk)
  324. zprochld(ji,jj,jk) = zprochld(ji,jj,jk) + (chlcdm-chlcmin) * 12. * zprod / &
  325. & ( zpislopead2(ji,jj,jk) * zdiattot +rtrn )
  326. ENDIF
  327. END DO
  328. END DO
  329. END DO
  330. ! Update the arrays TRA which contain the biological sources and sinks
  331. DO jk = 1, jpkm1
  332. DO jj = 1, jpj
  333. DO ji =1 ,jpi
  334. zproreg = zprorca(ji,jj,jk) - zpronew(ji,jj,jk)
  335. zproreg2 = zprorcad(ji,jj,jk) - zpronewd(ji,jj,jk)
  336. tra(ji,jj,jk,jppo4) = tra(ji,jj,jk,jppo4) - zprorca(ji,jj,jk) - zprorcad(ji,jj,jk)
  337. tra(ji,jj,jk,jpno3) = tra(ji,jj,jk,jpno3) - zpronew(ji,jj,jk) - zpronewd(ji,jj,jk)
  338. tra(ji,jj,jk,jpnh4) = tra(ji,jj,jk,jpnh4) - zproreg - zproreg2
  339. tra(ji,jj,jk,jpphy) = tra(ji,jj,jk,jpphy) + zprorca(ji,jj,jk) * texcret
  340. tra(ji,jj,jk,jpnch) = tra(ji,jj,jk,jpnch) + zprochln(ji,jj,jk) * texcret
  341. tra(ji,jj,jk,jpnfe) = tra(ji,jj,jk,jpnfe) + zprofen(ji,jj,jk) * texcret
  342. tra(ji,jj,jk,jpdia) = tra(ji,jj,jk,jpdia) + zprorcad(ji,jj,jk) * texcret2
  343. tra(ji,jj,jk,jpdch) = tra(ji,jj,jk,jpdch) + zprochld(ji,jj,jk) * texcret2
  344. tra(ji,jj,jk,jpdfe) = tra(ji,jj,jk,jpdfe) + zprofed(ji,jj,jk) * texcret2
  345. tra(ji,jj,jk,jpdsi) = tra(ji,jj,jk,jpdsi) + zprorcad(ji,jj,jk) * zysopt(ji,jj,jk) * texcret2
  346. tra(ji,jj,jk,jpdoc) = tra(ji,jj,jk,jpdoc) + excret2 * zprorcad(ji,jj,jk) + excret * zprorca(ji,jj,jk)
  347. tra(ji,jj,jk,jpoxy) = tra(ji,jj,jk,jpoxy) + o2ut * ( zproreg + zproreg2) &
  348. & + ( o2ut + o2nit ) * ( zpronew(ji,jj,jk) + zpronewd(ji,jj,jk) )
  349. tra(ji,jj,jk,jpfer) = tra(ji,jj,jk,jpfer) - texcret * zprofen(ji,jj,jk) - texcret2 * zprofed(ji,jj,jk)
  350. tra(ji,jj,jk,jpsil) = tra(ji,jj,jk,jpsil) - texcret2 * zprorcad(ji,jj,jk) * zysopt(ji,jj,jk)
  351. tra(ji,jj,jk,jpdic) = tra(ji,jj,jk,jpdic) - zprorca(ji,jj,jk) - zprorcad(ji,jj,jk)
  352. tra(ji,jj,jk,jptal) = tra(ji,jj,jk,jptal) + rno3 * ( zpronew(ji,jj,jk) + zpronewd(ji,jj,jk) ) &
  353. & - rno3 * ( zproreg + zproreg2 )
  354. END DO
  355. END DO
  356. END DO
  357. ! Total primary production per year
  358. IF( iom_use( "tintpp" ) .OR. ( ln_check_mass .AND. kt == nitend .AND. knt == nrdttrc ) ) &
  359. & tpp = glob_sum( ( zprorca(:,:,:) + zprorcad(:,:,:) ) * cvol(:,:,:) )
  360. IF( lk_iomput ) THEN
  361. IF( knt == nrdttrc ) THEN
  362. CALL wrk_alloc( jpi, jpj, zw2d )
  363. CALL wrk_alloc( jpi, jpj, jpk, zw3d )
  364. zfact = 1.e+3 * rfact2r ! conversion from mol/l/kt to mol/m3/s
  365. !
  366. IF( iom_use( "PPPHY" ) .OR. iom_use( "PPPHY2" ) ) THEN
  367. zw3d(:,:,:) = zprorca (:,:,:) * zfact * tmask(:,:,:) ! primary production by nanophyto
  368. CALL iom_put( "PPPHY" , zw3d )
  369. !
  370. zw3d(:,:,:) = zprorcad(:,:,:) * zfact * tmask(:,:,:) ! primary production by diatomes
  371. CALL iom_put( "PPPHY2" , zw3d )
  372. ENDIF
  373. IF( iom_use( "PPNEWN" ) .OR. iom_use( "PPNEWD" ) ) THEN
  374. zw3d(:,:,:) = zpronew (:,:,:) * zfact * tmask(:,:,:) ! new primary production by nanophyto
  375. CALL iom_put( "PPNEWN" , zw3d )
  376. !
  377. zw3d(:,:,:) = zpronewd(:,:,:) * zfact * tmask(:,:,:) ! new primary production by diatomes
  378. CALL iom_put( "PPNEWD" , zw3d )
  379. ENDIF
  380. IF( iom_use( "PBSi" ) ) THEN
  381. zw3d(:,:,:) = zprorcad(:,:,:) * zfact * tmask(:,:,:) * zysopt(:,:,:) ! biogenic silica production
  382. CALL iom_put( "PBSi" , zw3d )
  383. ENDIF
  384. IF( iom_use( "PFeN" ) .OR. iom_use( "PFeD" ) ) THEN
  385. zw3d(:,:,:) = zprofen(:,:,:) * zfact * tmask(:,:,:) ! biogenic iron production by nanophyto
  386. CALL iom_put( "PFeN" , zw3d )
  387. !
  388. zw3d(:,:,:) = zprofed(:,:,:) * zfact * tmask(:,:,:) ! biogenic iron production by diatomes
  389. CALL iom_put( "PFeD" , zw3d )
  390. ENDIF
  391. IF( iom_use( "Mumax" ) ) THEN
  392. zw3d(:,:,:) = prmax(:,:,:) * tmask(:,:,:) ! Maximum growth rate
  393. CALL iom_put( "Mumax" , zw3d )
  394. ENDIF
  395. IF( iom_use( "MuN" ) .OR. iom_use( "MuD" ) ) THEN
  396. zw3d(:,:,:) = zprbio(:,:,:) * xlimphy(:,:,:) * tmask(:,:,:) ! Realized growth rate for nanophyto
  397. CALL iom_put( "MuN" , zw3d )
  398. !
  399. zw3d(:,:,:) = zprdia(:,:,:) * xlimdia(:,:,:) * tmask(:,:,:) ! Realized growth rate for diatoms
  400. CALL iom_put( "MuD" , zw3d )
  401. ENDIF
  402. IF( iom_use( "LNlight" ) .OR. iom_use( "LDlight" ) ) THEN
  403. zw3d(:,:,:) = zprbio (:,:,:) / (prmax(:,:,:) + rtrn) * tmask(:,:,:) ! light limitation term
  404. CALL iom_put( "LNlight" , zw3d )
  405. !
  406. zw3d(:,:,:) = zprdia (:,:,:) / (prmax(:,:,:) + rtrn) * tmask(:,:,:) ! light limitation term
  407. CALL iom_put( "LDlight" , zw3d )
  408. ENDIF
  409. IF( iom_use( "TPP" ) ) THEN
  410. zw3d(:,:,:) = ( zprorca(:,:,:) + zprorcad(:,:,:) ) * zfact * tmask(:,:,:) ! total primary production
  411. CALL iom_put( "TPP" , zw3d )
  412. ENDIF
  413. IF( iom_use( "TPNEW" ) ) THEN
  414. zw3d(:,:,:) = ( zpronew(:,:,:) + zpronewd(:,:,:) ) * zfact * tmask(:,:,:) ! total new production
  415. CALL iom_put( "TPNEW" , zw3d )
  416. ENDIF
  417. IF( iom_use( "TPBFE" ) ) THEN
  418. zw3d(:,:,:) = ( zprofen(:,:,:) + zprofed(:,:,:) ) * zfact * tmask(:,:,:) ! total biogenic iron production
  419. CALL iom_put( "TPBFE" , zw3d )
  420. ENDIF
  421. IF( iom_use( "INTPPPHY" ) .OR. iom_use( "INTPPPHY2" ) ) THEN
  422. zw2d(:,:) = 0.
  423. DO jk = 1, jpkm1
  424. zw2d(:,:) = zw2d(:,:) + zprorca (:,:,jk) * fse3t(:,:,jk) * zfact * tmask(:,:,jk) ! vert. integrated primary produc. by nano
  425. ENDDO
  426. CALL iom_put( "INTPPPHY" , zw2d )
  427. !
  428. zw2d(:,:) = 0.
  429. DO jk = 1, jpkm1
  430. zw2d(:,:) = zw2d(:,:) + zprorcad(:,:,jk) * fse3t(:,:,jk) * zfact * tmask(:,:,jk) ! vert. integrated primary produc. by diatom
  431. ENDDO
  432. CALL iom_put( "INTPPPHY2" , zw2d )
  433. ENDIF
  434. IF( iom_use( "INTPP" ) ) THEN
  435. zw2d(:,:) = 0.
  436. DO jk = 1, jpkm1
  437. zw2d(:,:) = zw2d(:,:) + ( zprorca(:,:,jk) + zprorcad(:,:,jk) ) * fse3t(:,:,jk) * zfact * tmask(:,:,jk) ! vert. integrated pp
  438. ENDDO
  439. CALL iom_put( "INTPP" , zw2d )
  440. ENDIF
  441. IF( iom_use( "INTPNEW" ) ) THEN
  442. zw2d(:,:) = 0.
  443. DO jk = 1, jpkm1
  444. zw2d(:,:) = zw2d(:,:) + ( zpronew(:,:,jk) + zpronewd(:,:,jk) ) * fse3t(:,:,jk) * zfact * tmask(:,:,jk) ! vert. integrated new prod
  445. ENDDO
  446. CALL iom_put( "INTPNEW" , zw2d )
  447. ENDIF
  448. IF( iom_use( "INTPBFE" ) ) THEN ! total biogenic iron production ( vertically integrated )
  449. zw2d(:,:) = 0.
  450. DO jk = 1, jpkm1
  451. zw2d(:,:) = zw2d(:,:) + ( zprofen(:,:,jk) + zprofed(:,:,jk) ) * fse3t(:,:,jk) * zfact * tmask(:,:,jk) ! vert integr. bfe prod
  452. ENDDO
  453. CALL iom_put( "INTPBFE" , zw2d )
  454. ENDIF
  455. IF( iom_use( "INTPBSI" ) ) THEN ! total biogenic silica production ( vertically integrated )
  456. zw2d(:,:) = 0.
  457. DO jk = 1, jpkm1
  458. zw2d(:,:) = zw2d(:,:) + zprorcad(:,:,jk) * zysopt(:,:,jk) * fse3t(:,:,jk) * zfact * tmask(:,:,jk) ! vert integr. bsi prod
  459. ENDDO
  460. CALL iom_put( "INTPBSI" , zw2d )
  461. ENDIF
  462. IF( iom_use( "tintpp" ) ) CALL iom_put( "tintpp" , tpp * zfact ) ! global total integrated primary production molC/s
  463. !
  464. CALL wrk_dealloc( jpi, jpj, zw2d )
  465. CALL wrk_dealloc( jpi, jpj, jpk, zw3d )
  466. ENDIF
  467. ELSE
  468. IF( ln_diatrc ) THEN
  469. zfact = 1.e+3 * rfact2r
  470. trc3d(:,:,:,jp_pcs0_3d + 4) = zprorca (:,:,:) * zfact * tmask(:,:,:)
  471. trc3d(:,:,:,jp_pcs0_3d + 5) = zprorcad(:,:,:) * zfact * tmask(:,:,:)
  472. trc3d(:,:,:,jp_pcs0_3d + 6) = zpronew (:,:,:) * zfact * tmask(:,:,:)
  473. trc3d(:,:,:,jp_pcs0_3d + 7) = zpronewd(:,:,:) * zfact * tmask(:,:,:)
  474. trc3d(:,:,:,jp_pcs0_3d + 8) = zprorcad(:,:,:) * zfact * tmask(:,:,:) * zysopt(:,:,:)
  475. trc3d(:,:,:,jp_pcs0_3d + 9) = zprofed (:,:,:) * zfact * tmask(:,:,:)
  476. # if ! defined key_kriest
  477. trc3d(:,:,:,jp_pcs0_3d + 10) = zprofen (:,:,:) * zfact * tmask(:,:,:)
  478. # endif
  479. ENDIF
  480. ENDIF
  481. IF(ln_ctl) THEN ! print mean trends (used for debugging)
  482. WRITE(charout, FMT="('prod')")
  483. CALL prt_ctl_trc_info(charout)
  484. CALL prt_ctl_trc(tab4d=tra, mask=tmask, clinfo=ctrcnm)
  485. ENDIF
  486. !
  487. CALL wrk_dealloc( jpi, jpj, zmixnano, zmixdiat, zstrn )
  488. CALL wrk_dealloc( jpi, jpj, jpk, zpislopead, zpislopead2, zprdia, zprbio, zprdch, zprnch, zysopt )
  489. CALL wrk_dealloc( jpi, jpj, jpk, zprorca, zprorcad, zprofed, zprofen, zprochln, zprochld, zpronew, zpronewd )
  490. !
  491. IF( nn_timing == 1 ) CALL timing_stop('p4z_prod')
  492. !
  493. END SUBROUTINE p4z_prod
  494. SUBROUTINE p4z_prod_init
  495. !!----------------------------------------------------------------------
  496. !! *** ROUTINE p4z_prod_init ***
  497. !!
  498. !! ** Purpose : Initialization of phytoplankton production parameters
  499. !!
  500. !! ** Method : Read the nampisprod namelist and check the parameters
  501. !! called at the first timestep (nittrc000)
  502. !!
  503. !! ** input : Namelist nampisprod
  504. !!----------------------------------------------------------------------
  505. !
  506. NAMELIST/nampisprod/ pislope, pislope2, xadap, ln_newprod, bresp, excret, excret2, &
  507. & chlcnm, chlcdm, chlcmin, fecnm, fecdm, grosip
  508. INTEGER :: ios ! Local integer output status for namelist read
  509. !!----------------------------------------------------------------------
  510. REWIND( numnatp_ref ) ! Namelist nampisprod in reference namelist : Pisces phytoplankton production
  511. READ ( numnatp_ref, nampisprod, IOSTAT = ios, ERR = 901)
  512. 901 IF( ios /= 0 ) CALL ctl_nam ( ios , 'nampisprod in reference namelist', lwp )
  513. REWIND( numnatp_cfg ) ! Namelist nampisprod in configuration namelist : Pisces phytoplankton production
  514. READ ( numnatp_cfg, nampisprod, IOSTAT = ios, ERR = 902 )
  515. 902 IF( ios /= 0 ) CALL ctl_nam ( ios , 'nampisprod in configuration namelist', lwp )
  516. IF(lwm) WRITE ( numonp, nampisprod )
  517. IF(lwp) THEN ! control print
  518. WRITE(numout,*) ' '
  519. WRITE(numout,*) ' Namelist parameters for phytoplankton growth, nampisprod'
  520. WRITE(numout,*) ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~'
  521. WRITE(numout,*) ' Enable new parame. of production (T/F) ln_newprod =', ln_newprod
  522. WRITE(numout,*) ' mean Si/C ratio grosip =', grosip
  523. WRITE(numout,*) ' P-I slope pislope =', pislope
  524. WRITE(numout,*) ' Acclimation factor to low light xadap =', xadap
  525. WRITE(numout,*) ' excretion ratio of nanophytoplankton excret =', excret
  526. WRITE(numout,*) ' excretion ratio of diatoms excret2 =', excret2
  527. IF( ln_newprod ) THEN
  528. WRITE(numout,*) ' basal respiration in phytoplankton bresp =', bresp
  529. WRITE(numout,*) ' Maximum Chl/C in phytoplankton chlcmin =', chlcmin
  530. ENDIF
  531. WRITE(numout,*) ' P-I slope for diatoms pislope2 =', pislope2
  532. WRITE(numout,*) ' Minimum Chl/C in nanophytoplankton chlcnm =', chlcnm
  533. WRITE(numout,*) ' Minimum Chl/C in diatoms chlcdm =', chlcdm
  534. WRITE(numout,*) ' Maximum Fe/C in nanophytoplankton fecnm =', fecnm
  535. WRITE(numout,*) ' Minimum Fe/C in diatoms fecdm =', fecdm
  536. ENDIF
  537. !
  538. r1_rday = 1._wp / rday
  539. texcret = 1._wp - excret
  540. texcret2 = 1._wp - excret2
  541. tpp = 0._wp
  542. !
  543. END SUBROUTINE p4z_prod_init
  544. INTEGER FUNCTION p4z_prod_alloc()
  545. !!----------------------------------------------------------------------
  546. !! *** ROUTINE p4z_prod_alloc ***
  547. !!----------------------------------------------------------------------
  548. ALLOCATE( prmax(jpi,jpj,jpk), quotan(jpi,jpj,jpk), quotad(jpi,jpj,jpk), STAT = p4z_prod_alloc )
  549. !
  550. IF( p4z_prod_alloc /= 0 ) CALL ctl_warn('p4z_prod_alloc : failed to allocate arrays.')
  551. !
  552. END FUNCTION p4z_prod_alloc
  553. #else
  554. !!======================================================================
  555. !! Dummy module : No PISCES bio-model
  556. !!======================================================================
  557. CONTAINS
  558. SUBROUTINE p4z_prod ! Empty routine
  559. END SUBROUTINE p4z_prod
  560. #endif
  561. !!======================================================================
  562. END MODULE p4zprod