Home

Awesome

ameshref

Efficient Matlab Implementation of Adaptive Mesh Refinement in 2D

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.

alt text

Getting Started

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.

Prerequisites

MATLAB

Running the test examples

/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)

/example4: run example4.m (for a given discrete set of points all elements containing these points are refined)

Deployment for your own examples - Data structure

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.

alt text

Similarly, for quadrilaterals you need to define coordinates, elements4, and optionally boundary data dirichlet or neumann.

alt text

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).

How to call the functions

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)

TrefineR

[C,E3,I,D,N] = TrefineR(C,E3,I,D,N,marked)

QrefineR

[C,E4,I,D,N] = QrefineR(C,E4,I,D,N,marked)

QrefineR2

[C,E4,I,D,N] = QrefineR2(C,E4,I,D,N,marked)

TrefineNVB

[C,E3,D,N] = TrefineNVB(C,E3,D,N,marked)

TrefineRGB

[C,E3,D,N] = TrefineRGB(C,E3,D,N,marked)

TrefineRG

[C,E3,D,N] = TrefineRG(C,E3,D,N,marked)

QrefineRB

[C,E4,D,N] = QrefineRB(C,E4,D,N,marked)

QrefineRG

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)

QrefineRG2

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)

Minimal example

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

Plot your mesh with Matlab

triangular mesh:

patch('Faces',elements3,'Vertices',coordinates,'Facecolor','none')

quadrilateral mesh:

patch('Faces',elements4,'Vertices',coordinates,'Facecolor','none')

Authors

If you use ameshref in scientific work, please cite:

License

This project is licensed under the MIT License - see the LICENSE file for details