# Create Volume Mesh of a Muffler

This demo explains how to create a volume mesh of a muffler geometry.

## Contents

- Geometrical parameters
- Create the muffler components
- Combining the submodels
- Mesh postprocessing

## Geometrical parameters

The muffler consists of three cylindrical parts: , where is a cylinder with radius , length , and is a cylinder with radius and length .

    rA = 1;      % radius of component A
    lA = 1;      % length of component A
    rB = .39;    % radius of component B
    lB = .7;     % length of component B
    Le = .05;    % length of a finite element

## Create the muffler components

The mesh components and are created separately and the muffler is assembled later from the components. Both components are created by extrusion from disc surface meshes. The two discs are meshed in the following.

The larger disc geometry is constructed by meshing a slab in the domain , and transforming the slab node coordinates to coordinates of a disc by the transform , where .

The slab is meshed with a non-uniform division in order to ensure that the disc will contain nodes at after the transformation.

    x1 = linspace(0, rB, ceil(rB/Le)); % meshing the radius between 0 and r
    x2 = linspace(rB, rA, ceil((rA-rB)/Le)); % meshing the radius between r and R
    x = unique([-x2, -x1, x1, x2]);        % meshing the slab
    Disc = create_slab(x);

    figure;
    plot_mesh(Disc);

The transformation is performed as follows:

    nodes = Disc.Nodes(:,2:4);          % extract the nodes
    r = sqrt(dot(nodes, nodes, 2));   % radius of the slab coordinates
    Disc.Nodes(:,2:4) = nodes .* repmat(max(abs(nodes),[],2)./r, 1, 3);
    Disc.Nodes(r == 0,2:4) = 0;

    figure;
    plot_mesh(Disc);

The inner disc is extracted from the `Disc` model by finding the elements satisfying the condition

    disc = Disc;
    tol = 1e-3;
    [disc_nod, disc_el] = mesh_select(disc,...
        sprintf('r < %g', rB+tol), 'ind', 'all');
    disc.Elements = disc.Elements(disc_el,:);

    figure;
    plot_mesh(disc);

## Combining the submodels

The two cylinders are created by extruding the two disc models along the axis, and combining the segments after translation.

    n = ceil(lB/Le);    % number of extrusion segments for the small disc
    cyl = extrude_mesh(disc, [0 0 lB/n], n);
    N = ceil(lA/Le);    % number of extrusion segments for the large disc
    Cyl = extrude_mesh(Disc, [0 0 lA/N], N);
    muffler = join_meshes(Cyl, translate_mesh(cyl, [0 0 lA]),...
        translate_mesh(Cyl, [0 0 lA+lB]));

## Mesh postprocessing

The mesh post processing consists of merging the coincident nodes and dropping the unused nodes of the muffler model.

    muffler = merge_coincident_nodes(muffler);
    muffler = drop_unused_nodes(muffler);

    figure;
    plot_mesh(muffler); view(3);