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

source: branches/TAM_V3_0/NEMOTAM/OPATAM_SRC/tanhlt.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.8 KB
RevLine 
[2587]1MODULE tanhlt
2#if defined key_tam
3   !!==============================================================================
4   !!                       ***  MODULE tan_htl   ***
5   !! Ocean system   : TAN ocean dynamics (including on-line tracers and sea-ice)
6   !!==============================================================================
7
8   !!----------------------------------------------------------------------
9   !!   tan_hlt            : solve ocean dynamics, tracer and/or sea-ice
10   !!   tan_htl_init       : initialization of the opa model
11   !!   tan_hlt_closefile  : close remaining files
12   !!----------------------------------------------------------------------
13   !! History :
14   !!                  ()  Original code from opa
15   !!        !  10-07  (F. Vigilant) Modification for tangent linear hyp
16   !!----------------------------------------------------------------------
17   !! * Modules used
18   USE dom_oce         ! ocean space domain variables
19   USE lib_mpp         ! distributed memory computing
20   USE daymod          ! Date computations
21   USE in_out_manager  ! I/O manager
22   USE domcfg          ! domain configuration               (dom_cfg routine)
23   USE mppini          ! shared/distributed memory setting (mpp_init routine)
24   USE domain          ! domain initialization             (dom_init routine)
25   USE obc_par
26   USE obcini
27   USE phycst          ! physical constant                  (par_cst routine)
28   USE tamtrj          ! handling of the trajectory
29   USE trj_tam         ! handling of the trajectory
30   USE tamctl          ! Control parameters
31   USE oce_tam         ! TL and adjoint data
32   USE sbc_oce_tam     ! Surface BCs tangent and adjoint arrays
33   USE trc_oce_tam     ! Trend tangent and adjoint arrays
34   USE sol_oce_tam     ! Solver tangent and adjoint arrays
35   USE tamtst          ! Gradient testing
36   ! ocean physics
37#if defined key_tam
38   USE ldfdyn        ! lateral viscosity setting  (ldfdyn_init routine)
39   USE ldftra        ! lateral diffusivity setting (ldftra_init routine)
40#endif
41   USE zdfini
42   USE step_tam
43   USE istate_tam      !: Initial state setting          (istate_init routine)
44   USE par_tlm
45
46   USE hltinc, ONLY : &
47     & hlt_inc_bld
48
49   IMPLICIT NONE
50   PRIVATE
51
52   !! * Module variables
53   CHARACTER (len=64) ::        &
54      cform_aaa="( /, 'AAAAAAAA', / ) "     ! flag for output listing
55
56   !! * Routine accessibility
57   PUBLIC tan_hlt        ! called by hlttst.F90
58
59CONTAINS
60
61   SUBROUTINE tan_hlt
62      !!----------------------------------------------------------------------
63      !!                     ***  ROUTINE tan_hlt  ***
64      !!
65      !! ** Purpose :   tan_hlt 
66      !!
67      !! ** Method  : - model general initialization
68      !!              - launch the time-stepping (stp_tan routine)
69      !!
70      !! References :
71      !!----------------------------------------------------------------------
72      INTEGER ::   istp       ! time step index
73      !!----------------------------------------------------------------------
74
75#if defined key_agrif
76      CALL ctl_stop( '       Agrif not available')
77#endif
78     
79      CALL tan_hlt_init  ! Initializations
80
81      ! check that all process are still there... If some process have an error,
82      ! they will never enter in step and other processes will wait until the end of the cpu time!
83      IF( lk_mpp )   CALL mpp_max( nstop )
84
85      istp = nit000
86!      IF( lk_c1d ) THEN                 ! 1D configuration (no AGRIF zoom)
87!         CALL ctl_stop( '       lk_c1d not available')
88!      ELSE
89
90         istp = nit000 - 1     
91         CALL  trj_rea( istp, 1 )           
92         CALL hlt_inc_bld( nstg )      ! increment builder
93         istp = nit000
94
95         CALL istate_init_tan
96         IF( ln_trjwri_tan ) CALL tl_trj_wri( istp )
97
98         DO WHILE ( istp <= nitend .AND. nstop == 0 )
99#if defined key_agrif
100            CALL ctl_stop( '       Agrif not available')
101#else
102            CALL stp_tan( istp )
103#endif
104            istp = istp + 1
105            IF( ln_trjwri_tan ) CALL tl_trj_wri( istp )
106            IF( lk_mpp )   CALL mpp_max( nstop )
107         END DO
108
109!      ENDIF
110
111      !                                     ! ========= !
112      !                                     !  Job end  !
113      !                                     ! ========= !
114
115      IF(lwp) WRITE(numout,cform_aaa)       ! Flag AAAAAAA
116
117      IF( nstop /= 0 .AND. lwp ) THEN                 ! error print
118         WRITE(numout,cform_err)
119         WRITE(numout,*) nstop, ' error have been found' 
120      ENDIF
121
122      CALL tan_hlt_final
123
124      IF( lk_mpp )   CALL mppstop                          ! Close all files (mpp)
125      !
126   END SUBROUTINE tan_hlt
127
128   SUBROUTINE tan_hlt_init
129      !!----------------------------------------------------------------------
130      !!                     ***  ROUTINE tan_hlt_init  ***
131      !!
132      !! ** Purpose :   initialization of the tan model
133      !!
134      !!----------------------------------------------------------------------
135#if defined key_coupled
136      INTEGER ::   itro, istp0        ! ???
137#endif
138#if defined key_oasis3 || defined key_oasis4
139      INTEGER :: localComm
140#endif
141      !! * Local declarations
142      CHARACTER (len=128) :: file_out = 'nemohlt.output'
143!      CHARACTER (len=*), PARAMETER   ::  namelistname = 'namelist.hlt'
144      NAMELIST/namctl/ ln_ctl, nprint, nictls, nictle,   &
145         &             isplt , jsplt , njctls, njctle, nbench, nbit_cmp
146      NAMELIST/namtst/ ln_tst_nemotam, ln_tst_cpd_tam, ln_tst_stp_tam, &
147         &             ln_tst_tan_cpd, ln_tst_tan, ln_tst_stop
148      !!----------------------------------------------------------------------
149
150      ! Initializations
151      ! ===============
152
153      ! Namelist namctl : Control prints & Benchmark
154      REWIND( numnam )
155      READ  ( numnam, namctl )
156
157      ! open additionnal listing
158      IF( ln_ctl )   THEN
159         IF( narea-1 > 0 )   THEN
160            WRITE(file_out,FMT="('nemohlt.output_',I4.4)") narea-1
161            CALL ctlopn( numout, file_out, 'UNKNOWN', 'FORMATTED',   &
162               &         'SEQUENTIAL', 1, numout, .FALSE., 1 )
163            lwp = .TRUE.
164            !
165            WRITE(numout,*)
166            WRITE(numout,*) '                 L O D Y C - I P S L'
167            WRITE(numout,*) '                     O P A model'
168            WRITE(numout,*) '            Ocean General Circulation Model'
169            WRITE(numout,*) '               version OPA 9.0  (2005) '
170            WRITE(numout,*) '                   MPI Ocean output '
171            WRITE(numout,*)
172            WRITE(numout,*)
173         ENDIF
174      ENDIF
175
176      ! Parameter control and print
177      ! ---------------------------
178      IF(lwp) THEN
179         WRITE(numout,*)
180         WRITE(numout,*) '              LINEAR-TANGENT HYPOTHESIS TEST-RUN '
181         WRITE(numout,*) '              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ '
182         WRITE(numout,*) '       Namelist namhlt'
183         WRITE(numout,*) '             run stage                        nstg       = ', nstg
184         IF( nstg == 1 ) THEN
185            WRITE(numout,*) '             temperature increment switch     ln_hltt    = ', ln_hltt
186            WRITE(numout,*) '             salinity increment switch        ln_hlts    = ', ln_hlts
187            WRITE(numout,*) '             velocity incr. switch            ln_hltuv   = ', ln_hltuv
188            WRITE(numout,*) '             sea surface height incr. switch  ln_hltssh  = ', ln_hltssh
189         ENDIF
190         WRITE(numout,*)
191         WRITE(numout,*)
192      ENDIF
193
194!      CALL ctlopn( numnam, namelistname, 'OLD', 'FORMATTED', 'SEQUENTIAL',   &
195!         &           1, numout, .FALSE., 1 )
196
197      ! Namelist namctl : Control prints & Benchmark
198      REWIND( numnam )
199      READ  ( numnam, namctl )
200
201      ! Nodes selection
202      nproc = mynode()
203      narea = nproc + 1    ! mynode return the rank of proc (0 --> jpnij -1 )
204      lwp   = narea == 1
205      ln_rstart = .FALSE.
206
207      ! open additionnal listing
208      IF( narea-1 > 0 )   THEN
209         WRITE(file_out,FMT="('nemohlt.output_',I4.4)") narea-1
210         IF( numout /= 0 .AND. numout /= 6 ) THEN
211            CALL ctlopn( numout, file_out, 'UNKNOWN', 'FORMATTED',   &
212               &         'SEQUENTIAL', 1, numout, .FALSE., 1 )
213         ENDIF
214         lwp = .TRUE.
215         !
216      ENDIF     
217
218      IF(lwp) THEN
219         WRITE(numout,*)
220         WRITE(numout,*) 'nemotam_init: Control prints & Benchmark'
221         WRITE(numout,*) '~~~~~~~~~~~~ '
222         WRITE(numout,*) '          Namelist namctl'
223         WRITE(numout,*) '             run control (for debugging)     ln_ctl    = ', ln_ctl
224         WRITE(numout,*) '             level of print                  nprint    = ', nprint
225         WRITE(numout,*) '             bit comparison mode (0/1)       nbit_cmp  = ', nbit_cmp
226      ENDIF
227
228      ln_tst_nemotam = .FALSE.
229      ln_tst_cpd_tam = .FALSE.
230      ln_tst_stp_tam = .FALSE.
231      ln_tst_tan_cpd = .FALSE.
232      ln_tst_tan     = .FALSE.
233      ln_tst_stop    = .FALSE.
234
235      REWIND( numnam )
236      READ  ( numnam, namtst )
237
238      IF(lwp) THEN
239         WRITE(numout,*) ' namtst'
240         WRITE(numout,*) ' '
241         WRITE(numout,*) ' switch for M adjoint tests   ln_tst_nemotam = ',ln_tst_nemotam
242         WRITE(numout,*) ' stop after tests                ln_tst_stop = ',ln_tst_stop
243         WRITE(numout,*) ' '
244      ENDIF
245
246      IF( jpni*jpnj == jpnij ) THEN
247         CALL mpp_init                      ! standard cutting out
248      ELSE
249         CALL mpp_init2                     ! eliminate land processors
250      ENDIF
251     
252      CALL phy_cst                          ! Physical constants
253
254      CALL dom_cfg                          ! Domain configuration
255     
256      CALL dom_init                         ! Domain
257     
258      IF( lk_obc    )   CALL obc_init       ! Open boundaries
259
260      !                                     ! Ocean physics
261
262#if defined key_tam
263      CALL ldf_dyn_init                         ! Lateral ocean momentum physics
264
265      CALL ldf_tra_init                         ! Lateral ocean tracer physics
266#endif
267
268      CALL zdf_init                             ! Vertical ocean physics
269
270      CALL     oce_tam_init( 0 )            ! OCE TAM field
271      CALL sol_oce_tam_init( 0 )            ! Initialize elliptic solver
272      CALL trc_oce_tam_init( 0 )            ! TRC TAM fields
273#if defined key_tam
274      CALL sbc_oce_tam_init( 0 )            ! SBC TAM fields
275#endif
276      CALL tam_trj_ini
277      CALL tl_trj_ini
278
279      CALL day_init
280      CALL day( nit000 )
281
282   END SUBROUTINE tan_hlt_init
283
284   SUBROUTINE tan_hlt_final
285      !!----------------------------------------------------------------------
286      !!                     ***  ROUTINE opa_closefile  ***
287      !!
288      !! ** Purpose :   Close the files
289      !!
290      !! ** Method  :
291      !!
292      !! History :
293      !!   9.0  !  05-01  (O. Le Galloudec)  Original code
294      !!----------------------------------------------------------------------
295      !! * Modules used
296      !!----------------------------------------------------------------------
297
298      IF(lwp) WRITE(numout,cform_aaa)       ! Flag AAAAAAA
299
300      IF( nstop /= 0 ) THEN                 ! error print
301         IF(lwp) WRITE(numout,cform_err)
302         IF(lwp) WRITE(numout,*) nstop, ' error have been found' 
303      ENDIF
304
305      IF ( lk_mpp ) CALL mppsync
306
307      ! Deallocate variables
308      ! --------------------
309      CALL oce_tam_deallocate ( 0 )
310      CALL sol_oce_tam_deallocate ( 0 )
311#if defined key_tam
312      CALL sbc_oce_tam_deallocate ( 0 )
313      CALL trc_oce_tam_deallocate ( 0 )
314#endif
315      CALL trj_deallocate
316      ! Unit close
317      ! ----------
318
319      CLOSE( numnam )       ! namelist
320      CLOSE( numout )       ! standard model output file
321!      CLOSE( numtan_sc )    ! tangent test diagnostic output
322!      CLOSE( numtan )       ! tangent diagnostic output
323
324      IF ( lk_mpp ) CALL mppstop
325
326   END SUBROUTINE tan_hlt_final
327
328   !!======================================================================
329#endif
330END MODULE tanhlt
Note: See TracBrowser for help on using the repository browser.