sandbox/easystab/stretching_formula.m

    This code is a validation of the stretching formula for free_surface_mapping.m. In this code, we do not use the numerical mapping map2D.m: we want the analytical formula because the stretching is itself one of the unknown of the system.

    clear all; clf; format compact
    disp('%%%%%%%%%')
    
    % parameters
    Lx=1;
    Ly=1;
    Nx=20;
    Ny=20;
    method='cheb';
    
    % differentiation
    [d.x,d.xx,d.wx,x]=dif1D(method,0,Lx,Nx,5);
    [d.y,d.yy,d.wy,y]=dif1D(method,0,Ly,Ny,5);
    [D,l,X,Y,Z,I,NN]=dif2D(d,x,y);
    

    Stretching function

    We introduce a stretching of the mesh \displaystyle \bar{x}=x, \bar{y}=\eta(x)y where x and y are the rectangular computational coordinates, and \bar{x} and \bar{y} are the physical coordinates. In this code, everything that is related to the physical domain has subscript p.

    Also, in the doce, we have te variable e which is a vector with Nx elements, and E which is an array with N_y\timesN_x elements, where we copy e for every grid point of the mesh.

    % stretching function eta
    e=1-0.3*sin(x*pi);
    ex=d.x*e; exx=d.xx*e;
    E=ones(Ny,1)*e';E=E(:);
    Ex=ones(Ny,1)*ex'; Ex=Ex(:);
    Exx=ones(Ny,1)*exx'; Exx=Exx(:);
    
    % physical mesh
    Xp=X;
    Yp=Y.*reshape(E,Ny,Nx);
    

    The mapping

    The first useful thing is to get the expression of the derivative of the computational coordinates with respect to the physical coordinates \displaystyle \begin{array}{l} x_\bar{x}=1\\ y_\bar{x}=-y\eta^{-1}\eta_x\\ x_\bar{y}=0\\ y_\bar{y}=\eta^{-1}\\ \end{array}

    Then we use the composition of derivatives to get the expression of the differentiation in physical space in terms of the computational differentiation matrices \displaystyle \begin{array}{l} \phi(x,y)_{\bar{x}}=\phi_x x_\bar{x}+\phi_y y_\bar{x}=\eta^{-1}\phi_y\\ \phi(x,y)_{\bar{y}}=\phi_x x_\bar{y}+\phi_y y_\bar{y}=\phi_x-y\eta^{-1}\eta_x\phi_y\\ \end{array} We do the same operations for the expression of the Laplacian \displaystyle \phi_{\bar{x}\bar{x}}+\phi_{\bar{y}\bar{y}}=(\phi_\bar{x})_\bar{x}+(\phi_\bar{y})_\bar{y} and we get \displaystyle \phi_{\bar{x}\bar{x}}+\phi_{\bar{y}\bar{y}}= \begin{array}{l} \phi_{xx}(1)\\ +\phi_{xy}(-2y\eta^{-1}\eta_x)\\ +\phi_{yy}(y^2\eta^{-2}\eta_x^2+\eta^{-2})\\ +\phi_y(y[2\eta^{-2}\eta_x^2-\eta^{-1}\eta_{xx}])) \end{array}

    % Build physical space differentiation matrices
    Dp.x=D.x ...
        -diag(Y(:).*E.^-1.*Ex)*D.y;
    Dp.y=diag(E.^-1)*D.y;
    
    Dp.lap=D.xx ...
        +diag(-2*Y(:).*E.^-1.*Ex)*(D.x*D.y) ...
        +diag(Y(:).^2.*E.^-2.*Ex.^2+E.^-2)*D.yy ...
        +diag(Y(:).*(2*E.^-2.*Ex.^2-E.^-1.*Exx))*D.y;
    
    % Validation
    phi=cos(pi*Xp).*sin(pi*Yp);
    phix=-pi*sin(pi*Xp).*sin(pi*Yp);
    phixx=-pi^2*cos(pi*Xp).*sin(pi*Yp);
    phiy=pi*cos(pi*Xp).*cos(pi*Yp);
    phiyy=-pi^2*cos(pi*Xp).*sin(pi*Yp);
    
    mesh(Xp,Yp,phi); hold on; 
    plot3(x,Ly*e,0*x,'k-');
    view(112,38); hold off
    xlabel('x'); ylabel('y'); zlabel('phi'); title('phi');
    legend('phi','e')
    
    err_x=norm(phix(:)-Dp.x*phi(:))
    err_y=norm(phiy(:)-Dp.y*phi(:))
    err_lap=norm(phixx(:)+phiyy(:)-Dp.lap*phi(:))
    
    set(gcf,'paperpositionmode','auto');
    print('-dpng','-r80','stretching_formula.png');
    

    Which gives the reassuring screen output

    err_x =
       5.1937e-08
    err_y =
       3.8849e-13
    err_lap =
       1.8580e-05

    and the figure Figure