sandbox/easystab/thermal_entrance.m

    The thermal entrance problem

    % thermal entrance
    
    clear all; clf; format compact
    
    %%%% parameters 
    Pe=10000; % Peclet number
    Nx=101; % number of grid nodes in z
    Ny=40; %number of grid nodes in y
    Lx=30; % length in x of the domain [0,Lz]
    Ly=1; % Radius of the domain
    pts=5; % number of points in finite difference stencils
    xch=Lx/4; % location of x where there is a temperature change
    lch=Lx/100; % length in xfor the change of the temperature
    
    % differentiation 
    [d.x,d.xx,d.wx,x]=dif1D('fd',0,Lx,Nx,5);
    [d.y,d.yy,d.wy,y]=dif1D('cheb',0,Ly,Ny);
    [D,l,X,Y]=dif2D(d,x,y);
    NN=Nx*Ny; Z=spalloc(NN,NN,0); I=speye(NN); 
    
    % System matrices 
    A=(D.yy+diag(1./Y(:))*D.y+D.xx)/Pe-diag(1-Y(:).^2)*D.x;
    b=zeros(NN,1);
    
    % initial guess
    T0=0*X; T0=(1-tanh((X-xch)/lch))/2; 
    %mesh(X,Y,reshape(T0,Ny,Nx)); break
    
    % boundary conditions
    dir=[l.left;l.top;l.ctl;l.cbl;l.ctr];
    neux=[l.right;l.cbr];
    neuy=l.bot;
    loc=[dir;neux;neuy];
    C=[I(dir,:); D.x(neux,:); D.y(neuy,:)];
    A(loc,:)=C;
    b(loc,:)=C*T0(:);
    
    % solve system
    T=A\b;
    
    % show solution
    subplot(2,1,1);
    T=reshape(T,Ny,Nx);
    surf(X,Y,T); shading interp; view(2)
    xlabel('x');ylabel('r');title('temperature distribution')
    
    % validation
    subplot(2,1,2);
    indvec=1:10:Nx;
    co=jet(length(indvec));
    % rescale the profiles in y
    for ind=1:length(indvec);
        lo=indvec(ind);
    plot(T(:,lo),Pe^(1/3)*(1-y)/x(lo)^(1/3),'color',co(ind,:));
    hold on
    end
    
    % the analytical solution for the profile (Leveque)
    yy=linspace(0,4,100);
    f=gammainc(2*yy.^3/9,1/3);
    plot(f,yy,'k','linewidth',2);
    xlabel('temperature');ylabel('scaled y')
    title('self-similar solution and numerical');
    hold off
    axis([0,1,0,3])