-
Delaigue Olivier authored23af6c18
Forked from
HYCAR-Hydro / airGR
1601 commits behind the upstream repository.
SUBROUTINE frun_CEMANEIGE(
!inputs
& LInputs , ! [integer] length of input and output series
& InputsPrecip , ! [double] input series of total precipitation [mm]
& InputsFracSolidPrecip, ! [double] input series of fraction of solid precipitation [0-1]
& InputsTemp , ! [double] input series of air mean temperature [degC]
& MeanAnSolidPrecip , ! [double] value of annual mean solid precip [mm/y]
& NParam , ! [integer] number of model parameter
& Param , ! [double] parameter set
& NStates , ! [integer] number of state variables used for model initialising = 2
& StateStart , ! [double] state variables used when the model run starts
& 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
!DEC$ ATTRIBUTES DLLEXPORT :: frun_CemaNeige
Implicit None
!### input and output variables
integer, intent(in) :: LInputs,NParam,NStates,NOutputs
doubleprecision, intent(in) :: MeanAnSolidPrecip
doubleprecision, dimension(LInputs) :: InputsPrecip
doubleprecision, dimension(LInputs) :: InputsFracSolidPrecip
doubleprecision, dimension(LInputs) :: InputsTemp
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
doubleprecision CTG,Kf
doubleprecision G,eTG,PliqAndMelt
doubleprecision Tmelt,Gthreshold,MinSpeed
doubleprecision Pliq,Psol,Gratio,PotMelt,Melt
integer I,K
!--------------------------------------------------------------
!Initialisations
!--------------------------------------------------------------
!initilisation des constantes
Tmelt=0
Gthreshold=0.9*MeanAnSolidPrecip
MinSpeed=0.1
!initilisation of model states using StateStart
G=StateStart(1)
eTG=StateStart(2)
PliqAndMelt=0
!setting parameter values
CTG=Param(1)
Kf=Param(2)
!initialisation of model outputs
c StateEnd = -999.999 !initialisation made in R
c Outputs = -999.999 !initialisation made in R
!--------------------------------------------------------------
!Time loop
!--------------------------------------------------------------
7172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
DO k=1,LInputs
!SolidPrecip and LiquidPrecip
Pliq=(1-InputsFracSolidPrecip(k))*InputsPrecip(k)
Psol=InputsFracSolidPrecip(k)*InputsPrecip(k)
!Snow pack volume before melt
G=G+Psol
!Snow pack thermal state before melt
eTG=CTG*eTG + (1-CTG)*InputsTemp(k)
IF(eTG.GT.0) eTG=0
!Potential melt
IF(eTG.EQ.0.AND.InputsTemp(k).GT.Tmelt) THEN
PotMelt=Kf*(InputsTemp(k)-Tmelt)
IF(PotMelt.GT.G) PotMelt=G
ELSE
PotMelt=0
ENDIF
!Gratio
IF(G.LT.Gthreshold) THEN
Gratio=G/Gthreshold
ELSE
Gratio=1
ENDIF
!Actual melt
Melt=((1-MinSpeed)*Gratio+MinSpeed)*PotMelt
!Update of snow pack volume
G=G-Melt
!Update of Gratio
IF(G.LT.Gthreshold) THEN
Gratio=G/Gthreshold
ELSE
Gratio=1
ENDIF
!Water volume to pass to the hydrological model
PliqAndMelt=Pliq+Melt
!Storage of outputs
DO I=1,NOutputs
IF(IndOutputs(I).EQ.1) Outputs(k,I)=Pliq
IF(IndOutputs(I).EQ.2) Outputs(k,I)=Psol
IF(IndOutputs(I).EQ.3) Outputs(k,I)=G
IF(IndOutputs(I).EQ.4) Outputs(k,I)=eTG
IF(IndOutputs(I).EQ.5) Outputs(k,I)=Gratio
IF(IndOutputs(I).EQ.6) Outputs(k,I)=PotMelt
IF(IndOutputs(I).EQ.7) Outputs(k,I)=Melt
IF(IndOutputs(I).EQ.8) Outputs(k,I)=PliqAndMelt
ENDDO
ENDDO
StateEnd(1)=G
StateEnd(2)=eTG
RETURN
ENDSUBROUTINE