From d0bb67c3fe7391be6c07e11ad74d4f72dfa32485 Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Tue, 8 Nov 2016 17:18:04 +0100 Subject: [PATCH] Philippe 08/11/2016: add and treat all OUTPUT namelist variables + separate outputs and backups lists --- src/LIB/SURCOUCHE/src/modd_io.f90 | 9 +- .../SURCOUCHE/src/mode_io_manage_struct.f90 | 493 ++++++++++++------ src/MNH/ini_modeln.f90 | 2 +- src/MNH/ini_spectren.f90 | 2 +- src/MNH/modd_fmout.f90 | 33 +- src/MNH/modd_outn.f90 | 13 +- src/MNH/modd_sub_modeln.f90 | 4 +- src/MNH/modeln.f90 | 18 +- src/MNH/modn_fmout.f90 | 11 +- src/MNH/read_desfmn.f90 | 5 + src/MNH/read_exsegn.f90 | 5 + src/MNH/set_grid.f90 | 18 +- 12 files changed, 397 insertions(+), 216 deletions(-) diff --git a/src/LIB/SURCOUCHE/src/modd_io.f90 b/src/LIB/SURCOUCHE/src/modd_io.f90 index 41dd6cc85..4fd3dbfd7 100644 --- a/src/LIB/SURCOUCHE/src/modd_io.f90 +++ b/src/LIB/SURCOUCHE/src/modd_io.f90 @@ -38,8 +38,7 @@ END TYPE LFIPARAM !Structure describing the characteristics of an output or a backup TYPE TOUTBAK - INTEGER :: NBAKID = -1 !Backup number - INTEGER :: NOUTID = -1 !Output number + INTEGER :: NID = -1 !Backup number INTEGER :: NSTEP !Timestep number REAL :: XTIME !Time from start of the segment (in seconds and rounded to a timestep) INTEGER :: NOUTDAD = -1 !Index of the corresponding dad file (file with same time) @@ -66,7 +65,9 @@ TYPE TFILEDATA TYPE(TFILEDATA),POINTER :: TFILE_NEXT => NULL() END TYPE TFILEDATA -TYPE(TFILEDATA),POINTER,SAVE :: TFILE_FIRST => NULL() -TYPE(TFILEDATA),POINTER,SAVE :: TFILE_LAST => NULL() +TYPE(TFILEDATA),POINTER,SAVE :: TFILE_BAK_FIRST => NULL() +TYPE(TFILEDATA),POINTER,SAVE :: TFILE_OUT_FIRST => NULL() +TYPE(TFILEDATA),POINTER,SAVE :: TFILE_BAK_LAST => NULL() +TYPE(TFILEDATA),POINTER,SAVE :: TFILE_OUT_LAST => NULL() END MODULE MODD_IO_ll diff --git a/src/LIB/SURCOUCHE/src/mode_io_manage_struct.f90 b/src/LIB/SURCOUCHE/src/mode_io_manage_struct.f90 index 8194e711a..5c6fe1f83 100644 --- a/src/LIB/SURCOUCHE/src/mode_io_manage_struct.f90 +++ b/src/LIB/SURCOUCHE/src/mode_io_manage_struct.f90 @@ -38,131 +38,74 @@ REAL, INTENT(IN) :: PTSTEP ! time step of model KMI REAL, INTENT(IN) :: PSEGLEN ! segment duration (in seconds) ! INTEGER :: IMI ! Model number for loop -INTEGER :: IBAK_NUMB ! Number of outputs +INTEGER :: IBAK_NUMB, IOUT_NUMB ! Number of backups/outputs INTEGER :: ISTEP_MAX ! Number of timesteps -INTEGER :: ITEMP ! Intermediate variable INTEGER :: IPOS ! Index -INTEGER :: JKLOOP,JOUT,IDX ! Loop indices -INTEGER, DIMENSION(:), ALLOCATABLE :: IBAK_STEP ! Array to store list of backup steps (intermediate array) -CHARACTER (LEN=4) :: YNUMBER ! Character string for the file number +INTEGER :: JOUT,IDX ! Loop indices +INTEGER, DIMENSION(:), ALLOCATABLE :: IBAK_STEP, IOUT_STEP +! Arrays to store list of backup/output steps (intermediate array) CHARACTER (LEN=4) :: YDADNUMBER ! Character string for the DAD model file number -REAL :: ZOUT, ZOUTMAX ! Time of output/backup ! ! DO IMI = 1, NMODEL IBAK_NUMB = 0 + IOUT_NUMB = 0 ISTEP_MAX = NINT(XSEGLEN/DYN_MODEL(IMI)%XTSTEP)+1 IF (IMI == 1) ISTEP_MAX = ISTEP_MAX - KSUP ! - !* Insert regular backups into XBAK_TIME array - ! - IF (XBAK_TIME_FREQ(IMI)>0.) THEN - IDX = 1 - ZOUT = XBAK_TIME_FREQ_FIRST(IMI) - ZOUTMAX = PSEGLEN - PTSTEP*KSUP - DO WHILE ( ZOUT <= ZOUTMAX ) - !Find first non 'allocated' element - DO WHILE ( XBAK_TIME(IMI,IDX) >= 0. ) - IDX = IDX + 1 - IF (IDX > JPOUTMAX) THEN - PRINT *,'Error in SET_GRID when treating output list (JPOUTMAX too small)' - CALL ABORT - STOP - END IF - END DO - XBAK_TIME(IMI,IDX) = ZOUT - ZOUT = ZOUT + XBAK_TIME_FREQ(IMI) - END DO - END IF + !* Insert regular backups/outputs into XBAK_TIME/XOUT_TIME arrays ! - !* Synchronization between nested models through XBAK_TIME arrays (MODD_FMOUT) + IF (XBAK_TIME_FREQ(IMI)>0.) CALL IO_INSERT_REGULAR_FLOAT(XBAK_TIME_FREQ_FIRST(IMI),XBAK_TIME_FREQ(IMI),XBAK_TIME(IMI,:)) + IF (XOUT_TIME_FREQ(IMI)>0.) CALL IO_INSERT_REGULAR_FLOAT(XOUT_TIME_FREQ_FIRST(IMI),XOUT_TIME_FREQ(IMI),XOUT_TIME(IMI,:)) ! - DO JOUT = 1,JPOUTMAX - IF (XBAK_TIME(IMI,JOUT) >= 0.) THEN - IBAK_NUMB = IBAK_NUMB + 1 - !Value is rounded to nearest timestep - XBAK_TIME(IMI,JOUT) = NINT(XBAK_TIME(IMI,JOUT)/DYN_MODEL(IMI)%XTSTEP) * DYN_MODEL(IMI)%XTSTEP - !Output/backup time is propagated to nested models (with higher numbers) - !PW: TODO: BUG?: what happens if 2 dissociated models? Use NSON(:) array? - DO JKLOOP = IMI+1,NMODEL - IDX = 1 - !Find first non 'allocated' element - DO WHILE ( XBAK_TIME(JKLOOP,IDX) >= 0. ) - IDX = IDX + 1 - IF (IDX > JPOUTMAX) THEN - PRINT *,'Error in SET_GRID when treating output list (JPOUTMAX too small)' - CALL ABORT - STOP - END IF - END DO - XBAK_TIME(JKLOOP,IDX) = XBAK_TIME(IMI,JOUT) - END DO - END IF - END DO + !* Synchronization between nested models through XBAK_TIME/XOUT_TIME arrays ! - !* Insert regular backups into NBAK_STEP array + CALL IO_SYNC_MODELS_FLOAT(IBAK_NUMB,XBAK_TIME) + CALL IO_SYNC_MODELS_FLOAT(IOUT_NUMB,XOUT_TIME) ! - IF (NBAK_STEP_FREQ(IMI)>0) THEN - IDX = 1 - DO JOUT = NBAK_STEP_FREQ_FIRST(IMI), ISTEP_MAX, NBAK_STEP_FREQ(IMI) - !Find first non 'allocated' element - DO WHILE ( NBAK_STEP(IMI,IDX) >= 0 ) - IDX = IDX + 1 - IF (IDX > JPOUTMAX) THEN - PRINT *,'Error in SET_GRID when treating output list (JPOUTMAX too small)' - CALL ABORT - STOP - END IF - END DO - NBAK_STEP(IMI,IDX) = JOUT - END DO - END IF + !* Insert regular backups/outputs into NBAK_STEP/NOUT_STEP arrays ! - !* Synchronization between nested models through NBAK_STEP arrays (MODD_FMOUT) + IF (NBAK_STEP_FREQ(IMI)>0) CALL IO_INSERT_REGULAR_INT(NBAK_STEP_FREQ_FIRST(IMI),NBAK_STEP_FREQ(IMI),NBAK_STEP(IMI,:)) + IF (NOUT_STEP_FREQ(IMI)>0) CALL IO_INSERT_REGULAR_INT(NOUT_STEP_FREQ_FIRST(IMI),NOUT_STEP_FREQ(IMI),NOUT_STEP(IMI,:)) ! - DO JOUT = 1,JPOUTMAX - IF (NBAK_STEP(IMI,JOUT) > 0) THEN - IBAK_NUMB = IBAK_NUMB + 1 - !Output/backup time is propagated to nested models (with higher numbers) - !PW: TODO: BUG?: what happens if 2 dissociated models? Use NSON(:) array? - DO JKLOOP = IMI+1,NMODEL - IDX = 1 - !Find first non 'allocated' element - DO WHILE ( NBAK_STEP(JKLOOP,IDX) >= 0 ) - IDX = IDX + 1 - END DO - IF (IDX > JPOUTMAX) THEN - PRINT *,'Error in SET_GRID when treating output list (JPOUTMAX too small)' - CALL ABORT - STOP - END IF - ! Use of NINT and real to prevent rounding errors - ! (STEP-1)* ... +1 because step numbers begin at 1 - NBAK_STEP(JKLOOP,IDX) = (NBAK_STEP(IMI,JOUT)-1) * NINT( DYN_MODEL(JKLOOP)%XTSTEP/DYN_MODEL(IMI)%XTSTEP ) + 1 - END DO - END IF - END DO + !* Synchronization between nested models through NBAK_STEP/NOUT_STEP arrays ! - !* Group all backups in a common form and add backups at beginning and end if requested + CALL IO_SYNC_MODELS_INT(IBAK_NUMB,NBAK_STEP) + CALL IO_SYNC_MODELS_INT(IOUT_NUMB,NOUT_STEP) + ! + !* Group all backups/outputs in a common form and add backups/outputs at beginning and end if requested ! IF (LBAK_BEG) IBAK_NUMB = IBAK_NUMB + 1 IF (LBAK_END) IBAK_NUMB = IBAK_NUMB + 1 + IF (LOUT_BEG) IOUT_NUMB = IOUT_NUMB + 1 + IF (LOUT_END) IOUT_NUMB = IOUT_NUMB + 1 ! ALLOCATE(IBAK_STEP(IBAK_NUMB)) IBAK_STEP(:) = NNEGUNDEF + ALLOCATE(IOUT_STEP(IOUT_NUMB)) + IOUT_STEP(:) = NNEGUNDEF ! IBAK_NUMB = 0 + IOUT_NUMB = 0 ! IF (LBAK_BEG) THEN IBAK_NUMB = IBAK_NUMB + 1 IBAK_STEP(IBAK_NUMB) = 1 ! 1 is the 1st step number END IF + IF (LOUT_BEG) THEN + IOUT_NUMB = IOUT_NUMB + 1 + IOUT_STEP(IOUT_NUMB) = 1 ! 1 is the 1st step number + END IF ! DO JOUT = 1,JPOUTMAX IF (XBAK_TIME(IMI,JOUT) >= 0.) THEN IBAK_NUMB = IBAK_NUMB + 1 IBAK_STEP(IBAK_NUMB) = NINT(XBAK_TIME(IMI,JOUT)/DYN_MODEL(IMI)%XTSTEP) + 1 END IF + IF (XOUT_TIME(IMI,JOUT) >= 0.) THEN + IOUT_NUMB = IOUT_NUMB + 1 + IOUT_STEP(IOUT_NUMB) = NINT(XOUT_TIME(IMI,JOUT)/DYN_MODEL(IMI)%XTSTEP) + 1 + END IF END DO ! DO JOUT = 1,JPOUTMAX @@ -170,43 +113,32 @@ DO IMI = 1, NMODEL IBAK_NUMB = IBAK_NUMB + 1 IBAK_STEP(IBAK_NUMB) = NBAK_STEP(IMI,JOUT) END IF + IF (NOUT_STEP(IMI,JOUT) > 0) THEN + IOUT_NUMB = IOUT_NUMB + 1 + IOUT_STEP(IOUT_NUMB) = NOUT_STEP(IMI,JOUT) + END IF END DO ! IF (LBAK_END) THEN IBAK_NUMB = IBAK_NUMB + 1 IBAK_STEP(IBAK_NUMB) = ISTEP_MAX END IF + IF (LOUT_END) THEN + IOUT_NUMB = IOUT_NUMB + 1 + IOUT_STEP(IOUT_NUMB) = ISTEP_MAX + END IF ! !* Find and remove duplicated entries ! - DO JOUT = 1,IBAK_NUMB - DO JKLOOP = JOUT+1,IBAK_NUMB - IF ( IBAK_STEP(JKLOOP) == IBAK_STEP(JOUT) .AND. IBAK_STEP(JKLOOP) > 0 ) THEN - print *,'WARNING: found duplicated backup step (removed extra one)' - IBAK_STEP(JKLOOP) = NNEGUNDEF - END IF - END DO - END DO + CALL FIND_REMOVE_DUPLICATES(IBAK_NUMB,IBAK_STEP) + CALL FIND_REMOVE_DUPLICATES(IOUT_NUMB,IOUT_STEP) ! !* Sort entries ! - DO JOUT = 1,IBAK_NUMB - ITEMP = IBAK_STEP(JOUT) - IF (ITEMP<=0) ITEMP = HUGE(ITEMP) - IPOS = -1 - DO JKLOOP = JOUT+1,IBAK_NUMB - IF ( IBAK_STEP(JKLOOP) < ITEMP .AND. IBAK_STEP(JKLOOP) >= 0 ) THEN - ITEMP = IBAK_STEP(JKLOOP) - IPOS = JKLOOP - END IF - END DO - IF (IPOS >= JOUT) THEN - IBAK_STEP(IPOS) = IBAK_STEP(JOUT) - IBAK_STEP(JOUT) = ITEMP - END IF - END DO + CALL SORT_ENTRIES(IBAK_NUMB,IBAK_STEP) + CALL SORT_ENTRIES(IOUT_NUMB,IOUT_STEP) ! - !* Count the number of backups of model IMI + !* Count the number of backups/outputs of model IMI ! IBAK_NUMB = 0 DO JOUT = 1,SIZE(IBAK_STEP) @@ -214,55 +146,23 @@ DO IMI = 1, NMODEL IBAK_NUMB = IBAK_NUMB + 1 END IF END DO + IOUT_NUMB = 0 + DO JOUT = 1,SIZE(IOUT_STEP) + IF (IOUT_STEP(JOUT) >= 0) THEN + IOUT_NUMB = IOUT_NUMB + 1 + END IF + END DO ! - OUT_MODEL(IMI)%NOUT_NUMB = IBAK_NUMB - ALLOCATE(OUT_MODEL(IMI)%TOUTBAKN(IBAK_NUMB)) + OUT_MODEL(IMI)%NBAK_NUMB = IBAK_NUMB + OUT_MODEL(IMI)%NOUT_NUMB = IOUT_NUMB ! - !* Populate the backup data structures + !* Populate the backup/output data structures ! - IPOS = 0 - DO JOUT = 1,SIZE(IBAK_STEP) - IF (IBAK_STEP(JOUT) >= 0) THEN - IPOS = IPOS + 1 - OUT_MODEL(IMI)%TOUTBAKN(IPOS)%NBAKID = IPOS - OUT_MODEL(IMI)%TOUTBAKN(IPOS)%NOUTID = -1 - OUT_MODEL(IMI)%TOUTBAKN(IPOS)%NSTEP = IBAK_STEP(JOUT) - OUT_MODEL(IMI)%TOUTBAKN(IPOS)%XTIME = (IBAK_STEP(JOUT)-1)*DYN_MODEL(IMI)%XTSTEP - IF (IPOS>999) THEN - print *,'ERROR in SET_GRID: more than 999 backups' - STOP - END IF - IF (.NOT.ASSOCIATED(TFILE_FIRST)) THEN - ALLOCATE(TFILE_FIRST) - TFILE_LAST => TFILE_FIRST - ELSE - ALLOCATE(TFILE_LAST%TFILE_NEXT) - TFILE_LAST%TFILE_NEXT%TFILE_PREV => TFILE_LAST - TFILE_LAST => TFILE_LAST%TFILE_NEXT - ENDIF - OUT_MODEL(IMI)%TOUTBAKN(IPOS)%TFILE => TFILE_LAST - OUT_MODEL(IMI)%TOUTBAKN(IPOS)%TFILE%CTYPE="BACKUP" - OUT_MODEL(IMI)%TOUTBAKN(IPOS)%TFILE%CMODE="WRITE" - WRITE (YNUMBER,FMT="('.',I3.3)") IPOS - OUT_MODEL(IMI)%TOUTBAKN(IPOS)%TFILE%CNAME=ADJUSTL(ADJUSTR(IO_SURF_MNH_MODEL(IMI)%COUTFILE)//YNUMBER) - OUT_MODEL(IMI)%TOUTBAKN(IPOS)%TFILE%NLFITYPE=1 !1: to be transfered -!PW: TODO: set NLFIVERB only when useful (only if LFI file...) - OUT_MODEL(IMI)%TOUTBAKN(IPOS)%TFILE%NLFIVERB=NVERB - IF (LIOCDF4) THEN - OUT_MODEL(IMI)%TOUTBAKN(IPOS)%TFILE%CTYPE='NETCDF4' - IF (LLFIOUT) THEN - PRINT *,'Warning: LLFIOUT + LIOCDF4 = .TRUE. not yet implemented with new IO data structures' - OUT_MODEL(IMI)%TOUTBAKN(IPOS)%TFILE%NLFINPRAR= 22+2*(4+NRR+NSV) - END IF - ELSE IF (LLFIOUT) THEN - OUT_MODEL(IMI)%TOUTBAKN(IPOS)%TFILE%CTYPE='LFI' - OUT_MODEL(IMI)%TOUTBAKN(IPOS)%TFILE%NLFINPRAR= 22+2*(4+NRR+NSV) - ELSE - PRINT *,'Error: unknown backup fileformat' - CALL ABORT - ENDIF - END IF - END DO + ALLOCATE(OUT_MODEL(IMI)%TBACKUPN(IBAK_NUMB)) + ALLOCATE(OUT_MODEL(IMI)%TOUTPUTN(IOUT_NUMB)) + ! + CALL POPULATE_STRUCT(TFILE_BAK_FIRST,TFILE_BAK_LAST,IBAK_STEP,"BACKUP",OUT_MODEL(IMI)%TBACKUPN) + CALL POPULATE_STRUCT(TFILE_OUT_FIRST,TFILE_OUT_LAST,IOUT_STEP,"OUTPUT",OUT_MODEL(IMI)%TOUTPUTN) ! !* Find dad output number ! @@ -272,31 +172,55 @@ DO IMI = 1, NMODEL STOP END IF IF (NDAD(IMI) == IMI .OR. IMI == 1) THEN - OUT_MODEL(IMI)%TOUTBAKN(:)%NOUTDAD = 0 - !Check IPOS>0 because TOUTBAKN(0) does not exist (IPOS=0 only if no backups) - IF(IPOS>0) OUT_MODEL(IMI)%TOUTBAKN(IPOS)%CDADFILENAME = OUT_MODEL(IMI)%TOUTBAKN(IPOS)%TFILE%CNAME + OUT_MODEL(IMI)%TBACKUPN(:)%NOUTDAD = 0 + DO IPOS = 1,OUT_MODEL(IMI)%NBAK_NUMB + OUT_MODEL(IMI)%TBACKUPN(IPOS)%CDADFILENAME = OUT_MODEL(IMI)%TBACKUPN(IPOS)%TFILE%CNAME + END DO + OUT_MODEL(IMI)%TOUTPUTN(:)%NOUTDAD = 0 + DO IPOS = 1,OUT_MODEL(IMI)%NOUT_NUMB + OUT_MODEL(IMI)%TOUTPUTN(IPOS)%CDADFILENAME = OUT_MODEL(IMI)%TOUTPUTN(IPOS)%TFILE%CNAME + END DO ELSE + DO IPOS = 1,OUT_MODEL(IMI)%NBAK_NUMB + IDX = 0 + DO JOUT = 1,OUT_MODEL(NDAD(IMI))%NBAK_NUMB + IF ( OUT_MODEL(NDAD(IMI))%TBACKUPN(JOUT)%XTIME <= OUT_MODEL(IMI)%TBACKUPN(IPOS)%XTIME+1.E-6 ) THEN + IDX = JOUT + ELSE + EXIT + END IF + END DO + IF (IDX>0) THEN + OUT_MODEL(IMI)%TBACKUPN(IPOS)%NOUTDAD = IDX + WRITE (YDADNUMBER,FMT="('.',I3.3)") OUT_MODEL(IMI)%TBACKUPN(IPOS)%NOUTDAD + OUT_MODEL(IMI)%TBACKUPN(IPOS)%CDADFILENAME = ADJUSTL(ADJUSTR(CDAD_NAME(IMI))//YDADNUMBER) + ELSE + OUT_MODEL(IMI)%TBACKUPN(IPOS)%NOUTDAD = -1 + WRITE ( OUT_MODEL(IMI)%TBACKUPN(IPOS)%CDADFILENAME , FMT="('NO_DAD_FILE')" ) + END IF + END DO DO IPOS = 1,OUT_MODEL(IMI)%NOUT_NUMB IDX = 0 DO JOUT = 1,OUT_MODEL(NDAD(IMI))%NOUT_NUMB - IF ( OUT_MODEL(NDAD(IMI))%TOUTBAKN(JOUT)%XTIME <= OUT_MODEL(IMI)%TOUTBAKN(IPOS)%XTIME+1.E-6 ) THEN + IF ( OUT_MODEL(NDAD(IMI))%TOUTPUTN(JOUT)%XTIME <= OUT_MODEL(IMI)%TOUTPUTN(IPOS)%XTIME+1.E-6 ) THEN IDX = JOUT ELSE EXIT END IF END DO IF (IDX>0) THEN - OUT_MODEL(IMI)%TOUTBAKN(IPOS)%NOUTDAD = IDX - WRITE (YDADNUMBER,FMT="('.',I3.3)") OUT_MODEL(IMI)%TOUTBAKN(IPOS)%NOUTDAD - OUT_MODEL(IMI)%TOUTBAKN(IPOS)%CDADFILENAME = ADJUSTL(ADJUSTR(CDAD_NAME(IMI))//YDADNUMBER) + OUT_MODEL(IMI)%TOUTPUTN(IPOS)%NOUTDAD = IDX + WRITE (YDADNUMBER,FMT="('.',I3.3)") OUT_MODEL(IMI)%TOUTPUTN(IPOS)%NOUTDAD + OUT_MODEL(IMI)%TOUTPUTN(IPOS)%CDADFILENAME = ADJUSTL(ADJUSTR(CDAD_NAME(IMI))//YDADNUMBER) ELSE - OUT_MODEL(IMI)%TOUTBAKN(IPOS)%NOUTDAD = -1 - WRITE ( OUT_MODEL(IMI)%TOUTBAKN(IPOS)%CDADFILENAME , FMT="('NO_DAD_FILE')" ) + OUT_MODEL(IMI)%TOUTPUTN(IPOS)%NOUTDAD = -1 + WRITE ( OUT_MODEL(IMI)%TOUTPUTN(IPOS)%CDADFILENAME , FMT="('NO_DAD_FILE')" ) END IF END DO END IF ! DEALLOCATE(IBAK_STEP) + DEALLOCATE(IOUT_STEP) ! IF (IP==1) THEN PRINT *,'-------------------------' @@ -304,7 +228,14 @@ DO IMI = 1, NMODEL PRINT *,'Number of backups: ',IBAK_NUMB PRINT *,'Timestep Time' DO JOUT = 1,IBAK_NUMB - WRITE(*,'( I9 F12.3 )' ) OUT_MODEL(IMI)%TOUTBAKN(JOUT)%NSTEP,OUT_MODEL(IMI)%TOUTBAKN(JOUT)%XTIME + WRITE(*,'( I9 F12.3 )' ) OUT_MODEL(IMI)%TBACKUPN(JOUT)%NSTEP,OUT_MODEL(IMI)%TBACKUPN(JOUT)%XTIME + END DO + PRINT *,'-------------------------' + PRINT *,'Model number: ',IMI + PRINT *,'Number of outputs: ',IOUT_NUMB + PRINT *,'Timestep Time' + DO JOUT = 1,IOUT_NUMB + WRITE(*,'( I9 F12.3 )' ) OUT_MODEL(IMI)%TOUTPUTN(JOUT)%NSTEP,OUT_MODEL(IMI)%TOUTPUTN(JOUT)%XTIME END DO PRINT *,'-------------------------' END IF @@ -312,7 +243,231 @@ DO IMI = 1, NMODEL END DO ! IMI=1,NMODEL ! DEALLOCATE(NBAK_STEP) +DEALLOCATE(NOUT_STEP) DEALLOCATE(XBAK_TIME) +DEALLOCATE(XOUT_TIME) +! +CONTAINS +! +!######################################################################### +SUBROUTINE IO_INSERT_REGULAR_FLOAT(PFIRST,PFREQ,PTIMES) +!######################################################################### + ! + REAL, INTENT(IN) :: PFIRST,PFREQ + REAL,DIMENSION(:), INTENT(INOUT) :: PTIMES + ! + REAL :: ZOUT, ZOUTMAX ! Time of output/backup + ! + IDX = 1 + ZOUT = PFIRST + ZOUTMAX = PSEGLEN - PTSTEP*KSUP + DO WHILE ( ZOUT <= ZOUTMAX ) + CALL FIND_NEXT_AVAIL_SLOT_FLOAT(PTIMES,IDX) + PTIMES(IDX) = ZOUT + ZOUT = ZOUT + PFREQ + END DO +END SUBROUTINE IO_INSERT_REGULAR_FLOAT +! +!######################################################################### +SUBROUTINE IO_INSERT_REGULAR_INT(KFIRST,KFREQ,KSTEPS) +!######################################################################### + ! + INTEGER, INTENT(IN) :: KFIRST,KFREQ + INTEGER,DIMENSION(:), INTENT(INOUT) :: KSTEPS + ! + IDX = 1 + DO JOUT = KFIRST, ISTEP_MAX, KFREQ + CALL FIND_NEXT_AVAIL_SLOT_INT(KSTEPS,IDX) + KSTEPS(IDX) = JOUT + END DO +END SUBROUTINE IO_INSERT_REGULAR_INT +! +!######################################################################### +SUBROUTINE IO_SYNC_MODELS_FLOAT(KNUMB,PTIMES) +!######################################################################### + ! + INTEGER, INTENT(INOUT) :: KNUMB + REAL,DIMENSION(:,:), INTENT(INOUT) :: PTIMES + ! + INTEGER :: JKLOOP ! Loop index + ! + DO JOUT = 1,JPOUTMAX + IF (PTIMES(IMI,JOUT) >= 0.) THEN + KNUMB = KNUMB + 1 + !Value is rounded to nearest timestep + PTIMES(IMI,JOUT) = NINT(PTIMES(IMI,JOUT)/DYN_MODEL(IMI)%XTSTEP) * DYN_MODEL(IMI)%XTSTEP + !Output/backup time is propagated to nested models (with higher numbers) + !PW: TODO: BUG?: what happens if 2 dissociated models? Use NSON(:) array? + DO JKLOOP = IMI+1,NMODEL + IDX = 1 + CALL FIND_NEXT_AVAIL_SLOT_FLOAT(PTIMES(JKLOOP,:),IDX) + PTIMES(JKLOOP,IDX) = PTIMES(IMI,JOUT) + END DO + END IF + END DO +END SUBROUTINE IO_SYNC_MODELS_FLOAT +! +!######################################################################### +SUBROUTINE IO_SYNC_MODELS_INT(KNUMB,KSTEPS) +!######################################################################### + ! + INTEGER, INTENT(INOUT) :: KNUMB + INTEGER,DIMENSION(:,:), INTENT(INOUT) :: KSTEPS + ! + INTEGER :: JKLOOP ! Loop index + ! + DO JOUT = 1,JPOUTMAX + IF (KSTEPS(IMI,JOUT) > 0) THEN + KNUMB = KNUMB + 1 + !Output/backup time is propagated to nested models (with higher numbers) + !PW: TODO: BUG?: what happens if 2 dissociated models? Use NSON(:) array? + DO JKLOOP = IMI+1,NMODEL + IDX = 1 + CALL FIND_NEXT_AVAIL_SLOT_INT(KSTEPS(JKLOOP,:),IDX) + ! Use of NINT and real to prevent rounding errors + ! (STEP-1)* ... +1 because step numbers begin at 1 + KSTEPS(JKLOOP,IDX) = (KSTEPS(IMI,JOUT)-1) * NINT( DYN_MODEL(JKLOOP)%XTSTEP/DYN_MODEL(IMI)%XTSTEP ) + 1 + END DO + END IF + END DO +END SUBROUTINE IO_SYNC_MODELS_INT +! +!######################################################################### +SUBROUTINE FIND_NEXT_AVAIL_SLOT_FLOAT(PTIMES,kIDX) +!######################################################################### + ! + REAL,DIMENSION(:), INTENT(IN) :: PTIMES + INTEGER, INTENT(INOUT) :: KIDX + ! + !Find next (starting from KIDX) non 'allocated' element + DO WHILE ( PTIMES(KIDX) >= 0. ) + KIDX = KIDX + 1 + IF (KIDX > JPOUTMAX) THEN + PRINT *,'Error in SET_GRID when treating backup/output list (JPOUTMAX too small)' + CALL ABORT + STOP + END IF + END DO +END SUBROUTINE FIND_NEXT_AVAIL_SLOT_FLOAT +! +!######################################################################### +SUBROUTINE FIND_NEXT_AVAIL_SLOT_INT(KSTEPS,KIDX) +!######################################################################### + ! + INTEGER,DIMENSION(:), INTENT(IN) :: KSTEPS + INTEGER, INTENT(INOUT) :: KIDX + ! + !Find next (starting from KIDX) non 'allocated' element + DO WHILE ( KSTEPS(IDX) >= 0 ) + KIDX = KIDX + 1 + IF (KIDX > JPOUTMAX) THEN + PRINT *,'Error in SET_GRID when treating backup/output list (JPOUTMAX too small)' + CALL ABORT + STOP + END IF + END DO +END SUBROUTINE FIND_NEXT_AVAIL_SLOT_INT +! +!######################################################################### +SUBROUTINE FIND_REMOVE_DUPLICATES(KNUMB,KSTEPS) +!######################################################################### + ! + INTEGER, INTENT(IN) :: KNUMB + INTEGER,DIMENSION(:), INTENT(INOUT) :: KSTEPS + ! + INTEGER :: JKLOOP ! Loop index + ! + DO JOUT = 1,KNUMB + DO JKLOOP = JOUT+1,KNUMB + IF ( KSTEPS(JKLOOP) == KSTEPS(JOUT) .AND. KSTEPS(JKLOOP) > 0 ) THEN + print *,'WARNING: found duplicated backup/output step (removed extra one)' + KSTEPS(JKLOOP) = NNEGUNDEF + END IF + END DO + END DO +END SUBROUTINE FIND_REMOVE_DUPLICATES +! +!######################################################################### +SUBROUTINE SORT_ENTRIES(KNUMB,KSTEPS) +!######################################################################### + ! + INTEGER, INTENT(IN) :: KNUMB + INTEGER,DIMENSION(:), INTENT(INOUT) :: KSTEPS + ! + INTEGER :: ITEMP ! Intermediate variable + INTEGER :: JKLOOP ! Loop index + ! + DO JOUT = 1,KNUMB + ITEMP = KSTEPS(JOUT) + IF (ITEMP<=0) ITEMP = HUGE(ITEMP) + IPOS = -1 + DO JKLOOP = JOUT+1,KNUMB + IF ( KSTEPS(JKLOOP) < ITEMP .AND. KSTEPS(JKLOOP) >= 0 ) THEN + ITEMP = KSTEPS(JKLOOP) + IPOS = JKLOOP + END IF + END DO + IF (IPOS >= JOUT) THEN + KSTEPS(IPOS) = KSTEPS(JOUT) + KSTEPS(JOUT) = ITEMP + END IF + END DO +END SUBROUTINE SORT_ENTRIES +! +!######################################################################### +SUBROUTINE POPULATE_STRUCT(TPFILE_FIRST,TPFILE_LAST,KSTEPS,HFILETYPE,TPBAKOUTN) +!######################################################################### + ! + TYPE(TFILEDATA), POINTER,INTENT(INOUT) :: TPFILE_FIRST,TPFILE_LAST + INTEGER,DIMENSION(:), INTENT(IN) :: KSTEPS + CHARACTER(LEN=*), INTENT(IN) :: HFILETYPE + TYPE(TOUTBAK),DIMENSION(:),POINTER,INTENT(OUT) :: TPBAKOUTN + ! + CHARACTER (LEN=4) :: YNUMBER ! Character string for the file number + ! + IPOS = 0 + DO JOUT = 1,SIZE(KSTEPS) + IF (KSTEPS(JOUT) >= 0) THEN + IPOS = IPOS + 1 + TPBAKOUTN(IPOS)%NID = IPOS + TPBAKOUTN(IPOS)%NSTEP = KSTEPS(JOUT) + TPBAKOUTN(IPOS)%XTIME = (KSTEPS(JOUT)-1)*DYN_MODEL(IMI)%XTSTEP + IF (IPOS>999) THEN + print *,'ERROR in SET_GRID: more than 999 backups/outputs' + STOP + END IF + IF (.NOT.ASSOCIATED(TPFILE_FIRST)) THEN + ALLOCATE(TPFILE_FIRST) + TPFILE_LAST => TPFILE_FIRST + ELSE + ALLOCATE(TPFILE_LAST%TFILE_NEXT) + TPFILE_LAST%TFILE_NEXT%TFILE_PREV => TPFILE_LAST + TPFILE_LAST => TPFILE_LAST%TFILE_NEXT + ENDIF + TPBAKOUTN(IPOS)%TFILE => TPFILE_LAST + TPBAKOUTN(IPOS)%TFILE%CTYPE=HFILETYPE + TPBAKOUTN(IPOS)%TFILE%CMODE="WRITE" + WRITE (YNUMBER,FMT="('.',I3.3)") IPOS + TPBAKOUTN(IPOS)%TFILE%CNAME=ADJUSTL(ADJUSTR(IO_SURF_MNH_MODEL(IMI)%COUTFILE)//YNUMBER) + TPBAKOUTN(IPOS)%TFILE%NLFITYPE=1 !1: to be transfered +!PW: TODO: set NLFIVERB only when useful (only if LFI file...) + TPBAKOUTN(IPOS)%TFILE%NLFIVERB=NVERB + IF (LIOCDF4) THEN + TPBAKOUTN(IPOS)%TFILE%CTYPE='NETCDF4' + IF (LLFIOUT) THEN + PRINT *,'Warning: LLFIOUT + LIOCDF4 = .TRUE. not yet implemented with new IO data structures' + TPBAKOUTN(IPOS)%TFILE%NLFINPRAR= 22+2*(4+NRR+NSV) + END IF + ELSE IF (LLFIOUT) THEN + TPBAKOUTN(IPOS)%TFILE%CTYPE='LFI' + TPBAKOUTN(IPOS)%TFILE%NLFINPRAR= 22+2*(4+NRR+NSV) + ELSE + PRINT *,'Error: unknown backup/output fileformat' + CALL ABORT + ENDIF + END IF + END DO +END SUBROUTINE POPULATE_STRUCT ! END SUBROUTINE IO_PREPARE_BAKOUT_STRUCT ! diff --git a/src/MNH/ini_modeln.f90 b/src/MNH/ini_modeln.f90 index 12972c657..deb55ee7d 100644 --- a/src/MNH/ini_modeln.f90 +++ b/src/MNH/ini_modeln.f90 @@ -1555,7 +1555,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_NUMB,TOUTBAKN) + TDTMOD,TDTCUR,NSTOP,NBAK_NUMB,NOUT_NUMB,TBACKUPN,TOUTPUTN) ! 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 9777966f9..3aca74575 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_NUMB,TOUTBAKN) + TDTMOD,TDTCUR,NSTOP,NBAK_NUMB,NOUT_NUMB,TBACKUPN,TOUTPUTN) ! 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 df8ddd54e..d43402d8e 100644 --- a/src/MNH/modd_fmout.f90 +++ b/src/MNH/modd_fmout.f90 @@ -38,6 +38,7 @@ !! MODIFICATIONS !! ------------- !! Original 26/07/96 +!! Ph. Wautelet : 2016: new structures for outputs/backups !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -47,26 +48,26 @@ USE MODD_PARAMETERS ! IMPLICIT NONE ! -LOGICAL,SAVE :: LBAK_BEG = .FALSE. ! Force a backup at the first timestep - ! of the segment for all models -LOGICAL,SAVE :: LBAK_END = .FALSE. ! Force a backup at the last timestep - ! of the segment for all models -REAL,SAVE,ALLOCATABLE,DIMENSION(:,:) :: XBAK_TIME -! XBAK_TIME(m,i) array of +LOGICAL,SAVE :: LBAK_BEG = .FALSE. ! Force a backup/output at the first timestep +LOGICAL,SAVE :: LOUT_BEG = .FALSE. ! of the segment for all models +LOGICAL,SAVE :: LBAK_END = .FALSE. ! Force a backup/output at the last timestep +LOGICAL,SAVE :: LOUT_END = .FALSE. ! of the segment for all models +REAL,SAVE,ALLOCATABLE,DIMENSION(:,:) :: XBAK_TIME, XOUT_TIME +! XBAK_TIME(m,i) / XOUT_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" -INTEGER,SAVE,ALLOCATABLE,DIMENSION(:,:) :: NBAK_STEP -! NBAK_STEP(m,i) array of +INTEGER,SAVE,ALLOCATABLE,DIMENSION(:,:) :: NBAK_STEP, NOUT_STEP +! NBAK_STEP(m,i) / NOUT_STEP(m,i) array of ! the increments in steps from the beginning of the segment to the ! step where the i-th fields output on FM-files is realized by model "m" -INTEGER,SAVE,DIMENSION(JPMODELMAX) :: NBAK_STEP_FREQ = NNEGUNDEF ! Number -! of timesteps between 2 backups for each model -INTEGER,SAVE,DIMENSION(JPMODELMAX) :: NBAK_STEP_FREQ_FIRST = 1 ! First -! timestep numbers between 2 backups for each model (if NBAK_STEP_FREQ is set) -REAL,SAVE,DIMENSION(JPMODELMAX) :: XBAK_TIME_FREQ = XNEGUNDEF ! Time between -! 2 backups for each model -REAL,SAVE,DIMENSION(JPMODELMAX) :: XBAK_TIME_FREQ_FIRST = 0. ! Time for first -! backup for each model (if XBAK_TIME_FREQ is set) +INTEGER,SAVE,DIMENSION(JPMODELMAX) :: NBAK_STEP_FREQ = NNEGUNDEF, NOUT_STEP_FREQ = NNEGUNDEF +! Number of timesteps between 2 backups/outputs for each model +INTEGER,SAVE,DIMENSION(JPMODELMAX) :: NBAK_STEP_FREQ_FIRST = 1, NOUT_STEP_FREQ_FIRST = 1 +! First timestep numbers between 2 backups/outputs for each model (if NBAK/OUT_STEP_FREQ is set) +REAL,SAVE,DIMENSION(JPMODELMAX) :: XBAK_TIME_FREQ = XNEGUNDEF, XOUT_TIME_FREQ = XNEGUNDEF +! Time between 2 backups/outputs for each model +REAL,SAVE,DIMENSION(JPMODELMAX) :: XBAK_TIME_FREQ_FIRST = 0., XOUT_TIME_FREQ_FIRST = 0. +! Time for first backup/output for each model (if XBAK/OUT_TIME_FREQ is set) ! ! END MODULE MODD_FMOUT diff --git a/src/MNH/modd_outn.f90 b/src/MNH/modd_outn.f90 index a51dc5863..531d77413 100644 --- a/src/MNH/modd_outn.f90 +++ b/src/MNH/modd_outn.f90 @@ -48,16 +48,17 @@ IMPLICIT NONE TYPE OUT_t ! - INTEGER :: NOUT_NUMB ! number of outputs perform by model n - TYPE(TOUTBAK),DIMENSION(:),POINTER :: TOUTBAKN=>NULL() ! List of the outputs and backups + INTEGER :: NBAK_NUMB, NOUT_NUMB ! number of outputs and backups performed by model n + TYPE(TOUTBAK),DIMENSION(:),POINTER :: TBACKUPN=>NULL(),TOUTPUTN=>NULL() +! Lists of the outputs and backups ! ! END TYPE OUT_t TYPE(OUT_t), DIMENSION(JPMODELMAX), TARGET, SAVE :: OUT_MODEL -INTEGER, POINTER :: NOUT_NUMB=>NULL() -TYPE(TOUTBAK),DIMENSION(:),POINTER :: TOUTBAKN=>NULL() +INTEGER, POINTER :: NBAK_NUMB=>NULL(), NOUT_NUMB=>NULL() +TYPE(TOUTBAK),DIMENSION(:),POINTER :: TBACKUPN=>NULL(), TOUTPUTN=>NULL() CONTAINS @@ -65,8 +66,10 @@ SUBROUTINE OUT_GOTO_MODEL(KFROM, KTO) INTEGER, INTENT(IN) :: KFROM, KTO ! ! Current model is set to model KTO +NBAK_NUMB=>OUT_MODEL(KTO)%NBAK_NUMB NOUT_NUMB=>OUT_MODEL(KTO)%NOUT_NUMB -TOUTBAKN=>OUT_MODEL(KTO)%TOUTBAKN +TBACKUPN=>OUT_MODEL(KTO)%TBACKUPN +TOUTPUTN=>OUT_MODEL(KTO)%TOUTPUTN END SUBROUTINE OUT_GOTO_MODEL diff --git a/src/MNH/modd_sub_modeln.f90 b/src/MNH/modd_sub_modeln.f90 index 0acf53a8a..bb8eae10d 100644 --- a/src/MNH/modd_sub_modeln.f90 +++ b/src/MNH/modd_sub_modeln.f90 @@ -31,7 +31,7 @@ TYPE SUB_MODEL_t TYPE(HALO2LIST_ll), POINTER :: TZHALO2T_ll TYPE(HALO2LIST_ll), POINTER :: TZHALO2MT_ll TYPE(HALO2LIST_ll), POINTER :: TZHALO2SC_ll - INTEGER :: IOUT ! numero of the OUTPUT FM-file + INTEGER :: IBAK, IOUT ! number of the backup / output REAL*8,DIMENSION(2) :: XT_START REAL*8,DIMENSION(2) :: XT_STORE,XT_BOUND,XT_GUESS REAL*8,DIMENSION(2) :: XT_ADV,XT_SOURCES,XT_DRAG @@ -58,6 +58,7 @@ TYPE(LIST_ll), POINTER :: TZFIELDS_ll=>NULL(),TZLSFIELD_ll=>NULL(),TZFIELDM_ll=> TYPE(LIST_ll), POINTER :: TZFIELDT_ll=>NULL(),TZFIELDMT_ll=>NULL(),TZFIELDSC_ll=>NULL() TYPE(HALO2LIST_ll), POINTER :: TZHALO2M_ll=>NULL(), TZLSHALO2_ll=>NULL() TYPE(HALO2LIST_ll), POINTER :: TZHALO2T_ll=>NULL(), TZHALO2MT_ll=>NULL(), TZHALO2SC_ll=>NULL() +INTEGER, POINTER :: IBAK=>NULL() INTEGER, POINTER :: IOUT=>NULL() REAL*8,DIMENSION(:), POINTER :: XT_START=>NULL() REAL*8,DIMENSION(:), POINTER :: XT_STORE=>NULL(),XT_BOUND=>NULL(),XT_GUESS=>NULL() @@ -107,6 +108,7 @@ TZLSHALO2_ll=>SUB_MODEL_MODEL(KTO)%TZLSHALO2_ll TZHALO2T_ll=>SUB_MODEL_MODEL(KTO)%TZHALO2T_ll TZHALO2MT_ll=>SUB_MODEL_MODEL(KTO)%TZHALO2MT_ll TZHALO2SC_ll=>SUB_MODEL_MODEL(KTO)%TZHALO2SC_ll +IBAK=>SUB_MODEL_MODEL(KTO)%IBAK IOUT=>SUB_MODEL_MODEL(KTO)%IOUT XT_START=>SUB_MODEL_MODEL(KTO)%XT_START XT_STORE=>SUB_MODEL_MODEL(KTO)%XT_STORE diff --git a/src/MNH/modeln.f90 b/src/MNH/modeln.f90 index 7788c1848..7ba4a816a 100644 --- a/src/MNH/modeln.f90 +++ b/src/MNH/modeln.f90 @@ -602,7 +602,7 @@ IF (KTCOUNT == 1) THEN ALLOCATE(GMASKkids(SIZE(XWT,1),SIZE(XWT,2))) ! ! initialization of the FM file output number - IOUT=0 + IBAK=0 ! INPRAR = 50 CALL FMOPEN_ll(CFMDIAC,'WRITE',CLUOUT,INPRAR,ITYPE,NVERB,ININAR,IRESP) @@ -906,14 +906,14 @@ IF (CSURF=='EXTE') CALL GOTO_SURFEX(IMI) ZTIME1 = ZTIME2 ! YFMFILE=' ' -IF (IOUT < NOUT_NUMB ) THEN - IF (KTCOUNT == TOUTBAKN(IOUT+1)%NSTEP) THEN - IOUT=IOUT+1 +IF (IBAK < NBAK_NUMB ) THEN + IF (KTCOUNT == TBACKUPN(IBAK+1)%NSTEP) THEN + IBAK=IBAK+1 GCLOSE_OUT=.TRUE. ! - TZFILE => TOUTBAKN(IOUT)%TFILE + TZFILE => TBACKUPN(IBAK)%TFILE YFMFILE = TZFILE%CNAME - YDADFILE = TOUTBAKN(IOUT)%CDADFILENAME + YDADFILE = TBACKUPN(IBAK)%CDADFILENAME YMODE = TZFILE%CMODE INPRAR = TZFILE%NLFINPRAR ITYPE = TZFILE%NLFITYPE @@ -928,7 +928,7 @@ IF (IOUT < NOUT_NUMB ) THEN YDESFM=ADJUSTL(ADJUSTR(YFMFILE)//'.des') ! CALL WRITE_DESFM_n(IMI,YDESFM,CLUOUT) - CALL WRITE_LFIFM_n(YFMFILE,YDADFILE,TOUTBAKN(IOUT)%TFILE) + CALL WRITE_LFIFM_n(YFMFILE,YDADFILE,TBACKUPN(IBAK)%TFILE) COUTFMFILE = YFMFILE CALL MNHWRITE_ZS_DUMMY_n(CPROGRAM) IF (CSURF=='EXTE') THEN @@ -1301,8 +1301,8 @@ IF (CDCONV/='NONE') THEN END IF END IF ! -IF (IOUT>0 .AND. IOUT <= NOUT_NUMB ) THEN - IF (KTCOUNT == TOUTBAKN(IOUT)%NSTEP) THEN +IF (IBAK>0 .AND. IBAK <= NBAK_NUMB ) THEN + IF (KTCOUNT == TBACKUPN(IBAK)%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, & diff --git a/src/MNH/modn_fmout.f90 b/src/MNH/modn_fmout.f90 index eba6b91cc..7793d94cb 100644 --- a/src/MNH/modn_fmout.f90 +++ b/src/MNH/modn_fmout.f90 @@ -24,10 +24,6 @@ !! Module MODD_FMOUT : contains declaration of the variables describing !! the instants for the outputs !! -!! XFMOUT : XFMOUT(m,i) array of 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" -!! !! REFERENCE !! --------- !! Book2 of Meso-NH documentation (module MODD_FMOUT) @@ -39,6 +35,7 @@ !! MODIFICATIONS !! ------------- !! Original 26/07/96 +!! Ph. Wautelet : 2016: new structures for outputs/backups !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -51,6 +48,10 @@ IMPLICIT NONE NAMELIST/NAM_FMOUT/LBAK_BEG,LBAK_END,& XBAK_TIME,NBAK_STEP,& NBAK_STEP_FREQ,NBAK_STEP_FREQ_FIRST,& - XBAK_TIME_FREQ,XBAK_TIME_FREQ_FIRST + XBAK_TIME_FREQ,XBAK_TIME_FREQ_FIRST, & + LOUT_BEG,LOUT_END,& + XOUT_TIME,NOUT_STEP,& + NOUT_STEP_FREQ,NOUT_STEP_FREQ_FIRST,& + XOUT_TIME_FREQ,XOUT_TIME_FREQ_FIRST ! END MODULE MODN_FMOUT diff --git a/src/MNH/read_desfmn.f90 b/src/MNH/read_desfmn.f90 index 9612d778a..287f5f8e6 100644 --- a/src/MNH/read_desfmn.f90 +++ b/src/MNH/read_desfmn.f90 @@ -191,6 +191,7 @@ END MODULE MODI_READ_DESFM_n !! Modification 07/2013 (Bosseur & Filippi) Adds Forefire !! Modification 01/2015 (C. Barthe) Add explicit LNOx !! Modification 2016 (B.VIE) LIMA +!! Modification 11/2016 (Ph. Wautelet) Allocate/initialise some output/backup structures !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -425,10 +426,14 @@ IF (KMI == 1) THEN CALL POSNAM(ILUDES,'NAM_FMOUT',GFOUND) IF (GFOUND) THEN IF (.NOT.ALLOCATED(XBAK_TIME)) ALLOCATE(XBAK_TIME(NMODEL,JPOUTMAX)) + IF (.NOT.ALLOCATED(XOUT_TIME)) ALLOCATE(XOUT_TIME(NMODEL,JPOUTMAX)) IF (.NOT.ALLOCATED(NBAK_STEP)) ALLOCATE(NBAK_STEP(NMODEL,JPOUTMAX)) + IF (.NOT.ALLOCATED(NOUT_STEP)) ALLOCATE(NOUT_STEP(NMODEL,JPOUTMAX)) READ(UNIT=ILUDES,NML=NAM_FMOUT) XBAK_TIME(:,:) = XNEGUNDEF + XOUT_TIME(:,:) = XNEGUNDEF NBAK_STEP(:,:) = NNEGUNDEF + NOUT_STEP(:,:) = NNEGUNDEF END IF CALL POSNAM(ILUDES,'NAM_BUDGET',GFOUND) IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BUDGET) diff --git a/src/MNH/read_exsegn.f90 b/src/MNH/read_exsegn.f90 index 6460939ca..4ac2f3ed8 100644 --- a/src/MNH/read_exsegn.f90 +++ b/src/MNH/read_exsegn.f90 @@ -285,6 +285,7 @@ END MODULE MODI_READ_EXSEG_n !! P.Wautelet 08/07/2016 : removed MNH_NCWRIT define !! Modification 10/2016 (C.LAC) Add OSPLIT_WENO + Add droplet !! deposition + Add max values +!! Modification 11/2016 (Ph. Wautelet) Allocate/initialise some output/backup structures !!------------------------------------------------------------------------------ ! !* 0. DECLARATIONS @@ -497,9 +498,13 @@ IF (KMI == 1) THEN IF (GFOUND) THEN !Should have been allocated before in READ_DESFM_n IF (.NOT.ALLOCATED(XBAK_TIME)) ALLOCATE(XBAK_TIME(NMODEL,JPOUTMAX)) + IF (.NOT.ALLOCATED(XOUT_TIME)) ALLOCATE(XOUT_TIME(NMODEL,JPOUTMAX)) IF (.NOT.ALLOCATED(NBAK_STEP)) ALLOCATE(NBAK_STEP(NMODEL,JPOUTMAX)) + IF (.NOT.ALLOCATED(NOUT_STEP)) ALLOCATE(NOUT_STEP(NMODEL,JPOUTMAX)) XBAK_TIME(:,:) = XNEGUNDEF + XOUT_TIME(:,:) = XNEGUNDEF NBAK_STEP(:,:) = NNEGUNDEF + NOUT_STEP(:,:) = NNEGUNDEF READ(UNIT=ILUSEG,NML=NAM_FMOUT) END IF CALL POSNAM(ILUSEG,'NAM_BUDGET',GFOUND,ILUOUT) diff --git a/src/MNH/set_grid.f90 b/src/MNH/set_grid.f90 index d91f3538c..1aca11b48 100644 --- a/src/MNH/set_grid.f90 +++ b/src/MNH/set_grid.f90 @@ -25,7 +25,8 @@ INTERFACE PXHAT,PYHAT,PDXHAT,PDYHAT, PMAP, & PZS,PZZ,PZHAT,OSLEVE,PLEN1,PLEN2,PZSMT, & PJ, & - TPDTMOD,TPDTCUR,KSTOP,KOUT_NUMB,TPOUTBAKN ) + TPDTMOD,TPDTCUR,KSTOP, & + KBAK_NUMB,KOUT_NUMB,TPBACKUPN,TPOUTPUTN ) ! USE MODD_TYPE_DATE USE MODD_IO_ll, ONLY:TOUTBAK @@ -86,8 +87,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,POINTER, INTENT(OUT) :: KBAK_NUMB ! number of backups INTEGER,POINTER, INTENT(OUT) :: KOUT_NUMB ! number of outputs -TYPE(TOUTBAK),DIMENSION(:),POINTER,INTENT(OUT) :: TPOUTBAKN ! List of outputs and backups +TYPE(TOUTBAK),DIMENSION(:),POINTER,INTENT(OUT) :: TPBACKUPN ! List of backups +TYPE(TOUTBAK),DIMENSION(:),POINTER,INTENT(OUT) :: TPOUTPUTN ! List of outputs ! REAL, DIMENSION(:,:,:), INTENT(OUT) :: PJ ! Jacobian ! @@ -113,7 +116,8 @@ END MODULE MODI_SET_GRID PXHAT,PYHAT,PDXHAT,PDYHAT, PMAP, & PZS,PZZ,PZHAT,OSLEVE,PLEN1,PLEN2,PZSMT, & PJ, & - TPDTMOD,TPDTCUR,KSTOP,KOUT_NUMB,TPOUTBAKN ) + TPDTMOD,TPDTCUR,KSTOP, & + KBAK_NUMB,KOUT_NUMB,TPBACKUPN,TPOUTPUTN ) ! ######################################################################### ! !!**** *SET_GRID* - routine to set grid variables @@ -314,8 +318,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,POINTER, INTENT(OUT) :: KBAK_NUMB ! number of backups INTEGER,POINTER, INTENT(OUT) :: KOUT_NUMB ! number of outputs -TYPE(TOUTBAK),DIMENSION(:),POINTER,INTENT(OUT) :: TPOUTBAKN ! List of outputs and backups +TYPE(TOUTBAK),DIMENSION(:),POINTER,INTENT(OUT) :: TPBACKUPN ! List of backups +TYPE(TOUTBAK),DIMENSION(:),POINTER,INTENT(OUT) :: TPOUTPUTN ! List of outputs ! REAL, DIMENSION(:,:,:), INTENT(OUT) :: PJ ! Jacobian ! @@ -512,8 +518,10 @@ KSTOP = NINT(PSEGLEN/PTSTEP) ! The output/backups times have been read only by model 1 IF (KMI == 1) CALL IO_PREPARE_BAKOUT_STRUCT(ISUP,PTSTEP,PSEGLEN) ! +KBAK_NUMB => OUT_MODEL(KMI)%NBAK_NUMB KOUT_NUMB => OUT_MODEL(KMI)%NOUT_NUMB -TPOUTBAKN => OUT_MODEL(KMI)%TOUTBAKN +TPBACKUPN => OUT_MODEL(KMI)%TBACKUPN +TPOUTPUTN => OUT_MODEL(KMI)%TOUTPUTN ! !------------------------------------------------------------------------------- ! -- GitLab