Flow123d  release_2.2.0-914-gf1a3a4f
intersectionquadrature.hh
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 intersection.hh
15  * @brief
16  */
17 
18 #ifndef INTERSECTION_HH_
19 #define INTERSECTION_HH_
20 
21 /*!
22  *
23  * Copyright (C) 2007 Technical University of Liberec. All rights reserved.
24  *
25  * Please make a following refer to Flow123d on your project site if you use the program for any purpose,
26  * especially for academic research:
27  * Flow123d, Research Centre: Advanced Remedial Technologies, Technical University of Liberec, Czech Republic
28  *
29  * This program is free software; you can redistribute it and/or modify it under the terms
30  * of the GNU General Public License version 3 as published by the Free Software Foundation.
31  *
32  * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
33  * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
34  * See the GNU General Public License for more details.
35  *
36  * You should have received a copy of the GNU General Public License along with this program; if not,
37  * write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 021110-1307, USA.
38  *
39  *
40  * $Id: neighbours.h 1055 2011-04-21 13:43:54Z jan.brezina $
41  * $Revision: 1055 $
42  * $LastChangedBy: jan.brezina $
43  * $LastChangedDate: 2011-04-21 15:43:54 +0200 (Thu, 21 Apr 2011) $
44  *
45  * @file
46  * @brief ???
47  *
48  */
49 
50 
51 #include "mesh/mesh_types.hh"
52 #include <armadillo>
53 
55 
56 
57 
58 /**
59  * Navrh algoritmu pro hledani pruniku elementu dvou siti (libovlnych dimenzi)
60  * algoritmus postupuje od bodu pruniku pres usecky a polygony k mnohostenum
61  *
62  * Vstup: Sit1 dimenze d1 a Sit2 dimenze d2
63  * predpoladam d1<=d2
64  *
65  * 1) hladam body na hranici pruniku tj.
66  * Intersection<d> <d_e1,d_e2> .. prunik ma dimenzi d a pronikaji se simplexy dimenze d_e1, a d_e2
67  *
68  * Intersection<0><0,0> .. totozne vrcholy El<0>
69  * Intersection<0><0,1> a <1,0> .. vrchol jedne site lezi na hrane druhe site
70  * Intersection<0><0,n> a <n,0> .. vrchol lezi na El<n> druhe site
71  *
72  * Intersection<0><1,1> .. bodovy prusecik dvou usecek v rovine
73  * Intersection<0><1,2> a <2,1> ... prusecik hrany a trojuhelnika
74  * ... dalsi zvlastni pripady vcetne <0><3,3> .. tetrahedrony s vrcholem na povrchu druheho
75  *
76  * 2) liniove pruniky Intersection<1>:
77  * Intersection<1><1,1> .. usecky na spolecne primce
78  * Intersection<1><1,2> a <2,1>.. usecka v rovine trojuhelnika
79  * Intersection<1><1,3> a <3,1> .. usecka a tetrahedron
80  * Intersection<1><2,2> .. prusecik dvou trojuhelniku
81  * Intersection<1><2,3> a <3,2> .. trojuhelnik a hrana tetrahedronu
82  * ..
83  *
84  * ... doprcic je to fakt hodne moznosti a je otazka, zda je nutne je vsechny rozlisovat
85  *
86  * Algoritmus by mel probuhat takto:
87  *
88  * 1) Najdu vrchol V site 1 a element E site 2 aby V byl v E
89  * (to neni tak trivialni, pokud site nepokryvaji stejnou oblast ale snad by to slo hledat v
90  * pruniku obalovych boxu)
91  * 2) najdu pruseciky P_i hran z vrcholu V s povrchem E,
92  * konstruuju vsechny potrebne pruniky elementu majici vrchol V s elementem E
93  *
94  * Sousedni elementy spolu s hranami ktere do nich vedou ulozim do prioritni fronty.
95  *
96  * 3) Vyberu z prioritni fronty novy E, pricemz vyuzivam spositane pruseciky psislusne steny a okoli vrcholu V
97  * tj. jdu po hranach po kterych jsem do noveho lementu prisel a najdu vsechny hranove pruniky, pak konstuuju slozitejsi pruniky
98  * az mam vsechny pruniky s novym elementem ...
99  *
100  * ...
101  *
102  * Prioritni fronta by preferovala elementy do kterych jsem se nejvicekrat dostal, tim se snazim minimalizovat povrch projite oblasti.
103  * Je ale mozne, ze to algoritmus naopak zpomali, pokud je prioritni fronta log(n).
104  *
105  * Zpracovani jednoho elementu tedy zahrnuje
106  * 1) trasovani hran:
107  * pro hranu H: testuju hledam prusecik se ctyrstenem:
108  * ANO -> pamatuju si hranovy prunik a ke stene (resp. sousednimu elementu) kde hrana vychazi pridam vychozi hranu
109  * NE -> konci ve vrcholu, dalsi hrany vychazejici z vrcholu pridam na seznam hran vchazejicich do elementu
110  *
111  * 2) po nalezeni pruniku vsech hran, hledam pruniky vsech vchazejicich ploch:
112  * jedna plocha ma se vstupni stenou useckovy prunik na jehoz konci jsou:
113  * *vstupni hrana
114  * * okraj steny
115  * kazdopadne trasuju okraj plosneho pruniku pres povrch elementu, nebo po vstupnich hranach,
116  * pokud prunikova plocha obsahuje vrchol tvorim nove vstupni plochy ...
117  *
118  * 3) Podobne trasuju vchazejici objemy
119  *
120  * ?? lze nejak vyuzit pokud ma element vice vstupnich sten
121  * minimalne se da kontrolovat ...
122  *
123  *
124  * Struktura systemu pruniku do budoucna:
125  * 1) trida IntersectionManager, ma matici vektoru. Na poli A(i,j) je vektor lokalnich souradnic na elementu dimenze i (chodi od 1 do 3)
126  * pruniku dimenze j (chodi od 0 do 3 resp do 2 pokud nebudu chtit prekryvy siti stejne dimenze)
127  *
128  * 2) Jeden intersection objekt je pak iterator dvou elementu a dva indexy lokalnich souradnic v prislusnych vektorech.
129  *
130  * Prozatim to zjednodusime tak, ze vektory lokalnich souradnic budu alokovat zvlast a nebudu je zdruzovat
131  *
132  *
133  * 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.
134  * 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
135  * 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
136  * a pak i hodnotu funkce f.
137  *
138  * K tomu staci mit matici transformace pruniku na referencni element. Takze bych pro jednotlive dvojice element - prunik mel matici + posouvaci vektor z armadila.
139  *
140  *
141  *
142  */
143 
144 #include <iostream>
145 
147 public:
148  Intersection(const ElementFullIter ele_master, const ElementFullIter ele_slave,
149  const IntersectionLocal *isec);
150 
151  /// dimension of the master element
152  unsigned int master_dim();
153 
154  /// dimension of the slave element
155  unsigned int slave_dim();
156 
157  const Element * master_iter() const
158  {return const_cast<Element *>( (Element *)(master) );}
159  const Element * slave_iter() const
160  {return const_cast<Element *>( (Element *)(slave) );}
161 
162  arma::vec map_to_master(const arma::vec &point) const;
163  arma::vec map_to_slave(const arma::vec &point) const;
164  double intersection_true_size() const;
165 
166  ElementFullIter master, slave; // master lower dimension
167 
168 private:
169  /// dimenze pruniku
170  unsigned int dim;
171 
172  /// matrix part of linear transform from reference element of intersection to reference element of master or slave
173  arma::Mat<double> master_map, slave_map;
174  /// shift vector of the linear transform
176  void intersection_point_to_vectors(const IntersectionPoint *point, arma::vec &vec1, arma::vec &vec2);
177 };
178 
179 
180 #endif /* INTERSECTION_HH_ */
arma::vec map_to_master(const arma::vec &point) const
Intersection(const ElementFullIter ele_master, const ElementFullIter ele_slave, const IntersectionLocal *isec)
arma::vec map_to_slave(const arma::vec &point) const
ElementFullIter slave
Class represents intersection of two elements.
Class represents an intersection point of simplex<N> and simplex<M>. It contains barycentric coordina...
const Element * master_iter() const
unsigned int dim
dimenze pruniku
unsigned int master_dim()
dimension of the master element
arma::Mat< double > master_map
matrix part of linear transform from reference element of intersection to reference element of master...
unsigned int slave_dim()
dimension of the slave element
arma::vec master_shift
shift vector of the linear transform
const Element * slave_iter() const
void intersection_point_to_vectors(const IntersectionPoint *point, arma::vec &vec1, arma::vec &vec2)
arma::Mat< double > slave_map
double intersection_true_size() const
ElementFullIter master