Ticket #1220: trdmld_trc_rst.F90

File trdmld_trc_rst.F90, 10.8 KB (added by molines, 7 years ago)
Line 
1MODULE trdmld_trc_rst
2   !!======================================================================
3   !!                       ***  MODULE  trdmld_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_trdmld_trc
10   !!----------------------------------------------------------------------
11!!AA circular dependency
12!   USE oce_trc
13   USE in_out_manager  ! I/O manager
14   USE iom             ! I/O module
15   USE trc             ! for nn_dttrc ctrcnm
16   USE trdmod_trc_oce  ! for lk_trdmld_trc
17
18   IMPLICIT NONE
19   PRIVATE
20 
21   PUBLIC   trd_mld_trc_rst_read    ! routine called by trd_mld_init
22   PUBLIC   trd_mld_trc_rst_write   ! routine called by step.F90
23 
24   INTEGER ::   nummldw_trc               ! logical unit for mld restart
25   !!---------------------------------------------------------------------------------
26   !! NEMO/TOP 3.3 , NEMO Consortium (2010)
27   !! $Header: /home/opalod/NEMOCVSROOT/NEMO/OPA_SRC/TRD/trdmld_rst.F90,v 1.6 2006/11/14 09:46:13 opalod Exp $
28   !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt)
29   !!---------------------------------------------------------------------------------
30 
31CONTAINS
32 
33
34    SUBROUTINE trd_mld_trc_rst_write( kt )
35      !!--------------------------------------------------------------------------------
36      !!                  ***  SUBROUTINE trd_mld_rst_wri  ***
37      !!               
38      !! ** Purpose :   Write mixed-layer diagnostics restart fields.
39      !!--------------------------------------------------------------------------------
40      INTEGER, INTENT( in ) ::   kt     ! ocean time-step index
41      !
42      CHARACTER(LEN=20)   ::   clkt     ! ocean time-step deine as a character
43      CHARACTER(LEN=50)   ::   clname   ! ice output restart file name
44      CHARACTER (len=35) :: charout
45      INTEGER :: jl,  jk, jn               ! loop indice
46      !!--------------------------------------------------------------------------------
47
48      IF( kt == nitrst - nn_dttrc .OR. nitend - nit000 + 1 < 2 * nn_dttrc ) THEN ! idem trcrst.F90
49         IF( nitrst > 1.0e9 ) THEN
50            WRITE(clkt,*) nitrst
51         ELSE
52           WRITE(clkt,'(i8.8)') nitrst
53         ENDIF
54         clname = TRIM(cexper)//"_"//TRIM(ADJUSTL(clkt))//"_"//TRIM(cn_trdrst_trc_out)
55         IF(lwp) WRITE(numout,*) '             open ocean restart_mld_trc NetCDF  '//clname
56         CALL iom_open( clname, nummldw_trc, ldwrt = .TRUE., kiolib = jprstlib )
57      ENDIF
58
59      IF( kt == nitend .AND. lk_trdmld_trc ) THEN
60
61         IF( kt == nitend .AND. lwp ) THEN
62            WRITE(numout,*)
63            WRITE(numout,*) 'trdmld_trc_rst: output for ML diags. restart, with trd_mld_trc_rst_write routine'
64            WRITE(numout,*) '~~~~~~~~~~~~~~'
65            WRITE(numout,*)
66         ENDIF
67
68         IF( ln_trdmld_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#if defined key_lobster
110            DO jl = 1, jp_lobster_trd
111               CALL iom_rstput( kt, nitrst, nummldw_trc, 'tmltrd_csum_ub_bio'//ctrd_bio(jl,2), tmltrd_csum_ub_bio(:,:,jl) )
112            ENDDO
113#endif
114
115         ENDIF
116         
117         CALL iom_close( nummldw_trc )
118         lrst_trc = .TRUE.
119
120      ENDIF
121
122    END SUBROUTINE trd_mld_trc_rst_write
123
124
125    SUBROUTINE trd_mld_trc_rst_read
126      !!----------------------------------------------------------------------------
127      !!                   ***  SUBROUTINE trd_mld_rst_lec  ***
128      !!                   
129      !! ** Purpose :   Read file for mixed-layer diagnostics restart.
130      !!----------------------------------------------------------------------------
131      INTEGER  ::  inum       ! temporary logical unit
132      !
133      CHARACTER (len=35) :: charout
134      INTEGER ::  jk, jn, jl     ! loop indice
135      INTEGER ::  jlibalt = jprstlib
136      LOGICAL ::  llok
137      !!-----------------------------------------------------------------------------
138     
139      IF(lwp)  THEN
140         WRITE(numout,*)
141         WRITE(numout,*) ' trd_mld_trc_rst_read : read the NetCDF MLD restart file'
142         WRITE(numout,*) ' ~~~~~~~~~~~~~~~~~~~~'
143      ENDIF
144     
145      IF ( jprstlib == jprstdimg ) THEN
146        ! eventually read netcdf file (monobloc)  for restarting on different number of processors
147        ! if {cn_trdrst_trc_in}.nc exists, then set jlibalt to jpnf90
148        INQUIRE( FILE = TRIM(cn_trdrst_trc_in)//'.nc', EXIST = llok )
149        IF ( llok ) THEN ; jlibalt = jpnf90  ; ELSE ; jlibalt = jprstlib ; ENDIF
150      ENDIF
151
152      CALL iom_open( cn_trdrst_trc_in, inum, kiolib = jlibalt ) 
153     
154      IF( ln_trdmld_trc_instant ) THEN
155         
156         DO jn = 1, jptra
157            CALL iom_get( inum, jpdom_autoglo, 'tmlbb_trc_'  //ctrcnm(jn), tmlbb_trc  (:,:,jn) )
158            CALL iom_get( inum, jpdom_autoglo, 'tmlbn_trc_'  //ctrcnm(jn), tmlbn_trc  (:,:,jn) )
159            CALL iom_get( inum, jpdom_autoglo, 'tmlatfb_trc_'//ctrcnm(jn), tmlatfb_trc(:,:,jn) )
160            CALL iom_get( inum, jpdom_autoglo, 'tmlradb_trc_'//ctrcnm(jn), tmlradb_trc(:,:,jn) )
161         END DO
162         
163      ELSE
164         CALL iom_get( inum, jpdom_autoglo, 'rmldbn_trc', rmldbn_trc ) ! needed for rmld_sum
165         
166         !                                                          ! ===========
167         DO jn = 1, jptra                                           ! tracer loop
168            !                                                       ! ===========
169            CALL iom_get( inum, jpdom_autoglo, 'tmlatfb_trc_' //ctrcnm(jn), tmlatfb_trc(:,:,jn) )
170            CALL iom_get( inum, jpdom_autoglo, 'tmlbb_trc_'   //ctrcnm(jn), tmlbb_trc  (:,:,jn) )
171            CALL iom_get( inum, jpdom_autoglo, 'tmlradb_trc_' //ctrcnm(jn), tmlradb_trc(:,:,jn) )
172
173            CALL iom_get( inum, jpdom_autoglo, 'tmlbn_trc_'   //ctrcnm(jn), tmlbn_trc   (:,:,jn) ) ! needed for tml_sum
174            CALL iom_get( inum, jpdom_autoglo, 'tml_sumb_trc_'//ctrcnm(jn), tml_sumb_trc(:,:,jn) )
175           
176            DO jk = 1, jpltrd_trc
177               IF( jk < 10 )   THEN
178                  WRITE(charout,FMT="('tmltrd_csum_ub_trc_', A3, '_', I1)") ctrcnm(jn), jk
179               ELSE
180                  WRITE(charout,FMT="('tmltrd_csum_ub_trc_', A3, '_', I2)") ctrcnm(jn), jk
181               ENDIF
182               CALL iom_get( inum, jpdom_autoglo, charout, tmltrd_csum_ub_trc(:,:,jk,jn) )
183            END DO
184           
185            CALL iom_get( inum, jpdom_autoglo, 'tmltrd_atf_sumb_trc_'//ctrcnm(jn) , &
186                 &        tmltrd_atf_sumb_trc(:,:,jn) )
187
188            CALL iom_get( inum, jpdom_autoglo, 'tmltrd_rad_sumb_trc_'//ctrcnm(jn) , &
189                 &        tmltrd_rad_sumb_trc(:,:,jn) )
190            !                                                       ! ===========
191         END DO                                                     ! tracer loop
192         !                                                          ! ===========
193
194#if defined key_lobster
195         DO jl = 1, jp_lobster_trd
196            CALL iom_get( inum, jpdom_autoglo, 'tmltrd_csum_ub_bio'//ctrd_bio(jl,2), tmltrd_csum_ub_bio(:,:,jl) )
197         ENDDO
198#endif
199
200! C.D.: iom_close misplaced. As it is here, it is only for the case ln_trdmld_trc_instant=False         
201!         CALL iom_close( inum )
202      ENDIF
203
204      CALL iom_close( inum )
205     
206    END SUBROUTINE trd_mld_trc_rst_read
207 
208#else
209  !!=================================================================================
210  !!                       ***  MODULE  trdmld_rst  ***
211  !! Ocean dynamic :  Input/Output files for restart on mixed-layer diagnostics
212  !!=================================================================================
213CONTAINS
214  SUBROUTINE trd_mld_trc_rst_opn( kt )
215    WRITE(*,*) 'trd_mld_trc_rst_opn: You should not have seen this print! error?', kt
216  END SUBROUTINE trd_mld_trc_rst_opn
217  SUBROUTINE trd_mld_trc_rst_write( kt )           !  No ML diags ==> empty routine
218    WRITE(*,*) 'trd_mld_trc_rst_wri: You should not have seen this print! error?', kt
219  END SUBROUTINE trd_mld_trc_rst_write
220  SUBROUTINE trd_mld_trc_rst_read                  !  No ML Diags ==> empty routine
221  END SUBROUTINE trd_mld_trc_rst_read
222#endif
223
224  !!=================================================================================
225END MODULE trdmld_trc_rst