OpenMEEG
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
geometry.h
Go to the documentation of this file.
1 /*
2 Project Name : OpenMEEG
3 
4 © INRIA and ENPC (contributors: Geoffray ADDE, Maureen CLERC, Alexandre
5 GRAMFORT, Renaud KERIVEN, Jan KYBIC, Perrine LANDREAU, Théodore PAPADOPOULO,
6 Emmanuel OLIVI
7 Maureen.Clerc.AT.inria.fr, keriven.AT.certis.enpc.fr,
8 kybic.AT.fel.cvut.cz, papadop.AT.inria.fr)
9 
10 The OpenMEEG software is a C++ package for solving the forward/inverse
11 problems of electroencephalography and magnetoencephalography.
12 
13 This software is governed by the CeCILL-B license under French law and
14 abiding by the rules of distribution of free software. You can use,
15 modify and/ or redistribute the software under the terms of the CeCILL-B
16 license as circulated by CEA, CNRS and INRIA at the following URL
17 "http://www.cecill.info".
18 
19 As a counterpart to the access to the source code and rights to copy,
20 modify and redistribute granted by the license, users are provided only
21 with a limited warranty and the software's authors, the holders of the
22 economic rights, and the successive licensors have only limited
23 liability.
24 
25 In this respect, the user's attention is drawn to the risks associated
26 with loading, using, modifying and/or developing or reproducing the
27 software by the user in light of its specific status of free software,
28 that may mean that it is complicated to manipulate, and that also
29 therefore means that it is reserved for developers and experienced
30 professionals having in-depth computer knowledge. Users are therefore
31 encouraged to load and test the software's suitability as regards their
32 requirements in conditions enabling the security of their systems and/or
33 data to be ensured and, more generally, to use and operate it in the
34 same conditions as regards security.
35 
36 The fact that you are presently reading this means that you have had
37 knowledge of the CeCILL-B license and that you accept its terms.
38 */
39 
40 #pragma once
41 
42 #include <iterator>
43 #include <string>
44 #include <vector>
45 #include <set>
46 
47 #include <om_common.h>
48 #include <vertex.h>
49 #include <triangle.h>
50 #include <mesh.h>
51 #include <interface.h>
52 #include <domain.h>
53 #include <GeometryExceptions.H>
54 
55 namespace OpenMEEG {
56 
61  class OPENMEEG_EXPORT Geometry {
62 
63  friend class GeometryReader;
64 
65  public:
66 
67  typedef enum { UNKNOWN_VERSION=-1, VERSION10, VERSION11 } VersionId;
68 
69  VersionId version() const { return version_id; }
70 
72  typedef Meshes::iterator iterator;
73  typedef Meshes::const_iterator const_iterator;
74 
76  iterator begin() { return meshes_.begin(); }
77  const_iterator begin() const { return meshes_.begin(); }
78  iterator end() { return meshes_.end(); }
79  const_iterator end() const { return meshes_.end(); }
80  Vertices::iterator vertex_begin() { return vertices_.begin(); }
81  Vertices::const_iterator vertex_begin() const { return vertices_.begin(); }
82  Vertices::iterator vertex_end() { return vertices_.end(); }
83  Vertices::const_iterator vertex_end() const { return vertices_.end(); }
84  Domains::iterator domain_begin() { return domains_.begin(); }
85  Domains::const_iterator domain_begin() const { return domains_.begin(); }
86  Domains::iterator domain_end() { return domains_.end(); }
87  Domains::const_iterator domain_end() const { return domains_.end(); }
88 
90  Geometry(): has_cond_(false), is_nested_(false), size_(0), nb_current_barrier_triangles_(0) {}
91  Geometry(const std::string& geomFileName, const std::string& condFileName = "", const bool OLD_ORDERING = false): has_cond_(false), is_nested_(false), size_(0), nb_current_barrier_triangles_(0) { read(geomFileName, condFileName, OLD_ORDERING); }
92 
93  void info(const bool verbous = false) const;
94  const bool& has_cond() const { return has_cond_; }
95  const bool& is_nested() const { return is_nested_; }
96  bool selfCheck() const;
97  bool check(const Mesh& m) const;
98  bool check_inner(const Matrix& m) const;
99  const Vertices& vertices() const { return vertices_; }
100  const Meshes& meshes() const { return meshes_; }
101  const Domains& domains() const { return domains_; }
102  size_t size() const { return size_; }
103  size_t nb_vertices() const { return vertices_.size(); }
104  size_t nb_triangles() const { return (size_-vertices_.size()); }
105  size_t nb_domains() const { return domains_.size(); }
106  size_t nb_meshes() const { return meshes_.size(); }
107 
108  const Interface& outermost_interface() const;
109  const Interface& innermost_interface() const;
110 
111  const Interface& interface(const std::string& id) const;
112  const Domain& domain(const std::string& id) const;
113  const Domain& domain(const Vect3& p) const;
114 
115  void import_meshes(const Meshes& m);
116 
117  const double& sigma(const Domain& d) const { return (d.sigma()); }
118  double sigma (const Mesh& m1, const Mesh& m2) const { return funct_on_domains(m1, m2, IDENTITY); } // return the (sum) conductivity(ies) of the shared domain(s).
119  double sigma_inv (const Mesh& m1, const Mesh& m2) const { return funct_on_domains(m1, m2, INVERSE); } // return the (sum) inverse of conductivity(ies) of the shared domain(s).
120  double indicator (const Mesh& m1, const Mesh& m2) const { return funct_on_domains(m1, m2, INDICATOR); } // return the (sum) indicator function of the shared domain(s).
121  double sigma_diff(const Mesh& m) const; // return the difference of conductivities of the 2 domains.
122  double sigma (const std::string&) const;
123  int oriented(const Mesh&, const Mesh&) const;
124 
125  void read(const std::string& geomFileName, const std::string& condFileName = "", const bool OLD_ORDERING = false);
126  void load_vtp(const std::string& filename) { Matrix trash; load_vtp(filename, trash, false); }
127  void load_vtp(const std::string& filename, Matrix& data, const bool READ_DATA = true);
128  void write_vtp(const std::string& filename, const Matrix& data = Matrix()) const; // optional give a dataset
129 
131  const size_t& nb_current_barrier_triangles() const { return nb_current_barrier_triangles_; }
132  size_t& nb_current_barrier_triangles() { return nb_current_barrier_triangles_; }
133  const size_t nb_invalid_vertices() { return invalid_vertices_.size(); }
134  const std::vector<Strings>& geo_group() const { return geo_group_; }
135  void mark_current_barrier();
136  const Mesh& mesh(const std::string& id) const;
137 
138  private:
139 
140  typedef enum { IDENTITY, INVERSE, INDICATOR} Function;
141 
142  Mesh& mesh(const std::string& id);
143 
149  bool has_cond_;
151  size_t size_; // total number = nb of vertices + nb of triangles
152 
153  void generate_indices(const bool);
154  const Domains common_domains(const Mesh&, const Mesh&) const;
155  double funct_on_domains(const Mesh&, const Mesh&, const Function& ) const;
156 
158  std::set<Vertex> invalid_vertices_;
160  std::vector<Strings> geo_group_;
161  };
162 }
Meshes::const_iterator const_iterator
Definition: geometry.h:73
double sigma(const Mesh &m1, const Mesh &m2) const
Definition: geometry.h:118
const std::vector< Strings > & geo_group() const
Definition: geometry.h:134
size_t size() const
the total number of vertices + triangles
Definition: geometry.h:102
std::vector< Vertex > Vertices
Definition: vertex.h:73
double & sigma()
The conductivity of the domain.
Definition: domain.h:96
Vertices::iterator vertex_end()
Definition: geometry.h:82
Geometry contains the electrophysiological model Here are stored the vertices, meshes and domains...
Definition: geometry.h:61
size_t nb_vertices() const
Definition: geometry.h:103
const Domains & domains() const
returns the geometry domains
Definition: geometry.h:101
std::vector< Domain > Domains
A vector of Domain is called Domains.
Definition: domain.h:129
size_t nb_domains() const
Definition: geometry.h:105
Geometry()
Constructors.
Definition: geometry.h:90
Domains domains_
Definition: geometry.h:148
std::vector< Strings > geo_group_
Mesh names that belong to different isolated groups.
Definition: geometry.h:160
VersionId version() const
Definition: geometry.h:69
Vertices::const_iterator vertex_begin() const
Definition: geometry.h:81
std::set< Vertex > invalid_vertices_
handle multiple 0 conductivity domains
Definition: geometry.h:158
VersionId version_id
Members.
Definition: geometry.h:145
double indicator(const Mesh &m1, const Mesh &m2) const
Definition: geometry.h:120
size_t nb_meshes() const
Definition: geometry.h:106
Mesh class.
Definition: mesh.h:85
std::vector< Mesh > Meshes
A vector of Mesh is called Meshes.
Definition: mesh.h:309
void load_vtp(const std::string &filename)
Definition: geometry.h:126
Domains::const_iterator domain_end() const
Definition: geometry.h:87
A class to read geometry and cond file.
const Vertices & vertices() const
returns the geometry vertices
Definition: geometry.h:99
size_t nb_triangles() const
Definition: geometry.h:104
const_iterator begin() const
Definition: geometry.h:77
Vertices::iterator vertex_begin()
Definition: geometry.h:80
const double & sigma(const Domain &d) const
Definition: geometry.h:117
iterator end()
Definition: geometry.h:78
const bool & has_cond() const
Definition: geometry.h:94
size_t & nb_current_barrier_triangles()
Definition: geometry.h:132
const size_t nb_invalid_vertices()
Definition: geometry.h:133
Vertices vertices_
Definition: geometry.h:146
Geometry(const std::string &geomFileName, const std::string &condFileName="", const bool OLD_ORDERING=false)
Definition: geometry.h:91
iterator begin()
Iterators.
Definition: geometry.h:76
Domains::iterator domain_begin()
Definition: geometry.h:84
Vect3.
Definition: vect3.h:62
Meshes::iterator iterator
Default iterator of a Geometry is an Iterator on the meshes.
Definition: geometry.h:72
file containing the definition of a Domain.
size_t nb_current_barrier_triangles_
number of triangles with 0 normal current. Including triangles of invalid meshes. ...
Definition: geometry.h:159
a Domain is a vector of HalfSpace A Domain is the intersection of simple domains (of type HalfSpace)...
Definition: domain.h:79
Interface class An interface is a closed-shape composed of oriented meshes (here pointer to meshes) ...
Definition: interface.h:72
Domains::iterator domain_end()
Definition: geometry.h:86
const bool & is_nested() const
Definition: geometry.h:95
Vertices::const_iterator vertex_end() const
Definition: geometry.h:83
const Meshes & meshes() const
returns the geometry meshes
Definition: geometry.h:100
const size_t & nb_current_barrier_triangles() const
handle multiple 0 conductivity domains
Definition: geometry.h:131
Matrix class.
Definition: matrix.h:61
Domains::const_iterator domain_begin() const
Definition: geometry.h:85
const_iterator end() const
Definition: geometry.h:79
double sigma_inv(const Mesh &m1, const Mesh &m2) const
Definition: geometry.h:119