234x Filetype PDF File size 0.21 MB Source: dune-project.org
{ 2, 3 } }; // S :=2,S :=3 gt.makeSimplex(2); // same as makeTriangle() (0,0,1)
10 11 3 (0,0,1)
In General FieldMatrix Q(k); // Qij :=k ∀i,j gt.makeCube(3); // same as makeHexahedron() 3
// for each makeShape() there is an isShape()
main() template assert(i < S.rows()); // get number of rows assert(gt.isHexahedron());
assert(j < S.cols()); // get number of columns assert(gt.isCube()); // ignore dimension 5
#include k = S[i][j]; // access entry assert(gt.dim() == 3); // check dimension
S[i][j] = k; // assign entry 3 3 4
for(const auto &row : S) Concept Geometry right
#include 2 2 2
for(const auto &entry : row) left (0,1,0)
using Geo = ...; Geo geo; 1 (0,1,0)
int main(int argc, char **argv) k += entry; // access each entry front 1 2
for(auto &row : S) 0
{ using ctype = Geo::ctype; bottom
Dune::MPIHelper::instance(argc, argv); for(auto &entry : row) 0 1 0 0 1
entry = k; // modify each entry int ldim = Geo::mydimension; // local dim (0,0,0) (1,0,0)(0,0,0) (1,0,0)
int gdim = Geo::coorddimension; // global dim (0,0,1)
(0,0,1)
// your code goes here auto L = Q.leftmultiplyany(S); // L:=SQ 4 4
} auto R = Q.rightmultiplyany(S); // R:=QS Geo::LocalCoordinate xl; // xˆ ∈ ctypeldim
Q.leftmultiply(S); // S := SQ Geo::GlobalCoordinate x; // x∈ctypegdim
.cc-file template x = geo.global(xl); // x:=g(xˆ) 4 6 7
Q.rightmultiply(S); // S := QS −1 rear
#include S += Q; S -= Q; // S :=S+Q, S :=S−Q xl = geo.local(x); // xˆ := g (x) 1 2 3 4 5
left 2 2 3 3
(0,1,0) (1,1,0)
S.axpy(k, Q); // S := S +kQ p 3 (0,1,0) (1,1,0)
−1 // J−T ∈ctypegdim×ldim, J := ∂g /∂xˆ , µ := | detJTJ| front 0 right 0 1
// your code and includes go here S *= k; S /= k; // S :=kS, S :=k S ij i j bottom
S.invert(); // S := S−1 Geo::JacobianInverseTransposed JInvT = 0 1 0 2 1
.hh-file template q geo.jacobianInverseTransposed(xl); (0,0,0) (1,0,0) (0,0,0) (1,0,0)
P (0,1,1)
2 ctype mu = geo.integrationElement(xl); (0,1,1)
r = S.frobenius_norm(); // r:= ij |Sij|
// For a header that is included like r = S.infinity_norm(); // r := max {P |S |} 5
// #include i j ij 5
k = S.determinant(); // k := detS GeometryType gt = geo.type(); // shape 4
#ifndef DUNE_MODULE_DIR_HEADER_NAME_HH assert(i < geo.corners()); // count corners (0,0,1) (1,0,1)
#define DUNE_MODULE_DIR_HEADER_NAME_HH top 7 8
Q.mv (x, y); // y :=Qx x = geo.corner(i); // access corner 3 4 (0,0,1) (1,0,1)
Q.mtv (x, y); // y :=QTx x = geo.center(); // roughly 3 6 4
// your code and includes go here Q.umv (x, y); // y :=y+Qx ctype v = geo.volume(); // in global coords 2
// do not #include Q.umtv (x, y); // y :=y+QTx 2
H template 1 right
#endif // DUNE_MODULE_DIR_HEADER_NAME_HH Q.umhv (x, y); // y :=y+Q x class ReferenceElements;
Q.usmv (k, x, y); // y :=y+kQx left 0
T front 0 1
Q.usmtv(k, x, y); // y :=y+kQ x #include 2 2
Q.usmhv(k, x, y); // y :=y+kQHx (0,1,0)
❞✉♥❡✲❝♦♠♠♦♥ (0,1,0)
Q.solve (x, y); // find x such that Qx=y using Factory = ReferenceElements; 3 4 5
In the following, r is of type R, which may be a scalar real type, const auto &refTet = Factory::simplex(); bottom
#define DUNE_THROW(ExceptionType, message) const auto &refHex = Factory::cube(); 0 1 0 3 1
e.g. double or float. k is of type K, which may be may be R or GeometryType gt; gt.makePrism(); (0,0,0) (1,0,0)(0,0,0) (1,0,0)
std::complex. #include (0,1,1) (1,1,1)
const auto &ref = Factory::general(gt); 6 7 (0,1,1) (1,1,1)
template class FieldVector; 6 11 7
if(i > limit) 5
// Info about ref itself (0,0,1) top (1,0,1) 8 9
#include DUNE_THROW(Exception, "Error: i > limit (" (0,0,1) (1,0,1)
gt = ref.type(); 4 5 4 10 5
<< i << " > " << limit << ")"); ctype v = ref.volume(); 3
FieldVector x = { 0, 1 }; // x :=0,x :=1 rear 2 3
0 1 ref.size(c); // count subentities of codim c
FieldVector y(k); // x :=k ∀i template std::string className();
i 0 1
template std::string className(T& t); left 2 right 0 1
assert(i < x.dim()); // get number of entries // Info about subentity (i,c) front
#include gt = ref.type(i,c); 2 3 2 7 3
k = x[i]; x[i] = k; // access/assign entry // position of barycenter (0,1,0) (1,1,0) (0,1,0) (1,1,0)
for(const auto &entry : x) 4 4 5
template FieldVector x = ref.position(i,c) bottom
k += entry; // access each entry // count sub-subentities of codim cc 0 1 0 6 1
for(auto &entry : x) void printTypes(const Vector &v) { (0,0,0) (1,0,0) (0,0,0) (1,0,0)
entry = k; // modify each entry std::cerr << "Info: Vector type is " ref.size(i,c, cc);
<< className() // transform number of sub-subentity to ref template class QuadratureRules;
x += y; x -= y; // x:=x+y, x:=x−y << ", entry type is " ref.subEntity(i,c, ii,cc);
x *= k; x /= k; // x:=kx, x:=k−1x << className(v[0]) << std::endl; (0,1) (0,1) (1,1) #include
k = x * y; // k := xTy = x·y = P x y } 3
i i i 2 2 3
k = x.dot(y); // k := xHy = x¯·y = P x¯ y K f(const FieldVector &x);
i i i int p; // max polynomial order of f
r = x.one_norm(); // r := P |xi| ❞✉♥❡✲❣❡♦♠❡tr②
pi
r = x.two_norm(); // r := P|xi|2 K result = 0;
i class GeometryType; GeometryType gt; gt.makeSimplex(dim);
r = x.infinity_norm(); // r:=maxi{|xi|} 1 2 0 1 for(const auto &qp :
template #include QuadratureRules::rule(gt, p))
class FieldMatrix; result += qp.weight() * f(qp.position());
GeometryType gt; // now result contains the integral of f()
#include gt.makeVertex(); gt.makeLine(); // over the reference-simplex of dimension dim
gt.makeTriangle(); gt.makeQuadrilateral(); 0 0 1 0 2 1 TODO:integral over a geometry over a scalar
FieldMatrix S = gt.makeTetrahdron(); gt.makePyramid(); (0,0) (1,0) (0,0) (1,0) TODO: integral over a geometry over a gradient (incl piola)
{ { 0, 1 }, // S :=0,S :=1 gt.makePrism(); gt.makeHexahedron();
00 01
1
int codim = Entity::codimension; class LocalKey; – DoF position info format
int dim = Entity::dimension; // as on Grid // interpolate f to piecewise constants
❞✉♥❡✲❣r✐❞ TODO
int mydim = Entity::mydimension; std::vector p0(gv.size(0)) TODO: list of local finite elements
Grid (YaspGrid, UGGrid, OneDGrid, GeometryGrid) for(const auto &e : elements(gv))
GridView (LevelGridView, LeafGridView) GeometryType gt = e.type(); // Shape p0[set.index(e)] = f(e.geometry().center()); ❞✉♥❡✲✐st❧
IndexSet // the LevelGridView that e is part of
Entity (elements, facets, edges, vertices) int l = e.level(); // interpolate f to P1/Q1
std::vector p1(gv.size(dim)); BlockVector BCRSMatrix
Geometry (entity to global) // transform mydimension -> dimensionworld for(const auto &v : vertices(gv)) MatrixAdapter Preconditioner
Intersection Entity::Geometry geo = e.geometry(); p1[set.index(v)] = f(v.geometry().center()); list of preconditioners
Geometry (intersection to global) Solver Interface InverseOperatorResult
Entity (inside/outside element/cell) Concept Intersection – connectivity between elements // output the two interpolations of f list of solvers
Geometry (intersection to inside/outside) VTKWriter writer(gv);
Concept Grid – hierarchy of meshes Intersection isect; writer.addCellData(p0, "constants");
writer.addVertexData(p1, "linears");
Grid g; using ctype = Intersection::ctype; writer.write("file_name_base");
// local coords (== Grid::dimension - 1)
using ctype = Grid::ctype; int mydim = Intersection::mydimension;
int dim = Grid::dimension; // global coords (== Grid::dimensionworld) ❞✉♥❡✲❧♦❝❛❧❢✉♥❝t✐♦♥s
// think "surface grid" int dimw = Intersection::dimensionworld;
int dimw = Grid::dimensionworld; LocalFiniteElement
GeometryType gt = isect.type(); // Shape
g.globalRefine(n); // add n levels LocalBasis
assert(g.maxLevel() > 0); // transform intersection -> world LocalInterpolation
// all coarse/macro entities Intersection::Geometry geo = isect.geometry(); LocalCoefficients
auto levelView = g.levelGridView(0); Intersection::LocalCoordinate xl; Concept LocalFiniteElement
// all finest/leaf entities Intersection::GlobalCoordinate nu_u, nu_q;
auto leafView = g.leafGridView(); // kν k =1, ν :=ν ·geo.integrationElement(xl) using LocalFiniteElement = ...;
u 2 q u
nu_u = isect.unitOuterNormal(xl); LocalFiniteElement lfe;
Concept GridView – one mesh from the hierarchy nu_q = isect.integrationOuterNormal(xl);
GeometryType gt = lfe.type();
GridView gv; using Element = Intersection::Entity; unsigned shapeFunctionCount = lfe.size();
using LGeo = Intersection::LocalGeometry;
using Grid = GridView::Grid; const auto &lb = lfe.localBasis();
using ctype = GridView::ctype; // as on Grid // inside element (always exists) const auto &li = lfe.localInterpolation();
int dim = GridView::dimension; Element in = isect.inside(); const auto &lc = lfe.localCoefficients();
int dimw = GridView::dimensionworld; // transform intersection -> inside
LGeo inGeo = isect.geometryInInside(); Concept LocalBasis – evaluate shape functions and derivatives
const Grid &g = gv.grid(); // index of subfacet of in that contains isect
const auto &idxSet = gv.indexSet(); int inIdx = isect.indexInInside(); using LocalBasis = ...; LocalBasis lb;
// count entities...
int n = gv.size(c); // with codim c if(isect.neighbor()) { // check outside exists unsigned shapeFunctionCount = lb.size();
int n = gv.size(gt); // with GeometryType gt Element out = isect.outside(); unsigned p = lb.order(); // max polynom order
LGeo outGeo = isect.geometryInOutside(); using T = LocalBasis::Traits;
// iterate over entities in gv int outIdx = isect.indexInOutside();
for(const auto &elem : elements(gv)) ...; } // otherwise on domain boundary unsigned dimD = T::dimDomain;
for(const auto &facet : facets (gv)) ...; using DF = T::DomainFieldType;
dimD
for(const auto &edge : edges (gv)) ...; template class YaspGrid; using Domain = T::DomainType; // DF
for(const auto &vertex : vertices(gv)) ...; Yet Another Structured Parallel Grid unsigned dimR = T::dimRange;
// iterate intersections of elem in gv Implements concept Grid. using RF = T::RangeFieldType;
dimR
for(const auto &isect : using Range = T::RangeType; // RF
intersections(gv, elem)) ...; #include
Domain xl; // xˆ
Concept IndexSet – numbering within GridViews 2 (i)
// construct unit square [0,1] with one element std::vector y; // y[i][j]=y
YaspGrid<2> grid0({ 1, 1 }, { 1, 1 }); j
Entities of different shape (GeometryType) are numbered sepa- (i) (i)
// resizes y to fit; y := ϕˆ (xˆ) ∀i
rately. See MultipleCodimMultipleGeomTypeMapper. j j
// construct cube [−1,1]3 with 8=23 elements lb.evaluateFunction(xl, y);
const IndexSet &idxSet; YaspGrid<3> grid1({ -1, -1, -1 }, { 1, 1, 1 },
{ 2, 2, 2 }); // only guaranteed for T::diffOrder > 0:
Entity e; // any codim using Jacobian = T::JacobianType; // RFdimR×dimD
int i, c; // number/codim of subentity template class VTKWriter; std::vector J; // J[i][j][k]=J(i)
Generate files for paraview jk
idxSet.index(e); // index of e in gv (i) (i)
// resizes J to fit; J := (∂ϕˆ /∂xˆ )| ∀i,j,k
idxSet.subIndex(e, i,c); // index of subentity jk j k xˆ
#include lb.evaluateJacobian(xl, J);
ˆ (i)
Concept Entity – elements, facets, edges, vertices GridView gv; // for scalar bases (dimR==1): J[i][0]=∇ϕˆ
Entity e; double f(FieldVector xg); Concept LocalInterpolation – interpolate into shape functions
TODO
// all entities: mydim + codim == dim // for multiple possible GeometryTypes use Concept LocalCoefficients – DoF position database
// elements: codim == 0; facets: codim == 1 // MultipleCodimMultipleGeomTypeMapper instead TODO
// edges: mydim == 1; vertices: mydim == 0 const auto &set = gv.indexSet();
2
no reviews yet
Please Login to review.