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.
trj_tam.F90 in branches/TAM_V3_2_2/NEMOTAM/OPATAM_SRC/TAM – NEMO

source: branches/TAM_V3_2_2/NEMOTAM/OPATAM_SRC/TAM/trj_tam.F90 @ 2578

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

first import of NEMOTAM 3.2.2

File size: 32.1 KB
RevLine 
[2578]1MODULE trj_tam
2#ifdef key_tam
3   !!======================================================================
4   !!                       ***  MODULE trj_tam ***
5   !! NEMOVAR trajectory: Allocate and read the trajectory for linearzation
6   !!======================================================================
7
8   !!----------------------------------------------------------------------
9   !!----------------------------------------------------------------------
10   !!   bkg_init : Initialize the background fields from disk
11   !!----------------------------------------------------------------------
12   !! * Modules used   
13   USE par_kind, ONLY : & ! Precision variables
14      & wp
15   USE par_oce, ONLY : &  ! Ocean space and time domain variables
16      & jpi, jpj, jpk
17   USE tamtrj             ! Parameters for the assmilation interface
18   USE in_out_manager, ONLY : & ! I/O manager
19      & lwp 
20   USE oce                ! Model variables
21   USE zdf_oce            ! Vertical mixing variables
22   USE zdfddm             ! Double diffusion mixing parameterization
23   USE zdfbfr,    ONLY:&  ! bottom friction
24      & bfrua,         &
25      & bfrva
26   USE trc_oce       , ONLY: & ! share SMS/Ocean variables
27      & etot3
28   USE ldftra_oce         ! Lateral tracer mixing coefficient defined in memory
29   USE ldfslp             ! Slopes of neutral surfaces
30   USE tradmp             ! Tracer damping
31   USE sbc_oce            ! Ocean surface boundary conditions
32   USE iom                ! Library to read input files
33
34   USE zdfmxl, ONLY : &   ! mixed layer depth
35      & hmlp
36   USE divcur             ! horizontal divergence and relative vorticity
37   USE sshwzv, ONLY : &  !  vertical velocity
38      & ssh_wzv
39 
40   USE oce_tam, ONLY : &      ! Dynamics and active tracers defined in memory
41      & un_tl, vn_tl, tn_tl, &
42      & wn_tl, hdivn_tl, rotn_tl,              &
43#if defined key_dynspg_flt
44      & sshn_tl, &
45#endif
46      & sn_tl
47 
48   IMPLICIT NONE
49
50   !! * Routine accessibility
51   PRIVATE
52   PUBLIC &
53      & trj_rea,     &   !: Read trajectory at time step kstep into now fields
54      & trj_rd_spl,  &   !: Read simple data (without interpolation)
55      & trj_wri_spl, &   !: Write simple data (without interpolation)
56      & tl_trj_wri,  &   !: Write simple linear-tangent data
57      & tl_trj_ini,  &   !: initialize the model-tangent state trajectory
58      & trj_deallocate   !: Deallocate all the saved variable
59
60   LOGICAL, PUBLIC :: & 
61      & ln_trjwri_tan = .FALSE.   !: No output of the state trajectory fields
62
63   CHARACTER (LEN=40), PUBLIC :: &
64      & cn_tantrj                                  !: Filename for storing the
65                                                   !: linear-tangent trajectory
66   INTEGER, PUBLIC :: &         
67      & nn_ittrjfrq_tan         !: Frequency of trajectory output for linear-tangent
68
69   !! * Module variables
70   LOGICAL, SAVE :: & 
71      & ln_mem = .FALSE.      !: Flag for allocation
72   INTEGER, SAVE :: inumtrj1 = -1, inumtrj2 = -1
73   REAL(wp), SAVE :: &
74      & stpr1, &
75      & stpr2
76   REAL(wp), ALLOCATABLE, DIMENSION(:,:), SAVE :: &
77      & empr1,    &
78      & empsr1,   &   
79      & empr2,    &
80      & empsr2,   &
81      & bfruar1,  &
82      & bfrvar1,  &   
83      & bfruar2,  &
84      & bfrvar2
85#if defined key_traldf_eiv
86#if defined key_traldf_c3d
87   REAL(wp), ALLOCATABLE, DIMENSION(:,:,:), SAVE :: &
88#elif defined key_traldf_c2d
89   REAL(wp), ALLOCATABLE, DIMENSION(:,:), SAVE :: &
90#elif defined key_traldf_c1d
91   REAL(wp), ALLOCATABLE, DIMENSION(:), SAVE :: &
92#else
93   REAL(wp) ::
94#endif
95      & aeiur1,   &
96      & aeivr1,   &
97      & aeiwr1,   & 
98      & aeiur2,   &
99      & aeivr2,   &
100      & aeiwr2
101#endif
102  REAL(wp), ALLOCATABLE, DIMENSION(:,:,:), SAVE :: &
103      & unr1,     &
104      & vnr1,     &
105      & tnr1,     &
106      & snr1,     &
107      & avmur1,   &
108      & avmvr1,   &
109      & avtr1,    &
110      & uslpr1,   &
111      & vslpr1,   &
112      & wslpir1,  &
113      & wslpjr1,  &
114      & avsr1,    &
115      & etot3r1,  &
116      & unr2,     &
117      & vnr2,     &
118      & tnr2,     &
119      & snr2,     &
120      & avmur2,   &
121      & avmvr2,   &
122      & avtr2,    &
123      & uslpr2,   &
124      & vslpr2,   &
125      & wslpir2,  &
126      & wslpjr2,  &
127      & avsr2,    &
128      & etot3r2
129  REAL(wp), ALLOCATABLE, DIMENSION(:,:), SAVE :: &
130      & hmlp1,    &
131      & hmlp2 
132     
133CONTAINS
134
135   SUBROUTINE tl_trj_ini
136      !!-----------------------------------------------------------------------
137      !!
138      !!                  ***  ROUTINE tl_trj_ini ***
139      !!
140      !! ** Purpose : initialize the model-tangent state trajectory
141      !!
142      !! ** Method  :
143      !!
144      !! ** Action  :
145      !!                   
146      !! References :
147      !!
148      !! History :
149      !!        ! 10-07 (F. Vigilant)
150      !!-----------------------------------------------------------------------
151
152      IMPLICIT NONE
153
154      !! * Modules used
155      NAMELIST/namtl_trj/ nn_ittrjfrq_tan, ln_trjwri_tan, cn_tantrj
156
157      ln_trjwri_tan = .FALSE.
158      nn_ittrjfrq_tan = 1
159      cn_tantrj = 'tl_trajectory'
160      REWIND ( numnam )
161      READ   ( numnam, namtl_trj )
162
163      ! Control print
164      IF(lwp) THEN
165         WRITE(numout,*)
166         WRITE(numout,*) 'tl_trj_ini : Linear-Tagent Trajectory handling:'
167         WRITE(numout,*) '~~~~~~~~~~~~'
168         WRITE(numout,*) '          Namelist namtl_trj : set trajectory parameters'
169         WRITE(numout,*) '             Logical switch for writing out state trajectory         ', &
170            &            ' ln_trjwri_tan = ', ln_trjwri_tan
171         WRITE(numout,*) '             Frequency of trajectory output                          ', &
172            &            ' nn_ittrjfrq_tan = ', nn_ittrjfrq_tan
173      END IF
174   END SUBROUTINE tl_trj_ini
175
176   SUBROUTINE trj_rea( kstp, kdir )
177      !!-----------------------------------------------------------------------
178      !!
179      !!                  ***  ROUTINE trj_reat  ***
180      !!
181      !! ** Purpose : Read from file the trjectory from the outer loop
182      !!
183      !! ** Method  : IOM
184      !!
185      !! ** Action  :
186      !!                   
187      !! References :
188      !!
189      !! History :
190      !!        ! 08-05 (K. Mogensen) Initial version
191      !!        ! 09-03 (F.Vigilant) Add reading of hmlp and calls (divcur, wzvmod)
192      !!        ! 2010-04 (F. Vigilant) converison to 3.2
193      !!-----------------------------------------------------------------------
194      !! * Modules used
195      !! * Arguments
196      INTEGER, INTENT(in) :: &
197         & kstp, &           ! Step for requested trajectory
198         & kdir              ! Direction for stepping (1 forward, -1 backward)
199      !! * Local declarations
200      CHARACTER (LEN=100) :: &
201         & cl_dirtrj
202      INTEGER :: &
203         & inrcm,  &
204         & inrcp,  &
205         & inrc,   &
206         & istpr1, &
207         & istpr2, &
208    & it
209      REAL(KIND=wp) :: &
210         & zwtr1, &
211         & zwtr2, &
212         & zden,  &
213         & zstp
214
215      ! Initialize data and open file
216      !! if step time is corresponding to a saved state
217      IF ( ( MOD( kstp - nit000 + 1, nn_ittrjfrq ) == 0 )  ) THEN       
218
219         it = kstp - nit000 + 1
220
221         IF ( inumtrj1 == -1 ) THEN
222
223            ! Define the input file
224            WRITE(cl_dirtrj, FMT='(A,A,I5.5,".nc")' ) TRIM( cn_dirtrj ), '_', it
225
226            !         WRITE(cl_dirtrj, FMT='(A,".nc")' ) TRIM( c_dirtrj )
227            cl_dirtrj = TRIM( cl_dirtrj )
228
229            IF(lwp) THEN
230
231               WRITE(numout,*)
232               WRITE(numout,*)'Reading non-linear fields from : ',TRIM(cl_dirtrj)
233               WRITE(numout,*)
234
235            ENDIF
236            CALL iom_open( cl_dirtrj, inumtrj1 )     
237            if ( inumtrj1 == -1)  CALL ctl_stop( 'No tam_trajectory cl_amstrj found' )
238   
239            ALLOCATE( &
240               & empr1(jpi,jpj),  &
241               & empsr1(jpi,jpj), &
242               & empr2(jpi,jpj),  &
243               & empsr2(jpi,jpj), &
244               & bfruar1(jpi,jpj),&
245               & bfrvar1(jpi,jpj),&
246               & bfruar2(jpi,jpj),&
247               & bfrvar2(jpi,jpj) &
248               & )
249
250            ALLOCATE( &
251               & unr1(jpi,jpj,jpk),     &
252               & vnr1(jpi,jpj,jpk),     &
253               & tnr1(jpi,jpj,jpk),     &
254               & snr1(jpi,jpj,jpk),     &
255               & avmur1(jpi,jpj,jpk),   &
256               & avmvr1(jpi,jpj,jpk),   &
257               & avtr1(jpi,jpj,jpk),    &
258               & etot3r1(jpi,jpj,jpk),  &
259               & unr2(jpi,jpj,jpk),     &
260               & vnr2(jpi,jpj,jpk),     &
261               & tnr2(jpi,jpj,jpk),     &
262               & snr2(jpi,jpj,jpk),     &
263               & avmur2(jpi,jpj,jpk),   &
264               & avmvr2(jpi,jpj,jpk),   &
265               & avtr2(jpi,jpj,jpk),    &
266               & etot3r2(jpi,jpj,jpk)   &
267               & )
268
269#if defined key_traldf_eiv
270#if defined key_traldf_c3d
271#elif defined key_traldf_c2d
272            ALLOCATE( &
273               & aeiur1(jpi,jpj), &
274               & aeivr1(jpi,jpj), &
275               & aeiwr1(jpi,jpj), &
276               & aeiur2(jpi,jpj), &
277               & aeivr2(jpi,jpj), &
278               & aeiwr2(jpi,jpj)  &
279               & )
280#elif defined key_traldf_c1d
281#endif
282#endif
283
284#if defined key_ldfslp
285            ALLOCATE( &
286               & uslpr1(jpi,jpj,jpk),   &
287               & vslpr1(jpi,jpj,jpk),   &
288               & wslpir1(jpi,jpj,jpk),  &
289               & wslpjr1(jpi,jpj,jpk),  &
290               & uslpr2(jpi,jpj,jpk),   &
291               & vslpr2(jpi,jpj,jpk),   &
292               & wslpir2(jpi,jpj,jpk),  &
293               & wslpjr2(jpi,jpj,jpk)   &
294               & )
295#endif
296
297#if defined key_zdfddm
298            ALLOCATE( &
299               & avsr1(jpi,jpj,jpk),    &
300               & avsr2(jpi,jpj,jpk)     &
301               & )
302#endif
303
304#if defined key_tradmp
305            ALLOCATE( &
306               & hmlp1(jpi,jpj),    &
307               & hmlp2(jpi,jpj)     &
308               & )
309#endif
310       ln_mem = .TRUE.
311
312         ENDIF
313
314
315      ! Read records
316
317         inrcm = INT( ( kstp - nit000 + 1 ) / nn_ittrjfrq ) + 1
318
319         ! Copy record 1 into record 2
320
321         IF ( ( kstp /= nitend )         .AND. &
322            & ( kstp - nit000 + 1 /= 0 ) .AND. &
323            & ( kdir == -1 ) ) THEN
324
325            stpr2           = stpr1
326
327            empr2   (:,:)   = empr1   (:,:)
328            empsr2  (:,:)   = empsr1  (:,:)
329            bfruar2  (:,:)  = bfruar1 (:,:)
330            bfrvar2  (:,:)  = bfrvar1 (:,:)
331
332            unr2    (:,:,:) = unr1    (:,:,:)
333            vnr2    (:,:,:) = vnr1    (:,:,:)
334            tnr2    (:,:,:) = tnr1    (:,:,:)
335            snr2    (:,:,:) = snr1    (:,:,:)
336            avmur2  (:,:,:) = avmur1  (:,:,:)
337            avmvr2  (:,:,:) = avmvr1  (:,:,:)
338            avtr2   (:,:,:) = avtr1   (:,:,:)
339#if defined key_ldfslp
340            uslpr2  (:,:,:) = uslpr1  (:,:,:)
341            vslpr2  (:,:,:) = vslpr1  (:,:,:)
342            wslpir2 (:,:,:) = wslpir1 (:,:,:)
343            wslpjr2 (:,:,:) = wslpjr1 (:,:,:)
344#endif
345#if defined key_zdfddm
346            avsr2   (:,:,:) = avsr1   (:,:,:)
347#endif
348            etot3r2 (:,:,:) = etot3r1 (:,:,:)
349#if defined key_tradmp
350            hmlp1   (:,:)   = hmlp2   (:,:)
351#endif
352#if defined key_traldf_eiv 
353#if defined key_traldf_c3d
354            aeiur2  (:,:,:) = aeiur1  (:,:,:)
355            aeivr2  (:,:,:) = aeivr1  (:,:.:)
356            aeiwr2  (:,:,:) = aeiwr1  (:,:.:)
357#elif defined key_traldf_c2d
358            aeiur2  (:,:)   = aeiur1  (:,:)
359            aeivr2  (:,:)   = aeivr1  (:,:)
360            aeiwr2  (:,:)   = aeiwr1  (:,:)
361#elif defined key_traldf_c1d
362            aeiur2  (:)     = aeiur1  (:)
363            aeivr2  (:)     = aeivr1  (:)
364            aeiwr2  (:)     = aeiwr1  (:)
365#else
366            aeiur2          = aeiur1     
367            aeivr2          = aeivr1     
368            aeiwr2          = aeiwr1     
369#endif
370#endif
371
372            istpr1 = INT( stpr1 )
373
374            IF(lwp) WRITE(numout,*) &
375               &                 '    Trajectory record copy time step = ', istpr1
376
377         ENDIF
378
379         IF ( ( kstp - nit000 + 1 /= 0 ) .AND. ( kdir == -1 ) ) THEN
380            ! We update the input filename
381            WRITE(cl_dirtrj, FMT='(A,A,I5.5,".nc")' ) TRIM( cn_dirtrj ), '_', (it-nn_ittrjfrq)
382            cl_dirtrj = TRIM( cl_dirtrj )
383            IF(lwp) THEN
384               WRITE(numout,*)
385               WRITE(numout,*)'Reading non-linear fields from : ',TRIM(cl_dirtrj)
386               WRITE(numout,*)
387            ENDIF
388         ENDIF
389
390         ! Read record 1
391
392         IF ( ( kstp - nit000 + 1 == 0 ) .AND.( kdir == 1           ) .OR. &
393            & ( kstp - nit000 + 1 /= 0 ) .AND.( kdir == -1          ) ) THEN
394
395            IF ( kdir == -1 ) inrcm = inrcm - 1
396!            inrc = inrcm
397            ! temporary fix: currently, only one field by step time
398            inrc = 1
399            stpr1 = (inrcm - 1) * nn_ittrjfrq
400
401            ! bug fixed to read several time the initial data
402            IF ( ( kstp - nit000 + 1 == 0 ) .AND. ( kdir == 1 ) ) THEN
403               ! Define the input file
404               WRITE(cl_dirtrj, FMT='(A,A,I5.5,".nc")' ) TRIM( cn_dirtrj ), '_', it
405
406               cl_dirtrj = TRIM( cl_dirtrj )
407
408               IF(lwp) THEN
409                  WRITE(numout,*)
410                  WRITE(numout,*)'Reading non-linear fields from : ',TRIM(cl_dirtrj)
411                  WRITE(numout,*)
412               ENDIF
413            END IF
414            IF ( inumtrj1 /= -1 )   CALL iom_open( cl_dirtrj, inumtrj1 )
415
416            CALL iom_get( inumtrj1, jpdom_autoglo, 'emp'   , empr1   , inrc )
417            CALL iom_get( inumtrj1, jpdom_autoglo, 'emps'  , empsr1  , inrc )
418            CALL iom_get( inumtrj1, jpdom_autoglo, 'un'    , unr1    , inrc )
419            CALL iom_get( inumtrj1, jpdom_autoglo, 'vn'    , vnr1    , inrc )
420            CALL iom_get( inumtrj1, jpdom_autoglo, 'tn'    , tnr1    , inrc )
421            CALL iom_get( inumtrj1, jpdom_autoglo, 'sn'    , snr1    , inrc )
422            CALL iom_get( inumtrj1, jpdom_autoglo, 'avmu'  , avmur1  , inrc )
423            CALL iom_get( inumtrj1, jpdom_autoglo, 'avmv'  , avmvr1  , inrc )
424            CALL iom_get( inumtrj1, jpdom_autoglo, 'avt'   , avtr1   , inrc )
425            CALL iom_get( inumtrj1, jpdom_autoglo, 'bfrua' , bfruar1 , inrc )
426            CALL iom_get( inumtrj1, jpdom_autoglo, 'bfrva' , bfrvar1 , inrc )
427#if defined key_ldfslp
428            CALL iom_get( inumtrj1, jpdom_autoglo, 'uslp'  , uslpr1  , inrc )
429            CALL iom_get( inumtrj1, jpdom_autoglo, 'vslp'  , vslpr1  , inrc )
430            CALL iom_get( inumtrj1, jpdom_autoglo, 'wslpi' , wslpir1 , inrc )
431            CALL iom_get( inumtrj1, jpdom_autoglo, 'wslpj' , wslpjr1 , inrc )
432#endif
433#if defined key_zdfddm
434            CALL iom_get( inumtrj1, jpdom_autoglo, 'avs'   , avsr1   , inrc )
435#endif
436            CALL iom_get( inumtrj1, jpdom_autoglo, 'etot3' , etot3r1 , inrc )
437#if defined key_tradmp
438            CALL iom_get( inumtrj1, jpdom_autoglo, 'hmlp'  , hmlp1   , inrc )
439#endif
440#if defined key_traldf_eiv
441            CALL iom_get( inumtrj1, jpdom_autoglo, 'aeiu'  , aeiur1  , inrc )
442            CALL iom_get( inumtrj1, jpdom_autoglo, 'aeiv'  , aeivr1  , inrc )
443            CALL iom_get( inumtrj1, jpdom_autoglo, 'aeiw'  , aeiwr1  , inrc )
444#endif
445            CALL iom_close( inumtrj1 )
446
447            istpr1 = INT( stpr1 )
448            IF(lwp)WRITE(numout,*) '   trajectory read time step = ', istpr1,&
449               &                   '  record = ', inrc
450
451         ENDIF
452
453
454         ! Copy record 2 into record 1
455
456         IF ( ( kstp - nit000 + 1 /= 0 ) .AND. &
457            & ( kstp /= nitend         ) .AND. &
458            & ( kdir == 1              ) ) THEN
459
460            stpr1           = stpr2
461            empr1   (:,:)   = empr2   (:,:)
462            empsr1  (:,:)   = empsr2  (:,:)
463            bfruar1 (:,:)   = bfruar2 (:,:)
464            bfrvar1 (:,:)   = bfrvar2 (:,:)
465            unr1    (:,:,:) = unr2    (:,:,:)
466            vnr1    (:,:,:) = vnr2    (:,:,:)
467            tnr1    (:,:,:) = tnr2    (:,:,:)
468            snr1    (:,:,:) = snr2    (:,:,:)
469            avmur1  (:,:,:) = avmur2  (:,:,:)
470            avmvr1  (:,:,:) = avmvr2  (:,:,:)
471            avtr1   (:,:,:) = avtr2   (:,:,:)
472#if defined key_ldfslp
473            uslpr1  (:,:,:) = uslpr2  (:,:,:)
474            vslpr1  (:,:,:) = vslpr2  (:,:,:)
475            wslpir1 (:,:,:) = wslpir2 (:,:,:)
476            wslpjr1 (:,:,:) = wslpjr2 (:,:,:)
477#endif
478#if defined key_zdfddm
479            avsr1   (:,:,:) = avsr2   (:,:,:)
480#endif
481            etot3r1 (:,:,:) = etot3r2 (:,:,:)
482#if defined key_tradmp
483            hmlp1   (:,:)   = hmlp2   (:,:)
484#endif
485#if defined key_traldf_eiv 
486#if defined key_traldf_c3d
487            aeiur1  (:,:,:) = aeiur2  (:,:,:)
488            aeivr1  (:,:,:) = aeivr2  (:,:.:)
489            aeiwr1  (:,:,:) = aeiwr2  (:,:.:)
490#elif defined key_traldf_c2d
491            aeiur1  (:,:)   = aeiur2  (:,:)
492            aeivr1  (:,:)   = aeivr2  (:,:)
493            aeiwr1  (:,:)   = aeiwr2  (:,:)
494#elif defined key_traldf_c1d
495            aeiur1  (:)     = aeiur2  (:)
496            aeivr1  (:)     = aeivr2  (:)
497            aeiwr1  (:)     = aeiwr2  (:)
498#else
499            aeiur1          = aeiur2     
500            aeivr1          = aeivr2     
501            aeiwr1          = aeiwr2     
502#endif
503#endif
504
505            istpr1 = INT( stpr1 )
506            IF(lwp) WRITE(numout,*) &
507               &                 '   Trajectory record copy time step = ', istpr1
508
509         ENDIF
510
511         ! Read record 2
512
513         IF ( ( ( kstp /= nitend ) .AND. ( kdir == 1  )) .OR. &
514            &   ( kstp == nitend ) .AND.(  kdir == -1   ) ) THEN
515
516               ! Define the input file
517               IF  (  kdir == -1   ) THEN
518                   WRITE(cl_dirtrj, FMT='(A,A,I5.5,".nc")' ) TRIM( cn_dirtrj ), '_', (it)
519               ELSE     
520                  WRITE(cl_dirtrj, FMT='(A,A,I5.5,".nc")' ) TRIM( cn_dirtrj ), '_', (it+nn_ittrjfrq)
521               ENDIF
522               cl_dirtrj = TRIM( cl_dirtrj )
523
524               IF(lwp) THEN       
525                  WRITE(numout,*)
526                  WRITE(numout,*)'Reading non-linear fields from : ',TRIM(cl_dirtrj)
527                  WRITE(numout,*)       
528               ENDIF
529
530               CALL iom_open( cl_dirtrj, inumtrj2 ) 
531
532
533            inrcp = inrcm + 1
534            !            inrc  = inrcp
535            inrc = 1  ! temporary  fix
536
537            stpr2 = (inrcp - 1) * nn_ittrjfrq 
538            CALL iom_get( inumtrj2, jpdom_autoglo, 'emp'   , empr2   , inrc )
539            CALL iom_get( inumtrj2, jpdom_autoglo, 'emps'  , empsr2  , inrc )
540            CALL iom_get( inumtrj2, jpdom_autoglo, 'un'    , unr2    , inrc )
541            CALL iom_get( inumtrj2, jpdom_autoglo, 'vn'    , vnr2    , inrc )
542            CALL iom_get( inumtrj2, jpdom_autoglo, 'tn'    , tnr2    , inrc )
543            CALL iom_get( inumtrj2, jpdom_autoglo, 'sn'    , snr2    , inrc )
544            CALL iom_get( inumtrj2, jpdom_autoglo, 'avmu'  , avmur2  , inrc )
545            CALL iom_get( inumtrj2, jpdom_autoglo, 'avmv'  , avmvr2  , inrc )
546            CALL iom_get( inumtrj2, jpdom_autoglo, 'avt'   , avtr2   , inrc )
547            CALL iom_get( inumtrj2, jpdom_autoglo, 'bfrua' , bfruar2 , inrc )
548            CALL iom_get( inumtrj2, jpdom_autoglo, 'bfrva' , bfrvar2 , inrc )
549#if defined key_ldfslp
550            CALL iom_get( inumtrj2, jpdom_autoglo, 'uslp'  , uslpr2  , inrc )
551            CALL iom_get( inumtrj2, jpdom_autoglo, 'vslp'  , vslpr2  , inrc )
552            CALL iom_get( inumtrj2, jpdom_autoglo, 'wslpi' , wslpir2 , inrc )
553            CALL iom_get( inumtrj2, jpdom_autoglo, 'wslpj' , wslpjr2 , inrc )
554#endif
555#if defined key_zdfddm
556            CALL iom_get( inumtrj2, jpdom_autoglo, 'avs'   , avsr2   , inrc )
557#endif
558            CALL iom_get( inumtrj2, jpdom_autoglo, 'etot3' , etot3r2 , inrc )
559#if defined key_tradmp
560            CALL iom_get( inumtrj2, jpdom_autoglo, 'hmlp'  , hmlp2   , inrc )
561#endif
562#if defined key_traldf_eiv
563            CALL iom_get( inumtrj2, jpdom_autoglo, 'aeiu'  , aeiur2  , inrc )
564            CALL iom_get( inumtrj2, jpdom_autoglo, 'aeiv'  , aeivr2  , inrc )
565            CALL iom_get( inumtrj2, jpdom_autoglo, 'aeiw'  , aeiwr2  , inrc )
566#endif
567            CALL iom_close( inumtrj2 )
568
569            istpr2 = INT( stpr2 )
570            IF(lwp)WRITE(numout,*) '   trajectory read2 time step = ', istpr2,&
571               &                   '  record = ', inrc
572         ENDIF
573
574      ENDIF
575
576      ! Add warning for user
577      IF ( (kstp == nitend) .AND. ( MOD( kstp - nit000 + 1, nn_ittrjfrq ) /= 0 )  ) THEN
578          IF(lwp) WRITE(numout,*) '   Warning ! nitend (=',nitend, ')', &
579               &                  ' and saving frequency (=',nn_ittrjfrq,') not compatible.'
580      ENDIF
581
582      ! Linear interpolate to the current step
583
584      IF(lwp)WRITE(numout,*) '   linear interpolate to current', &
585         &                   ' time step = ', kstp
586
587      ! Interpolation coefficients
588
589      zstp = kstp - nit000 + 1
590      zden   = 1.0 / ( stpr2 - stpr1 )
591
592      zwtr1  = ( stpr2 - zstp      ) * zden
593      zwtr2  = ( zstp  - stpr1     ) * zden
594
595IF(lwp)WRITE(numout,*) '   linear interpolate coeff.', &
596         &                   '  = ', zwtr1, zwtr2
597
598      emp(:,:)      = zwtr1 * empr1   (:,:)   + zwtr2 * empr2   (:,:)
599      emps(:,:)     = zwtr1 * empsr1  (:,:)   + zwtr2 * empsr2  (:,:)
600      bfrua(:,:)    = zwtr1 * bfruar1 (:,:)   + zwtr2 * bfruar2 (:,:)
601      bfrva(:,:)    = zwtr1 * bfrvar1 (:,:)   + zwtr2 * bfrvar2 (:,:)
602      un(:,:,:)     = zwtr1 * unr1    (:,:,:) + zwtr2 * unr2    (:,:,:)
603      vn(:,:,:)     = zwtr1 * vnr1    (:,:,:) + zwtr2 * vnr2    (:,:,:)
604      tn(:,:,:)     = zwtr1 * tnr1    (:,:,:) + zwtr2 * tnr2    (:,:,:)
605      sn(:,:,:)     = zwtr1 * snr1    (:,:,:) + zwtr2 * snr2    (:,:,:)
606      avmu(:,:,:)   = zwtr1 * avmur1  (:,:,:) + zwtr2 * avmur2  (:,:,:)
607      avmv(:,:,:)   = zwtr1 * avmvr1  (:,:,:) + zwtr2 * avmvr2  (:,:,:)
608      avt(:,:,:)    = zwtr1 * avtr1   (:,:,:) + zwtr2 * avtr2   (:,:,:)
609#if defined key_ldfslp
610      uslp(:,:,:)   = zwtr1 * uslpr1  (:,:,:) + zwtr2 * uslpr2  (:,:,:)
611      vslp(:,:,:)   = zwtr1 * vslpr1  (:,:,:) + zwtr2 * vslpr2  (:,:,:)
612      wslpi(:,:,:)  = zwtr1 * wslpir1 (:,:,:) + zwtr2 * wslpir2 (:,:,:)
613      wslpj(:,:,:)  = zwtr1 * wslpjr1 (:,:,:) + zwtr2 * wslpjr2 (:,:,:)
614#endif
615#if defined key_zdfddm
616      avs(:,:,:)    = zwtr1 * avsr1   (:,:,:) + zwtr2 * avsr2   (:,:,:)
617#endif
618      etot3(:,:,:)  = zwtr1 * etot3r1 (:,:,:) + zwtr2 * etot3r2 (:,:,:)
619#if defined key_tradmp
620      hmlp(:,:)     = zwtr1 * hmlp1(:,:)    + zwtr2 * hmlp2(:,:)
621#endif
622#if defined key_traldf_eiv 
623#if defined key_traldf_c3d
624      aeiu(:,:,:)   = zwtr1 * aeiur1  (:,:,:) + zwtr2 * aeiur2  (:,:,:)
625      aeiv(:,:,:)   = zwtr1 * aeivr1  (:,:,:) + zwtr2 * aeivr2  (:,:.:)
626      aeiw(:,:,:)   = zwtr1 * aeiwr1  (:,:,:) + zwtr2 * aeiwr2  (:,:.:)
627#elif defined key_traldf_c2d
628      aeiu(:,:)     = zwtr1 * aeiur1  (:,:)   + zwtr2 * aeiur2  (:,:)
629      aeiv(:,:)     = zwtr1 * aeivr1  (:,:)   + zwtr2 * aeivr2  (:,:)
630      aeiw(:,:)     = zwtr1 * aeiwr1  (:,:)   + zwtr2 * aeiwr2  (:,:)
631#elif defined key_traldf_c1d
632      aeiu(:)       = zwtr1 * aeiur1  (:)     + zwtr2 * aeiur2  (:)
633      aeiv(:)       = zwtr1 * aeivr1  (:)     + zwtr2 * aeivr2  (:)
634      aeiw(:)       = zwtr1 * aeiwr1  (:)     + zwtr2 * aeiwr2  (:)
635#else
636      aeiu          = zwtr1 * aeiur1          + zwtr2 * aeiur2     
637      aeiv          = zwtr1 * aeivr1          + zwtr2 * aeivr2     
638      aeiw          = zwtr1 * aeiwr1          + zwtr2 * aeiwr2     
639#endif
640#endif
641
642      CALL ssh_wzv(kstp)
643
644   END SUBROUTINE trj_rea
645
646
647   SUBROUTINE trj_wri_spl(filename)
648      !!-----------------------------------------------------------------------
649      !!
650      !!                  ***  ROUTINE trj_wri_spl ***
651      !!
652      !! ** Purpose : Write SimPLe data to file the model state trajectory
653      !!
654      !! ** Method  :
655      !!
656      !! ** Action  :
657      !!
658      !! History :
659      !!        ! 09-07 (F. Vigilant)
660      !!-----------------------------------------------------------------------
661      !! *Module udes
662      USE iom 
663      USE sol_oce, ONLY : & ! solver variables
664      & gcb, gcx
665      !! * Arguments
666      !! * Local declarations
667      INTEGER :: &
668         & inum, &                  ! File unit number
669         & fd                       ! field number
670      CHARACTER (LEN=50) :: &
671         & filename     
672
673      fd=1
674      WRITE(filename, FMT='(A,A)' ) TRIM( filename ), '.nc'
675      filename = TRIM( filename )
676      CALL iom_open( filename, inum, ldwrt = .TRUE., kiolib = jprstlib)
677
678      ! Output trajectory fields
679      CALL iom_rstput( fd, fd, inum, 'un'   , un   )
680      CALL iom_rstput( fd, fd, inum, 'vn'   , vn   )
681      CALL iom_rstput( fd, fd, inum, 'tn'   , tn   )
682      CALL iom_rstput( fd, fd, inum, 'sn'   , sn   )
683      CALL iom_rstput( fd, fd, inum, 'sshn' , sshn )
684      CALL iom_rstput( fd, fd, inum, 'wn'   , wn   )
685      CALL iom_rstput( fd, fd, inum, 'tb'   , tb   )
686      CALL iom_rstput( fd, fd, inum, 'sb'   , sb   )
687      CALL iom_rstput( fd, fd, inum, 'ua'   , ua   )
688      CALL iom_rstput( fd, fd, inum, 'va'   , va   )
689      CALL iom_rstput( fd, fd, inum, 'ta'   , ta   )
690      CALL iom_rstput( fd, fd, inum, 'sa'   , sa   )
691      CALL iom_rstput( fd, fd, inum, 'sshb' , sshb )
692      CALL iom_rstput( fd, fd, inum, 'rhd'  , rhd  )
693      CALL iom_rstput( fd, fd, inum, 'rhop' , rhop )
694      CALL iom_rstput( fd, fd, inum, 'gtu'  , gtu  )
695      CALL iom_rstput( fd, fd, inum, 'gsu'  , gsu  )
696      CALL iom_rstput( fd, fd, inum, 'gru'  , gru  )
697      CALL iom_rstput( fd, fd, inum, 'gtv'  , gtv  )
698      CALL iom_rstput( fd, fd, inum, 'gsv'  , gsv  )
699      CALL iom_rstput( fd, fd, inum, 'grv'  , grv  )
700      CALL iom_rstput( fd, fd, inum, 'rn2'  , rn2  )
701      CALL iom_rstput( fd, fd, inum, 'gcb'  , gcb  )
702      CALL iom_rstput( fd, fd, inum, 'gcx'  , gcx  )
703
704      CALL iom_close( inum )
705
706   END SUBROUTINE trj_wri_spl
707
708   SUBROUTINE trj_rd_spl(filename)
709      !!-----------------------------------------------------------------------
710      !!
711      !!                  ***  ROUTINE asm_trj__wop_rd ***
712      !!
713      !! ** Purpose : Read SimPLe data from file the model state trajectory
714      !!
715      !! ** Method  :
716      !!
717      !! ** Action  :
718      !!
719      !! History :
720      !!        ! 09-07 (F. Vigilant)
721      !!-----------------------------------------------------------------------
722      !! *Module udes
723      USE iom                 ! I/O module
724      USE sol_oce, ONLY : & ! solver variables
725      & gcb, gcx
726      !! * Arguments
727      !! * Local declarations
728      INTEGER :: &
729         & inum, &                  ! File unit number
730         & fd                       ! field number
731      CHARACTER (LEN=50) :: &
732         & filename
733       
734      fd=1
735      WRITE(filename, FMT='(A,A)' ) TRIM( filename ), '.nc'
736      filename = TRIM( filename )
737      CALL iom_open( filename, inum)
738
739      ! Output trajectory fields
740      CALL iom_get( inum, jpdom_autoglo, 'un'   , un,   fd )
741      CALL iom_get( inum, jpdom_autoglo, 'vn'   , vn,   fd )
742      CALL iom_get( inum, jpdom_autoglo, 'tn'   , tn,   fd )
743      CALL iom_get( inum, jpdom_autoglo, 'sn'   , sn,   fd )
744      CALL iom_get( inum, jpdom_autoglo, 'sshn' , sshn, fd )
745      CALL iom_get( inum, jpdom_autoglo, 'wn'   , wn,   fd )
746      CALL iom_get( inum, jpdom_autoglo, 'tb'   , tb,   fd )
747      CALL iom_get( inum, jpdom_autoglo, 'sb'   , sb,   fd )
748      CALL iom_get( inum, jpdom_autoglo, 'ua'   , ua,   fd )
749      CALL iom_get( inum, jpdom_autoglo, 'va'   , va,   fd )
750      CALL iom_get( inum, jpdom_autoglo, 'ta'   , ta,   fd )
751      CALL iom_get( inum, jpdom_autoglo, 'sa'   , sa,   fd )
752      CALL iom_get( inum, jpdom_autoglo, 'sshb' , sshb, fd )
753      CALL iom_get( inum, jpdom_autoglo, 'rhd'  , rhd,  fd )
754      CALL iom_get( inum, jpdom_autoglo, 'rhop' , rhop, fd )
755      CALL iom_get( inum, jpdom_autoglo, 'gtu'  , gtu,  fd )
756      CALL iom_get( inum, jpdom_autoglo, 'gsu'  , gsu,  fd )
757      CALL iom_get( inum, jpdom_autoglo, 'gru'  , gru,  fd )
758      CALL iom_get( inum, jpdom_autoglo, 'gtv'  , gtv,  fd )
759      CALL iom_get( inum, jpdom_autoglo, 'gsv'  , gsv,  fd )
760      CALL iom_get( inum, jpdom_autoglo, 'grv'  , grv,  fd )
761      CALL iom_get( inum, jpdom_autoglo, 'rn2'  , rn2,  fd )
762      CALL iom_get( inum, jpdom_autoglo, 'gcb'  , gcb,  fd )
763      CALL iom_get( inum, jpdom_autoglo, 'gcx'  , gcx,  fd )
764
765      CALL iom_close( inum )
766
767   END SUBROUTINE trj_rd_spl
768
769   SUBROUTINE tl_trj_wri(kstp)
770      !!-----------------------------------------------------------------------
771      !!
772      !!                  ***  ROUTINE tl_trj_wri ***
773      !!
774      !! ** Purpose : Write SimPLe data to file the model state trajectory
775      !!
776      !! ** Method  :
777      !!
778      !! ** Action  :
779      !!
780      !! History :
781      !!        ! 10-07 (F. Vigilant)
782      !!-----------------------------------------------------------------------
783      !! *Module udes
784      USE iom 
785      !! * Arguments
786      INTEGER, INTENT(in) :: &
787         & kstp           ! Step for requested trajectory
788      !! * Local declarations
789      INTEGER :: &
790         & inum           ! File unit number
791      INTEGER :: &
792         & it
793      CHARACTER (LEN=50) :: &
794         & filename
795      CHARACTER (LEN=100) :: &
796         & cl_tantrj     
797
798      ! Initialize data and open file
799      !! if step time is corresponding to a saved state
800      IF ( ( MOD( kstp - nit000 + 1, nn_ittrjfrq_tan ) == 0 )  ) THEN       
801
802         it = kstp - nit000 + 1
803
804            ! Define the input file
805            WRITE(cl_tantrj, FMT='(A,A,I5.5,".nc")' ) TRIM( cn_tantrj ), '_', it
806            cl_tantrj = TRIM( cl_tantrj )
807
808            IF(lwp) THEN
809               WRITE(numout,*)
810               WRITE(numout,*)'Writing linear-tangent fields from : ',TRIM(cl_tantrj)
811               WRITE(numout,*)
812            ENDIF
813
814            CALL iom_open( cl_tantrj, inum, ldwrt = .TRUE., kiolib = jprstlib)
815           
816            ! Output trajectory fields
817            CALL iom_rstput( it, it, inum, 'un_tl'   , un_tl   )
818            CALL iom_rstput( it, it, inum, 'vn_tl'   , vn_tl   )
819            CALL iom_rstput( it, it, inum, 'tn_tl'   , tn_tl   )
820            CALL iom_rstput( it, it, inum, 'sn_tl'   , sn_tl   )
821            CALL iom_rstput( it, it, inum, 'wn_tl'   , wn_tl   )
822            CALL iom_rstput( it, it, inum, 'hdivn_tl', hdivn_tl)
823            CALL iom_rstput( it, it, inum, 'rotn_tl' , rotn_tl )
824#if defined key_dynspg_flt
825            CALL iom_rstput( it, it, inum, 'sshn_tl' , sshn_tl )
826#endif           
827            CALL iom_close( inum )
828
829         ENDIF
830
831   END SUBROUTINE tl_trj_wri
832
833
834   SUBROUTINE trj_deallocate
835      !!-----------------------------------------------------------------------
836      !!
837      !!                  ***  ROUTINE trj_deallocate ***
838      !!
839      !! ** Purpose : Deallocate saved trajectory arrays
840      !!
841      !! ** Method  :
842      !!
843      !! ** Action  :
844      !!
845      !! History :
846      !!        ! 2010-06 (A. Vidard)
847      !!-----------------------------------------------------------------------
848
849         IF ( ln_mem ) THEN
850            DEALLOCATE(  &
851               & empr1,  &
852               & empsr1, &
853               & empr2,  &
854               & empsr2, &
855               & bfruar1,&
856               & bfrvar1,&
857               & bfruar2,&
858               & bfrvar2 &
859               & )
860
861            DEALLOCATE(    &
862               & unr1,     &
863               & vnr1,     &
864               & tnr1,     &
865               & snr1,     &
866               & avmur1,   &
867               & avmvr1,   &
868               & avtr1,    &
869               & etot3r1,  &
870               & unr2,     &
871               & vnr2,     &
872               & tnr2,     &
873               & snr2,     &
874               & avmur2,   &
875               & avmvr2,   &
876               & avtr2,    &
877               & etot3r2   &
878               & )
879
880#if defined key_traldf_eiv
881#if defined key_traldf_c3d
882#elif defined key_traldf_c2d
883            DEALLOCATE(  &
884               & aeiur1, &
885               & aeivr1, &
886               & aeiwr1, &
887               & aeiur2, &
888               & aeivr2, &
889               & aeiwr2  &
890               & )
891#elif defined key_traldf_c1d
892#endif
893#endif
894
895#if defined key_ldfslp
896            DEALLOCATE(    &
897               & uslpr1,   &
898               & vslpr1,   &
899               & wslpir1,  &
900               & wslpjr1,  &
901               & uslpr2,   &
902               & vslpr2,   &
903               & wslpir2,  &
904               & wslpjr2   &
905               & )
906#endif
907
908#if defined key_zdfddm
909            DEALLOCATE(    &
910               & avsr1,    &
911               & avsr2     &
912               & )
913#endif
914
915#if defined key_tradmp
916            DEALLOCATE(    &
917               & hmlp1,    &
918               & hmlp2     &
919               & )
920#endif
921    ENDIF
922         END SUBROUTINE trj_deallocate
923#endif
924END MODULE trj_tam
Note: See TracBrowser for help on using the repository browser.