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_2_2/NEMOTAM/OPATAM_SRC – NEMO

source: branches/TAM_V3_2_2/NEMOTAM/OPATAM_SRC/stpctl_tam.F90 @ 3317

Last change on this file since 3317 was 2578, checked in by rblod, 13 years ago

first import of NEMOTAM 3.2.2

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