FEM Simulation of a Flanged Pipe

flangedpipe.m
%
% COMSOL / Matlab Script
% Calculation of the acoustic radiation impedance of a flanged pipe 
% with the FEM (Helmholtz equation)
%
% Antoine Lefebvre, McGill University
%
% Copyright (c) 2010 Antoine Lefebvre
%
 
flclear fem
 
rho = 1.25;
c = 343;
a = 0.01;
L = 0.03;
N = 3; % ratio of sphere radius to cylinder radius
 
radiation_domain = ...
  block3(2*N*a,2*N*a,N*a,'base','corner','pos',[-N*a,-N*a,0]) * sphere3(N*a);
model = (cylinder3(a,L,'pos',[0,0,-L]) + radiation_somain) * ...
  block3(2*N*a,2*N*a,2*N*a,'pos',[0,0,-N*a]);
 
ka = [0.01 colon(0.1,0.1,1.0)];
k = ka/a;
 
clear s
s.objs={model};
s.name={'CO1'};
s.tags={'model'};
 
fem.draw=struct('s',s);
fem.geom=geomcsg(fem);
 
% Constants
fem.const = {'a','0.01 [m]', 'L','0.03 [m]', 'rho','1.25 [kg/m^3]', ...
             'c','343 [m/s]', 'v0','1 [m/s]', 'Zc','rho*c', 'S','pi*a^2'};
 
% Initialize mesh
edge = 0.001;
fem.mesh=meshinit(fem, 'hmax',0.005, 'hmaxfact',0.8, 'hcurve',0.5,  ...
                       'hgrad',1.3, 'hcutoff',0.02, 'hnarrow',0.6, ...
                       'hmaxedg',[12,edge]);
 
% Application mode 1
clear appl
appl.mode.class = 'AcoPressure';
appl.module = 'ACO';
appl.sshape = 3;
appl.assignsuffix = '_acpr';
clear prop
prop.elemdefault='Lag3';
appl.prop=prop;
clear bnd
bnd.p0 =  {0,0,0,1,0};
bnd.type = {'SH','cont','RAD','RAD','NA'};
bnd.wavetype = {'PL','PL','SPH','PL','PL'};
bnd.ind = [5,5,4,5,5,2,3,1,1];
appl.bnd = bnd;
clear equ
equ.rho = 'rho';
equ.cs = 'c';
equ.ind = [1,1];
appl.equ = equ;
appl.var = {'freq','freq'};
fem.appl{1} = appl;
fem.frame = {'ref'};
fem.border = 1;
clear units;
units.basesystem = 'SI';
fem.units = units;
 
fem.expr = {'a0','i*omega_acpr*v0', 'freq','ka*c/(2*pi*a)'};
 
clear ode
clear units;
units.basesystem = 'SI';
ode.units = units;
fem.ode=ode;
 
fem=multiphysics(fem);
fem.xmesh=meshextend(fem);
fem.sol=femstatic(fem, 'solcomp',{'p'},'outcomp',{'p'}, 'pname','ka', ...
                       'plist', ka, 'oldcomp',{});
pin   =  postint(fem,'p/S',            'Dl',[3],'Edim',[2],...
                     'Solnum',[1:length(ka)]);
ZcUin = -postint(fem,'rho*c*nv_acpr/S','Dl',[3],'Edim',[2],...
                     'Solnum',[1:length(ka)]);
 
Zin = pin./ZcUin;
Zr = (Zin.*cos(k*L)-i*sin(k*L))./(-i*Zin.*sin(k*L)+cos(k*L));
flsave('flanged_pipe_quarter.mph', fem);
save('flanged_pipe_quarter.mat', 'Zr','a','ka');