ls1-MarDyn
ls1-MarDyn molecular dynamics code
Objects.h
1/*
2 * Copyright (c) 2014-2017 Christoph Niethammer <christoph.niethammer@gmail.com>
3 *
4 * $COPYRIGHT$
5 *
6 * Additional copyrights may follow
7 *
8 * $HEADER
9 */
10
11#ifndef OBJECTS_H
12#define OBJECTS_H
13
14#include <memory>
15#include <cstdint>
16
17#include "utils/xmlfileUnits.h"
18
19enum ObjectAxis : uint8_t {
20 OBJ_AXIS_X = 0,
21 OBJ_AXIS_Y = 1,
22 OBJ_AXIS_Z = 2,
23};
24
25class Object {
26public:
27 Object() {}
28 virtual void readXML(XMLfileUnits& xmlconfig) {}
29 virtual ~~Object() {}
31 virtual bool isInside(double r[3]) = 0;
33 virtual bool isInsideNoBorder(double r[3]) = 0;
35 virtual void getBboxMin(double rmin[3]) = 0;
37 virtual void getBboxMax(double rmax[3]) = 0;
39 virtual std::string getName() = 0;
40
41 /* Forward getName to getPluginName required by pluginFactory template */
42 virtual std::string getPluginName() final { return getName(); };
43};
44
46class Cuboid : public Object {
47public:
48 Cuboid();
49 Cuboid(double lower[3], double upper[3]);
50
61 void readXML(XMLfileUnits& xmlconfig);
62 std::string getName() { return std::string("Cuboid"); }
63 static Object* createInstance() { return new Cuboid(); }
64
65 bool isInside(double r[3]);
66 bool isInsideNoBorder(double r[3]);
67 void getBboxMin(double rmin[3]);
68 void getBboxMax(double rmax[3]);
69
70 double upperCorner(int d) { return _upperCorner[d]; }
71 double lowerCorner(int d) { return _lowerCorner[d]; }
72
73private:
74 double _lowerCorner[3];
75 double _upperCorner[3];
76};
77
79class Sphere : public Object {
80public:
81 Sphere();
82 Sphere(double center[3], double r);
83
94 void readXML(XMLfileUnits& xmlconfig);
95 std::string getName() { return std::string("Sphere"); }
96 static Object* createInstance() { return new Sphere(); }
97
98 bool isInside(double r[3]);
99 bool isInsideNoBorder(double r[3]);
100 void getBboxMin(double rmin[3]);
101 void getBboxMax(double rmax[3]);
102
103private:
104 double _center[3];
105 double _radius;
106 double _radiusSquare;
107};
108
110class Cylinder : public Object {
111public:
112 Cylinder();
118 Cylinder(double centerBase[3], double radius, double height);
119
131 void readXML(XMLfileUnits& xmlconfig);
132 std::string getName() { return std::string("Cylinder"); }
133 static Object* createInstance() { return new Cylinder(); }
134
135 bool isInside(double r[3]);
136 bool isInsideNoBorder(double r[3]);
137 void getBboxMin(double rmin[3]);
138 void getBboxMax(double rmax[3]);
139
140private:
141 double _radius;
142 double _height;
143 double _centerBase[3];
144 double _radiusSquare;
145 struct CylinderDirection {
146 ObjectAxis axis;
147 uint8_t base1, base2, height;
148 } _direction;
149};
150
152class ObjectUnification : public Object {
153public:
159 ObjectUnification(std::shared_ptr<Object> obj1, std::shared_ptr<Object> obj2) : _ob1(obj1), _ob2(obj2) {}
160
171 void readXML(XMLfileUnits& xmlconfig);
172 std::string getName() { return std::string("ObjectUnification"); }
173 static Object* createInstance() { return new ObjectUnification(); }
174
175 bool isInside(double r[3]) {
176 return _ob1->isInside(r) || _ob2->isInside(r);
177 }
178
179 bool isInsideNoBorder(double r[3]) {
180 /* either inside one of the objects or common border (intersection) */
181 return _ob1->isInsideNoBorder(r) || _ob2->isInsideNoBorder(r) || (_ob1->isInside(r) && _ob2->isInside(r));
182 }
183
184 void getBboxMin(double rmin[3]) {
185 double rmin1[3], rmin2[3];
186 _ob1->getBboxMin(rmin1);
187 _ob2->getBboxMin(rmin2);
188 for(int d = 0; d < 3; d++) {
189 rmin[d] = (rmin1[d] < rmin2[d]) ? rmin1[d] : rmin2[d] ;
190 }
191 }
192
193 void getBboxMax(double rmax[3]) {
194 double rmax1[3], rmax2[3];
195 _ob1->getBboxMax(rmax1);
196 _ob2->getBboxMax(rmax2);
197 for(int d = 0; d < 3; d++) {
198 rmax[d] = (rmax1[d] > rmax2[d]) ? rmax1[d] : rmax2[d] ;
199 }
200 }
201
202private:
203 std::shared_ptr<Object> _ob1;
204 std::shared_ptr<Object> _ob2;
205};
206
211class ObjectSubtractor : public Object {
212public:
218 ObjectSubtractor(std::shared_ptr<Object> original_ob, std::shared_ptr<Object> subtract_ob) : _ob1(original_ob), _ob2(subtract_ob) {}
219
230 void readXML(XMLfileUnits& xmlconfig);
231 std::string getName() { return std::string("ObjectSubtractor"); }
232 static Object* createInstance() { return new ObjectSubtractor(); }
233
234 bool isInside(double r[3]) {
235 return _ob1->isInside(r) && (!_ob2->isInsideNoBorder(r));
236 }
237
238 bool isInsideNoBorder(double r[3]) {
239 return _ob1->isInsideNoBorder(r) && (!_ob2->isInside(r));
240 }
241
242 void getBboxMin(double rmin[3]) {
243 _ob1->getBboxMin(rmin);
244 }
245
246 void getBboxMax(double rmax[3]) {
247 _ob1->getBboxMax(rmax);
248 }
249
250private:
251 std::shared_ptr<Object> _ob1;
252 std::shared_ptr<Object> _ob2;
253};
254
257public:
263 ObjectIntersection(std::shared_ptr<Object> obj1, std::shared_ptr<Object> obj2) : _ob1(obj1), _ob2(obj2) {}
264
275 void readXML(XMLfileUnits& xmlconfig);
276 std::string getName() { return std::string("ObjectIntersection"); }
277 static Object* createInstance() { return new ObjectIntersection(); }
278
279 bool isInside(double r[3]) {
280 return _ob1->isInside(r) && _ob2->isInside(r);
281 }
282
283 bool isInsideNoBorder(double r[3]) {
284 return _ob1->isInsideNoBorder(r) && _ob2->isInsideNoBorder(r);
285 }
286
287 void getBboxMin(double rmin[3]) {
288 double rmin1[3], rmin2[3];
289 _ob1->getBboxMin(rmin1);
290 _ob2->getBboxMin(rmin2);
291 for(int d = 0; d < 3; d++) {
292 rmin[d] = (rmin1[d] < rmin2[d]) ? rmin2[d] : rmin1[d] ;
293 }
294 }
295
296 void getBboxMax(double rmax[3]) {
297 double rmax1[3], rmax2[3];
298 _ob1->getBboxMax(rmax1);
299 _ob2->getBboxMax(rmax2);
300 for(int d = 0; d < 3; d++) {
301 rmax[d] = (rmax1[d] > rmax2[d]) ? rmax2[d] : rmax1[d] ;
302 }
303 }
304
305private:
306 std::shared_ptr<Object> _ob1;
307 std::shared_ptr<Object> _ob2;
308};
309
311class ObjectShifter : public Object {
312public:
314 ObjectShifter(std::shared_ptr<Object> obj, double shift[3]) : _obj(obj) {
315 _shift[0] = shift[0];
316 _shift[1] = shift[1];
317 _shift[2] = shift[2];
318 }
319
330 void readXML(XMLfileUnits& xmlconfig);
331 std::string getName() { return std::string("ObjectShifter"); }
332 static Object* createInstance() { return new ObjectShifter(); }
333
334
335 bool isInside(double r[3]) {
336 double r_transformed[3] = {
337 r[0] - _shift[0],
338 r[1] - _shift[1],
339 r[2] - _shift[2]
340 };
341 return _obj->isInside(r_transformed);
342 }
343
344 bool isInsideNoBorder(double r[3]) {
345 double r_transformed[3] = {
346 r[0] - _shift[0],
347 r[1] - _shift[1],
348 r[2] - _shift[2]
349 };
350 return _obj->isInsideNoBorder(r_transformed);
351 }
352
353 void getBboxMin(double rmin[3]) {
354 _obj->getBboxMin(rmin);
355 for(int d = 0; d < 3; d++) {
356 rmin[d] += _shift[d];
357 }
358 }
359
360 void getBboxMax(double rmax[3]) {
361 _obj->getBboxMax(rmax);
362 for(int d = 0; d < 3; d++) {
363 rmax[d] += _shift[d];
364 }
365 }
366
367private:
368 std::shared_ptr<Object> _obj;
369 double _shift[3];
370};
371
372#endif /* OBJECTS_H */
Definition: Objects.h:46
std::string getName()
Definition: Objects.h:62
void readXML(XMLfileUnits &xmlconfig)
Read in XML configuration for Cuboid and all its included objects.
Definition: Objects.cpp:19
void getBboxMin(double rmin[3])
Definition: Objects.cpp:40
void getBboxMax(double rmax[3])
Definition: Objects.cpp:45
bool isInsideNoBorder(double r[3])
Definition: Objects.cpp:34
bool isInside(double r[3])
Definition: Objects.cpp:28
Definition: Objects.h:110
void readXML(XMLfileUnits &xmlconfig)
Read in XML configuration for Cylinder and all its included objects.
Definition: Objects.cpp:108
bool isInside(double r[3])
Definition: Objects.cpp:132
void getBboxMax(double rmax[3])
Definition: Objects.cpp:157
bool isInsideNoBorder(double r[3])
Definition: Objects.cpp:141
void getBboxMin(double rmin[3])
Definition: Objects.cpp:150
std::string getName()
Definition: Objects.h:132
Definition: Objects.h:256
ObjectIntersection(std::shared_ptr< Object > obj1, std::shared_ptr< Object > obj2)
Definition: Objects.h:263
bool isInsideNoBorder(double r[3])
Definition: Objects.h:283
void getBboxMax(double rmax[3])
Definition: Objects.h:296
bool isInside(double r[3])
Definition: Objects.h:279
void getBboxMin(double rmin[3])
Definition: Objects.h:287
std::string getName()
Definition: Objects.h:276
void readXML(XMLfileUnits &xmlconfig)
Read in XML configuration for ObjectIntersection and all its included objects.
Definition: Objects.cpp:210
Definition: Objects.h:311
bool isInside(double r[3])
Definition: Objects.h:335
bool isInsideNoBorder(double r[3])
Definition: Objects.h:344
void readXML(XMLfileUnits &xmlconfig)
Read in XML configuration for ObjectIntersection and all its included objects.
Definition: Objects.cpp:235
std::string getName()
Definition: Objects.h:331
void getBboxMax(double rmax[3])
Definition: Objects.h:360
void getBboxMin(double rmin[3])
Definition: Objects.h:353
Definition: Objects.h:211
bool isInside(double r[3])
Definition: Objects.h:234
ObjectSubtractor(std::shared_ptr< Object > original_ob, std::shared_ptr< Object > subtract_ob)
Definition: Objects.h:218
bool isInsideNoBorder(double r[3])
Definition: Objects.h:238
void readXML(XMLfileUnits &xmlconfig)
Read in XML configuration for ObjectSubtractor and all its included objects.
Definition: Objects.cpp:189
void getBboxMin(double rmin[3])
Definition: Objects.h:242
std::string getName()
Definition: Objects.h:231
void getBboxMax(double rmax[3])
Definition: Objects.h:246
Definition: Objects.h:152
ObjectUnification(std::shared_ptr< Object > obj1, std::shared_ptr< Object > obj2)
Definition: Objects.h:159
std::string getName()
Definition: Objects.h:172
void getBboxMax(double rmax[3])
Definition: Objects.h:193
void readXML(XMLfileUnits &xmlconfig)
Read in XML configuration for ObjectUnification and all its included objects.
Definition: Objects.cpp:168
bool isInside(double r[3])
Definition: Objects.h:175
void getBboxMin(double rmin[3])
Definition: Objects.h:184
bool isInsideNoBorder(double r[3])
Definition: Objects.h:179
Definition: Objects.h:25
virtual bool isInsideNoBorder(double r[3])=0
virtual std::string getName()=0
virtual bool isInside(double r[3])=0
virtual void getBboxMin(double rmin[3])=0
virtual void getBboxMax(double rmax[3])=0
Definition: Objects.h:79
std::string getName()
Definition: Objects.h:95
void getBboxMax(double rmax[3])
Definition: Objects.cpp:95
void getBboxMin(double rmin[3])
Definition: Objects.cpp:90
Sphere()
Definition: Objects.cpp:53
bool isInside(double r[3])
Definition: Objects.cpp:70
void readXML(XMLfileUnits &xmlconfig)
Read in XML configuration for Sphere and all its included objects.
Definition: Objects.cpp:60
bool isInsideNoBorder(double r[3])
Definition: Objects.cpp:80
XML file with unit attributes abstraction.
Definition: xmlfileUnits.h:25
::xsd::cxx::tree::string< char, simple_type > string
C++ type corresponding to the string XML Schema built-in type.
Definition: vtk-punstructured.h:270
XML input file with unit handling/conversion support.