sandbox/easystab/blasiusf.m
Simply the code for the Blasius boundary layer profile blasius.m, made into a function.
Input:
- L is the domain height (typically 10)
- N is the numbre of grid points (Typically 100)
Output
- y are the grid poins
- u the velocity profile on this grid
function [y,u]=blasiusf(L,N);
% differentiation matrices
scale=-2/L;
[y,DM] = chebdif(N,3);
dy=DM(:,:,1)*scale;
dyy=DM(:,:,2)*scale^2;
dyyy=DM(:,:,3)*scale^3;
y=(y-1)/scale;
I=eye(N); Z=zeros(N,N);
% initial guess from order 4 Polhausen profile
scalepol=6*sqrt(35/37);
eta=y/scalepol; deta=dy*scalepol; % rescaled vertical coordinate
u0=1-(1-eta).^3.*(1+eta);
u0(eta>1)=1;
A=deta; A(1,:)=I(1,:); u0(1)=0; % set up integration
g0=A\u0; % compute integral
sol=g0;
% Newton iterations
quit=0;count=0;
while ~quit
% the present solution and its derivatives
g=sol; gy=dy*g; gyy=dyy*g; gyyy=dyyy*g;
% nonlinear function
f=2*gyyy+g.*gyy;
% analytical jacobian
A=2*dyyy+diag(g)*dyy+diag(gyy)*I;
% Boundary conditions
loc=[1,2,N];
C=[I(1,:); dy(1,:); dy(N,:)];
f(loc)=C*g-[0;0;1];
A([1,2,N],:)=C;
% convergence test
res=norm(f);
disp([num2str(count) ' ' num2str(res)]);
if count>50|res>1e5; disp('Blasius: no convergence'); break; end
if res<1e-5; quit=1; disp('Blasius: converged'); continue; end
% Newton step
sol=sol-A\f;
count=count+1;
end
% the velocity profile
u=dy*g;