Eff_MB_Act.jl
|
|
🛈 |
Note: See Building/Process Energy Efficiency for a description of the typical policy variables used and factors to consider when modeling a building efficiency policy. Also see the Mechanics of Creating Policy Files for more information on the structure of policy files and on Julia coding syntax used in policy files. |
The Eff_MB_Act.jl policy file contains both residential and commercial building standards. In this file, we see a separate data struct being created to hold the residential variables (which are stored in RInput, ROutput, and RCalDB) and a second data struct to hold the commercial variables (which are stored in CInput, COutput, and CCalDB).
Several ways can be used to access variables having the same name across sectors, such as in the residential, commercial, industrial, and transportation sectors. See Data Structs for information on accessing variables in the data struct.
Sample Policy File: EFF_MB_Act.jl
|
# # Eff_MB_Act.jl # # This jl simulates the impact of implementing the Efficiency Manitoba Act in the commercial and residential sectors. # Details about the underlying assumptions for this policy are available in the following file: # \\ncr.int.ec.gc.ca\shares\e\ECOMOD\Documentation\Policy - Buildings Policies.docx. # using EnergyModel module Eff_MB_Act import ...EnergyModel: ReadDisk,WriteDisk,Select import ...EnergyModel: HisTime,ITime,MaxTime,First,Future,Final,Yr import ...EnergyModel: @finite_math,finite_inverse,finite_divide,finite_power,finite_exp,finite_log import ...EnergyModel: DB const VariableArray{N} = Array{Float32,N} where {N} const SetArray = Vector{String} Base.@kwdef struct RControl db::String CalDB::String = "RCalDB" Input::String = "RInput" Outpt::String = "ROutput" BCNameDB::String = ReadDisk(db,"MainDB/BCNameDB") # Base Case Name Area::SetArray = ReadDisk(db,"MainDB/AreaKey") AreaDS::SetArray = ReadDisk(db,"MainDB/AreaDS") Areas::Vector{Int} = collect(Select(Area)) EC::SetArray = ReadDisk(db,"$Input/ECKey") ECDS::SetArray = ReadDisk(db,"$Input/ECDS") ECs::Vector{Int} = collect(Select(EC)) Enduse::SetArray = ReadDisk(db,"$Input/EnduseKey") EnduseDS::SetArray = ReadDisk(db,"$Input/EnduseDS") Enduses::Vector{Int} = collect(Select(Enduse)) Nation::SetArray = ReadDisk(db,"MainDB/NationKey") NationDS::SetArray = ReadDisk(db,"MainDB/NationDS") Nations::Vector{Int} = collect(Select(Nation)) Tech::SetArray = ReadDisk(db,"$Input/TechKey") TechDS::SetArray = ReadDisk(db,"$Input/TechDS") Techs::Vector{Int} = collect(Select(Tech)) Year::SetArray = ReadDisk(db,"MainDB/YearKey") YearDS::SetArray = ReadDisk(db,"MainDB/YearDS") Years::Vector{Int} = collect(Select(Year)) ANMap::VariableArray{2} = ReadDisk(db,"MainDB/ANMap") # [Area,Nation] Map between Area and Nation DCCLimit::VariableArray{5} = ReadDisk(db,"$Input/DCCLimit") # [Enduse,Tech,EC,Area,Year] Device Capital Cost Limit Multiplier ($/$) DEE::VariableArray{5} = ReadDisk(db,"$Outpt/DEE") # [Enduse,Tech,EC,Area,Year] Device Efficiency ($/Btu) DEEBase::VariableArray{5} = ReadDisk(BCNameDB,"$Outpt/DEE") # [Enduse,Tech,EC,Area,Year] Base Year Device Efficiency ($/Btu) DEM::VariableArray{4} = ReadDisk(db,"$Input/DEM") # [Enduse,Tech,EC,Area] Maximum Device Efficiency ($/mmBtu) DEMM::VariableArray{5} = ReadDisk(db,"$CalDB/DEMM") # [Enduse,Tech,EC,Area,Year] Device Efficiency Max. Mult. ($/Btu/$/Btu) DEStd::VariableArray{5} = ReadDisk(db,"$Input/DEStd") # [Enduse,Tech,EC,Area,Year] Device Efficiency Standard ($/Btu) DEStdP::VariableArray{5} = ReadDisk(db,"$Input/DEStdP") # [Enduse,Tech,EC,Area,Year] Device Efficiency Standard Policy ($/Btu) PEE::VariableArray{5} = ReadDisk(db,"$Outpt/PEE") # Process Efficiency ($/Btu) [Enduse,Tech,EC,Area] PEEBase::VariableArray{5} = ReadDisk(BCNameDB,"$Outpt/PEE") # Process Efficiency ($/Btu) [Enduse,Tech,EC,Area] PEM::VariableArray{3} = ReadDisk(db,"$CalDB/PEM") # [Enduse,EC,Area] Process Efficiency ($/Btu) PEMM::VariableArray{5} = ReadDisk(db,"$CalDB/PEMM") # [Enduse,Tech,EC,Area,Year] Maximum Process Efficiency ($/mmBtu) PEStd::VariableArray{5} = ReadDisk(db,"$Input/PEStd") # [Enduse,Tech,EC,Area,Year] Process Efficiency Standard ($/Btu) PEStdP::VariableArray{5} = ReadDisk(db,"$Input/PEStdP") # [Enduse,Tech,EC,Area,Year] Process Efficiency Standard Policy ($/Btu)
# Scratch Variables Change::VariableArray{2} = zeros(Float32,length(Tech),length(Year)) # [Tech,Year] Change in Policy Variable end function ResPolicy(db) data = RControl(; db) (; CalDB,Input) = data (; Area,ECs,Enduse,Enduses) = data (; Nation,Tech) = data (; ANMap,Change,DCCLimit,DEEBase,DEM,DEMM,DEStd,DEStdP)= data (; PEEBase,PEM,PEMM,PEStdP,PEStd) = data
CN = Select(Nation,"CN"); areas = findall(ANMap[:,CN] .== 1.0);
MB = Select(Area,"MB") ecs = ECs years = collect(Yr(2024):Final)
# # Default Value (for all Techs) # @. Change = 0.0; # # Example - Different value for electric # Electric = Select(Tech,"Electric"); for year in years Change[Electric,year] = 0.0193 + Change[Electric,year-1] end
Gas = Select(Tech,"Gas"); for year in years Change[Gas,year] = 0.005 + Change[Gas,year-1] end
techs = Select(Tech,["Electric","Gas"]) for year in years, enduse in Enduses, tech in techs, ec in ecs DEStdP[enduse,tech,ec,MB,year] = max(DEStdP[enduse,tech,ec,MB,year], DEStd[enduse,tech,ec,MB,year],DEEBase[enduse,tech,ec,MB,year])*(1+Change[tech,year]) end
# # Making sure efficiencies are not greater that 98.9% # enduses = Select(Enduse,!=("AC")); for year in years, enduse in enduses, tech in techs, ec in ecs DEStdP[enduse,tech,ec,MB,year] = min(DEStdP[enduse,tech,ec,MB,year],0.989) end
for year in years, enduse in Enduses, tech in techs, ec in ecs @finite_math DEMM[enduse,tech,ec,MB,year] = max(DEStdP[enduse,tech,ec,MB,year]/ (DEM[enduse,tech,ec,MB] *0.98),DEMM[enduse,tech,ec,MB,year])
DCCLimit[enduse,tech,ec,MB,year] = 3.0; end
for year in years, enduse in Enduses, tech in techs, ec in ecs PEStdP[enduse,tech,ec,MB,year] = max(PEStdP[enduse,tech,ec,MB,year], PEStd[enduse,tech,ec,MB,year],PEEBase[enduse,tech,ec,MB,year])* (1+Change[tech,year])
@finite_math PEMM[enduse,tech,ec,MB,year] = max(PEStdP[enduse,tech,ec,MB,year]/ (PEM[enduse,ec,MB] *0.98),PEMM[enduse,tech,ec,MB,year]) end
WriteDisk(db,"$Input/DEStdP",DEStdP); WriteDisk(db,"$CalDB/DEMM",DEMM); WriteDisk(db,"$Input/DCCLimit",DCCLimit); WriteDisk(db,"$Input/PEStdP",PEStdP); WriteDisk(db,"$CalDB/PEMM",PEMM); end Base.@kwdef struct CControl db::String CalDB::String = "CCalDB" Input::String = "CInput" Outpt::String = "COutput" BCNameDB::String = ReadDisk(db,"MainDB/BCNameDB")# Base Case Name Area::SetArray = ReadDisk(db,"MainDB/AreaKey") AreaDS::SetArray = ReadDisk(db,"MainDB/AreaDS") Areas::Vector{Int} = collect(Select(Area)) EC::SetArray = ReadDisk(db,"$Input/ECKey") ECDS::SetArray = ReadDisk(db,"$Input/ECDS") ECs::Vector{Int} = collect(Select(EC)) Enduse::SetArray = ReadDisk(db,"$Input/EnduseKey") EnduseDS::SetArray = ReadDisk(db,"$Input/EnduseDS") Enduses::Vector{Int} = collect(Select(Enduse)) Nation::SetArray = ReadDisk(db,"MainDB/NationKey") NationDS::SetArray = ReadDisk(db,"MainDB/NationDS") Nations::Vector{Int} = collect(Select(Nation)) Tech::SetArray = ReadDisk(db,"$Input/TechKey") TechDS::SetArray = ReadDisk(db,"$Input/TechDS") Techs::Vector{Int} = collect(Select(Tech)) Year::SetArray = ReadDisk(db,"MainDB/YearKey") YearDS::SetArray = ReadDisk(db,"MainDB/YearDS") Years::Vector{Int} = collect(Select(Year)) ANMap::VariableArray{2} = ReadDisk(db,"MainDB/ANMap") # [Area,Nation] Map between Area and Nation DCCLimit::VariableArray{5} = ReadDisk(db,"$Input/DCCLimit") # [Enduse,Tech,EC,Area,Year] Device Capital Cost Limit Multiplier ($/$) DEE::VariableArray{5} = ReadDisk(db,"$Outpt/DEE") # [Enduse,Tech,EC,Area,Year] Device Efficiency ($/Btu) DEEBase::VariableArray{5} = ReadDisk(BCNameDB,"$Outpt/DEE") # [Enduse,Tech,EC,Area,Year] Base Year Device Efficiency ($/Btu) DEM::VariableArray{4} = ReadDisk(db,"$Input/DEM") # [Enduse,Tech,EC,Area] Maximum Device Efficiency ($/mmBtu) DEMM::VariableArray{5} = ReadDisk(db,"$CalDB/DEMM") # [Enduse,Tech,EC,Area,Year] Device Efficiency Max. Mult. ($/Btu/$/Btu) DEStd::VariableArray{5} = ReadDisk(db,"$Input/DEStd") # [Enduse,Tech,EC,Area,Year] Device Efficiency Standard ($/Btu) DEStdP::VariableArray{5} = ReadDisk(db,"$Input/DEStdP") # [Enduse,Tech,EC,Area,Year] Device Efficiency Standard Policy ($/Btu) PEE::VariableArray{5} = ReadDisk(db,"$Outpt/PEE") # Process Efficiency ($/Btu) [Enduse,Tech,EC,Area] PEEBase::VariableArray{5} = ReadDisk(BCNameDB,"$Outpt/PEE") # Process Efficiency ($/Btu) [Enduse,Tech,EC,Area] PEM::VariableArray{3} = ReadDisk(db,"$CalDB/PEM") # [Enduse,EC,Area] Process Efficiency ($/Btu) PEMM::VariableArray{5} = ReadDisk(db,"$CalDB/PEMM") # [Enduse,Tech,EC,Area,Year] Maximum Process Efficiency ($/mmBtu) PEStd::VariableArray{5} = ReadDisk(db,"$Input/PEStd") # [Enduse,Tech,EC,Area,Year] Process Efficiency Standard ($/Btu) PEStdP::VariableArray{5} = ReadDisk(db,"$Input/PEStdP") # [Enduse,Tech,EC,Area,Year] Process Efficiency Standard Policy ($/Btu) # Scratch Variables Change::VariableArray{2} = zeros(Float32,length(Tech),length(Year)) # [Tech,Year] Change in Policy Variable end function ComPolicy(db) data = CControl(; db) (; CalDB,Input) = data (; Area,EC,Enduse,Enduses) = data (; Nation,Tech) = data (; ANMap,Change,DCCLimit,DEEBase,DEM,DEMM,DEStd,DEStdP)= data (; PEEBase,PEM,PEMM,PEStdP,PEStd) = data
CN = Select(Nation,"CN"); areas = findall(ANMap[:,CN] .== 1.0);
MB = Select(Area,"MB") ecs = Select(EC,(from = "Wholesale", to = "OtherCommercial")) years = collect(Yr(2024):Final)
# # Default Value (for all Techs) # @. Change = 0.0; # # Example - Different value for electric # Electric = Select(Tech,"Electric"); for year in years Change[Electric,year] = 0.0193 + Change[Electric,year-1] end
Gas = Select(Tech,"Gas"); for year in years Change[Gas,year] = 0.005 + Change[Gas,year-1] end
techs = Select(Tech,["Electric","Gas"]); for year in years, enduse in Enduses, tech in techs, ec in ecs DEStdP[enduse,tech,ec,MB,year] = max(DEStdP[enduse,tech,ec,MB,year], DEStd[enduse,tech,ec,MB,year],DEEBase[enduse,tech,ec,MB,year])*(1+Change[tech,year]) end
# # Making sure efficiencies are not greater that 98.9% # enduses = Select(Enduse,!=("AC")); for year in years, enduse in enduses, tech in techs, ec in ecs DEStdP[enduse,tech,ec,MB,year] = min(DEStdP[enduse,tech,ec,MB,year],0.989) end
for year in years, enduse in Enduses, tech in techs, ec in ecs @finite_math DEMM[enduse,tech,ec,MB,year] = max(DEStdP[enduse,tech,ec,MB,year]/ (DEM[enduse,tech,ec,MB] *0.98),DEMM[enduse,tech,ec,MB,year])
DCCLimit[enduse,tech,ec,MB,year] = 3.0; end
for year in years, enduse in Enduses, tech in techs, ec in ecs PEStdP[enduse,tech,ec,MB,year] = max(PEStdP[enduse,tech,ec,MB,year], PEStd[enduse,tech,ec,MB,year],PEEBase[enduse,tech,ec,MB,year])*(1+Change[tech,year]);
@finite_math PEMM[enduse,tech,ec,MB,year] = max(PEStdP[enduse,tech,ec,MB,year]/ (PEM[enduse,ec,MB] *0.98),PEMM[enduse,tech,ec,MB,year]) end
WriteDisk(db,"$Input/DEStdP",DEStdP); WriteDisk(db,"$CalDB/DEMM",DEMM); WriteDisk(db,"$Input/DCCLimit",DCCLimit); WriteDisk(db,"$Input/PEStdP",PEStdP); WriteDisk(db,"$CalDB/PEMM",PEMM); end function PolicyControl(db) @info "Eff_MB_Act.jl - PolicyControl" ResPolicy(db) ComPolicy(db) end if abspath(PROGRAM_FILE) == @__FILE__ PolicyControl(DB) end end |