#include "fesa/model/domain.h" #include #include #include #include namespace fesa { StepDefinition::StepDefinition(StaticStepDefinition definition) : name_{std::move(definition.name)}, procedure_kind_{definition.procedure_kind}, nlgeom_{definition.nlgeom}, initial_increment_{definition.initial_increment}, time_period_{definition.time_period}, minimum_increment_{definition.minimum_increment}, maximum_increment_{definition.maximum_increment}, location_{std::move(definition.location)} { for (auto& boundary : definition.boundaries) { for (int source_dof = boundary.first_dof; source_dof <= boundary.last_dof; ++source_dof) { const std::size_t source_order = boundary_conditions_.size(); auto owned = std::make_unique( SourceTargetQuery{SourceEntityKind::kNode, "", boundary.target}, static_cast(source_dof - 1), boundary.value, source_order, boundary.location); boundary_conditions_view_.push_back(std::cref(*owned)); prescribed_displacements_view_.Add(*owned); boundary_conditions_.push_back(std::move(owned)); } } loads_.reserve(definition.loads.size()); loads_view_.reserve(definition.loads.size()); for (std::size_t source_order = 0U; source_order < definition.loads.size(); ++source_order) { auto& load = definition.loads[source_order]; auto owned = std::make_unique( SourceTargetQuery{SourceEntityKind::kNode, "", load.target}, load.dof, load.magnitude, source_order, std::move(load.location)); loads_view_.push_back(std::cref(*owned)); concentrated_loads_view_.Add(*owned); loads_.push_back(std::move(owned)); } surface_pressure_loads_ = std::move(definition.surface_pressure_loads); } StepDefinition::StepDefinition(FrequencyStepDefinition definition) : name_{definition.source_step_name_raw}, procedure_kind_{StaticProcedureKind::kLinearSmallDisplacement}, nlgeom_{false}, initial_increment_{0.0}, time_period_{0.0}, minimum_increment_{0.0}, maximum_increment_{0.0}, location_{definition.step_location}, frequency_{std::move(definition)} { for (const auto& boundary : frequency_->boundaries) { for (int source_dof = boundary.first_dof; source_dof <= boundary.last_dof; ++source_dof) { const std::size_t source_order = boundary_conditions_.size(); auto owned = std::make_unique( SourceTargetQuery{SourceEntityKind::kNode, "", boundary.target}, static_cast(source_dof - 1), boundary.value, source_order, boundary.location); boundary_conditions_view_.push_back(std::cref(*owned)); prescribed_displacements_view_.Add(*owned); boundary_conditions_.push_back(std::move(owned)); } } } const std::string& StepDefinition::Name() const noexcept { return name_; } const BoundaryConditionView& StepDefinition::BoundaryConditions() const noexcept { return boundary_conditions_view_; } const DomainCollectionView& StepDefinition::PrescribedDisplacements() const noexcept { return prescribed_displacements_view_; } const LoadView& StepDefinition::Loads() const noexcept { return loads_view_; } const DomainCollectionView& StepDefinition::ConcentratedLoads() const noexcept { return concentrated_loads_view_; } const std::vector& StepDefinition::SurfacePressureLoads() const noexcept { return surface_pressure_loads_; } StaticProcedureKind StepDefinition::ProcedureKind() const noexcept { return procedure_kind_; } bool StepDefinition::IsNonlinearStatic() const noexcept { return procedure_kind_ == StaticProcedureKind::kNonlinearFullNewton; } bool StepDefinition::IsFrequency() const noexcept { return frequency_.has_value(); } const FrequencyStepDefinition* StepDefinition::Frequency() const noexcept { return frequency_ ? &*frequency_ : nullptr; } bool StepDefinition::UsesNonlinearGeometry() const noexcept { return nlgeom_; } double StepDefinition::InitialIncrement() const noexcept { return initial_increment_; } double StepDefinition::TimePeriod() const noexcept { return time_period_; } double StepDefinition::MinimumIncrement() const noexcept { return minimum_increment_; } double StepDefinition::MaximumIncrement() const noexcept { return maximum_increment_; } const SourceLocation& StepDefinition::Location() const noexcept { return location_; } Result Domain::Create(ModelDefinition definition) { return Result::Success(Domain{std::move(definition)}); } const std::vector& Domain::Nodes() const noexcept { return definition_.nodes; } const DomainCollectionView& Domain::Elements() const noexcept { return elements_view_; } const DomainCollectionView& Domain::BeamElements() const noexcept { return beam_elements_view_; } const DomainCollectionView& Domain::ShellElements() const noexcept { return shell_elements_view_; } const DomainCollectionView& Domain::Materials() const noexcept { return materials_view_; } const DomainCollectionView& Domain::LinearElasticMaterials() const noexcept { return linear_materials_view_; } const DomainCollectionView& Domain::Properties() const noexcept { return properties_view_; } const DomainCollectionView& Domain::Sections() const noexcept { return sections_view_; } const DomainCollectionView& Domain::ShellSections() const noexcept { return shell_sections_view_; } const std::vector& Domain::ShellNodeInitialFrames() const noexcept { return definition_.shell_node_initial_frames; } const std::vector& Domain::NodeSets() const noexcept { return definition_.node_sets; } const std::vector& Domain::ElementSets() const noexcept { return definition_.element_sets; } const std::vector& Domain::ElementSurfaces() const noexcept { return definition_.element_surfaces; } const DomainCollectionView& Domain::Steps() const noexcept { return steps_view_; } const std::vector& Domain::Densities() const noexcept { return definition_.densities; } const FrequencyStepDefinition* Domain::Frequency() const noexcept { return steps_view_.Size() == 1U ? steps_view_[0U].Frequency() : nullptr; } const std::vector& Domain::Warnings() const noexcept { return definition_.warnings; } const std::filesystem::path& Domain::SourcePath() const noexcept { return definition_.source_path; } const std::string& Domain::SourceContentIdentity() const noexcept { return definition_.source_content_identity; } Domain::Domain(ModelDefinition definition) : definition_{std::move(definition)} { materials_.reserve(definition_.materials.size()); for (auto& material : definition_.materials) { auto owned = std::make_unique(std::move(material)); materials_view_.Add(*owned); linear_materials_view_.Add(*owned); materials_.push_back(std::move(owned)); } definition_.materials.clear(); element_properties_.reserve(definition_.sections.size() + definition_.shell_sections.size()); for (auto& section : definition_.sections) { auto owned = std::make_unique(std::move(section)); properties_view_.Add(*owned); sections_view_.Add(*owned); element_properties_.push_back(std::move(owned)); } const std::size_t beam_property_count = element_properties_.size(); definition_.sections.clear(); for (auto& section : definition_.shell_sections) { auto owned = std::make_unique(std::move(section)); properties_view_.Add(*owned); shell_sections_view_.Add(*owned); element_properties_.push_back(std::move(owned)); } definition_.shell_sections.clear(); element_definitions_.reserve(definition_.elements.size() + definition_.shell_elements.size()); for (auto& element : definition_.elements) { element.SynchronizeNodeIndices(); auto owned = std::make_unique(std::move(element)); elements_view_.Add(*owned); beam_elements_view_.Add(*owned); element_definitions_.push_back(std::move(owned)); } definition_.elements.clear(); for (auto& element : definition_.shell_elements) { element.SynchronizeNodeIndices(); element.SetPropertyIndex( static_cast(beam_property_count + element.section_index)); auto owned = std::make_unique(std::move(element)); elements_view_.Add(*owned); shell_elements_view_.Add(*owned); element_definitions_.push_back(std::move(owned)); } definition_.shell_elements.clear(); step_definitions_.reserve(definition_.steps.size() + (definition_.frequency_step ? 1U : 0U)); for (auto& step : definition_.steps) { auto owned = std::unique_ptr(new StepDefinition(std::move(step))); steps_view_.Add(*owned); step_definitions_.push_back(std::move(owned)); } definition_.steps.clear(); if (definition_.frequency_step) { auto owned = std::unique_ptr( new StepDefinition(std::move(*definition_.frequency_step))); steps_view_.Add(*owned); step_definitions_.push_back(std::move(owned)); } } } // namespace fesa