OpenMEEG
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  const Vertices& vertices() const { return vertices_; }
99  const Meshes& meshes() const { return meshes_; }
100  const Domains& domains() const { return domains_; }
101  size_t size() const { return size_; }
102  size_t nb_vertices() const { return vertices_.size(); }
103  size_t nb_triangles() const { return (size_-vertices_.size()); }
104  size_t nb_domains() const { return domains_.size(); }
105  size_t nb_meshes() const { return meshes_.size(); }
106 
107  const Interface& outermost_interface() const;
108  const Interface& innermost_interface() const;
109 
110  const Interface& interface(const std::string& id) const;
111  const Domain& domain(const std::string& id) const;
112  const Domain& domain(const Vect3& p) const;
113 
114  void import_meshes(const Meshes& m);
115 
116  const double& sigma(const Domain& d) const { return (d.sigma()); }
117  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).
118  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).
119  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).
120  double sigma_diff(const Mesh& m) const; // return the difference of conductivities of the 2 domains.
121  double sigma (const std::string&) const;
122  int oriented(const Mesh&, const Mesh&) const;
123 
124  void read(const std::string& geomFileName, const std::string& condFileName = "", const bool OLD_ORDERING = false);
125  void load_vtp(const std::string& filename) { Matrix trash; load_vtp(filename, trash, false); }
126  void load_vtp(const std::string& filename, Matrix& data, const bool READ_DATA = true);
127  void write_vtp(const std::string& filename, const Matrix& data = Matrix()) const; // optional give a dataset
128 
130  const size_t& nb_current_barrier_triangles() const { return nb_current_barrier_triangles_; }
131  size_t& nb_current_barrier_triangles() { return nb_current_barrier_triangles_; }
132  const size_t nb_invalid_vertices() const { return invalid_vertices_.size(); }
133  const std::vector<Strings>& geo_group() const { return geo_group_; }
134  void mark_current_barrier();
135  const Mesh& mesh(const std::string& id) const;
136 
137  private:
138 
139  typedef enum { IDENTITY, INVERSE, INDICATOR} Function;
140 
141  Mesh& mesh(const std::string& id);
142 
148  bool has_cond_;
150  size_t size_; // total number = nb of vertices + nb of triangles
151 
152  void generate_indices(const bool);
153  const Domains common_domains(const Mesh&, const Mesh&) const;
154  double funct_on_domains(const Mesh&, const Mesh&, const Function& ) const;
155 
157  std::set<Vertex> invalid_vertices_;
159  std::vector<Strings> geo_group_;
160  };
161 }
Meshes::const_iterator const_iterator
Definition: geometry.h:73
const_iterator begin() const
Definition: geometry.h:77
const size_t nb_invalid_vertices() const
Definition: geometry.h:132
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_meshes() const
Definition: geometry.h:105
double sigma(const Mesh &m1, const Mesh &m2) const
Definition: geometry.h:117
const_iterator end() const
Definition: geometry.h:79
VersionId version() const
Definition: geometry.h:69
std::vector< Domain > Domains
A vector of Domain is called Domains.
Definition: domain.h:129
Domains::const_iterator domain_begin() const
Definition: geometry.h:85
Geometry()
Constructors.
Definition: geometry.h:90
Domains domains_
Definition: geometry.h:147
size_t nb_domains() const
Definition: geometry.h:104
double indicator(const Mesh &m1, const Mesh &m2) const
Definition: geometry.h:119
Domains::const_iterator domain_end() const
Definition: geometry.h:87
std::vector< Strings > geo_group_
Mesh names that belong to different isolated groups.
Definition: geometry.h:159
std::set< Vertex > invalid_vertices_
handle multiple 0 conductivity domains
Definition: geometry.h:157
size_t nb_triangles() const
Definition: geometry.h:103
VersionId version_id
Members.
Definition: geometry.h:144
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:125
const Domains & domains() const
returns the geometry domains
Definition: geometry.h:100
A class to read geometry and cond file.
size_t size() const
the total number of vertices + triangles
Definition: geometry.h:101
Vertices::iterator vertex_begin()
Definition: geometry.h:80
const Meshes & meshes() const
returns the geometry meshes
Definition: geometry.h:99
Vertices::const_iterator vertex_begin() const
Definition: geometry.h:81
iterator end()
Definition: geometry.h:78
size_t & nb_current_barrier_triangles()
Definition: geometry.h:131
const Vertices & vertices() const
returns the geometry vertices
Definition: geometry.h:98
Vertices vertices_
Definition: geometry.h:145
Geometry(const std::string &geomFileName, const std::string &condFileName="", const bool OLD_ORDERING=false)
Definition: geometry.h:91
const bool & is_nested() const
Definition: geometry.h:95
iterator begin()
Iterators.
Definition: geometry.h:76
Vertices::const_iterator vertex_end() const
Definition: geometry.h:83
double sigma_inv(const Mesh &m1, const Mesh &m2) const
Definition: geometry.h:118
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
const std::vector< Strings > & geo_group() const
Definition: geometry.h:133
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:158
const bool & has_cond() const
Definition: geometry.h:94
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 size_t & nb_current_barrier_triangles() const
handle multiple 0 conductivity domains
Definition: geometry.h:130
size_t nb_vertices() const
Definition: geometry.h:102
Matrix class.
Definition: matrix.h:61
const double & sigma(const Domain &d) const
Definition: geometry.h:116