diff --git a/src/LIB/SURCOUCHE/src/mode_io.f90 b/src/LIB/SURCOUCHE/src/mode_io.f90 index b8da82a4da9a0579696d845aa61984fdf03bfb6e..72180c0122ba2e7c6f55df8655f5cf331c552f27 100644 --- a/src/LIB/SURCOUCHE/src/mode_io.f90 +++ b/src/LIB/SURCOUCHE/src/mode_io.f90 @@ -22,6 +22,7 @@ ! P. Wautelet 04/02/2016: bug with DELIM='NONE' and GCC 5.2/5.3 ! D.Gazen : avril 2016 change error message ! P. Wautelet : may 2016: use NetCDF Fortran module +! P. Wautelet : July 2016: added type OUTBAK ! MODULE MODE_IO_ll @@ -59,6 +60,13 @@ MODULE MODE_IO_ll PUBLIC io_file,io_rank !JUANZ + !Structure describing the characteristics of an output or a backup + TYPE TOUTBAK + INTEGER :: NSTEP !Timestep number + REAL :: XTIME !Time from start of the segment (in seconds and rounded to a timestep) + END TYPE TOUTBAK + PUBLIC TOUTBAK + CONTAINS FUNCTION IONEWFLU() diff --git a/src/MNH/default_desfmn.f90 b/src/MNH/default_desfmn.f90 index 2bdc04b316d42806098e466c0a8c08bdff41f60f..0127a33f967056f3c327cd3fe738ac612ccb1c71 100644 --- a/src/MNH/default_desfmn.f90 +++ b/src/MNH/default_desfmn.f90 @@ -492,7 +492,8 @@ XTNUDGING = 21600. !* 9. SET DEFAULT VALUES FOR MODD_FMOUT and MODD_OUT_n : ! ------------------------------------------------ ! -IF (KMI == 1) XBAK_TIME (:,:) = XNEGUNDEF +!XBAK_TIME is not yet allocated +!IF (KMI == 1) XBAK_TIME (:,:) = XNEGUNDEF ! ! !------------------------------------------------------------------------------- diff --git a/src/MNH/ini_modeln.f90 b/src/MNH/ini_modeln.f90 index 5f3deb5f66bdf70626546ec4c466f29ef649dcbd..141b5449a4c321dc6f1652509af1a5b3f76a5ee8 100644 --- a/src/MNH/ini_modeln.f90 +++ b/src/MNH/ini_modeln.f90 @@ -1531,7 +1531,7 @@ CALL SET_GRID(KMI,HINIFILE,HLUOUT,IIU,IJU,IKU,NIMAX_ll,NJMAX_ll, & XXHAT,XYHAT,XDXHAT,XDYHAT, XMAP, & XZS,XZZ,XZHAT,LSLEVE,XLEN1,XLEN2,XZSMT, & ZJ, & - TDTMOD,TDTCUR,NSTOP,NOUT_TIMES,NOUT_NUMB) + TDTMOD,TDTCUR,NSTOP,NOUT_NUMB,TOUTBAKN) ! CALL METRICS(XMAP,XDXHAT,XDYHAT,XZZ,XDXX,XDYY,XDZX,XDZY,XDZZ) ! diff --git a/src/MNH/ini_spectren.f90 b/src/MNH/ini_spectren.f90 index 15bc6f897429e13f083d68ae310371ab83d10562..9777966f990819a7fc81675221e606dc300fd6ae 100644 --- a/src/MNH/ini_spectren.f90 +++ b/src/MNH/ini_spectren.f90 @@ -740,7 +740,7 @@ CALL SET_GRID(KMI,HINIFILE,HLUOUT,IIU,IJU,IKU,NIMAX_ll,NJMAX_ll, & XXHAT,XYHAT,XDXHAT,XDYHAT, XMAP, & XZS,XZZ,XZHAT,LSLEVE,XLEN1,XLEN2,XZSMT, & ZJ, & - TDTMOD,TDTCUR,NSTOP,NOUT_TIMES,NOUT_NUMB) + TDTMOD,TDTCUR,NSTOP,NOUT_NUMB,TOUTBAKN) ! CALL METRICS(XMAP,XDXHAT,XDYHAT,XZZ,XDXX,XDYY,XDZX,XDZY,XDZZ) ! diff --git a/src/MNH/modd_fmout.f90 b/src/MNH/modd_fmout.f90 index 03d0a6f3251b0e20ec897244e409dac07516a8d2..ee2782a1b44c1f3990dac4890c88a8a38b020b48 100644 --- a/src/MNH/modd_fmout.f90 +++ b/src/MNH/modd_fmout.f90 @@ -47,7 +47,7 @@ USE MODD_PARAMETERS ! IMPLICIT NONE ! -REAL,SAVE, DIMENSION(JPMODELMAX,JPOUTMAX) :: XBAK_TIME = XNEGUNDEF +REAL,SAVE,ALLOCATABLE,DIMENSION(:,:) :: XBAK_TIME ! XBAK_TIME(m,i) array of ! the increments in seconds from the beginning of the segment to the ! instant where the i-th fields output on FM-files is realized by model "m" diff --git a/src/MNH/modd_outn.f90 b/src/MNH/modd_outn.f90 index e24a9848001f29287245e7d0e33950af727b2156..30e11345de2943e8fe0cee9e477df4d4ad1f60b7 100644 --- a/src/MNH/modd_outn.f90 +++ b/src/MNH/modd_outn.f90 @@ -43,43 +43,30 @@ ! ! USE MODD_PARAMETERS, ONLY: JPMODELMAX, JPOUTMAX +USE MODE_IO_ll, ONLY:TOUTBAK IMPLICIT NONE TYPE OUT_t ! -!JUAN - INTEGER, DIMENSION(:), POINTER :: NOUT_TIMES => NULL() ! list of the values of the temporal -!JUAN - ! index in the temporal model loop where fields outputs on - ! FM-files are realized by model n INTEGER :: NOUT_NUMB ! number of outputs perform by model n + TYPE(TOUTBAK),DIMENSION(:),POINTER :: TOUTBAKN=>NULL() ! List of the outputs and backups ! ! END TYPE OUT_t TYPE(OUT_t), DIMENSION(JPMODELMAX), TARGET, SAVE :: OUT_MODEL -LOGICAL , DIMENSION(JPMODELMAX), SAVE :: OUT_FIRST_CALL = .TRUE. -INTEGER, DIMENSION(:), POINTER :: NOUT_TIMES=>NULL() INTEGER, POINTER :: NOUT_NUMB=>NULL() +TYPE(TOUTBAK),DIMENSION(:),POINTER :: TOUTBAKN=>NULL() CONTAINS SUBROUTINE OUT_GOTO_MODEL(KFROM, KTO) INTEGER, INTENT(IN) :: KFROM, KTO ! -!JUAN -IF (OUT_FIRST_CALL(KTO)) THEN -ALLOCATE (OUT_MODEL(KTO)%NOUT_TIMES(JPOUTMAX)) -OUT_FIRST_CALL(KTO) = .FALSE. -ENDIF -!JUAN - -! Save current state for allocated arrays -! ! Current model is set to model KTO -NOUT_TIMES=>OUT_MODEL(KTO)%NOUT_TIMES NOUT_NUMB=>OUT_MODEL(KTO)%NOUT_NUMB +TOUTBAKN=>OUT_MODEL(KTO)%TOUTBAKN END SUBROUTINE OUT_GOTO_MODEL diff --git a/src/MNH/modeln.f90 b/src/MNH/modeln.f90 index 73b44d1748d3a741f34d50f3976ae8d557a433d8..321857cafb13c77b9c3f74ba7fea573c7f635774 100644 --- a/src/MNH/modeln.f90 +++ b/src/MNH/modeln.f90 @@ -430,7 +430,6 @@ INTEGER :: INPRAR ! number of articles predicted in INTEGER :: ININAR ! number of articles present in ! the LFIFM file INTEGER :: ITYPE ! type of file (cpio or not) -INTEGER :: JOUT ! loop index on the output instant list INTEGER :: IOUTDAD ! numero of the OUTPUT FM-file of DAD model INTEGER :: JOUTDAD ! loop index on the output instant list for DAD model LOGICAL :: GSTEADY_DMASS ! conditional call to mass computation @@ -907,8 +906,7 @@ IF (CSURF=='EXTE') CALL GOTO_SURFEX(IMI) ZTIME1 = ZTIME2 ! YFMFILE=' ' -DO JOUT = 1,NOUT_NUMB - IF (KTCOUNT == NOUT_TIMES(JOUT)) THEN +IF (KTCOUNT == TOUTBAKN(IOUT+1)%NSTEP) THEN IOUT=IOUT+1 GCLOSE_OUT=.TRUE. INPRAR = 22 +2*(4+NRR+NSV) @@ -924,7 +922,7 @@ DO JOUT = 1,NOUT_NUMB !PW: TODO/TOCHECK: est-ce que cela fait la meme chose qu'avant? DO JOUTDAD =1,JPOUTMAX IF ( XBAK_TIME(NDAD(IMI),JOUTDAD) >=0. .AND. & - XBAK_TIME(NDAD(IMI),JOUTDAD) <= (XBAK_TIME(IMI,JOUT)+1.E-10) ) & + XBAK_TIME(NDAD(IMI),JOUTDAD) <= (TOUTBAKN(IOUT)%XTIME+1.E-10) ) & IOUTDAD=IOUTDAD+1 END DO IF(IOUTDAD>0) THEN @@ -963,8 +961,6 @@ DO JOUT = 1,NOUT_NUMB ! END IF ! -END DO -! CALL SECOND_MNH2(ZTIME2) ! XT_STORE = XT_STORE + ZTIME2 - ZTIME1 @@ -1313,8 +1309,8 @@ IF (CDCONV/='NONE') THEN END IF END IF ! -DO JOUT = 1,NOUT_NUMB - IF (KTCOUNT == NOUT_TIMES(JOUT)) THEN +IF (IOUT>0) THEN + IF (KTCOUNT == TOUTBAKN(IOUT)%NSTEP) THEN IF (CSURF=='EXTE') THEN CALL GOTO_SURFEX(IMI) CALL DIAG_SURF_ATM_n(YSURF_CUR%IM%DGEI, YSURF_CUR%FM%DGF, YSURF_CUR%DGL, YSURF_CUR%IM%DGI, & @@ -1323,7 +1319,7 @@ DO JOUT = 1,NOUT_NUMB CALL WRITE_DIAG_SURF_ATM_n(YSURF_CUR,'MESONH','ALL') END IF END IF -END DO +END IF ! CALL SECOND_MNH2(ZTIME2) ! diff --git a/src/MNH/read_desfmn.f90 b/src/MNH/read_desfmn.f90 index 11ec3ca57c4db4dc98409bf35d7892550313d2dd..365f91c3d213b4c580557150a6441acb90ae37ac 100644 --- a/src/MNH/read_desfmn.f90 +++ b/src/MNH/read_desfmn.f90 @@ -423,10 +423,11 @@ IF (KMI == 1) THEN CALL POSNAM(ILUDES,'NAM_NESTING',GFOUND) IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_NESTING) CALL POSNAM(ILUDES,'NAM_FMOUT',GFOUND) - IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_FMOUT) -! - XBAK_TIME(:,:) = XNEGUNDEF -! + IF (GFOUND) THEN + IF (.NOT.ALLOCATED(XBAK_TIME)) ALLOCATE(XBAK_TIME(JPMODELMAX,JPOUTMAX)) + READ(UNIT=ILUDES,NML=NAM_FMOUT) + XBAK_TIME(:,:) = XNEGUNDEF + END IF CALL POSNAM(ILUDES,'NAM_BUDGET',GFOUND) IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BUDGET) CALL POSNAM(ILUDES,'NAM_BU_RU',GFOUND) diff --git a/src/MNH/read_exsegn.f90 b/src/MNH/read_exsegn.f90 index 105e3fc1dcabff3d55f7405849e0b7be8d6e1f59..85e131813fa2c7f770a798cb1208f7a459c196b1 100644 --- a/src/MNH/read_exsegn.f90 +++ b/src/MNH/read_exsegn.f90 @@ -494,7 +494,12 @@ IF (KMI == 1) THEN CALL POSNAM(ILUSEG,'NAM_NESTING',GFOUND,ILUOUT) IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_NESTING) CALL POSNAM(ILUSEG,'NAM_FMOUT',GFOUND,ILUOUT) - IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_FMOUT) + IF (GFOUND) THEN + !Should have been allocated before in READ_DESFM_n + IF (.NOT.ALLOCATED(XBAK_TIME)) ALLOCATE(XBAK_TIME(JPMODELMAX,JPOUTMAX)) + XBAK_TIME(:,:) = XNEGUNDEF + READ(UNIT=ILUSEG,NML=NAM_FMOUT) + END IF CALL POSNAM(ILUSEG,'NAM_BUDGET',GFOUND,ILUOUT) IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_BUDGET) CALL POSNAM(ILUSEG,'NAM_BU_RU',GFOUND,ILUOUT) diff --git a/src/MNH/set_grid.f90 b/src/MNH/set_grid.f90 index 95aeaf726f534dfc5ac9dc09592d89b0627bd6fa..4fdf711d02b26f4dc0ef424b3885cc9b71842a64 100644 --- a/src/MNH/set_grid.f90 +++ b/src/MNH/set_grid.f90 @@ -25,9 +25,10 @@ INTERFACE PXHAT,PYHAT,PDXHAT,PDYHAT, PMAP, & PZS,PZZ,PZHAT,OSLEVE,PLEN1,PLEN2,PZSMT, & PJ, & - TPDTMOD,TPDTCUR,KSTOP,KOUT_TIMES,KOUT_NUMB ) + TPDTMOD,TPDTCUR,KSTOP,KOUT_NUMB,TPOUTBAKN ) ! USE MODD_TYPE_DATE +USE MODE_IO_ll, ONLY:TOUTBAK ! INTEGER, INTENT(IN) :: KMI ! Model index CHARACTER (LEN=*), INTENT(IN) :: HINIFILE ! Name of the initial file @@ -85,12 +86,10 @@ TYPE (DATE_TIME), INTENT(OUT) :: TPDTMOD ! date and time of the model TYPE (DATE_TIME), INTENT(OUT) :: TPDTCUR ! Current date and time INTEGER, INTENT(OUT) :: KSTOP ! number of time steps for ! current segment -INTEGER, DIMENSION(:), INTENT(OUT) :: KOUT_TIMES ! list of the values - ! of the temporal index in the temporal model loop where fields - ! outputs on FM-files are realized INTEGER, INTENT(OUT) :: KOUT_NUMB ! number of outputs ! REAL, DIMENSION(:,:,:), INTENT(OUT) :: PJ ! Jacobian +TYPE(TOUTBAK),DIMENSION(:),POINTER,INTENT(OUT) :: TPOUTBAKN ! List of outputs and backups ! END SUBROUTINE SET_GRID ! @@ -114,7 +113,7 @@ END MODULE MODI_SET_GRID PXHAT,PYHAT,PDXHAT,PDYHAT, PMAP, & PZS,PZZ,PZHAT,OSLEVE,PLEN1,PLEN2,PZSMT, & PJ, & - TPDTMOD,TPDTCUR,KSTOP,KOUT_TIMES,KOUT_NUMB ) + TPDTMOD,TPDTCUR,KSTOP,KOUT_NUMB,TPOUTBAKN ) ! ######################################################################### ! !!**** *SET_GRID* - routine to set grid variables @@ -252,7 +251,7 @@ USE MODE_ll USE MODI_GATHER_ll !!!! a mettre dans mode_ll ! USE MODE_FMREAD -USE MODD_VAR_ll, ONLY : NPROC +USE MODD_VAR_ll, ONLY : IP,NPROC ! IMPLICIT NONE ! @@ -314,12 +313,10 @@ TYPE (DATE_TIME), INTENT(OUT) :: TPDTMOD ! date and time of the model TYPE (DATE_TIME), INTENT(OUT) :: TPDTCUR ! Current date and time INTEGER, INTENT(OUT) :: KSTOP ! number of time steps for ! current segment -INTEGER, DIMENSION(:), INTENT(OUT) :: KOUT_TIMES ! list of the values - ! of the temporal index in the temporal model loop where fields - ! outputs on FM-files are realized INTEGER, INTENT(OUT) :: KOUT_NUMB ! number of outputs ! REAL, DIMENSION(:,:,:), INTENT(OUT) :: PJ ! Jacobian +TYPE(TOUTBAK),DIMENSION(:),POINTER,INTENT(OUT) :: TPOUTBAKN ! List of outputs and backups ! !* 0.2 declarations of local variables ! @@ -507,8 +504,6 @@ IF (CPROGRAM /= 'DIAG ') TDTSEG = TPDTCUR ISUP = 1 ! 1 corresponds to a last timestep ! to obtain the prognostic and diagnostic fields all along this timestep ! -KOUT_TIMES(:) = NUNDEF -! IF ( KMI == 1) PSEGLEN = PSEGLEN + PTSTEP*ISUP ! needed for the gridnesting case to get ! the same PSEGLEN for all nested models KSTOP = NINT(PSEGLEN/PTSTEP) @@ -575,19 +570,28 @@ KOUT_NUMB = 0 DO JOUT = 1,JPOUTMAX IF (XBAK_TIME(KMI,JOUT) >= 0.) THEN KOUT_NUMB = KOUT_NUMB + 1 - KOUT_TIMES(KOUT_NUMB) = NINT(XBAK_TIME(KMI,JOUT)/PTSTEP) + 1 + END IF +END DO +ALLOCATE(TPOUTBAKN(KOUT_NUMB)) +IPOS = 0 +DO JOUT = 1,JPOUTMAX + IF (XBAK_TIME(KMI,JOUT) >= 0.) THEN + IPOS = IPOS + 1 + TPOUTBAKN(IPOS)%NSTEP = NINT(XBAK_TIME(KMI,JOUT)/PTSTEP) + 1 + TPOUTBAKN(IPOS)%XTIME = XBAK_TIME(KMI,JOUT) END IF END DO ! +IF (IP==1) THEN PRINT *,'-------------------------' PRINT *,'Model number: ',KMI PRINT *,'Number of backups: ',KOUT_NUMB PRINT *,'Timestep Time' DO JOUT = 1,KOUT_NUMB - WRITE(*,'( I9 F12.3 )' ) KOUT_TIMES(JOUT),XBAK_TIME(KMI,JOUT) + WRITE(*,'( I9 F12.3 )' ) TPOUTBAKN(JOUT)%NSTEP,TPOUTBAKN(JOUT)%XTIME END DO PRINT *,'-------------------------' - +END IF ! !------------------------------------------------------------------------------- !