This project provides an efficient implementation of various adaptive mesh refinement strategies in two dimensions. The documentation provides a detailed investigation of the implemented mesh refinement methods and also presents how the methods are realized by utilization of reasonable data structure, use of Matlab built-in functions and vectorization. In the documentation, the focus is set on the deployment of ameshref in the context of the adaptive finite element method. To this end, also codes to realize the adaptive finite element method (AFEM) is additionally provided here. However, our code is kept general such that this package is not restricted to the AFEM context as our other test examples show. This package can be used to adaptively generate meshes in two dimensions in different ways. Moreover, it can also serve educational purposes on how to realize mesh refinement methods in an accessible, short but efficient way. The data structure used is very simple because only the coordinates of the vertices and the element-connectivities are needed. Marking of elements are interpreted as edge-based marking, i.e., an element is marked by marking each edge for bisection. In contrast to other mesh refinement packages, we do not make use of a recursive approach but prefer the realization in terms of vectorization.
For a use of the refinement methods download the complete repository /ameshref with the test examples and run them on your computer with Matlab. To use it within your own examples you only need the repository /refinement. Please see the following instructions for a correct use.
MATLAB
/example1: run test_refinement.m (refinement along a circle)
/example2: run mainAdaptiveScript.m (triangulation of a picture)
/example3: run example1.m or example2.m in each of the repositories (mesh refinement in the context of AFEM)
To be able to deploy this package within your framework you need the following data strucure of the mesh:
For triangles you need to define coordinates, elements3, and optionally boundary data dirichlet or neumann.
Similarly, for quadrilaterals you need to define coordinates, elements4, and optionally boundary data dirichlet or neumann.
For meshes with hanging nodes an additional data vector named irregular is needed, where irregular(l,1) and irregular(l,2) are the starting and end point of the lth-irregular edge with hanging node stored in irregular(l,3).
We abbreviate the data structure as coordinates (C), elements3 (E3), elements4 (E4), irregular (I), dirichlet (D), and neumann (N). Furthermore, marked elements are stored with the corresponding index in the variable marked.
The different mesh refinement methods are then called by (remember that D and N are optional arguments)
[C,E3,I,D,N] = TrefineR(C,E3,I,D,N,marked)
[C,E4,I,D,N] = QrefineR(C,E4,I,D,N,marked)
[C,E4,I,D,N] = QrefineR2(C,E4,I,D,N,marked)
[C,E3,D,N] = TrefineNVB(C,E3,D,N,marked)
[C,E3,D,N] = TrefineRGB(C,E3,D,N,marked)
[C,E3,D,N] = TrefineRG(C,E3,D,N,marked)
[C,E4,D,N] = QrefineRB(C,E4,D,N,marked)
3-step call
[C,E4,marked,I] = recoarseedges_tri(C,E3,E4,marked3,marked4)
[C,E4,D,N] = QrefineR(C,E4,D,N,marked)
[C,E4,E3] = regularizeedges_tri(C,E4,I)
3-step call
[C,E4,marked,I] = recoarseedges(C,E4,marked4)
[C,E4,I,D,N] = QrefineR2(C,E4,I,D,N,marked)
[C,E4] = regularizeedges_tri(C,E4,I)
The used functions are provided in the repository /example1 and /refinement:
C = [0.8,0.7]; % center of circle
r = 0.5; % radius of circle
min_d = 5e-6; % minimal diameter of an element allowed
%% exemplary use of a quadrilateral mesh refinement strategy
coordinates = [0,0;1,0;1,1;0,1;2,0;2,1];
elements4 = [1,2,3,4;2,5,6,3];
while 1
mark4 = markCircle(coordinates,[],elements4,C,r,min_d);
mark4 = find(mark4);
[coordinates,elements4] = QrefineRB(coordinates,elements4,mark4);
if isempty(mark4)
break
end
end
triangular mesh:
patch('Faces',elements3,'Vertices',coordinates,'Facecolor','none')
quadrilateral mesh:
patch('Faces',elements4,'Vertices',coordinates,'Facecolor','none')
- Stefan A. Funken - Anja Schmidt Institute for Numerical Mathematics, Ulm University, Germany
This project is licensed under the MIT License - see the LICENSE file for details