trc.F90 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. MODULE trc
  2. !!======================================================================
  3. !! *** MODULE trc ***
  4. !! Passive tracers : module for tracers defined
  5. !!======================================================================
  6. !! History : OPA ! 1996-01 (M. Levy) Original code
  7. !! - ! 2000-04 (O. Aumont, M.A. Foujols) HAMOCC3 and P3ZD
  8. !! NEMO 1.0 ! 2004-03 (C. Ethe) Free form and module
  9. !!----------------------------------------------------------------------
  10. #if defined key_top
  11. !!----------------------------------------------------------------------
  12. !! 'key_top' TOP models
  13. !!----------------------------------------------------------------------
  14. USE par_oce
  15. USE par_trc
  16. IMPLICIT NONE
  17. PUBLIC
  18. PUBLIC trc_alloc ! called by nemogcm.F90
  19. !! parameters for the control of passive tracers
  20. !! ---------------------------------------------
  21. INTEGER, PUBLIC :: numnat_ref = -1 !: logical unit for the reference passive tracer namelist_top_ref
  22. INTEGER, PUBLIC :: numnat_cfg = -1 !: logical unit for the reference passive tracer namelist_top_cfg
  23. INTEGER, PUBLIC :: numont = -1 !: logical unit for the reference passive tracer namelist output output.namelist.top
  24. INTEGER, PUBLIC :: numstr !: logical unit for tracer statistics
  25. INTEGER, PUBLIC :: numrtr !: logical unit for trc restart (read )
  26. INTEGER, PUBLIC :: numrtw !: logical unit for trc restart ( write )
  27. !! passive tracers fields (before,now,after)
  28. !! --------------------------------------------------
  29. REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) :: trai !: initial total tracer
  30. REAL(wp), PUBLIC :: areatot !: total volume
  31. REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,: ) :: cvol !: volume correction -degrad option-
  32. REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:,:) :: trn !: tracer concentration for now time step
  33. REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:,:) :: tra !: tracer concentration for next time step
  34. REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:,:) :: trb !: tracer concentration for before time step
  35. REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,: ) :: sbc_trc_b !: Before sbc fluxes for tracers
  36. REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,: ) :: sbc_trc !: Now sbc fluxes for tracers
  37. REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,: ) :: trc_i !: prescribed tracer concentration in sea ice for SBC
  38. REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,: ) :: trc_o !: prescribed tracer concentration in ocean for SBC
  39. INTEGER , PUBLIC :: nn_ice_tr !: handling of sea ice tracers
  40. !! interpolated gradient
  41. !!--------------------------------------------------
  42. REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: gtru !: hor. gradient at u-points at bottom ocean level
  43. REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: gtrv !: hor. gradient at v-points at bottom ocean level
  44. REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: gtrui !: hor. gradient at u-points at top ocean level
  45. REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: gtrvi !: hor. gradient at v-points at top ocean level
  46. REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: qsr_mean !: daily mean qsr
  47. !! passive tracers (input and output)
  48. !! ------------------------------------------
  49. LOGICAL , PUBLIC :: ln_rsttr !: boolean term for restart i/o for passive tracers (namelist)
  50. LOGICAL , PUBLIC :: lrst_trc !: logical to control the trc restart write
  51. INTEGER , PUBLIC :: nn_writetrc !: time step frequency for concentration outputs (namelist)
  52. INTEGER , PUBLIC :: nutwrs !: output FILE for passive tracers restart
  53. INTEGER , PUBLIC :: nutrst !: logical unit for restart FILE for passive tracers
  54. INTEGER , PUBLIC :: nn_rsttr !: control of the time step ( 0 or 1 ) for pass. tr.
  55. CHARACTER(len = 80) , PUBLIC :: cn_trcrst_in !: suffix of pass. tracer restart name (input)
  56. CHARACTER(len = 256), PUBLIC :: cn_trcrst_indir !: restart input directory
  57. CHARACTER(len = 80) , PUBLIC :: cn_trcrst_out !: suffix of pass. tracer restart name (output)
  58. CHARACTER(len = 256), PUBLIC :: cn_trcrst_outdir !: restart output directory
  59. REAL(wp) , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) :: rdttrc !: vertical profile of passive tracer time step
  60. LOGICAL , PUBLIC :: ln_top_euler !: boolean term for euler integration
  61. LOGICAL , PUBLIC :: ln_trcdta !: Read inputs data from files
  62. LOGICAL , PUBLIC :: ln_trcdmp !: internal damping flag
  63. LOGICAL , PUBLIC :: ln_trcdmp_clo !: internal damping flag on closed seas
  64. INTEGER , PUBLIC :: nittrc000 !: first time step of passive tracers model
  65. LOGICAL , PUBLIC :: l_trcdm2dc !: Diurnal cycle for TOP
  66. !! Information for the ice module for tracers
  67. !! ------------------------------------------
  68. TYPE TRC_I_NML !--- Ice tracer namelist structure
  69. REAL(wp) :: trc_ratio ! ice-ocean trc ratio
  70. REAL(wp) :: trc_prescr ! prescribed ice trc cc
  71. CHARACTER(len=2) :: ctrc_o ! choice of ocean trc cc
  72. END TYPE
  73. REAL(wp), DIMENSION(jptra), PUBLIC :: trc_ice_ratio, & ! ice-ocean tracer ratio
  74. trc_ice_prescr ! prescribed ice trc cc
  75. CHARACTER(len=2), DIMENSION(jptra), PUBLIC :: cn_trc_o ! choice of ocean tracer cc
  76. !! information for outputs
  77. !! --------------------------------------------------
  78. TYPE, PUBLIC :: PTRACER !: Passive tracer type
  79. CHARACTER(len = 20) :: clsname !: short name
  80. CHARACTER(len = 80) :: cllname !: long name
  81. CHARACTER(len = 20) :: clunit !: unit
  82. LOGICAL :: llinit !: read in a file or not
  83. LOGICAL :: llsave !: save the tracer or not
  84. END TYPE PTRACER
  85. CHARACTER(len = 20), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) :: ctrcnm !: tracer name
  86. CHARACTER(len = 80), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) :: ctrcln !: trccer field long name
  87. CHARACTER(len = 20), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) :: ctrcun !: tracer unit
  88. LOGICAL , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) :: ln_trc_wri !: save the tracer or not
  89. TYPE, PUBLIC :: DIAG !: passive trcacer ddditional diagnostic type
  90. CHARACTER(len = 20) :: sname !: short name
  91. CHARACTER(len = 80) :: lname !: long name
  92. CHARACTER(len = 20) :: units !: unit
  93. END TYPE DIAG
  94. !! information for inputs
  95. !! --------------------------------------------------
  96. LOGICAL , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) :: ln_trc_ini !: Initialisation from data input file
  97. LOGICAL , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) :: ln_trc_obc !: Use open boundary condition data
  98. LOGICAL , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) :: ln_trc_sbc !: Use surface boundary condition data
  99. LOGICAL , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) :: ln_trc_cbc !: Use coastal boundary condition data
  100. !! additional 2D/3D outputs namelist
  101. !! --------------------------------------------------
  102. REAL(wp) , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:, :) :: trc2d !: additional 2d outputs array
  103. REAL(wp) , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:,:) :: trc3d !: additional 3d outputs array
  104. CHARACTER(len = 20), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) :: ctrc2d !: 2d field short name
  105. CHARACTER(len = 80), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) :: ctrc2l !: 2d field long name
  106. CHARACTER(len = 20), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) :: ctrc2u !: 2d field unit
  107. CHARACTER(len = 20), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) :: ctrc3d !: 3d field short name
  108. CHARACTER(len = 80), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) :: ctrc3l !: 3d field long name
  109. CHARACTER(len = 20), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) :: ctrc3u !: 3d field unit
  110. LOGICAL , PUBLIC :: ln_diatrc !: boolean term for additional diagnostic
  111. INTEGER , PUBLIC :: nn_writedia !: frequency of additional outputs
  112. !! Biological trends
  113. !! -----------------
  114. LOGICAL , PUBLIC :: ln_diabio !: boolean term for biological diagnostic
  115. INTEGER , PUBLIC :: nn_writebio !: frequency of biological outputs
  116. REAL(wp) , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:,:) :: trbio !: biological trends
  117. CHARACTER(len = 20), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) :: ctrbio !: bio field short name
  118. CHARACTER(len = 80), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) :: ctrbil !: bio field long name
  119. CHARACTER(len = 20), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) :: ctrbiu !: bio field unit
  120. !! variables to average over physics over passive tracer sub-steps.
  121. !! ----------------------------------------------------------------
  122. REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: un_tm !: i-horizontal velocity average [m/s]
  123. REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: vn_tm !: j-horizontal velocity average [m/s]
  124. REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:,:) :: tsn_tm !: t/s average [m/s]
  125. REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: avt_tm !: vertical diffusivity coeff. at w-point [m2/s]
  126. REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: rhop_tm !:
  127. # if defined key_zdfddm
  128. REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: avs_tm !: vertical double diffusivity coeff. at w-point [m/s]
  129. # endif
  130. #if defined key_ldfslp
  131. REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: wslpi_tm !: i-direction slope at u-, w-points
  132. REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: wslpj_tm !: j-direction slope at u-, w-points
  133. REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: uslp_tm !: j-direction slope at u-, w-points
  134. REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: vslp_tm !: j-direction slope at u-, w-points
  135. #endif
  136. #if defined key_trabbl
  137. REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: ahu_bbl_tm !: u-, w-points
  138. REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: ahv_bbl_tm !: j-direction slope at u-, w-points
  139. REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: utr_bbl_tm !: j-direction slope at u-, w-points
  140. REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: vtr_bbl_tm !: j-direction slope at u-, w-points
  141. #endif
  142. REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: sshn_tm !: average ssh for the now step [m]
  143. REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: sshb_hold !:hold sshb from the beginning of each sub-stepping[m]
  144. REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: rnf_tm !: river runoff
  145. REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: h_rnf_tm !: depth in metres to the bottom of the relevant grid box
  146. REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: hmld_tm !: mixed layer depth average [m]
  147. REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: fr_i_tm !: average ice fraction [m/s]
  148. REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: emp_tm !: freshwater budget: volume flux [Kg/m2/s]
  149. REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: fmmflx_tm !: freshwater budget: freezing/melting [Kg/m2/s]
  150. REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: emp_b_hold !: hold emp from the beginning of each sub-stepping[m]
  151. REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: qsr_tm !: solar radiation average [m]
  152. REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: wndm_tm !: 10m wind average [m]
  153. !
  154. ! Temporary physical arrays for sub_stepping
  155. REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:,:) :: tsn_temp
  156. REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: un_temp,vn_temp,wn_temp !: hold current values of avt, un, vn, wn
  157. REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: avt_temp, rhop_temp !: hold current values of avt, un, vn, wn
  158. REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: sshn_temp, sshb_temp, ssha_temp, rnf_temp,h_rnf_temp
  159. REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: hdivn_temp, rotn_temp
  160. REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: hdivb_temp, rotb_temp
  161. REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: hmld_temp, qsr_temp, fr_i_temp,wndm_temp
  162. REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: emp_temp, fmmflx_temp, emp_b_temp
  163. !
  164. #if defined key_trabbl
  165. REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: ahu_bbl_temp, ahv_bbl_temp, utr_bbl_temp, vtr_bbl_temp !: hold current values
  166. #endif
  167. !
  168. #if defined key_ldfslp
  169. REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: wslpi_temp, wslpj_temp, uslp_temp, vslp_temp !: hold current values
  170. #endif
  171. !
  172. # if defined key_zdfddm
  173. REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: avs_temp !: salinity vertical diffusivity coeff. at w-point [m/s]
  174. # endif
  175. !
  176. !!----------------------------------------------------------------------
  177. !! NEMO/TOP 3.3.1 , NEMO Consortium (2010)
  178. !! $Id$
  179. !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt)
  180. !!----------------------------------------------------------------------
  181. CONTAINS
  182. INTEGER FUNCTION trc_alloc()
  183. !!-------------------------------------------------------------------
  184. !! *** ROUTINE trc_alloc ***
  185. !!-------------------------------------------------------------------
  186. USE lib_mpp, ONLY: ctl_warn
  187. !!-------------------------------------------------------------------
  188. !
  189. ALLOCATE( trn(jpi,jpj,jpk,jptra), trb(jpi,jpj,jpk,jptra), tra(jpi,jpj,jpk,jptra), &
  190. & trc_i(jpi,jpj,jptra) , trc_o(jpi,jpj,jptra) , &
  191. & gtru (jpi,jpj,jptra) , gtrv (jpi,jpj,jptra) , &
  192. & gtrui(jpi,jpj,jptra) , gtrvi(jpi,jpj,jptra) , &
  193. & sbc_trc_b(jpi,jpj,jptra), sbc_trc(jpi,jpj,jptra) , &
  194. & cvol(jpi,jpj,jpk) , rdttrc(jpk) , trai(jptra) , &
  195. & ctrcnm(jptra) , ctrcln(jptra) , ctrcun(jptra) , &
  196. & ln_trc_ini(jptra) , ln_trc_wri(jptra) , qsr_mean(jpi,jpj) , STAT = trc_alloc )
  197. IF( trc_alloc /= 0 ) CALL ctl_warn('trc_alloc: failed to allocate arrays')
  198. !
  199. END FUNCTION trc_alloc
  200. #else
  201. !!----------------------------------------------------------------------
  202. !! Empty module : No passive tracer
  203. !!----------------------------------------------------------------------
  204. #endif
  205. !!======================================================================
  206. END MODULE trc