frun_GR6J.f 8.14 KiB
      SUBROUTINE frun_GR6J(
                                 !inputs
     &                             LInputs      , ! [integer] length of input and output series
     &                             InputsPrecip , ! [double]  input series of total precipitation [mm]
     &                             InputsPE     , ! [double]  input series PE [mm]
     &                             NParam       , ! [integer] number of model parameter
     &                             Param        , ! [double]  parameter set
     &                             NStates      , ! [integer] number of state variables used for model initialising
     &                             StateStart   , ! [double]  state variables used when the model run starts (reservoir levels [mm] and HU)
     &                             NOutputs     , ! [integer] number of output series
     &                             IndOutputs   , ! [integer] indices of output series
                                 !outputs
     &                             Outputs      , ! [double]  output series
     &                             StateEnd     ) ! [double]  state variables at the end of the model run  (reservoir levels [mm] and HU)
      !DEC$ ATTRIBUTES DLLEXPORT :: frun_gr6j
      Implicit None
      !### input and output variables
      integer, intent(in) :: LInputs,NParam,NStates,NOutputs
      doubleprecision, dimension(LInputs)  :: InputsPrecip
      doubleprecision, dimension(LInputs)  :: InputsPE
      doubleprecision, dimension(NParam)   :: Param
      doubleprecision, dimension(NStates)  :: StateStart
      doubleprecision, dimension(NStates)  :: StateEnd
      integer, dimension(NOutputs) :: IndOutputs
      doubleprecision, dimension(LInputs,NOutputs) :: Outputs
      !parameters, internal states and variables
      integer NPX,NH,NMISC
      parameter (NPX=14,NH=20,NMISC=30)
      doubleprecision X(5*NH+7),XV(3*NPX+5*NH)
      doubleprecision MISC(NMISC)
      doubleprecision D
      doubleprecision P1,E,Q
      integer I,K
      !--------------------------------------------------------------
      !Initialisations
      !--------------------------------------------------------------
      !initilisation of model states to zero
      X=0.
      XV=0.
      !initilisation of model states using StateStart
      DO I=1,3*NH
      X(I)=StateStart(I)
      ENDDO
      !parameter values
      !Param(1) : production store capacity (X1 - PROD) [mm]
      !Param(2) : intercatchment exchange constant (X2 - CES1) [mm/d]
      !Param(3) : routing store capacity (X3 - ROUT) [mm]
      !Param(4) : time constant of unit hydrograph (X4 - TB) [d]
      !Param(5) : intercatchment exchange constant (X5 - CES2) [-]
      !Param(6) : time constant of exponential store (X6 - EXP) [d]
      !computation of HU ordinates
      D=2.5
      CALL HU1(XV,Param(4),D)
      CALL HU2(XV,Param(4),D)
      !initialisation of model outputs
      Q = -999.999
      MISC = -999.999
7172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
c StateEnd = -999.999 !initialisation made in R c Outputs = -999.999 !initialisation made in R !-------------------------------------------------------------- !Time loop !-------------------------------------------------------------- DO k=1,LInputs P1=InputsPrecip(k) E =InputsPE(k) c Q = -999.999 c MISC = -999.999 !model run on one time-step CALL MOD_GR6J(X,XV,Param,P1,E,Q,MISC) !storage of outputs DO I=1,NOutputs Outputs(k,I)=MISC(IndOutputs(I)) ENDDO ENDDO !model states at the end of the run DO K=1,3*NH StateEnd(K)=X(K) ENDDO RETURN ENDSUBROUTINE c################################################################################################################################ C********************************************************************** SUBROUTINE MOD_GR6J(X,XV,Param,P1,E,Q,MISC) C Run on a single time-step with the GR6J model C Inputs: C X Vector of model states at the beginning of the time-step [mm] C XV Vector of model states at the beginning of the time-step [mm] C Param Vector of model parameters [mixed units] C P1 Value of rainfall during the time-step [mm] C E Value of potential evapotranspiration during the time-step [mm] C Outputs: C X Vector of model states at the end of the time-step [mm] C XV Vector of model states at the end of the time-step [mm] C Q Value of simulated flow at the catchment outlet for the time-step [mm] C MISC Vector of model outputs for the time-step [mm] C********************************************************************** Implicit None INTEGER NPX,NH,NMISC,NParam PARAMETER (NPX=14,NH=20,NMISC=30) PARAMETER (NParam=6) DOUBLEPRECISION X(5*NH+7),XV(3*NPX+5*NH) DOUBLEPRECISION Param(NParam) DOUBLEPRECISION MISC(NMISC) DOUBLEPRECISION P1,E,Q DOUBLEPRECISION A,B,C,EN,ER,PN,PR,PS,WS,tanHyp,AR DOUBLEPRECISION PERC,PRHU1,PRHU2,EXCH,QR,QD,QR1 DOUBLEPRECISION AE,AEXCH1,AEXCH2 INTEGER K DATA B/0.9/ DATA C/0.4/ A=Param(1)
141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
C Production store IF(P1.LE.E) THEN EN=E-P1 PN=0. WS=EN/A IF(WS.GT.13)WS=13. ER=X(2)*(2.-X(2)/A)*tanHyp(WS)/(1.+(1.-X(2)/A)*tanHyp(WS)) AE=ER+P1 IF(X(2).LT.ER) AE=X(2)+P1 X(2)=X(2)-ER PR=0. ELSE EN=0. AE=E PN=P1-E WS=PN/A IF(WS.GT.13)WS=13. PS=A*(1.-(X(2)/A)**2.)*tanHyp(WS)/(1.+X(2)/A*tanHyp(WS)) PR=PN-PS X(2)=X(2)+PS ENDIF C Percolation from production store IF(X(2).LT.0.)X(2)=0. PERC=X(2)*(1.-(1.+(X(2)/(9./4.*Param(1)))**4.)**(-0.25)) X(2)=X(2)-PERC PR=PR+PERC PRHU1=PR*B PRHU2=PR*(1.-B) C Unit hydrograph HU1 DO K=1,MAX(1,MIN(NH-1,INT(Param(4)+1))) X(7+K)=X(8+K)+XV(3*NPX+K)*PRHU1 ENDDO X(7+NH)=XV(3*NPX+NH)*PRHU1 C Unit hydrograph HU2 DO K=1,MAX(1,MIN(2*NH-1,2*INT(Param(4)+1))) X(7+NH+K)=X(8+NH+K)+XV(3*NPX+NH+K)*PRHU2 ENDDO X(7+3*NH)=XV(3*NPX+3*NH)*PRHU2 C Potential intercatchment semi-exchange EXCH=Param(2)*(X(1)/Param(3)-Param(5)) C Routing store AEXCH1=EXCH IF((X(1)+X(8)+EXCH).LT.0) AEXCH1=-X(1)-X(8) X(1)=X(1)+(1-C)*X(8)+EXCH IF(X(1).LT.0.)X(1)=0. QR=X(1)*(1.-(1.+(X(1)/Param(3))**4.)**(-1./4.)) X(1)=X(1)-QR C Update of exponential store X(6)=X(6)+C*X(8)+EXCH AR=X(6)/Param(6) IF(AR.GT.33.)AR=33. IF(AR.LT.-33.)AR=-33. IF(AR.GT.7.)THEN QR1=X(6)+Param(6)/EXP(AR) GOTO 3 ENDIF IF(AR.LT.-7.)THEN QR1=Param(6)*EXP(AR)
211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250
GOTO 3 ENDIF QR1=Param(6)*LOG(EXP(AR)+1.) 3 CONTINUE X(6)=X(6)-QR1 C Runoff from direct branch QD AEXCH2=EXCH IF((X(8+NH)+EXCH).LT.0) AEXCH2=-X(8+NH) QD=MAX(0.,X(8+NH)+EXCH) C Total runoff Q=QR+QD+QR1 IF(Q.LT.0.) Q=0. C Variables storage MISC( 1)=E ! PE ! potential evapotranspiration [mm/d] MISC( 2)=P1 ! Precip ! total precipitation [mm/d] MISC( 3)=X(2) ! Prod ! production store level (X(2)) [mm] MISC( 4)=AE ! AE ! actual evapotranspiration [mm/d] MISC( 5)=PERC ! Perc ! percolation (PERC) [mm] MISC( 6)=PR ! PR ! PR=PN-PS+PERC [mm] MISC( 7)=X(8) ! Q9 ! outflow from HU1 (Q9) [mm/d] MISC( 8)=X(8+NH) ! Q1 ! outflow from HU2 (Q1) [mm/d] MISC( 9)=X(1) ! Rout ! routing store level (X(1)) [mm] MISC(10)=EXCH ! Exch ! potential semi-exchange between catchments (EXCH) [mm/d] MISC(11)=AEXCH1+AEXCH2 ! AExch ! actual total exchange between catchments (AEXCH1+AEXCH2) [mm/d] MISC(12)=QR ! QR ! outflow from routing store (QR) [mm/d] MISC(13)=QR1 ! QR1 ! outflow from exponential store (QR1) [mm/d] MISC(14)=X(6) ! Exp ! exponential store level (X(6)) (negative) [mm] MISC(15)=QD ! QD ! outflow from HU2 branch after exchange (QD) [mm/d] MISC(16)=Q ! Qsim ! outflow at catchment outlet [mm/d] ENDSUBROUTINE