Geophysical Inversion and Modelling Library v1.5.4
Loading...
Searching...
No Matches
regionManager.h
1/******************************************************************************
2 * Copyright (C) 2008-2024 by the GIMLi development team *
3 * Carsten Rücker carsten@resistivity.net *
4 * Thomas Günther thomas@resistivity.net *
5 * *
6 * Licensed under the Apache License, Version 2.0 (the "License"); *
7 * you may not use this file except in compliance with the License. *
8 * You may obtain a copy of the License at *
9 * *
10 * http://www.apache.org/licenses/LICENSE-2.0 *
11 * *
12 * Unless required by applicable law or agreed to in writing, software *
13 * distributed under the License is distributed on an "AS IS" BASIS, *
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
15 * See the License for the specific language governing permissions and *
16 * limitations under the License. *
17 * *
18 ******************************************************************************/
19
20#ifndef _GIMLI_REGIONMANAGER__H
21#define _GIMLI_REGIONMANAGER__H
22
23#include "gimli.h"
24#include "vector.h"
25#include "trans.h"
26
27#include <set>
28#include <list>
29
30namespace GIMLI{
31
33public:
34 virtual ~PosFunctor(){}
35 virtual const double operator()(const RVector3 & pos) const = 0;
36};
37
38class DLLEXPORT Region{
39public:
40 Region(SIndex marker, RegionManager * parent, bool single=false);
41
42 Region(SIndex marker, const Mesh & mesh, RegionManager * parent);
43
44 Region(SIndex marker, const Mesh & mesh, SIndex cellMarker, RegionManager * parent);
45
46 Region(const Region & region);
47
48 Region & operator = (const Region & region);
49
50 ~Region();
51
53 inline void setMarker(SIndex marker) { marker_ = marker; }
54
56 inline SIndex marker() const { return marker_; }
57
59 void resize(const Mesh & mesh, SIndex cellMarker);
60
62 void resize(const std::vector < Cell * > & cells);
63
65 inline void markBackground(bool background){ isBackground_ = background; }
66
68 void setBackground(bool background = true);
69
71 inline bool isBackground() const { return isBackground_ ; }
72
74 inline void markSingle(bool issingle){ isSingle_ = issingle; }
75
77 void setSingle(bool background = true);
78
80 inline bool isSingle() const { return isSingle_ ; }
81
83 inline bool isInParaDomain() const { return _isInParaDomain; }
84
86 inline Index parameterCount() const { return parameterCount_; }
87
89 inline Index startParameter() const { return startParameter_; }
90
92 inline Index endParameter() const { return endParameter_; }
93
95 void setConstraintType(Index type);
96
98 inline Index constraintType() const { return constraintType_; }
99
104 Index constraintCount() const;
105
111 void fillConstraints(RSparseMapMatrix & C, Index startConstraintsID);
112
114 void setConstraintWeights(double bc);
115
117 void setConstraintWeights(const RVector & cw);
118
120 const RVector & constraintWeights();
121
123 void fillConstraintWeights(RVector & vec, Index constraintStart);
124
128 void _createConstraintWeights();
129
133 inline void setZWeight(double zw){
134 zWeight_ = zw;
135 this->constraintWeights_.clear();
136 }
137
138 inline double zWeight() const { return zWeight_; }
139
142 void setFixValue(double val);
143 inline double fixValue() const { return fixValue_;}
144
145 void fillBoundaryNorm(std::vector< RVector3 > & vnorm, Index boundCount);
146
147 void fillBoundarySize(RVector & vec, Index boundStart);
148
149 void fillStartModel(RVector & vec);
150
151// void fillStartVector(RVector & vec);
152
153 void fillModelControl(RVector & vec);
154
156 const std::vector < Boundary * > & boundaries() const { return bounds_; }
157
158 const std::vector < Cell * > & cells() const { return cells_; }
159
160 std::vector < Cell * > & cells() { return cells_; }
161
162 void countParameter(Index start);
163
165 bool isPermuted() const { return isPermuted_; }
166
168 void permuteParameterMarker(const IndexArray & p);
169
171 const IndexArray & paraIds() const { return paraIDs_; }
172
174 void setStartModel(const RVector & start);
175
177 void setStartModel(double start);
178
179// /*! DEPRECATED use setStartModel */
180// void setStartVector(const RVector & start);
181// /*! DEPRECATED use setStartModel */
182 void setStartValue(double start){ DEPRECATED setStartModel(start);}
183
184 void setModelControl(double val);
185 void setModelControl(const RVector & vec);
186
187 inline double modelControl() { return modelControl_; }
188
189 void setTransModel(Trans< RVector > & tM);
190
193 Trans< RVector > * transModel() { return tM_; }
194
196 void setLowerBound(double lb);
198 void setUpperBound(double ub);
199
201 void setParameters(double start, double lb, double ub, std::string transString="");
202
203 void setModelTransStr_(const std::string & val);
204
205 void setModelControlStr_( const std::string & val){ setModelControl(toDouble(val)); }
206 void setStartModelStr_( const std::string & val){ setStartModel(toDouble(val)); }
207 void setZWeightStr_( const std::string & val){ setZWeight(toDouble(val)); }
208 void setFixValueStr_( const std::string & val){ setFixValue(toDouble(val)); }
209 void setConstraintTypeStr_(const std::string & val){ setConstraintType(toInt(val)); }
210 void setLowerBoundStr_( const std::string & val){ setLowerBound(toDouble(val)); }
211 void setUpperBoundStr_( const std::string & val){ setUpperBound(toDouble(val)); }
212 void setSingleStr_( const std::string & val){ markSingle(toInt(val) != 0); }
213 void setBackgroundStr_( const std::string & val){ markBackground(toInt(val) != 0); }
214
215protected:
216 void init_();
217 void copy_(const Region & region);
218
219 SIndex marker_;
220 RegionManager * parent_;
221
222 std::vector < Cell * > cells_;
223 mutable std::vector < Boundary * > bounds_;
224
225 bool isBackground_;
226 bool isSingle_;
227 bool isPermuted_;
228 bool _isInParaDomain;
229
230 IndexArray paraIDs_;
231
232 Index parameterCount_;
233 Index startParameter_;
234 Index endParameter_;
235
236 Index constraintType_;
237
238 RVector startModel_;
239 double modelControl_;
240 RVector constraintWeights_;
241
242 double zWeight_;
243 double fixValue_;
244
245 double mcDefault_;
246 double startDefault_;
247
248// double minZWeight_;
249
250 double lowerBound_;
251 double upperBound_;
252
253 Trans< RVector > * tM_;
254 bool ownsTrans_; // smart ptr. would be nice here.
255 std::string transString_;
256};
257
258class DLLEXPORT RegionManager{
259public:
260 RegionManager(bool verbose=true);
261
262 RegionManager & operator = (const RegionManager & rm);
263
264 ~RegionManager();
265
266 void setVerbose(bool verbose){ verbose_ = verbose; }
267 bool verbose() const { return verbose_; }
268
269 void clear();
270
271 void setMesh(const Mesh & mesh, bool holdRegionInfos=false);
272
273 const Mesh & mesh() const;
274
275 inline Mesh * pMesh() { return mesh_; }
276
278 Region * addRegion(SIndex marker);
279
280 Region * addRegion(SIndex marker, const Mesh & mesh){
281 return addRegion(marker, mesh, marker);
282 }
284 Region * addRegion(SIndex marker, const Mesh & mesh, SIndex cellMarker);
285#ifndef PYGIMLI_CAST
286 const std::map < SIndex, Region * > & regions() const { return regionMap_; }
287
288 std::map < SIndex, Region * > * regions() { return &regionMap_; }
289#endif
290 Index regionCount() const { return regionMap_.size(); }
291
293 IVector regionIdxs() const {
294 return this->allRegionMarker_(false);
295 }
296
298 Region * region(SIndex marker);
299
300 inline bool regionExists(SIndex marker) { return (regionMap_.count(marker) > 0); }
301
303 void loadMap(const std::string & fname);
304
306 void saveMap(const std::string & fname);
307
309 inline void setParameterCount(Index count) { parameterCount_ = count; }
310
312 Index parameterCount() const;
313
315 Index constraintCount() const;
316
317 Index interRegionConstraintsCount() const;
318
320 RVector createStartModel();
321
323 void fillStartModel(RVector & vec);
324
326 void fillStartVector(RVector & vec){DEPRECATED;
327 fillStartModel(vec);}
328
330 RVector createStartVector(){DEPRECATED;
331 return createStartModel();}
332
334 RVector createModelControl();
335
337 void fillModelControl(RVector & vec);
338
340 RVector constraintWeights();
341
343 void fillConstraintWeights(RVector & vec);
344
347 void fillConstraints(RSparseMapMatrix & C);
348
350 void setZWeight(double z);
351
352 void setConstraintType(Index type);
353
354 void fillBoundarySize(RVector & vec);
355
356 inline const Mesh & paraDomain() const { return *paraDomain_; }
357
358 inline Mesh & paraDomain() { return *paraDomain_; }
359
360 std::vector < RVector3 > boundaryNorm() const;
361
364 void permuteParameterMarker(const IVector & p);
365
366 void createParaDomain_();
367
368 void recountParaMarker_();
369
370 TransCumulative < RVector > * transModel();
371
372 void setLocalTransFlag(bool flag);
373
374 bool haveLocalTrans() const { return haveLocalTrans_; }
375
377 void setInterRegionConstraint(SIndex a, SIndex b, double weight);
378
380 const std::map< std::pair< SIndex, SIndex >, double > interRegionConstraints() const {
381 return this->interRegionConstraints_;
382 }
383
384 void setInterfaceConstraint(SIndex marker, double weight) {
385 this->interfaceConstraints_[marker] = weight;
386 }
387
388 const std::map< SIndex, double > interfaceConstraints() const {
389 return this->interfaceConstraints_;
390 }
391
392 void findInterRegionInterfaces();
393
394protected:
395 void copy_(const RegionManager & rm);
396
398
402 Region * createRegion_(SIndex marker, const Mesh & mesh, SIndex cellMarker);
403
407 Region * createSingleRegion_(SIndex marker, const std::vector < Cell * > & cells);
408
409 IVector allRegionMarker_(bool excludeBoundary=false) const;
410
411 bool verbose_;
412 bool isPermuted_;
413
414 Index parameterCount_;
415
416 Mesh * mesh_;
417 Mesh * paraDomain_;
418
419 std::map < SIndex, Region * > regionMap_;
420 std::map< std::pair< SIndex, SIndex >, std::list < Boundary * > > interRegionInterfaceMap_;
421 std::map< std::pair< SIndex, SIndex >, double > interRegionConstraints_;
422 std::map< SIndex, double > interfaceConstraints_;
423
424 RVector _cWeights; // cache cWeights to avoid double creation.
425
426 double interRegionConstraintZWeights_;
427
428 TransCumulative < RVector > localTrans_;
429 bool haveLocalTrans_;
430 bool localTransHaveChanges_;
431};
432
433
434} // namespace GIMLI
435
436#endif // _GIMLI_REGIONMANAGER__H
Definition mesh.h:128
Definition regionManager.h:32
Definition regionManager.h:258
RVector createStartVector()
Definition regionManager.h:330
void setParameterCount(Index count)
Definition regionManager.h:309
RVector createStartModel()
Definition regionManager.cpp:816
Region * addRegion(SIndex marker)
Definition regionManager.cpp:720
const std::map< std::pair< SIndex, SIndex >, double > interRegionConstraints() const
Definition regionManager.h:380
void fillStartModel(RVector &vec)
Definition regionManager.cpp:808
const std::map< SIndex, double > interfaceConstraints() const
Definition regionManager.h:388
IVector regionIdxs() const
Definition regionManager.h:293
void fillStartVector(RVector &vec)
Definition regionManager.h:326
void setInterfaceConstraint(SIndex marker, double weight)
Definition regionManager.h:384
Definition regionManager.h:38
void markBackground(bool background)
Definition regionManager.h:65
void markSingle(bool issingle)
Definition regionManager.h:74
Trans< RVector > * transModel()
Definition regionManager.h:193
bool isInParaDomain() const
Definition regionManager.h:83
const IndexArray & paraIds() const
Definition regionManager.h:171
void setStartModel(const RVector &start)
Definition regionManager.cpp:229
void setZWeight(double zw)
Definition regionManager.h:133
bool isBackground() const
Definition regionManager.h:71
SIndex marker() const
Definition regionManager.h:56
Index constraintType() const
Definition regionManager.h:98
Index parameterCount() const
Definition regionManager.h:86
double zWeight() const
Definition regionManager.h:138
const std::vector< Boundary * > & boundaries() const
Definition regionManager.h:156
void setMarker(SIndex marker)
Definition regionManager.h:53
Index endParameter() const
Definition regionManager.h:92
void setStartValue(double start)
Definition regionManager.h:182
Index startParameter() const
Definition regionManager.h:89
bool isSingle() const
Definition regionManager.h:80
bool isPermuted() const
Definition regionManager.h:165
GIMLi main namespace for the Geophyiscal Inversion and Modelling Library.
Definition baseentity.h:24
RVector z(const R3Vector &rv)
Definition pos.cpp:120