feat: add solver core skeleton
This commit is contained in:
@@ -0,0 +1,80 @@
|
||||
#include <fesa/analysis/analysis_state.hpp>
|
||||
|
||||
#include <stdexcept>
|
||||
#include <vector>
|
||||
|
||||
namespace {
|
||||
|
||||
int fail()
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
bool all_zero(const std::vector<double>& values)
|
||||
{
|
||||
for (const double value : values) {
|
||||
if (value != 0.0) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
int main()
|
||||
{
|
||||
fesa::analysis::AnalysisState state{3};
|
||||
if (state.displacement().size() != 3 ||
|
||||
state.velocity().size() != 3 ||
|
||||
state.acceleration().size() != 3 ||
|
||||
state.temperature().size() != 3 ||
|
||||
state.external_force().size() != 3 ||
|
||||
state.internal_force().size() != 3 ||
|
||||
state.residual().size() != 3) {
|
||||
return fail();
|
||||
}
|
||||
if (!all_zero(state.displacement()) || !all_zero(state.residual())) {
|
||||
return fail();
|
||||
}
|
||||
|
||||
state.set_displacement({1.0, 2.0, 3.0});
|
||||
if (state.displacement()[2] != 3.0) {
|
||||
return fail();
|
||||
}
|
||||
|
||||
state.set_external_force({10.0, 20.0, 30.0});
|
||||
state.set_internal_force({1.0, 2.0, 3.0});
|
||||
state.update_residual();
|
||||
if (state.residual()[0] != 9.0 ||
|
||||
state.residual()[1] != 18.0 ||
|
||||
state.residual()[2] != 27.0) {
|
||||
return fail();
|
||||
}
|
||||
|
||||
try {
|
||||
state.set_displacement({1.0});
|
||||
return fail();
|
||||
} catch (const std::invalid_argument&) {
|
||||
}
|
||||
|
||||
state.iteration_state().time = 1.25;
|
||||
state.iteration_state().increment = 2;
|
||||
state.iteration_state().iteration = 3;
|
||||
if (state.iteration_state().time != 1.25 ||
|
||||
state.iteration_state().increment != 2 ||
|
||||
state.iteration_state().iteration != 3) {
|
||||
return fail();
|
||||
}
|
||||
|
||||
state.set_element_state(fesa::core::ElementId{7}, {4.0, 5.0});
|
||||
const auto* element_state = state.element_state(fesa::core::ElementId{7});
|
||||
if (element_state == nullptr || element_state->size() != 2 || (*element_state)[1] != 5.0) {
|
||||
return fail();
|
||||
}
|
||||
if (state.element_state(fesa::core::ElementId{8}) != nullptr) {
|
||||
return fail();
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
Reference in New Issue
Block a user