runHeatByLightScenarios函数
这段代码是一个用于运行温室光照和加热场景模拟的 MATLAB 函数。它主要用于生成和分析不同光照和加热策略下的温室能耗和气候条件。以下是逐行解释:

函数定义

matlab
复制
function gl = runHeatByLightScenarios(varargin)
  • 定义了一个名为 runHeatByLightScenarios 的函数,它接受可变数量的输入参数 (varargin),并返回一个结构体 gl,其中包含模拟结果。

注释部分

matlab
复制
%RUNHEATBYLIGHTSCENARIOS Function used to generate simulations in Chapter 5 of:
%   [1] Katzin, D. (2021). Energy saving by LED lighting in greenhouses: 
%       a process-based modelling approach (PhD thesis, Wageningen University).
%       https://doi.org/10.18174/544434
  • 注释部分说明了该函数的用途,即生成博士论文第5章中的模拟场景。

作者信息

matlab
复制
% David Katzin, Wageningen University
% david.katzin@wur.nl
% david.katzin1@gmail.com
  • 提供了作者的联系信息。

输入参数解析

matlab
复制
% set optional arguments or default values
parser = inputParser;
validScalarPosNum = @(x) isnumeric(x) && isscalar(x) && (x > 0);
validScalarNonNeg = @(x) isnumeric(x) && isscalar(x) && (x >= 0);
validLampType = @(x) any(validatestring(x,{'hps','led','none'}));
  • 使用 inputParser 对象来解析输入参数。
  • 定义了三个验证函数:
    • validScalarPosNum:验证输入是否为标量正数。
    • validScalarNonNeg:验证输入是否为标量非负数。
    • validLampType:验证输入是否为 'hps''led''none' 之一。

添加可选参数

matlab
复制
addParameter(parser, 'firstDay', 270, validScalarPosNum);
addParameter(parser, 'seasonLength', 350, validScalarPosNum);
addParameter(parser, 'saveFile', true, @(x) ischar(x) || islogical(x));
addParameter(parser, 'lampType', 'hps', validLampType);
addParameter(parser, 'blackoutScreen', false, @islogical);
addParameter(parser, 'heatHarvest', false, @islogical);
addParameter(parser, 'boiler', true, @islogical);
addParameter(parser, 'ppfd', 200, validScalarPosNum);
addParameter(parser, 'intPpfd', 0, validScalarNonNeg);
addParameter(parser, 'twentyHours', false, @islogical);
addParameter(parser, 'gradLamp', false, @islogical);
addParameter(parser, 'paramNames', []);
addParameter(parser, 'paramVals', []);
  • 使用 addParameter 方法为 parser 对象添加可选参数及其默认值。
  • 这些参数包括:
    • firstDay:模拟开始的日期(默认值为270)。
    • seasonLength:模拟的季节长度(默认值为350)。
    • saveFile:是否保存模拟结果(默认值为 true)。
    • lampType:灯具类型(默认值为 'hps')。
    • blackoutScreen:是否使用遮阳幕(默认值为 false)。
    • heatHarvest:是否使用热量回收(默认值为 false)。
    • boiler:是否使用锅炉(默认值为 true)。
    • ppfd:光合光子通量密度(默认值为200)。
    • intPpfd:内部光照强度(默认值为0)。
    • twentyHours:是否使用20小时光照周期(默认值为 false)。
    • gradLamp:是否使用渐变光照控制(默认值为 false)。
    • paramNamesparamVals:自定义参数名称和值(默认值为空)。

解析输入参数

matlab
复制
parse(parser,varargin{:})
args = parser.Results;
  • 解析输入参数并将结果存储在 args 结构体中。

设置目录

matlab
复制
% Set directories for loading data and saving output
currentFile = mfilename('fullpath');
currentFolder = fileparts(currentFile);
dataFolder = strrep(currentFolder, '\Code\runScenarios', ...
    '\Code\inputs\energyPlus\data\');
outputFolder = strrep(currentFolder, '\Code\runScenarios', ...
    '\Output\');
  • 获取当前文件的路径,并设置数据文件夹和输出文件夹的路径。

设置数值求解的容差

matlab
复制
absTol = 1e-6; % default is 1e-6
relTol = 1e-3; % default is 1e-3
  • 设置数值求解的绝对容差和相对容差。

模拟设置

matlab
复制
%% Simulation settings
location = 'ams';
  • 设置模拟的地理位置为 'ams'(阿姆斯特丹)。

自定义参数

matlab
复制
paramNames = args.paramNames;
paramVals = args.paramVals;
  • 从输入参数中获取自定义参数名称和值。

创建文件名

matlab
复制
%% Create file name
if ischar(args.saveFile)
    label = [args.saveFile '_'];
    args.saveFile = true;
else
    label = '';
end
if args.saveFile % save simulation
    filename = [outputFolder label location '_' args.lampType '_'];
    if strcmp(args.lampType,'none')
        filename = [outputFolder label location '_' 'noLamp' '_'];
    end
    if args.blackoutScreen
        filename = [filename 'blScr_'];
    end
    if args.heatHarvest
        filename = [filename 'hHarvest_'];
    end
    if ~args.boiler
        filename = [filename 'noBoil_'];
    end
    if args.ppfd ~= 200
        filename = [filename 'ppfd' num2str(args.ppfd) '_'];
    end
    if args.intPpfd > 0
        filename = [filename 'intLamp' num2str(args.intPpfd) '_'];
    end
    if args.twentyHours
        filename = [filename 'twentyHours_'];
    end
    if args.gradLamp
        filename = [filename 'gradLamp_'];
    end

    filename = [filename 'day' num2str(args.firstDay) '_length' num2str(args.seasonLength)];
else % don't save simulation
    filename = '';
end
  • 根据输入参数生成保存模拟结果的文件名。文件名包含了模拟的各种设置,以便于区分不同的模拟场景。

加载气候数据

matlab
复制
%% Load default values and prepare simulation
% load climate data and cut it to requested season size
weather = cutEnergyPlusData(args.firstDay, args.seasonLength, ...
    [dataFolder location 'EnergyPlus.mat']);
  • 加载气候数据,并根据模拟的开始日期和季节长度进行裁剪。

获取海拔高度

matlab
复制
if size(weather,2) < 10
    elevation = 0;
else
    elevation = weather(1,10);
end
  • 从气候数据中获取海拔高度。

显示模拟开始信息

matlab
复制
disp(datetime('now'))
disp(['starting runGreenLight. Lamp type: ' args.lampType '. Filename: ' filename '.']);
tic;
  • 显示当前时间和模拟开始的信息,并启动计时器。

重置警告信息

matlab
复制
lastwarn('', ''); % reset "last warning"
  • 重置 MATLAB 的最后一个警告信息。

转换时间戳

matlab
复制
% convert weather timestamps from datenum to seconds since beginning of data
startTime = datetime(weather(1,1),'ConvertFrom','datenum');
weather(:,1) = (weather(:,1)-weather(1,1))*86400;
  • 将气候数据中的时间戳从 datenum 格式转换为从数据开始时刻起的秒数。

创建温室模型

matlab
复制
gl = createGreenLightModel(args.lampType, weather, startTime);
setParams4haWorldComparison(gl); % set parameters according to a modern greenhouse
setParam(gl, 'hElevation', elevation); % set elevation
  • 创建温室模型 gl,并根据现代温室的参数进行设置。
  • 设置温室的海拔高度。

设置遮阳幕控制

matlab
复制
%% Thermal screen depends on global radiation:
% The setpoint for screen closure is 
% 5癈 when iGlob < 50 W m^{-2}
% 18癈 when iGlob > 50 W m^{-2}
% (With smoothing in between)
gl.a.thScrSp = proportionalControl(gl.d.iGlob, 50, 10, 18, 5);
  • 根据全局辐射强度设置遮阳幕的控制策略。

设置灯具冷却时间

matlab
复制
%% Lamp cool down
% Prevent lamp from switching on if it was turned off recently
% for HPS, off time is one hour, for LED no lamp off time
if strcmp(args.lampType, 'hps')
    addLampOffTime(gl, 3600);
elseif strcmp(args.lampType, 'led')
    addLampOffTime(gl, 0);
end
  • 根据灯具类型设置灯具的冷却时间。HPS 灯具有1小时的冷却时间,而 LED 灯具没有冷却时间。

添加热量回收

matlab
复制
%% Add heat harvesting 
if args.heatHarvest 
    addHeatHarvesting(gl);
end
  • 如果启用了热量回收,则将其添加到模型中。

设置20小时光照周期

matlab
复制
%% Set lamp control to twenty hours per day: from 22:00 to 18:00
if args.twentyHours
    setParam(gl, 'lampsOn', 22);
end
  • 如果启用了20小时光照周期,则设置灯具的控制策略。

设置渐变光照控制

matlab
复制
%% Gradual control of the lamps:
% Full intensity    if gl.d.iGlob < gl.p.lampsOffSun/2 (200 by default)
% Half intensity    if 200 <= gl.d.iGlob <= gl.p.lampsOffSun (400 by default)
% Lamps off         if gl.d.iGlob > gl.p.lampRad
if args.gradLamp
    addAux(gl, 'lampNoCons', (1-0.5*(gl.d.iGlob>(gl.p.lampsOffSun/2))).*... % 0.5 if iGlob>lampsOffSun/2, 1 otherwise
        (gl.d.iGlob < gl.p.lampsOffSun).* ... % 1 if iGlob < lampsOffSun
        gl.a.lampTimeOfDay.* ... % lamps should be on this time of day
        (gl.d.dayRadSum < gl.p.lampRadSumLimit).* ... % the predicted daily radiation sum is less than the limit 
        gl.a.lampDayOfYear); % lamps should be on this day of year
end
  • 如果启用了渐变光照控制,则根据全局辐射强度设置灯具的渐变控制策略。

设置遮阳幕控制

matlab
复制
%% Blackout screen
if args.blackoutScreen
    % Control for blackout screen due to humidity - screens open if relative humidity exceeds rhMax+blScrExtraRh [%]                        
    setParam(gl, 'blScrExtraRh', 3); % Blackout screen open at 90% relative humidity - 3% more than the setpoint of 87%
    addParam(gl, 'useBlScr', 1);     % Use blackout screen 
end
  • 如果启用了遮阳幕,则设置其控制策略。

关闭锅炉

matlab
复制
%% Switch off boiler
if ~args.boiler 
    setDef(gl.u.boil, '0');
end
  • 如果关闭了锅炉,则将其设置为关闭状态。

设置光照加热场景的默认参数

matlab
复制
%% Set defulat parameters for heating by light scenarios
setHeatByLightParams(gl, args.lampType, args.ppfd, args.intPpfd)
  • 设置光照加热场景的默认参数。

修改自定义参数

matlab
复制
%% Modify additional parameters based on function input
% ParamName should be a vector of strings
% paramVal should be a respective numeric vector
if exist('paramNames', 'var') && ~isempty(paramNames)
    for k=1:length(paramNames)
        setParam(gl, paramNames(k), paramVals(k));
    end
end
  • 根据输入的自定义参数名称和值修改模型参数。

运行模拟

matlab
复制
%% Run simulation 
% check if need to save file
if strcmp(filename,'')
    args.saveFile = false;
else
    args.saveFile = true;
end

% Reset other parameters that depend on previously defined parameters
setDepParams(gl);

% Run simulation 
options = odeset('AbsTol', absTol, 'RelTol', relTol);
solveFromFile(gl, 'ode15s', options);
gl = changeRes(gl, 300);

[~, warnId] = lastwarn(); % check if warning occured
if(~isempty(warnId))
    filename = [filename '_warning'];
end

if args.saveFile
    save(filename);
end

toc;
beep;
  • 检查是否需要保存模拟结果。
  • 重置依赖于先前定义参数的参数。
  • 使用 ode15s 求解器运行模拟,并设置数值求解的容差。
  • 如果发生警告,则在文件名中添加 _warning 后缀。
  • 如果需要保存模拟结果,则将结果保存到文件中。
  • 停止计时器并发出提示音。

总结

这段代码主要用于模拟温室中的光照和加热场景,通过设置不同的参数(如灯具类型、光照强度、遮阳幕、热量回收等),可以生成不同的模拟结果并保存。代码结构清晰,注释详细,便于理解和修改。

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇