Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
HYCAR-Hydro
airGR
Commits
ccafecdc
Commit
ccafecdc
authored
Feb 25, 2019
by
Delaigue Olivier
Browse files
v1.2.6.0 MERGE: branch 'CNHyst'
parents
2dec31be
607faaee
Changes
19
Hide whitespace changes
Inline
Side-by-side
DESCRIPTION
View file @
ccafecdc
Package: airGR
Type: Package
Title: Suite of GR Hydrological Models for Precipitation-Runoff Modelling
Version: 1.
1.3.11
Date: 2019-02-2
1
Version: 1.
2.6.0
Date: 2019-02-2
5
Authors@R: c(
person("Laurent", "Coron", role = c("aut", "trl"), comment = c(ORCID = "0000-0002-1503-6204")),
person("Charles", "Perrin", role = c("aut", "ths"), comment = c(ORCID = "0000-0001-8552-1881")),
...
...
NAMESPACE
View file @
ccafecdc
...
...
@@ -43,6 +43,7 @@ export(RunModel_GR6J)
export(SeriesAggreg)
export(TransfoParam)
export(TransfoParam_CemaNeige)
export(TransfoParam_CemaNeigeHyst)
export(TransfoParam_GR1A)
export(TransfoParam_GR2M)
export(TransfoParam_GR4H)
...
...
NEWS.rmd
View file @
ccafecdc
...
...
@@ -13,7 +13,7 @@ output:
### 1.
1.3.11
Release Notes (2019-02-2
1)
### 1.
2.6.0
Release Notes (2019-02-2
5)
...
...
R/Calibration_Michel.R
View file @
ccafecdc
...
...
@@ -54,19 +54,25 @@ Calibration_Michel <- function(InputsModel, RunOptions, InputsCrit, CalibOptions
FUN_TRANSFO
<-
TransfoParam_GR1A
}
if
(
identical
(
FUN_MOD
,
RunModel_CemaNeige
))
{
FUN_TRANSFO
<-
TransfoParam_CemaNeige
if
(
inherits
(
FUN_MOD
,
"hysteresis"
))
{
FUN_TRANSFO
<-
TransfoParam_CemaNeigeHyst
}
else
{
FUN_TRANSFO
<-
TransfoParam_CemaNeige
}
}
if
(
identical
(
FUN_MOD
,
RunModel_CemaNeigeGR4J
)
|
identical
(
FUN_MOD
,
RunModel_CemaNeigeGR5J
)
|
identical
(
FUN_MOD
,
RunModel_CemaNeigeGR6J
))
{
if
(
identical
(
FUN_MOD
,
RunModel_CemaNeigeGR4J
))
{
FUN1
<-
TransfoParam_GR4J
FUN2
<-
TransfoParam_CemaNeige
}
if
(
identical
(
FUN_MOD
,
RunModel_CemaNeigeGR5J
))
{
FUN1
<-
TransfoParam_GR5J
FUN2
<-
TransfoParam_CemaNeige
}
if
(
identical
(
FUN_MOD
,
RunModel_CemaNeigeGR6J
))
{
FUN1
<-
TransfoParam_GR6J
}
if
(
inherits
(
FUN_MOD
,
"hysteresis"
))
{
FUN2
<-
TransfoParam_CemaNeigeHyst
}
else
{
FUN2
<-
TransfoParam_CemaNeige
}
FUN_TRANSFO
<-
function
(
ParamIn
,
Direction
)
{
...
...
R/CreateIniStates.R
View file @
ccafecdc
...
...
@@ -2,6 +2,7 @@ CreateIniStates <- function(FUN_MOD, InputsModel,
ProdStore
=
350
,
RoutStore
=
90
,
ExpStore
=
NULL
,
UH1
=
NULL
,
UH2
=
NULL
,
GCemaNeigeLayers
=
NULL
,
eTGCemaNeigeLayers
=
NULL
,
GthrCemaNeigeLayers
=
NULL
,
GlocmaxCemaNeigeLayers
=
NULL
,
verbose
=
TRUE
)
{
...
...
@@ -181,7 +182,13 @@ CreateIniStates <- function(FUN_MOD, InputsModel,
if
(
is.null
(
eTGCemaNeigeLayers
))
{
eTGCemaNeigeLayers
<-
rep
(
Inf
,
NLayers
)
}
if
(
is.null
(
GthrCemaNeigeLayers
))
{
GthrCemaNeigeLayers
<-
rep
(
Inf
,
NLayers
)
}
if
(
is.null
(
GlocmaxCemaNeigeLayers
))
{
GlocmaxCemaNeigeLayers
<-
rep
(
Inf
,
NLayers
)
}
cat
(
GCemaNeigeLayers
)
# check negative values
if
(
any
(
ProdStore
<
0
)
|
any
(
RoutStore
<
0
)
|
...
...
@@ -224,7 +231,8 @@ CreateIniStates <- function(FUN_MOD, InputsModel,
## format output
IniStates
<-
list
(
Store
=
list
(
Prod
=
ProdStore
,
Rout
=
RoutStore
,
Exp
=
ExpStore
),
UH
=
list
(
UH1
=
UH1
,
UH2
=
UH2
),
CemaNeigeLayers
=
list
(
G
=
GCemaNeigeLayers
,
eTG
=
eTGCemaNeigeLayers
))
CemaNeigeLayers
=
list
(
G
=
GCemaNeigeLayers
,
eTG
=
eTGCemaNeigeLayers
,
Gthr
=
GthrCemaNeigeLayers
,
Glocmax
=
GlocmaxCemaNeigeLayers
))
IniStatesNA
<-
unlist
(
IniStates
)
IniStatesNA
[
is.infinite
(
IniStatesNA
)]
<-
NA
IniStatesNA
<-
relist
(
IniStatesNA
,
skeleton
=
IniStates
)
...
...
R/CreateInputsCrit.R
View file @
ccafecdc
...
...
@@ -148,12 +148,6 @@ CreateInputsCrit <- function(FUN_CRIT,
}
## check 'obs'
# lapply(iListArgs2$obs, function(iObs) {
# if (!is.vector(iObs) | length(iObs) != LLL | !is.numeric(iObs)) {
# stop(sprintf("'obs' must be a (list of) vector(s) of numeric values of length %i \n", LLL), call. = FALSE)
# return(NULL)
# }
# })
if
(
!
is.vector
(
iListArgs2
$
obs
)
|
length
(
iListArgs2
$
obs
)
!=
LLL
|
!
is.numeric
(
iListArgs2
$
obs
))
{
stop
(
sprintf
(
"'obs' must be a (list of) vector(s) of numeric values of length %i \n"
,
LLL
),
call.
=
FALSE
)
return
(
NULL
)
...
...
R/CreateRunOptions.R
View file @
ccafecdc
...
...
@@ -208,7 +208,7 @@ CreateRunOptions <- function(FUN_MOD, InputsModel, IndPeriod_WarmUp = NULL, IndP
NState
<-
7
+
3
*
24
*
20
}
if
(
"daily"
%in%
ObjectClass
)
{
NState
<-
7
+
3
*
20
+
2
*
NLayers
NState
<-
7
+
3
*
20
+
4
*
NLayers
}
if
(
"monthly"
%in%
ObjectClass
)
{
NState
<-
2
...
...
@@ -290,7 +290,7 @@ CreateRunOptions <- function(FUN_MOD, InputsModel, IndPeriod_WarmUp = NULL, IndP
Outputs_all
<-
c
(
Outputs_all
,
"PotEvap"
,
"Precip"
,
"Qsim"
)
}
if
(
"CemaNeige"
%in%
ObjectClass
)
{
Outputs_all
<-
c
(
Outputs_all
,
"Pliq"
,
"Psol"
,
"SnowPack"
,
"ThermalState"
,
"Gratio"
,
"PotMelt"
,
"Melt"
,
"PliqAndMelt"
,
"Temp"
)
Outputs_all
<-
c
(
Outputs_all
,
"Pliq"
,
"Psol"
,
"SnowPack"
,
"ThermalState"
,
"Gratio"
,
"PotMelt"
,
"Melt"
,
"PliqAndMelt"
,
"Temp"
,
"Gthreshold"
,
"Glocalmax"
)
}
##check_Outputs_Sim
...
...
R/RunModel_CemaNeige.R
View file @
ccafecdc
RunModel_CemaNeige
<-
function
(
InputsModel
,
RunOptions
,
Param
)
{
RunModel_CemaNeige
<-
function
(
InputsModel
,
RunOptions
,
Param
,
IsHyst
=
FALSE
)
{
## Arguments_check
if
(
!
is.logical
(
IsHyst
)
|
length
(
IsHyst
)
!=
1L
)
{
stop
(
"'IsHyst' must be a 'logical' of length 1"
)
return
(
NULL
)
}
NParam
<-
2L
## Initialization of variables
NParam
<-
ifelse
(
IsHyst
,
4L
,
2L
)
NStates
<-
4L
FortranOutputsCemaNeige
<-
c
(
"Pliq"
,
"Psol"
,
"SnowPack"
,
"ThermalState"
,
"Gratio"
,
"PotMelt"
,
"Melt"
,
"PliqAndMelt"
,
"Temp"
)
"PotMelt"
,
"Melt"
,
"PliqAndMelt"
,
"Temp"
,
"Gthreshold"
,
"Glocalmax"
)
...
...
@@ -47,7 +57,7 @@ RunModel_CemaNeige <- function(InputsModel, RunOptions, Param) {
ExportDatesR
<-
"DatesR"
%in%
RunOptions
$
Outputs_Sim
ExportStateEnd
<-
"StateEnd"
%in%
RunOptions
$
Outputs_Sim
...
...
@@ -81,17 +91,18 @@ RunModel_CemaNeige <- function(InputsModel, RunOptions, Param) {
InputsFracSolidPrecip
=
InputsModel
$
LayerFracSolidPrecip
[[
iLayer
]][
IndPeriod1
],
### input series of fraction of solid precipitation [0-1]
InputsTemp
=
InputsModel
$
LayerTemp
[[
iLayer
]][
IndPeriod1
],
### input series of air mean temperature [degC]
MeanAnSolidPrecip
=
RunOptions
$
MeanAnSolidPrecip
[
iLayer
],
### value of annual mean solid precip [mm/y]
NParam
=
as.integer
(
2
),
### number of model parameter
= 2
NParam
=
as.integer
(
NParam
),
### number of model parameter
Param
=
as.double
(
ParamCemaNeige
),
### parameter set
NStates
=
as.integer
(
2
),
### number of state variables used for model initialising
= 2
NStates
=
as.integer
(
NStates
),
### number of state variables used for model initialising
StateStart
=
StateStartCemaNeige
,
### state variables used when the model run starts
IsHyst
=
as.integer
(
IsHyst
),
### use of hysteresis
NOutputs
=
as.integer
(
length
(
IndOutputsCemaNeige
)),
### number of output series
IndOutputs
=
IndOutputsCemaNeige
,
### indices of output series
## outputs
Outputs
=
matrix
(
-999.999
,
### output series [mm]
nrow
=
length
(
IndPeriod1
),
ncol
=
length
(
IndOutputsCemaNeige
)),
StateEnd
=
rep
(
-999.999
,
2
)
### state variables at the end of the model run (reservoir levels [mm] and HU)
StateEnd
=
rep
(
-999.999
,
NStates
)
### state variables at the end of the model run (reservoir levels [mm] and HU)
)
RESULTS
$
Outputs
[
round
(
RESULTS
$
Outputs
,
3
)
==
-999.999
]
<-
NA
RESULTS
$
StateEnd
[
round
(
RESULTS
$
StateEnd
,
3
)
==
-999.999
]
<-
NA
...
...
@@ -112,11 +123,14 @@ RunModel_CemaNeige <- function(InputsModel, RunOptions, Param) {
names
(
CemaNeigeLayers
)
<-
sprintf
(
"Layer%02i"
,
seq_len
(
NLayers
))
if
(
ExportStateEnd
)
{
idNStates
<-
seq_len
(
NStates
*
NLayers
)
%%
NStates
CemaNeigeStateEnd
<-
CreateIniStates
(
FUN_MOD
=
RunModel_CemaNeige
,
InputsModel
=
InputsModel
,
ProdStore
=
NULL
,
RoutStore
=
NULL
,
ExpStore
=
NULL
,
UH1
=
NULL
,
UH2
=
NULL
,
GCemaNeigeLayers
=
CemaNeigeStateEnd
[
seq_len
(
2
*
NLayers
)[
seq_len
(
2
*
NLayers
)
%%
2
==
1
]],
eTGCemaNeigeLayers
=
CemaNeigeStateEnd
[
seq_len
(
2
*
NLayers
)[
seq_len
(
2
*
NLayers
)
%%
2
==
0
]],
GCemaNeigeLayers
=
CemaNeigeStateEnd
[
seq_len
(
NStates
*
NLayers
)[
idNStates
==
3
]],
eTGCemaNeigeLayers
=
CemaNeigeStateEnd
[
seq_len
(
NStates
*
NLayers
)[
idNStates
==
2
]],
GthrCemaNeigeLayers
=
CemaNeigeStateEnd
[
seq_len
(
NStates
*
NLayers
)[
idNStates
==
1
]],
GlocmaxCemaNeigeLayers
=
CemaNeigeStateEnd
[
seq_len
(
NStates
*
NLayers
)[
idNStates
==
0
]],
verbose
=
FALSE
)
}
...
...
@@ -145,6 +159,9 @@ RunModel_CemaNeige <- function(InputsModel, RunOptions, Param) {
## End
class
(
OutputsModel
)
<-
c
(
"OutputsModel"
,
"daily"
,
"CemaNeige"
)
if
(
IsHyst
)
{
class
(
OutputsModel
)
<-
c
(
class
(
OutputsModel
),
"hysteresis"
)
}
return
(
OutputsModel
)
}
R/RunModel_CemaNeigeGR4J.R
View file @
ccafecdc
RunModel_CemaNeigeGR4J
<-
function
(
InputsModel
,
RunOptions
,
Param
){
RunModel_CemaNeigeGR4J
<-
function
(
InputsModel
,
RunOptions
,
Param
,
IsHyst
=
FALSE
){
NParam
<-
6
;
FortranOutputsCemaNeige
<-
c
(
"Pliq"
,
"Psol"
,
"SnowPack"
,
"ThermalState"
,
"Gratio"
,
"PotMelt"
,
"Melt"
,
"PliqAndMelt"
,
"Temp"
);
## Arguments_check
if
(
!
is.logical
(
IsHyst
)
|
length
(
IsHyst
)
!=
1L
)
{
stop
(
"'IsHyst' must be a 'logical' of length 1"
)
return
(
NULL
)
}
NParam
<-
ifelse
(
IsHyst
,
8L
,
6L
)
NStates
<-
4L
FortranOutputsCemaNeige
<-
c
(
"Pliq"
,
"Psol"
,
"SnowPack"
,
"ThermalState"
,
"Gratio"
,
"PotMelt"
,
"Melt"
,
"PliqAndMelt"
,
"Temp"
,
"Gthreshold"
,
"Glocalmax"
);
FortranOutputsMod
<-
c
(
"PotEvap"
,
"Precip"
,
"Prod"
,
"Pn"
,
"Ps"
,
"AE"
,
"Perc"
,
"PR"
,
"Q9"
,
"Q1"
,
"Rout"
,
"Exch"
,
"AExch1"
,
"AExch2"
,
"AExch"
,
"QR"
,
"QD"
,
"Qsim"
);
...
...
@@ -37,11 +45,11 @@ RunModel_CemaNeigeGR4J <- function(InputsModel,RunOptions,Param){
IndPeriod1
<-
c
(
RunOptions
$
IndPeriod_WarmUp
,
RunOptions
$
IndPeriod_Run
);
LInputSeries
<-
as.integer
(
length
(
IndPeriod1
))
IndPeriod2
<-
(
length
(
RunOptions
$
IndPeriod_WarmUp
)
+1
)
:
LInputSeries
;
ParamCemaNeige
<-
Param
[(
length
(
Param
)
-1
)
:
length
(
Param
)];
NParamMod
<-
as.integer
(
length
(
Param
)
-
2
);
ParamCemaNeige
<-
Param
[(
length
(
Param
)
-1
-2
*
as.integer
(
IsHyst
)
)
:
length
(
Param
)];
NParamMod
<-
as.integer
(
length
(
Param
)
-
(
2+2
*
as.integer
(
IsHyst
))
);
ParamMod
<-
Param
[
1
:
NParamMod
];
NLayers
<-
length
(
InputsModel
$
LayerPrecip
);
NStatesMod
<-
as.integer
(
length
(
RunOptions
$
IniStates
)
-
2
*
NLayers
);
NStatesMod
<-
as.integer
(
length
(
RunOptions
$
IniStates
)
-
NStates
*
NLayers
);
ExportDatesR
<-
"DatesR"
%in%
RunOptions
$
Outputs_Sim
;
ExportStateEnd
<-
"StateEnd"
%in%
RunOptions
$
Outputs_Sim
;
...
...
@@ -52,6 +60,7 @@ RunModel_CemaNeigeGR4J <- function(InputsModel,RunOptions,Param){
}
else
{
IndOutputsCemaNeige
<-
which
(
FortranOutputsCemaNeige
%in%
RunOptions
$
Outputs_Sim
);
}
CemaNeigeLayers
<-
list
();
CemaNeigeStateEnd
<-
NULL
;
NameCemaNeigeLayers
<-
"CemaNeigeLayers"
;
##Call_DLL_CemaNeige_________________________
for
(
iLayer
in
1
:
NLayers
){
StateStartCemaNeige
<-
RunOptions
$
IniStates
[(
7+20+40
)
+
c
(
iLayer
,
iLayer
+
NLayers
)]
...
...
@@ -62,20 +71,20 @@ RunModel_CemaNeigeGR4J <- function(InputsModel,RunOptions,Param){
InputsFracSolidPrecip
=
InputsModel
$
LayerFracSolidPrecip
[[
iLayer
]][
IndPeriod1
],
### input series of fraction of solid precipitation [0-1]
InputsTemp
=
InputsModel
$
LayerTemp
[[
iLayer
]][
IndPeriod1
],
### input series of air mean temperature [degC]
MeanAnSolidPrecip
=
RunOptions
$
MeanAnSolidPrecip
[
iLayer
],
### value of annual mean solid precip [mm/y]
NParam
=
as.integer
(
2
),
### number of model parameter = 2
Param
=
ParamCemaNeige
,
### parameter set
NStates
=
as.integer
(
2
),
### number of state variables used for model initialising = 2
NParam
=
as.integer
(
NParam
),
### number of model parameter = 2
Param
=
as.double
(
ParamCemaNeige
)
,
### parameter set
NStates
=
as.integer
(
NStates
),
### number of state variables used for model initialising = 2
StateStart
=
StateStartCemaNeige
,
### state variables used when the model run starts
IsHyst
=
as.integer
(
IsHyst
),
### use of hysteresis
NOutputs
=
as.integer
(
length
(
IndOutputsCemaNeige
)),
### number of output series
IndOutputs
=
IndOutputsCemaNeige
,
### indices of output series
##outputs
Outputs
=
matrix
(
as.double
(
-999.999
),
nrow
=
LInputSeries
,
ncol
=
length
(
IndOutputsCemaNeige
)),
### output series [mm]
StateEnd
=
rep
(
as.double
(
-999.999
),
as.integer
(
2
))
### state variables at the end of the model run (reservoir levels [mm] and HU)
StateEnd
=
rep
(
as.double
(
-999.999
),
as.integer
(
NStates
))
### state variables at the end of the model run (reservoir levels [mm] and HU)
)
RESULTS
$
Outputs
[
round
(
RESULTS
$
Outputs
,
3
)
==
(
-999.999
)]
<-
NA
;
RESULTS
$
StateEnd
[
round
(
RESULTS
$
StateEnd
,
3
)
==
(
-999.999
)]
<-
NA
;
##Data_storage
CemaNeigeLayers
[[
iLayer
]]
<-
lapply
(
seq_len
(
RESULTS
$
NOutputs
),
function
(
i
)
RESULTS
$
Outputs
[
IndPeriod2
,
i
]);
names
(
CemaNeigeLayers
[[
iLayer
]])
<-
FortranOutputsCemaNeige
[
IndOutputsCemaNeige
];
...
...
@@ -85,7 +94,7 @@ RunModel_CemaNeigeGR4J <- function(InputsModel,RunOptions,Param){
if
(
ExportStateEnd
){
CemaNeigeStateEnd
<-
c
(
CemaNeigeStateEnd
,
RESULTS
$
StateEnd
);
}
rm
(
RESULTS
);
}
###ENDFOR_iLayer
names
(
CemaNeigeLayers
)
<-
paste
(
"Layer"
,
formatC
(
1
:
NLayers
,
width
=
2
,
flag
=
"0"
),
sep
=
""
);
names
(
CemaNeigeLayers
)
<-
sprintf
(
"Layer%02i"
,
seq_len
(
NLayers
))
}
###ENDIF_RunSnowModule
if
(
inherits
(
RunOptions
,
"CemaNeige"
)
==
FALSE
){
CemaNeigeLayers
<-
list
();
CemaNeigeStateEnd
<-
NULL
;
NameCemaNeigeLayers
<-
NULL
;
...
...
@@ -121,12 +130,15 @@ RunModel_CemaNeigeGR4J <- function(InputsModel,RunOptions,Param){
)
RESULTS
$
Outputs
[
round
(
RESULTS
$
Outputs
,
3
)
==
(
-999.999
)]
<-
NA
;
RESULTS
$
StateEnd
[
round
(
RESULTS
$
StateEnd
,
3
)
==
(
-999.999
)]
<-
NA
;
if
(
ExportStateEnd
)
{
if
(
ExportStateEnd
)
{
idNStates
<-
seq_len
(
NStates
*
NLayers
)
%%
NStates
RESULTS
$
StateEnd
<-
CreateIniStates
(
FUN_MOD
=
RunModel_CemaNeigeGR4J
,
InputsModel
=
InputsModel
,
ProdStore
=
RESULTS
$
StateEnd
[
1L
],
RoutStore
=
RESULTS
$
StateEnd
[
2L
],
ExpStore
=
NULL
,
UH1
=
RESULTS
$
StateEnd
[(
1
:
20
)
+7
],
UH2
=
RESULTS
$
StateEnd
[(
1
:
40
)
+
(
7+20
)],
GCemaNeigeLayers
=
CemaNeigeStateEnd
[
seq_len
(
2
*
NLayers
)[
seq_len
(
2
*
NLayers
)
%%
2
==
1
]],
eTGCemaNeigeLayers
=
CemaNeigeStateEnd
[
seq_len
(
2
*
NLayers
)[
seq_len
(
2
*
NLayers
)
%%
2
==
0
]],
GCemaNeigeLayers
=
CemaNeigeStateEnd
[
seq_len
(
NStates
*
NLayers
)[
idNStates
==
3
]],
eTGCemaNeigeLayers
=
CemaNeigeStateEnd
[
seq_len
(
NStates
*
NLayers
)[
idNStates
==
2
]],
GthrCemaNeigeLayers
=
CemaNeigeStateEnd
[
seq_len
(
NStates
*
NLayers
)[
idNStates
==
1
]],
GlocmaxCemaNeigeLayers
=
CemaNeigeStateEnd
[
seq_len
(
NStates
*
NLayers
)[
idNStates
==
0
]],
verbose
=
FALSE
)
}
...
...
@@ -161,6 +173,9 @@ RunModel_CemaNeigeGR4J <- function(InputsModel,RunOptions,Param){
##End
rm
(
RESULTS
);
class
(
OutputsModel
)
<-
c
(
"OutputsModel"
,
"daily"
,
"GR"
,
"CemaNeige"
);
if
(
IsHyst
)
{
class
(
OutputsModel
)
<-
c
(
class
(
OutputsModel
),
"hysteresis"
)
}
return
(
OutputsModel
);
}
...
...
R/RunModel_CemaNeigeGR5J.R
View file @
ccafecdc
RunModel_CemaNeigeGR5J
<-
function
(
InputsModel
,
RunOptions
,
Param
){
NParam
<-
7
;
FortranOutputsCemaNeige
<-
c
(
"Pliq"
,
"Psol"
,
"SnowPack"
,
"ThermalState"
,
"Gratio"
,
"PotMelt"
,
"Melt"
,
"PliqAndMelt"
,
"Temp"
);
RunModel_CemaNeigeGR5J
<-
function
(
InputsModel
,
RunOptions
,
Param
,
IsHyst
=
FALSE
){
## Arguments_check
if
(
!
is.logical
(
IsHyst
)
|
length
(
IsHyst
)
!=
1L
)
{
stop
(
"'IsHyst' must be a 'logical' of length 1"
)
return
(
NULL
)
}
NParam
<-
ifelse
(
IsHyst
,
9L
,
7L
)
NStates
<-
4L
FortranOutputsCemaNeige
<-
c
(
"Pliq"
,
"Psol"
,
"SnowPack"
,
"ThermalState"
,
"Gratio"
,
"PotMelt"
,
"Melt"
,
"PliqAndMelt"
,
"Temp"
,
"Gthreshold"
,
"Glocalmax"
);
FortranOutputsMod
<-
c
(
"PotEvap"
,
"Precip"
,
"Prod"
,
"Pn"
,
"Ps"
,
"AE"
,
"Perc"
,
"PR"
,
"Q9"
,
"Q1"
,
"Rout"
,
"Exch"
,
"AExch1"
,
"AExch2"
,
"AExch"
,
"QR"
,
"QD"
,
"Qsim"
);
"AExch1"
,
"AExch2"
,
"AExch"
,
"QR"
,
"QD"
,
"Qsim"
);
##Arguments_check
if
(
inherits
(
InputsModel
,
"InputsModel"
)
==
FALSE
){
stop
(
"InputsModel must be of class 'InputsModel' \n"
);
return
(
NULL
);
}
...
...
@@ -37,11 +45,11 @@ RunModel_CemaNeigeGR5J <- function(InputsModel,RunOptions,Param){
IndPeriod1
<-
c
(
RunOptions
$
IndPeriod_WarmUp
,
RunOptions
$
IndPeriod_Run
);
LInputSeries
<-
as.integer
(
length
(
IndPeriod1
))
IndPeriod2
<-
(
length
(
RunOptions
$
IndPeriod_WarmUp
)
+1
)
:
LInputSeries
;
ParamCemaNeige
<-
Param
[(
length
(
Param
)
-1
)
:
length
(
Param
)];
NParamMod
<-
as.integer
(
length
(
Param
)
-
2
);
ParamCemaNeige
<-
Param
[(
length
(
Param
)
-1
-2
*
as.integer
(
IsHyst
)
)
:
length
(
Param
)];
NParamMod
<-
as.integer
(
length
(
Param
)
-
(
2+2
*
as.integer
(
IsHyst
))
);
ParamMod
<-
Param
[
1
:
NParamMod
];
NLayers
<-
length
(
InputsModel
$
LayerPrecip
);
NStatesMod
<-
as.integer
(
length
(
RunOptions
$
IniStates
)
-
2
*
NLayers
);
NStatesMod
<-
as.integer
(
length
(
RunOptions
$
IniStates
)
-
NStates
*
NLayers
);
ExportDatesR
<-
"DatesR"
%in%
RunOptions
$
Outputs_Sim
;
ExportStateEnd
<-
"StateEnd"
%in%
RunOptions
$
Outputs_Sim
;
...
...
@@ -52,6 +60,7 @@ RunModel_CemaNeigeGR5J <- function(InputsModel,RunOptions,Param){
}
else
{
IndOutputsCemaNeige
<-
which
(
FortranOutputsCemaNeige
%in%
RunOptions
$
Outputs_Sim
);
}
CemaNeigeLayers
<-
list
();
CemaNeigeStateEnd
<-
NULL
;
NameCemaNeigeLayers
<-
"CemaNeigeLayers"
;
##Call_DLL_CemaNeige_________________________
for
(
iLayer
in
1
:
NLayers
){
StateStartCemaNeige
<-
RunOptions
$
IniStates
[(
7+20+40
)
+
c
(
iLayer
,
iLayer
+
NLayers
)]
...
...
@@ -62,15 +71,16 @@ RunModel_CemaNeigeGR5J <- function(InputsModel,RunOptions,Param){
InputsFracSolidPrecip
=
InputsModel
$
LayerFracSolidPrecip
[[
iLayer
]][
IndPeriod1
],
### input series of fraction of solid precipitation [0-1]
InputsTemp
=
InputsModel
$
LayerTemp
[[
iLayer
]][
IndPeriod1
],
### input series of air mean temperature [degC]
MeanAnSolidPrecip
=
RunOptions
$
MeanAnSolidPrecip
[
iLayer
],
### value of annual mean solid precip [mm/y]
NParam
=
as.integer
(
2
),
### number of model parameter = 2
Param
=
ParamCemaNeige
,
### parameter set
NStates
=
as.integer
(
2
),
### number of state variables used for model initialising = 2
NParam
=
as.integer
(
NParam
),
### number of model parameter = 2
Param
=
as.double
(
ParamCemaNeige
)
,
### parameter set
NStates
=
as.integer
(
NStates
),
### number of state variables used for model initialising = 2
StateStart
=
StateStartCemaNeige
,
### state variables used when the model run starts
IsHyst
=
as.integer
(
IsHyst
),
### use of hysteresis
NOutputs
=
as.integer
(
length
(
IndOutputsCemaNeige
)),
### number of output series
IndOutputs
=
IndOutputsCemaNeige
,
### indices of output series
##outputs
Outputs
=
matrix
(
as.double
(
-999.999
),
nrow
=
LInputSeries
,
ncol
=
length
(
IndOutputsCemaNeige
)),
### output series [mm]
StateEnd
=
rep
(
as.double
(
-999.999
),
as.integer
(
2
))
### state variables at the end of the model run (reservoir levels [mm] and HU)
StateEnd
=
rep
(
as.double
(
-999.999
),
as.integer
(
NStates
))
### state variables at the end of the model run (reservoir levels [mm] and HU)
)
RESULTS
$
Outputs
[
round
(
RESULTS
$
Outputs
,
3
)
==
(
-999.999
)]
<-
NA
;
RESULTS
$
StateEnd
[
round
(
RESULTS
$
StateEnd
,
3
)
==
(
-999.999
)]
<-
NA
;
...
...
@@ -84,7 +94,7 @@ RunModel_CemaNeigeGR5J <- function(InputsModel,RunOptions,Param){
if
(
ExportStateEnd
){
CemaNeigeStateEnd
<-
c
(
CemaNeigeStateEnd
,
RESULTS
$
StateEnd
);
}
rm
(
RESULTS
);
}
###ENDFOR_iLayer
names
(
CemaNeigeLayers
)
<-
paste
(
"Layer"
,
formatC
(
1
:
NLayers
,
width
=
2
,
flag
=
"0"
),
sep
=
""
);
names
(
CemaNeigeLayers
)
<-
sprintf
(
"Layer%02i"
,
seq_len
(
NLayers
))
}
###ENDIF_RunSnowModule
if
(
inherits
(
RunOptions
,
"CemaNeige"
)
==
FALSE
){
CemaNeigeLayers
<-
list
();
CemaNeigeStateEnd
<-
NULL
;
NameCemaNeigeLayers
<-
NULL
;
...
...
@@ -121,11 +131,14 @@ RunModel_CemaNeigeGR5J <- function(InputsModel,RunOptions,Param){
RESULTS
$
Outputs
[
round
(
RESULTS
$
Outputs
,
3
)
==
(
-999.999
)]
<-
NA
;
RESULTS
$
StateEnd
[
round
(
RESULTS
$
StateEnd
,
3
)
==
(
-999.999
)]
<-
NA
;
if
(
ExportStateEnd
)
{
idNStates
<-
seq_len
(
NStates
*
NLayers
)
%%
NStates
RESULTS
$
StateEnd
<-
CreateIniStates
(
FUN_MOD
=
RunModel_CemaNeigeGR5J
,
InputsModel
=
InputsModel
,
ProdStore
=
RESULTS
$
StateEnd
[
1L
],
RoutStore
=
RESULTS
$
StateEnd
[
2L
],
ExpStore
=
NULL
,
UH1
=
NULL
,
UH2
=
RESULTS
$
StateEnd
[(
1
:
40
)
+
(
7+20
)],
GCemaNeigeLayers
=
CemaNeigeStateEnd
[
seq_len
(
2
*
NLayers
)[
seq_len
(
2
*
NLayers
)
%%
2
==
1
]],
eTGCemaNeigeLayers
=
CemaNeigeStateEnd
[
seq_len
(
2
*
NLayers
)[
seq_len
(
2
*
NLayers
)
%%
2
==
0
]],
GCemaNeigeLayers
=
CemaNeigeStateEnd
[
seq_len
(
NStates
*
NLayers
)[
idNStates
==
3
]],
eTGCemaNeigeLayers
=
CemaNeigeStateEnd
[
seq_len
(
NStates
*
NLayers
)[
idNStates
==
2
]],
GthrCemaNeigeLayers
=
CemaNeigeStateEnd
[
seq_len
(
NStates
*
NLayers
)[
idNStates
==
1
]],
GlocmaxCemaNeigeLayers
=
CemaNeigeStateEnd
[
seq_len
(
NStates
*
NLayers
)[
idNStates
==
0
]],
verbose
=
FALSE
)
}
...
...
@@ -160,6 +173,9 @@ RunModel_CemaNeigeGR5J <- function(InputsModel,RunOptions,Param){
##End
rm
(
RESULTS
);
class
(
OutputsModel
)
<-
c
(
"OutputsModel"
,
"daily"
,
"GR"
,
"CemaNeige"
);
if
(
IsHyst
)
{
class
(
OutputsModel
)
<-
c
(
class
(
OutputsModel
),
"hysteresis"
)
}
return
(
OutputsModel
);
}
...
...
R/RunModel_CemaNeigeGR6J.R
View file @
ccafecdc
RunModel_CemaNeigeGR6J
<-
function
(
InputsModel
,
RunOptions
,
Param
){
NParam
<-
8
;
FortranOutputsCemaNeige
<-
c
(
"Pliq"
,
"Psol"
,
"SnowPack"
,
"ThermalState"
,
"Gratio"
,
"PotMelt"
,
"Melt"
,
"PliqAndMelt"
,
"Temp"
);
RunModel_CemaNeigeGR6J
<-
function
(
InputsModel
,
RunOptions
,
Param
,
IsHyst
=
FALSE
){
## Arguments_check
if
(
!
is.logical
(
IsHyst
)
|
length
(
IsHyst
)
!=
1L
)
{
stop
(
"'IsHyst' must be a 'logical' of length 1"
)
return
(
NULL
)
}
NParam
<-
ifelse
(
IsHyst
,
10L
,
8L
)
NStates
<-
4L
FortranOutputsCemaNeige
<-
c
(
"Pliq"
,
"Psol"
,
"SnowPack"
,
"ThermalState"
,
"Gratio"
,
"PotMelt"
,
"Melt"
,
"PliqAndMelt"
,
"Temp"
,
"Gthreshold"
,
"Glocalmax"
);
FortranOutputsMod
<-
c
(
"PotEvap"
,
"Precip"
,
"Prod"
,
"Pn"
,
"Ps"
,
"AE"
,
"Perc"
,
"PR"
,
"Q9"
,
"Q1"
,
"Rout"
,
"Exch"
,
"AExch1"
,
"AExch2"
,
"AExch"
,
"QR"
,
"QRExp"
,
"Exp"
,
"QD"
,
"Qsim"
);
...
...
@@ -41,22 +49,22 @@ RunModel_CemaNeigeGR6J <- function(InputsModel,RunOptions,Param){
IndPeriod1
<-
c
(
RunOptions
$
IndPeriod_WarmUp
,
RunOptions
$
IndPeriod_Run
);
LInputSeries
<-
as.integer
(
length
(
IndPeriod1
))
IndPeriod2
<-
(
length
(
RunOptions
$
IndPeriod_WarmUp
)
+1
)
:
LInputSeries
;
ParamCemaNeige
<-
Param
[(
length
(
Param
)
-1
)
:
length
(
Param
)];
NParamMod
<-
as.integer
(
length
(
Param
)
-
2
);
ParamCemaNeige
<-
Param
[(
length
(
Param
)
-1
-2
*
as.integer
(
IsHyst
)
)
:
length
(
Param
)];
NParamMod
<-
as.integer
(
length
(
Param
)
-
(
2+2
*
as.integer
(
IsHyst
))
);
ParamMod
<-
Param
[
1
:
NParamMod
];
NLayers
<-
length
(
InputsModel
$
LayerPrecip
);
NStatesMod
<-
as.integer
(
length
(
RunOptions
$
IniStates
)
-
2
*
NLayers
);
NStatesMod
<-
as.integer
(
length
(
RunOptions
$
IniStates
)
-
NStates
*
NLayers
);
ExportDatesR
<-
"DatesR"
%in%
RunOptions
$
Outputs_Sim
;
ExportStateEnd
<-
"StateEnd"
%in%
RunOptions
$
Outputs_Sim
;
##SNOW_MODULE________________________________________________________________________________##
if
(
inherits
(
RunOptions
,
"CemaNeige"
)
==
TRUE
){
if
(
"all"
%in%
RunOptions
$
Outputs_Sim
){
IndOutputsCemaNeige
<-
as.integer
(
1
:
length
(
FortranOutputsCemaNeige
));
}
else
{
IndOutputsCemaNeige
<-
which
(
FortranOutputsCemaNeige
%in%
RunOptions
$
Outputs_Sim
);
}
CemaNeigeLayers
<-
list
();
CemaNeigeStateEnd
<-
NULL
;
NameCemaNeigeLayers
<-
"CemaNeigeLayers"
;
##Call_DLL_CemaNeige_________________________
for
(
iLayer
in
1
:
NLayers
){
StateStartCemaNeige
<-
RunOptions
$
IniStates
[(
7+20+40
)
+
c
(
iLayer
,
iLayer
+
NLayers
)]
...
...
@@ -67,15 +75,16 @@ RunModel_CemaNeigeGR6J <- function(InputsModel,RunOptions,Param){
InputsFracSolidPrecip
=
InputsModel
$
LayerFracSolidPrecip
[[
iLayer
]][
IndPeriod1
],
### input series of fraction of solid precipitation [0-1]
InputsTemp
=
InputsModel
$
LayerTemp
[[
iLayer
]][
IndPeriod1
],
### input series of air mean temperature [degC]
MeanAnSolidPrecip
=
RunOptions
$
MeanAnSolidPrecip
[
iLayer
],
### value of annual mean solid precip [mm/y]
NParam
=
as.integer
(
2
),
### number of model parameter = 2
Param
=
ParamCemaNeige
,
### parameter set
NStates
=
as.integer
(
2
),
### number of state variables used for model initialising = 2
NParam
=
as.integer
(
NParam
),
### number of model parameter = 2
Param
=
as.double
(
ParamCemaNeige
)
,
### parameter set
NStates
=
as.integer
(
NStates
),
### number of state variables used for model initialising = 2
StateStart
=
StateStartCemaNeige
,
### state variables used when the model run starts
IsHyst
=
as.integer
(
IsHyst
),
### use of hysteresis
NOutputs
=
as.integer
(
length
(
IndOutputsCemaNeige
)),
### number of output series
IndOutputs
=
IndOutputsCemaNeige
,
### indices of output series
##outputs
Outputs
=
matrix
(
as.double
(
-999.999
),
nrow
=
LInputSeries
,
ncol
=
length
(
IndOutputsCemaNeige
)),
### output series [mm]
StateEnd
=
rep
(
as.double
(
-999.999
),
as.integer
(
2
))
### state variables at the end of the model run (reservoir levels [mm] and HU)
StateEnd
=
rep
(
as.double
(
-999.999
),
as.integer
(
NStates
))
### state variables at the end of the model run (reservoir levels [mm] and HU)
)
RESULTS
$
Outputs
[
round
(
RESULTS
$
Outputs
,
3
)
==
(
-999.999
)]
<-
NA
;
RESULTS
$
StateEnd
[
round
(
RESULTS
$
StateEnd
,
3
)
==
(
-999.999
)]
<-
NA
;
...
...
@@ -89,7 +98,7 @@ RunModel_CemaNeigeGR6J <- function(InputsModel,RunOptions,Param){
if
(
ExportStateEnd
){
CemaNeigeStateEnd
<-
c
(
CemaNeigeStateEnd
,
RESULTS
$
StateEnd
);
}
rm
(
RESULTS
);
}
###ENDFOR_iLayer
names
(
CemaNeigeLayers
)
<-
paste
(
"Layer"
,
formatC
(
1
:
NLayers
,
width
=
2
,
flag
=
"0"
),
sep
=
""
);
names
(
CemaNeigeLayers
)
<-
sprintf
(
"Layer%02i"
,
seq_len
(
NLayers
))
}
###ENDIF_RunSnowModule
if
(
inherits
(
RunOptions
,
"CemaNeige"
)
==
FALSE
){
CemaNeigeLayers
<-
list
();
CemaNeigeStateEnd
<-
NULL
;
NameCemaNeigeLayers
<-
NULL
;
...
...
@@ -127,11 +136,14 @@ RunModel_CemaNeigeGR6J <- function(InputsModel,RunOptions,Param){
RESULTS
$
Outputs
[
round
(
RESULTS
$
Outputs
,
3
)
==
(
-999.999
)]
<-
NA
;
RESULTS
$
StateEnd
[
round
(
RESULTS
$
StateEnd
,
3
)
==
(
-999.999
)]
<-
NA
;
if
(
ExportStateEnd
)
{
idNStates
<-
seq_len
(
NStates
*
NLayers
)
%%
NStates
RESULTS
$
StateEnd
<-
CreateIniStates
(
FUN_MOD
=
RunModel_CemaNeigeGR6J
,
InputsModel
=
InputsModel
,
ProdStore
=
RESULTS
$
StateEnd
[
1L
],
RoutStore
=
RESULTS
$
StateEnd
[
2L
],
ExpStore
=
RESULTS
$
StateEnd
[
3L
],
UH1
=
RESULTS
$
StateEnd
[(
1
:
20
)
+7
],
UH2
=
RESULTS
$
StateEnd
[(
1
:
40
)
+
(
7+20
)],
GCemaNeigeLayers
=
CemaNeigeStateEnd
[
seq_len
(
2
*
NLayers
)[
seq_len
(
2
*
NLayers
)
%%
2
==
1
]],
eTGCemaNeigeLayers
=
CemaNeigeStateEnd
[
seq_len
(
2
*
NLayers
)[
seq_len
(
2
*
NLayers
)
%%
2
==
0
]],
GCemaNeigeLayers
=
CemaNeigeStateEnd
[
seq_len
(
NStates
*
NLayers
)[
idNStates
==
3
]],
eTGCemaNeigeLayers
=
CemaNeigeStateEnd
[
seq_len
(
NStates
*
NLayers
)[
idNStates
==
2
]],
GthrCemaNeigeLayers
=
CemaNeigeStateEnd
[
seq_len
(
NStates
*
NLayers
)[
idNStates
==
1
]],
GlocmaxCemaNeigeLayers
=
CemaNeigeStateEnd
[
seq_len
(
NStates
*
NLayers
)[
idNStates
==
0
]],
verbose
=
FALSE
)
}
...
...
@@ -166,6 +178,9 @@ RunModel_CemaNeigeGR6J <- function(InputsModel,RunOptions,Param){
##End
rm
(
RESULTS
);
class
(
OutputsModel
)
<-
c
(
"OutputsModel"
,
"daily"
,
"GR"
,
"CemaNeige"
);
if
(
IsHyst
)
{
class
(
OutputsModel
)
<-
c
(
class
(
OutputsModel
),
"hysteresis"
)
}
return
(
OutputsModel
);
}
...
...
R/TransfoParam_CemaNeigeHyst.R
0 → 100644
View file @
ccafecdc
TransfoParam_CemaNeigeHyst
<-
function
(
ParamIn
,
Direction
)
{
NParam
<-
4L
## check_arguments
Bool
<-
is.vector
(
ParamIn
)
if
(
Bool
)
{
ParamIn
<-
matrix
(
ParamIn
,
nrow
=
1
)
warning
(
"'ParamIn' automatically convert to 'matrix'"
)
}
if
(
!
inherits
(
ParamIn
,
"matrix"
))
{
stop
(
"'ParamIn' must be of class 'matrix'"
)
}
if
(
!
inherits
(
Direction
,
"character"
)
|
length
(
Direction
)
!=
1
|
any
(
!
Direction
%in%
c
(
"RT"
,
"TR"
)))
{
stop
(
"'Direction' must be a character vector of length 1 equal to 'RT' or 'TR'"
)
}
if
(
ncol
(
ParamIn
)
!=
NParam
)
{
stop
(
sprintf
(
"the CemaNeige module with hysteresis requires %i parameters"
,
NParam
))
}
if
(
Direction
==
"TR"
)
{
ParamOut
<-
ParamIn
ParamOut
[,
1
]
<-
(
ParamIn
[,
1
]
+
9.99
)
/
19.98
### CemaNeige X1 (weighting coefficient for snow pack thermal state)
ParamOut
[,
2
]
<-
exp
(
ParamIn
[,
2
])
/
200
### CemaNeige X2 (degree-day melt coefficient)
ParamOut
[,
3
]
<-
(
ParamIn
[,
3
]
*
5
)
+
50
### Hyst Gaccum
ParamOut
[,
4
]
<-
(
ParamIn
[,
4
]
/
19.98
)
+
0.5
### Hyst CV
}
if
(
Direction
==
"RT"
)
{
ParamOut
<-
ParamIn
ParamOut
[,
1
]
<-
ParamIn
[,
1
]
*
19.98
-
9.99
### CemaNeige X1 (weighting coefficient for snow pack thermal state)
ParamOut
[,
2
]
<-
log
(
ParamIn
[,
2
]
*
200
)
### CemaNeige X2 (degree-day melt coefficient)
ParamOut
[,
3
]
<-
(
ParamIn
[,
3
]
-
50
)
/
5
### Hyst Gaccum
ParamOut
[,
4
]
<-
(
ParamIn
[,
4
]
-
0.5
)
*
19.98
### Hyst CV
}
if
(
Bool
)
{
ParamOut
<-
as.vector
(
ParamOut
)
}
return
(
ParamOut
)
}