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.
tranxt.F90 in trunk/NEMO/OPA_SRC/TRA – NEMO

source: trunk/NEMO/OPA_SRC/TRA/tranxt.F90 @ 457

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

nemo_v1_update_049:RB: reorganization of tracers part, remove traadv_cen2_atsk.h90 traldf_iso_zps.F90 trazdf_iso.F90 trazdf_iso_vopt.F90, change atsk routines to jki

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 8.6 KB
Line 
1MODULE tranxt
2   !!======================================================================
3   !!                       ***  MODULE  tranxt  ***
4   !! Ocean active tracers:  time stepping on temperature and salinity
5   !!======================================================================
6   !! History :
7   !!   7.0  !  91-11  (G. Madec)  Original code
8   !!        !  93-03  (M. Guyon)  symetrical conditions
9   !!        !  96-02  (G. Madec & M. Imbard)  opa release 8.0
10   !!   8.0  !  96-04  (A. Weaver)  Euler forward step
11   !!   8.2  !  99-02  (G. Madec, N. Grima)  semi-implicit pressure grad.
12   !!   8.5  !  02-08  (G. Madec)  F90: Free form and module
13   !!        !  02-11  (C. Talandier, A-M Treguier) Open boundaries
14   !!   9.0  !  06-02  (L. Debreu, C. Mazauric) Agrif implementation
15   !!----------------------------------------------------------------------
16   !!   tra_nxt     : time stepping on temperature and salinity
17   !!----------------------------------------------------------------------
18   !! * Modules used
19   USE oce             ! ocean dynamics and tracers variables
20   USE dom_oce         ! ocean space and time domain variables
21   USE zdf_oce         ! ???
22   USE in_out_manager  ! I/O manager
23   USE lbclnk          ! ocean lateral boundary conditions (or mpp link)
24   USE obctra          ! open boundary condition (obc_tra routine)
25   USE prtctl          ! Print control
26   USE agrif_opa_update
27   USE agrif_opa_interp
28
29   IMPLICIT NONE
30   PRIVATE
31
32   !! * Routine accessibility
33   PUBLIC tra_nxt          ! routine called by step.F90
34   !!----------------------------------------------------------------------
35   !!   OPA 9.0 , LOCEAN-IPSL (2005)
36   !! $Header$
37   !! This software is governed by the CeCILL licence see modipsl/doc/NEMO_CeCILL.txt
38   !!----------------------------------------------------------------------
39
40CONTAINS
41
42   SUBROUTINE tra_nxt( kt )
43      !!----------------------------------------------------------------------
44      !!                   ***  ROUTINE tranxt  ***
45      !!
46      !! ** Purpose :   Compute the temperature and salinity fields at the
47      !!      next time-step from their temporal trends and swap the fields.
48      !!
49      !! ** Method  :   Apply lateral boundary conditions on (ua,va) through
50      !!      call to lbc_lnk routine
51      !!      After t and s are compute using a leap-frog scheme environment:
52      !!         ta = tb + 2 rdttra(k) * ta
53      !!         sa = sb + 2 rdttra(k) * sa
54      !!      Compute and save in (ta,sa) an average over three time levels
55      !!      (before,now and after) of temperature and salinity which is
56      !!      used to compute rhd in eos routine and thus the hydrostatic
57      !!      pressure gradient (ln_dynhpg_imp = T)
58      !!      Apply an Asselin time filter on now tracers (tn,sn) to avoid
59      !!      the divergence of two consecutive time-steps and swap tracer
60      !!      arrays to prepare the next time_step:
61      !!         (zt,zs) = (ta+2tn+tb,sa+2sn+sb)/4       (ln_dynhpg_imp = T)
62      !!         (zt,zs) = (0,0)                            (default option)
63      !!         (tb,sb) = (tn,vn) + atfp [ (tb,sb) + (ta,sa) - 2 (tn,sn) ]
64      !!         (tn,sn) = (ta,sa)
65      !!         (ta,sa) = (zt,zs)  (NB: reset to 0 after use in eos.F)
66      !!
67      !! ** Action  : - update (tb,sb) and (tn,sn)
68      !!              - (ta,sa) time averaged (t,s)      (ln_dynhpg_imp = T)
69      !!
70      !!----------------------------------------------------------------------
71      !! * Arguments
72      INTEGER, INTENT( in ) ::   kt         ! ocean time-step index
73
74      !! * Local declarations
75      INTEGER ::   ji, jj, jk   ! dummy loop indices
76      REAL(wp) ::   zt, zs      ! temporary scalars
77      REAL(wp) ::   zfact       ! temporary scalar
78      !!----------------------------------------------------------------------
79
80
81      ! 0. Lateral boundary conditions on ( ta, sa )   (T-point, unchanged sign)
82      ! ---------------------------------============
83      CALL lbc_lnk( ta, 'T', 1. )   
84      CALL lbc_lnk( sa, 'T', 1. )
85
86
87      !                                                ! ===============
88      DO jk = 1, jpkm1                                 ! Horizontal slab
89         !                                             ! ===============
90
91         ! 1. Leap-frog scheme (only in explicit case, otherwise the
92         ! -------------------  time stepping is already done in trazdf)
93         IF( ln_zdfexp ) THEN
94            zfact = 2. * rdttra(jk)
95            IF( neuler == 0 .AND. kt == nit000 ) zfact = rdttra(jk)
96            ta(:,:,jk) = ( tb(:,:,jk) + zfact * ta(:,:,jk) ) * tmask(:,:,jk)
97            sa(:,:,jk) = ( sb(:,:,jk) + zfact * sa(:,:,jk) ) * tmask(:,:,jk)
98         ENDIF
99
100#if defined key_obc
101         !                                             ! ===============
102      END DO                                           !   End of slab
103      !                                                ! ===============
104
105      ! Update tracers on open boundaries.
106      CALL obc_tra( kt )
107
108      !                                                ! ===============
109      DO jk = 1, jpkm1                                 ! Horizontal slab
110         !                                             ! ===============
111#endif
112#if defined key_agrif
113         !                                             ! ===============
114      END DO                                           !   End of slab
115      !                                                ! ===============
116
117      ! Update tracers on open boundaries.
118      CALL Agrif_tra( kt )
119
120      !                                                ! ===============
121      DO jk = 1, jpkm1                                 ! Horizontal slab
122         !                                             ! ===============
123#endif
124
125
126         ! 2. Time filter and swap of arrays
127         ! ---------------------------------
128
129         IF( ln_dynhpg_imp ) THEN                       ! semi-implicite hpg
130            IF( neuler == 0 .AND. kt == nit000 ) THEN
131               DO jj = 1, jpj
132                  DO ji = 1, jpi
133                     zt = ( ta(ji,jj,jk) + 2. * tn(ji,jj,jk) + tb(ji,jj,jk) ) * 0.25
134                     zs = ( sa(ji,jj,jk) + 2. * sn(ji,jj,jk) + sb(ji,jj,jk) ) * 0.25
135                     tb(ji,jj,jk) = tn(ji,jj,jk)
136                     sb(ji,jj,jk) = sn(ji,jj,jk)
137                     tn(ji,jj,jk) = ta(ji,jj,jk)
138                     sn(ji,jj,jk) = sa(ji,jj,jk)
139                     ta(ji,jj,jk) = zt
140                     sa(ji,jj,jk) = zs
141                  END DO
142               END DO
143            ELSE
144               DO jj = 1, jpj
145                  DO ji = 1, jpi
146                     zt = ( ta(ji,jj,jk) + 2. * tn(ji,jj,jk) + tb(ji,jj,jk) ) * 0.25
147                     zs = ( sa(ji,jj,jk) + 2. * sn(ji,jj,jk) + sb(ji,jj,jk) ) * 0.25
148                     tb(ji,jj,jk) = atfp  * ( tb(ji,jj,jk) + ta(ji,jj,jk) ) + atfp1 * tn(ji,jj,jk)
149                     sb(ji,jj,jk) = atfp  * ( sb(ji,jj,jk) + sa(ji,jj,jk) ) + atfp1 * sn(ji,jj,jk)
150                     tn(ji,jj,jk) = ta(ji,jj,jk)
151                     sn(ji,jj,jk) = sa(ji,jj,jk)
152                     ta(ji,jj,jk) = zt
153                     sa(ji,jj,jk) = zs
154                  END DO
155               END DO
156            ENDIF
157         ELSE                                          ! Default case
158            IF( neuler == 0 .AND. kt == nit000 ) THEN
159               DO jj = 1, jpj
160                  DO ji = 1, jpi
161                     tb(ji,jj,jk) = tn(ji,jj,jk)
162                     sb(ji,jj,jk) = sn(ji,jj,jk)
163                     tn(ji,jj,jk) = ta(ji,jj,jk)
164                     sn(ji,jj,jk) = sa(ji,jj,jk)
165                  END DO
166               END DO
167            ELSE
168               DO jj = 1, jpj
169                  DO ji = 1, jpi
170                     tb(ji,jj,jk) = atfp  * ( tb(ji,jj,jk) + ta(ji,jj,jk) ) + atfp1 * tn(ji,jj,jk)
171                     sb(ji,jj,jk) = atfp  * ( sb(ji,jj,jk) + sa(ji,jj,jk) ) + atfp1 * sn(ji,jj,jk)
172                     tn(ji,jj,jk) = ta(ji,jj,jk)
173                     sn(ji,jj,jk) = sa(ji,jj,jk)
174                  END DO
175               END DO
176            ENDIF
177         ENDIF
178         !                                             ! ===============
179      END DO                                           !   End of slab
180      !                                                ! ===============
181
182      IF(ln_ctl) THEN         ! print mean field (used for debugging)
183         CALL prt_ctl(tab3d_1=tn, clinfo1=' nxt  - Tn: ', mask1=tmask, &
184            &         tab3d_2=sn, clinfo2=' Sn: ', mask2=tmask)
185      ENDIF
186     
187#if defined key_agrif
188      IF (.NOT.Agrif_Root())    CALL Agrif_Update_Tra( kt )
189#endif     
190
191   END SUBROUTINE tra_nxt
192
193   !!======================================================================
194END MODULE tranxt
Note: See TracBrowser for help on using the repository browser.