PDE toolbox and non-constant coefficients

조회 수: 6 (최근 30일)
Flo brd
Flo brd 2018년 10월 4일
댓글: Flo brd 2018년 11월 20일
Hi Matlab experts.
I am playing with the C coefficient, and would like to set it as a state dependent coefficient. While I am more and more understanding the nature of function handle as stated in the matlab help for the c coefficient ( Here ), I am a left with few questions:
- I am solving only 1 equation ( model = createpde(1) ). if the c coefficient is constant the program works well. As long as I try to make it state.u dependent, it either doesn't work, or gives me Warning about integration tolerances. I am therefore unsure about the structure of state . The help says that the state.u field represents the current value of the solution u, and that starts to confuse me a bit. As I am trying to solve for pressure diffusion, I would have assume that state.u was a value of pressure in whichever unit I am using, but I am slowly starting to doubt it.
- again in the help, the cmatrix vector is built depending on the N variable. As my N=1, I would have assumed that I needed to fill in cmatrix(1,:) with my calculations around state.u. I guess here again I am wrong, and I don't really get what to do anymore in order to ouput the right vector format.
I join pieces of my code. The idea is to use state.u (assuming to is a pressure) to recalculate the permeability of my 2D field.
function cmatrix = DiffusivityV4(location,state,ki, depth,density, T)
N = 1;
nr = length(location.x);
confiningStress = density*9.81*depth*1e-6;
Cp = 0.000000001;
T = T+273.15;
A=2.414*10^-5;
B=247.8;
C=140;
u = A*10^(B/(T-C));
gamma = (0.012+0.013)/2;
cmatrix = zeros(N,nr);
try
cmatrix(1,:) = (ki-(0.04343*gamma*(confiningStress-state.u(1,:))))/(u*Cp);
if isnan(cmatrix)
cmatrix(N,nr)=0;
end
catch
cmatrix(N,nr)=0;
end
end
This function is called this way:
Dcore= @(location, state) DiffusivityV4(location,state,1e-17,4000, 2700, 200);
specifyCoefficients(model,'m',0,'d',d,'c',Dcore,'a',a,'f',f, 'face',1);
Please let me know if you need any other information about my code. I am really new to function handle and the PDE toolbox, so sorry by advance if I did misunderstand the way it works.

채택된 답변

Ravi Kumar
Ravi Kumar 2018년 10월 4일
Hello Flo,
Your understanding of the function_handle and c-coefficient are correct. The state.u is the value of the solution at the current iteration. Please note when your c-coefficient is a function of state.u, that means you are solving a nonlinear problem. Solver will take multiple steps iteratively to move towards solution, state.u is the one such intermediate approximation in the solution iterations.
You have provided some information in this post and also in separate <https://www.mathworks.com/matlabcentral/answers/421773-pde-toolbox-undefined-function-mtimes-for-input-arguments-of-type-function_handle post >. However, it is not complete setup which can be used to reproduce the issue you are facing.
I have a suggestion based on the information I gathered from your posts, remove the following from your DiffusivityV4 function:
if isnan(cmatrix)
cmatrix(N,nr)=0;
end
Solver passes state.u as NaN to determine if the function is nonlinear. This might fix your problem. If not please update this post with a complete reproduction code.
  댓글 수: 1
Flo brd
Flo brd 2018년 11월 20일
Thank you for your help. So I tried everything you said and I think my issue was linked to the maths behind my equation rather than a misunderstanding of the PDE toolbox.
It compiles now :)
Flo

댓글을 달려면 로그인하십시오.

추가 답변 (0개)

카테고리

Help CenterFile Exchange에서 PDE Solvers에 대해 자세히 알아보기

태그

Community Treasure Hunt

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

Start Hunting!

Translated by