def shortcircuit_river(): """ Establish a waterbalance_connection if the river does not exist as a separate storage, so the model treats it as if it would not exist. :return: None """ if "river" not in self.genes: cmf.waterbalance_connection(self.storages["river"], self.storages["out"])
def create_connections(self, p: Parameters): """ Creates the connections and parameterizes the storages of the model """ # Infiltration cmf.SimpleInfiltration(self.soil, self.cell.surfacewater, W0=p.infiltration_w0) # Route infiltration / saturation excess to outlet cmf.waterbalance_connection(self.cell.surfacewater, self.outlet) capacity = self.set_soil_capacity(p) cmf.timeseriesETpot(self.soil, self.cell.transpiration, self.data.ETpot) # Parameterize infiltration capacity self.soil.soil.Ksat = p.infiltration_capacity / 1000 # Parameterize water stress function self.cell.set_uptakestress(cmf.VolumeStress( p.ETV1 * capacity, 0) )
def setparameters( self, tr_soil_GW=12.36870481, tr_soil_fulda=12., tr_surf=3.560855356, tr_GW_l=829.7188064, tr_GW_u_fulda=270.05035, tr_GW_u_GW_l=270., tr_fulda=2.264612944, V0_soil=280.0850875, beta_soil_GW=1.158865311, beta_fulda=1.1, ETV1=2.575261852, fETV0=0.014808919, meltrate=4.464735097, snow_melt_temp=4.51938545, Qd_max=0.250552812, TW_threshold=10., LAI=2.992013336, CanopyClosure=5., Ksat=0.02): # this list has to be identical with the one above """ sets the parameters, all parameterized connections will be created anew """ # Get all definitions from init method p = self.project c = p[0] outlet = self.outlet fulda = self.fulda trinkwasser = self.trinkwasser # Adjustment of the evapotranspiration c.set_uptakestress(cmf.VolumeStress(ETV1, ETV1 * fETV0)) # Flux from the surfaces to the river cmf.kinematic_wave(c.surfacewater, fulda, tr_surf) # flux from surfaces to the soil (infiltration) cmf.SimpleInfiltration(c.layers[0], c.surfacewater) # change the saturated conductivity of the soil c.layers[0].soil.Ksat = Ksat # Flux from soil to river (interflow) cmf.kinematic_wave(c.layers[0], fulda, tr_soil_fulda / V0_soil, V0=V0_soil) # flux from the soil to the upper groundwater (percolation) cmf.kinematic_wave(c.layers[0], c.layers[1], tr_soil_GW, exponent=beta_soil_GW) # flux from the upper groundwater to the river (baseflow) cmf.kinematic_wave(c.layers[1], fulda, tr_GW_u_fulda) # flux from upper to lower groundwater (percolation) cmf.kinematic_wave(c.layers[1], c.layers[2], tr_GW_u_GW_l) #, exponent=beta_GW_u_GW_l) # flux from the lower groundwater to river (baseflow) cmf.kinematic_wave(c.layers[2], fulda, tr_GW_l) # Flux from the lower groundwater to the drinking water outlet # the fourths argument is the amount that is now allowed to be slurped # out of the lower groundwater cmf.TechnicalFlux(c.layers[2], trinkwasser, Qd_max, TW_threshold, cmf.day) # Flux from drinking water to the river cmf.waterbalance_connection(trinkwasser, fulda) # flux from the river to the outlet cmf.kinematic_wave(fulda, outlet, tr_fulda, exponent=beta_fulda) # set snowmelt temperature cmf.Weather.set_snow_threshold(snow_melt_temp) # Snowmelt at the surfaces snowmelt_surf = cmf.SimpleTindexSnowMelt(c.snow, c.surfacewater, c, rate=meltrate) # Splits the rainfall in interzeption and throughfall cmf.Rainfall(c.canopy, c, False, True) cmf.Rainfall(c.surfacewater, c, True, False) # Makes a overflow for the interception storage cmf.RutterInterception(c.canopy, c.surfacewater, c) # Transpiration on the plants is added cmf.CanopyStorageEvaporation(c.canopy, c.evaporation, c) # Sets the parameters for the interception c.vegetation.LAI = LAI # Defines how much throughfall there is (in %) c.vegetation.CanopyClosure = CanopyClosure
def setparameters(self, tr_soil_GW = 12.36870481, tr_soil_fulda = 12., # tr_surf = 3.560855356, tr_GW_l = 829.7188064, tr_GW_u_fulda = 270.05035, tr_GW_u_GW_l = 270., tr_fulda = 2.264612944, V0_soil = 280.0850875, beta_soil_GW=1.158865311, beta_fulda = 1.1, ETV1=2.575261852, fETV0=0.014808919, # meltrate = 4.464735097, # snow_melt_temp = 4.51938545, Qd_max = 0.250552812, TW_threshold = 10., # LAI = 2.992013336, # CanopyClosure = 5., # Ksat = 0.02 ): # this list has to be identical with the one above """ sets the parameters, all parameterized connections will be created anew """ # Get all definitions from init method p = self.project c = p[0] outlet = self.outlet fulda = self.fulda trinkwasser = self.trinkwasser # Adjustment of the evapotranspiration c.set_uptakestress(cmf.VolumeStress(ETV1,ETV1 * fETV0)) # Flux from the surfaces to the river # cmf.kinematic_wave(c.surfacewater,fulda,tr_surf) # flux from surfaces to the soil (infiltration) # cmf.SimpleInfiltration(c.layers[0], c.surfacewater) # change the saturated conductivity of the soil # c.layers[0].soil.Ksat = Ksat # Flux from soil to river (interflow) cmf.kinematic_wave(c.layers[0],fulda,tr_soil_fulda/V0_soil, V0 = V0_soil) # flux from the soil to the upper groundwater (percolation) cmf.kinematic_wave(c.layers[0], c.layers[1],tr_soil_GW, exponent=beta_soil_GW) # flux from the upper groundwater to the river (baseflow) cmf.kinematic_wave(c.layers[1], fulda, tr_GW_u_fulda) # flux from upper to lower groundwater (percolation) cmf.kinematic_wave(c.layers[1], c.layers[2],tr_GW_u_GW_l)#, exponent=beta_GW_u_GW_l) # flux from the lower groundwater to river (baseflow) cmf.kinematic_wave(c.layers[2], fulda, tr_GW_l) # Flux from the lower groundwater to the drinking water outlet # the fourths argument is the amount that is now allowed to be slurped # out of the lower groundwater cmf.TechnicalFlux(c.layers[2],trinkwasser,Qd_max,TW_threshold,cmf.day) # Flux from drinking water to the river cmf.waterbalance_connection(trinkwasser, fulda) # flux from the river to the outlet cmf.kinematic_wave(fulda, outlet, tr_fulda, exponent = beta_fulda)
def setparameters(self, param_dict: dict): """ Creates all connections with the parameter values produced by the sampling algorithm. :param param_dict: Dictionary of all the parameters and their values. :return None """ cell = self.project[0] storages = self.storages # Find all active connections active_connections = [] for param in param_dict.keys(): if "tr_" in param: active_connections.append(param) # Go through all active connections for connection in active_connections: temp, source_tr, target_tr = connection.split("_") # Save the parameter values to be able to create the connection connection_params = {"tr": param_dict[connection], # Include the default values for beta and # V0, so a kinematic wave can always be # created. "beta": 1.0, "V0": 1.0} # Find all other parameter which belong to that connection for param in param_dict.keys(): try: name, source_param, target_param = param.split("_") # Save the values if ((name == "beta" or name == "V0") and source_tr == source_param and target_tr == target_param): connection_params[name] = param_dict[param] except ValueError: # ValueError is raised because the not all genes can be # split in three parts. But as all genes that are of # interest now can be, the error can pass. pass # Create the connection cmf.kinematic_wave(storages[source_tr], storages[target_tr], param_dict[connection], V0=connection_params["V0"], exponent=connection_params["beta"]) # Fill in the snow parameters when they exist. If not # leave them at CMFs default value. if "snow" in self.genes: cmf.SimpleTindexSnowMelt(cell.snow, cell.surfacewater, cell, rate=param_dict.get("snow_meltrate", 7)) cmf.Weather.set_snow_threshold(param_dict.get("snow_melt_temp", 0.5)) # Fill in the canopy parameters when they exist if "canopy" in self.genes: # Splits the rainfall in interception and throughfall cmf.Rainfall(cell.canopy, cell, False, True) cmf.Rainfall(cell.surfacewater, cell, True, False) # Makes a overflow for the interception storage cmf.RutterInterception(cell.canopy, cell.surfacewater, cell) # Transpiration on the plants is added cmf.CanopyStorageEvaporation(cell.canopy, cell.evaporation, cell) # Set LAI and Canopy Closure if they exist in the dict. If not # leave them at CMFs default value. cell.vegetation.LAI = param_dict.get("canopy_lai", 2.88) cell.vegetation.CanopyClosure = param_dict.get("canopy_closure", 1.0) # Establish a waterbalance_connection if the river does not exist as # a separate storage, so the model treats it as if it would not exist. if "river" not in self.genes: cmf.waterbalance_connection(self.storages["river"], self.storages["out"])