PDE Thermal model computation speed
1 回表示 (過去 30 日間)
古いコメントを表示
Dear all,
I am currently using the PDE tool box to model a battery heating. Initially, the boundary conditions were all defined by convection and a constant ambient temperature.In said configuration, the computation time was around 10s.
Then, I changed one of the boundary conditions to a time dependent temperature boundary using the handle function : Tval = Tfun(location,state). In this case, the computation time was very long, requiring more than 10 minutes to obtain the results
I would like to know if this behavior is normal.
Here is my code:
Thermal=createpde('thermal','transient');
para= struct;
%%%%%%%%Parametres%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
para.rho=2845;
para.cp=1000;
para.kx=0.2;
para.ky=25;
para.convec= 10;
para.ambientT= 20;
c = [para.kx;para.ky];
%%%%%%% Geometrie%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
R1 = [3,4,-0.0105,0.0105,0.0105,-0.0105,0.035,0.035,-0.035,-0.035]';...
g=decsg(R1);
geometryFromEdges(Thermal,g);
hmax = .0025;
generateMesh(Thermal,'Hmax',hmax);
figure;
hold on
box on
pdegplot(Thermal,'EdgeLabels','on');
pdeplot(Thermal)
axis equal
%%%%%%Proprietes%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
thermalProperties(Thermal,'ThermalConductivity',c,...
'MassDensity',para.rho,...
'SpecificHeat',para.cp)
internalHeatSource(Thermal,@heatSourceFun)
%%%%%%Boundaries%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
thermalBC(Thermal,'Edge',4, ...
'ConvectionCoefficient',para.convec, ...
'AmbientTemperature',para.ambientT)
thermalBC(Thermal,'Edge',2 , ...
'ConvectionCoefficient',para.convec, ...
'AmbientTemperature',para.ambientT)
%
% thermalBC(Thermal,'Edge',1 , ...
% 'ConvectionCoefficient',para.convec,...
% 'AmbientTemperature',para.ambientT)
%
thermalBC(Thermal,'Edge',3 , ...
'ConvectionCoefficient',para.convec,...
'AmbientTemperature',para.ambientT)
thermalBC(Thermal,'Edge', 1, 'Temperature',@Tfun)
thermalIC(Thermal,30);
%Solve
tlist=1:2100;
thermalresults = solve(Thermal,tlist);
T = thermalresults.Temperature;
Modele_plot;
And here is my Tfun function
function Tval = Tfun(location,state)
load('sup.mat')% experimental data
if isnan(state.time)
Tval= NaN(length(location.x));
elseif state.time<=1
Tval= 30*ones(length(location.x));
elseif state.time>1
Tval=sup(floor(state.time))*ones(length(location.x));
end
end
Thanks in advance,
Juan.
0 件のコメント
回答 (1 件)
Ravi Kumar
2019 年 3 月 12 日
Hi Juan,
Nonconstant BC would take longer than constant BC. However, the increase you are observing seems abnormal, given that you are not modelling any nonlinear behavior.
Two suggestions:
1. Move the load outside of the function. You can do that by wrapping the Tfun as an outer function that taken required two arguments, but then calls an inner computation function that takes three arguments, location, state, and sup. Something like:
load('sup.mat')
Tfunc = @(location,state) TfuncComputation(location,state,sup);
rename you current Tfunc definitation as TfuncComputation. (Make sure you get the syntax correct.)
2. Use 'Vectorized' option in thermalBC
thermalBC(model,'Temperature',@Tfunc,'Vectorized','on')
Regards,
Ravi
2 件のコメント
Ravi Kumar
2019 年 3 月 14 日
Hi Juan,
In this case you can compute the heat flux in a function and specify it using 'HeatFlux'.
thermalBC(Thermal,'Edge',3,'HeatFlux', @heatFlux)
You can use the ambient termperature and heat transfer coefficents to comptute the resulting heat flux in quite general form.
Regards,
Ravi
参考
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!