Why using a function handle for ThermalConductivity is not changing resulting temperature plot?

When implementing the spatial dependency of thermal conductivity as follows:
k1=@(location,~) 1*location.x;
k2=@(location,~) 20*location.x;
thermalProperties(model,'Face',2,'ThermalConductivity',k1);
thermalProperties(model,'Face',1,'ThermalConductivity',k2);
The results shows that the solver is only using 'k1' for both domains.
So you finally see the following plot, when using the code:
%%set geometry up and solve
model = createpde('thermal','steadystate');
R1=[3 4 0 1 1 0 0 0 1 1]';
R2=[3 4 0.5 1 1 0.5 0.5 0.5 1 1]';
gm=[R1,R2];
sf='R1+R2';
ns=char('R1','R2')
ns=ns';
g=decsg(gm,sf,ns);
figure(1)
pdegplot(g,'FaceLabels','on','EdgeLabels','on')
%%create mesh
geometryFromEdges(model,g)
generateMesh(model,'Hmax',0.025);
figure(2)
pdemesh(model);
%%set boundary conditions
temperatureTop=@(location,~) 1*location.x
thermalBC(model,'Edge',[1],'Temperature',0);
thermalBC(model,'Edge',[7:8],'Temperature',temperatureTop);
thermalBC(model,'Edge',[2],'HeatFlux',0);
thermalBC(model,'Edge',[5:6],'HeatFlux',0);
%Here you can find the function handles for the ThermalConductivity
k1=@(location,~) 1*location.x;
k2=@(location,~) 20*location.x;
thermalProperties(model,'Face',2,'ThermalConductivity',k2);
thermalProperties(model,'Face',1,'ThermalConductivity',k1);
%%solve model
result = solve(model);
temp = result.Temperature;
[qx,qy] = result.evaluateHeatFlux;
figure(3)
pdeplot(model,'XYData',temp,'Contour','on');
set(gca,'box','on')

 採用された回答

MathWorks Support Team
MathWorks Support Team 2019 年 4 月 17 日
編集済み: MathWorks Support Team 2019 年 4 月 17 日

The Solver is misclassifying thermal conductivity as global assignment with k1=@(location,~) 1*location.x;. This is happening because at location.x = 0, which is the query point used to detect difference in conductivity, both k1 and k2 yield the same value of zero.

In the meantime a workaround is to add a small noise, like k2=@(location,~) 20*location.x + eps, this should give the correct results.

The code with the workaround looks like the following:

%% set geometry up and solve 
model = createpde('thermal','steadystate'); 
R1=[3 4 0 1 1 0 0 0 1 1]'; 
R2=[3 4 0.5 1 1 0.5 0.5 0.5 1 1]'; 
gm=[R1,R2]; 
sf='R1+R2'; 
ns=char('R1','R2') 
ns=ns'; 
g=decsg(gm,sf,ns); 
figure(1) 
pdegplot(g,'FaceLabels','on','EdgeLabels','on') 
%% create mesh 
geometryFromEdges(model,g) 
generateMesh(model,'Hmax',0.025); 
figure(2) 
pdemesh(model); 
%% set boundary conditions 
temperatureTop=@(location,~) 1*location.x 
thermalBC(model,'Edge',[1],'Temperature',0); 
thermalBC(model,'Edge',[7:8],'Temperature',temperatureTop); 
thermalBC(model,'Edge',[2],'HeatFlux',0); 
thermalBC(model,'Edge',[5:6],'HeatFlux',0); 
%Here you can find the function handles for the ThermalConductivity
k1=@(location,~) 1*location.x; 
k2=@(location,~) 20*location.x+eps; %here you see the fix with 'eps'
thermalProperties(model,'Face',2,'ThermalConductivity',k2); 
thermalProperties(model,'Face',1,'ThermalConductivity',k1); 
%% solve model 
result = solve(model); 
temp = result.Temperature; 
[qx,qy] = result.evaluateHeatFlux; 
figure(3) 
pdeplot(model,'XYData',temp,'Contour','on'); 
set(gca,'box','on')

This is the resulting plot:

Our development team is currently working on a fix for a future release. It seems to be that this will be fixed in one of the next releases after R2019a.

その他の回答 (0 件)

製品

リリース

R2019a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by