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

Last change on this file since 392 was 392, checked in by opalod, 15 years ago

RB:nemo_v1_update_038: first integration of Agrif :

  • add agrif to dynspg_flt_jki.F90
  • cosmetic change of key_AGRIF in key_agrif
  • 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   
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   USE agrif_opa_update
19   USE agrif_opa_interp
20
21   IMPLICIT NONE
22   PRIVATE
23
24   !! * Routine accessibility
25   PUBLIC tra_nxt          ! routine called by step.F90
26   !!----------------------------------------------------------------------
27   !!   OPA 9.0 , LOCEAN-IPSL (2005)
28   !! $Header$
29   !! This software is governed by the CeCILL licence see modipsl/doc/NEMO_CeCILL.txt
30   !!----------------------------------------------------------------------
31
32CONTAINS
33
34   SUBROUTINE tra_nxt( kt )
35      !!----------------------------------------------------------------------
36      !!                   ***  ROUTINE tranxt  ***
37      !!
38      !! ** Purpose :   Compute the temperature and salinity fields at the
39      !!      next time-step from their temporal trends and swap the fields.
40      !!
41      !! ** Method  :   Apply lateral boundary conditions on (ua,va) through
42      !!      call to lbc_lnk routine
43      !!      After t and s are compute using a leap-frog scheme environment:
44      !!         ta = tb + 2 rdttra(k) * ta
45      !!         sa = sb + 2 rdttra(k) * sa
46      !!      Compute and save in (ta,sa) an average over three time levels
47      !!      (before,now and after) of temperature and salinity which is
48      !!      used to compute rhd in eos routine and thus the hydrostatic
49      !!      pressure gradient (ln_dynhpg_imp = T)
50      !!      Apply an Asselin time filter on now tracers (tn,sn) to avoid
51      !!      the divergence of two consecutive time-steps and swap tracer
52      !!      arrays to prepare the next time_step:
53      !!         (zt,zs) = (ta+2tn+tb,sa+2sn+sb)/4       (ln_dynhpg_imp = T)
54      !!         (zt,zs) = (0,0)                            (default option)
55      !!         (tb,sb) = (tn,vn) + atfp [ (tb,sb) + (ta,sa) - 2 (tn,sn) ]
56      !!         (tn,sn) = (ta,sa)
57      !!         (ta,sa) = (zt,zs)  (NB: reset to 0 after use in eos.F)
58      !!
59      !! ** Action  : - update (tb,sb) and (tn,sn)
60      !!              - (ta,sa) time averaged (t,s)      (ln_dynhpg_imp = T)
61      !!
62      !! History :
63      !!   7.0  !  91-11  (G. Madec)  Original code
64      !!        !  93-03  (M. Guyon)  symetrical conditions
65      !!        !  96-02  (G. Madec & M. Imbard)  opa release 8.0
66      !!   8.0  !  96-04  (A. Weaver)  Euler forward step
67      !!   8.2  !  99-02  (G. Madec, N. Grima)  semi-implicit pressure grad.
68      !!   8.5  !  02-08  (G. Madec)  F90: Free form and module
69      !!        !  02-11  (C. Talandier, A-M Treguier) Open boundaries
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( l_trazdf_exp ) 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.