Home > Src > Elliptic_1d > adr_1d.m

adr_1d

PURPOSE ^

ADR_1D Numerical solution of the 1D boundary value problem (1.2.52)-(1.2.53), pag. 17, CHQZ2

SYNOPSIS ^

function [xy,un,err_inf,err_l2,err_h1,der]=adr_1d(xa,xb,nu,beta,gam,uex,uexx,ff,cb,ne,p,nx,param);

DESCRIPTION ^

 ADR_1D   Numerical solution of the 1D boundary value problem (1.2.52)-(1.2.53), pag. 17, CHQZ2

     -(nu u' + beta(x) u)'+gam u=f      xa < x < xb

     + Dirichlet or Neumann bc

 by Galerkin Numerical Integration with LGL quadrature formulas.

  [xy,un,err_inf,err_l2,err_h1,der]=adr_1d(xa,xb,nu,beta,gam,uex,uexx,...
             ff,cb,ne,p,nx,param);

 Input: xa, xb = extrema of computational domain Omega=(xa,xb)
      nu   = viscosity (constant>0)
      beta = coefficient of first order term (beta=@(x)[beta(x)], 
             with .*, .^, ./)
      gam  = coefficient of zeroth order term (constant>0)
      uex  = exact solution (uex=@(x)[uex(x)], with .*, .^, ./)
      uexx = first derivative of exact solution (uexx=@(x)[uexx(x)], 
             with .*, .^, ./)
      ff  = r.h.s. solution (ff=@(x)[ff(x)], with .*, .^, ./)
      cb = string containing boundary conditions, for example
           cb='dn' imposes Dirichlet in xa and Neumann in xb 
      ne = number of elements (equally spaced)
      p = parameter : p=1 P_1 finite element, nx=1 
                      p=2 P_2 finite element, nx=2 
                      p=3 P_3 finite element, nx=3 
                      p=4 spectral element, with polynomial degree nx, to be set 
      nx = polynomial degree in each element (the same in each element)
             to be set only if p=4, otherwise, nx=p;
      param(1) = 1: compute errors (L^inf-norm, L2-norm, H1-norm)
                      on the exact solution
                 2: no  errors are computed
      param(2) = 0: LG quadrature formulas with high precision degree are
                      used to compute norms (exact norms)
                 1: LGL quadrature formulas with npdx,npdy nodes are
                      used to compute norms (discrete norms)
                   (used only if param(1) == 1)
      param(3) = number of nodes for high degree quadrature formula,
                   (used only if param(2) == 0 & param(1) == 1)
      param(4) = 0: absolute errors are computed
                 1: relative errors are computed
                   (used only if param(1) == 1)
      param(5) = 0: not plot the solution
                 1: plot the solution 
      param(6) = number of nodes in each element for plotting interpolated solution
                   (used only if param(5) ==1)

 Output: xy = 1D mesh
         un = numerical solution 
         err_inf = ||u_ex-u_N|| with respect to discrete maximum-norm
         err_h1 = ||u_ex-u_N|| with respect to discrete H1-norm
         err_l2 = ||u_ex-u_N|| with respect to discrete L2-norm
         der    =  |(nu u'+ beta u)|_(x=xb) |

 Reference: CHQZ2 = C. Canuto, M.Y. Hussaini, A. Quarteroni, T.A. Zang,
                    "Spectral Methods. Fundamentals in Single Domains"
                    Springer Verlag, Berlin Heidelberg New York, 2006.

CROSS-REFERENCE INFORMATION ^

This function calls: This function is called by:

SOURCE CODE ^

0001 function [xy,un,err_inf,err_l2,err_h1,der]=adr_1d(xa,xb,nu,beta,gam,...
0002           uex,uexx,ff,cb,ne,p,nx,param);
0003 % ADR_1D   Numerical solution of the 1D boundary value problem (1.2.52)-(1.2.53), pag. 17, CHQZ2
0004 %
0005 %     -(nu u' + beta(x) u)'+gam u=f      xa < x < xb
0006 %
0007 %     + Dirichlet or Neumann bc
0008 %
0009 % by Galerkin Numerical Integration with LGL quadrature formulas.
0010 %
0011 %  [xy,un,err_inf,err_l2,err_h1,der]=adr_1d(xa,xb,nu,beta,gam,uex,uexx,...
0012 %             ff,cb,ne,p,nx,param);
0013 %
0014 % Input: xa, xb = extrema of computational domain Omega=(xa,xb)
0015 %      nu   = viscosity (constant>0)
0016 %      beta = coefficient of first order term (beta=@(x)[beta(x)],
0017 %             with .*, .^, ./)
0018 %      gam  = coefficient of zeroth order term (constant>0)
0019 %      uex  = exact solution (uex=@(x)[uex(x)], with .*, .^, ./)
0020 %      uexx = first derivative of exact solution (uexx=@(x)[uexx(x)],
0021 %             with .*, .^, ./)
0022 %      ff  = r.h.s. solution (ff=@(x)[ff(x)], with .*, .^, ./)
0023 %      cb = string containing boundary conditions, for example
0024 %           cb='dn' imposes Dirichlet in xa and Neumann in xb
0025 %      ne = number of elements (equally spaced)
0026 %      p = parameter : p=1 P_1 finite element, nx=1
0027 %                      p=2 P_2 finite element, nx=2
0028 %                      p=3 P_3 finite element, nx=3
0029 %                      p=4 spectral element, with polynomial degree nx, to be set
0030 %      nx = polynomial degree in each element (the same in each element)
0031 %             to be set only if p=4, otherwise, nx=p;
0032 %      param(1) = 1: compute errors (L^inf-norm, L2-norm, H1-norm)
0033 %                      on the exact solution
0034 %                 2: no  errors are computed
0035 %      param(2) = 0: LG quadrature formulas with high precision degree are
0036 %                      used to compute norms (exact norms)
0037 %                 1: LGL quadrature formulas with npdx,npdy nodes are
0038 %                      used to compute norms (discrete norms)
0039 %                   (used only if param(1) == 1)
0040 %      param(3) = number of nodes for high degree quadrature formula,
0041 %                   (used only if param(2) == 0 & param(1) == 1)
0042 %      param(4) = 0: absolute errors are computed
0043 %                 1: relative errors are computed
0044 %                   (used only if param(1) == 1)
0045 %      param(5) = 0: not plot the solution
0046 %                 1: plot the solution
0047 %      param(6) = number of nodes in each element for plotting interpolated solution
0048 %                   (used only if param(5) ==1)
0049 %
0050 % Output: xy = 1D mesh
0051 %         un = numerical solution
0052 %         err_inf = ||u_ex-u_N|| with respect to discrete maximum-norm
0053 %         err_h1 = ||u_ex-u_N|| with respect to discrete H1-norm
0054 %         err_l2 = ||u_ex-u_N|| with respect to discrete L2-norm
0055 %         der    =  |(nu u'+ beta u)|_(x=xb) |
0056 %
0057 % Reference: CHQZ2 = C. Canuto, M.Y. Hussaini, A. Quarteroni, T.A. Zang,
0058 %                    "Spectral Methods. Fundamentals in Single Domains"
0059 %                    Springer Verlag, Berlin Heidelberg New York, 2006.
0060 
0061 %   Written by Paola Gervasio
0062 %   $Date: 2007/04/01$
0063 
0064 xy=0;un=0;err_inf=0;err_l2=0;err_h1=0;der=0;
0065 %
0066 npdx=nx+1; 
0067 
0068 [x,wx]=xwlgl(npdx); dx=derlgl(x,npdx);
0069 
0070 % nov
0071 ldnov=npdx; nov=zeros(ldnov,ne);
0072 [nov]=cosnov_1d(npdx,ne,nov);
0073 noe=nov(npdx,ne);
0074 
0075 % Uniform decomposition of  Omega in ne elements
0076 
0077 [xx,jacx,xy,ww]=mesh_1d(xa,xb,ne,npdx,nov,x,wx);
0078 
0079 % Variable coefficients evaluation
0080 
0081 b=zeros(noe,1)+beta(xy);
0082 
0083 % Matrix assembling
0084 A=adr_1d_se(npdx,ne,nov,nu,b,gam,wx,dx,jacx);
0085 
0086 % Setting Dirichlet boundary conditions on the matrix
0087 
0088 if cb(1)=='d'; A(1,:)=zeros(1,noe); A(1,1)=1; end
0089 if cb(2)=='d'; A(noe,:)=zeros(1,noe); A(noe,noe)=1; end
0090 
0091 % Right hand side
0092 f=zeros(noe,1);
0093 f=ff(xy).*ww;
0094 
0095 % Setting Dirichlet boundary conditions on the matrix on r.h.s
0096 
0097 if cb(1)=='d'; 
0098 f(1)=uex(xy(1));
0099 else
0100 f(1)=f(1)+(-nu*uexx(xy(1))+b(1)*uex(xy(1))) ;
0101 end
0102 if cb(2)=='d'; 
0103 f(noe)=uex(xy(noe));
0104 else
0105 f(noe)=f(noe)+nu*uexx(xy(noe))+b(noe)*uex(xy(noe));
0106 end
0107 
0108 % MEG on the linear system
0109 
0110 un=A\f;
0111 
0112 
0113 if param(1)==1
0114 
0115 % Evaluates exact solution to compute errors
0116 
0117 u=uex(xy);
0118 
0119 % computes difference
0120 err=u-un;
0121 nq=param(3); fdq=param(2); err_type=param(4);
0122 
0123 % ||u_ex-u_N|| with respect to discrete maximum-norm
0124 if err_type==0
0125 err_inf=norm(err,inf);
0126 else
0127 err_inf=norm(err,inf)/norm(u,inf);
0128 end    
0129 
0130 % ||u_ex-u_N|| with respect to H1 norm
0131 % fdq=0 LG quadrature formula with nq nodes on each element
0132 % fdq=1 LGL quadrature formula with npdx nodes on each element
0133 [err_h1]=normah1_1d(fdq, nq, err_type, un, uex, uexx,...
0134  x, wx, dx, xx, jacx, xy,nov);
0135 
0136 % ||u_ex-u_N|| with respect to L2 norm
0137 
0138 [err_l2]=normal2_1d(fdq, nq, err_type, un, uex, ...
0139  x, wx, xx, jacx, xy,nov);
0140 
0141 
0142 
0143 % compute the flux  der=(nu * u'+beta u)|(x=1)
0144 
0145 ie=ne;
0146 un1=dx(npdx,:)/jacx(ie)*un(nov(1:npdx,ie));
0147 
0148 der=abs(nu*un1+b(noe)*un(noe)-(nu*uexx(xy(noe))+b(noe)*uex(xy(noe))));
0149 end
0150 
0151 if(param(5)==1)
0152     % interpolate numerical solution to give a "good" plot
0153     
0154     fig=figure(...,
0155     'Name','SEM-NI solution of -(nu u'' + beta(x) u)''+gam u=f     xa < x < xb',...
0156     'Visible','on');
0157     ha=plot_sem_1d(fig,ne,x,wx,xx,jacx,xy,nov,un,param(6));
0158 end
0159 return

Generated on Fri 21-Sep-2007 10:07:00 by m2html © 2003