25 #include <mrpt/containers/yaml.h>
26 #include <mrpt/core/optional_ref.h>
27 #include <mrpt/system/CTimeLogger.h>
28 #include <mrpt/viz/CSetOfObjects.h>
29 #include <openbeam/CElement.h>
30 #include <openbeam/types.h>
32 #include <Eigen/Sparse>
39 struct RenderInitData;
43 enum class DoF_index : uint8_t
55 NodeDoF(node_index_t _node_id, DoF_index _dof) : nodeId(_node_id),
dof(_dof) {}
56 NodeDoF(node_index_t _node_id, uint8_t _dof) : nodeId(_node_id),
dof(
static_cast<DoF_index
>(_dof))
63 uint8_t dofAsInt()
const {
return static_cast<uint8_t
>(
dof); }
66 enum class StaticSolverAlgorithm : uint8_t
83 Eigen::SparseMatrix<num_t> K_bb;
84 Eigen::SparseMatrix<num_t> K_ff;
85 Eigen::SparseMatrix<num_t> K_bf;
87 std::vector<size_t> free_dof_indices;
88 std::vector<size_t> bounded_dof_indices;
89 std::vector<TDoFType> dof_types;
94 Eigen::Matrix<num_t, Eigen::Dynamic, 1>
U_b;
98 Eigen::Matrix<num_t, Eigen::Dynamic, 1>
F_f;
113 Eigen::Matrix<num_t, Eigen::Dynamic, 1>
F_b;
117 Eigen::Matrix<num_t, Eigen::Dynamic, 1>
U_f;
123 Eigen::Matrix<num_t, Eigen::Dynamic, 1>
F;
128 Eigen::Matrix<num_t, Eigen::Dynamic, 1>
U;
133 num_t
rcond = std::numeric_limits<num_t>::quiet_NaN();
175 unsigned int img_width = 0, img_height = 0;
185 StaticSolverAlgorithm
algorithm = StaticSolverAlgorithm::Sparse_LLT;
186 bool nonLinearIterative =
false;
214 using constraint_list_t = std::map<size_t, num_t>;
215 using load_list_t = std::map<size_t, num_t>;
238 const mrpt::optional_ref<vector_string_t>& errMsg = std::nullopt,
239 const mrpt::optional_ref<vector_string_t>& warnMsg = std::nullopt);
251 const std::string& file,
252 const mrpt::optional_ref<vector_string_t>& errMsg = std::nullopt,
253 const mrpt::optional_ref<vector_string_t>& warnMsg = std::nullopt);
260 const std::string& file,
266 const std::string& file,
272 const std::string& file,
279 bool renderToCairoContext(
280 void* _cairo_context,
286 mrpt::viz::CSetOfObjects::Ptr getVisualization(
290 const StressInfo* stressInfo =
nullptr)
const;
303 template <
typename ElementClass,
typename... _Args>
306 return insertElement(std::make_shared<ElementClass>(std::forward<_Args>(__args)...));
374 void setNodePose(
size_t idx,
const num_t x,
const num_t y,
const num_t z);
380 ASSERT_(i < m_node_poses.size());
381 return m_node_poses[i];
387 ASSERT_(i < m_node_poses.size());
388 return m_node_poses[i];
395 Vector3& out_final_point,
397 const num_t exageration_factor = 1)
const;
409 bool deformed =
false,
411 num_t deformed_scale_factor = 1.0)
const;
435 const std::vector<size_t>& ds,
const size_t nTotalDOFs);
499 std::deque<node_used_t> m_node_defined;
500 std::deque<TRotationTrans3D> m_node_poses;
502 std::deque<CElement::Ptr> m_elements;
539 const mrpt::containers::yaml& f,
540 const mrpt::optional_ref<vector_string_t>& errMsg,
541 const mrpt::optional_ref<vector_string_t>& warnMsg);
543 void internal_parser1_Parameters(
const mrpt::containers::yaml& f,
EvaluationContext& ctx)
const;
545 void internal_parser2_BeamSections(
const mrpt::containers::yaml& f,
EvaluationContext& ctx)
const;
547 void internal_parser3_nodes(
const mrpt::containers::yaml& f,
EvaluationContext& ctx);
548 void internal_parser4_elements(
const mrpt::containers::yaml& f,
EvaluationContext& ctx);
549 void internal_parser5_constraints(
const mrpt::containers::yaml& f,
EvaluationContext& ctx);
551 void internal_parser6_node_loads(
const mrpt::containers::yaml& f,
EvaluationContext& ctx);
552 void internal_parser7_element_loads(
const mrpt::containers::yaml& f,
EvaluationContext& ctx);
572 const DynMatrix& Kff,
const std::vector<size_t>& free_dof_indices)
const;
581 std::array<int, 6>
dof_index = {-1, -1, -1, -1, -1, -1};
618 void internal_getVisualization_nodeLoads(
619 mrpt::viz::CSetOfObjects& gl,
623 num_t DEFORMED_SCALE_FACTOR)
const;
625 void internal_getVisualization_constraints(
626 mrpt::viz::CSetOfObjects& gl,
630 num_t DEFORMED_SCALE_FACTOR)
const;
632 void internal_getVisualization_distributedLoads(
634 mrpt::viz::CSetOfObjects& gl,
638 num_t DEFORMED_SCALE_FACTOR)
const;
640 void internal_getVisualization_stressDiagrams(
641 mrpt::viz::CSetOfObjects& gl,
645 num_t DEFORMED_SCALE_FACTOR,
Definition: CFiniteElementProblem.h:212
void getNodeDeformedPosition(size_t i, Vector3 &out_final_point, const StaticSolveProblemInfo &solver_info, const num_t exageration_factor=1) const
std::vector< TRotation3D > m_nodeMainDirection
Definition: CFiniteElementProblem.h:615
std::vector< NodeDoF > m_problem_DoFs
Definition: CFiniteElementProblem.h:588
size_t getNumberOfElements() const
Definition: CFiniteElementProblem.h:316
std::string getNodeLabel(const size_t idx) const
"N%i" or custom label
std::vector< TProblemDOFIndicesForNode > m_problem_DoFs_inverse_list
Definition: CFiniteElementProblem.h:594
TRotationTrans3D & getNodePose(size_t i)
Definition: CFiniteElementProblem.h:378
bool internal_loadFromYaml(const mrpt::containers::yaml &f, const mrpt::optional_ref< vector_string_t > &errMsg, const mrpt::optional_ref< vector_string_t > &warnMsg)
std::vector< std::string > m_node_labels
node custom label
Definition: CFiniteElementProblem.h:501
void solveStatic(StaticSolveProblemInfo &out_info, const StaticSolverOptions &opts=StaticSolverOptions())
load_list_t m_loads_at_each_dof_equivs
Definition: CFiniteElementProblem.h:522
static std::vector< size_t > complementaryDoFs(const std::vector< size_t > &ds, const size_t nTotalDOFs)
virtual void internalComputeStressAndEquivalentLoads()
Definition: CFiniteElementProblem.h:535
std::map< std::pair< node_index_t, DoF_index >, num_t > m_node_constraint_requests
See addNodeConstraint()
Definition: CFiniteElementProblem.h:512
constraint_list_t m_DoF_constraints
Definition: CFiniteElementProblem.h:509
size_t createElement(_Args &&... __args)
Definition: CFiniteElementProblem.h:304
void insertConstraint(const size_t dof_index, const num_t value=0)
bool saveAsImageSVG(const std::string &file, const DrawStructureOptions &options, const StaticSolveProblemInfo *solver_info=nullptr, const MeshOutputInfo *meshing_info=nullptr, ImageSaveOutputInfo *out_img_info=nullptr) const
node_index_t insertNode(const TRotationTrans3D &p)
num_t getMaximumDeformedDisplacement(const StaticSolveProblemInfo &solver_info) const
std::map< element_index_t, TNodeElementConnection > TNodeConnections
Definition: CFiniteElementProblem.h:604
const std::vector< NodeDoF > & getProblemDoFs()
Definition: CFiniteElementProblem.h:421
bool loadFromStream(std::istream &is, const mrpt::optional_ref< vector_string_t > &errMsg=std::nullopt, const mrpt::optional_ref< vector_string_t > &warnMsg=std::nullopt)
size_t getDOFIndex(const size_t nNode, const DoF_index n) const
size_t getNumberOfNodes() const
Definition: CFiniteElementProblem.h:364
std::string getProblemDoFsDescription()
std::string describeSingularStiffness(const DynMatrix &Kff, const std::vector< size_t > &free_dof_indices) const
void addLoadAtDOF(const size_t dof_index, const num_t f)
void updateElementsOrientation()
size_t insertElement(CElement::Ptr el)
void getBoundingBox(num_t &min_x, num_t &max_x, num_t &min_y, num_t &max_y, bool deformed=false, const StaticSolveProblemInfo *solver_info=nullptr, num_t deformed_scale_factor=1.0) const
CElement::ConstPtr getElement(size_t i) const
void setNodePose(size_t idx, const num_t x, const num_t y, const num_t z)
const TRotationTrans3D & getNodePose(size_t i) const
Definition: CFiniteElementProblem.h:385
void setNumberOfNodes(size_t N)
std::vector< TNodeConnections > m_node_connections
Definition: CFiniteElementProblem.h:610
bool loadFromFile(const std::string &file, const mrpt::optional_ref< vector_string_t > &errMsg=std::nullopt, const mrpt::optional_ref< vector_string_t > &warnMsg=std::nullopt)
void updateNodeConnections()
void updateNodesMainOrientation()
void postProcCalcStress(StressInfo &out_stress, const StaticSolveProblemInfo &solver_info)
void assembleProblem(BuildProblemInfo &out_info)
std::map< size_t, ElementStress > m_extra_stress_for_each_element
Definition: CFiniteElementProblem.h:528
const std::map< std::pair< node_index_t, DoF_index >, num_t > & getNodeConstraintRequests() const
Constraints as requested with addNodeConstraint()
Definition: CFiniteElementProblem.h:339
load_list_t m_loads_at_each_dof
Definition: CFiniteElementProblem.h:516
const CElement::Ptr & getElement(size_t i)
void setNodePose(size_t idx, const TRotationTrans3D &p)
void setLoadAtDOF(const size_t dof_index, const num_t f)
bool addNodeConstraint(node_index_t node, DoF_index dof, num_t value=0)
Definition: CStructureProblem.h:36
Definition: CFiniteElementProblem.h:76
size_t free_index
Definition: CFiniteElementProblem.h:79
size_t bounded_index
Definition: CFiniteElementProblem.h:77
Definition: CFiniteElementProblem.h:74
Eigen::Matrix< num_t, Eigen::Dynamic, 1 > U_b
Definition: CFiniteElementProblem.h:94
Eigen::Matrix< num_t, Eigen::Dynamic, 1 > F_f
Definition: CFiniteElementProblem.h:98
Eigen::Matrix< num_t, Eigen::Dynamic, 1 > F_b_applied
Definition: CFiniteElementProblem.h:102
Definition: CFiniteElementProblem.h:597
unsigned char elementFaceId
To which face in that element.
Definition: CFiniteElementProblem.h:598
used_DoFs_t dofs
DoFs used by that face in that element.
Definition: CFiniteElementProblem.h:599
Definition: CFiniteElementProblem.h:576
std::array< int, 6 > dof_index
Definition: CFiniteElementProblem.h:581
Definition: CFiniteElementProblem.h:493
Definition: DrawStructureOptions.h:34
Definition: CFiniteElementProblem.h:172
Definition: CFiniteElementProblem.h:152
std::deque< std::vector< element_index_t > > element2elements
List of smaller element IDs resulting from meshing the element [i].
Definition: CFiniteElementProblem.h:168
std::deque< std::vector< node_index_t > > element2nodes
Definition: CFiniteElementProblem.h:165
size_t num_original_elements
Definition: CFiniteElementProblem.h:161
size_t num_original_nodes
Definition: CFiniteElementProblem.h:157
Definition: CFiniteElementProblem.h:142
double max_element_length
In meters (m)
Definition: CFiniteElementProblem.h:145
Definition: CFiniteElementProblem.h:54
DoF_index dof
In the range [0-5].
Definition: CFiniteElementProblem.h:61
Definition: DrawStructureOptions.h:114
Definition: CFiniteElementProblem.h:107
Eigen::Matrix< num_t, Eigen::Dynamic, 1 > U_f
Definition: CFiniteElementProblem.h:117
Eigen::Matrix< num_t, Eigen::Dynamic, 1 > F_b
Definition: CFiniteElementProblem.h:113
BuildProblemInfo build_info
Information from the assembly of the problem.
Definition: CFiniteElementProblem.h:109
num_t rcond
Definition: CFiniteElementProblem.h:133
Eigen::Matrix< num_t, Eigen::Dynamic, 1 > F
Definition: CFiniteElementProblem.h:123
std::vector< std::string > warnings
Non-fatal issues found while solving (e.g. ill-conditioning)
Definition: CFiniteElementProblem.h:136
Eigen::Matrix< num_t, Eigen::Dynamic, 1 > U
Definition: CFiniteElementProblem.h:128
Definition: CFiniteElementProblem.h:180
StaticSolverAlgorithm algorithm
Definition: CFiniteElementProblem.h:185
Definition: CFiniteElementProblem.h:190
std::vector< ElementStress > element_stress
Definition: CFiniteElementProblem.h:198