74 lines
2.5 KiB
74 lines
2.5 KiB
#pragma once
|
|
|
|
#include <Eigen/Eigen>
|
|
#include <utility>
|
|
#include <limits>
|
|
|
|
namespace da::sha {
|
|
|
|
struct DirichletBC {
|
|
DirichletBC(Eigen::Vector3d p_relMinBBox, Eigen::Vector3d p_relMaxBBox,
|
|
const std::array<double, 2> &p_timeRange = {0.0,
|
|
std::numeric_limits<double>::infinity()})
|
|
: relMinBBox(std::move(p_relMinBBox)),
|
|
relMaxBBox(std::move(p_relMaxBBox)),
|
|
timeRange(p_timeRange) {}
|
|
|
|
void calcAbsBBox(const Eigen::Vector3d &modelMinBBox, const Eigen::Vector3d &modelMaxBBox) {
|
|
Eigen::Vector3d modelLength = modelMaxBBox - modelMinBBox;
|
|
absMinBBox = modelMinBBox + (modelLength.array() * relMinBBox.array()).matrix();
|
|
absMaxBBox = modelMinBBox + (modelLength.array() * relMaxBBox.array()).matrix();
|
|
}
|
|
|
|
bool inDBC(const Eigen::Vector3d &p) {
|
|
return (p.array() >= absMinBBox.array()).all() && (p.array() <= absMaxBBox.array()).all();
|
|
}
|
|
|
|
bool isActive(double stepStartTime) const {
|
|
return stepStartTime >= timeRange[0] && stepStartTime < timeRange[1];
|
|
}
|
|
|
|
std::array<double, 2> timeRange = {0.0, std::numeric_limits<double>::infinity()};
|
|
|
|
Eigen::Vector3d relMinBBox;
|
|
Eigen::Vector3d relMaxBBox;
|
|
|
|
Eigen::Vector3d absMinBBox;
|
|
Eigen::Vector3d absMaxBBox;
|
|
};
|
|
|
|
struct NeumannBC {
|
|
NeumannBC(Eigen::Vector3d p_relMinBBox, Eigen::Vector3d p_relMaxBBox, Eigen::Vector3d p_force,
|
|
const std::array<double, 2> &p_timeRange = {0.0,
|
|
std::numeric_limits<double>::infinity()})
|
|
: relMinBBox(std::move(p_relMinBBox)),
|
|
relMaxBBox(std::move(p_relMaxBBox)),
|
|
force(std::move(p_force)),
|
|
timeRange(p_timeRange) {}
|
|
|
|
void calcAbsBBox(const Eigen::Vector3d &modelMinBBox, const Eigen::Vector3d &modelMaxBBox) {
|
|
Eigen::Vector3d modelLength = modelMaxBBox - modelMinBBox;
|
|
absMinBBox = modelMinBBox + (modelLength.array() * relMinBBox.array()).matrix();
|
|
absMaxBBox = modelMinBBox + (modelLength.array() * relMaxBBox.array()).matrix();
|
|
}
|
|
|
|
bool inNBC(const Eigen::Vector3d &p) {
|
|
return (p.array() >= absMinBBox.array()).all() && (p.array() <= absMaxBBox.array()).all();
|
|
}
|
|
|
|
bool isActive(double stepStartTime) const {
|
|
return stepStartTime >= timeRange[0] && stepStartTime < timeRange[1];
|
|
}
|
|
|
|
std::array<double, 2> timeRange = {0.0, std::numeric_limits<double>::infinity()};
|
|
|
|
Eigen::Vector3d relMinBBox;
|
|
Eigen::Vector3d relMaxBBox;
|
|
|
|
Eigen::Vector3d absMinBBox;
|
|
Eigen::Vector3d absMaxBBox;
|
|
|
|
Eigen::Vector3d force;
|
|
};
|
|
|
|
} // namespace da::sha
|
|
|