Geophysical Inversion and Modelling Library v1.5.4
Loading...
Searching...
No Matches
electrode.h
1/******************************************************************************
2 * Copyright (C) 2006-2024 by the resistivity.net development team *
3 * Carsten R�cker carsten@resistivity.net *
4 * *
5 * Licensed under the Apache License, Version 2.0 (the "License"); *
6 * you may not use this file except in compliance with the License. *
7 * You may obtain a copy of the License at *
8 * *
9 * http://www.apache.org/licenses/LICENSE-2.0 *
10 * *
11 * Unless required by applicable law or agreed to in writing, software *
12 * distributed under the License is distributed on an "AS IS" BASIS, *
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
14 * See the License for the specific language governing permissions and *
15 * limitations under the License. *
16 * *
17 ******************************************************************************/
18
19#ifndef _BERT_ELECTRODE__H
20#define _BERT_ELECTRODE__H
21
22#include "bert.h"
23
24#include <baseentity.h>
25#include <pos.h>
26
27namespace GIMLI{
28
29// class Electrode -> ElectrodeNode -> ElectrodeRVector3 -> ElectrodeBoundary -> ElectrodeDomain
30
32class DLLEXPORT Electrode : public GIMLI::BaseEntity{
33public:
35 Electrode();
36
37 Electrode(const RVector3 & pos, int id = -1);
38
39 Electrode(double x, double y, double z);
40
41 virtual ~Electrode();
42
43 Electrode(const Electrode & el);
44
45 Electrode & operator = (const Electrode & el);
46
47 bool operator == (const Electrode & e) const { return pos_ == e.pos(); }
48
49 inline void setPos(const RVector3 & pos){ pos_ = pos; }
50
51 inline const RVector3 & pos() const { return pos_; }
52
53protected:
54 RVector3 pos_;
55};
56
58class DLLEXPORT ElectrodeShape : public Electrode{
59public:
60 ElectrodeShape();
61
62 ElectrodeShape(const RVector3 & pos);
63
64 virtual ~ElectrodeShape();
65
66 virtual std::vector < MeshEntity * > entities() const {
67 THROW_TO_IMPL; return std::vector < MeshEntity * >();
68 }
69
70 virtual double domainSize() const { return size_; }
71
72 //virtual double minRadius() const { return minRadius_; }
73
75 virtual double geomMeanCellAttributes() const { THROW_TO_IMPL; return 0.0; }
76
78 virtual double pot(const RVector & sol) const { THROW_TO_IMPL; return 0.0; }
79
81 virtual void assembleRHS(RVector & rhs, double value, uint matrixSize) const {
82 THROW_TO_IMPL; return;
83 }
84
86 virtual void setSingValue(RVector & sol, double scale, double k) const {
87
88 };
89
91 void setMID(uint id){ mID_ = id; }
92
94 virtual int mID() const { return mID_; }
95
96protected:
97
99 double size_;
100 //double minRadius_;
101 int mID_;
102};
103
105class DLLEXPORT ElectrodeShapeNode : public ElectrodeShape{
106public:
107 ElectrodeShapeNode(Node & node);
108
109 virtual ~ElectrodeShapeNode();
110
111 void setNode(Node & node);
112
113 inline const Node * node() const { return node_; }
114
115 virtual std::vector < MeshEntity * > entities() const {
116 std::vector < MeshEntity * > ents;
117 ents.push_back(entity_);
118 return ents;
119 }
120
121 virtual double geomMeanCellAttributes() const;
122
125 virtual double pot(const RVector & sol) const;
126
127 virtual void assembleRHS(RVector & rhs, double value, uint matrixSize) const;
128
129 virtual void setSingValue(RVector & sol, double scale = 1.0, double k = 0.0) const;
130
131protected:
132 Node * node_;
133 MeshEntity * entity_;
134};
135
136
138class DLLEXPORT ElectrodeShapeNodesWithBypass : public ElectrodeShapeNode {
139public:
141 ElectrodeShapeNodesWithBypass(std::vector < Node * > & nodes);
142
144
145protected:
146 std::vector < Node * > nodes_;
147};
148
149
150
151
153class DLLEXPORT ElectrodeShapeEntity : public ElectrodeShape{
154public:
155 ElectrodeShapeEntity(MeshEntity & entity, const RVector3 & pos);
156
157 virtual ~ElectrodeShapeEntity();
158
159 inline void setEntity(MeshEntity & entity) { entity_ = & entity; }
160 inline MeshEntity * entity() const { return entity_; }
161
162 virtual std::vector < MeshEntity * > entities() const {
163 std::vector < MeshEntity * > ents;
164 ents.push_back(entity_);
165 return ents;
166 }
167
168 virtual double geomMeanCellAttributes() const;
169
171 virtual double pot(const RVector & sol) const;
172
173 virtual void assembleRHS(RVector & rhs, double value, uint matrixSize) const;
174
175 virtual void setSingValue(RVector & sol, double scale, double k) const;
176
177protected:
178 MeshEntity * entity_;
179};
180
181
183class DLLEXPORT ElectrodeShapeDomain : public ElectrodeShape{
184public:
185 ElectrodeShapeDomain(const std::vector < MeshEntity * > & entities);
186
190 ElectrodeShapeDomain(const std::vector < Boundary * > & entities);
191
192 virtual ~ElectrodeShapeDomain();
193
194 inline void setEntities(std::vector < MeshEntity * > & entities) { entities_ = entities; }
195
196 virtual std::vector < MeshEntity * > entities() const { return entities_; }
197
198 virtual double geomMeanCellAttributes() const;
199
200 virtual double pot(const RVector & sol) const;
201
202 virtual void assembleRHS(RVector & rhs, double value, uint matrixSize) const;
203
204protected:
205 std::vector < MeshEntity * > entities_;
206};
207
208} //namespace BERT
209
210#endif // _BERT_ELECTRODE__H
Base Entity.
Definition baseentity.h:30
int id() const
Definition baseentity.h:59
virtual double pot(const RVector &sol) const
Definition electrode.cpp:367
virtual double geomMeanCellAttributes() const
Definition electrode.cpp:327
virtual void assembleRHS(RVector &rhs, double value, uint matrixSize) const
Definition electrode.cpp:350
virtual double pot(const RVector &sol) const
Definition electrode.cpp:270
virtual double geomMeanCellAttributes() const
Definition electrode.cpp:252
virtual void setSingValue(RVector &sol, double scale, double k) const
Definition electrode.cpp:207
virtual void assembleRHS(RVector &rhs, double value, uint matrixSize) const
Definition electrode.cpp:274
virtual void assembleRHS(RVector &rhs, double value, uint matrixSize) const
Definition electrode.cpp:133
virtual void setSingValue(RVector &sol, double scale=1.0, double k=0.0) const
Definition electrode.cpp:154
virtual double geomMeanCellAttributes() const
Definition electrode.cpp:102
virtual double pot(const RVector &sol) const
Definition electrode.cpp:129
ElectrodeShapeNodesWithBypass(std::vector< Node * > &nodes)
Definition electrode.cpp:191
virtual void setSingValue(RVector &sol, double scale, double k) const
Definition electrode.h:86
virtual void assembleRHS(RVector &rhs, double value, uint matrixSize) const
Definition electrode.h:81
virtual double geomMeanCellAttributes() const
Definition electrode.h:75
void setMID(uint id)
Definition electrode.h:91
virtual int mID() const
Definition electrode.h:94
virtual double pot(const RVector &sol) const
Definition electrode.h:78
double size_
size of the domain
Definition electrode.h:99
Electrode()
Definition electrode.cpp:31
Definition meshentities.h:103
3D Node
Definition node.h:39
GIMLi main namespace for the Geophyiscal Inversion and Modelling Library.
Definition baseentity.h:24
RVector y(const R3Vector &rv)
Definition pos.cpp:114
RVector x(const R3Vector &rv)
Definition pos.cpp:107
RVector z(const R3Vector &rv)
Definition pos.cpp:120