Skip to content
Snippets Groups Projects
Commit f26703a2 authored by Stéphane Del Pino's avatar Stéphane Del Pino
Browse files

Add boundary management in pugs' language.

Also split BoudaryConditionDescriptor and BoundaryDescriptor files
parent 48a0a363
No related branches found
No related tags found
1 merge request!37Feature/language
...@@ -4,13 +4,17 @@ ...@@ -4,13 +4,17 @@
#include <language/utils/TypeDescriptor.hpp> #include <language/utils/TypeDescriptor.hpp>
#include <mesh/Mesh.hpp> #include <mesh/Mesh.hpp>
#include <scheme/AcousticSolver.hpp> #include <scheme/AcousticSolver.hpp>
#include <scheme/IBoundaryConditionDescriptor.hpp>
#include <scheme/IBoundaryDescriptor.hpp>
#include <scheme/NamedBoundaryDescriptor.hpp>
#include <scheme/NumberedBoundaryDescriptor.hpp>
#include <scheme/SymmetryBoundaryConditionDescriptor.hpp>
#include <memory> #include <memory>
/////////// TEMPORARY /////////// TEMPORARY
#include <output/VTKWriter.hpp> #include <output/VTKWriter.hpp>
#include <scheme/BoundaryConditionDescriptor.hpp>
template <size_t Dimension> template <size_t Dimension>
struct MeshDimensionAdapter struct MeshDimensionAdapter
...@@ -35,14 +39,14 @@ struct MeshDimensionAdapter ...@@ -35,14 +39,14 @@ struct MeshDimensionAdapter
}(); }();
MeshDataType mesh_data(m_mesh); MeshDataType mesh_data(m_mesh);
std::vector<std::shared_ptr<BoundaryConditionDescriptor>> bc_descriptor_list; std::vector<std::shared_ptr<IBoundaryConditionDescriptor>> bc_descriptor_list;
for (const auto& sym_boundary_name : sym_boundary_name_list) { for (const auto& sym_boundary_name : sym_boundary_name_list) {
std::shared_ptr<IBoundaryDescriptor> boudary_descriptor = std::shared_ptr<IBoundaryDescriptor> boudary_descriptor =
std::shared_ptr<IBoundaryDescriptor>(new NamedBoundaryDescriptor(sym_boundary_name)); std::shared_ptr<IBoundaryDescriptor>(new NamedBoundaryDescriptor(sym_boundary_name));
SymmetryBoundaryConditionDescriptor* sym_bc_descriptor = SymmetryBoundaryConditionDescriptor* sym_bc_descriptor =
new SymmetryBoundaryConditionDescriptor(boudary_descriptor); new SymmetryBoundaryConditionDescriptor(boudary_descriptor);
bc_descriptor_list.push_back(std::shared_ptr<BoundaryConditionDescriptor>(sym_bc_descriptor)); bc_descriptor_list.push_back(std::shared_ptr<IBoundaryConditionDescriptor>(sym_bc_descriptor));
} }
std::vector<BoundaryConditionHandler> bc_list; std::vector<BoundaryConditionHandler> bc_list;
...@@ -57,7 +61,7 @@ struct MeshDimensionAdapter ...@@ -57,7 +61,7 @@ struct MeshDimensionAdapter
for (const auto& bc_descriptor : bc_descriptor_list) { for (const auto& bc_descriptor : bc_descriptor_list) {
switch (bc_descriptor->type()) { switch (bc_descriptor->type()) {
case BoundaryConditionDescriptor::Type::symmetry: { case IBoundaryConditionDescriptor::Type::symmetry: {
const SymmetryBoundaryConditionDescriptor& sym_bc_descriptor = const SymmetryBoundaryConditionDescriptor& sym_bc_descriptor =
dynamic_cast<const SymmetryBoundaryConditionDescriptor&>(*bc_descriptor); dynamic_cast<const SymmetryBoundaryConditionDescriptor&>(*bc_descriptor);
for (size_t i_ref_face_list = 0; for (size_t i_ref_face_list = 0;
......
...@@ -15,7 +15,11 @@ ...@@ -15,7 +15,11 @@
#include <algebra/TinyMatrix.hpp> #include <algebra/TinyMatrix.hpp>
#include <algebra/TinyVector.hpp> #include <algebra/TinyVector.hpp>
#include <scheme/BoundaryConditionDescriptor.hpp> #include <scheme/IBoundaryConditionDescriptor.hpp>
#include <scheme/IBoundaryDescriptor.hpp>
#include <scheme/NamedBoundaryDescriptor.hpp>
#include <scheme/NumberedBoundaryDescriptor.hpp>
#include <scheme/SymmetryBoundaryConditionDescriptor.hpp>
#include <mesh/MeshNodeBoundary.hpp> #include <mesh/MeshNodeBoundary.hpp>
...@@ -63,14 +67,14 @@ main(int argc, char* argv[]) ...@@ -63,14 +67,14 @@ main(int argc, char* argv[])
switch (p_mesh->dimension()) { switch (p_mesh->dimension()) {
case 1: { case 1: {
std::vector<std::string> sym_boundary_name_list = {"XMIN", "XMAX"}; std::vector<std::string> sym_boundary_name_list = {"XMIN", "XMAX"};
std::vector<std::shared_ptr<BoundaryConditionDescriptor>> bc_descriptor_list; std::vector<std::shared_ptr<IBoundaryConditionDescriptor>> bc_descriptor_list;
for (const auto& sym_boundary_name : sym_boundary_name_list) { for (const auto& sym_boundary_name : sym_boundary_name_list) {
std::shared_ptr<IBoundaryDescriptor> boudary_descriptor = std::shared_ptr<IBoundaryDescriptor> boudary_descriptor =
std::shared_ptr<IBoundaryDescriptor>(new NamedBoundaryDescriptor(sym_boundary_name)); std::shared_ptr<IBoundaryDescriptor>(new NamedBoundaryDescriptor(sym_boundary_name));
SymmetryBoundaryConditionDescriptor* sym_bc_descriptor = SymmetryBoundaryConditionDescriptor* sym_bc_descriptor =
new SymmetryBoundaryConditionDescriptor(boudary_descriptor); new SymmetryBoundaryConditionDescriptor(boudary_descriptor);
bc_descriptor_list.push_back(std::shared_ptr<BoundaryConditionDescriptor>(sym_bc_descriptor)); bc_descriptor_list.push_back(std::shared_ptr<IBoundaryConditionDescriptor>(sym_bc_descriptor));
} }
using ConnectivityType = Connectivity1D; using ConnectivityType = Connectivity1D;
...@@ -88,7 +92,7 @@ main(int argc, char* argv[]) ...@@ -88,7 +92,7 @@ main(int argc, char* argv[])
{ {
for (const auto& bc_descriptor : bc_descriptor_list) { for (const auto& bc_descriptor : bc_descriptor_list) {
switch (bc_descriptor->type()) { switch (bc_descriptor->type()) {
case BoundaryConditionDescriptor::Type::symmetry: { case IBoundaryConditionDescriptor::Type::symmetry: {
const SymmetryBoundaryConditionDescriptor& sym_bc_descriptor = const SymmetryBoundaryConditionDescriptor& sym_bc_descriptor =
dynamic_cast<const SymmetryBoundaryConditionDescriptor&>(*bc_descriptor); dynamic_cast<const SymmetryBoundaryConditionDescriptor&>(*bc_descriptor);
for (size_t i_ref_node_list = 0; for (size_t i_ref_node_list = 0;
...@@ -182,14 +186,14 @@ main(int argc, char* argv[]) ...@@ -182,14 +186,14 @@ main(int argc, char* argv[])
case 2: { case 2: {
// test case boundary condition description // test case boundary condition description
std::vector<std::string> sym_boundary_name_list = {"XMIN", "XMAX", "YMIN", "YMAX"}; std::vector<std::string> sym_boundary_name_list = {"XMIN", "XMAX", "YMIN", "YMAX"};
std::vector<std::shared_ptr<BoundaryConditionDescriptor>> bc_descriptor_list; std::vector<std::shared_ptr<IBoundaryConditionDescriptor>> bc_descriptor_list;
for (const auto& sym_boundary_name : sym_boundary_name_list) { for (const auto& sym_boundary_name : sym_boundary_name_list) {
std::shared_ptr<IBoundaryDescriptor> boudary_descriptor = std::shared_ptr<IBoundaryDescriptor> boudary_descriptor =
std::shared_ptr<IBoundaryDescriptor>(new NamedBoundaryDescriptor(sym_boundary_name)); std::shared_ptr<IBoundaryDescriptor>(new NamedBoundaryDescriptor(sym_boundary_name));
SymmetryBoundaryConditionDescriptor* sym_bc_descriptor = SymmetryBoundaryConditionDescriptor* sym_bc_descriptor =
new SymmetryBoundaryConditionDescriptor(boudary_descriptor); new SymmetryBoundaryConditionDescriptor(boudary_descriptor);
bc_descriptor_list.push_back(std::shared_ptr<BoundaryConditionDescriptor>(sym_bc_descriptor)); bc_descriptor_list.push_back(std::shared_ptr<IBoundaryConditionDescriptor>(sym_bc_descriptor));
} }
using ConnectivityType = Connectivity2D; using ConnectivityType = Connectivity2D;
...@@ -207,7 +211,7 @@ main(int argc, char* argv[]) ...@@ -207,7 +211,7 @@ main(int argc, char* argv[])
{ {
for (const auto& bc_descriptor : bc_descriptor_list) { for (const auto& bc_descriptor : bc_descriptor_list) {
switch (bc_descriptor->type()) { switch (bc_descriptor->type()) {
case BoundaryConditionDescriptor::Type::symmetry: { case IBoundaryConditionDescriptor::Type::symmetry: {
const SymmetryBoundaryConditionDescriptor& sym_bc_descriptor = const SymmetryBoundaryConditionDescriptor& sym_bc_descriptor =
dynamic_cast<const SymmetryBoundaryConditionDescriptor&>(*bc_descriptor); dynamic_cast<const SymmetryBoundaryConditionDescriptor&>(*bc_descriptor);
for (size_t i_ref_face_list = 0; for (size_t i_ref_face_list = 0;
...@@ -288,14 +292,14 @@ main(int argc, char* argv[]) ...@@ -288,14 +292,14 @@ main(int argc, char* argv[])
} }
case 3: { case 3: {
std::vector<std::string> sym_boundary_name_list = {"XMIN", "XMAX", "YMIN", "YMAX", "ZMIN", "ZMAX"}; std::vector<std::string> sym_boundary_name_list = {"XMIN", "XMAX", "YMIN", "YMAX", "ZMIN", "ZMAX"};
std::vector<std::shared_ptr<BoundaryConditionDescriptor>> bc_descriptor_list; std::vector<std::shared_ptr<IBoundaryConditionDescriptor>> bc_descriptor_list;
for (const auto& sym_boundary_name : sym_boundary_name_list) { for (const auto& sym_boundary_name : sym_boundary_name_list) {
std::shared_ptr<IBoundaryDescriptor> boudary_descriptor = std::shared_ptr<IBoundaryDescriptor> boudary_descriptor =
std::shared_ptr<IBoundaryDescriptor>(new NamedBoundaryDescriptor(sym_boundary_name)); std::shared_ptr<IBoundaryDescriptor>(new NamedBoundaryDescriptor(sym_boundary_name));
SymmetryBoundaryConditionDescriptor* sym_bc_descriptor = SymmetryBoundaryConditionDescriptor* sym_bc_descriptor =
new SymmetryBoundaryConditionDescriptor(boudary_descriptor); new SymmetryBoundaryConditionDescriptor(boudary_descriptor);
bc_descriptor_list.push_back(std::shared_ptr<BoundaryConditionDescriptor>(sym_bc_descriptor)); bc_descriptor_list.push_back(std::shared_ptr<IBoundaryConditionDescriptor>(sym_bc_descriptor));
} }
using ConnectivityType = Connectivity3D; using ConnectivityType = Connectivity3D;
...@@ -313,7 +317,7 @@ main(int argc, char* argv[]) ...@@ -313,7 +317,7 @@ main(int argc, char* argv[])
{ {
for (const auto& bc_descriptor : bc_descriptor_list) { for (const auto& bc_descriptor : bc_descriptor_list) {
switch (bc_descriptor->type()) { switch (bc_descriptor->type()) {
case BoundaryConditionDescriptor::Type::symmetry: { case IBoundaryConditionDescriptor::Type::symmetry: {
const SymmetryBoundaryConditionDescriptor& sym_bc_descriptor = const SymmetryBoundaryConditionDescriptor& sym_bc_descriptor =
dynamic_cast<const SymmetryBoundaryConditionDescriptor&>(*bc_descriptor); dynamic_cast<const SymmetryBoundaryConditionDescriptor&>(*bc_descriptor);
for (size_t i_ref_face_list = 0; for (size_t i_ref_face_list = 0;
......
#ifndef BOUNDARY_CONDITION_DESCRIPTOR_HPP
#define BOUNDARY_CONDITION_DESCRIPTOR_HPP
#include <mesh/RefId.hpp>
#include <memory>
class IBoundaryDescriptor
{
public:
enum class Type
{
named,
numbered
};
protected:
virtual std::ostream& _write(std::ostream& os) const = 0;
public:
friend std::ostream&
operator<<(std::ostream& os, const IBoundaryDescriptor& bd)
{
return bd._write(os);
}
virtual bool operator==(const RefId& ref_id) const = 0;
friend bool
operator==(const RefId& ref_id, const IBoundaryDescriptor& bcd)
{
return bcd == ref_id;
}
virtual Type type() const = 0;
IBoundaryDescriptor(const IBoundaryDescriptor&) = delete;
IBoundaryDescriptor(IBoundaryDescriptor&&) = delete;
IBoundaryDescriptor() = default;
virtual ~IBoundaryDescriptor() = default;
};
class NamedBoundaryDescriptor : public IBoundaryDescriptor
{
private:
std::string m_name;
std::ostream&
_write(std::ostream& os) const final
{
os << '"' << m_name << '"';
return os;
}
public:
bool
operator==(const RefId& ref_id) const final
{
return m_name == ref_id.tagName();
}
Type
type() const final
{
return Type::named;
}
NamedBoundaryDescriptor(const NamedBoundaryDescriptor&) = delete;
NamedBoundaryDescriptor(NamedBoundaryDescriptor&&) = delete;
NamedBoundaryDescriptor(const std::string& name) : m_name(name)
{
;
}
virtual ~NamedBoundaryDescriptor() = default;
};
class NumberedBoundaryDescriptor : public IBoundaryDescriptor
{
private:
unsigned int m_number;
std::ostream&
_write(std::ostream& os) const final
{
os << '"' << m_number << '"';
return os;
}
bool
operator==(const RefId& ref_id) const final
{
return m_number == ref_id.tagNumber();
}
public:
Type
type() const final
{
return Type::numbered;
}
NumberedBoundaryDescriptor(const NumberedBoundaryDescriptor&) = delete;
NumberedBoundaryDescriptor(NumberedBoundaryDescriptor&&) = delete;
NumberedBoundaryDescriptor(unsigned int number) : m_number(number)
{
;
}
virtual ~NumberedBoundaryDescriptor() = default;
};
class BoundaryConditionDescriptor
{
public:
enum class Type
{
symmetry
};
protected:
std::shared_ptr<IBoundaryDescriptor> m_boundary_descriptor;
virtual std::ostream& _write(std::ostream& os) const = 0;
public:
friend std::ostream&
operator<<(std::ostream& os, const BoundaryConditionDescriptor& bcd)
{
return bcd._write(os);
}
virtual Type type() const = 0;
const IBoundaryDescriptor&
boundaryDescriptor() const
{
return *m_boundary_descriptor;
}
BoundaryConditionDescriptor(std::shared_ptr<IBoundaryDescriptor> boundary_descriptor)
: m_boundary_descriptor(boundary_descriptor)
{
;
}
BoundaryConditionDescriptor(const BoundaryConditionDescriptor&) = delete;
BoundaryConditionDescriptor(BoundaryConditionDescriptor&&) = delete;
virtual ~BoundaryConditionDescriptor() = default;
};
class SymmetryBoundaryConditionDescriptor : public BoundaryConditionDescriptor
{
private:
std::ostream&
_write(std::ostream& os) const final
{
os << "symmetry(" << *m_boundary_descriptor << ")";
return os;
}
public:
Type
type() const final
{
return Type::symmetry;
}
SymmetryBoundaryConditionDescriptor(std::shared_ptr<IBoundaryDescriptor> boundary_descriptor)
: BoundaryConditionDescriptor(boundary_descriptor)
{
;
}
SymmetryBoundaryConditionDescriptor(const SymmetryBoundaryConditionDescriptor&) = delete;
SymmetryBoundaryConditionDescriptor(SymmetryBoundaryConditionDescriptor&&) = delete;
~SymmetryBoundaryConditionDescriptor() = default;
};
#endif // BOUNDARY_CONDITION_DESCRIPTOR_HPP
#ifndef I_BOUNDARY_CONDITION_DESCRIPTOR_HPP
#define I_BOUNDARY_CONDITION_DESCRIPTOR_HPP
#include <iostream>
class IBoundaryConditionDescriptor
{
public:
enum class Type
{
symmetry
};
protected:
virtual std::ostream& _write(std::ostream& os) const = 0;
public:
friend std::ostream&
operator<<(std::ostream& os, const IBoundaryConditionDescriptor& bcd)
{
return bcd._write(os);
}
virtual Type type() const = 0;
IBoundaryConditionDescriptor() = default;
IBoundaryConditionDescriptor(const IBoundaryConditionDescriptor&) = delete;
IBoundaryConditionDescriptor(IBoundaryConditionDescriptor&&) = delete;
virtual ~IBoundaryConditionDescriptor() = default;
};
#endif // I_BOUNDARY_CONDITION_DESCRIPTOR_HPP
#ifndef I_BOUNDARY_DESCRIPTOR_HPP
#define I_BOUNDARY_DESCRIPTOR_HPP
#include <mesh/RefId.hpp>
#include <iostream>
class IBoundaryDescriptor
{
public:
enum class Type
{
named,
numbered
};
protected:
virtual std::ostream& _write(std::ostream& os) const = 0;
public:
friend std::ostream&
operator<<(std::ostream& os, const IBoundaryDescriptor& bd)
{
return bd._write(os);
}
virtual bool operator==(const RefId& ref_id) const = 0;
friend bool
operator==(const RefId& ref_id, const IBoundaryDescriptor& bcd)
{
return bcd == ref_id;
}
virtual Type type() const = 0;
IBoundaryDescriptor(const IBoundaryDescriptor&) = delete;
IBoundaryDescriptor(IBoundaryDescriptor&&) = delete;
IBoundaryDescriptor() = default;
virtual ~IBoundaryDescriptor() = default;
};
#endif // I_BOUNDARY_DESCRIPTOR_HPP
#ifndef NAMED_BOUNDARY_DESCRIPTOR_HPP
#define NAMED_BOUNDARY_DESCRIPTOR_HPP
#include <scheme/IBoundaryDescriptor.hpp>
#include <iostream>
#include <string>
class NamedBoundaryDescriptor : public IBoundaryDescriptor
{
private:
std::string m_name;
std::ostream&
_write(std::ostream& os) const final
{
os << '"' << m_name << '"';
return os;
}
public:
bool
operator==(const RefId& ref_id) const final
{
return m_name == ref_id.tagName();
}
Type
type() const final
{
return Type::named;
}
NamedBoundaryDescriptor(const NamedBoundaryDescriptor&) = delete;
NamedBoundaryDescriptor(NamedBoundaryDescriptor&&) = delete;
NamedBoundaryDescriptor(const std::string& name) : m_name(name)
{
;
}
virtual ~NamedBoundaryDescriptor() = default;
};
#endif // NAMED_BOUNDARY_DESCRIPTOR_HPP
#ifndef NUMBERED_BOUNDARY_DESCRIPTOR_HPP
#define NUMBERED_BOUNDARY_DESCRIPTOR_HPP
#include <scheme/IBoundaryDescriptor.hpp>
#include <iostream>
class NumberedBoundaryDescriptor : public IBoundaryDescriptor
{
private:
unsigned int m_number;
std::ostream&
_write(std::ostream& os) const final
{
os << '"' << m_number << '"';
return os;
}
bool
operator==(const RefId& ref_id) const final
{
return m_number == ref_id.tagNumber();
}
public:
Type
type() const final
{
return Type::numbered;
}
NumberedBoundaryDescriptor(const NumberedBoundaryDescriptor&) = delete;
NumberedBoundaryDescriptor(NumberedBoundaryDescriptor&&) = delete;
NumberedBoundaryDescriptor(unsigned int number) : m_number(number)
{
;
}
virtual ~NumberedBoundaryDescriptor() = default;
};
#endif // NUMBERED_BOUNDARY_DESCRIPTOR_HPP
#ifndef SYMMETRY_BOUNDARY_CONDITION_DESCRIPTOR_HPP
#define SYMMETRY_BOUNDARY_CONDITION_DESCRIPTOR_HPP
#include <scheme/IBoundaryConditionDescriptor.hpp>
#include <scheme/IBoundaryDescriptor.hpp>
#include <memory>
class SymmetryBoundaryConditionDescriptor : public IBoundaryConditionDescriptor
{
private:
std::ostream&
_write(std::ostream& os) const final
{
os << "symmetry(" << *m_boundary_descriptor << ")";
return os;
}
std::shared_ptr<IBoundaryDescriptor> m_boundary_descriptor;
public:
const IBoundaryDescriptor&
boundaryDescriptor() const
{
return *m_boundary_descriptor;
}
Type
type() const final
{
return Type::symmetry;
}
SymmetryBoundaryConditionDescriptor(std::shared_ptr<IBoundaryDescriptor> boundary_descriptor)
: m_boundary_descriptor(boundary_descriptor)
{
;
}
SymmetryBoundaryConditionDescriptor(const SymmetryBoundaryConditionDescriptor&) = delete;
SymmetryBoundaryConditionDescriptor(SymmetryBoundaryConditionDescriptor&&) = delete;
~SymmetryBoundaryConditionDescriptor() = default;
};
#endif // SYMMETRY_BOUNDARY_CONDITION_DESCRIPTOR_HPP
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment