dynnxt.F90 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411
  1. MODULE dynnxt
  2. !!=========================================================================
  3. !! *** MODULE dynnxt ***
  4. !! Ocean dynamics: time stepping
  5. !!=========================================================================
  6. !! History : OPA ! 1987-02 (P. Andrich, D. L Hostis) Original code
  7. !! ! 1990-10 (C. Levy, G. Madec)
  8. !! 7.0 ! 1993-03 (M. Guyon) symetrical conditions
  9. !! 8.0 ! 1997-02 (G. Madec & M. Imbard) opa, release 8.0
  10. !! 8.2 ! 1997-04 (A. Weaver) Euler forward step
  11. !! - ! 1997-06 (G. Madec) lateral boudary cond., lbc routine
  12. !! NEMO 1.0 ! 2002-08 (G. Madec) F90: Free form and module
  13. !! - ! 2002-10 (C. Talandier, A-M. Treguier) Open boundary cond.
  14. !! 2.0 ! 2005-11 (V. Garnier) Surface pressure gradient organization
  15. !! 2.3 ! 2007-07 (D. Storkey) Calls to BDY routines.
  16. !! 3.2 ! 2009-06 (G. Madec, R.Benshila) re-introduce the vvl option
  17. !! 3.3 ! 2010-09 (D. Storkey, E.O'Dea) Bug fix for BDY module
  18. !! 3.3 ! 2011-03 (P. Oddo) Bug fix for time-splitting+(BDY-OBC) and not VVL
  19. !! 3.5 ! 2013-07 (J. Chanut) Compliant with time splitting changes
  20. !! 3.7 ! 2014-04 (G. Madec) add the diagnostic of the time filter trends
  21. !!-------------------------------------------------------------------------
  22. !!-------------------------------------------------------------------------
  23. !! dyn_nxt : obtain the next (after) horizontal velocity
  24. !!-------------------------------------------------------------------------
  25. USE oce ! ocean dynamics and tracers
  26. USE dom_oce ! ocean space and time domain
  27. USE sbc_oce ! Surface boundary condition: ocean fields
  28. USE phycst ! physical constants
  29. USE dynspg_oce ! type of surface pressure gradient
  30. USE dynadv ! dynamics: vector invariant versus flux form
  31. USE domvvl ! variable volume
  32. USE bdy_oce ! ocean open boundary conditions
  33. USE bdydta ! ocean open boundary conditions
  34. USE bdydyn ! ocean open boundary conditions
  35. USE bdyvol ! ocean open boundary condition (bdy_vol routines)
  36. USE trd_oce ! trends: ocean variables
  37. USE trddyn ! trend manager: dynamics
  38. USE trdken ! trend manager: kinetic energy
  39. !
  40. USE in_out_manager ! I/O manager
  41. USE iom ! I/O manager library
  42. USE lbclnk ! lateral boundary condition (or mpp link)
  43. USE lib_mpp ! MPP library
  44. USE wrk_nemo ! Memory Allocation
  45. USE prtctl ! Print control
  46. USE timing ! Timing
  47. #if defined key_agrif
  48. USE agrif_opa_interp
  49. #endif
  50. IMPLICIT NONE
  51. PRIVATE
  52. PUBLIC dyn_nxt ! routine called by step.F90
  53. !! * Substitutions
  54. # include "domzgr_substitute.h90"
  55. !!----------------------------------------------------------------------
  56. !! NEMO/OPA 3.3 , NEMO Consortium (2010)
  57. !! $Id: dynnxt.F90 5628 2015-07-22 20:26:35Z mathiot $
  58. !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt)
  59. !!----------------------------------------------------------------------
  60. CONTAINS
  61. SUBROUTINE dyn_nxt ( kt )
  62. !!----------------------------------------------------------------------
  63. !! *** ROUTINE dyn_nxt ***
  64. !!
  65. !! ** Purpose : Compute the after horizontal velocity. Apply the boundary
  66. !! condition on the after velocity, achieved the time stepping
  67. !! by applying the Asselin filter on now fields and swapping
  68. !! the fields.
  69. !!
  70. !! ** Method : * After velocity is compute using a leap-frog scheme:
  71. !! (ua,va) = (ub,vb) + 2 rdt (ua,va)
  72. !! Note that with flux form advection and variable volume layer
  73. !! (lk_vvl=T), the leap-frog is applied on thickness weighted
  74. !! velocity.
  75. !! Note also that in filtered free surface (lk_dynspg_flt=T),
  76. !! the time stepping has already been done in dynspg module
  77. !!
  78. !! * Apply lateral boundary conditions on after velocity
  79. !! at the local domain boundaries through lbc_lnk call,
  80. !! at the one-way open boundaries (lk_bdy=T),
  81. !! at the AGRIF zoom boundaries (lk_agrif=T)
  82. !!
  83. !! * Apply the time filter applied and swap of the dynamics
  84. !! arrays to start the next time step:
  85. !! (ub,vb) = (un,vn) + atfp [ (ub,vb) + (ua,va) - 2 (un,vn) ]
  86. !! (un,vn) = (ua,va).
  87. !! Note that with flux form advection and variable volume layer
  88. !! (lk_vvl=T), the time filter is applied on thickness weighted
  89. !! velocity.
  90. !!
  91. !! ** Action : ub,vb filtered before horizontal velocity of next time-step
  92. !! un,vn now horizontal velocity of next time-step
  93. !!----------------------------------------------------------------------
  94. INTEGER, INTENT( in ) :: kt ! ocean time-step index
  95. !
  96. INTEGER :: ji, jj, jk ! dummy loop indices
  97. INTEGER :: iku, ikv ! local integers
  98. #if ! defined key_dynspg_flt
  99. REAL(wp) :: z2dt ! temporary scalar
  100. #endif
  101. REAL(wp) :: zue3a, zue3n, zue3b, zuf, zec ! local scalars
  102. REAL(wp) :: zve3a, zve3n, zve3b, zvf, z1_2dt ! - -
  103. REAL(wp), POINTER, DIMENSION(:,:) :: zue, zve
  104. REAL(wp), POINTER, DIMENSION(:,:,:) :: ze3u_f, ze3v_f, zua, zva
  105. !!----------------------------------------------------------------------
  106. !
  107. IF( nn_timing == 1 ) CALL timing_start('dyn_nxt')
  108. !
  109. CALL wrk_alloc( jpi,jpj,jpk, ze3u_f, ze3v_f, zua, zva )
  110. IF( lk_dynspg_ts ) CALL wrk_alloc( jpi,jpj, zue, zve )
  111. !
  112. IF( kt == nit000 ) THEN
  113. IF(lwp) WRITE(numout,*)
  114. IF(lwp) WRITE(numout,*) 'dyn_nxt : time stepping'
  115. IF(lwp) WRITE(numout,*) '~~~~~~~'
  116. ENDIF
  117. #if defined key_dynspg_flt
  118. !
  119. ! Next velocity : Leap-frog time stepping already done in dynspg_flt.F routine
  120. ! -------------
  121. ! Update after velocity on domain lateral boundaries (only local domain required)
  122. ! --------------------------------------------------
  123. CALL lbc_lnk( ua, 'U', -1. ) ! local domain boundaries
  124. CALL lbc_lnk( va, 'V', -1. )
  125. !
  126. #else
  127. # if defined key_dynspg_exp
  128. ! Next velocity : Leap-frog time stepping
  129. ! -------------
  130. z2dt = 2. * rdt ! Euler or leap-frog time step
  131. IF( neuler == 0 .AND. kt == nit000 ) z2dt = rdt
  132. !
  133. IF( ln_dynadv_vec .OR. .NOT. lk_vvl ) THEN ! applied on velocity
  134. DO jk = 1, jpkm1
  135. ua(:,:,jk) = ( ub(:,:,jk) + z2dt * ua(:,:,jk) ) * umask(:,:,jk)
  136. va(:,:,jk) = ( vb(:,:,jk) + z2dt * va(:,:,jk) ) * vmask(:,:,jk)
  137. END DO
  138. ELSE ! applied on thickness weighted velocity
  139. DO jk = 1, jpkm1
  140. ua(:,:,jk) = ( ub(:,:,jk) * fse3u_b(:,:,jk) &
  141. & + z2dt * ua(:,:,jk) * fse3u_n(:,:,jk) ) &
  142. & / fse3u_a(:,:,jk) * umask(:,:,jk)
  143. va(:,:,jk) = ( vb(:,:,jk) * fse3v_b(:,:,jk) &
  144. & + z2dt * va(:,:,jk) * fse3v_n(:,:,jk) ) &
  145. & / fse3v_a(:,:,jk) * vmask(:,:,jk)
  146. END DO
  147. ENDIF
  148. # endif
  149. # if defined key_dynspg_ts
  150. !!gm IF ( lk_dynspg_ts ) THEN ....
  151. ! Ensure below that barotropic velocities match time splitting estimate
  152. ! Compute actual transport and replace it with ts estimate at "after" time step
  153. zue(:,:) = fse3u_a(:,:,1) * ua(:,:,1) * umask(:,:,1)
  154. zve(:,:) = fse3v_a(:,:,1) * va(:,:,1) * vmask(:,:,1)
  155. DO jk = 2, jpkm1
  156. zue(:,:) = zue(:,:) + fse3u_a(:,:,jk) * ua(:,:,jk) * umask(:,:,jk)
  157. zve(:,:) = zve(:,:) + fse3v_a(:,:,jk) * va(:,:,jk) * vmask(:,:,jk)
  158. END DO
  159. DO jk = 1, jpkm1
  160. ua(:,:,jk) = ( ua(:,:,jk) - zue(:,:) * hur_a(:,:) + ua_b(:,:) ) * umask(:,:,jk)
  161. va(:,:,jk) = ( va(:,:,jk) - zve(:,:) * hvr_a(:,:) + va_b(:,:) ) * vmask(:,:,jk)
  162. END DO
  163. IF (lk_dynspg_ts.AND.(.NOT.ln_bt_fw)) THEN
  164. ! Remove advective velocity from "now velocities"
  165. ! prior to asselin filtering
  166. ! In the forward case, this is done below after asselin filtering
  167. ! so that asselin contribution is removed at the same time
  168. DO jk = 1, jpkm1
  169. un(:,:,jk) = ( un(:,:,jk) - un_adv(:,:) + un_b(:,:) )*umask(:,:,jk)
  170. vn(:,:,jk) = ( vn(:,:,jk) - vn_adv(:,:) + vn_b(:,:) )*vmask(:,:,jk)
  171. END DO
  172. ENDIF
  173. !!gm ENDIF
  174. # endif
  175. ! Update after velocity on domain lateral boundaries
  176. ! --------------------------------------------------
  177. CALL lbc_lnk( ua, 'U', -1. ) !* local domain boundaries
  178. CALL lbc_lnk( va, 'V', -1. )
  179. !
  180. # if defined key_bdy
  181. ! !* BDY open boundaries
  182. IF( lk_bdy .AND. lk_dynspg_exp ) CALL bdy_dyn( kt )
  183. IF( lk_bdy .AND. lk_dynspg_ts ) CALL bdy_dyn( kt, dyn3d_only=.true. )
  184. !!$ Do we need a call to bdy_vol here??
  185. !
  186. # endif
  187. !
  188. # if defined key_agrif
  189. CALL Agrif_dyn( kt ) !* AGRIF zoom boundaries
  190. # endif
  191. #endif
  192. IF( l_trddyn ) THEN ! prepare the atf trend computation + some diagnostics
  193. z1_2dt = 1._wp / (2. * rdt) ! Euler or leap-frog time step
  194. IF( neuler == 0 .AND. kt == nit000 ) z1_2dt = 1._wp / rdt
  195. !
  196. ! ! Kinetic energy and Conversion
  197. IF( ln_KE_trd ) CALL trd_dyn( ua, va, jpdyn_ken, kt )
  198. !
  199. IF( ln_dyn_trd ) THEN ! 3D output: total momentum trends
  200. zua(:,:,:) = ( ua(:,:,:) - ub(:,:,:) ) * z1_2dt
  201. zva(:,:,:) = ( va(:,:,:) - vb(:,:,:) ) * z1_2dt
  202. CALL iom_put( "utrd_tot", zua ) ! total momentum trends, except the asselin time filter
  203. CALL iom_put( "vtrd_tot", zva )
  204. ENDIF
  205. !
  206. zua(:,:,:) = un(:,:,:) ! save the now velocity before the asselin filter
  207. zva(:,:,:) = vn(:,:,:) ! (caution: there will be a shift by 1 timestep in the
  208. ! ! computation of the asselin filter trends)
  209. ENDIF
  210. ! Time filter and swap of dynamics arrays
  211. ! ------------------------------------------
  212. IF( neuler == 0 .AND. kt == nit000 ) THEN !* Euler at first time-step: only swap
  213. DO jk = 1, jpkm1
  214. un(:,:,jk) = ua(:,:,jk) ! un <-- ua
  215. vn(:,:,jk) = va(:,:,jk)
  216. END DO
  217. IF (lk_vvl) THEN
  218. DO jk = 1, jpkm1
  219. fse3t_n(:,:,jk) = fse3t_a(:,:,jk)
  220. fse3u_n(:,:,jk) = fse3u_a(:,:,jk)
  221. fse3v_n(:,:,jk) = fse3v_a(:,:,jk)
  222. END DO
  223. ENDIF
  224. ELSE !* Leap-Frog : Asselin filter and swap
  225. ! ! =============!
  226. IF( .NOT. lk_vvl ) THEN ! Fixed volume !
  227. ! ! =============!
  228. DO jk = 1, jpkm1
  229. DO jj = 1, jpj
  230. DO ji = 1, jpi
  231. zuf = un(ji,jj,jk) + atfp * ( ub(ji,jj,jk) - 2._wp * un(ji,jj,jk) + ua(ji,jj,jk) )
  232. zvf = vn(ji,jj,jk) + atfp * ( vb(ji,jj,jk) - 2._wp * vn(ji,jj,jk) + va(ji,jj,jk) )
  233. !
  234. ub(ji,jj,jk) = zuf ! ub <-- filtered velocity
  235. vb(ji,jj,jk) = zvf
  236. un(ji,jj,jk) = ua(ji,jj,jk) ! un <-- ua
  237. vn(ji,jj,jk) = va(ji,jj,jk)
  238. END DO
  239. END DO
  240. END DO
  241. ! ! ================!
  242. ELSE ! Variable volume !
  243. ! ! ================!
  244. ! Before scale factor at t-points
  245. ! (used as a now filtered scale factor until the swap)
  246. ! ----------------------------------------------------
  247. IF (lk_dynspg_ts.AND.ln_bt_fw) THEN
  248. ! No asselin filtering on thicknesses if forward time splitting
  249. fse3t_b(:,:,:) = fse3t_n(:,:,:)
  250. ELSE
  251. fse3t_b(:,:,:) = fse3t_n(:,:,:) + atfp * ( fse3t_b(:,:,:) - 2._wp * fse3t_n(:,:,:) + fse3t_a(:,:,:) )
  252. ! Add volume filter correction: compatibility with tracer advection scheme
  253. ! => time filter + conservation correction (only at the first level)
  254. IF ( nn_isf == 0) THEN ! if no ice shelf melting
  255. fse3t_b(:,:,1) = fse3t_b(:,:,1) - atfp * rdt * r1_rau0 * ( emp_b(:,:) - emp(:,:) &
  256. & -rnf_b(:,:) + rnf(:,:) ) * tmask(:,:,1)
  257. ELSE ! if ice shelf melting
  258. DO jj = 1,jpj
  259. DO ji = 1,jpi
  260. jk = mikt(ji,jj)
  261. fse3t_b(ji,jj,jk) = fse3t_b(ji,jj,jk) - atfp * rdt * r1_rau0 &
  262. & * ( (emp_b(ji,jj) - emp(ji,jj) ) &
  263. & - (rnf_b(ji,jj) - rnf(ji,jj) ) &
  264. & + (fwfisf_b(ji,jj) - fwfisf(ji,jj)) ) * tmask(ji,jj,jk)
  265. END DO
  266. END DO
  267. END IF
  268. ENDIF
  269. !
  270. IF( ln_dynadv_vec ) THEN
  271. ! Before scale factor at (u/v)-points
  272. ! -----------------------------------
  273. CALL dom_vvl_interpol( fse3t_b(:,:,:), fse3u_b(:,:,:), 'U' )
  274. CALL dom_vvl_interpol( fse3t_b(:,:,:), fse3v_b(:,:,:), 'V' )
  275. ! Leap-Frog - Asselin filter and swap: applied on velocity
  276. ! -----------------------------------
  277. DO jk = 1, jpkm1
  278. DO jj = 1, jpj
  279. DO ji = 1, jpi
  280. zuf = un(ji,jj,jk) + atfp * ( ub(ji,jj,jk) - 2._wp * un(ji,jj,jk) + ua(ji,jj,jk) )
  281. zvf = vn(ji,jj,jk) + atfp * ( vb(ji,jj,jk) - 2._wp * vn(ji,jj,jk) + va(ji,jj,jk) )
  282. !
  283. ub(ji,jj,jk) = zuf ! ub <-- filtered velocity
  284. vb(ji,jj,jk) = zvf
  285. un(ji,jj,jk) = ua(ji,jj,jk) ! un <-- ua
  286. vn(ji,jj,jk) = va(ji,jj,jk)
  287. END DO
  288. END DO
  289. END DO
  290. !
  291. ELSE
  292. ! Temporary filtered scale factor at (u/v)-points (will become before scale factor)
  293. !------------------------------------------------
  294. CALL dom_vvl_interpol( fse3t_b(:,:,:), ze3u_f, 'U' )
  295. CALL dom_vvl_interpol( fse3t_b(:,:,:), ze3v_f, 'V' )
  296. ! Leap-Frog - Asselin filter and swap: applied on thickness weighted velocity
  297. ! ----------------------------------- ===========================
  298. DO jk = 1, jpkm1
  299. DO jj = 1, jpj
  300. DO ji = 1, jpi
  301. zue3a = ua(ji,jj,jk) * fse3u_a(ji,jj,jk)
  302. zve3a = va(ji,jj,jk) * fse3v_a(ji,jj,jk)
  303. zue3n = un(ji,jj,jk) * fse3u_n(ji,jj,jk)
  304. zve3n = vn(ji,jj,jk) * fse3v_n(ji,jj,jk)
  305. zue3b = ub(ji,jj,jk) * fse3u_b(ji,jj,jk)
  306. zve3b = vb(ji,jj,jk) * fse3v_b(ji,jj,jk)
  307. !
  308. zuf = ( zue3n + atfp * ( zue3b - 2._wp * zue3n + zue3a ) ) / ze3u_f(ji,jj,jk)
  309. zvf = ( zve3n + atfp * ( zve3b - 2._wp * zve3n + zve3a ) ) / ze3v_f(ji,jj,jk)
  310. !
  311. ub(ji,jj,jk) = zuf ! ub <-- filtered velocity
  312. vb(ji,jj,jk) = zvf
  313. un(ji,jj,jk) = ua(ji,jj,jk) ! un <-- ua
  314. vn(ji,jj,jk) = va(ji,jj,jk)
  315. END DO
  316. END DO
  317. END DO
  318. fse3u_b(:,:,1:jpkm1) = ze3u_f(:,:,1:jpkm1) ! e3u_b <-- filtered scale factor
  319. fse3v_b(:,:,1:jpkm1) = ze3v_f(:,:,1:jpkm1)
  320. ENDIF
  321. !
  322. ENDIF
  323. !
  324. IF (lk_dynspg_ts.AND.ln_bt_fw) THEN
  325. ! Revert "before" velocities to time split estimate
  326. ! Doing it here also means that asselin filter contribution is removed
  327. zue(:,:) = fse3u_b(:,:,1) * ub(:,:,1) * umask(:,:,1)
  328. zve(:,:) = fse3v_b(:,:,1) * vb(:,:,1) * vmask(:,:,1)
  329. DO jk = 2, jpkm1
  330. zue(:,:) = zue(:,:) + fse3u_b(:,:,jk) * ub(:,:,jk) * umask(:,:,jk)
  331. zve(:,:) = zve(:,:) + fse3v_b(:,:,jk) * vb(:,:,jk) * vmask(:,:,jk)
  332. END DO
  333. DO jk = 1, jpkm1
  334. ub(:,:,jk) = ub(:,:,jk) - (zue(:,:) * hur(:,:) - un_b(:,:)) * umask(:,:,jk)
  335. vb(:,:,jk) = vb(:,:,jk) - (zve(:,:) * hvr(:,:) - vn_b(:,:)) * vmask(:,:,jk)
  336. END DO
  337. ENDIF
  338. !
  339. ENDIF ! neuler =/0
  340. !
  341. ! Set "now" and "before" barotropic velocities for next time step:
  342. ! JC: Would be more clever to swap variables than to make a full vertical
  343. ! integration
  344. !
  345. !
  346. IF (lk_vvl) THEN
  347. hu_b(:,:) = 0.
  348. hv_b(:,:) = 0.
  349. DO jk = 1, jpkm1
  350. hu_b(:,:) = hu_b(:,:) + fse3u_b(:,:,jk) * umask(:,:,jk)
  351. hv_b(:,:) = hv_b(:,:) + fse3v_b(:,:,jk) * vmask(:,:,jk)
  352. END DO
  353. hur_b(:,:) = umask_i(:,:) / ( hu_b(:,:) + 1._wp - umask_i(:,:) )
  354. hvr_b(:,:) = vmask_i(:,:) / ( hv_b(:,:) + 1._wp - vmask_i(:,:) )
  355. ENDIF
  356. !
  357. un_b(:,:) = 0._wp ; vn_b(:,:) = 0._wp
  358. ub_b(:,:) = 0._wp ; vb_b(:,:) = 0._wp
  359. !
  360. DO jk = 1, jpkm1
  361. DO jj = 1, jpj
  362. DO ji = 1, jpi
  363. un_b(ji,jj) = un_b(ji,jj) + fse3u_a(ji,jj,jk) * un(ji,jj,jk) * umask(ji,jj,jk)
  364. vn_b(ji,jj) = vn_b(ji,jj) + fse3v_a(ji,jj,jk) * vn(ji,jj,jk) * vmask(ji,jj,jk)
  365. !
  366. ub_b(ji,jj) = ub_b(ji,jj) + fse3u_b(ji,jj,jk) * ub(ji,jj,jk) * umask(ji,jj,jk)
  367. vb_b(ji,jj) = vb_b(ji,jj) + fse3v_b(ji,jj,jk) * vb(ji,jj,jk) * vmask(ji,jj,jk)
  368. END DO
  369. END DO
  370. END DO
  371. !
  372. !
  373. un_b(:,:) = un_b(:,:) * hur_a(:,:)
  374. vn_b(:,:) = vn_b(:,:) * hvr_a(:,:)
  375. ub_b(:,:) = ub_b(:,:) * hur_b(:,:)
  376. vb_b(:,:) = vb_b(:,:) * hvr_b(:,:)
  377. !
  378. !
  379. IF( l_trddyn ) THEN ! 3D output: asselin filter trends on momentum
  380. zua(:,:,:) = ( ub(:,:,:) - zua(:,:,:) ) * z1_2dt
  381. zva(:,:,:) = ( vb(:,:,:) - zva(:,:,:) ) * z1_2dt
  382. CALL trd_dyn( zua, zva, jpdyn_atf, kt )
  383. ENDIF
  384. !
  385. IF(ln_ctl) CALL prt_ctl( tab3d_1=un, clinfo1=' nxt - Un: ', mask1=umask, &
  386. & tab3d_2=vn, clinfo2=' Vn: ' , mask2=vmask )
  387. !
  388. CALL wrk_dealloc( jpi,jpj,jpk, ze3u_f, ze3v_f, zua, zva )
  389. IF( lk_dynspg_ts ) CALL wrk_dealloc( jpi,jpj, zue, zve )
  390. !
  391. IF( nn_timing == 1 ) CALL timing_stop('dyn_nxt')
  392. !
  393. END SUBROUTINE dyn_nxt
  394. !!=========================================================================
  395. END MODULE dynnxt