20#ifndef _GIMLI_REGIONMANAGER__H
21#define _GIMLI_REGIONMANAGER__H
35 virtual const double operator()(
const RVector3 & pos)
const = 0;
38class DLLEXPORT Region{
46 Region(
const Region & region);
48 Region & operator = (
const Region & region);
56 inline SIndex
marker()
const {
return marker_; }
59 void resize(
const Mesh & mesh, SIndex cellMarker);
62 void resize(
const std::vector < Cell * > & cells);
68 void setBackground(
bool background =
true);
74 inline void markSingle(
bool issingle){ isSingle_ = issingle; }
77 void setSingle(
bool background =
true);
80 inline bool isSingle()
const {
return isSingle_ ; }
95 void setConstraintType(Index type);
104 Index constraintCount()
const;
111 void fillConstraints(RSparseMapMatrix & C, Index startConstraintsID);
114 void setConstraintWeights(
double bc);
117 void setConstraintWeights(
const RVector & cw);
120 const RVector & constraintWeights();
123 void fillConstraintWeights(RVector & vec, Index constraintStart);
128 void _createConstraintWeights();
135 this->constraintWeights_.clear();
138 inline double zWeight()
const {
return zWeight_; }
142 void setFixValue(
double val);
143 inline double fixValue()
const {
return fixValue_;}
145 void fillBoundaryNorm(std::vector< RVector3 > & vnorm, Index boundCount);
147 void fillBoundarySize(RVector & vec, Index boundStart);
149 void fillStartModel(RVector & vec);
153 void fillModelControl(RVector & vec);
156 const std::vector < Boundary * > &
boundaries()
const {
return bounds_; }
158 const std::vector < Cell * > & cells()
const {
return cells_; }
160 std::vector < Cell * > & cells() {
return cells_; }
162 void countParameter(Index start);
168 void permuteParameterMarker(
const IndexArray & p);
171 const IndexArray &
paraIds()
const {
return paraIDs_; }
174 void setStartModel(
const RVector & start);
177 void setStartModel(
double start);
184 void setModelControl(
double val);
185 void setModelControl(
const RVector & vec);
187 inline double modelControl() {
return modelControl_; }
189 void setTransModel(Trans< RVector > & tM);
196 void setLowerBound(
double lb);
198 void setUpperBound(
double ub);
201 void setParameters(
double start,
double lb,
double ub, std::string transString=
"");
203 void setModelTransStr_(
const std::string & val);
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); }
217 void copy_(
const Region & region);
220 RegionManager * parent_;
222 std::vector < Cell * > cells_;
223 mutable std::vector < Boundary * > bounds_;
228 bool _isInParaDomain;
232 Index parameterCount_;
233 Index startParameter_;
236 Index constraintType_;
239 double modelControl_;
240 RVector constraintWeights_;
246 double startDefault_;
253 Trans< RVector > * tM_;
255 std::string transString_;
258class DLLEXPORT RegionManager{
260 RegionManager(
bool verbose=
true);
262 RegionManager & operator = (
const RegionManager & rm);
266 void setVerbose(
bool verbose){ verbose_ = verbose; }
267 bool verbose()
const {
return verbose_; }
271 void setMesh(
const Mesh & mesh,
bool holdRegionInfos=
false);
273 const Mesh & mesh()
const;
275 inline Mesh * pMesh() {
return mesh_; }
286 const std::map < SIndex, Region * > & regions()
const {
return regionMap_; }
288 std::map < SIndex, Region * > * regions() {
return ®ionMap_; }
290 Index regionCount()
const {
return regionMap_.size(); }
294 return this->allRegionMarker_(
false);
298 Region * region(SIndex marker);
300 inline bool regionExists(SIndex marker) {
return (regionMap_.count(marker) > 0); }
303 void loadMap(
const std::string & fname);
306 void saveMap(
const std::string & fname);
312 Index parameterCount()
const;
315 Index constraintCount()
const;
317 Index interRegionConstraintsCount()
const;
320 RVector createStartModel();
323 void fillStartModel(RVector & vec);
334 RVector createModelControl();
337 void fillModelControl(RVector & vec);
340 RVector constraintWeights();
343 void fillConstraintWeights(RVector & vec);
347 void fillConstraints(RSparseMapMatrix & C);
350 void setZWeight(
double z);
352 void setConstraintType(Index type);
354 void fillBoundarySize(RVector & vec);
356 inline const Mesh & paraDomain()
const {
return *paraDomain_; }
358 inline Mesh & paraDomain() {
return *paraDomain_; }
360 std::vector < RVector3 > boundaryNorm()
const;
364 void permuteParameterMarker(
const IVector & p);
366 void createParaDomain_();
368 void recountParaMarker_();
370 TransCumulative < RVector > * transModel();
372 void setLocalTransFlag(
bool flag);
374 bool haveLocalTrans()
const {
return haveLocalTrans_; }
377 void setInterRegionConstraint(SIndex a, SIndex b,
double weight);
381 return this->interRegionConstraints_;
385 this->interfaceConstraints_[marker] = weight;
389 return this->interfaceConstraints_;
392 void findInterRegionInterfaces();
402 Region * createRegion_(SIndex marker,
const Mesh & mesh, SIndex cellMarker);
407 Region * createSingleRegion_(SIndex marker,
const std::vector < Cell * > & cells);
409 IVector allRegionMarker_(
bool excludeBoundary=
false)
const;
414 Index parameterCount_;
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_;
426 double interRegionConstraintZWeights_;
428 TransCumulative < RVector > localTrans_;
429 bool haveLocalTrans_;
430 bool localTransHaveChanges_;
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