me471s03_lec07

Upload: hasen-bebba

Post on 01-Jun-2018

215 views

Category:

Documents


0 download

TRANSCRIPT

  • 8/9/2019 me471s03_lec07

    1/9

    Problems in Two Spacial Dimensions

    Bilinear rectangular elements.

    We need to discuss briefly an alternate method of finite element interpolation: continuous, bilinearinterpolation on rectangles. Suppose a rectangular grid of lines x  =  x

    i, y  =  y

    j, i  ∈  N

    n, j  ∈  N

    m(where  Nk  = {1, . . . , k}) is drawn in the plane forming a system of rectangles  Rij  = {(x, y) :  xi  ≤x  ≤   xi+1, yj   ≤  y  ≤  yj+1}. Assume further that the domain  D   can be approximated by  ∪I Rij ,where  I  ⊂  Nn × Nm. For example, D  might be a rectangle  D  = {(x, y) :  a  ≤ x  ≤  b, c  ≤  y  ≤  d}and the grid lines  xi  =  a  + b(i − 1)/n, yj   =  c  + b( j − 1)/m,   i  ∈  Nn, j  ∈  Nm. Although it wouldbe possible the subdivide each  Rij  into two triangles, it is natural to attempt to use the rectangulargrid itself. Let  Re   be a rectangle in the grid, and consider interpolating a function  u  defined onRe   using the values of   u   =   uj   at the corners   z

    ej , j   = 1, 2, 3, 4 of this rectangle. Let’s label the

    corners of  Re   so that  ze1   = (a

    e, be) is the lower left,  ze2   = (ce, be) the lower right,  ze3   = (c

    e, de) theupper right, and   ze4   = (a

    e, de) the upper left (so   ae < ce, be < de). The interpolation is easilyaccomplished if we define bilinear function  H ej (x, y) such that  H 

    ei (z

    ej ) =  δ ij  = 1, i =  j, 0 otherwise.

    If  hex = (ce − ae), hey  = (d

    e − be) denote the side lengths of  Re, then

    H e =

    H e1H e2

    H e3H e4

    =

    (ce − x)(de − y)/(hex

    hey

    )(x− ae)(de − y)/(hexh

    ey)

    (x− ae)(y − be)/(hexhey)

    (ce − x)(y − be)/(hexhey)

    Using these functions we can write  u  =4

    j=1 H ej uj  = H 

    eT U,  where  U  = [u1, . . . , u4]T .  It is easy tosee that this representation is unique. (If there were two representations then the difference wouldbe a bilinear function  f  vanishing at all  zej , and hence would be identically zero. Since  f  restrictedto the line through  ze1, z

    e2  is a linear function of  x  vanishing at  x  =  a

    e and  f  restricted to the linethrough  ze2, z

    e3   is a linear function of  y  vanishing at  y  =  b

    e,  we must have  f   =  α(x − ae)(y − be).Since f (ze3) = 0,  αh

    exh

    ey  = 0 ⇒ α = 0.)

    The assembly process using rectangular elements is basically the same as that using triangles. Of course, the number of nodes per element is now 4, and the element stiffness and load matrices are

    4 by 4 and 4 by 1 respectively.Let’s now consider an example from our textbook using bilinear elements.

    function ex592a(nx,ny)

    %----------------------------------------------------------------------------

    % Modified textbook file EX5.9.2.m

    % to solve the two-dimensional Laplace’s equation given as

    % u,xx + u,yy =0, 0 < x < 5, 0 < y < 10

    % u(x,0) = 0, u(x,10) = 100sin(pi*x/10),

    % u(0,y) = 0, u,x(5,y) = 0

    % using bilinear rectangular elements

    %(see Fig. 5.9.2 for the finite element mesh)

    %

    % Variable descriptions

    % k = element matrix

    % f = element vector

    % kk = system matrix

    % ff = system vector

    1

  • 8/9/2019 me471s03_lec07

    2/9

    % gcoord = coordinate values of each node

    % nodes = nodal connectivity of each element

    % index = a vector containing system dofs associated with each element

    % bcdof = a vector containing dofs associated with boundary conditions

    % bcval = a vector containing boundary condition values associated with

    % the dofs in ’bcdof’

    %----------------------------------------------------------------------------

    %------------------------------------

    % input data for control parameters

    %------------------------------------

    nx1=nx+1; ny1=ny+1;

    nel=nx*ny; % number of elements

    nnel=4; % number of nodes per element

    ndof=1; % number of dofs per node

    nnode=nx1*ny1; % total number of nodes in system

    sdof=nnode*ndof; % total system dofsxl=0; xr=5;

    yb=0; yt=10;

    %---------------------------------------------

    % input data for nodal coordinate values

    % gcoord(i,j) where i->node no. and j->x or y

    % input data for nodal connectivity for each element

    % nodes(i,j) where i-> element no. and j-> connected nodes

    %---------------------------------------------------------

    [gcoord, nodes]=gridgen([0,0],[5,10],nx,ny,1)

    gridplot(nx,ny,gcoord,nodes,1)

    %-------------------------------------

    % input data for boundary conditions

    %-------------------------------------

    bcdof=[1:nx1,... % base nodes

    nx1+1:nx1:nx1*(ny1-2)+1,... % left side nodes

    nx1*(ny1-1)+1:nx1*ny1]; % top nodes

    sz=size(bcdof);

    nbn=sz(2);

    bcval=zeros(1,nbn); xx=linspace(xl,xr,nx1);

    bcval(nbn-nx1+1:nbn)=100*sin(pi*(xx-xl)/10); % along y=yt, u(x,yt)=sin(pi*x/xr)

    %-----------------------------------------% initialization of matrices and vectors

    %-----------------------------------------

    ff=zeros(sdof,1); % initialization of system force vector

    2

  • 8/9/2019 me471s03_lec07

    3/9

    kk=zeros(sdof,sdof); % initialization of system matrix

    index=zeros(nnel*ndof,1); % initialization of index vector

    %-----------------------------------------------------------------

    % computation of element matrices and vectors and their assembly

    %-----------------------------------------------------------------

    for iel=1:nel % loop for the total number of elements

    for i=1:nnel

    nd(i)=nodes(iel,i); % extract connected node for (iel)-th element

    x(i)=gcoord(nd(i),1); % extract x value of the node

    y(i)=gcoord(nd(i),2); % extract y value of the node

    end

    xleng = x(2)-x(1); % length of the element in x-axis

    yleng = y(4)-y(1); % length of the element in y-axis

    index=feeldof(nd,nnel,ndof);% extract system dofs associated with element

    k=felp2dr4(xleng,yleng); % compute element matrix

    kk=feasmbl1(kk,k,index); % assemble element matrices

    end

    %-----------------------------

    % apply boundary conditions

    %-----------------------------

    [kk,ff]=feaplyc2(kk,ff,bcdof,bcval);

    %----------------------------

    % solve the matrix equation

    %----------------------------

    fsol=kk\ff;

    %---------------------

    % analytical solution

    %---------------------

    for i=1:nnode

    x=gcoord(i,1); y=gcoord(i,2);

    esol(i)=100*sinh(0.31415927*y)*sin(0.31415927*x)/sinh(3.1415927);end

    %------------------------------------

    % print both exact and fem solutions

    3

  • 8/9/2019 me471s03_lec07

    4/9

    %------------------------------------

    num=1:1:sdof;

    store=[num’ fsol esol’]

    %===============================================================================

    function [k]=felp2dr4(xleng,yleng)

    %-------------------------------------------------------------------

    % Purpose:

    % element matrix for two-dimensional Laplace’s equation

    % using four-node bilinear rectangular element

    %

    % Synopsis:

    % [k]=felp2dr4(xleng,yleng)

    %% Variable Description:

    % k - element stiffness matrix (size of 4x4)

    % xleng - element size in the x-axis

    % yleng - element size in the y-axis

    %-------------------------------------------------------------------

    % element matrix

    k(1,1)=(xleng*xleng+yleng*yleng)/(3*xleng*yleng);

    k(1,2)=(xleng*xleng-2*yleng*yleng)/(6*xleng*yleng);

    k(1,3)=-0.5*k(1,1);

    k(1,4)=(yleng*yleng-2*xleng*xleng)/(6*xleng*yleng);

    k(2,1)=k(1,2); k(2,2)=k(1,1); k(2,3)=k(1,4); k(2,4)=k(1,3);k(3,1)=k(1,3); k(3,2)=k(2,3); k(3,3)=k(1,1); k(3,4)=k(1,2);

    k(4,1)=k(1,4); k(4,2)=k(2,4); k(4,3)=k(3,4); k(4,4)=k(1,1);

    %==================================================================

    function [kk,ff]=feaplyc2(kk,ff,bcdof,bcval)

    %----------------------------------------------------------

    % Purpose:

    % Apply constraints to matrix equation [kk]{x}={ff}

    %

    % Synopsis:% [kk,ff]=feaplybc(kk,ff,bcdof,bcval)

    %

    % Variable Description:

    % kk - system matrix before applying constraints

    4

  • 8/9/2019 me471s03_lec07

    5/9

    % ff - system vector before applying constraints

    % bcdof - a vector containging constrained d.o.f

    % bcval - a vector containing contained value

    %

    % For example, there are constraints at d.o.f=2 and 10

    % and their constrained values are 0.0 and 2.5,

    % respectively. Then, bcdof(1)=2 and bcdof(2)=10; and

    % bcval(1)=1.0 and bcval(2)=2.5.

    %-----------------------------------------------------------

    n=length(bcdof);

    sdof=size(kk);

    for i=1:n

    c=bcdof(i);

    for j=1:sdof

    kk(c,j)=0;

    end

    kk(c,c)=1;

    ff(c)=bcval(i);

    end

    %=================================================================

    function [index]=feeldof(nd,nnel,ndof)

    %----------------------------------------------------------

    % Purpose:

    % Compute system dofs associated with each element

    %

    % Synopsis:

    % [index]=feeldof(nd,nnel,ndof)%

    % Variable Description:

    % index - system dof vector associated with element "iel"

    % iel - element number whose system dofs are to be determined

    % nnel - number of nodes per element

    % ndof - number of dofs per node

    %-----------------------------------------------------------

    edof = nnel*ndof;

    k=0;

    for i=1:nnel

    start = (nd(i)-1)*ndof;

    for j=1:ndofk=k+1;

    index(k)=start+j;

    end

    end

    5

  • 8/9/2019 me471s03_lec07

    6/9

    %=====================================================================================

    function [k]=felp2dr4(xleng,yleng)

    %-------------------------------------------------------------------

    % Purpose:

    % element matrix for two-dimensional Laplace’s equation

    % using four-node bilinear rectangular element

    %

    % Synopsis:

    % [k]=felp2dr4(xleng,yleng)

    %

    % Variable Description:

    % k - element stiffness matrix (size of 4x4)

    % xleng - element size in the x-axis

    % yleng - element size in the y-axis

    %-------------------------------------------------------------------

    % element matrix

    k(1,1)=(xleng*xleng+yleng*yleng)/(3*xleng*yleng);

    k(1,2)=(xleng*xleng-2*yleng*yleng)/(6*xleng*yleng);

    k(1,3)=-0.5*k(1,1);

    k(1,4)=(yleng*yleng-2*xleng*xleng)/(6*xleng*yleng);

    k(2,1)=k(1,2); k(2,2)=k(1,1); k(2,3)=k(1,4); k(2,4)=k(1,3);

    k(3,1)=k(1,3); k(3,2)=k(2,3); k(3,3)=k(1,1); k(3,4)=k(1,2);

    k(4,1)=k(1,4); k(4,2)=k(2,4); k(4,3)=k(3,4); k(4,4)=k(1,1);

    %====================================================================================

    function [kk]=feasmbl1(kk,k,index)%----------------------------------------------------------

    % Purpose:

    % Assembly of element matrices into the system matrix

    %

    % Synopsis:

    % [kk]=feasmbl1(kk,k,index)

    %

    % Variable Description:

    % kk - system matrix

    % k - element matri

    % index - d.o.f. vector associated with an element

    %-----------------------------------------------------------

    edof = length(index);

    for i=1:edof

    ii=index(i);

    6

  • 8/9/2019 me471s03_lec07

    7/9

    for j=1:edof

    jj=index(j);

    kk(ii,jj)=kk(ii,jj)+k(i,j);

    end

    end

    %=====================================================================================

    function [grd, connec]=gridgen(low_left, up_right, nx, ny, ind)

    %

    % FUNCTION [GRD, CONNEC]=GRIDGEN(LOW_LEFT, UP_RIGHT, NX, NY, IND)

    %

    % Creates a uniform grid on the rectangle with lower left corner

    % low_left=[a,b] and upper right corner up_right=[c,d] using nx

    % intervals along the x-axis and ny intervals on the y-axis. If ind=1

    % the coordinates of nx*ny rectangular elements are returned in grd, and

    % the corresponding connectivity matrix is returned in connec. If ind=2

    % each rectangle is divided into two triangles and connec gives the% connectivity matrix.

    %

    if ~((ind==1)|(ind==2))

    error(’ ind must be 1 (rectangles) or 2 (triangles)’);

    return;

    end

    ny1=ny+1; nx1=nx+1;

    x=linspace(low_left(1),up_right(1),nx1);

    y=linspace(low_left(2),up_right(2),ny1);

    [xx,yy]=meshgrid(x,y); % arrays xx, yy are ny1 by nx1, xx has rows x, yy columns y

    grd=zeros(ny1*nx1,2);

    for row=1:ny1 %

    for col=1:nx1node_num=(row-1)*nx1+col;

    grd(node_num,:)=[xx(row,col),yy(row,col)];

    end

    end

    conq=zeros(nx*ny,4);

    for row=1:ny % nodes for rectangular elements

    for col=1:nx

    nel=nx*(row-1)+col;

    n0=nx1*(row-1)+col; % node at lower left of element nel

    conq(nel,1:4)=[n0,n0+1,n0+1+nx1,n0+nx1]; % counter clockwise numbering

    end

    end

    if ind==1connec=conq;

    else

    for kk=1:nx*ny % divide each of the nx*ny rectangles into 2 triangles 4 3

    cont(2*kk-1,1:3)=[conq(kk,4),conq(kk,1),conq(kk,3)]; % local nodes 4,1,3 ----

    7

  • 8/9/2019 me471s03_lec07

    8/9

    cont(2*kk,1:3)=[conq(kk,2), conq(kk,3), conq(kk,1)]; % local nodes 2,3,1 ----

    end % 1 2

    connec=cont;

    end

    %=========================================================================

    function gridplot(nx,ny,grd,connec,ind)

    close all

    nx1=nx+1; ny1=ny+1;

    x=grd(1:nx1,1)’; y=grd(1:nx1:nx1*ny1-nx1+1,2)’;

    hx=x(2)-x(1); hy=y(2)-y(1); % grid spacings

    hold on

    axis([-hx+x(1), x(nx1)+hx, -2*hy+y(1), y(ny1)+hy]);

    for kk=1:ny1 plot(x,y(kk)*ones(1,nx1)); end % plot horizontal grid lines

    for kk=1:nx1 plot(x(kk)*ones(1,ny1),y); end % plot vertical grid lines

    ofx=0.1*hx; ofy=0.2*hy; % offsets

    for kk=1:nx1*ny1str=sprintf(’%d’,kk);

    text(grd(kk,1)+ofx,grd(kk,2)+ofy,str,’Color’,[1,0,0],’FontSize’,8);

    end

    if ind==2 % complete triangles

    for kk=1:2:length(connec(:,1))

    x1=[grd(connec(kk,2),1),grd(connec(kk,3),1)];

    y1=[grd(connec(kk,2),2),grd(connec(kk,3),2)];

    plot(x1,y1,’b-’);

    end

    end

    if ind==1

    for kk=1:length(connec(:,1))

    xg=grd(connec(kk,1),1)+hx/2; yg=grd(connec(kk,1),2)+hy/2;str=sprintf(’%d’,kk);

    text(xg,yg,str);

    end

    else

    for kk=1:2:length(connec(:,1))

    xg=grd(connec(kk,1),1)+hx/3; yg=grd(connec(kk,1),2)-hy/3;

    str=sprintf(’%d’,kk);

    text(xg,yg,str,’FontSize’,8);

    end

    for kk=2:2:length(connec(:,1))

    xg=grd(connec(kk,3),1)+2*hx/3; yg=grd(connec(kk,3),2)+hy/3;

    str=sprintf(’%d’,kk);

    text(xg,yg,str,’FontSize’,8);end

    end

    text(x(1),y(1)-2*hy/3,’element numbers’,’FontSize’,8);

    text(x(1),y(1)-4*hy/3,’node numbers’,’Color’,[1,0,0],’FontSize’,8);

    8

  • 8/9/2019 me471s03_lec07

    9/9

    hold off

    9