Contents

Illustrate how to randomly shake internal nodes

clear variables;

Crete Mesher object

When Mesher object is created it takes care of initializing interface to GMSH mesh generator

mesher = mp.Mesher();

Create object describing geometric model to be meshed

L = 10;
geom = mp.geoms.SquareGeom('my_domain', struct('da', L));

Generate Mesh object

Ne = 5;
meshingparams.lc = L/Ne;
meshingparams.order = 2;
mesh = mesher.generate(geom, meshingparams);

Selecting nodes

selector.b_south = 0;
selector.b_north = 0;
selector.b_west = 0;
selector.b_east = 0;

nodesTag = mp_tag_region_nodes(mesh, selector, 'min', 1);
boundaryNodes = find(nodesTag==0);
internalNodes = find(nodesTag==1);

boundaryPts = mesh.nodes(boundaryNodes, :);

radius = L*ones(mesh.countNodes(), 1);

Iterate over elements and calculate maximum allowabel radius

for i=1:mesh.countElems()
  nodes = mesh.elemNodes(i);
  nen = length(nodes);
  pairs = combnk(1:nen, 2);
  for p = pairs'
    n = nodes(p);
    nodesDist = norm(diff(mesh.nodes(n,:), 1));
    radius(n) = min(radius(n), nodesDist*[1;1]);
  end
end

radius = 0.3*radius;
radius(boundaryNodes) = 0.0;
direction = 2*pi*rand(mesh.countNodes(), 1);
distance = radius.*(0.5+0.5*rand(mesh.countNodes(),1));
u = distance.*[cos(direction), sin(direction)];

gmap = mesh.geomTrans();
quadrature = mp.IM.Triangle(2);

s = 0.0;
for i=1:mesh.countPerDim(mesh.dim)
  J = gmap.volumeForm(quadrature.pts, i, u);
  s = s+dot(J,quadrature.w);
end

fprintf('Integral : %g\n', s);
viewer = mp.Viewer();
viewer.show(mesh);
h = viewer.plot_curved_elements(mesh, 10, u);
alpha(get(h, 'Children'), 0.3)
set(get(h, 'Children'), 'LineWidth', 2)


% Report demo status
mp_manage_demos('report', 'integrate', true);
Integral : 100