diff --git a/src/MNH/modeln.f90 b/src/MNH/modeln.f90 index c778b2e1ea6fdbf0e56414a461a0ccfc98284eb5..2582fea44960ab4ce0e50f3d90d84f08a16afc23 100644 --- a/src/MNH/modeln.f90 +++ b/src/MNH/modeln.f90 @@ -2116,20 +2116,18 @@ IF (LFLYER) & !* 24.2 STATION (observation diagnostic) ! -------------------------------- ! -IF ( LSTATION ) & - CALL STATION_n(XTSTEP, XZZ, & - XUT, XVT, XWT, XTHT, XRT, XSVT, XTKET, XTSRAD, XPABST ) +IF ( LSTATION ) & + CALL STATION_n( XZZ, XUT, XVT, XWT, XTHT, XRT, XSVT, XTKET, XTSRAD, XPABST ) ! !--------------------------------------------------------- ! !* 24.3 PROFILER (observation diagnostic) ! --------------------------------- ! -IF ( LPROFILER ) & - CALL PROFILER_n(XTSTEP, & - XZZ, XRHODREF, & - XUT, XVT, XWT, XTHT, XRT, XSVT, XTKET, XTSRAD, XPABST, & - XAER, XCIT, PSEA=ZSEA(:,:)) +IF ( LPROFILER ) & + CALL PROFILER_n( XZZ, XRHODREF, & + XUT, XVT, XWT, XTHT, XRT, XSVT, XTKET, XTSRAD, XPABST, & + XAER, XCIT, PSEA=ZSEA(:,:) ) ! ! CALL SECOND_MNH2(ZTIME2) diff --git a/src/MNH/profilern.f90 b/src/MNH/profilern.f90 index ccd26a860f640cb5a2f7bf7be8f71e74c7cb1960..a9215eb8eacb8900524c5246cbc345521816cc43 100644 --- a/src/MNH/profilern.f90 +++ b/src/MNH/profilern.f90 @@ -9,12 +9,10 @@ MODULE MODI_PROFILER_n ! INTERFACE ! - SUBROUTINE PROFILER_n( PTSTEP, & - PZ, PRHODREF, & + SUBROUTINE PROFILER_n( PZ, PRHODREF, & PU, PV, PW, PTH, PR, PSV, PTKE, & PTS, PP, PAER, PCIT, PSEA ) ! -REAL, INTENT(IN) :: PTSTEP ! time step REAL, DIMENSION(:,:,:), INTENT(IN) :: PZ ! z array REAL, DIMENSION(:,:,:), INTENT(IN) :: PU ! horizontal wind X component REAL, DIMENSION(:,:,:), INTENT(IN) :: PV ! horizontal wind Y component @@ -39,8 +37,7 @@ END INTERFACE END MODULE MODI_PROFILER_n ! ! ######################################################## - SUBROUTINE PROFILER_n( PTSTEP, & - PZ, PRHODREF, & + SUBROUTINE PROFILER_n( PZ, PRHODREF, & PU, PV, PW, PTH, PR, PSV, PTKE, & PTS, PP, PAER, PCIT, PSEA ) ! ######################################################## @@ -120,12 +117,12 @@ USE MODD_RAIN_ICE_DESCR, ONLY: XALPHAR_I => XALPHAR, XNUR_I => XNUR, XLBEXR_I XALPHAI_I => XALPHAI, XNUI_I => XNUI, XDI_I => XDI, XLBEXI_I => XLBEXI, & XLBI_I => XLBI, XAI_I => XAI, XBI_I => XBI, XC_I_I => XC_I, & XRTMIN_I => XRTMIN, XCONC_LAND, XCONC_SEA -USE MODD_TIME_n, only: tdtcur ! USE MODE_FGAU, ONLY: GAULAG USE MODE_FSCATTER, ONLY: BHMIE, QEPSI, QEPSW, MG, MOMG USE MODE_MSG -USE MODE_STATPROF_TOOLS, ONLY: STATPROF_INTERP_2D, STATPROF_INTERP_3D, STATPROF_INTERP_3D_U, STATPROF_INTERP_3D_V +USE MODE_STATPROF_TOOLS, ONLY: STATPROF_INSTANT, STATPROF_INTERP_2D, STATPROF_INTERP_3D, & + STATPROF_INTERP_3D_U, STATPROF_INTERP_3D_V ! USE MODI_GPS_ZENITH_GRID USE MODI_WATER_SUM @@ -137,7 +134,6 @@ IMPLICIT NONE !* 0.1 declarations of arguments ! ! -REAL, INTENT(IN) :: PTSTEP ! time step REAL, DIMENSION(:,:,:), INTENT(IN) :: PZ ! z array REAL, DIMENSION(:,:,:), INTENT(IN) :: PU ! horizontal wind X component REAL, DIMENSION(:,:,:), INTENT(IN) :: PV ! horizontal wind Y component @@ -249,30 +245,18 @@ IKE = IKU-JPVEXT ! !---------------------------------------------------------------------------- ! -! !* 3.4 instant of storage ! ------------------ ! - -IF ( TPROFILERS_TIME%XTIME_CUR == XUNDEF ) TPROFILERS_TIME%XTIME_CUR = TPROFILERS_TIME%XTSTEP - PTSTEP -! -TPROFILERS_TIME%XTIME_CUR = TPROFILERS_TIME%XTIME_CUR + PTSTEP -! -IF ( TPROFILERS_TIME%XTIME_CUR >= TPROFILERS_TIME%XTSTEP - 1.E-10 ) THEN - TPROFILERS_TIME%XTIME_CUR = TPROFILERS_TIME%XTIME_CUR - TPROFILERS_TIME%XTSTEP - TPROFILERS_TIME%N_CUR = TPROFILERS_TIME%N_CUR + 1 - IN = TPROFILERS_TIME%N_CUR - tprofilers_time%tpdates(in) = tdtcur -ELSE - !No profiler storage at this time step - RETURN -END IF +CALL STATPROF_INSTANT( TPROFILERS_TIME, IN ) +IF ( IN < 1 ) RETURN !No profiler storage at this time step ! !---------------------------------------------------------------------------- ! !* 8. DATA RECORDING ! -------------- ! +!PW: TODO: ne faire le calcul que si necessaire (presence de profileurs locaux,...) ZTEMP(:,:,:)=PTH(:,:,:)*(PP(:,:,:)/ XP00) **(XRD/XCPD) ! Theta_v ZTHV(:,:,:) = PTH(:,:,:) / (1.+WATER_SUM(PR(:,:,:,:)))*(1.+PR(:,:,:,1)/ZRDSRV) diff --git a/src/MNH/stationn.f90 b/src/MNH/stationn.f90 index b10c060a55277d2ef0763e9ea5d91eb8d6ab9ccd..172521e8abb91b0ef28830380b52e3aee4aea628 100644 --- a/src/MNH/stationn.f90 +++ b/src/MNH/stationn.f90 @@ -9,11 +9,10 @@ MODULE MODI_STATION_n ! INTERFACE ! - SUBROUTINE STATION_n( PTSTEP, PZ, & + SUBROUTINE STATION_n( PZ, & PU, PV, PW, PTH, PR, PSV, PTKE, & PTS, PP ) ! -REAL, INTENT(IN) :: PTSTEP ! time step REAL, DIMENSION(:,:,:), INTENT(IN) :: PZ ! z array REAL, DIMENSION(:,:,:), INTENT(IN) :: PU ! horizontal wind X component REAL, DIMENSION(:,:,:), INTENT(IN) :: PV ! horizontal wind Y component @@ -34,7 +33,7 @@ END INTERFACE END MODULE MODI_STATION_n ! ! ####################################################### - SUBROUTINE STATION_n( PTSTEP, PZ, & + SUBROUTINE STATION_n( PZ, & PU, PV, PW, PTH, PR, PSV, PTKE, & PTS, PP ) ! ####################################################### @@ -87,13 +86,12 @@ USE MODD_CONF, ONLY: LCARTESIAN USE MODD_CST, ONLY: XPI USE MODD_DIAG_IN_RUN USE MODD_GRID, ONLY: XBETA, XLON0, XRPK -USE MODD_PARAMETERS, ONLY: JPVEXT, XUNDEF +USE MODD_PARAMETERS, ONLY: JPVEXT USE MODD_PARAM_n, ONLY: CRAD USE MODD_STATION_n USE MODD_ALLSTATION_n, ONLY: LDIAG_SURFRAD -USE MODD_TIME_n, ONLY: tdtcur ! -USE MODE_STATPROF_TOOLS, ONLY: STATPROF_INTERP_2D, STATPROF_INTERP_2D_U, STATPROF_INTERP_2D_V +USE MODE_STATPROF_TOOLS, ONLY: STATPROF_INSTANT, STATPROF_INTERP_2D, STATPROF_INTERP_2D_U, STATPROF_INTERP_2D_V ! ! IMPLICIT NONE @@ -102,7 +100,6 @@ IMPLICIT NONE !* 0.1 declarations of arguments ! ! -REAL, INTENT(IN) :: PTSTEP ! time step REAL, DIMENSION(:,:,:), INTENT(IN) :: PZ ! z array REAL, DIMENSION(:,:,:), INTENT(IN) :: PU ! horizontal wind X component REAL, DIMENSION(:,:,:), INTENT(IN) :: PV ! horizontal wind Y component @@ -134,19 +131,8 @@ INTEGER :: JK ! loop for levels !* 3.4 instant of storage ! ------------------ ! -IF ( TSTATIONS_TIME%XTIME_CUR == XUNDEF ) TSTATIONS_TIME%XTIME_CUR = TSTATIONS_TIME%XTSTEP - PTSTEP -! -TSTATIONS_TIME%XTIME_CUR = TSTATIONS_TIME%XTIME_CUR + PTSTEP -! -IF ( TSTATIONS_TIME%XTIME_CUR >= TSTATIONS_TIME%XTSTEP - 1.E-10 ) THEN - TSTATIONS_TIME%XTIME_CUR = TSTATIONS_TIME%XTIME_CUR - TSTATIONS_TIME%XTSTEP - TSTATIONS_TIME%N_CUR = TSTATIONS_TIME%N_CUR + 1 - IN = TSTATIONS_TIME%N_CUR - tstations_time%tpdates(in) = tdtcur -ELSE - !No station storage at this time step - RETURN -END IF +CALL STATPROF_INSTANT( TSTATIONS_TIME, IN ) +IF ( IN < 1 ) RETURN !No profiler storage at this time step ! !---------------------------------------------------------------------------- ! diff --git a/src/MNH/statprof_tools.f90 b/src/MNH/statprof_tools.f90 index ca8ff988c741378f68ac7bacd6aca4963d0b4eb2..3c19593bb9104d982bf29be3581b9bd6d47c12e6 100644 --- a/src/MNH/statprof_tools.f90 +++ b/src/MNH/statprof_tools.f90 @@ -13,7 +13,7 @@ MODULE MODE_STATPROF_TOOLS ! ################### -USE MODD_TYPE_STATPROF, ONLY: TPROFILERDATA, TSTATIONDATA, TSTATPROFDATA +USE MODD_TYPE_STATPROF, ONLY: TPROFILERDATA, TSTATIONDATA, TSTATPROFDATA, TSTATPROFTIME IMPLICIT NONE @@ -25,6 +25,7 @@ PUBLIC :: STATPROF_POSITION PUBLIC :: PROFILER_ADD, STATION_ADD PUBLIC :: STATPROF_INTERP_2D, STATPROF_INTERP_2D_U, STATPROF_INTERP_2D_V PUBLIC :: STATPROF_INTERP_3D, STATPROF_INTERP_3D_U, STATPROF_INTERP_3D_V +PUBLIC :: STATPROF_INSTANT CONTAINS @@ -723,5 +724,40 @@ FUNCTION STATPROF_INTERP_3D_V( TPSTATPROF, PA ) RESULT( PB ) END FUNCTION STATPROF_INTERP_3D_V +! ################################################# +SUBROUTINE STATPROF_INSTANT( TPSTATPROF_TIME, KIN ) +! ################################################# + USE MODD_DYN_n, ONLY: XTSTEP + USE MODD_PARAMETERS, ONLY: XUNDEF + USE MODD_TIME_n, ONLY: TDTCUR + + USE MODE_MSG + + IMPLICIT NONE + + TYPE(TSTATPROFTIME), INTENT(INOUT) :: TPSTATPROF_TIME + INTEGER, INTENT(OUT) :: KIN ! Current step of storage + + IF ( TPSTATPROF_TIME%XTIME_CUR == XUNDEF ) TPSTATPROF_TIME%XTIME_CUR = TPSTATPROF_TIME%XTSTEP - XTSTEP + + TPSTATPROF_TIME%XTIME_CUR = TPSTATPROF_TIME%XTIME_CUR + XTSTEP + + IF ( TPSTATPROF_TIME%XTIME_CUR >= TPSTATPROF_TIME%XTSTEP - 1.E-10 ) THEN + TPSTATPROF_TIME%XTIME_CUR = TPSTATPROF_TIME%XTIME_CUR - TPSTATPROF_TIME%XTSTEP + TPSTATPROF_TIME%N_CUR = TPSTATPROF_TIME%N_CUR + 1 + KIN = TPSTATPROF_TIME%N_CUR + + IF ( KIN < 1 .OR. KIN > SIZE( TPSTATPROF_TIME%TPDATES ) ) THEN + CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'STATPROF_INSTANT', 'problem with step of storage' ) + KIN = -2 + ELSE + TPSTATPROF_TIME%TPDATES(KIN) = TDTCUR + END IF + ELSE + ! Return an invalid step number + KIN = -1 + END IF + +END SUBROUTINE STATPROF_INSTANT END MODULE MODE_STATPROF_TOOLS