123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227 |
- MODULE trdmxl_trc_rst
- !!======================================================================
- !! *** MODULE trdmxl_rst ***
- !! Ocean dynamic : Input/Output files for restart on mixed-layer diagnostics
- !!======================================================================
- !! History : 9.0 ! 07-03 (C. Deltel) Original code
- !!----------------------------------------------------------------------
-
- #if defined key_top && defined key_trdmxl_trc
- !!----------------------------------------------------------------------
- USE in_out_manager ! I/O manager
- USE iom ! I/O module
- USE trc ! for nn_dttrc ctrcnm
- USE trdmxl_trc_oce ! for lk_trdmxl_trc
- IMPLICIT NONE
- PRIVATE
-
- PUBLIC trd_mxl_trc_rst_read ! routine called by trd_mxl_init
- PUBLIC trd_mxl_trc_rst_write ! routine called by step.F90
-
- INTEGER :: nummldw_trc ! logical unit for mld restart
- !!---------------------------------------------------------------------------------
- !! NEMO/TOP 3.3 , NEMO Consortium (2010)
- !! $Id: trdmxl_trc_rst.F90 2422 2015-06-05 12:04:13Z ufla $
- !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt)
- !!---------------------------------------------------------------------------------
-
- CONTAINS
-
- SUBROUTINE trd_mxl_trc_rst_write( kt )
- !!--------------------------------------------------------------------------------
- !! *** SUBROUTINE trd_mxl_rst_wri ***
- !!
- !! ** Purpose : Write mixed-layer diagnostics restart fields.
- !!--------------------------------------------------------------------------------
- INTEGER, INTENT( in ) :: kt ! ocean time-step index
- !
- CHARACTER(LEN=20) :: clkt ! ocean time-step deine as a character
- CHARACTER(LEN=50) :: clname ! output restart file name
- CHARACTER(LEN=256) :: clpath ! full path to restart file
- CHARACTER (len=35) :: charout
- INTEGER :: jl, jk, jn ! loop indice
- !!--------------------------------------------------------------------------------
- IF( kt == nitrst - nn_dttrc .OR. nitend - nit000 + 1 < 2 * nn_dttrc ) THEN ! idem trcrst.F90
- IF( nitrst > 1.0e9 ) THEN
- WRITE(clkt,*) nitrst
- ELSE
- WRITE(clkt,'(i8.8)') nitrst
- ENDIF
- clname = TRIM(cexper)//"_"//TRIM(ADJUSTL(clkt))//"_"//TRIM(cn_trdrst_trc_out)
- clpath = TRIM(cn_trcrst_outdir)
- IF( clpath(LEN_TRIM(clpath):) /= '/' ) clpath = TRIM(clpath) // '/'
- IF(lwp) WRITE(numout,*) ' open ocean restart_mld_trc NetCDF 'TRIM(clpath)//TRIM(clname)
- CALL iom_open( TRIM(clpath)//TRIM(clname), nummldw_trc, ldwrt = .TRUE., kiolib = jprstlib )
- ENDIF
- IF( kt == nitend .AND. lk_trdmxl_trc ) THEN
- IF( kt == nitend .AND. lwp ) THEN
- WRITE(numout,*)
- WRITE(numout,*) 'trdmxl_trc_rst: output for ML diags. restart, with trd_mxl_trc_rst_write routine'
- WRITE(numout,*) '~~~~~~~~~~~~~~'
- WRITE(numout,*)
- ENDIF
- IF( ln_trdmxl_trc_instant ) THEN
- !
- DO jn = 1, jptra
- CALL iom_rstput( kt, nitrst, nummldw_trc, 'tmlbb_trc_' //ctrcnm(jn), tmlbb_trc (:,:,jn) )
- CALL iom_rstput( kt, nitrst, nummldw_trc, 'tmlbn_trc_' //ctrcnm(jn), tmlbn_trc (:,:,jn) )
- CALL iom_rstput( kt, nitrst, nummldw_trc, 'tmlatfb_trc_'//ctrcnm(jn), tmlatfb_trc(:,:,jn) )
- CALL iom_rstput( kt, nitrst, nummldw_trc, 'tmlradb_trc_'//ctrcnm(jn), tmlradb_trc(:,:,jn) )
- END DO
- !
- ELSE
- !
- CALL iom_rstput( kt, nitrst, nummldw_trc, 'rmldbn_trc', rmldbn_trc ) ! 2D x 1
-
- ! ! ===========
- DO jn = 1, jptra ! tracer loop
- ! ! ===========
- CALL iom_rstput( kt, nitrst, nummldw_trc, 'tmlatfb_trc_' //ctrcnm(jn), tmlatfb_trc (:,:,jn) ) ! 2D x jptra
- CALL iom_rstput( kt, nitrst, nummldw_trc, 'tmlbb_trc_' //ctrcnm(jn), tmlbb_trc (:,:,jn) ) ! 2D x jptra
- CALL iom_rstput( kt, nitrst, nummldw_trc, 'tmlradb_trc_' //ctrcnm(jn), tmlradb_trc (:,:,jn) ) ! 2D x jptra
- CALL iom_rstput( kt, nitrst, nummldw_trc, 'tmlbn_trc_' //ctrcnm(jn), tmlbn_trc (:,:,jn) ) ! 2D x jptra
- CALL iom_rstput( kt, nitrst, nummldw_trc, 'tml_sumb_trc_'//ctrcnm(jn), tml_sumb_trc(:,:,jn) ) ! 2D x jptra
-
- DO jk = 1, jpltrd_trc
- IF( jk < 10 ) THEN
- WRITE(charout,FMT="('tmltrd_csum_ub_trc_', A3, '_', I1)") ctrcnm(jn), jk
- ELSE
- WRITE(charout,FMT="('tmltrd_csum_ub_trc_', A3, '_', I2)") ctrcnm(jn), jk
- ENDIF
- CALL iom_rstput( kt, nitrst, nummldw_trc, charout, tmltrd_csum_ub_trc(:,:,jk,jn) )
- END DO
-
- CALL iom_rstput( kt, nitrst, nummldw_trc, 'tmltrd_atf_sumb_trc_'//ctrcnm(jn) , &
- & tmltrd_atf_sumb_trc(:,:,jn) ) ! 2D x jptra
- CALL iom_rstput( kt, nitrst, nummldw_trc, 'tmltrd_rad_sumb_trc_'//ctrcnm(jn) , &
- & tmltrd_rad_sumb_trc(:,:,jn) ) ! 2D x jptra
- ! ! ===========
- END DO ! tracer loop
- ! ! ===========
- #if defined key_pisces_reduced
- DO jl = 1, jp_pisces_trd
- CALL iom_rstput( kt, nitrst, nummldw_trc, 'tmltrd_csum_ub_bio'//ctrd_bio(jl,2), tmltrd_csum_ub_bio(:,:,jl) )
- ENDDO
- #endif
- ENDIF
-
- CALL iom_close( nummldw_trc )
- lrst_trc = .TRUE.
- ENDIF
- END SUBROUTINE trd_mxl_trc_rst_write
- SUBROUTINE trd_mxl_trc_rst_read
- !!----------------------------------------------------------------------------
- !! *** SUBROUTINE trd_mxl_rst_lec ***
- !!
- !! ** Purpose : Read file for mixed-layer diagnostics restart.
- !!----------------------------------------------------------------------------
- INTEGER :: inum ! temporary logical unit
- !
- CHARACTER (len=35) :: charout
- INTEGER :: jk, jn, jl ! loop indice
- INTEGER :: jlibalt = jprstlib
- LOGICAL :: llok
- CHARACTER(LEN=256) :: clpath ! full path to restart file
- !!-----------------------------------------------------------------------------
-
- IF(lwp) THEN
- WRITE(numout,*)
- WRITE(numout,*) ' trd_mxl_trc_rst_read : read the NetCDF MLD restart file'
- WRITE(numout,*) ' ~~~~~~~~~~~~~~~~~~~~'
- ENDIF
-
- clpath = TRIM(cn_trcrst_indir)
- IF( clpath(LEN_TRIM(clpath):) /= '/' ) clpath = TRIM(clpath) // '/'
- IF ( jprstlib == jprstdimg ) THEN
- ! eventually read netcdf file (monobloc) for restarting on different number of processors
- ! if {cn_trdrst_trc_in}.nc exists, then set jlibalt to jpnf90
- INQUIRE( FILE = TRIM(clpath)//TRIM(cn_trdrst_trc_in)//'.nc', EXIST = llok )
- IF ( llok ) THEN ; jlibalt = jpnf90 ; ELSE ; jlibalt = jprstlib ; ENDIF
- ENDIF
- CALL iom_open( TRIM(clpath)//TRIM(cn_trdrst_trc_in), inum, kiolib = jlibalt )
-
- IF( ln_trdmxl_trc_instant ) THEN
-
- DO jn = 1, jptra
- CALL iom_get( inum, jpdom_autoglo, 'tmlbb_trc_' //ctrcnm(jn), tmlbb_trc (:,:,jn) )
- CALL iom_get( inum, jpdom_autoglo, 'tmlbn_trc_' //ctrcnm(jn), tmlbn_trc (:,:,jn) )
- CALL iom_get( inum, jpdom_autoglo, 'tmlatfb_trc_'//ctrcnm(jn), tmlatfb_trc(:,:,jn) )
- CALL iom_get( inum, jpdom_autoglo, 'tmlradb_trc_'//ctrcnm(jn), tmlradb_trc(:,:,jn) )
- END DO
-
- ELSE
- CALL iom_get( inum, jpdom_autoglo, 'rmldbn_trc', rmldbn_trc ) ! needed for rmld_sum
-
- ! ! ===========
- DO jn = 1, jptra ! tracer loop
- ! ! ===========
- CALL iom_get( inum, jpdom_autoglo, 'tmlatfb_trc_' //ctrcnm(jn), tmlatfb_trc(:,:,jn) )
- CALL iom_get( inum, jpdom_autoglo, 'tmlbb_trc_' //ctrcnm(jn), tmlbb_trc (:,:,jn) )
- CALL iom_get( inum, jpdom_autoglo, 'tmlradb_trc_' //ctrcnm(jn), tmlradb_trc(:,:,jn) )
- CALL iom_get( inum, jpdom_autoglo, 'tmlbn_trc_' //ctrcnm(jn), tmlbn_trc (:,:,jn) ) ! needed for tml_sum
- CALL iom_get( inum, jpdom_autoglo, 'tml_sumb_trc_'//ctrcnm(jn), tml_sumb_trc(:,:,jn) )
-
- DO jk = 1, jpltrd_trc
- IF( jk < 10 ) THEN
- WRITE(charout,FMT="('tmltrd_csum_ub_trc_', A3, '_', I1)") ctrcnm(jn), jk
- ELSE
- WRITE(charout,FMT="('tmltrd_csum_ub_trc_', A3, '_', I2)") ctrcnm(jn), jk
- ENDIF
- CALL iom_get( inum, jpdom_autoglo, charout, tmltrd_csum_ub_trc(:,:,jk,jn) )
- END DO
-
- CALL iom_get( inum, jpdom_autoglo, 'tmltrd_atf_sumb_trc_'//ctrcnm(jn) , &
- & tmltrd_atf_sumb_trc(:,:,jn) )
- CALL iom_get( inum, jpdom_autoglo, 'tmltrd_rad_sumb_trc_'//ctrcnm(jn) , &
- & tmltrd_rad_sumb_trc(:,:,jn) )
- ! ! ===========
- END DO ! tracer loop
- ! ! ===========
- #if defined key_pisces_reduced
- DO jl = 1, jp_pisces_trd
- CALL iom_get( inum, jpdom_autoglo, 'tmltrd_csum_ub_bio'//ctrd_bio(jl,2), tmltrd_csum_ub_bio(:,:,jl) )
- ENDDO
- #endif
-
- CALL iom_close( inum )
- ENDIF
-
- END SUBROUTINE trd_mxl_trc_rst_read
-
- #else
- !!=================================================================================
- !! *** MODULE trdmxl_rst ***
- !! Ocean dynamic : Input/Output files for restart on mixed-layer diagnostics
- !!=================================================================================
- CONTAINS
- SUBROUTINE trd_mxl_trc_rst_opn( kt )
- WRITE(*,*) 'trd_mxl_trc_rst_opn: You should not have seen this print! error?', kt
- END SUBROUTINE trd_mxl_trc_rst_opn
- SUBROUTINE trd_mxl_trc_rst_write( kt ) ! No ML diags ==> empty routine
- WRITE(*,*) 'trd_mxl_trc_rst_wri: You should not have seen this print! error?', kt
- END SUBROUTINE trd_mxl_trc_rst_write
- SUBROUTINE trd_mxl_trc_rst_read ! No ML Diags ==> empty routine
- END SUBROUTINE trd_mxl_trc_rst_read
- #endif
- !!=================================================================================
- END MODULE trdmxl_trc_rst
|