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 @ 367

Last change on this file since 367 was 367, checked in by opalod, 18 years ago

nemo_v1_update_035 : CT : OBCs adapted to the new surface pressure gradient algorithms

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