用有限差分法误差建模三角形

时间:2014-09-01 02:25:37

标签: matlab if-statement geometry

我正在尝试根据其尺寸在方形单元格中建模三角形。但是,我对部分代码有一些问题,我认为它可能是我编程背后的逻辑或代码本身的定义。

% Simulation for triangle

clear all;
clc
clear window 

%% INITIAL PARAMETERS

% Variables
ni=21;                % number of nodes in the cell - x axis
nj=21;                % number of nodes in the cell - y axis
delta_sq=0.3;         % microasperity area density (MAXIMUM 0.433)
u=3.5;                 % slider speed [m/s]
v=0.8;                 % lubricant viscosity [Pas]
F=98.1;                 % applied load [N/m^2]
h_init=20e-06;         % initial guess of film thickness [m]
e_converge=0.0001;     % convergence limit
i_max=500             % maximum number of iterations

% Constants
r_1=600e-06;           % length of half unit cell [m]
P_out=0;              % outer pressure boundary [N/m^2]
P_init=0;               % inner pressure boundary [N/m^2]
P_cav=0;              % cavitation pressure [N/m^2]


%% MESH
R_X=2*r_1;               % length of unit cell - x axis
R_Y=2*r_1;               % length of unit cell - y axis
dX=R_X/(ni-1);          % number of mesh of unit cell - x axis
dY=R_Y/(nj-1);           % number of mesh of unit cell - y axis
X(1)=-R_X/2;             % film thickness at first node - x axis
Y(1)=-R_Y/2;             % film thickness at first node - y axis

for ii=2:(2*ni-1),
    X(ii)=X(ii-1)+dX/2;   % location of intermediate nodes - x axis
end

for jj=2:(2*nj-1),
    Y(jj)=Y(jj-1)+dY/2; % location of intermediate nodes - y axis
end


%% GEOMETRICAL BOUNDARIES

L_triangle=sqrt((delta_sq*16*(r_1)^2)/(sqrt(3)));% side length of triangle

h_step = 5e-06; % step microasperity depth

nHi=max(size(X));
nHj=max(size(Y));

% flat step condition
for ii=1:nHi,
    for jj=1:nHj,
        h(ii,jj)=h_init;
        if X(ii)>(-L_triangle/3) & X(ii)<0;
            if Y(jj)>0;
                if Y(jj)>0 & Y(jj)<((L_triangle+3*X(ii))/(sqrt(3)));
                    h(ii,jj)=h_init+h_step;
                else
                    h(ii,jj)=h_init;
                end
            end
            if Y(jj)<0;
                if Y(jj)>(-L_triangle/(2*sqrt(3))) & Y(jj)<0;
                    h(ii,jj)=h_init+h_step;
                else
                    h(ii,jj)=h_init;
                end
            end
        end
        if X(ii)>0 & X(ii)<(L_triangle/3);
            if Y(jj)>0;
                if Y(jj)>0 & Y(jj)<((L_triangle-3*X(ii))/sqrt(3));
                    h(ii,jj)=h_init+h_step;
                else
                    h(ii,jj)=h_init;
                end
            end
           if Y(jj)<0;
                if Y(jj)>(-L_triangle/(2*sqrt(3))) & Y(jj)<0;
                    h(ii,jj)=h_init+h_step;
                else
                    h(ii,jj)=h_init;
                end
           end
        end
        if X(ii)>0 & X(ii)<(L_triangle/2)    ;
            if Y(jj)<0;
                if Y(jj)>(((-3*X(ii))+L_triangle)/sqrt(3)) & Y(jj)<0;
                    h(ii,jj)=h_init+h_step;
                else
                    h(ii,jj)=h_init;
                end
            end
        end
        if X(ii)>(-L_triangle/2) & X(ii)<0;
            if Y(jj)<0;
                if Y(jj)>(-sqrt(3)*(-3*X(ii)-L_triangle)/3) & Y(jj)<0;
                    h(ii,jj)=h_init+h_step;
                else
                    h(ii,jj)=h_init;
                end
            end
        end
    end
end






%% Pressure

k=1;               
for ii=1:ni,
   for jj=1:nj,
      P(ii,jj,k)=P_init;
end 
end

%Define Coefficients
i=0;
for ii=1:2:nHi,
   i=i+1;
   j=1;
   if ii==1,
      for jj=3:2:nHj-2,
         j=j+1;
            A(i,j)=((6*v*u/dX)*(h(ii+1,jj)-h(nHi-1,jj)))/((h(nHi-1,jj)^3+h(ii+1,jj)^3)/dX^2+(h(ii,jj-1)^3+h(ii,jj+1)^3)/dY^2);
            B(i,j)=((h(ii+1,jj)^3)/dX^2)/((h(nHi-1,jj)^3+h(ii+1,jj)^3)/dX^2+(h(ii,jj-1)^3+h(ii,jj+1)^3)/dY^2); 
            C(i,j)=((h(nHi-1,jj)^3)/dX^2)/((h(nHi-1,jj)^3+h(ii+1,jj)^3)/dX^2+(h(ii,jj-1)^3+h(ii,jj+1)^3)/dY^2); 
            D(i,j)=((h(ii,jj+1)^3)/dY^2)/((h(nHi-1,jj)^3+h(ii+1,jj)^3)/dX^2+(h(ii,jj-1)^3+h(ii,jj+1)^3)/dY^2); 
            E(i,j)=((h(ii,jj-1)^3)/dY^2)/((h(nHi-1,jj)^3+h(ii+1,jj)^3)/dX^2+(h(ii,jj-1)^3+h(ii,jj+1)^3)/dY^2); 
      end
      elseif ii==nHi,
        for jj=3:2:nHj-2,
        j=j+1;
            A(i,j)=((6*v*u/dX)*(h(2,jj)-h(ii-1,jj)))/((h(ii-1,jj)^3+h(2,jj)^3)/dX^2+(h(ii,jj-1)^3+h(ii,jj+1)^3)/dY^2);
            B(i,j)=((h(2,jj)^3)/dX^2)/((h(ii-1,jj)^3+h(2,jj)^3)/dX^2+(h(ii,jj-1)^3+h(ii,jj+1)^3)/dY^2);
            C(i,j)=((h(ii-1,jj)^3)/dX^2)/((h(ii-1,jj)^3+h(2,jj)^3)/dX^2+(h(ii,jj-1)^3+h(ii,jj+1)^3)/dY^2);
            D(i,j)=((h(ii,jj+1)^3)/dY^2)/((h(ii-1,jj)^3+h(2,jj)^3)/dX^2+(h(ii,jj-1)^3+h(ii,jj+1)^3)/dY^2);
            E(i,j)=((h(ii,jj-1)^3)/dY^2)/((h(ii-1,jj)^3+h(2,jj)^3)/dX^2+(h(ii,jj-1)^3+h(ii,jj+1)^3)/dY^2);
        end 
        else
     for jj=3:2:nHj-2,
        j=j+1;
            A(i,j)=((6*v*u/dX)*(h(ii+1,jj)-h(ii-1,jj)))/((h(ii-1,jj)^3+h(ii+1,jj)^3)/dX^2+(h(ii,jj-1)^3+h(ii,jj+1)^3)/dY^2);
            B(i,j)=((h(ii+1,jj)^3)/dX^2)/((h(ii-1,jj)^3+h(ii+1,jj)^3)/dX^2+(h(ii,jj-1)^3+h(ii,jj+1)^3)/dY^2);
            C(i,j)=((h(ii-1,jj)^3)/dX^2)/((h(ii-1,jj)^3+h(ii+1,jj)^3)/dX^2+(h(ii,jj-1)^3+h(ii,jj+1)^3)/dY^2);
            D(i,j)=((h(ii,jj+1)^3)/dY^2)/((h(ii-1,jj)^3+h(ii+1,jj)^3)/dX^2+(h(ii,jj-1)^3+h(ii,jj+1)^3)/dY^2);
            E(i,j)=((h(ii,jj-1)^3)/dY^2)/((h(ii-1,jj)^3+h(ii+1,jj)^3)/dX^2+(h(ii,jj-1)^3+h(ii,jj+1)^3)/dY^2);
     end 
    end
end

%Solution Kernal
err=1.0;
 while err>e_converge,
%Set the boundary conditions
    for ii=1:ni,
    P(ii,1,k)=P_init;
    P(ii,nj,k)=P_out;
    end
    for i=1:ni,
    for j=2:nj-1,
         if i==1,
            P(i,j,k+1)=(A(i,j)+B(i,j)*P(i+1,j,k)+C(i,j)*P(ni,j,k)+D(i,j)*P(i,j+1,k)+E(i,j)*P(i,j-1,k));
            elseif i==ni,
            P(i,j,k+1)=(A(i,j)+B(i,j)*P(1,j,k)+C(i,j)*P(i-1,j,k)+D(i,j)*P(i,j+1,k)+E(i,j)*P(i,j-1,k));
         else
            P(i,j,k+1)=(-A(i,j)+B(i,j)*P(i+1,j,k)+C(i,j)*P(i-1,j,k+1)+D(i,j)*P(i,j+1,k)+E(i,j)*P(i,j-1,k+1));
         end
            if P(i,j,k+1)<P_cav
               P(i,j,k+1)=P_cav;
            end
    end
    end


% error check point
   PP=max(max(P(:,:,k+1)));
   LIM=0;
   for i=1:ni,
    for j=2:nj-1,
         conv=(P(i,j,k+1)-P(i,j,k))/PP;
         LIM=LIM+conv^2;
    end
   end
   err=1/((ni)*(nj-2))*sqrt(LIM);
   k=k+1;
   if k>i_max,
        k
    break 
    end
end

% Final iteration
for ii=1:ni,
    P(ii,1,k)=P_init;
    P(ii,nj,k)=P_out;
end
for ii=1:ni,
  for jj=1:nj,
      P_solution(ii,jj)=P(ii,jj,k);
  end
end

i=0;
for ii=1:2:nHi,
   i=i+1;
     x_i(i)=X(ii);
    y_j(i)=Y(ii);
end

Maximum_Pressure=max(max(P_solution))
Average_Pressure=mean(mean(P_solution))
Minimum_Pressure=min(min(P_solution))

figure
surf(X,Y,h)

figure
surf(y_j,x_i,P_solution)

我附上了代码。问题在于三角形的后半部分。我还附上了我的分析基础。问题出在代码的-s / 2到s / 2之间。任何有关我的代码或定义的错误逻辑的提示都将受到赞赏。单元格是方形尺寸,具有2r1 x 2r1尺寸

当你运行代码时,三角形的上半部分看起来很好,但下半部分不是。我附上了我的代码背后的分析图像。

http://postimg.org/image/kvn2xqlcx/

1 个答案:

答案 0 :(得分:1)

一般来说,这种问题在堆栈溢出时是不鼓励,因为问题涉及非常具体的代码的调试,因此对将来的其他人没什么用处。

有关此代码的一些提示

  1. 你不应该忽略lint警告(你在MATLAB编辑器中看到的橙色下划线) - 他们出于某种原因。 There's a known joke on this topic...
  2. 如果使用clear all代替clear variables,代码将更容易调试 - 原因是clear all也清除断点(您通常希望保留断点)。
  3. 我建议在初始化时添加close all force以删除之前打开的数字。
  4. 您应该真正了解vectorization - 这可以(通常)帮助您的代码更快地运行并且更具可读性。
  5. 话虽如此 - 这应该可以解决您的问题(通过以下方式替换您的行89-106):

        if X(ii)>0 && X(ii)<(L_triangle/2);
            if Y(jj)<0;
                if Y(jj)>(((-3*X(ii))+L_triangle)/sqrt(3));
                    h(ii,jj)=h_init;
                else
                    h(ii,jj)=h_init+h_step;
                end
            end
        end
        if X(ii)>(-L_triangle/2) && X(ii)<0;
            if Y(jj)<0;
                if Y(jj)>(-sqrt(3)*(-3*X(ii)-L_triangle)/3);
                    h(ii,jj)=h_init;
                else
                    h(ii,jj)=h_init+h_step;
                end
            end
        end
        if X(jj)<(-L_triangle/(2*sqrt(3)))
            h(ii,jj)=h_init;
        end
    

    您在错误的地方添加了+h_step,并且还在&#34;&#34;三角形不见了。