domrea.F90 40 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819
  1. MODULE domrea
  2. !!==============================================================================
  3. !! *** MODULE domrea ***
  4. !! Ocean initialization : domain initialization
  5. !!==============================================================================
  6. !!----------------------------------------------------------------------
  7. !! dom_init : initialize the space and time domain
  8. !! dom_nam : read and contral domain namelists
  9. !! dom_ctl : control print for the ocean domain
  10. !!----------------------------------------------------------------------
  11. !! * Modules used
  12. USE oce !
  13. USE dom_oce ! ocean space and time domain
  14. USE phycst ! physical constants
  15. USE in_out_manager ! I/O manager
  16. USE lib_mpp ! distributed memory computing library
  17. USE iom
  18. USE domstp ! domain: set the time-step
  19. USE lbclnk ! lateral boundary condition - MPP exchanges
  20. USE trc_oce ! shared ocean/biogeochemical variables
  21. USE wrk_nemo
  22. IMPLICIT NONE
  23. PRIVATE
  24. !! * Routine accessibility
  25. PUBLIC dom_rea ! called by opa.F90
  26. !! * Substitutions
  27. # include "domzgr_substitute.h90"
  28. # include "vectopt_loop_substitute.h90"
  29. !!----------------------------------------------------------------------
  30. !! NEMO/OFF 3.3 , NEMO Consortium (2010)
  31. !! $Id: domrea.F90 5504 2015-06-29 12:37:35Z cetlod $
  32. !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt)
  33. !!----------------------------------------------------------------------
  34. CONTAINS
  35. SUBROUTINE dom_rea
  36. !!----------------------------------------------------------------------
  37. !! *** ROUTINE dom_rea ***
  38. !!
  39. !! ** Purpose : Domain initialization. Call the routines that are
  40. !! required to create the arrays which define the space and time
  41. !! domain of the ocean model.
  42. !!
  43. !! ** Method :
  44. !! - dom_stp: defined the model time step
  45. !! - dom_rea: read the meshmask file if nmsh=1
  46. !!
  47. !! History :
  48. !! ! 90-10 (C. Levy - G. Madec) Original code
  49. !! ! 91-11 (G. Madec)
  50. !! ! 92-01 (M. Imbard) insert time step initialization
  51. !! ! 96-06 (G. Madec) generalized vertical coordinate
  52. !! ! 97-02 (G. Madec) creation of domwri.F
  53. !! ! 01-05 (E.Durand - G. Madec) insert closed sea
  54. !! 8.5 ! 02-08 (G. Madec) F90: Free form and module
  55. !!----------------------------------------------------------------------
  56. !! * Local declarations
  57. INTEGER :: jk ! dummy loop argument
  58. INTEGER :: iconf = 0 ! temporary integers
  59. !!----------------------------------------------------------------------
  60. IF(lwp) THEN
  61. WRITE(numout,*)
  62. WRITE(numout,*) 'dom_init : domain initialization'
  63. WRITE(numout,*) '~~~~~~~~'
  64. ENDIF
  65. CALL dom_nam ! read namelist ( namrun, namdom, namcla )
  66. CALL dom_msk ! Masks
  67. CALL dom_hgr ! Horizontal grid
  68. CALL dom_zgr ! Vertical mesh and bathymetry option
  69. !
  70. e12t (:,:) = e1t(:,:) * e2t(:,:)
  71. e1e2t (:,:) = e1t(:,:) * e2t(:,:)
  72. e12u (:,:) = e1u(:,:) * e2u(:,:)
  73. e12v (:,:) = e1v(:,:) * e2v(:,:)
  74. r1_e12t (:,:) = 1._wp / e12t(:,:)
  75. r1_e12u (:,:) = 1._wp / e12u(:,:)
  76. r1_e12v (:,:) = 1._wp / e12v(:,:)
  77. re2u_e1u(:,:) = e2u(:,:) / e1u(:,:)
  78. re1v_e2v(:,:) = e1v(:,:) / e2v(:,:)
  79. !
  80. CALL dom_stp ! Time step
  81. CALL dom_ctl ! Domain control
  82. END SUBROUTINE dom_rea
  83. SUBROUTINE dom_nam
  84. !!----------------------------------------------------------------------
  85. !! *** ROUTINE dom_nam ***
  86. !!
  87. !! ** Purpose : read domaine namelists and print the variables.
  88. !!
  89. !! ** input : - namrun namelist
  90. !! - namdom namelist
  91. !! - namcla namelist
  92. !!----------------------------------------------------------------------
  93. USE ioipsl
  94. INTEGER :: ios ! Local integer output status for namelist read
  95. NAMELIST/namrun/ cn_ocerst_indir, cn_ocerst_outdir, nn_stocklist, ln_rst_list, &
  96. & nn_no , cn_exp , cn_ocerst_in, cn_ocerst_out, ln_rstart , nn_rstctl, &
  97. & nn_it000, nn_itend , nn_date0 , nn_leapy , nn_istate , nn_stock , &
  98. & nn_write, ln_dimgnnn, ln_mskland , ln_cfmeta , ln_clobber, nn_chunksz, nn_euler
  99. NAMELIST/namdom/ nn_bathy , rn_bathy, rn_e3zps_min, rn_e3zps_rat, nn_msh , rn_hmin, &
  100. & nn_acc , rn_atfp , rn_rdt , rn_rdtmin , &
  101. & rn_rdtmax, rn_rdth , nn_baro , nn_closea , ln_crs, &
  102. & jphgr_msh, &
  103. & ppglam0, ppgphi0, ppe1_deg, ppe2_deg, ppe1_m, ppe2_m, &
  104. & ppsur, ppa0, ppa1, ppkth, ppacr, ppdzmin, pphmax, ldbletanh, &
  105. & ppa2, ppkth2, ppacr2
  106. NAMELIST/namcla/ nn_cla
  107. #if defined key_netcdf4
  108. NAMELIST/namnc4/ nn_nchunks_i, nn_nchunks_j, nn_nchunks_k, ln_nc4zip
  109. #endif
  110. !!----------------------------------------------------------------------
  111. REWIND( numnam_ref ) ! Namelist namrun in reference namelist : Parameters of the run
  112. READ ( numnam_ref, namrun, IOSTAT = ios, ERR = 901)
  113. 901 IF( ios /= 0 ) CALL ctl_nam ( ios , 'namrun in reference namelist', lwp )
  114. REWIND( numnam_cfg ) ! Namelist namrun in configuration namelist : Parameters of the run
  115. READ ( numnam_cfg, namrun, IOSTAT = ios, ERR = 902 )
  116. 902 IF( ios /= 0 ) CALL ctl_nam ( ios , 'namrun in configuration namelist', lwp )
  117. IF(lwm) WRITE ( numond, namrun )
  118. !
  119. IF(lwp) THEN ! control print
  120. WRITE(numout,*)
  121. WRITE(numout,*) 'dom_nam : domain initialization through namelist read'
  122. WRITE(numout,*) '~~~~~~~ '
  123. WRITE(numout,*) ' Namelist namrun'
  124. WRITE(numout,*) ' job number nn_no = ', nn_no
  125. WRITE(numout,*) ' experiment name for output cn_exp = ', cn_exp
  126. WRITE(numout,*) ' restart logical ln_rstart = ', ln_rstart
  127. WRITE(numout,*) ' control of time step nn_rstctl = ', nn_rstctl
  128. WRITE(numout,*) ' number of the first time step nn_it000 = ', nn_it000
  129. WRITE(numout,*) ' number of the last time step nn_itend = ', nn_itend
  130. WRITE(numout,*) ' initial calendar date aammjj nn_date0 = ', nn_date0
  131. WRITE(numout,*) ' leap year calendar (0/1) nn_leapy = ', nn_leapy
  132. WRITE(numout,*) ' initial state output nn_istate = ', nn_istate
  133. WRITE(numout,*) ' frequency of restart file nn_stock = ', nn_stock
  134. WRITE(numout,*) ' frequency of output file nn_write = ', nn_write
  135. WRITE(numout,*) ' multi file dimgout ln_dimgnnn = ', ln_dimgnnn
  136. WRITE(numout,*) ' mask land points ln_mskland = ', ln_mskland
  137. WRITE(numout,*) ' additional CF standard metadata ln_cfmeta = ', ln_cfmeta
  138. WRITE(numout,*) ' overwrite an existing file ln_clobber = ', ln_clobber
  139. WRITE(numout,*) ' NetCDF chunksize (bytes) nn_chunksz = ', nn_chunksz
  140. ENDIF
  141. no = nn_no ! conversion DOCTOR names into model names (this should disappear soon)
  142. cexper = cn_exp
  143. nrstdt = nn_rstctl
  144. nit000 = nn_it000
  145. nitend = nn_itend
  146. ndate0 = nn_date0
  147. nleapy = nn_leapy
  148. ninist = nn_istate
  149. nstock = nn_stock
  150. nstocklist = nn_stocklist
  151. nwrite = nn_write
  152. ! ! control of output frequency
  153. IF ( nstock == 0 .OR. nstock > nitend ) THEN
  154. WRITE(ctmp1,*) 'nstock = ', nstock, ' it is forced to ', nitend
  155. CALL ctl_warn( ctmp1 )
  156. nstock = nitend
  157. ENDIF
  158. IF ( nwrite == 0 ) THEN
  159. WRITE(ctmp1,*) 'nwrite = ', nwrite, ' it is forced to ', nitend
  160. CALL ctl_warn( ctmp1 )
  161. nwrite = nitend
  162. ENDIF
  163. ! parameters correspondting to nit000 - 1 (as we start the step loop with a call to day)
  164. ndastp = ndate0 - 1 ! ndate0 read in the namelist in dom_nam, we assume that we start run at 00:00
  165. adatrj = ( REAL( nit000-1, wp ) * rdttra(1) ) / rday
  166. #if defined key_agrif
  167. IF( Agrif_Root() ) THEN
  168. #endif
  169. SELECT CASE ( nleapy ) ! Choose calendar for IOIPSL
  170. CASE ( 1 )
  171. CALL ioconf_calendar('gregorian')
  172. IF(lwp) WRITE(numout,*) ' The IOIPSL calendar is "gregorian", i.e. leap year'
  173. CASE ( 0 )
  174. CALL ioconf_calendar('noleap')
  175. IF(lwp) WRITE(numout,*) ' The IOIPSL calendar is "noleap", i.e. no leap year'
  176. CASE ( 30 )
  177. CALL ioconf_calendar('360d')
  178. IF(lwp) WRITE(numout,*) ' The IOIPSL calendar is "360d", i.e. 360 days in a year'
  179. END SELECT
  180. #if defined key_agrif
  181. ENDIF
  182. #endif
  183. REWIND( numnam_ref ) ! Namelist namdom in reference namelist : space & time domain (bathymetry, mesh, timestep)
  184. READ ( numnam_ref, namdom, IOSTAT = ios, ERR = 903)
  185. 903 IF( ios /= 0 ) CALL ctl_nam ( ios , 'namdom in reference namelist', lwp )
  186. REWIND( numnam_cfg ) ! Namelist namdom in configuration namelist : space & time domain (bathymetry, mesh, timestep)
  187. READ ( numnam_cfg, namdom, IOSTAT = ios, ERR = 904 )
  188. 904 IF( ios /= 0 ) CALL ctl_nam ( ios , 'namdom in configuration namelist', lwp )
  189. IF(lwm) WRITE ( numond, namdom )
  190. IF(lwp) THEN
  191. WRITE(numout,*)
  192. WRITE(numout,*) ' Namelist namdom : space & time domain'
  193. WRITE(numout,*) ' flag read/compute bathymetry nn_bathy = ', nn_bathy
  194. WRITE(numout,*) ' Depth (if =0 bathy=jpkm1) rn_bathy = ', rn_bathy
  195. WRITE(numout,*) ' min depth of the ocean (>0) or rn_hmin = ', rn_hmin
  196. WRITE(numout,*) ' minimum thickness of partial rn_e3zps_min = ', rn_e3zps_min, ' (m)'
  197. WRITE(numout,*) ' step level rn_e3zps_rat = ', rn_e3zps_rat
  198. WRITE(numout,*) ' create mesh/mask file(s) nn_msh = ', nn_msh
  199. WRITE(numout,*) ' = 0 no file created '
  200. WRITE(numout,*) ' = 1 mesh_mask '
  201. WRITE(numout,*) ' = 2 mesh and mask '
  202. WRITE(numout,*) ' = 3 mesh_hgr, msh_zgr and mask '
  203. WRITE(numout,*) ' ocean time step rn_rdt = ', rn_rdt
  204. WRITE(numout,*) ' asselin time filter parameter rn_atfp = ', rn_atfp
  205. WRITE(numout,*) ' time-splitting: nb of sub time-step nn_baro = ', nn_baro
  206. WRITE(numout,*) ' acceleration of converge nn_acc = ', nn_acc
  207. WRITE(numout,*) ' nn_acc=1: surface tracer rdt rn_rdtmin = ', rn_rdtmin
  208. WRITE(numout,*) ' bottom tracer rdt rdtmax = ', rn_rdtmax
  209. WRITE(numout,*) ' depth of transition rn_rdth = ', rn_rdth
  210. WRITE(numout,*) ' suppression of closed seas (=0) nn_closea = ', nn_closea
  211. WRITE(numout,*) ' type of horizontal mesh jphgr_msh = ', jphgr_msh
  212. WRITE(numout,*) ' longitude of first raw and column T-point ppglam0 = ', ppglam0
  213. WRITE(numout,*) ' latitude of first raw and column T-point ppgphi0 = ', ppgphi0
  214. WRITE(numout,*) ' zonal grid-spacing (degrees) ppe1_deg = ', ppe1_deg
  215. WRITE(numout,*) ' meridional grid-spacing (degrees) ppe2_deg = ', ppe2_deg
  216. WRITE(numout,*) ' zonal grid-spacing (degrees) ppe1_m = ', ppe1_m
  217. WRITE(numout,*) ' meridional grid-spacing (degrees) ppe2_m = ', ppe2_m
  218. WRITE(numout,*) ' ORCA r4, r2 and r05 coefficients ppsur = ', ppsur
  219. WRITE(numout,*) ' ppa0 = ', ppa0
  220. WRITE(numout,*) ' ppa1 = ', ppa1
  221. WRITE(numout,*) ' ppkth = ', ppkth
  222. WRITE(numout,*) ' ppacr = ', ppacr
  223. WRITE(numout,*) ' Minimum vertical spacing ppdzmin = ', ppdzmin
  224. WRITE(numout,*) ' Maximum depth pphmax = ', pphmax
  225. WRITE(numout,*) ' Use double tanf function for vertical coordinates ldbletanh = ', ldbletanh
  226. WRITE(numout,*) ' Double tanh function parameters ppa2 = ', ppa2
  227. WRITE(numout,*) ' ppkth2 = ', ppkth2
  228. WRITE(numout,*) ' ppacr2 = ', ppacr2
  229. ENDIF
  230. ntopo = nn_bathy ! conversion DOCTOR names into model names (this should disappear soon)
  231. e3zps_min = rn_e3zps_min
  232. e3zps_rat = rn_e3zps_rat
  233. nmsh = nn_msh
  234. nacc = nn_acc
  235. atfp = rn_atfp
  236. rdt = rn_rdt
  237. rdtmin = rn_rdtmin
  238. rdtmax = rn_rdtmin
  239. rdth = rn_rdth
  240. REWIND( numnam_ref ) ! Namelist namcla in reference namelist : Cross land advection
  241. READ ( numnam_ref, namcla, IOSTAT = ios, ERR = 905)
  242. 905 IF( ios /= 0 ) CALL ctl_nam ( ios , 'namcla in reference namelist', lwp )
  243. REWIND( numnam_cfg ) ! Namelist namcla in configuration namelist : Cross land advection
  244. READ ( numnam_cfg, namcla, IOSTAT = ios, ERR = 906 )
  245. 906 IF( ios /= 0 ) CALL ctl_nam ( ios , 'namcla in configuration namelist', lwp )
  246. IF(lwm) WRITE( numond, namcla )
  247. IF(lwp) THEN
  248. WRITE(numout,*)
  249. WRITE(numout,*) ' Namelist namcla'
  250. WRITE(numout,*) ' cross land advection nn_cla = ', nn_cla
  251. ENDIF
  252. #if defined key_netcdf4
  253. ! ! NetCDF 4 case ("key_netcdf4" defined)
  254. REWIND( numnam_ref ) ! Namelist namnc4 in reference namelist : NETCDF
  255. READ ( numnam_ref, namnc4, IOSTAT = ios, ERR = 907)
  256. 907 IF( ios /= 0 ) CALL ctl_nam ( ios , 'namnc4 in reference namelist', lwp )
  257. REWIND( numnam_cfg ) ! Namelist namnc4 in configuration namelist : NETCDF
  258. READ ( numnam_cfg, namnc4, IOSTAT = ios, ERR = 908 )
  259. 908 IF( ios /= 0 ) CALL ctl_nam ( ios , 'namnc4 in configuration namelist', lwp )
  260. IF(lwm) WRITE( numond, namnc4 )
  261. IF(lwp) THEN ! control print
  262. WRITE(numout,*)
  263. WRITE(numout,*) ' Namelist namnc4 - Netcdf4 chunking parameters'
  264. WRITE(numout,*) ' number of chunks in i-dimension nn_nchunks_i = ', nn_nchunks_i
  265. WRITE(numout,*) ' number of chunks in j-dimension nn_nchunks_j = ', nn_nchunks_j
  266. WRITE(numout,*) ' number of chunks in k-dimension nn_nchunks_k = ', nn_nchunks_k
  267. WRITE(numout,*) ' apply netcdf4/hdf5 chunking & compression ln_nc4zip = ', ln_nc4zip
  268. ENDIF
  269. ! Put the netcdf4 settings into a simple structure (snc4set, defined in in_out_manager module)
  270. ! Note the chunk size in the unlimited (time) dimension will be fixed at 1
  271. snc4set%ni = nn_nchunks_i
  272. snc4set%nj = nn_nchunks_j
  273. snc4set%nk = nn_nchunks_k
  274. snc4set%luse = ln_nc4zip
  275. #else
  276. snc4set%luse = .FALSE. ! No NetCDF 4 case
  277. #endif
  278. !
  279. END SUBROUTINE dom_nam
  280. SUBROUTINE dom_msk
  281. !!---------------------------------------------------------------------
  282. !! *** ROUTINE dom_msk ***
  283. !! ** Purpose : Read the NetCDF file(s) which contain(s) all the
  284. !! ocean mask informations and defines the interior domain T-mask.
  285. !!
  286. !! ** Method : Read in a file all the arrays generated in routines
  287. !! dommsk: 'mask.nc' file
  288. !! The interior ocean/land mask is computed from tmask
  289. !! setting to zero the duplicated row and lines due to
  290. !! MPP exchange halos, est-west cyclic and north fold
  291. !! boundary conditions.
  292. !!
  293. !! ** Action : tmask_i : interiorland/ocean mask at t-point
  294. !! tpol : ???
  295. !!----------------------------------------------------------------------
  296. !
  297. INTEGER :: inum ! local integers
  298. INTEGER :: ji, jj, jk ! dummy loop indices
  299. INTEGER :: iif, iil, ijf, ijl ! local integers
  300. REAL(wp), POINTER, DIMENSION(:,:) :: zmbk
  301. !
  302. !!---------------------------------------------------------------------
  303. IF(lwp) WRITE(numout,*)
  304. IF(lwp) WRITE(numout,*) 'dom_rea : read NetCDF mesh and mask information file(s)'
  305. IF(lwp) WRITE(numout,*) '~~~~~~~'
  306. CALL wrk_alloc( jpi, jpj, zmbk )
  307. zmbk(:,:) = 0._wp
  308. IF(lwp) WRITE(numout,*) ' one file in "mesh_mask.nc" '
  309. CALL iom_open( 'mask', inum )
  310. ! ! masks (inum2)
  311. CALL iom_get( inum, jpdom_data, 'tmask', tmask )
  312. CALL iom_get( inum, jpdom_data, 'umask', umask )
  313. CALL iom_get( inum, jpdom_data, 'vmask', vmask )
  314. CALL iom_get( inum, jpdom_data, 'fmask', fmask )
  315. CALL lbc_lnk( tmask, 'T', 1._wp ) ! Lateral boundary conditions
  316. CALL lbc_lnk( umask, 'U', 1._wp )
  317. CALL lbc_lnk( vmask, 'V', 1._wp )
  318. CALL lbc_lnk( fmask, 'F', 1._wp )
  319. #if defined key_c1d
  320. ! set umask and vmask equal tmask in 1D configuration
  321. IF(lwp) WRITE(numout,*)
  322. IF(lwp) WRITE(numout,*) '********** 1D configuration : set umask and vmask equal tmask ********'
  323. IF(lwp) WRITE(numout,*) '********** ********'
  324. umask(:,:,:) = tmask(:,:,:)
  325. vmask(:,:,:) = tmask(:,:,:)
  326. #endif
  327. #if defined key_degrad
  328. CALL iom_get( inum, jpdom_data, 'facvolt', facvol )
  329. #endif
  330. CALL iom_get( inum, jpdom_data, 'mbathy', zmbk ) ! number of ocean t-points
  331. mbathy (:,:) = INT( zmbk(:,:) )
  332. misfdep(:,:) = 1 ! ice shelf case not yet done
  333. CALL zgr_bot_level ! mbk. arrays (deepest ocean t-, u- & v-points
  334. ! ! ============================
  335. ! ! close the files
  336. ! ! ============================
  337. !
  338. ! Interior domain mask (used for global sum)
  339. ! --------------------
  340. ssmask(:,:) = tmask(:,:,1)
  341. tmask_i(:,:) = tmask(:,:,1)
  342. iif = jpreci ! thickness of exchange halos in i-axis
  343. iil = nlci - jpreci + 1
  344. ijf = jprecj ! thickness of exchange halos in j-axis
  345. ijl = nlcj - jprecj + 1
  346. !
  347. tmask_i( 1 :iif, : ) = 0._wp ! first columns
  348. tmask_i(iil:jpi, : ) = 0._wp ! last columns (including mpp extra columns)
  349. tmask_i( : , 1 :ijf) = 0._wp ! first rows
  350. tmask_i( : ,ijl:jpj) = 0._wp ! last rows (including mpp extra rows)
  351. !
  352. ! ! north fold mask
  353. tpol(1:jpiglo) = 1._wp
  354. !
  355. IF( jperio == 3 .OR. jperio == 4 ) tpol(jpiglo/2+1:jpiglo) = 0._wp ! T-point pivot
  356. IF( jperio == 5 .OR. jperio == 6 ) tpol( 1 :jpiglo) = 0._wp ! F-point pivot
  357. IF( jperio == 3 .OR. jperio == 4 ) THEN ! T-point pivot: only half of the nlcj-1 row
  358. IF( mjg(ijl-1) == jpjglo-1 ) THEN
  359. DO ji = iif+1, iil-1
  360. tmask_i(ji,ijl-1) = tmask_i(ji,ijl-1) * tpol(mig(ji))
  361. END DO
  362. ENDIF
  363. ENDIF
  364. !
  365. ! (ISF) MIN(1,SUM(umask)) is here to check if you have effectively at
  366. ! least 1 wet u point
  367. DO jj = 1, jpjm1
  368. DO ji = 1, fs_jpim1 ! vector loop
  369. umask_i(ji,jj) = ssmask(ji,jj) * ssmask(ji+1,jj ) * MIN(1._wp,SUM(umask(ji,jj,:)))
  370. vmask_i(ji,jj) = ssmask(ji,jj) * ssmask(ji ,jj+1) * MIN(1._wp,SUM(vmask(ji,jj,:)))
  371. END DO
  372. DO ji = 1, jpim1 ! NO vector opt.
  373. fmask_i(ji,jj) = ssmask(ji,jj ) * ssmask(ji+1,jj ) &
  374. & * ssmask(ji,jj+1) * ssmask(ji+1,jj+1) * MIN(1._wp,SUM(fmask(ji,jj,:)))
  375. END DO
  376. END DO
  377. CALL lbc_lnk( umask_i, 'U', 1._wp ) ! Lateral boundary conditions
  378. CALL lbc_lnk( vmask_i, 'V', 1._wp )
  379. CALL lbc_lnk( fmask_i, 'F', 1._wp )
  380. ! 3. Ocean/land mask at wu-, wv- and w points
  381. !----------------------------------------------
  382. wmask (:,:,1) = tmask(:,:,1) ! ????????
  383. wumask(:,:,1) = umask(:,:,1) ! ????????
  384. wvmask(:,:,1) = vmask(:,:,1) ! ????????
  385. DO jk = 2, jpk
  386. wmask (:,:,jk) = tmask(:,:,jk) * tmask(:,:,jk-1)
  387. wumask(:,:,jk) = umask(:,:,jk) * umask(:,:,jk-1)
  388. wvmask(:,:,jk) = vmask(:,:,jk) * vmask(:,:,jk-1)
  389. END DO
  390. !
  391. CALL wrk_dealloc( jpi, jpj, zmbk )
  392. !
  393. CALL iom_close( inum )
  394. !
  395. END SUBROUTINE dom_msk
  396. SUBROUTINE zgr_bot_level
  397. !!----------------------------------------------------------------------
  398. !! *** ROUTINE zgr_bot_level ***
  399. !!
  400. !! ** Purpose : defines the vertical index of ocean bottom (mbk. arrays)
  401. !!
  402. !! ** Method : computes from mbathy with a minimum value of 1 over land
  403. !!
  404. !! ** Action : mbkt, mbku, mbkv : vertical indices of the deeptest
  405. !! ocean level at t-, u- & v-points
  406. !! (min value = 1 over land)
  407. !!----------------------------------------------------------------------
  408. !
  409. INTEGER :: ji, jj ! dummy loop indices
  410. REAL(wp), POINTER, DIMENSION(:,:) :: zmbk
  411. !!----------------------------------------------------------------------
  412. !
  413. IF(lwp) WRITE(numout,*)
  414. IF(lwp) WRITE(numout,*) ' zgr_bot_level : ocean bottom k-index of T-, U-, V- and W-levels '
  415. IF(lwp) WRITE(numout,*) ' ~~~~~~~~~~~~~'
  416. !
  417. CALL wrk_alloc( jpi, jpj, zmbk )
  418. !
  419. mbkt(:,:) = MAX( mbathy(:,:) , 1 ) ! bottom k-index of T-level (=1 over land)
  420. mikt(:,:) = 1 ; miku(:,:) = 1; mikv(:,:) = 1; ! top k-index of T-level (=1 over open ocean; >1 beneath ice shelf)
  421. ! ! bottom k-index of W-level = mbkt+1
  422. DO jj = 1, jpjm1 ! bottom k-index of u- (v-) level
  423. DO ji = 1, jpim1
  424. mbku(ji,jj) = MIN( mbkt(ji+1,jj ) , mbkt(ji,jj) )
  425. mbkv(ji,jj) = MIN( mbkt(ji ,jj+1) , mbkt(ji,jj) )
  426. END DO
  427. END DO
  428. ! converte into REAL to use lbc_lnk ; impose a min value of 1 as a zero can be set in lbclnk
  429. zmbk(:,:) = REAL( mbku(:,:), wp ) ; CALL lbc_lnk(zmbk,'U',1.) ; mbku (:,:) = MAX( INT( zmbk(:,:) ), 1 )
  430. zmbk(:,:) = REAL( mbkv(:,:), wp ) ; CALL lbc_lnk(zmbk,'V',1.) ; mbkv (:,:) = MAX( INT( zmbk(:,:) ), 1 )
  431. !
  432. CALL wrk_dealloc( jpi, jpj, zmbk )
  433. !
  434. END SUBROUTINE zgr_bot_level
  435. SUBROUTINE dom_hgr
  436. !!----------------------------------------------------------------------
  437. !! *** ROUTINE dom_hgr ***
  438. !!
  439. !! ** Purpose : Read the NetCDF file(s) which contain(s) all the
  440. !! ocean horizontal mesh informations
  441. !!
  442. !! ** Method : Read in a file all the arrays generated in routines
  443. !! domhgr: 'mesh_hgr.nc' file
  444. !!----------------------------------------------------------------------
  445. !!
  446. INTEGER :: ji, jj ! dummy loop indices
  447. INTEGER :: inum ! local integers
  448. !!----------------------------------------------------------------------
  449. IF(lwp) WRITE(numout,*)
  450. IF(lwp) WRITE(numout,*) 'dom_grd_hgr : read NetCDF mesh and mask information file(s)'
  451. IF(lwp) WRITE(numout,*) '~~~~~~~'
  452. IF(lwp) WRITE(numout,*) ' one file in "mesh_mask.nc" '
  453. CALL iom_open( 'mesh_hgr', inum )
  454. ! ! horizontal mesh (inum3)
  455. CALL iom_get( inum, jpdom_data, 'glamt', glamt )
  456. CALL iom_get( inum, jpdom_data, 'glamu', glamu )
  457. CALL iom_get( inum, jpdom_data, 'glamv', glamv )
  458. CALL iom_get( inum, jpdom_data, 'glamf', glamf )
  459. CALL iom_get( inum, jpdom_data, 'gphit', gphit )
  460. CALL iom_get( inum, jpdom_data, 'gphiu', gphiu )
  461. CALL iom_get( inum, jpdom_data, 'gphiv', gphiv )
  462. CALL iom_get( inum, jpdom_data, 'gphif', gphif )
  463. CALL iom_get( inum, jpdom_data, 'e1t', e1t )
  464. CALL iom_get( inum, jpdom_data, 'e1u', e1u )
  465. CALL iom_get( inum, jpdom_data, 'e1v', e1v )
  466. CALL iom_get( inum, jpdom_data, 'e2t', e2t )
  467. CALL iom_get( inum, jpdom_data, 'e2u', e2u )
  468. CALL iom_get( inum, jpdom_data, 'e2v', e2v )
  469. CALL iom_get( inum, jpdom_data, 'ff', ff )
  470. ! Control printing : Grid informations (if not restart)
  471. ! ----------------
  472. IF(lwp .AND. .NOT.ln_rstart ) THEN
  473. WRITE(numout,*)
  474. WRITE(numout,*) ' longitude and e1 scale factors'
  475. WRITE(numout,*) ' ------------------------------'
  476. WRITE(numout,9300) ( ji, glamt(ji,1), glamu(ji,1), &
  477. glamv(ji,1), glamf(ji,1), &
  478. e1t(ji,1), e1u(ji,1), &
  479. e1v(ji,1), ji = 1, jpi,10)
  480. WRITE(numout,*)
  481. WRITE(numout,*) ' latitude and e2 scale factors'
  482. WRITE(numout,*) ' -----------------------------'
  483. WRITE(numout,9300) ( jj, gphit(1,jj), gphiu(1,jj), &
  484. & gphiv(1,jj), gphif(1,jj), &
  485. & e2t (1,jj), e2u (1,jj), &
  486. & e2v (1,jj), jj = 1, jpj, 10 )
  487. ENDIF
  488. ! ! ============================
  489. ! ! close the files
  490. ! ! ============================
  491. CALL iom_close( inum )
  492. !
  493. 9300 FORMAT( 1x, i4, f8.2,1x, f8.2,1x, f8.2,1x, f8.2, 1x, &
  494. f19.10, 1x, f19.10, 1x, f19.10 )
  495. END SUBROUTINE dom_hgr
  496. SUBROUTINE dom_zgr
  497. !!----------------------------------------------------------------------
  498. !! *** ROUTINE dom_zgr ***
  499. !!
  500. !! ** Purpose : Read the NetCDF file(s) which contain(s) all the
  501. !! ocean horizontal mesh informations and/or set the depth of model levels
  502. !! and the resulting vertical scale factors.
  503. !!
  504. !! ** Method : - reference 1D vertical coordinate (gdep._1d, e3._1d)
  505. !! - read/set ocean depth and ocean levels (bathy, mbathy)
  506. !! - vertical coordinate (gdep., e3.) depending on the
  507. !! coordinate chosen :
  508. !! ln_zco=T z-coordinate
  509. !! ln_zps=T z-coordinate with partial steps
  510. !! ln_zco=T s-coordinate
  511. !!
  512. !! ** Action : define gdep., e3., mbathy and bathy
  513. !!----------------------------------------------------------------------
  514. INTEGER :: ioptio = 0 ! temporary integer
  515. INTEGER :: inum, ios
  516. INTEGER :: ji, jj, jk, ik
  517. REAL(wp) :: zrefdep
  518. !!
  519. NAMELIST/namzgr/ ln_zco, ln_zps, ln_sco, ln_isfcav
  520. REAL(wp), POINTER, DIMENSION(:,:) :: zprt, zprw
  521. !!----------------------------------------------------------------------
  522. REWIND( numnam_ref ) ! Namelist namzgr in reference namelist : Vertical coordinate
  523. READ ( numnam_ref, namzgr, IOSTAT = ios, ERR = 901 )
  524. 901 IF( ios /= 0 ) CALL ctl_nam ( ios , 'namzgr in reference namelist', lwp )
  525. REWIND( numnam_cfg ) ! Namelist namzgr in configuration namelist : Vertical coordinate
  526. READ ( numnam_cfg, namzgr, IOSTAT = ios, ERR = 902 )
  527. 902 IF( ios /= 0 ) CALL ctl_nam ( ios , 'namzgr in configuration namelist', lwp )
  528. IF(lwm) WRITE ( numond, namzgr )
  529. IF(lwp) THEN ! Control print
  530. WRITE(numout,*)
  531. WRITE(numout,*) 'dom_zgr : vertical coordinate'
  532. WRITE(numout,*) '~~~~~~~'
  533. WRITE(numout,*) ' Namelist namzgr : set vertical coordinate'
  534. WRITE(numout,*) ' z-coordinate - full steps ln_zco = ', ln_zco
  535. WRITE(numout,*) ' z-coordinate - partial steps ln_zps = ', ln_zps
  536. WRITE(numout,*) ' s- or hybrid z-s-coordinate ln_sco = ', ln_sco
  537. WRITE(numout,*) ' ice shelf cavity ln_isfcav = ', ln_isfcav
  538. ENDIF
  539. ioptio = 0 ! Check Vertical coordinate options
  540. IF( ln_zco ) ioptio = ioptio + 1
  541. IF( ln_zps ) ioptio = ioptio + 1
  542. IF( ln_sco ) ioptio = ioptio + 1
  543. IF( ln_isfcav ) ioptio = 33
  544. IF ( ioptio /= 1 ) CALL ctl_stop( ' none or several vertical coordinate options used' )
  545. IF ( ioptio == 33 ) CALL ctl_stop( ' isf cavity with off line module not yet done ' )
  546. IF(lwp) WRITE(numout,*) ' one file in "mesh_mask.nc" '
  547. CALL iom_open( 'mesh_zgr', inum )
  548. CALL iom_get( inum, jpdom_unknown, 'gdept_1d', gdept_1d ) ! depth
  549. CALL iom_get( inum, jpdom_unknown, 'gdepw_1d', gdepw_1d )
  550. IF( ln_zco .OR. ln_zps ) THEN
  551. CALL iom_get( inum, jpdom_unknown, 'e3t_1d' , e3t_1d ) ! reference scale factors
  552. CALL iom_get( inum, jpdom_unknown, 'e3w_1d' , e3w_1d )
  553. ENDIF
  554. !!gm BUG in s-coordinate this does not work!
  555. ! deepest/shallowest W level Above/Below ~10m
  556. zrefdep = 10._wp - ( 0.1_wp * MINVAL(e3w_1d) ) ! ref. depth with tolerance (10% of minimum layer thickness)
  557. nlb10 = MINLOC( gdepw_1d, mask = gdepw_1d > zrefdep, dim = 1 ) ! shallowest W level Below ~10m
  558. nla10 = nlb10 - 1 ! deepest W level Above ~10m
  559. !!gm end bug
  560. IF(lwp) THEN
  561. WRITE(numout,*)
  562. WRITE(numout,*) ' Reference z-coordinate depth and scale factors:'
  563. WRITE(numout, "(9x,' level gdept gdepw e3t e3w ')" )
  564. WRITE(numout, "(10x, i4, 4f9.2)" ) ( jk, gdept_1d(jk), gdepw_1d(jk), e3t_1d(jk), e3w_1d(jk), jk = 1, jpk )
  565. ENDIF
  566. DO jk = 1, jpk
  567. IF( e3w_1d (jk) <= 0._wp .OR. e3t_1d (jk) <= 0._wp ) CALL ctl_stop( ' e3w_1d or e3t_1d =< 0 ' )
  568. IF( gdepw_1d(jk) < 0._wp .OR. gdept_1d(jk) < 0._wp ) CALL ctl_stop( ' gdepw_1d or gdept_1d < 0 ' )
  569. END DO
  570. IF( lk_vvl ) THEN
  571. CALL iom_get( inum, jpdom_data, 'e3t_0', e3t_0(:,:,:) )
  572. CALL iom_get( inum, jpdom_data, 'e3u_0', e3u_0(:,:,:) )
  573. CALL iom_get( inum, jpdom_data, 'e3v_0', e3v_0(:,:,:) )
  574. CALL iom_get( inum, jpdom_data, 'e3w_0', e3w_0(:,:,:) )
  575. CALL iom_get( inum, jpdom_data, 'gdept_0', gdept_0(:,:,:) )
  576. CALL iom_get( inum, jpdom_data, 'gdepw_0', gdepw_0(:,:,:) )
  577. ht_0(:,:) = 0.0_wp ! Reference ocean depth at T-points
  578. DO jk = 1, jpk
  579. ht_0(:,:) = ht_0(:,:) + e3t_0(:,:,jk) * tmask(:,:,jk)
  580. END DO
  581. ELSE
  582. IF( ln_sco ) THEN ! s-coordinate
  583. CALL iom_get( inum, jpdom_data, 'hbatt', hbatt )
  584. CALL iom_get( inum, jpdom_data, 'hbatu', hbatu )
  585. CALL iom_get( inum, jpdom_data, 'hbatv', hbatv )
  586. CALL iom_get( inum, jpdom_data, 'hbatf', hbatf )
  587. CALL iom_get( inum, jpdom_unknown, 'gsigt', gsigt ) ! scaling coef.
  588. CALL iom_get( inum, jpdom_unknown, 'gsigw', gsigw )
  589. CALL iom_get( inum, jpdom_unknown, 'gsi3w', gsi3w )
  590. CALL iom_get( inum, jpdom_unknown, 'esigt', esigt )
  591. CALL iom_get( inum, jpdom_unknown, 'esigw', esigw )
  592. CALL iom_get( inum, jpdom_data, 'e3t_0', fse3t_n(:,:,:) ) ! scale factors
  593. CALL iom_get( inum, jpdom_data, 'e3u_0', fse3u_n(:,:,:) )
  594. CALL iom_get( inum, jpdom_data, 'e3v_0', fse3v_n(:,:,:) )
  595. CALL iom_get( inum, jpdom_data, 'e3w_0', fse3w_n(:,:,:) )
  596. ENDIF
  597. IF( ln_zps ) THEN ! z-coordinate - partial steps
  598. !
  599. IF( iom_varid( inum, 'e3t_0', ldstop = .FALSE. ) > 0 ) THEN
  600. CALL iom_get( inum, jpdom_data, 'e3t_0', fse3t_n(:,:,:) )
  601. CALL iom_get( inum, jpdom_data, 'e3u_0', fse3u_n(:,:,:) )
  602. CALL iom_get( inum, jpdom_data, 'e3v_0', fse3v_n(:,:,:) )
  603. CALL iom_get( inum, jpdom_data, 'e3w_0', fse3w_n(:,:,:) )
  604. ELSE ! 2D bottom scale factors
  605. CALL iom_get( inum, jpdom_data, 'e3t_ps', e3tp )
  606. CALL iom_get( inum, jpdom_data, 'e3w_ps', e3wp )
  607. ! ! deduces the 3D scale factors
  608. DO jk = 1, jpk
  609. fse3t_n(:,:,jk) = e3t_1d(jk) ! set to the ref. factors
  610. fse3u_n(:,:,jk) = e3t_1d(jk)
  611. fse3v_n(:,:,jk) = e3t_1d(jk)
  612. fse3w_n(:,:,jk) = e3w_1d(jk)
  613. END DO
  614. DO jj = 1,jpj ! adjust the deepest values
  615. DO ji = 1,jpi
  616. ik = mbkt(ji,jj)
  617. fse3t_n(ji,jj,ik) = e3tp(ji,jj) * tmask(ji,jj,1) + e3t_1d(1) * ( 1._wp - tmask(ji,jj,1) )
  618. fse3w_n(ji,jj,ik) = e3wp(ji,jj) * tmask(ji,jj,1) + e3w_1d(1) * ( 1._wp - tmask(ji,jj,1) )
  619. END DO
  620. END DO
  621. DO jk = 1,jpk ! Computed as the minimum of neighbooring scale factors
  622. DO jj = 1, jpjm1
  623. DO ji = 1, jpim1
  624. fse3u_n(ji,jj,jk) = MIN( fse3t_n(ji,jj,jk), fse3t_n(ji+1,jj,jk) )
  625. fse3v_n(ji,jj,jk) = MIN( fse3t_n(ji,jj,jk), fse3t_n(ji,jj+1,jk) )
  626. END DO
  627. END DO
  628. END DO
  629. CALL lbc_lnk( fse3u_n(:,:,:) , 'U', 1._wp ) ; CALL lbc_lnk( fse3uw_n(:,:,:), 'U', 1._wp ) ! lateral boundary conditions
  630. CALL lbc_lnk( fse3v_n(:,:,:) , 'V', 1._wp ) ; CALL lbc_lnk( fse3vw_n(:,:,:), 'V', 1._wp )
  631. !
  632. DO jk = 1, jpk ! set to z-scale factor if zero (i.e. along closed boundaries)
  633. WHERE( fse3u_n(:,:,jk) == 0._wp ) fse3u_n(:,:,jk) = e3t_1d(jk)
  634. WHERE( fse3v_n(:,:,jk) == 0._wp ) fse3v_n(:,:,jk) = e3t_1d(jk)
  635. END DO
  636. END IF
  637. IF( iom_varid( inum, 'gdept_0', ldstop = .FALSE. ) > 0 ) THEN ! 3D depth of t- and w-level
  638. CALL iom_get( inum, jpdom_data, 'gdept_0', fsdept_n(:,:,:) )
  639. CALL iom_get( inum, jpdom_data, 'gdepw_0', fsdepw_n(:,:,:) )
  640. ELSE ! 2D bottom depth
  641. CALL wrk_alloc( jpi, jpj, zprt, zprw )
  642. !
  643. CALL iom_get( inum, jpdom_data, 'hdept', zprt )
  644. CALL iom_get( inum, jpdom_data, 'hdepw', zprw )
  645. !
  646. DO jk = 1, jpk ! deduces the 3D depth
  647. fsdept_n(:,:,jk) = gdept_1d(jk)
  648. fsdepw_n(:,:,jk) = gdepw_1d(jk)
  649. END DO
  650. DO jj = 1, jpj
  651. DO ji = 1, jpi
  652. ik = mbkt(ji,jj)
  653. IF( ik > 0 ) THEN
  654. fsdepw_n(ji,jj,ik+1) = zprw(ji,jj)
  655. fsdept_n(ji,jj,ik ) = zprt(ji,jj)
  656. fsdept_n(ji,jj,ik+1) = fsdept_n(ji,jj,ik) + fse3t_n(ji,jj,ik)
  657. ENDIF
  658. END DO
  659. END DO
  660. CALL wrk_dealloc( jpi, jpj, zprt, zprw )
  661. ENDIF
  662. !
  663. ENDIF
  664. IF( ln_zco ) THEN ! Vertical coordinates and scales factors
  665. DO jk = 1, jpk
  666. fse3t_n(:,:,jk) = e3t_1d(jk) ! set to the ref. factors
  667. fse3u_n(:,:,jk) = e3t_1d(jk)
  668. fse3v_n(:,:,jk) = e3t_1d(jk)
  669. fse3w_n(:,:,jk) = e3w_1d(jk)
  670. fsdept_n(:,:,jk) = gdept_1d(jk)
  671. fsdepw_n(:,:,jk) = gdepw_1d(jk)
  672. END DO
  673. ENDIF
  674. !
  675. ENDIF
  676. ! ! ============================
  677. ! ! close the files
  678. ! ! ============================
  679. CALL iom_close( inum )
  680. !
  681. !
  682. END SUBROUTINE dom_zgr
  683. SUBROUTINE dom_ctl
  684. !!----------------------------------------------------------------------
  685. !! *** ROUTINE dom_ctl ***
  686. !!
  687. !! ** Purpose : Domain control.
  688. !!
  689. !! ** Method : compute and print extrema of masked scale factors
  690. !!
  691. !! History :
  692. !! 8.5 ! 02-08 (G. Madec) Original code
  693. !!----------------------------------------------------------------------
  694. !! * Local declarations
  695. INTEGER :: iimi1, ijmi1, iimi2, ijmi2, iima1, ijma1, iima2, ijma2
  696. INTEGER, DIMENSION(2) :: iloc !
  697. REAL(wp) :: ze1min, ze1max, ze2min, ze2max
  698. !!----------------------------------------------------------------------
  699. ! Extrema of the scale factors
  700. IF(lwp)WRITE(numout,*)
  701. IF(lwp)WRITE(numout,*) 'dom_ctl : extrema of the masked scale factors'
  702. IF(lwp)WRITE(numout,*) '~~~~~~~'
  703. IF (lk_mpp) THEN
  704. CALL mpp_minloc( e1t(:,:), tmask(:,:,1), ze1min, iimi1,ijmi1 )
  705. CALL mpp_minloc( e2t(:,:), tmask(:,:,1), ze2min, iimi2,ijmi2 )
  706. CALL mpp_maxloc( e1t(:,:), tmask(:,:,1), ze1max, iima1,ijma1 )
  707. CALL mpp_maxloc( e2t(:,:), tmask(:,:,1), ze2max, iima2,ijma2 )
  708. ELSE
  709. ze1min = MINVAL( e1t(:,:), mask = tmask(:,:,1) == 1.e0 )
  710. ze2min = MINVAL( e2t(:,:), mask = tmask(:,:,1) == 1.e0 )
  711. ze1max = MAXVAL( e1t(:,:), mask = tmask(:,:,1) == 1.e0 )
  712. ze2max = MAXVAL( e2t(:,:), mask = tmask(:,:,1) == 1.e0 )
  713. iloc = MINLOC( e1t(:,:), mask = tmask(:,:,1) == 1.e0 )
  714. iimi1 = iloc(1) + nimpp - 1
  715. ijmi1 = iloc(2) + njmpp - 1
  716. iloc = MINLOC( e2t(:,:), mask = tmask(:,:,1) == 1.e0 )
  717. iimi2 = iloc(1) + nimpp - 1
  718. ijmi2 = iloc(2) + njmpp - 1
  719. iloc = MAXLOC( e1t(:,:), mask = tmask(:,:,1) == 1.e0 )
  720. iima1 = iloc(1) + nimpp - 1
  721. ijma1 = iloc(2) + njmpp - 1
  722. iloc = MAXLOC( e2t(:,:), mask = tmask(:,:,1) == 1.e0 )
  723. iima2 = iloc(1) + nimpp - 1
  724. ijma2 = iloc(2) + njmpp - 1
  725. ENDIF
  726. IF(lwp) THEN
  727. WRITE(numout,"(14x,'e1t maxi: ',1f10.2,' at i = ',i5,' j= ',i5)") ze1max, iima1, ijma1
  728. WRITE(numout,"(14x,'e1t mini: ',1f10.2,' at i = ',i5,' j= ',i5)") ze1min, iimi1, ijmi1
  729. WRITE(numout,"(14x,'e2t maxi: ',1f10.2,' at i = ',i5,' j= ',i5)") ze2max, iima2, ijma2
  730. WRITE(numout,"(14x,'e2t mini: ',1f10.2,' at i = ',i5,' j= ',i5)") ze2min, iimi2, ijmi2
  731. ENDIF
  732. END SUBROUTINE dom_ctl
  733. !!======================================================================
  734. END MODULE domrea