Home > Src > Elliptic_2d > Schwarz > schwarz_2d.m

schwarz_2d

PURPOSE ^

SCHWARZ_2D Numerical solution of the 2D boundary value problem

SYNOPSIS ^

function [xy,un,param]=schwarz_2d(xa,xb,ya,yb,gam,uex,uex_x,uex_y,ff,g,h,cb,nex,nx,ney,ny,gammax,gammay,param);

DESCRIPTION ^

 SCHWARZ_2D   Numerical solution of the 2D boundary value problem

     -Delta u + gam u = f       x in Omega

      + Dirichlet bc

 by  SEM Numerical Integration with LGL quadrature formulas, with
  additive Schwarz preconditioner with overlapping elements and
   coarse mesh (Sect. 6.3.3, CHQZ3)

  [xy,un,param]=schwarz_2d(xa,xb,ya,yb,gam,...
         uex,uex_x,uex_y,ff,nex,nx,ney,ny,gammax,gammay,param);

           Omega=(xa,xb) x (ya,yb)

                side 3
           V4 __________ V3
             |          |
             |          |
     side 4  | Omega    |  side 2
             |          |
             |__________|
           V1            V2
                side 1


       __________________________
       |      |      |     |     |
       |  3   |  6   |  9  | 12  |      Omega and spectral elements
       |      |      |     |     |      ordering
       __________________________
       |      |      |     |     |
       |  2   |  5   |  8  | 11  |
       |      |      |     |     |
       __________________________
       |      |      |     |     |
       |  1   |  4   |  7  | 10  |
       |      |      |     |     |
       __________________________


 Input: xa= abscissa of either vertex V1 or vertex V4
        xb= abscissa of either vertex V2 or vertex V3
        ya= ordinate of either vertex V1 or vertex V2
        yb= ordinate of either vertex V3 or vertex V4
        gam   = coefficient of zeroth order term (constant>=0)
        uex  = exact solution (uex=@(x,y)[uex(x,y)], with .*, .^, ./)
        uex_x  = exact first x-derivative (uex_x=@(x,y)[uex_x(x,y)], with .*, .^, ./)
        uex_y  = exact first y-derivative (uex_y=@(x,y)[uex_y(x,y)], with .*, .^, ./)
        ff  = r.h.s. solution (ff=@(x,y)[ff(x,y)], with .*, .^, ./)
        g  = @(x,y)[....] function handle to the expression of Dirichlet
              boundary data
        h =@(x,y)[....] function handle to the expression of Neumann
              boundary data. It is a vector of 4 functions, each for any
              side.
        cb= a string of four elements, each for any side of \partial\Omega. 
           cb(i) refers to side number "i" of \partial\Omega
           'd' character stands for Dirichlet boundary conditions on that side
           'n' character stands for Neumann boundary conditions on that side
        It works only if cb='dddd'
        nex = number of elements (equally spaced) along x-direction
        nx = polynomial degree in each element (the same in each element)
               along x-direction
        ney = number of elements (equally spaced) along y-direction
        ny = polynomial degree in each element (the same in each element)
               along y-direction
        gammax = column or row array of length nex-1. 
               If the deomposition of Omega is not
               uniform, gammax is the vector of position of interfaces between
               spectral elements along x-direction. If gammax=[], uniform
               decomposition is used.
        gammay = column or row array of length ney-1. 
               If the deomposition of Omega is not
               uniform, gammay is the vector of position of interfaces between
               spectral elements along y-direction. If gammay=[], uniform
               decomposition is used.
        param = array of parameters
        param(1) =1 P=I
                 =2 P=Additive Schwarz with overlap and coarse mesh
        param(2) = number of added layers for extending spectral elements
                   inside additive Schwarz preconditioner.
                   If param(2)==1, the preconditioner is P^{m}_{as,H} 
                                    (minimum overlap), pag. 377 CHQZ3)
                   If param(2)==2, the preconditioner is P^{s}_{as,H} 
                                    (small overlap), pag. 377 CHQZ3)
                   param(2) is a positive integer less than min(nx,ny)
        param(3) = 1   PCG is used to solve linear system
        param(3) = 2   PBiCGStab is used to solve linear system
        param(4) = 1: compute errors (L^inf-norm, L2-norm, H1-norm) 
                      on the exact solution
                   2: no  errors are computed
        param(5) = 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(4) == 1)
        param(6) = number of nodes for high degree quadrature formula,
                   (used only if param(5) == 0 & param(4) == 1)
        param(7) = 0: absolute errors are computed
                   1: relative errors are computed
                   (used only if param(4) == 1)
        param(8) = 0: not plot the solution
                   1: plot the solution (mesh)
                   2: plot the solution (surf)
                   3: plot the solution (contour)
        param(9) = number of nodes in each element and along each direction 
                   for plotting the solution
                   (used only if param(8) > 0)
        param(10)= tolerance for PCG/PBCGSTAB stopping test
        param(11)= maximum number of iterations for PCG/PBCGSTAB stopping test
        param(12:20)  INTERNAL USE
                   
 Output: xy = 2-indexes array wiht coordinates of 2D LGL mesh              
         un = numerical solution
         param(21) = (if param(3)==1)  iterations of PCG
         param(22) = (if param(3)==1)  final residual 
         param(23,24) = (if param(3)==2) extrema eigenvalues (max,min) of
                  the preconditioned Schur complement
         param(25,26,27) = (if param(4)==1 & param(3)==1) 
                   errors on the exact solution:
                   L^inf-norm, L2-norm, H1-norm


 References: CHQZ2 = C. Canuto, M.Y. Hussaini, A. Quarteroni, T.A. Zang,
                    "Spectral Methods. Fundamentals in Single Domains"
                    Springer Verlag, Berlin Heidelberg New York, 2006.
             CHQZ3 = C. Canuto, M.Y. Hussaini, A. Quarteroni, T.A. Zang,
                    "Spectral Methods. Evolution to Complex Geometries 
                     and Applications to Fluid DynamicsSpectral Methods"
                    Springer Verlag, Berlin Heidelberg New York, 2007.

CROSS-REFERENCE INFORMATION ^

This function calls: This function is called by:

SOURCE CODE ^

0001 function [xy,un,param]=schwarz_2d(xa,xb,ya,yb,gam,...
0002           uex,uex_x,uex_y,ff,g,h,cb,nex,nx,ney,ny,gammax,gammay,param);
0003 % SCHWARZ_2D   Numerical solution of the 2D boundary value problem
0004 %
0005 %     -Delta u + gam u = f       x in Omega
0006 %
0007 %      + Dirichlet bc
0008 %
0009 % by  SEM Numerical Integration with LGL quadrature formulas, with
0010 %  additive Schwarz preconditioner with overlapping elements and
0011 %   coarse mesh (Sect. 6.3.3, CHQZ3)
0012 %
0013 %  [xy,un,param]=schwarz_2d(xa,xb,ya,yb,gam,...
0014 %         uex,uex_x,uex_y,ff,nex,nx,ney,ny,gammax,gammay,param);
0015 %
0016 %           Omega=(xa,xb) x (ya,yb)
0017 %
0018 %                side 3
0019 %           V4 __________ V3
0020 %             |          |
0021 %             |          |
0022 %     side 4  | Omega    |  side 2
0023 %             |          |
0024 %             |__________|
0025 %           V1            V2
0026 %                side 1
0027 %
0028 %
0029 %       __________________________
0030 %       |      |      |     |     |
0031 %       |  3   |  6   |  9  | 12  |      Omega and spectral elements
0032 %       |      |      |     |     |      ordering
0033 %       __________________________
0034 %       |      |      |     |     |
0035 %       |  2   |  5   |  8  | 11  |
0036 %       |      |      |     |     |
0037 %       __________________________
0038 %       |      |      |     |     |
0039 %       |  1   |  4   |  7  | 10  |
0040 %       |      |      |     |     |
0041 %       __________________________
0042 %
0043 %
0044 % Input: xa= abscissa of either vertex V1 or vertex V4
0045 %        xb= abscissa of either vertex V2 or vertex V3
0046 %        ya= ordinate of either vertex V1 or vertex V2
0047 %        yb= ordinate of either vertex V3 or vertex V4
0048 %        gam   = coefficient of zeroth order term (constant>=0)
0049 %        uex  = exact solution (uex=@(x,y)[uex(x,y)], with .*, .^, ./)
0050 %        uex_x  = exact first x-derivative (uex_x=@(x,y)[uex_x(x,y)], with .*, .^, ./)
0051 %        uex_y  = exact first y-derivative (uex_y=@(x,y)[uex_y(x,y)], with .*, .^, ./)
0052 %        ff  = r.h.s. solution (ff=@(x,y)[ff(x,y)], with .*, .^, ./)
0053 %        g  = @(x,y)[....] function handle to the expression of Dirichlet
0054 %              boundary data
0055 %        h =@(x,y)[....] function handle to the expression of Neumann
0056 %              boundary data. It is a vector of 4 functions, each for any
0057 %              side.
0058 %        cb= a string of four elements, each for any side of \partial\Omega.
0059 %           cb(i) refers to side number "i" of \partial\Omega
0060 %           'd' character stands for Dirichlet boundary conditions on that side
0061 %           'n' character stands for Neumann boundary conditions on that side
0062 %        It works only if cb='dddd'
0063 %        nex = number of elements (equally spaced) along x-direction
0064 %        nx = polynomial degree in each element (the same in each element)
0065 %               along x-direction
0066 %        ney = number of elements (equally spaced) along y-direction
0067 %        ny = polynomial degree in each element (the same in each element)
0068 %               along y-direction
0069 %        gammax = column or row array of length nex-1.
0070 %               If the deomposition of Omega is not
0071 %               uniform, gammax is the vector of position of interfaces between
0072 %               spectral elements along x-direction. If gammax=[], uniform
0073 %               decomposition is used.
0074 %        gammay = column or row array of length ney-1.
0075 %               If the deomposition of Omega is not
0076 %               uniform, gammay is the vector of position of interfaces between
0077 %               spectral elements along y-direction. If gammay=[], uniform
0078 %               decomposition is used.
0079 %        param = array of parameters
0080 %        param(1) =1 P=I
0081 %                 =2 P=Additive Schwarz with overlap and coarse mesh
0082 %        param(2) = number of added layers for extending spectral elements
0083 %                   inside additive Schwarz preconditioner.
0084 %                   If param(2)==1, the preconditioner is P^{m}_{as,H}
0085 %                                    (minimum overlap), pag. 377 CHQZ3)
0086 %                   If param(2)==2, the preconditioner is P^{s}_{as,H}
0087 %                                    (small overlap), pag. 377 CHQZ3)
0088 %                   param(2) is a positive integer less than min(nx,ny)
0089 %        param(3) = 1   PCG is used to solve linear system
0090 %        param(3) = 2   PBiCGStab is used to solve linear system
0091 %        param(4) = 1: compute errors (L^inf-norm, L2-norm, H1-norm)
0092 %                      on the exact solution
0093 %                   2: no  errors are computed
0094 %        param(5) = 0: LG quadrature formulas with high precision degree are
0095 %                      used to compute norms (exact norms)
0096 %                   1: LGL quadrature formulas with npdx,npdy nodes are
0097 %                      used to compute norms (discrete norms)
0098 %                   (used only if param(4) == 1)
0099 %        param(6) = number of nodes for high degree quadrature formula,
0100 %                   (used only if param(5) == 0 & param(4) == 1)
0101 %        param(7) = 0: absolute errors are computed
0102 %                   1: relative errors are computed
0103 %                   (used only if param(4) == 1)
0104 %        param(8) = 0: not plot the solution
0105 %                   1: plot the solution (mesh)
0106 %                   2: plot the solution (surf)
0107 %                   3: plot the solution (contour)
0108 %        param(9) = number of nodes in each element and along each direction
0109 %                   for plotting the solution
0110 %                   (used only if param(8) > 0)
0111 %        param(10)= tolerance for PCG/PBCGSTAB stopping test
0112 %        param(11)= maximum number of iterations for PCG/PBCGSTAB stopping test
0113 %        param(12:20)  INTERNAL USE
0114 %
0115 % Output: xy = 2-indexes array wiht coordinates of 2D LGL mesh
0116 %         un = numerical solution
0117 %         param(21) = (if param(3)==1)  iterations of PCG
0118 %         param(22) = (if param(3)==1)  final residual
0119 %         param(23,24) = (if param(3)==2) extrema eigenvalues (max,min) of
0120 %                  the preconditioned Schur complement
0121 %         param(25,26,27) = (if param(4)==1 & param(3)==1)
0122 %                   errors on the exact solution:
0123 %                   L^inf-norm, L2-norm, H1-norm
0124 %
0125 %
0126 % References: CHQZ2 = C. Canuto, M.Y. Hussaini, A. Quarteroni, T.A. Zang,
0127 %                    "Spectral Methods. Fundamentals in Single Domains"
0128 %                    Springer Verlag, Berlin Heidelberg New York, 2006.
0129 %             CHQZ3 = C. Canuto, M.Y. Hussaini, A. Quarteroni, T.A. Zang,
0130 %                    "Spectral Methods. Evolution to Complex Geometries
0131 %                     and Applications to Fluid DynamicsSpectral Methods"
0132 %                    Springer Verlag, Berlin Heidelberg New York, 2007.
0133 
0134 %   Written by Paola Gervasio
0135 %   $Date: 2007/04/01$
0136 
0137 xy=[]; un=[];  
0138 
0139 npdx=nx+1; npdy=ny+1; ldnov=npdx*npdy; mn=ldnov; ne=nex*ney;
0140 
0141 [x,wx]=xwlgl(npdx); [dx]=derlgl(x,npdx);
0142 [y,wy]=xwlgl(npdy); [dy]=derlgl(y,npdy);
0143 
0144 % Generation of nov: its implements the
0145 %         restriction map R_m from \overline\Omega  to overline\Omega_m
0146 %         (CHQZ, pag. 394)
0147 
0148 [nov]=cosnov_2d(npdx,nex,npdy,ney);
0149 noe=nov(ldnov,ne);
0150 
0151 % Mesh generation
0152 
0153 [xx,yy,jacx,jacy,xy,ww,ifro]=mesh_2d(xa,xb,ya,yb,cb,nex,ney,npdx,npdy,...
0154 nov,x,wx,y,wy,gammax,gammay);
0155 
0156 
0157 % Generation of lists of internal, boundary, interface nodes. All lists are referred to
0158 % global ordering on Omega
0159 %
0160 % ldir: list of Dirichlet boundary nodes
0161 % lint: list of internal nodes
0162 % lintint: list of internal nodes which are internal to spectral elements
0163 % lgamma: list of internal nodes which are on the interfaces between spectral elements
0164 
0165 [ldir,lint,lintint,lgamma,ifro]=liste(ifro,nov);
0166 
0167 % Matrix assembling
0168 
0169 A=stiff_2d_se(npdx,nex,npdy,ney,nov,wx,dx,jacx,wy,dy,jacy);
0170 M=spdiags(ww,0,noe,noe);
0171 
0172 if gam ~=0
0173     A=A+gam*M;
0174 end
0175 
0176 % Rigth Hand Side
0177 f=ff(xy(:,1),xy(:,2)).*ww;
0178 
0179 % Dirichlet boundary conditions
0180 ub=uex(xy(:,1),xy(:,2));
0181 
0182 %
0183 
0184 Ab=A(lint,ldir);
0185 A=A(lint,lint);
0186 f=f(lint)-Ab*ub(ldir);
0187 noei=length(lint);
0188 wwi=ww(lint);
0189 
0190 % extended elements construction
0191 
0192 [nove,nvle]=cosnovenew(nx,nex,ny,ney,nov,ifro,param(2));
0193 
0194 % Construction of local stiffness Q1 matrices on extended elements
0195 
0196 [Aq1,Abq1,wwq1,linte,ldire,nove]=stiffq1(ifro,nov,xy,nove,nvle);
0197 
0198 % Construction of Q1 stiffness matrix on the coarse grid.
0199 
0200 [Ac,Acb,wwc,lista_coarse,noec,novc,lintc,ldirc]=stiffq1H(nx,nex,ny,ney,xy,nov,ifro);
0201 r0t=matr0t(nx,ny,xy,nov,novc,noec,lista_coarse);
0202 
0203 % Unity partition
0204 
0205 nvl=[mn*ones(ne,1),npdx*ones(ne,1),npdy*ones(ne,1)];
0206 [p_unity]=partition_e(nov,nvl,noe);
0207 
0208 % PCG or PBCGstab with Schwarz preconditioner
0209 
0210 u0=zeros(noei,1);
0211 param(13:16)=[nx,ny,nex,ney];
0212 if param(3)==1
0213 [un,iter,res]=schwarz_pcg(u0, f, param, p_unity,...
0214     xy, ww, A, nov, noei, lint, x,wx, y,wy, xx,jacx,yy,jacy,...
0215     Aq1, wwq1,linte,nove,nvle,...
0216     Ac, Acb,wwc,r0t,lista_coarse,noec,novc,lintc,ldirc);
0217 elseif param(3)==2
0218 [un,iter,res]=schwarz_pbcgstab(u0, f, param, p_unity,...
0219     xy, ww, A, nov, noei, lint, x,wx, y,wy, xx,jacx,yy,jacy,...
0220     Aq1, wwq1,linte,nove,nvle,...
0221     Ac, Acb,wwc,r0t,lista_coarse,noec,novc,lintc,ldirc);
0222 end
0223 param(21:22)=[iter,res];
0224 ub(lint)=un;
0225 un=ub;
0226 
0227 if (param(4)==1)
0228     % errors computing  on the exact solution
0229 [err_inf,err_h1,err_l2]=errors_2d(x,wx,dx,xx,jacx,y,wy,dy,yy,jacy,...
0230 xy,ww,nov,un,uex,uex_x,uex_y,param);
0231 param(25:27)=[err_inf;err_h1;err_l2];
0232 end
0233 
0234 if (param(8)>0)
0235     if param(8)==1
0236         command='mesh';
0237     elseif param(8)==2
0238         command='surf';
0239     elseif param(8)==3;
0240         command='contour'
0241     end
0242 % plot the solution
0243 fig=figure(...,
0244     'Name','SEM-NI solution of -Delta u + gam u=f, Dirichlet bc',...
0245     'Visible','on');
0246 [ha]=plot_sem_2d(fig,command,nex,ney,x,xx,jacx,y,yy,jacy,xy,ww,nov,un,param(9));
0247 
0248 end

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