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

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

nemo_v1_update_033 : RB + CT : Add new surface pressure gradient algorithms

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 6.8 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_flt=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      !!   9.0  !  05-11  (V. Garnier) Surface pressure gradient organization
59      !!----------------------------------------------------------------------
60      !! * Arguments
61      INTEGER, INTENT( in ) ::   kt      ! ocean time-step index
62
63      !! * Local declarations
64      INTEGER  ::   ji, jj, jk   ! dummy loop indices
65      REAL(wp) ::   z2dt         ! temporary scalar
66      !!----------------------------------------------------------------------
67      !!  OPA 9.0 , LOCEAN-IPSL (2005)
68      !! $Header$
69      !! This software is governed by the CeCILL licence see modipsl/doc/NEMO_CeCILL.txt
70      !!----------------------------------------------------------------------
71
72      IF( kt == nit000 ) THEN
73         IF(lwp) WRITE(numout,*)
74         IF(lwp) WRITE(numout,*) 'dyn_nxt : time stepping'
75         IF(lwp) WRITE(numout,*) '~~~~~~~'
76      ENDIF
77
78      ! Local constant initialization
79      z2dt = 2. * rdt
80      IF( neuler == 0 .AND. kt == nit000 )  z2dt = rdt
81
82      ! Lateral boundary conditions on ( ua, va )
83      CALL lbc_lnk( ua, 'U', -1. )
84      CALL lbc_lnk( va, 'V', -1. )
85
86      !                                                ! ===============
87      DO jk = 1, jpkm1                                 ! Horizontal slab
88         !                                             ! ===============
89         ! Next velocity
90         ! -------------
91#if defined key_dynspg_flt
92         ! Leap-frog time stepping already done in dynspg.F routine
93#else
94         DO jj = 1, jpj                      ! caution: don't use (:,:) for this loop
95            DO ji = 1, jpi                   ! it causes optimization problems on NEC in auto-tasking
96               ! Leap-frog time stepping
97               ua(ji,jj,jk) = ( ub(ji,jj,jk) + z2dt * ua(ji,jj,jk) ) * umask(ji,jj,jk)
98               va(ji,jj,jk) = ( vb(ji,jj,jk) + z2dt * va(ji,jj,jk) ) * vmask(ji,jj,jk)
99            END DO
100         END DO
101# if defined key_obc
102         !                                             ! ===============
103      END DO                                           !   End of slab
104      !                                                ! ===============
105      ! Update (ua,va) along open boundaries (only in the rigid-lid case)
106      CALL obc_dyn( kt )
107      !                                                ! ===============
108      DO jk = 1, jpkm1                                 ! Horizontal slab
109         !                                             ! ===============
110# endif
111#endif
112         ! Time filter and swap of dynamics arrays
113         ! ------------------------------------------
114         IF( neuler == 0 .AND. kt == nit000 ) THEN
115            DO jj = 1, jpj                      ! caution: don't use (:,:) for this loop
116               DO ji = 1, jpi                   ! it causes optimization problems on NEC in auto-tasking
117                  ! Euler (forward) time stepping
118                  ub(ji,jj,jk) = un(ji,jj,jk)
119                  vb(ji,jj,jk) = vn(ji,jj,jk)
120                  un(ji,jj,jk) = ua(ji,jj,jk)
121                  vn(ji,jj,jk) = va(ji,jj,jk)
122               END DO
123            END DO
124         ELSE
125            DO jj = 1, jpj                      ! caution: don't use (:,:) for this loop
126               DO ji = 1, jpi                   ! it causes optimization problems on NEC in auto-tasking
127                  ! Leap-frog time stepping
128                  ub(ji,jj,jk) = atfp * ( ub(ji,jj,jk) + ua(ji,jj,jk) ) + atfp1 * un(ji,jj,jk)
129                  vb(ji,jj,jk) = atfp * ( vb(ji,jj,jk) + va(ji,jj,jk) ) + atfp1 * vn(ji,jj,jk)
130                  un(ji,jj,jk) = ua(ji,jj,jk)
131                  vn(ji,jj,jk) = va(ji,jj,jk)
132               END DO
133            END DO
134         ENDIF
135         !                                             ! ===============
136      END DO                                           !   End of slab
137      !                                                ! ===============
138
139      IF(ln_ctl)   THEN
140         CALL prt_ctl(tab3d_1=un, clinfo1=' nxt  - Un: ', mask1=umask, &
141            &         tab3d_2=vn, clinfo2=' Vn: ', mask2=vmask)
142      ENDIF
143
144   END SUBROUTINE dyn_nxt
145
146   !!======================================================================
147END MODULE dynnxt
Note: See TracBrowser for help on using the repository browser.