00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef DOMAIN_HPP
00022 #define DOMAIN_HPP
00023
00024 class Scene;
00025
00026 #include <ReferenceCounting.hpp>
00027 #include <Object.hpp>
00028 #include <TinyVector.hpp>
00029
00030 #include <ErrorHandler.hpp>
00031
00032 #include <sstream>
00033 #include <map>
00034
00046 class Domain
00047 {
00048 private:
00053 bool __isR3;
00054
00055 ReferenceCounting<Object>
00056 __objects;
00058 ConstReferenceCounting<Scene>
00059 __scene;
00061 std::map<TinyVector<3, real_t>, size_t>
00062 __povToReference;
00065 void __buildReferenceAssociation(const Object& o);
00066
00067 bool __inShape(const TinyVector<3>& X) const
00068 {
00069 return (*__objects).inside(X);
00070 }
00071
00072 public:
00078 const bool& isR3() const
00079 {
00080 return __isR3;
00081 }
00082
00083 size_t reference(const TinyVector<3, real_t>& ref) const
00084 {
00085 std::map<TinyVector<3, real_t>, size_t>::const_iterator i
00086 = __povToReference.find(ref);
00087 if (i == __povToReference.end()) {
00088 std::stringstream errorMsg;
00089 errorMsg << "You provided the reference " << ref
00090 << " that is not used to define\n"
00091 << "your computational domain. The possible references are\n";
00092 for (std::map<TinyVector<3, real_t>, size_t>::const_iterator j
00093 = __povToReference.begin();
00094 j != __povToReference.end(); ++j) {
00095 errorMsg << '\t' << j->first << std::ends;
00096 }
00097 throw ErrorHandler(__FILE__,__LINE__,
00098 errorMsg.str(),
00099 ErrorHandler::normal);
00100 }
00101 return (*i).second;
00102 }
00103
00107 friend std::ostream& operator<<(std::ostream& os,
00108 const Domain& D)
00109 {
00110 os << *D.__objects;
00111 return os;
00112 }
00113
00121 bool inside(const TinyVector<3>& X) const
00122 {
00123 return (__isR3 || __inShape(X));
00124 }
00125
00131 ConstReferenceCounting<Scene> scene() const;
00132
00138 const Object& object() const
00139 {
00140 if (__objects == 0) {
00141 throw ErrorHandler(__FILE__,__LINE__,
00142 "no object list available when no domain is defined ",
00143 ErrorHandler::unexpected);
00144 }
00145
00146 return (*__objects);
00147 }
00148
00154 void setObjects(ReferenceCounting<Object> objects)
00155 {
00156 __isR3 = false;
00157 __objects = objects;
00158 ffout(2) << "\tReference translation (POV-Ray -> FEM)\n";
00159 this->__buildReferenceAssociation(*__objects);
00160 ffout(2) << "\tDone\n";
00161 }
00162
00168 Domain(ConstReferenceCounting<Scene> scene);
00169
00175 Domain(const Domain& D);
00176
00181 ~Domain();
00182 };
00183
00184 #endif // DOMAIN_HPP
00185