source: NEMO/branches/2019/dev_r11613_ENHANCE-04_namelists_as_internalfiles/src/TOP/TRP/trdmxl_trc_rst.F90 @ 11671

Last change on this file since 11671 was 10425, checked in by smasson, 3 years ago

trunk: merge back dev_r10164_HPC09_ESIWACE_PREP_MERGE@10424 into the trunk

  • Property svn:keywords set to Id
File size: 10.2 KB
Line 
1MODULE trdmxl_trc_rst
2   !!======================================================================
3   !!                       ***  MODULE  trdmxl_rst  ***
4   !! Ocean dynamic :  Input/Output files for restart on mixed-layer diagnostics
5   !!======================================================================
6   !! History :  9.0  ! 07-03 (C. Deltel) Original code
7   !!----------------------------------------------------------------------
8 
9#if defined key_top && defined key_trdmxl_trc
10   !!----------------------------------------------------------------------
11   USE in_out_manager  ! I/O manager
12   USE iom             ! I/O module
13   USE trc             ! for nn_dttrc ctrcnm
14   USE trdmxl_trc_oce  ! for lk_trdmxl_trc
15
16   IMPLICIT NONE
17   PRIVATE
18 
19   PUBLIC   trd_mxl_trc_rst_read    ! routine called by trd_mxl_init
20   PUBLIC   trd_mxl_trc_rst_write   ! routine called by step.F90
21 
22   INTEGER ::   nummldw_trc               ! logical unit for mld restart
23   
24   !!---------------------------------------------------------------------------------
25   !! NEMO/TOP 4.0 , NEMO Consortium (2018)
26   !! $Id$
27   !! Software governed by the CeCILL license (see ./LICENSE)
28   !!---------------------------------------------------------------------------------
29CONTAINS
30
31    SUBROUTINE trd_mxl_trc_rst_write( kt )
32      !!--------------------------------------------------------------------------------
33      !!                  ***  SUBROUTINE trd_mxl_rst_wri  ***
34      !!               
35      !! ** Purpose :   Write mixed-layer diagnostics restart fields.
36      !!--------------------------------------------------------------------------------
37      INTEGER, INTENT( in ) ::   kt     ! ocean time-step index
38      !
39      CHARACTER(LEN=20)   ::   clkt     ! ocean time-step deine as a character
40      CHARACTER(LEN=50)   ::   clname   ! output restart file name
41      CHARACTER(LEN=256)  ::   clpath   ! full path to restart file
42      CHARACTER (len=35) :: charout
43      INTEGER :: jl,  jk, jn               ! loop indice
44      !!--------------------------------------------------------------------------------
45
46      IF( kt == nitrst - nn_dttrc .OR. nitend - nit000 + 1 < 2 * nn_dttrc ) THEN ! idem trcrst.F90
47         IF( nitrst > 1.0e9 ) THEN
48            WRITE(clkt,*) nitrst
49         ELSE
50           WRITE(clkt,'(i8.8)') nitrst
51         ENDIF
52         clname = TRIM(cexper)//"_"//TRIM(ADJUSTL(clkt))//"_"//TRIM(cn_trdrst_trc_out)
53         clpath = TRIM(cn_trcrst_outdir)
54         IF( clpath(LEN_TRIM(clpath):) /= '/' ) clpath = TRIM(clpath) // '/'
55         IF(lwp) WRITE(numout,*) '             open ocean restart_mld_trc NetCDF  'TRIM(clpath)//TRIM(clname)
56         CALL iom_open( TRIM(clpath)//TRIM(clname), nummldw_trc, ldwrt = .TRUE. )
57      ENDIF
58
59      IF( kt == nitend .AND. lk_trdmxl_trc ) THEN
60
61         IF( kt == nitend .AND. lwp ) THEN
62            WRITE(numout,*)
63            WRITE(numout,*) 'trdmxl_trc_rst: output for ML diags. restart, with trd_mxl_trc_rst_write routine'
64            WRITE(numout,*) '~~~~~~~~~~~~~~'
65            WRITE(numout,*)
66         ENDIF
67
68         IF( ln_trdmxl_trc_instant ) THEN 
69            !
70            DO jn = 1, jptra
71               CALL iom_rstput( kt, nitrst, nummldw_trc, 'tmlbb_trc_'  //ctrcnm(jn), tmlbb_trc  (:,:,jn) )
72               CALL iom_rstput( kt, nitrst, nummldw_trc, 'tmlbn_trc_'  //ctrcnm(jn), tmlbn_trc  (:,:,jn) )
73               CALL iom_rstput( kt, nitrst, nummldw_trc, 'tmlatfb_trc_'//ctrcnm(jn), tmlatfb_trc(:,:,jn) )
74               CALL iom_rstput( kt, nitrst, nummldw_trc, 'tmlradb_trc_'//ctrcnm(jn), tmlradb_trc(:,:,jn) )
75            END DO
76            !
77         ELSE
78            !
79            CALL iom_rstput( kt, nitrst, nummldw_trc, 'rmldbn_trc', rmldbn_trc )  ! 2D x 1
80           
81            !                                                          ! ===========
82            DO jn = 1, jptra                                           ! tracer loop
83               !                                                       ! ===========
84
85               CALL iom_rstput( kt, nitrst, nummldw_trc, 'tmlatfb_trc_' //ctrcnm(jn), tmlatfb_trc (:,:,jn) ) ! 2D x jptra
86               CALL iom_rstput( kt, nitrst, nummldw_trc, 'tmlbb_trc_'   //ctrcnm(jn), tmlbb_trc   (:,:,jn) ) ! 2D x jptra
87               CALL iom_rstput( kt, nitrst, nummldw_trc, 'tmlradb_trc_' //ctrcnm(jn), tmlradb_trc (:,:,jn) ) ! 2D x jptra
88
89               CALL iom_rstput( kt, nitrst, nummldw_trc, 'tmlbn_trc_'   //ctrcnm(jn), tmlbn_trc   (:,:,jn) ) ! 2D x jptra
90               CALL iom_rstput( kt, nitrst, nummldw_trc, 'tml_sumb_trc_'//ctrcnm(jn), tml_sumb_trc(:,:,jn) ) ! 2D x jptra
91               
92               DO jk = 1, jpltrd_trc
93                  IF( jk < 10 )   THEN
94                     WRITE(charout,FMT="('tmltrd_csum_ub_trc_', A3, '_', I1)") ctrcnm(jn), jk
95                  ELSE
96                     WRITE(charout,FMT="('tmltrd_csum_ub_trc_', A3, '_', I2)") ctrcnm(jn), jk
97                  ENDIF
98                  CALL iom_rstput( kt, nitrst, nummldw_trc, charout, tmltrd_csum_ub_trc(:,:,jk,jn) )
99               END DO
100               
101               CALL iom_rstput( kt, nitrst, nummldw_trc, 'tmltrd_atf_sumb_trc_'//ctrcnm(jn) , &
102                    &           tmltrd_atf_sumb_trc(:,:,jn) ) ! 2D x jptra
103
104               CALL iom_rstput( kt, nitrst, nummldw_trc, 'tmltrd_rad_sumb_trc_'//ctrcnm(jn) , &
105                    &           tmltrd_rad_sumb_trc(:,:,jn) ) ! 2D x jptra
106               !                                                       ! ===========
107            END DO                                                     ! tracer loop
108            !                                                          ! ===========
109         ENDIF
110         
111         CALL iom_close( nummldw_trc )
112         lrst_trc = .TRUE.
113
114      ENDIF
115
116    END SUBROUTINE trd_mxl_trc_rst_write
117
118
119    SUBROUTINE trd_mxl_trc_rst_read
120      !!----------------------------------------------------------------------------
121      !!                   ***  SUBROUTINE trd_mxl_rst_lec  ***
122      !!                   
123      !! ** Purpose :   Read file for mixed-layer diagnostics restart.
124      !!----------------------------------------------------------------------------
125      INTEGER  ::  inum       ! temporary logical unit
126      !
127      CHARACTER (len=35) :: charout
128      INTEGER ::  jk, jn, jl     ! loop indice
129      LOGICAL ::  llok
130      CHARACTER(LEN=256)  ::   clpath   ! full path to restart file
131      !!-----------------------------------------------------------------------------
132     
133      IF(lwp)  THEN
134         WRITE(numout,*)
135         WRITE(numout,*) ' trd_mxl_trc_rst_read : read the NetCDF MLD restart file'
136         WRITE(numout,*) ' ~~~~~~~~~~~~~~~~~~~~'
137      ENDIF
138     
139      clpath = TRIM(cn_trcrst_indir)
140      IF( clpath(LEN_TRIM(clpath):) /= '/' ) clpath = TRIM(clpath) // '/'
141      CALL iom_open( TRIM(clpath)//TRIM(cn_trdrst_trc_in), inum ) 
142     
143      IF( ln_trdmxl_trc_instant ) THEN
144         
145         DO jn = 1, jptra
146            CALL iom_get( inum, jpdom_autoglo, 'tmlbb_trc_'  //ctrcnm(jn), tmlbb_trc  (:,:,jn) )
147            CALL iom_get( inum, jpdom_autoglo, 'tmlbn_trc_'  //ctrcnm(jn), tmlbn_trc  (:,:,jn) )
148            CALL iom_get( inum, jpdom_autoglo, 'tmlatfb_trc_'//ctrcnm(jn), tmlatfb_trc(:,:,jn) )
149            CALL iom_get( inum, jpdom_autoglo, 'tmlradb_trc_'//ctrcnm(jn), tmlradb_trc(:,:,jn) )
150         END DO
151         
152      ELSE
153         CALL iom_get( inum, jpdom_autoglo, 'rmldbn_trc', rmldbn_trc ) ! needed for rmld_sum
154         
155         !                                                          ! ===========
156         DO jn = 1, jptra                                           ! tracer loop
157            !                                                       ! ===========
158            CALL iom_get( inum, jpdom_autoglo, 'tmlatfb_trc_' //ctrcnm(jn), tmlatfb_trc(:,:,jn) )
159            CALL iom_get( inum, jpdom_autoglo, 'tmlbb_trc_'   //ctrcnm(jn), tmlbb_trc  (:,:,jn) )
160            CALL iom_get( inum, jpdom_autoglo, 'tmlradb_trc_' //ctrcnm(jn), tmlradb_trc(:,:,jn) )
161
162            CALL iom_get( inum, jpdom_autoglo, 'tmlbn_trc_'   //ctrcnm(jn), tmlbn_trc   (:,:,jn) ) ! needed for tml_sum
163            CALL iom_get( inum, jpdom_autoglo, 'tml_sumb_trc_'//ctrcnm(jn), tml_sumb_trc(:,:,jn) )
164           
165            DO jk = 1, jpltrd_trc
166               IF( jk < 10 )   THEN
167                  WRITE(charout,FMT="('tmltrd_csum_ub_trc_', A3, '_', I1)") ctrcnm(jn), jk
168               ELSE
169                  WRITE(charout,FMT="('tmltrd_csum_ub_trc_', A3, '_', I2)") ctrcnm(jn), jk
170               ENDIF
171               CALL iom_get( inum, jpdom_autoglo, charout, tmltrd_csum_ub_trc(:,:,jk,jn) )
172            END DO
173           
174            CALL iom_get( inum, jpdom_autoglo, 'tmltrd_atf_sumb_trc_'//ctrcnm(jn) , &
175                 &        tmltrd_atf_sumb_trc(:,:,jn) )
176
177            CALL iom_get( inum, jpdom_autoglo, 'tmltrd_rad_sumb_trc_'//ctrcnm(jn) , &
178                 &        tmltrd_rad_sumb_trc(:,:,jn) )
179            !                                                       ! ===========
180         END DO                                                     ! tracer loop
181         !                                                          ! ===========
182
183         CALL iom_close( inum )
184      ENDIF
185     
186    END SUBROUTINE trd_mxl_trc_rst_read
187 
188#else
189  !!=================================================================================
190  !!                       ***  MODULE  trdmxl_rst  ***
191  !! Ocean dynamic :  Input/Output files for restart on mixed-layer diagnostics
192  !!=================================================================================
193CONTAINS
194  SUBROUTINE trd_mxl_trc_rst_opn( kt )
195    IMPLICIT NONE
196    INTEGER, INTENT( in ) :: kt
197    WRITE(*,*) 'trd_mxl_trc_rst_opn: You should not have seen this print! error?', kt
198  END SUBROUTINE trd_mxl_trc_rst_opn
199  SUBROUTINE trd_mxl_trc_rst_write( kt )           !  No ML diags ==> empty routine
200    IMPLICIT NONE
201    INTEGER, INTENT( in ) :: kt
202    WRITE(*,*) 'trd_mxl_trc_rst_wri: You should not have seen this print! error?', kt
203  END SUBROUTINE trd_mxl_trc_rst_write
204  SUBROUTINE trd_mxl_trc_rst_read                  !  No ML Diags ==> empty routine
205    IMPLICIT NONE
206  END SUBROUTINE trd_mxl_trc_rst_read
207#endif
208
209  !!=================================================================================
210END MODULE trdmxl_trc_rst
Note: See TracBrowser for help on using the repository browser.