ls1-MarDyn
ls1-MarDyn molecular dynamics code
Region.h
1/*
2 * Region.h
3 *
4 * Created on: 19.08.2016
5 * Author: mheinen
6 */
7
8#ifndef REGION_H_
9#define REGION_H_
10
11#include "utils/ObserverBase.h"
12#include <string>
13#include <ostream>
14#include <vector>
15#include <array>
16#include <cstdint>
17
18enum SubdivisionOption
19{
20 SDOPT_UNKNOWN = 0,
21 SDOPT_BY_NUM_SLABS = 1,
22 SDOPT_BY_SLAB_WIDTH = 2,
23};
24
25class Domain;
27
29{
30public:
32 virtual ~~ControlInstance() {}
33 virtual std::string getShortName() = 0;
34};
35
36class Region
37{
38protected:
39 Region(ControlInstance* parent);
40 virtual ~~Region();
41
42public:
43 unsigned short GetID() {return _nID;}
44 int GetType() {return _nType;}
45 ControlInstance* GetParent() {return _parent;}
46 virtual void Print(std::ostream& os) = 0;
47
48protected:
49 ControlInstance* _parent;
50 unsigned short _nID;
51private:
52 int _nType;
53
54}; // class Region
55
56
57// class CuboidRegion
58
59class CuboidRegion : public Region
60{
61public:
63 CuboidRegion(ControlInstance* parent, double dLC[3], double dUC[3] );
64 virtual ~~CuboidRegion();
65
66 double GetLowerCorner(const uint16_t& nDim) {return _dLowerCorner.at(nDim);}
67 double GetUpperCorner(const uint16_t& nDim) {return _dUpperCorner.at(nDim);}
68 void GetLowerCorner(double* dLC) {dLC = _dLowerCorner.data();}
69 void GetUpperCorner(double* dUC) {dUC = _dUpperCorner.data();}
70 double* GetLowerCorner() {return _dLowerCorner.data();}
71 double* GetUpperCorner() {return _dUpperCorner.data();}
72 void SetLowerCorner(const uint16_t& nDim, const double& dVal) {_dLowerCorner.at(nDim) = dVal;}
73 void SetUpperCorner(const uint16_t& nDim, const double& dVal) {_dUpperCorner.at(nDim) = dVal;}
74 double GetWidth(const uint16_t& nDim) {return _dUpperCorner[nDim] - _dLowerCorner[nDim];}
75 void GetRange(const uint16_t& nDim, double& dRangeBegin, double& dRangeEnd) {dRangeBegin = _dLowerCorner.at(nDim); dRangeEnd = _dUpperCorner.at(nDim);}
76 bool PositionIsInside(const uint16_t& nDim, const double& dPos) {return (dPos > _dLowerCorner.at(nDim) ) && (dPos < _dUpperCorner.at(nDim) );}
77 bool PositionIsInside(double* dPos) {
78 if ( !(dPos[0] > _dLowerCorner.at(0) && dPos[0] < _dUpperCorner.at(0) ) ) return false;
79 else if ( !(dPos[1] > _dLowerCorner.at(1) && dPos[1] < _dUpperCorner.at(1) ) ) return false;
80 else if ( !(dPos[2] > _dLowerCorner.at(2) && dPos[2] < _dUpperCorner.at(2) ) ) return false;
81 else return true;
82 }
83 virtual void Print(std::ostream& os)
84 {
85 os << "----------------------------------------------------------------" << std::endl;
86 os << "ID: " << _nID << std::endl;
87 os << "width: " << this->GetWidth(0) << " " << this->GetWidth(1) << " " << this->GetWidth(2) << std::endl;
88 double* lc = this->GetLowerCorner();
89 double* uc = this->GetUpperCorner();
90 os << "lowerCorner: " << lc[0] << " " << lc[1] << " " << lc[2] << std::endl;
91 os << "upperCorner: " << uc[0] << " " << uc[1] << " " << uc[2] << std::endl;
92 os << "----------------------------------------------------------------" << std::endl;
93 }
94 double GetVolume()
95 {
96 double dVolume = 1.;
97 for(uint8_t dim=0; dim<3; ++dim)
98 dVolume *= this->GetWidth(dim);
99 return dVolume;
100 }
101
102protected:
103 std::array<double,3> _dLowerCorner;
104 std::array<double,3> _dUpperCorner;
105
106 int _nSubdivisionOpt;
107
108}; // class CuboidRegion
109
110// class CuboidRegionObs
111
113{
114public:
116 CuboidRegionObs(ControlInstance* parent, double dLC[3], double dUC[3] );
117 virtual ~~CuboidRegionObs();
118
119 // ObserverBase methods
120 void update(SubjectBase* subject) override;
121 void PrepareAsObserver(const std::vector<uint32_t>& refCoords);
122
123private:
124 // observer
125 std::array<double,6> _dDistToRefCoords;
126 std::array<bool,6> _bMaskMidpointLeft;
127 std::array<bool,6> _bMaskMidpointRight;
128
129}; // class CuboidRegionObs
130
131std::ostream& operator<<( std::ostream& os, Region& region);
132
133#endif // REGION_H_
Definition: Region.h:29
Definition: Region.h:113
Definition: Region.h:60
handle boundary region and multiple processes
Definition: DomainDecompBase.h:51
This class is used to read in the phasespace and to handle macroscopic values.
Definition: Domain.h:47
Definition: ObserverBase.h:13
Definition: Region.h:37
Definition: ObserverBase.h:20
::xsd::cxx::tree::string< char, simple_type > string
C++ type corresponding to the string XML Schema built-in type.
Definition: vtk-punstructured.h:270