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.
stpctl_tam.F90 in branches/TAM_V3_0/NEMOTAM/OPATAM_SRC – NEMO

source: branches/TAM_V3_0/NEMOTAM/OPATAM_SRC/stpctl_tam.F90 @ 2587

Last change on this file since 2587 was 2587, checked in by vidard, 13 years ago

refer to ticket #798

File size: 11.1 KB
Line 
1MODULE stpctl_tam
2#ifdef key_tam
3   !!==============================================================================
4   !!                       ***  MODULE  stpctl_tam  ***
5   !! Ocean run control :  gross check of the ocean time stepping
6   !!                      Tangent and adjoint module
7   !!==============================================================================
8
9   !!----------------------------------------------------------------------
10   !!   stp_ctl_tan      : Control the run
11   !!   stp_ctl_adj      : Control the run
12   !!----------------------------------------------------------------------
13   !! * Modules used
14   USE par_kind      , ONLY: & ! Precision variables
15      & wp
16   USE in_out_manager, ONLY: & ! I/O manager
17      & lwp,                 &
18      & numout,              & 
19      & numstp,              & 
20      & numsol,              &
21      & nwrite,              &
22      & cform_err,           &
23      & nit000
24   USE par_oce       , ONLY: & ! Ocean space and time domain variables
25      & jpi,                 &
26      & jpj,                 & 
27      & jpk
28   USE oce_tam       , ONLY: & ! ocean dynamics and tracers variables
29      & un_tl,               &
30      & vn_tl,               &
31      & tn_tl,               &
32      & sn_tl,               &
33      & un_ad,               &
34      & vn_ad,               &
35      & tn_ad,               &
36      & sn_ad
37   USE dom_oce       , ONLY: & ! Ocean space and time domain
38      & umask,               &
39      & vmask,               &
40      & tmask,               &
41      & nimpp,               &
42      & njmpp
43   USE sol_oce       , ONLY: & ! ocean space and time domain variables
44      & eps,                 &
45      & epsr,                &
46      & niter,               &
47      & res
48   USE solisl        , ONLY: & ! island solver
49      & lk_isl
50   USE lib_mpp       , ONLY: & ! distributed memory computing
51      & lk_mpp,              &
52      & mpp_max,             &
53      & mpp_maxloc
54   USE dynspg_oce    , ONLY: & ! pressure gradient schemes
55      & lk_dynspg_flt,       &
56      & lk_dynspg_rl
57   IMPLICIT NONE
58   PRIVATE
59
60   !! * Accessibility
61   PUBLIC stp_ctl_tan           ! routine called by steptan.F90
62   PUBLIC stp_ctl_adj           ! routine called by stepadj.F90
63   !!----------------------------------------------------------------------
64
65CONTAINS
66
67   SUBROUTINE stp_ctl_tan( kt, kindic, ksign )
68      !!----------------------------------------------------------------------
69      !!                    ***  ROUTINE stp_ctl_tan  ***
70      !!                     
71      !! ** Purpose of the direct routine:   Control the run
72      !!
73      !! ** Method  : - Save the time step in numstp
74      !!              - Print it each 50 time steps
75      !!              - Print solver statistics in numsol
76      !!              - Stop the run IF problem for the solver ( indec < 0 )
77      !!
78      !! History :
79      !!        !  91-03  ()
80      !!        !  91-11  (G. Madec)
81      !!        !  92-06  (M. Imbard)
82      !!        !  97-06  (A.M. Treguier)
83      !!   8.5  !  02-06  (G. Madec)  F90: Free form and module
84      !!----------------------------------------------------------------------
85      !! * Arguments
86      INTEGER, INTENT( in ) ::   kt         ! ocean time-step index
87      INTEGER, INTENT( in ) ::   ksign
88      INTEGER, INTENT( inout ) ::   kindic  ! indicator of solver convergence
89
90      !! * local declarations
91      INTEGER  ::   ji, jj, jk                 ! dummy loop indices
92      INTEGER  ::   ii, ij, ik                 ! temporary integers
93      REAL(wp) ::   zumax, zvmax, ztmax, zsmax ! temporary scalars
94      INTEGER, DIMENSION(3) ::   ilocu         !
95      INTEGER, DIMENSION(3) ::   ilocv         !
96      INTEGER, DIMENSION(3) ::   iloct         !
97      INTEGER, DIMENSION(3) ::   ilocs         
98      CHARACTER(len=80) :: clname
99      LOGICAL :: lfirst =.TRUE.
100      IF( kt == nit000 .AND. lwp .AND. lfirst ) THEN
101         WRITE(numout,*)
102         WRITE(numout,*) 'stp_ctl_tan : time-stepping control'
103         WRITE(numout,*) '~~~~~~~~~~~'
104         ! open time.step file
105         clname = 'time_tan.step'
106         CALL ctlopn( numstp, clname, 'UNKNOWN', 'FORMATTED', 'SEQUENTIAL', 1, numout, lwp, 1 )
107         lfirst = .FALSE.
108      ENDIF
109
110      ! save the current time step in numstp
111      ! ------------------------------------
112      IF(lwp) WRITE(numstp,9100) kt
113      IF(lwp) REWIND(numstp)
1149100  FORMAT(1x, i8)
115
116
117      ! elliptic solver statistics (if required)
118      ! --------------------------
119      IF( lk_dynspg_flt .OR. lk_dynspg_rl ) THEN
120      ! Solver
121      IF(lwp) WRITE(numsol,9200) kt, niter, res, SQRT(epsr)/eps
122
123      ! Islands (if exist)
124!!!!AV TO DO      IF( lk_isl )   CALL isl_stp_ctl_tan( kt, kindic )
125
126
127      ! Output in numwso and numwvo IF kindic<0
128      ! ---------------------------------------
129      !    (i.e. problem for the solver)
130      IF( kindic < 0 ) THEN
131         IF(lwp) THEN
132            WRITE(numout,*) ' stpctl_tan: the elliptic solver DO not converge or explode'
133            WRITE(numout,*) ' ========= '
134            WRITE(numout,9200) kt, niter, res, sqrt(epsr)/eps
135            WRITE(numout,*)
136           WRITE(numout,*) ' =========  *******************************'
137         ENDIF
138      ENDIF
139      ENDIF
140
1419200  FORMAT(' it :', i8, ' niter :', i4, ' res :',e30.18,' b :',e30.18)
142
143      ! Test maximum of tangent fields
144      ! ------------------------
145
146      ! 1. zonal velocity
147      ! -----------------
148
149      !! zumax = MAXVAL( ABS( un_tl(:,:,:) ) )   ! slower than the following loop on NEC SX5
150      zumax = 0.e0
151      DO jk = 1, jpk
152         DO jj = 1, jpj
153            DO ji = 1, jpi
154               zumax = MAX(zumax,ABS(un_tl(ji,jj,jk)))
155          END DO
156        END DO
157      END DO       
158      IF( lk_mpp )   CALL mpp_max( zumax )   ! max over the global domain
159
160      IF( MOD( kt, nwrite ) == 1 ) THEN
161         IF(lwp) WRITE(numout,*) ' ==>> time-step= ',kt,' abs(U) max: ', zumax
162      ENDIF
163      IF( zumax > 50.) THEN
164         IF( lk_mpp ) THEN
165            CALL mpp_maxloc(ABS(un_tl),umask,zumax,ii,ij,ik)
166         ELSE
167            ilocu = MAXLOC( ABS( un_tl(:,:,:) ) )
168            ii = ilocu(1) + nimpp - 1
169            ij = ilocu(2) + njmpp - 1
170            ik = ilocu(3)
171         ENDIF
172         IF(lwp) THEN
173            WRITE(numout,cform_err)
174            WRITE(numout,*) ' stpctl_tan: the zonal velocity is larger than 50 m/s'
175            WRITE(numout,*) ' ========= '
176            WRITE(numout,9400) kt, zumax, ii, ij, ik
177            WRITE(numout,*)
178         ENDIF
179         kindic  = -3
180
181      ENDIF
1829400  FORMAT (' kt=',i6,' max abs(U): ',1pg11.4,', i j k: ',3i4)
183      ! 2. meridional velocity
184      ! ----------------------
185      zvmax = 0.e0
186      DO jk = 1, jpk
187         DO jj = 1, jpj
188            DO ji = 1, jpi
189               zvmax = MAX(zvmax,ABS(vn_tl(ji,jj,jk)))
190          END DO
191        END DO
192      END DO       
193      IF( lk_mpp )   CALL mpp_max( zvmax )   ! max over the global domain
194
195      IF( MOD( kt, nwrite ) == 1 ) THEN
196         IF(lwp) WRITE(numout,*) ' ==>> time-step= ',kt,' abs(V) max: ', zvmax
197      ENDIF
198      IF( zvmax > 50.) THEN
199         IF( lk_mpp ) THEN
200            CALL mpp_maxloc(ABS(vn_tl),vmask,zvmax,ii,ij,ik)
201         ELSE
202            ilocv = MAXLOC( ABS( vn_tl(:,:,:) ) )
203            ii = ilocv(1) + nimpp - 1
204            ij = ilocv(2) + njmpp - 1
205            ik = ilocv(3)
206         ENDIF
207         IF(lwp) THEN
208            WRITE(numout,cform_err)
209            WRITE(numout,*) ' stpctl_tan: the meridional  velocity is larger than 50 m/s'
210            WRITE(numout,*) ' ========= '
211            WRITE(numout,9410) kt, zvmax, ii, ij, ik
212            WRITE(numout,*)
213         ENDIF
214         kindic  = -3
215      ENDIF
2169410  FORMAT (' kt=',i6,' max abs(V): ',1pg11.4,', i j k: ',3i4)
217      ! 3. Temperature
218      ! ----------------------
219      ztmax = 0.e0
220      DO jk = 1, jpk
221         DO jj = 1, jpj
222            DO ji = 1, jpi
223               ztmax = MAX(ztmax,ABS(tn_tl(ji,jj,jk)))
224          END DO
225        END DO
226      END DO       
227      IF( lk_mpp )   CALL mpp_max( ztmax )   ! max over the global domain
228
229      IF( MOD( kt, nwrite ) == 1 ) THEN
230         IF(lwp) WRITE(numout,*) ' ==>> time-step= ',kt,' abs(T) max: ', zTmax
231      ENDIF
232      IF( ztmax > 80.) THEN
233         IF( lk_mpp ) THEN
234            CALL mpp_maxloc(ABS(tn_tl),tmask,ztmax,ii,ij,ik)
235         ELSE
236            iloct = MAXLOC( ABS( tn_tl(:,:,:) ) )
237            ii = iloct(1) + nimpp - 1
238            ij = iloct(2) + njmpp - 1
239            ik = iloct(3)
240         ENDIF
241         IF(lwp) THEN
242            WRITE(numout,cform_err)
243            WRITE(numout,*) ' stpctl_tan: the temperature is larger than 80 K'
244            WRITE(numout,*) ' ========= '
245            WRITE(numout,9420) kt, ztmax, ii, ij, ik
246            WRITE(numout,*)
247         ENDIF
248         kindic  = -3
249      ENDIF
2509420  FORMAT (' kt=',i6,' max abs(T): ',1pg11.4,', i j k: ',3i4)
251
252      ! 3. Temperature
253      ! ----------------------
254      zsmax = 0.e0
255      DO jk = 1, jpk
256         DO jj = 1, jpj
257            DO ji = 1, jpi
258               zsmax = MAX(zsmax,ABS(sn_tl(ji,jj,jk)))
259          END DO
260        END DO
261      END DO       
262      IF( lk_mpp )   CALL mpp_max( zsmax )   ! max over the global domain
263
264      IF( MOD( kt, nwrite ) == 1 ) THEN
265         IF(lwp) WRITE(numout,*) ' ==>> time-step= ',kt,' abs(S) max: ', zsmax
266      ENDIF
267      IF( zsmax > 100.) THEN
268         IF( lk_mpp ) THEN
269            CALL mpp_maxloc(ABS(sn_tl),tmask,zsmax,ii,ij,ik)
270         ELSE
271            ilocs = MAXLOC( ABS( sn_tl(:,:,:) ) )
272            ii = ilocs(1) + nimpp - 1
273            ij = ilocs(2) + njmpp - 1
274            ik = ilocs(3)
275         ENDIF
276         IF(lwp) THEN
277            WRITE(numout,cform_err)
278            WRITE(numout,*) ' stpctl_tan: the Salinity is larger than 100 o/oo'
279            WRITE(numout,*) ' ========== '
280            WRITE(numout,9430) kt, zsmax, ii, ij, ik
281            WRITE(numout,*)
282         ENDIF
283         kindic  = -3
284      ENDIF
2859430  FORMAT (' kt=',i6,' max abs(S): ',1pg11.4,', i j k: ',3i4)
286
287   END SUBROUTINE stp_ctl_tan
288   SUBROUTINE stp_ctl_adj( kt, kindic, ksign )
289      !!----------------------------------------------------------------------
290      !!                    ***  ROUTINE stp_ctl_adj  ***
291      !!                     
292      !! ** Purpose of the direct routine:   Control the run
293      !!
294      !! ** Method  : - Save the time step in numstp
295      !!              - Print it each 50 time steps
296      !!              - Print solver statistics in numsol
297      !!              - Stop the run IF problem for the solver ( indec < 0 )
298      !!
299      !! History :
300      !!        !  91-03  ()
301      !!        !  91-11  (G. Madec)
302      !!        !  92-06  (M. Imbard)
303      !!        !  97-06  (A.M. Treguier)
304      !!   8.5  !  02-06  (G. Madec)  F90: Free form and module
305      !!----------------------------------------------------------------------
306      !! * Arguments
307      INTEGER, INTENT( in ) ::   kt         ! ocean time-step index
308      INTEGER, INTENT( in ) ::   ksign
309      INTEGER, INTENT( inout ) ::   kindic  ! indicator of solver convergence
310
311      !! * local declarations
312
313   END SUBROUTINE stp_ctl_adj
314
315   !!======================================================================
316#endif
317END MODULE stpctl_tam
Note: See TracBrowser for help on using the repository browser.