floblk.F90 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392
  1. MODULE floblk
  2. !!======================================================================
  3. !! *** MODULE floblk ***
  4. !! Ocean floats : trajectory computation
  5. !!======================================================================
  6. #if defined key_floats || defined key_esopa
  7. !!----------------------------------------------------------------------
  8. !! 'key_floats' float trajectories
  9. !!----------------------------------------------------------------------
  10. !! flotblk : compute float trajectories with Blanke algorithme
  11. !!----------------------------------------------------------------------
  12. USE flo_oce ! ocean drifting floats
  13. USE oce ! ocean dynamics and tracers
  14. USE dom_oce ! ocean space and time domain
  15. USE phycst ! physical constants
  16. USE in_out_manager ! I/O manager
  17. USE lib_mpp ! distribued memory computing library
  18. USE wrk_nemo ! working array
  19. IMPLICIT NONE
  20. PRIVATE
  21. PUBLIC flo_blk ! routine called by floats.F90
  22. !! * Substitutions
  23. # include "domzgr_substitute.h90"
  24. !!----------------------------------------------------------------------
  25. !! NEMO/OPA 3.3 , NEMO Consortium (2010)
  26. !! $Id: floblk.F90 4328 2013-12-06 10:25:13Z davestorkey $
  27. !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt)
  28. !!----------------------------------------------------------------------
  29. CONTAINS
  30. SUBROUTINE flo_blk( kt )
  31. !!---------------------------------------------------------------------
  32. !! *** ROUTINE flo_blk ***
  33. !!
  34. !! ** Purpose : Compute the geographical position,latitude, longitude
  35. !! and depth of each float at each time step.
  36. !!
  37. !! ** Method : The position of a float is computed with Bruno Blanke
  38. !! algorithm. We need to know the velocity field, the old positions
  39. !! of the floats and the grid defined on the domain.
  40. !!----------------------------------------------------------------------
  41. INTEGER, INTENT( in ) :: kt ! ocean time step
  42. !!
  43. INTEGER :: jfl ! dummy loop arguments
  44. INTEGER :: ind, ifin, iloop
  45. REAL(wp) :: &
  46. zuinfl,zvinfl,zwinfl, & ! transport across the input face
  47. zuoutfl,zvoutfl,zwoutfl, & ! transport across the ouput face
  48. zvol, & ! volume of the mesh
  49. zsurfz, & ! surface of the face of the mesh
  50. zind
  51. REAL(wp), DIMENSION ( 2 ) :: zsurfx, zsurfy ! surface of the face of the mesh
  52. INTEGER , POINTER, DIMENSION ( : ) :: iil, ijl, ikl ! index of nearest mesh
  53. INTEGER , POINTER, DIMENSION ( : ) :: iiloc , ijloc
  54. INTEGER , POINTER, DIMENSION ( : ) :: iiinfl, ijinfl, ikinfl ! index of input mesh of the float.
  55. INTEGER , POINTER, DIMENSION ( : ) :: iioutfl, ijoutfl, ikoutfl ! index of output mesh of the float.
  56. REAL(wp) , POINTER, DIMENSION ( : ) :: zgifl, zgjfl, zgkfl ! position of floats, index on
  57. ! ! velocity mesh.
  58. REAL(wp) , POINTER, DIMENSION ( : ) :: ztxfl, ztyfl, ztzfl ! time for a float to quit the mesh
  59. ! ! across one of the face x,y and z
  60. REAL(wp) , POINTER, DIMENSION ( : ) :: zttfl ! time for a float to quit the mesh
  61. REAL(wp) , POINTER, DIMENSION ( : ) :: zagefl ! time during which, trajectorie of
  62. ! ! the float has been computed
  63. REAL(wp) , POINTER, DIMENSION ( : ) :: zagenewfl ! new age of float after calculation
  64. ! ! of new position
  65. REAL(wp) , POINTER, DIMENSION ( : ) :: zufl, zvfl, zwfl ! interpolated vel. at float position
  66. REAL(wp) , POINTER, DIMENSION ( : ) :: zudfl, zvdfl, zwdfl ! velocity diff input/output of mesh
  67. REAL(wp) , POINTER, DIMENSION ( : ) :: zgidfl, zgjdfl, zgkdfl ! direction index of float
  68. !!---------------------------------------------------------------------
  69. CALL wrk_alloc( jpnfl , iil , ijl , ikl , iiloc , ijloc )
  70. CALL wrk_alloc( jpnfl , iiinfl, ijinfl, ikinfl, iioutfl, ijoutfl, ikoutfl )
  71. CALL wrk_alloc( jpnfl , zgifl , zgjfl , zgkfl , ztxfl , ztyfl , ztzfl , zttfl , zagefl, zagenewfl)
  72. CALL wrk_alloc( jpnfl , zufl , zvfl , zwfl , zudfl , zvdfl , zwdfl , zgidfl, zgjdfl, zgkdfl )
  73. IF( kt == nit000 ) THEN
  74. IF(lwp) WRITE(numout,*)
  75. IF(lwp) WRITE(numout,*) 'flo_blk : compute Blanke trajectories for floats '
  76. IF(lwp) WRITE(numout,*) '~~~~~~~ '
  77. ENDIF
  78. ! Initialisation of parameters
  79. DO jfl = 1, jpnfl
  80. ! ages of floats are put at zero
  81. zagefl(jfl) = 0.
  82. ! index on the velocity grid
  83. ! We considere k coordinate negative, with this transformation
  84. ! the computation in the 3 direction is the same.
  85. zgifl(jfl) = tpifl(jfl) - 0.5
  86. zgjfl(jfl) = tpjfl(jfl) - 0.5
  87. zgkfl(jfl) = MIN(-1.,-(tpkfl(jfl)))
  88. ! surface drift every 10 days
  89. IF( ln_argo ) THEN
  90. IF( MOD(kt,150) >= 146 .OR. MOD(kt,150) == 0 ) zgkfl(jfl) = -1.
  91. ENDIF
  92. ! index of T mesh
  93. iil(jfl) = 1 + INT(zgifl(jfl))
  94. ijl(jfl) = 1 + INT(zgjfl(jfl))
  95. ikl(jfl) = INT(zgkfl(jfl))
  96. END DO
  97. iloop = 0
  98. 222 DO jfl = 1, jpnfl
  99. # if defined key_mpp_mpi
  100. IF( (iil(jfl) >= (mig(nldi)-jpizoom+1)) .AND. (iil(jfl) <= (mig(nlei)-jpizoom+1)) .AND. &
  101. (ijl(jfl) >= (mjg(nldj)-jpjzoom+1)) .AND. (ijl(jfl) <= (mjg(nlej)-jpjzoom+1)) ) THEN
  102. iiloc(jfl) = iil(jfl) - (mig(1)-jpizoom+1) + 1
  103. ijloc(jfl) = ijl(jfl) - (mjg(1)-jpjzoom+1) + 1
  104. # else
  105. iiloc(jfl) = iil(jfl)
  106. ijloc(jfl) = ijl(jfl)
  107. # endif
  108. ! compute the transport across the mesh where the float is.
  109. !!bug (gm) change e3t into fse3. but never checked
  110. zsurfx(1) = e2u(iiloc(jfl)-1,ijloc(jfl) ) * fse3u(iiloc(jfl)-1,ijloc(jfl) ,-ikl(jfl))
  111. zsurfx(2) = e2u(iiloc(jfl) ,ijloc(jfl) ) * fse3u(iiloc(jfl) ,ijloc(jfl) ,-ikl(jfl))
  112. zsurfy(1) = e1v(iiloc(jfl) ,ijloc(jfl)-1) * fse3v(iiloc(jfl) ,ijloc(jfl)-1,-ikl(jfl))
  113. zsurfy(2) = e1v(iiloc(jfl) ,ijloc(jfl) ) * fse3v(iiloc(jfl) ,ijloc(jfl) ,-ikl(jfl))
  114. ! for a isobar float zsurfz is put to zero. The vertical velocity will be zero too.
  115. zsurfz = e1t(iiloc(jfl),ijloc(jfl)) * e2t(iiloc(jfl),ijloc(jfl))
  116. zvol = zsurfz * fse3t(iiloc(jfl),ijloc(jfl),-ikl(jfl))
  117. !
  118. zuinfl =( ub(iiloc(jfl)-1,ijloc(jfl),-ikl(jfl)) + un(iiloc(jfl)-1,ijloc(jfl),-ikl(jfl)) )/2.*zsurfx(1)
  119. zuoutfl=( ub(iiloc(jfl) ,ijloc(jfl),-ikl(jfl)) + un(iiloc(jfl) ,ijloc(jfl),-ikl(jfl)) )/2.*zsurfx(2)
  120. zvinfl =( vb(iiloc(jfl),ijloc(jfl)-1,-ikl(jfl)) + vn(iiloc(jfl),ijloc(jfl)-1,-ikl(jfl)) )/2.*zsurfy(1)
  121. zvoutfl=( vb(iiloc(jfl),ijloc(jfl) ,-ikl(jfl)) + vn(iiloc(jfl),ijloc(jfl) ,-ikl(jfl)) )/2.*zsurfy(2)
  122. zwinfl =-(wb(iiloc(jfl),ijloc(jfl),-(ikl(jfl)-1)) &
  123. & + wn(iiloc(jfl),ijloc(jfl),-(ikl(jfl)-1)) )/2. * zsurfz*nisobfl(jfl)
  124. zwoutfl=-(wb(iiloc(jfl),ijloc(jfl),- ikl(jfl) ) &
  125. & + wn(iiloc(jfl),ijloc(jfl),- ikl(jfl) ) )/2. * zsurfz*nisobfl(jfl)
  126. ! interpolation of velocity field on the float initial position
  127. zufl(jfl)= zuinfl + ( zgifl(jfl) - float(iil(jfl)-1) ) * ( zuoutfl - zuinfl)
  128. zvfl(jfl)= zvinfl + ( zgjfl(jfl) - float(ijl(jfl)-1) ) * ( zvoutfl - zvinfl)
  129. zwfl(jfl)= zwinfl + ( zgkfl(jfl) - float(ikl(jfl)-1) ) * ( zwoutfl - zwinfl)
  130. ! faces of input and output
  131. ! u-direction
  132. IF( zufl(jfl) < 0. ) THEN
  133. iioutfl(jfl) = iil(jfl) - 1.
  134. iiinfl (jfl) = iil(jfl)
  135. zind = zuinfl
  136. zuinfl = zuoutfl
  137. zuoutfl= zind
  138. ELSE
  139. iioutfl(jfl) = iil(jfl)
  140. iiinfl (jfl) = iil(jfl) - 1
  141. ENDIF
  142. ! v-direction
  143. IF( zvfl(jfl) < 0. ) THEN
  144. ijoutfl(jfl) = ijl(jfl) - 1.
  145. ijinfl (jfl) = ijl(jfl)
  146. zind = zvinfl
  147. zvinfl = zvoutfl
  148. zvoutfl = zind
  149. ELSE
  150. ijoutfl(jfl) = ijl(jfl)
  151. ijinfl (jfl) = ijl(jfl) - 1.
  152. ENDIF
  153. ! w-direction
  154. IF( zwfl(jfl) < 0. ) THEN
  155. ikoutfl(jfl) = ikl(jfl) - 1.
  156. ikinfl (jfl) = ikl(jfl)
  157. zind = zwinfl
  158. zwinfl = zwoutfl
  159. zwoutfl = zind
  160. ELSE
  161. ikoutfl(jfl) = ikl(jfl)
  162. ikinfl (jfl) = ikl(jfl) - 1.
  163. ENDIF
  164. ! compute the time to go out the mesh across a face
  165. ! u-direction
  166. zudfl (jfl) = zuoutfl - zuinfl
  167. zgidfl(jfl) = float(iioutfl(jfl) - iiinfl(jfl))
  168. IF( zufl(jfl)*zuoutfl <= 0. ) THEN
  169. ztxfl(jfl) = 1.E99
  170. ELSE
  171. IF( ABS(zudfl(jfl)) >= 1.E-5 ) THEN
  172. ztxfl(jfl)= zgidfl(jfl)/zudfl(jfl) * LOG(zuoutfl/zufl (jfl))
  173. ELSE
  174. ztxfl(jfl)=(float(iioutfl(jfl))-zgifl(jfl))/zufl(jfl)
  175. ENDIF
  176. IF( (ABS(zgifl(jfl)-float(iiinfl (jfl))) <= 1.E-7) .OR. &
  177. (ABS(zgifl(jfl)-float(iioutfl(jfl))) <= 1.E-7) ) THEN
  178. ztxfl(jfl)=(zgidfl(jfl))/zufl(jfl)
  179. ENDIF
  180. ENDIF
  181. ! v-direction
  182. zvdfl (jfl) = zvoutfl - zvinfl
  183. zgjdfl(jfl) = float(ijoutfl(jfl)-ijinfl(jfl))
  184. IF( zvfl(jfl)*zvoutfl <= 0. ) THEN
  185. ztyfl(jfl) = 1.E99
  186. ELSE
  187. IF( ABS(zvdfl(jfl)) >= 1.E-5 ) THEN
  188. ztyfl(jfl) = zgjdfl(jfl)/zvdfl(jfl) * LOG(zvoutfl/zvfl (jfl))
  189. ELSE
  190. ztyfl(jfl) = (float(ijoutfl(jfl)) - zgjfl(jfl))/zvfl(jfl)
  191. ENDIF
  192. IF( (ABS(zgjfl(jfl)-float(ijinfl (jfl))) <= 1.E-7) .OR. &
  193. (ABS(zgjfl(jfl)-float(ijoutfl(jfl))) <= 1.E-7) ) THEN
  194. ztyfl(jfl) = (zgjdfl(jfl)) / zvfl(jfl)
  195. ENDIF
  196. ENDIF
  197. ! w-direction
  198. IF( nisobfl(jfl) == 1. ) THEN
  199. zwdfl (jfl) = zwoutfl - zwinfl
  200. zgkdfl(jfl) = float(ikoutfl(jfl) - ikinfl(jfl))
  201. IF( zwfl(jfl)*zwoutfl <= 0. ) THEN
  202. ztzfl(jfl) = 1.E99
  203. ELSE
  204. IF( ABS(zwdfl(jfl)) >= 1.E-5 ) THEN
  205. ztzfl(jfl) = zgkdfl(jfl)/zwdfl(jfl) * LOG(zwoutfl/zwfl (jfl))
  206. ELSE
  207. ztzfl(jfl) = (float(ikoutfl(jfl)) - zgkfl(jfl))/zwfl(jfl)
  208. ENDIF
  209. IF( (ABS(zgkfl(jfl)-float(ikinfl (jfl))) <= 1.E-7) .OR. &
  210. (ABS(zgkfl(jfl)-float(ikoutfl(jfl))) <= 1.E-7) ) THEN
  211. ztzfl(jfl) = (zgkdfl(jfl)) / zwfl(jfl)
  212. ENDIF
  213. ENDIF
  214. ENDIF
  215. ! the time to go leave the mesh is the smallest time
  216. IF( nisobfl(jfl) == 1. ) THEN
  217. zttfl(jfl) = MIN(ztxfl(jfl),ztyfl(jfl),ztzfl(jfl))
  218. ELSE
  219. zttfl(jfl) = MIN(ztxfl(jfl),ztyfl(jfl))
  220. ENDIF
  221. ! new age of the FLOAT
  222. zagenewfl(jfl) = zagefl(jfl) + zttfl(jfl)*zvol
  223. ! test to know if the "age" of the float is not bigger than the
  224. ! time step
  225. IF( zagenewfl(jfl) > rdt ) THEN
  226. zttfl(jfl) = (rdt-zagefl(jfl)) / zvol
  227. zagenewfl(jfl) = rdt
  228. ENDIF
  229. ! In the "minimal" direction we compute the index of new mesh
  230. ! on i-direction
  231. IF( ztxfl(jfl) <= zttfl(jfl) ) THEN
  232. zgifl(jfl) = float(iioutfl(jfl))
  233. ind = iioutfl(jfl)
  234. IF( iioutfl(jfl) >= iiinfl(jfl) ) THEN
  235. iioutfl(jfl) = iioutfl(jfl) + 1
  236. ELSE
  237. iioutfl(jfl) = iioutfl(jfl) - 1
  238. ENDIF
  239. iiinfl(jfl) = ind
  240. ELSE
  241. IF( ABS(zudfl(jfl)) >= 1.E-5 ) THEN
  242. zgifl(jfl) = zgifl(jfl) + zgidfl(jfl)*zufl(jfl) &
  243. & * ( EXP( zudfl(jfl)/zgidfl(jfl)*zttfl(jfl) ) - 1. ) / zudfl(jfl)
  244. ELSE
  245. zgifl(jfl) = zgifl(jfl) + zufl(jfl) * zttfl(jfl)
  246. ENDIF
  247. ENDIF
  248. ! on j-direction
  249. IF( ztyfl(jfl) <= zttfl(jfl) ) THEN
  250. zgjfl(jfl) = float(ijoutfl(jfl))
  251. ind = ijoutfl(jfl)
  252. IF( ijoutfl(jfl) >= ijinfl(jfl) ) THEN
  253. ijoutfl(jfl) = ijoutfl(jfl) + 1
  254. ELSE
  255. ijoutfl(jfl) = ijoutfl(jfl) - 1
  256. ENDIF
  257. ijinfl(jfl) = ind
  258. ELSE
  259. IF( ABS(zvdfl(jfl)) >= 1.E-5 ) THEN
  260. zgjfl(jfl) = zgjfl(jfl)+zgjdfl(jfl)*zvfl(jfl) &
  261. & * ( EXP(zvdfl(jfl)/zgjdfl(jfl)*zttfl(jfl)) - 1. ) / zvdfl(jfl)
  262. ELSE
  263. zgjfl(jfl) = zgjfl(jfl)+zvfl(jfl)*zttfl(jfl)
  264. ENDIF
  265. ENDIF
  266. ! on k-direction
  267. IF( nisobfl(jfl) == 1. ) THEN
  268. IF( ztzfl(jfl) <= zttfl(jfl) ) THEN
  269. zgkfl(jfl) = float(ikoutfl(jfl))
  270. ind = ikoutfl(jfl)
  271. IF( ikoutfl(jfl) >= ikinfl(jfl) ) THEN
  272. ikoutfl(jfl) = ikoutfl(jfl)+1
  273. ELSE
  274. ikoutfl(jfl) = ikoutfl(jfl)-1
  275. ENDIF
  276. ikinfl(jfl) = ind
  277. ELSE
  278. IF( ABS(zwdfl(jfl)) >= 1.E-5 ) THEN
  279. zgkfl(jfl) = zgkfl(jfl)+zgkdfl(jfl)*zwfl(jfl) &
  280. & * ( EXP(zwdfl(jfl)/zgkdfl(jfl)*zttfl(jfl)) - 1. ) / zwdfl(jfl)
  281. ELSE
  282. zgkfl(jfl) = zgkfl(jfl)+zwfl(jfl)*zttfl(jfl)
  283. ENDIF
  284. ENDIF
  285. ENDIF
  286. ! coordinate of the new point on the temperature grid
  287. iil(jfl) = MAX(iiinfl(jfl),iioutfl(jfl))
  288. ijl(jfl) = MAX(ijinfl(jfl),ijoutfl(jfl))
  289. IF( nisobfl(jfl) == 1 ) ikl(jfl) = MAX(ikinfl(jfl),ikoutfl(jfl))
  290. !!Alexcadm write(*,*)'PE ',narea,
  291. !!Alexcadm . iiinfl(jfl),iioutfl(jfl),ijinfl(jfl)
  292. !!Alexcadm . ,ijoutfl(jfl),ikinfl(jfl),
  293. !!Alexcadm . ikoutfl(jfl),ztxfl(jfl),ztyfl(jfl)
  294. !!Alexcadm . ,ztzfl(jfl),zgifl(jfl),
  295. !!Alexcadm . zgjfl(jfl)
  296. !!Alexcadm IF (jfl == 910) write(*,*)'Flotteur 910',
  297. !!Alexcadm . iiinfl(jfl),iioutfl(jfl),ijinfl(jfl)
  298. !!Alexcadm . ,ijoutfl(jfl),ikinfl(jfl),
  299. !!Alexcadm . ikoutfl(jfl),ztxfl(jfl),ztyfl(jfl)
  300. !!Alexcadm . ,ztzfl(jfl),zgifl(jfl),
  301. !!Alexcadm . zgjfl(jfl)
  302. ! reinitialisation of the age of FLOAT
  303. zagefl(jfl) = zagenewfl(jfl)
  304. # if defined key_mpp_mpi
  305. ELSE
  306. ! we put zgifl, zgjfl, zgkfl, zagefl
  307. zgifl (jfl) = 0.
  308. zgjfl (jfl) = 0.
  309. zgkfl (jfl) = 0.
  310. zagefl(jfl) = 0.
  311. iil(jfl) = 0
  312. ijl(jfl) = 0
  313. ENDIF
  314. # endif
  315. END DO
  316. ! synchronisation
  317. IF( lk_mpp ) CALL mpp_sum( zgifl , jpnfl ) ! sums over the global domain
  318. IF( lk_mpp ) CALL mpp_sum( zgjfl , jpnfl )
  319. IF( lk_mpp ) CALL mpp_sum( zgkfl , jpnfl )
  320. IF( lk_mpp ) CALL mpp_sum( zagefl, jpnfl )
  321. IF( lk_mpp ) CALL mpp_sum( iil , jpnfl )
  322. IF( lk_mpp ) CALL mpp_sum( ijl , jpnfl )
  323. ! Test to know if a float hasn't integrated enought time
  324. IF( ln_argo ) THEN
  325. ifin = 1
  326. DO jfl = 1, jpnfl
  327. IF( zagefl(jfl) < rdt ) ifin = 0
  328. tpifl(jfl) = zgifl(jfl) + 0.5
  329. tpjfl(jfl) = zgjfl(jfl) + 0.5
  330. END DO
  331. ELSE
  332. ifin = 1
  333. DO jfl = 1, jpnfl
  334. IF( zagefl(jfl) < rdt ) ifin = 0
  335. tpifl(jfl) = zgifl(jfl) + 0.5
  336. tpjfl(jfl) = zgjfl(jfl) + 0.5
  337. IF( nisobfl(jfl) == 1 ) tpkfl(jfl) = -(zgkfl(jfl))
  338. END DO
  339. ENDIF
  340. !!Alexcadm IF (lwp) write(numout,*) '---------'
  341. !!Alexcadm IF (lwp) write(numout,*) 'before Erika:',tpifl(880),tpjfl(880),
  342. !!Alexcadm . tpkfl(880),zufl(880),zvfl(880),zwfl(880)
  343. !!Alexcadm IF (lwp) write(numout,*) 'first Erika:',tpifl(900),tpjfl(900),
  344. !!Alexcadm . tpkfl(900),zufl(900),zvfl(900),zwfl(900)
  345. !!Alexcadm IF (lwp) write(numout,*) 'last Erika:',tpifl(jpnfl),tpjfl(jpnfl),
  346. !!Alexcadm . tpkfl(jpnfl),zufl(jpnfl),zvfl(jpnfl),zwfl(jpnfl)
  347. IF( ifin == 0 ) THEN
  348. iloop = iloop + 1
  349. GO TO 222
  350. ENDIF
  351. !
  352. CALL wrk_dealloc( jpnfl , iil , ijl , ikl , iiloc , ijloc )
  353. CALL wrk_dealloc( jpnfl , iiinfl, ijinfl, ikinfl, iioutfl, ijoutfl, ikoutfl )
  354. CALL wrk_dealloc( jpnfl , zgifl , zgjfl , zgkfl , ztxfl , ztyfl , ztzfl , zttfl , zagefl, zagenewfl)
  355. CALL wrk_dealloc( jpnfl , zufl , zvfl , zwfl , zudfl , zvdfl , zwdfl , zgidfl, zgjdfl, zgkdfl )
  356. !
  357. END SUBROUTINE flo_blk
  358. # else
  359. !!----------------------------------------------------------------------
  360. !! Default option Empty module
  361. !!----------------------------------------------------------------------
  362. CONTAINS
  363. SUBROUTINE flo_blk ! Empty routine
  364. END SUBROUTINE flo_blk
  365. #endif
  366. !!======================================================================
  367. END MODULE floblk