这段代码是一个用于运行温室光照和加热场景模拟的 MATLAB 函数。它主要用于生成和分析不同光照和加热策略下的温室能耗和气候条件。以下是逐行解释:
函数定义
function gl = runHeatByLightScenarios(varargin)
- 定义了一个名为
runHeatByLightScenarios
的函数,它接受可变数量的输入参数 (varargin
),并返回一个结构体gl
,其中包含模拟结果。
注释部分
%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章中的模拟场景。
作者信息
% David Katzin, Wageningen University % david.katzin@wur.nl % david.katzin1@gmail.com
- 提供了作者的联系信息。
输入参数解析
% 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'
之一。
添加可选参数
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
)。paramNames
和paramVals
:自定义参数名称和值(默认值为空)。
解析输入参数
parse(parser,varargin{:}) args = parser.Results;
- 解析输入参数并将结果存储在
args
结构体中。
设置目录
% 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\');
- 获取当前文件的路径,并设置数据文件夹和输出文件夹的路径。
设置数值求解的容差
absTol = 1e-6; % default is 1e-6 relTol = 1e-3; % default is 1e-3
- 设置数值求解的绝对容差和相对容差。
模拟设置
%% Simulation settings location = 'ams';
- 设置模拟的地理位置为
'ams'
(阿姆斯特丹)。
自定义参数
paramNames = args.paramNames; paramVals = args.paramVals;
- 从输入参数中获取自定义参数名称和值。
创建文件名
%% 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
- 根据输入参数生成保存模拟结果的文件名。文件名包含了模拟的各种设置,以便于区分不同的模拟场景。
加载气候数据
%% 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']);
- 加载气候数据,并根据模拟的开始日期和季节长度进行裁剪。
获取海拔高度
if size(weather,2) < 10 elevation = 0; else elevation = weather(1,10); end
- 从气候数据中获取海拔高度。
显示模拟开始信息
disp(datetime('now')) disp(['starting runGreenLight. Lamp type: ' args.lampType '. Filename: ' filename '.']); tic;
- 显示当前时间和模拟开始的信息,并启动计时器。
重置警告信息
lastwarn('', ''); % reset "last warning"
- 重置 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
格式转换为从数据开始时刻起的秒数。
创建温室模型
gl = createGreenLightModel(args.lampType, weather, startTime); setParams4haWorldComparison(gl); % set parameters according to a modern greenhouse setParam(gl, 'hElevation', elevation); % set elevation
- 创建温室模型
gl
,并根据现代温室的参数进行设置。 - 设置温室的海拔高度。
设置遮阳幕控制
%% 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);
- 根据全局辐射强度设置遮阳幕的控制策略。
设置灯具冷却时间
%% 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 灯具没有冷却时间。
添加热量回收
%% Add heat harvesting if args.heatHarvest addHeatHarvesting(gl); end
- 如果启用了热量回收,则将其添加到模型中。
设置20小时光照周期
%% Set lamp control to twenty hours per day: from 22:00 to 18:00 if args.twentyHours setParam(gl, 'lampsOn', 22); end
- 如果启用了20小时光照周期,则设置灯具的控制策略。
设置渐变光照控制
%% 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
- 如果启用了渐变光照控制,则根据全局辐射强度设置灯具的渐变控制策略。
设置遮阳幕控制
%% 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
- 如果启用了遮阳幕,则设置其控制策略。
关闭锅炉
%% Switch off boiler if ~args.boiler setDef(gl.u.boil, '0'); end
- 如果关闭了锅炉,则将其设置为关闭状态。
设置光照加热场景的默认参数
%% Set defulat parameters for heating by light scenarios setHeatByLightParams(gl, args.lampType, args.ppfd, args.intPpfd)
- 设置光照加热场景的默认参数。
修改自定义参数
%% 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
- 根据输入的自定义参数名称和值修改模型参数。
运行模拟
%% 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
后缀。 - 如果需要保存模拟结果,则将结果保存到文件中。
- 停止计时器并发出提示音。
总结
这段代码主要用于模拟温室中的光照和加热场景,通过设置不同的参数(如灯具类型、光照强度、遮阳幕、热量回收等),可以生成不同的模拟结果并保存。代码结构清晰,注释详细,便于理解和修改。