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