Exemplo n.º 1
0
        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"])
Exemplo n.º 2
0
    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)
        )
Exemplo n.º 3
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"])