sandbox/easystab/domain_derivative_1D.m
Testing the domain geometry derivative
Here we use a method close to the “flattening” used typically for the stability of flows with a free-surface, like for instance free_surface_gravity.m.
The problem we awant to solve is \displaystyle h_{xx}+2=0 on the domain, with boundary conditions \displaystyle h(0)=0, h(L)=0, h_x(L)=p so I have a second derivative problem for which I should impose two boundary conditions. But I want to impose one more condition, the value of the slope at the right boundary. So I need to let something free. Thus I let free the position of the right boundary L. Thus the right boundary is at x=L+\ell.
clear all; clf;
% parameters
N=50; % number of grid points
p=-1.2; % desired slope at L
% useful
[d.x,d.xx,d.wx,x]=dif1D('cheb',0,1,N);
Z=zeros(N,N);
I=eye(N);
%initial guess
sol0=[x.*(1-x);0];
sol=sol0;
% Newton iterations
quit=0;count=0;
while ~quit
% the present solution and its derivatives
h=sol(1:N); hx=d.x*h; hxx=d.xx*h;
l=sol(N+1);
The nonlinear function
The computational domain is fixed on [0,1], and the function is modeled outside of the domain by using a linear extrapolation. Thus the function that should be zero is \displaystyle f(q)=f\begin{pmatrix}h\\\ell \end{pmatrix}= \begin{pmatrix} h_{xx}+2\\ h|_L+\ell h_x|_L-p \end{pmatrix}=0.
% nonlinear function
f=[hxx+2; hx(N)+l*hxx(N)-p];
The Jacobian
The actual guess for the solution of the problem is q, and we search the perturbation \tilde{q} such that q+\tilde{q} is closer to the actual solution. We approximate this function at first order \displaystyle f(q+\tilde{q})=f\begin{pmatrix}h+\tilde{h}\\\ell+\tilde{\ell} \end{pmatrix}= \begin{pmatrix} h_{xx}+\tilde{h}_{xx}+2\\ h|_L+\tilde{h}|_L+(\ell+\tilde{\ell}) (h_x|_L+\tilde{h}_x|_L)-p \end{pmatrix}\approx f(q)+A\tilde{q}=0 with \displaystyle A=\begin{pmatrix}{cc} \partial_{xx} & 0\\ \partial_x|_L+\ell\partial_{xx}|_L & h_xx|_L \end{pmatrix}
% analytical jacobian
A=[d.xx, Z(:,1); ...
d.x(N,:)+l*d.xx(N,:), hxx(N)];
Boundary conditions
We have nonlinear boundary conditions because of the extrapolation \displaystyle \begin{array} h(0)=0\\ h(L+\ell)\approx h|_L+\ell h_x|_L=0\\ \end{array} and the associated Jacobian lines after linearization are \displaystyle \begin{pmatrix}{cc} I|_0 & 0\\ I|_L+\ell\partial_x|_L & h_x|_L \end{pmatrix}
% Boundary conditions
loc=[1 N];
f(loc)=[h(1); h(N)+l*hx(N)];
A(loc,:)=[I(1,:), 0; ...
I(N,:)+l*d.x(N,:),hx(N)];
% Show present solution
x2=linspace(1-2*abs(l),1+2*abs(l),20);
plot(x,h,'b-',1+l,0,'ro',x2,h(N)+(x2-1)*hx(N),'r',x(N),h(N),'b.',[1,1],[-0.5,0.5],'k--',[0,1.5],[0,0],'k--');
xlim([0,1.5]);grid on; drawnow;
% convergence test
res=norm(f,inf);
disp([num2str(count) ' ' num2str(res)]);
if count>50|res>1e5; disp('no convergence'); break; end
if res<1e-9; quit=1; disp('converged'); continue; end
% Newton step
sol=sol-A\f;
count=count+1;
end
set(gcf,'paperpositionmode','auto')
print('-dpng','-r80','domain_derivative_1D.png')
The figure
Here the solution h is shown in blue and the linear extrapolation is shown in red.
Exercices/Contributions
- Please
- Please
%}