Flow123d  jenkins-Flow123d-linux-release-multijob-282
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 
45 
46 
47 
48 /**
49  * Navrh algoritmu pro hledani pruniku elementu dvou siti (libovlnych dimenzi)
50  * algoritmus postupuje od bodu pruniku pres usecky a polygony k mnohostenum
51  *
52  * Vstup: Sit1 dimenze d1 a Sit2 dimenze d2
53  * predpoladam d1<=d2
54  *
55  * 1) hladam body na hranici pruniku tj.
56  * Intersection<d> <d_e1,d_e2> .. prunik ma dimenzi d a pronikaji se simplexy dimenze d_e1, a d_e2
57  *
58  * Intersection<0><0,0> .. totozne vrcholy El<0>
59  * Intersection<0><0,1> a <1,0> .. vrchol jedne site lezi na hrane druhe site
60  * Intersection<0><0,n> a <n,0> .. vrchol lezi na El<n> druhe site
61  *
62  * Intersection<0><1,1> .. bodovy prusecik dvou usecek v rovine
63  * Intersection<0><1,2> a <2,1> ... prusecik hrany a trojuhelnika
64  * ... dalsi zvlastni pripady vcetne <0><3,3> .. tetrahedrony s vrcholem na povrchu druheho
65  *
66  * 2) liniove pruniky Intersection<1>:
67  * Intersection<1><1,1> .. usecky na spolecne primce
68  * Intersection<1><1,2> a <2,1>.. usecka v rovine trojuhelnika
69  * Intersection<1><1,3> a <3,1> .. usecka a tetrahedron
70  * Intersection<1><2,2> .. prusecik dvou trojuhelniku
71  * Intersection<1><2,3> a <3,2> .. trojuhelnik a hrana tetrahedronu
72  * ..
73  *
74  * ... doprcic je to fakt hodne moznosti a je otazka, zda je nutne je vsechny rozlisovat
75  *
76  * Algoritmus by mel probuhat takto:
77  *
78  * 1) Najdu vrchol V site 1 a element E site 2 aby V byl v E
79  * (to neni tak trivialni, pokud site nepokryvaji stejnou oblast ale snad by to slo hledat v
80  * pruniku obalovych boxu)
81  * 2) najdu pruseciky P_i hran z vrcholu V s povrchem E,
82  * konstruuju vsechny potrebne pruniky elementu majici vrchol V s elementem E
83  *
84  * Sousedni elementy spolu s hranami ktere do nich vedou ulozim do prioritni fronty.
85  *
86  * 3) Vyberu z prioritni fronty novy E, pricemz vyuzivam spositane pruseciky psislusne steny a okoli vrcholu V
87  * tj. jdu po hranach po kterych jsem do noveho lementu prisel a najdu vsechny hranove pruniky, pak konstuuju slozitejsi pruniky
88  * az mam vsechny pruniky s novym elementem ...
89  *
90  * ...
91  *
92  * Prioritni fronta by preferovala elementy do kterych jsem se nejvicekrat dostal, tim se snazim minimalizovat povrch projite oblasti.
93  * Je ale mozne, ze to algoritmus naopak zpomali, pokud je prioritni fronta log(n).
94  *
95  * Zpracovani jednoho elementu tedy zahrnuje
96  * 1) trasovani hran:
97  * pro hranu H: testuju hledam prusecik se ctyrstenem:
98  * ANO -> pamatuju si hranovy prunik a ke stene (resp. sousednimu elementu) kde hrana vychazi pridam vychozi hranu
99  * NE -> konci ve vrcholu, dalsi hrany vychazejici z vrcholu pridam na seznam hran vchazejicich do elementu
100  *
101  * 2) po nalezeni pruniku vsech hran, hledam pruniky vsech vchazejicich ploch:
102  * jedna plocha ma se vstupni stenou useckovy prunik na jehoz konci jsou:
103  * *vstupni hrana
104  * * okraj steny
105  * kazdopadne trasuju okraj plosneho pruniku pres povrch elementu, nebo po vstupnich hranach,
106  * pokud prunikova plocha obsahuje vrchol tvorim nove vstupni plochy ...
107  *
108  * 3) Podobne trasuju vchazejici objemy
109  *
110  * ?? lze nejak vyuzit pokud ma element vice vstupnich sten
111  * minimalne se da kontrolovat ...
112  *
113  *
114  * Struktura systemu pruniku do budoucna:
115  * 1) trida IntersectionManager, ma matici vektoru. Na poli A(i,j) je vektor lokalnich souradnic na elementu dimenze i (chodi od 1 do 3)
116  * pruniku dimenze j (chodi od 0 do 3 resp do 2 pokud nebudu chtit prekryvy siti stejne dimenze)
117  *
118  * 2) Jeden intersection objekt je pak iterator dvou elementu a dva indexy lokalnich souradnic v prislusnych vektorech.
119  *
120  * Prozatim to zjednodusime tak, ze vektory lokalnich souradnic budu alokovat zvlast a nebudu je zdruzovat
121  *
122  *
123  * 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.
124  * 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
125  * 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
126  * a pak i hodnotu funkce f.
127  *
128  * K tomu staci mit matici transformace pruniku na referencni element. Takze bych pro jednotlive dvojice element - prunik mel matici + posouvaci vektor z armadila.
129  *
130  *
131  *
132  */
133 
134 #include <iostream>
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_ */
arma::vec map_to_master(const arma::vec &point) const
Definition: intersection.cc:69
Intersection(const ElementFullIter ele_master, const ElementFullIter ele_slave, const IntersectionLocal *isec)
Definition: intersection.cc:17
arma::vec map_to_slave(const arma::vec &point) const
Definition: intersection.cc:80
ElementFullIter slave
const Element * master_iter() const
unsigned int dim
dimenze pruniku
arma::vec slave_shift
unsigned int master_dim()
dimension of the master element
Definition: intersection.cc:47
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
Definition: intersection.cc:52
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)
Definition: intersection.cc:57
arma::Mat< double > slave_map
double intersection_true_size() const
Definition: intersection.cc:90
ElementFullIter master