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

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

nemo_v1_update_004 : CT : Integration of the control print option for debugging work

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