Flow123d  release_3.0.0-684-g928e266
neighbours.h
Go to the documentation of this file.
1 /*!
2  *
3  * Copyright (C) 2015 Technical University of Liberec. All rights reserved.
4  *
5  * This program is free software; you can redistribute it and/or modify it under
6  * the terms of the GNU General Public License version 3 as published by the
7  * Free Software Foundation. (http://www.gnu.org/licenses/gpl-3.0.en.html)
8  *
9  * This program is distributed in the hope that it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
11  * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
12  *
13  *
14  * @file neighbours.h
15  * @brief
16  */
17 
18 #ifndef MAKE_NEIGHBOURS_H
19 #define MAKE_NEIGHBOURS_H
20 
21 #include "mesh/sides.h"
22 #include "mesh/edges.h"
23 #include "mesh/elements.h"
24 #include "mesh/mesh.h"
25 #include "mesh/accessors.hh"
26 
27 
28 
29 class Edge;
30 class SideIter;
31 /**
32  * Navrh algoritmu pro hledani pruniku elementu dvou siti (libovlnych dimenzi)
33  * algoritmus postupuje od bodu pruniku pres usecky a polygony k mnohostenum
34  *
35  * Vstup: Sit1 dimenze d1 a Sit2 dimenze d2
36  * predpoladam d1<=d2
37  *
38  * 1) hladam body na hranici pruniku tj.
39  * Intersection<d> <d_e1,d_e2> .. prunik ma dimenzi d a pronikaji se simplexy dimenze d_e1, a d_e2
40  *
41  * Intersection<0><0,0> .. totozne vrcholy El<0>
42  * Intersection<0><0,1> a <1,0> .. vrchol jedne site lezi na hrane druhe site
43  * Intersection<0><0,n> a <n,0> .. vrchol lezi na El<n> druhe site
44  *
45  * Intersection<0><1,1> .. bodovy prusecik dvou usecek v rovine
46  * Intersection<0><1,2> a <2,1> ... prusecik hrany a trojuhelnika
47  * ... dalsi zvlastni pripady vcetne <0><3,3> .. tetrahedrony s vrcholem na povrchu druheho
48  *
49  * 2) liniove pruniky Intersection<1>:
50  * Intersection<1><1,1> .. usecky na spolecne primce
51  * Intersection<1><1,2> a <2,1>.. usecka v rovine trojuhelnika
52  * Intersection<1><1,3> a <3,1> .. usecka a tetrahedron
53  * Intersection<1><2,2> .. prusecik dvou trojuhelniku
54  * Intersection<1><2,3> a <3,2> .. trojuhelnik a hrana tetrahedronu
55  * ..
56  *
57  * ... doprcic je to fakt hodne moznosti a je otazka, zda je nutne je vsechny rozlisovat
58  *
59  * Algoritmus by mel probuhat takto:
60  *
61  * 1) Najdu vrchol V site 1 a element E site 2 aby V byl v E
62  * (to neni tak trivialni, pokud site nepokryvaji stejnou oblast ale snad by to slo hledat v
63  * pruniku obalovych boxu)
64  * 2) najdu pruseciky P_i hran z vrcholu V s povrchem E,
65  * konstruuju vsechny potrebne pruniky elementu majici vrchol V s elementem E
66  *
67  * Sousedni elementy spolu s hranami ktere do nich vedou ulozim do prioritni fronty.
68  *
69  * 3) Vyberu z prioritni fronty novy E, pricemz vyuzivam spositane pruseciky psislusne steny a okoli vrcholu V
70  * tj. jdu po hranach po kterych jsem do noveho lementu prisel a najdu vsechny hranove pruniky, pak konstuuju slozitejsi pruniky
71  * az mam vsechny pruniky s novym elementem ...
72  *
73  * ...
74  *
75  * Prioritni fronta by preferovala elementy do kterych jsem se nejvicekrat dostal, tim se snazim minimalizovat povrch projite oblasti.
76  * Je ale mozne, ze to algoritmus naopak zpomali, pokud je prioritni fronta log(n).
77  *
78  * Zpracovani jednoho elementu tedy zahrnuje
79  * 1) trasovani hran:
80  * pro hranu H: testuju hledam prusecik se ctyrstenem:
81  * ANO -> pamatuju si hranovy prunik a ke stene (resp. sousednimu elementu) kde hrana vychazi pridam vychozi hranu
82  * NE -> konci ve vrcholu, dalsi hrany vychazejici z vrcholu pridam na seznam hran vchazejicich do elementu
83  *
84  * 2) po nalezeni pruniku vsech hran, hledam pruniky vsech vchazejicich ploch:
85  * jedna plocha ma se vstupni stenou useckovy prunik na jehoz konci jsou:
86  * *vstupni hrana
87  * * okraj steny
88  * kazdopadne trasuju okraj plosneho pruniku pres povrch elementu, nebo po vstupnich hranach,
89  * pokud prunikova plocha obsahuje vrchol tvorim nove vstupni plochy ...
90  *
91  * 3) Podobne trasuju vchazejici objemy
92  *
93  * ?? lze nejak vyuzit pokud ma element vice vstupnich sten
94  * minimalne se da kontrolovat ...
95  *
96  *
97  * Struktura systemu pruniku do budoucna:
98  * 1) trida IntersectionManager, ma matici vektoru. Na poli A(i,j) je vektor lokalnich souradnic na elementu dimenze i
99  * pruniku dimenze j.
100  * 2) Jeden intersection objekt je pak iterator dvou elementu a dva indexy lokalnich souradnic v prislusnych vektorech
101  *
102  * Prozatim to zjednodusime tak, ze
103  *
104  *
105  * Nakonec potrebuju pocitat integral pres prunik z nejake funkce f(phi_a(x), phi_b(x)), kde phi_a je bazova funkce na jednom elementu a phi_b na druhem.
106  * To budu delat numerickou kvadraturou, takze potrebuji zobrazit prunik na jednotkovy simplex. Pro uzel kvardatury x_i musim najit body a_i a b_i na
107  * referencnich elementech A a B. Tj potrebuju lokalni souradnice (to jsou souradnice na referencnich elementech) kvadraturnich bodu. V nic pak umim spocitat hodnotu bazovych funkci
108  * a pak i hodnotu funkce f.
109  *
110  *
111  *
112  */
113 
114 
115 
116 /**
117  * Class only for VB neighbouring.
118  */
120 {
121 public:
122  Neighbour();
123 
124  void reinit(Mesh *mesh, unsigned int elem_idx, unsigned int edge_idx);
125 
126  // side of the edge in higher dim. mesh
127  inline SideIter side();
128 
129  inline unsigned int edge_idx();
130 
131  // edge of higher dimensional mesh in VB neigh.
132  inline Edge *edge();
133 
134  // element of lower dimension mesh in VB neigh.
135  inline ElementAccessor<3> element();
136 
137 private:
138  Mesh * mesh_; ///< Pointer to Mesh to which belonged
139  unsigned int elem_idx_; ///< Index of element in Mesh::element_vec_
140  unsigned int edge_idx_; ///< Index of Edge in Mesh
141 
142  friend class Mesh;
143 };
144 
145 
146 // side of the edge in higher dim. mesh
148  OLD_ASSERT( edge()->n_sides == 1 , "VB neighbouring with %d sides.\n", edge()->n_sides);
149  //DebugOut().fmt("VB neighbouring with {} sides.\n", edge_->n_sides);
150  return edge()->side(0);
151 }
152 
153 inline unsigned int Neighbour::edge_idx() {
154  return edge_idx_;
155 }
156 
157 // edge of lower dimensional mesh in VB neigh.
159  return &( mesh_->edges[ edge_idx_] );
160 }
161 
162 // element of higher dimension mesh in VB neigh.
165 }
166 
167 
168 #endif
169 //-----------------------------------------------------------------------------
170 // vim: set cindent:
unsigned int elem_idx_
Index of element in Mesh::element_vec_.
Definition: neighbours.h:139
Edge * edge()
Definition: neighbours.h:158
Definition: mesh.h:80
Definition: edges.h:26
virtual ElementAccessor< 3 > element_accessor(unsigned int idx) const
Create and return ElementAccessor to element of given idx.
Definition: mesh.cc:719
#define OLD_ASSERT(...)
Definition: global_defs.h:131
ElementAccessor< 3 > element()
Definition: neighbours.h:163
unsigned int edge_idx_
Index of Edge in Mesh.
Definition: neighbours.h:140
unsigned int edge_idx()
Definition: neighbours.h:153
SideIter side()
Definition: neighbours.h:147
unsigned int n_sides() const
Definition: mesh.cc:221
std::vector< Edge > edges
Vector of MH edges, this should not be part of the geometrical mesh.
Definition: mesh.h:252
void reinit(Mesh *mesh, unsigned int elem_idx, unsigned int edge_idx)
Definition: neighbours.cc:36
SideIter side(const unsigned int i) const
Definition: edges.h:31
Mesh * mesh_
Pointer to Mesh to which belonged.
Definition: neighbours.h:138