Commits
Jozsef Bakosi authored 0951d401c20
WIP on overset: flags transfer correct, velocity almost modulo symmetry surface
At this point overset appears to almost work in serial and parallel. Flags
transfer works, symmetry appears to be correctly taken into account, however,
some more debugging needed since the transferred solution fields (velocity)
while appear correct inside the domain of both background and overset meshes,
the velocity values on the symmetry surface are only correct on the background
mesh but not the overset mesh. This is somewhat surprising because the flags
appear correct on both meshes both inside the domain as well as on the symmetry
surface and the same logic runs within NodeSearch::determineActualCollisions()
regarding symmetry.
Details
* Add parsing for symmetry condition for intergrid boundary specification
This is used in NodeSearch::determineActualCollisions() to shift the
destination points by a small number during interpolation so points on the
symmetry surface aligned are still found by the search.
* Add parsing for layers configuration for intergrid boundary specification
This is used to specify the number of mesh layers for each of three
different layers that are "grown" around the intergrid boundary, done in
Discretization::intergrid().
* Add multi-mesh-aware parsing for the href block
This can be used to specify href blocks to perform initial mesh refinement
independently for the overset and/or the background meshes.
* Add hole search
Hole search is used to find those regions of the background mesh which need
to masked out where the overset mesh has no mesh. This is specified by the
intergrid_2 block within the overset block, referring to a list of sidesets.
Around these sidesets, a hole is assumed and searched. Data structures for
finding holes is setup in Discretization::hole(). The boundary nodes of the
intergrid-boundary surface are reduced to all partitions of the background
mesh, resulting in topologically complete holes on each background-mesh
partitions. The send/contribute is in hole() with the receive in
aggregateHoles(). This allows finding holes by computing surface integrals
in Discretization::holefind(). For the algorithm, see doc/papers/work/hole.
* Setting up intergrid layers
Independent of the hole search, which happens on the background mesh only,
the intergrid layers are configured in Discretization intergrid(), which
happens on the overset mesh only. Three layers are setup by growing the
surface of the integrid/hole surface, where mesh nodes are flagged: (1)
intergrid boundary flagged by 1.0, indicating that solution from mesh 1
(overset) will be used there, (2) middle (or buffer) layers, flagged by
-1.0, used to not modify the solution there, allowing the solution to relax,
and (3) an outer, solution transfer, layer, flagged by 0.0, where the
solution from the background mesh 0 will be used. The default values of
the flag in a mesh point is -2.0. The thickness can be configured for all
three regions by specifying the number of adjacent mesh layers for each. The
defaults are { 2, 4, 2 }.
* Transfer flags
This commit puts in code to first transfer flags only and not solutions.
This is controlled by the bool trflag, passed Discretization::transfer().
Note that flag transfer only happens from overset to background.
* Using holes
The mesh nodes marked with as inside of a hole on the background mesh are
zeroed out. This is in LohCG::holeset(), called multiple times during a
time step, whenever this is necessary.
* Tests
All three existing regression tests exercising overset are disabled because
the logic changes here quite a lot so either those tests need to be updated
or new ones need to replace the existing ones once overset works.
At this point I do not know when and who will continue the overset
functionality. A doc page on some basics on how the method is supposed to work,
how it works so far, and how it can be tested will be put in under
doc/pages/inciter_overset.dox.