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

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

CL : Add CVS Header and CeCILL licence information

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