New URL for NEMO forge!   http://forge.nemo-ocean.eu

Since March 2022 along with NEMO 4.2 release, the code development moved to a self-hosted GitLab.
This present forge is now archived and remained online for history.
dynnxt.F90 in trunk/NEMO/OPA_SRC/DYN – NEMO

source: trunk/NEMO/OPA_SRC/DYN/dynnxt.F90 @ 258

Last change on this file since 258 was 258, checked in by opalod, 19 years ago

nemo_v1_update_004 : CT : Integration of the control print option for debugging work

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 6.7 KB
Line 
1MODULE dynnxt
2   !!======================================================================
3   !!                       ***  MODULE  dynnxt  ***
4   !! Ocean dynamics: time stepping
5   !!======================================================================
6   
7   !!----------------------------------------------------------------------
8   !!   dyn_nxt      : update the horizontal velocity from the momentum trend
9   !!----------------------------------------------------------------------
10   !! * Modules used
11   USE oce             ! ocean dynamics and tracers
12   USE dom_oce         ! ocean space and time domain
13   USE in_out_manager  ! I/O manager
14   USE obcdyn          ! open boundary condition for momentum (obc_dyn routine)
15   USE lbclnk          ! lateral boundary condition (or mpp link)
16   USE prtctl          ! Print control
17
18   IMPLICIT NONE
19   PRIVATE
20
21   !! * Accessibility
22   PUBLIC dyn_nxt                ! routine called by step.F90
23   !!----------------------------------------------------------------------
24
25CONTAINS
26
27   SUBROUTINE dyn_nxt ( kt )
28      !!----------------------------------------------------------------------
29      !!                  ***  ROUTINE dyn_nxt  ***
30      !!                   
31      !! ** Purpose :   Compute the after horizontal velocity from the
32      !!      momentum trend.
33      !!
34      !! ** Method  :   Apply lateral boundary conditions on the trends (ua,va)
35      !!      through calls to routine lbc_lnk.
36      !!      After velocity is compute using a leap-frog scheme environment:
37      !!         (ua,va) = (ub,vb) + 2 rdt (ua,va)
38      !!      Note that if lk_dynspg_fsc=T, the time stepping has already been
39      !!      performed in dynspg module
40      !!      Time filter applied on now horizontal velocity to avoid the
41      !!      divergence of two consecutive time-steps and swap of dynamics
42      !!      arrays to start the next time step:
43      !!         (ub,vb) = (un,vn) + atfp [ (ub,vb) + (ua,va) - 2 (un,vn) ]
44      !!         (un,vn) = (ua,va)
45      !!
46      !! ** Action : - Update ub,vb arrays, the before horizontal velocity
47      !!             - Update un,vn arrays, the now horizontal velocity
48      !!
49      !! History :
50      !!        !  87-02  (P. Andrich, D. L Hostis)  Original code
51      !!        !  90-10  (C. Levy, G. Madec)
52      !!        !  93-03  (M. Guyon)  symetrical conditions
53      !!        !  97-02  (G. Madec & M. Imbard)  opa, release 8.0
54      !!        !  97-04  (A. Weaver)  Euler forward step
55      !!        !  97-06  (G. Madec)  lateral boudary cond., lbc routine
56      !!   8.5  !  02-08  (G. Madec)  F90: Free form and module
57      !!        !  02-10  (C. Talandier, A-M. Treguier) Open boundary cond.
58      !!----------------------------------------------------------------------
59      !! * Arguments
60      INTEGER, INTENT( in ) ::   kt      ! ocean time-step index
61
62      !! * Local declarations
63      INTEGER  ::   ji, jj, jk   ! dummy loop indices
64      REAL(wp) ::   z2dt         ! temporary scalar
65      !!----------------------------------------------------------------------
66      !!  OPA 9.0 , LOCEAN-IPSL (2005)
67      !! $Header$
68      !! This software is governed by the CeCILL licence see modipsl/doc/NEMO_CeCILL.txt
69      !!----------------------------------------------------------------------
70
71      IF( kt == nit000 ) THEN
72         IF(lwp) WRITE(numout,*)
73         IF(lwp) WRITE(numout,*) 'dyn_nxt : time stepping'
74         IF(lwp) WRITE(numout,*) '~~~~~~~'
75      ENDIF
76
77      ! Local constant initialization
78      z2dt = 2. * rdt
79      IF( neuler == 0 .AND. kt == nit000 )  z2dt = rdt
80
81      ! Lateral boundary conditions on ( ua, va )
82      CALL lbc_lnk( ua, 'U', -1. )
83      CALL lbc_lnk( va, 'V', -1. )
84
85      !                                                ! ===============
86      DO jk = 1, jpkm1                                 ! Horizontal slab
87         !                                             ! ===============
88         ! Next velocity
89         ! -------------
90#if defined key_dynspg_fsc
91         ! Leap-frog time stepping already done in dynspg.F routine
92#else
93         DO jj = 1, jpj                      ! caution: don't use (:,:) for this loop
94            DO ji = 1, jpi                   ! it causes optimization problems on NEC in auto-tasking
95               ! Leap-frog time stepping
96               ua(ji,jj,jk) = ( ub(ji,jj,jk) + z2dt * ua(ji,jj,jk) ) * umask(ji,jj,jk)
97               va(ji,jj,jk) = ( vb(ji,jj,jk) + z2dt * va(ji,jj,jk) ) * vmask(ji,jj,jk)
98            END DO
99         END DO
100# if defined key_obc
101         !                                             ! ===============
102      END DO                                           !   End of slab
103      !                                                ! ===============
104      ! Update (ua,va) along open boundaries (only in the rigid-lid case)
105      CALL obc_dyn( kt )
106      !                                                ! ===============
107      DO jk = 1, jpkm1                                 ! Horizontal slab
108         !                                             ! ===============
109# endif
110#endif
111         ! Time filter and swap of dynamics arrays
112         ! ------------------------------------------
113         IF( neuler == 0 .AND. kt == nit000 ) THEN
114            DO jj = 1, jpj                      ! caution: don't use (:,:) for this loop
115               DO ji = 1, jpi                   ! it causes optimization problems on NEC in auto-tasking
116                  ! Euler (forward) time stepping
117                  ub(ji,jj,jk) = un(ji,jj,jk)
118                  vb(ji,jj,jk) = vn(ji,jj,jk)
119                  un(ji,jj,jk) = ua(ji,jj,jk)
120                  vn(ji,jj,jk) = va(ji,jj,jk)
121               END DO
122            END DO
123         ELSE
124            DO jj = 1, jpj                      ! caution: don't use (:,:) for this loop
125               DO ji = 1, jpi                   ! it causes optimization problems on NEC in auto-tasking
126                  ! Leap-frog time stepping
127                  ub(ji,jj,jk) = atfp * ( ub(ji,jj,jk) + ua(ji,jj,jk) ) + atfp1 * un(ji,jj,jk)
128                  vb(ji,jj,jk) = atfp * ( vb(ji,jj,jk) + va(ji,jj,jk) ) + atfp1 * vn(ji,jj,jk)
129                  un(ji,jj,jk) = ua(ji,jj,jk)
130                  vn(ji,jj,jk) = va(ji,jj,jk)
131               END DO
132            END DO
133         ENDIF
134         !                                             ! ===============
135      END DO                                           !   End of slab
136      !                                                ! ===============
137
138      IF(ln_ctl)   THEN
139         CALL prt_ctl(tab3d_1=un, clinfo1=' nxt  - Un: ', mask1=umask, &
140            &         tab3d_2=vn, clinfo2=' Vn: ', mask2=vmask)
141      ENDIF
142
143   END SUBROUTINE dyn_nxt
144
145   !!======================================================================
146END MODULE dynnxt
Note: See TracBrowser for help on using the repository browser.