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

Last change on this file since 3 was 3, checked in by opalod, 20 years ago

Initial revision

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 6.6 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 "key_dynspg_fsc" defined, the time stepping
38      !!      has already been performed in dynspg.F routine
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 8.5, LODYC-IPSL (2002)
66      !!----------------------------------------------------------------------
67
68      IF( kt == nit000 ) THEN
69         IF(lwp) WRITE(numout,*)
70         IF(lwp) WRITE(numout,*) 'dyn_nxt : time stepping'
71         IF(lwp) WRITE(numout,*) '~~~~~~~'
72      ENDIF
73
74      ! Local constant initialization
75      z2dt = 2. * rdt
76      IF( neuler == 0 .AND. kt == nit000 )  z2dt = rdt
77
78      ! Lateral boundary conditions on ( ua, va )
79      CALL lbc_lnk( ua, 'U', -1. )
80      CALL lbc_lnk( va, 'V', -1. )
81
82      !                                                ! ===============
83      DO jk = 1, jpkm1                                 ! Horizontal slab
84         !                                             ! ===============
85         ! Next velocity
86         ! -------------
87#if defined key_dynspg_fsc
88         ! Leap-frog time stepping already done in dynspg.F routine
89#else
90         DO jj = 1, jpj                      ! caution: don't use (:,:) for this loop
91            DO ji = 1, jpi                   ! it causes optimization problems on NEC in auto-tasking
92               ! Leap-frog time stepping
93               ua(ji,jj,jk) = ( ub(ji,jj,jk) + z2dt * ua(ji,jj,jk) ) * umask(ji,jj,jk)
94               va(ji,jj,jk) = ( vb(ji,jj,jk) + z2dt * va(ji,jj,jk) ) * vmask(ji,jj,jk)
95            END DO
96         END DO
97# if defined key_obc
98         !                                             ! ===============
99      END DO                                           !   End of slab
100      !                                                ! ===============
101      ! Update (ua,va) along open boundaries (only in the rigid-lid case)
102      CALL obc_dyn( kt )
103      !                                                ! ===============
104      DO jk = 1, jpkm1                                 ! Horizontal slab
105         !                                             ! ===============
106# endif
107#endif
108         ! Time filter and swap of dynamics arrays
109         ! ------------------------------------------
110         IF( neuler == 0 .AND. kt == nit000 ) THEN
111            DO jj = 1, jpj                      ! caution: don't use (:,:) for this loop
112               DO ji = 1, jpi                   ! it causes optimization problems on NEC in auto-tasking
113                  ! Euler (forward) time stepping
114                  ub(ji,jj,jk) = un(ji,jj,jk)
115                  vb(ji,jj,jk) = vn(ji,jj,jk)
116                  un(ji,jj,jk) = ua(ji,jj,jk)
117                  vn(ji,jj,jk) = va(ji,jj,jk)
118               END DO
119            END DO
120         ELSE
121            DO jj = 1, jpj                      ! caution: don't use (:,:) for this loop
122               DO ji = 1, jpi                   ! it causes optimization problems on NEC in auto-tasking
123                  ! Leap-frog time stepping
124                  ub(ji,jj,jk) = atfp * ( ub(ji,jj,jk) + ua(ji,jj,jk) ) + atfp1 * un(ji,jj,jk)
125                  vb(ji,jj,jk) = atfp * ( vb(ji,jj,jk) + va(ji,jj,jk) ) + atfp1 * vn(ji,jj,jk)
126                  un(ji,jj,jk) = ua(ji,jj,jk)
127                  vn(ji,jj,jk) = va(ji,jj,jk)
128               END DO
129            END DO
130         ENDIF
131         !                                             ! ===============
132      END DO                                           !   End of slab
133      !                                                ! ===============
134
135      IF( l_ctl .AND. lwp ) THEN         ! print sum fields (used for debugging)
136         WRITE(numout,*) ' nxt  - Un: ', SUM(un*umask), ' Vn: ', SUM(vn*vmask)
137      ENDIF
138
139   END SUBROUTINE dyn_nxt
140
141   !!======================================================================
142END MODULE dynnxt
Note: See TracBrowser for help on using the repository browser.