Integrate Refactor solver sources and dual MSVC CMake builds
This commit is contained in:
@@ -12,7 +12,6 @@
|
||||
#include "fesa/analysis/analysis_model.h"
|
||||
#include "fesa/build_info.h"
|
||||
#include "fesa/core/diagnostic.h"
|
||||
#include "fesa/elements/finite_rotation.h"
|
||||
#include "fesa/fem/dof_manager.h"
|
||||
#include "io/hdf5/hdf5_atomic_file.h"
|
||||
#include "io/hdf5/hdf5_model_writer.h"
|
||||
@@ -24,6 +23,10 @@ namespace {
|
||||
|
||||
using hdf5_internal::Hdf5Failure;
|
||||
using hdf5_internal::Hdf5Handle;
|
||||
using hdf5_internal::CopyVectorValues;
|
||||
using hdf5_internal::FlattenNodalTriads;
|
||||
using hdf5_internal::FlattenNodalDirectors;
|
||||
using hdf5_internal::SpatialReactionValues;
|
||||
|
||||
struct AcceptedFrameRow {
|
||||
std::uint64_t frame_index;
|
||||
@@ -228,11 +231,6 @@ Status Failure(const char* code, const std::string& message) {
|
||||
return hdf5_internal::OutputFailure(code, message);
|
||||
}
|
||||
|
||||
/// @brief Copies one nonempty full-space vector in node-major order.
|
||||
std::vector<double> Values(const Vector& values) {
|
||||
return std::vector<double>{values.Data(), values.Data() + values.Size()};
|
||||
}
|
||||
|
||||
/// @brief Removes inherited metadata before applying the dynamic schema.
|
||||
void DeleteAttribute(const hid_t object, const char* name) {
|
||||
if (H5Aexists(object, name) > 0) {
|
||||
@@ -401,26 +399,6 @@ void ProcessDataset(const hid_t file, const std::string& path,
|
||||
}
|
||||
}
|
||||
|
||||
/// @brief Flattens nodal triad axes in A,B,D row order.
|
||||
std::vector<double> FlattenTriad(const DynamicAcceptedFrameState& frame) {
|
||||
std::vector<double> values;
|
||||
values.reserve(frame.nodal_triad.size() * 9U);
|
||||
for (const auto& triad : frame.nodal_triad) {
|
||||
for (const auto& axis : triad)
|
||||
values.insert(values.end(), axis.begin(), axis.end());
|
||||
}
|
||||
return values;
|
||||
}
|
||||
|
||||
/// @brief Flattens nodal directors in stable node order.
|
||||
std::vector<double> FlattenDirector(const DynamicAcceptedFrameState& frame) {
|
||||
std::vector<double> values;
|
||||
values.reserve(frame.nodal_director.size() * 3U);
|
||||
for (const auto& director : frame.nodal_director)
|
||||
values.insert(values.end(), director.begin(), director.end());
|
||||
return values;
|
||||
}
|
||||
|
||||
/// @brief Flattens physical recovery in element and Gauss order.
|
||||
std::vector<double> FlattenShell(const DynamicAcceptedFrameState& frame,
|
||||
const int quantity) {
|
||||
@@ -442,27 +420,6 @@ std::vector<double> FlattenShell(const DynamicAcceptedFrameState& frame,
|
||||
return values;
|
||||
}
|
||||
|
||||
/// @brief Maps generalized support moments to work-conjugate spatial moments.
|
||||
std::vector<double> SpatialReaction(const DynamicAcceptedFrameState& frame) {
|
||||
std::vector<double> values = Values(frame.reaction);
|
||||
for (std::size_t node = 0U; node < frame.nodal_internal_order.size();
|
||||
++node) {
|
||||
const std::size_t offset = node * 6U;
|
||||
const Vector3 phi{frame.generalized_coordinates[offset + 3U],
|
||||
frame.generalized_coordinates[offset + 4U],
|
||||
frame.generalized_coordinates[offset + 5U]};
|
||||
const Matrix transform = InverseTransposeLeftJacobianSO3(phi);
|
||||
for (std::size_t row = 0U; row < 3U; ++row) {
|
||||
values[offset + 3U + row] = 0.0;
|
||||
for (std::size_t column = 0U; column < 3U; ++column) {
|
||||
values[offset + 3U + row] +=
|
||||
transform(row, column) * frame.reaction[offset + 3U + column];
|
||||
}
|
||||
}
|
||||
}
|
||||
return values;
|
||||
}
|
||||
|
||||
/// @brief Writes or reads back all mandatory accepted-endpoint quantities.
|
||||
void WriteFrame(const hid_t file, const Domain& domain,
|
||||
const DynamicAcceptedFrameState& frame,
|
||||
@@ -491,52 +448,55 @@ void WriteFrame(const hid_t file, const Domain& domain,
|
||||
"force,force,force,force*length,force*length,force*length";
|
||||
const std::vector<hsize_t> nodal{nodes, 6U};
|
||||
WriteDataset(file, root + "/nodal/displacement", nodal,
|
||||
Values(frame.generalized_coordinates), "UX,UY,UZ,URX,URY,URZ",
|
||||
CopyVectorValues(frame.generalized_coordinates), "UX,UY,UZ,URX,URY,URZ",
|
||||
"length,length,length,1,1,1", "global-cartesian", "nodal",
|
||||
frame);
|
||||
WriteDataset(file, root + "/nodal/velocity", nodal, Values(frame.velocity),
|
||||
WriteDataset(file, root + "/nodal/velocity", nodal, CopyVectorValues(frame.velocity),
|
||||
"V1,V2,V3,PHIDOT1,PHIDOT2,PHIDOT3",
|
||||
"length/time,length/time,length/time,1/time,1/time,1/time",
|
||||
"fixed-initial-global-chart", "nodal", frame);
|
||||
WriteDataset(
|
||||
file, root + "/nodal/acceleration", nodal, Values(frame.acceleration),
|
||||
file, root + "/nodal/acceleration", nodal, CopyVectorValues(frame.acceleration),
|
||||
"A1,A2,A3,PHIDDOT1,PHIDDOT2,PHIDDOT3",
|
||||
"length/time^2,length/time^2,length/time^2,1/time^2,1/time^2,1/time^2",
|
||||
"fixed-initial-global-chart", "nodal", frame);
|
||||
WriteDataset(
|
||||
file, root + "/nodal/algorithmic_acceleration", nodal,
|
||||
Values(frame.algorithmic_acceleration), "AUX1,AUX2,AUX3,AUX4,AUX5,AUX6",
|
||||
CopyVectorValues(frame.algorithmic_acceleration), "AUX1,AUX2,AUX3,AUX4,AUX5,AUX6",
|
||||
"length/time^2,length/time^2,length/time^2,1/time^2,1/time^2,1/time^2",
|
||||
"fixed-initial-global-chart", "nodal", frame);
|
||||
WriteDataset(file, root + "/nodal/angular_velocity", {nodes, 3U},
|
||||
Values(frame.angular_velocity), "OMEGA1,OMEGA2,OMEGA3",
|
||||
CopyVectorValues(frame.angular_velocity), "OMEGA1,OMEGA2,OMEGA3",
|
||||
"1/time,1/time,1/time", "global-cartesian", "nodal", frame);
|
||||
WriteDataset(file, root + "/nodal/angular_acceleration", {nodes, 3U},
|
||||
Values(frame.angular_acceleration),
|
||||
CopyVectorValues(frame.angular_acceleration),
|
||||
"OMEGADOT1,OMEGADOT2,OMEGADOT3", "1/time^2,1/time^2,1/time^2",
|
||||
"global-cartesian", "nodal", frame);
|
||||
WriteDataset(file, root + "/nodal/triad", {nodes, 3U, 3U},
|
||||
FlattenTriad(frame), "X,Y,Z", "1,1,1", "global-cartesian",
|
||||
FlattenNodalTriads(frame.nodal_triad), "X,Y,Z", "1,1,1", "global-cartesian",
|
||||
"nodal", frame);
|
||||
WriteDataset(file, root + "/nodal/director", {nodes, 3U},
|
||||
FlattenDirector(frame), "D1,D2,D3", "1,1,1", "global-cartesian",
|
||||
FlattenNodalDirectors(frame.nodal_director), "D1,D2,D3", "1,1,1", "global-cartesian",
|
||||
"nodal", frame);
|
||||
WriteDataset(file, root + "/nodal/generalized_inertia_force", nodal,
|
||||
Values(frame.inertia_force), kGeneralized, kGeneralizedUnits,
|
||||
CopyVectorValues(frame.inertia_force), kGeneralized, kGeneralizedUnits,
|
||||
"fixed-initial-global-chart", "nodal", frame);
|
||||
WriteDataset(file, root + "/nodal/generalized_internal_force", nodal,
|
||||
Values(frame.internal_force), kGeneralized, kGeneralizedUnits,
|
||||
CopyVectorValues(frame.internal_force), kGeneralized, kGeneralizedUnits,
|
||||
"fixed-initial-global-chart", "nodal", frame);
|
||||
WriteDataset(file, root + "/nodal/generalized_external_force", nodal,
|
||||
Values(frame.external_force), kGeneralized, kGeneralizedUnits,
|
||||
CopyVectorValues(frame.external_force), kGeneralized, kGeneralizedUnits,
|
||||
"fixed-initial-global-chart", "nodal", frame);
|
||||
WriteDataset(file, root + "/nodal/generalized_residual", nodal,
|
||||
Values(frame.residual), kGeneralized, kGeneralizedUnits,
|
||||
CopyVectorValues(frame.residual), kGeneralized, kGeneralizedUnits,
|
||||
"fixed-initial-global-chart", "nodal", frame);
|
||||
WriteDataset(file, root + "/nodal/generalized_reaction", nodal,
|
||||
Values(frame.reaction), kGeneralized, kGeneralizedUnits,
|
||||
CopyVectorValues(frame.reaction), kGeneralized, kGeneralizedUnits,
|
||||
"fixed-initial-global-chart", "nodal", frame);
|
||||
WriteDataset(file, root + "/nodal/reaction", nodal, SpatialReaction(frame),
|
||||
WriteDataset(file, root + "/nodal/reaction", nodal,
|
||||
SpatialReactionValues(frame.generalized_coordinates,
|
||||
frame.reaction,
|
||||
frame.nodal_internal_order.size()),
|
||||
"RF1,RF2,RF3,RM1,RM2,RM3", kGeneralizedUnits, "global-cartesian",
|
||||
"nodal", frame);
|
||||
const std::string shell = root + "/element/shell/";
|
||||
@@ -810,13 +770,7 @@ void CheckModel(const hid_t file, const Domain& domain,
|
||||
model.prescribed_displacement);
|
||||
std::vector<double> directors;
|
||||
std::vector<double> frames;
|
||||
for (const auto& frame : domain.ShellNodeInitialFrames()) {
|
||||
directors.insert(directors.end(), frame.director.begin(),
|
||||
frame.director.end());
|
||||
frames.insert(frames.end(), frame.tangent_a.begin(), frame.tangent_a.end());
|
||||
frames.insert(frames.end(), frame.tangent_b.begin(), frame.tangent_b.end());
|
||||
frames.insert(frames.end(), frame.director.begin(), frame.director.end());
|
||||
}
|
||||
hdf5_internal::AppendShellReferenceFrames(domain, directors, frames);
|
||||
(void)CheckDoubles(file, "/model/shell/nodal_director", {count, 3U},
|
||||
directors);
|
||||
(void)CheckDoubles(file, "/model/shell/nodal_frame", {count, 3U, 3U}, frames);
|
||||
|
||||
Reference in New Issue
Block a user