Skip to content

Implement blockstructuring for Q1

Marcel Koch requested to merge feature/blockstructured_poisson into master

A grid element, here referred as a macro element, is divided into multiple sub elements, called micro elements. Quadrilateral elements are divided equally along each axis. The number of elements along one axis denotes the order of the blockstructuring. An 2d example of order 2:

     macro                    micro
-----------------       -----------------
|               |       |       |       |
|               |       | (0,1) | (1,1) |
|               |       |       |       |
|               | ----> |-------|-------|
|               |       |       |       |
|               |       | (0,0) | (1,0) |
|               |       |       |       |
-----------------       -----------------

The subdivision is purely virtual, the micro elements have no corresponding element in the mesh. Instead the handling of the micro elements is part of the LocalOperator. The additional dofs of the micro elements are the dofs of an ancillary higher order finite element basis. The order of the ancillary basis is given by: order of blockstructuring * order of FE basis.

sub_element_inames introduces the additional inames of the micro elements in tensor structure. Within these inames, the usual computation of the basis function takes place.

Since the localoperator only knows about the macro element, additional transformation from the micro element to the macro element must be worked in. This is done in micro_to_macro_index and name_point_in_macro. The first one takes one iname (of the basis functions) and uses the subelement inames to compute the index for the higher order FE basis. The latter one computes the coordinates in the macro element of a point in the micro element.

The blockstructuring is activated by setting blockstructured=1 in the .mini file. The order of the blockstructuring is given by number_of_blocks=k in the .mini file.

Edited by Marcel Koch

Merge request reports

Loading