Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
151 commits
Select commit Hold shift + click to select a range
eee0b78
add constraint assembler interface
matekelemen Mar 26, 2025
fb5fac0
add interface for multifreedom constraints
matekelemen Mar 26, 2025
a14f613
add linear multifreedom constraint
matekelemen Mar 26, 2025
a198982
add dummy constraint assembler
matekelemen Mar 26, 2025
7aa8eda
add master-slave constraint assembler
matekelemen Mar 26, 2025
2819cbc
add augmented lagrange constraint assembler
matekelemen Mar 26, 2025
9d36f12
add utilities for ublas sparse matrices
matekelemen Mar 26, 2025
ee5d873
add utility functions for system scaling
matekelemen Mar 26, 2025
12cbe77
add factory for constraint assemblers
matekelemen Mar 26, 2025
c48afcb
add utilities for p-coarsening
matekelemen Mar 26, 2025
bce87b8
add coarse grids
matekelemen Mar 26, 2025
47c6707
add b&s for p-multigrid
matekelemen Mar 26, 2025
c2cedc3
Merge branch 'core/register-float-solvers' into core/p-multigrid
matekelemen Mar 26, 2025
92fb9bc
expose linear multifreedom constraint to python
matekelemen Mar 26, 2025
2938413
expose PMultigridBuilderAndSolver to python
matekelemen Mar 26, 2025
ed9e1e9
Merge branch 'core/initialize-constraints' into core/p-multigrid
matekelemen Mar 26, 2025
c6d2466
expose linear multifreedom constraint to the serializer
matekelemen Mar 26, 2025
ecce8b7
Merge branch 'structural/builder-and-solver-settings' into core/p-mul…
matekelemen Mar 26, 2025
37eca59
extend builder and solver options in structural mechanics solver
matekelemen Mar 26, 2025
f24354b
Merge branch 'structural/builder-and-solver-settings' into core/p-mul…
matekelemen Mar 26, 2025
5f97354
suppress unused capture warning
matekelemen Mar 27, 2025
f4a100a
remove unnecessary checks
matekelemen Mar 27, 2025
d8aadfa
'not' => '!' because MSVC refuses to conform to standards
matekelemen Mar 27, 2025
4dc9019
Merge branch 'core/initialize-constraints' into core/p-multigrid
matekelemen Mar 27, 2025
2e910ec
Merge branch 'master' of https://github.com/KratosMultiphysics/Kratos…
matekelemen Mar 27, 2025
64e3c35
fix residual formatting
matekelemen Mar 27, 2025
7db0ce4
gcc hates doxygen ...
matekelemen Mar 27, 2025
a6a0725
msvc and logical operators ...
matekelemen Mar 27, 2025
49d18af
Merge branch 'structural/builder-and-solver-settings' into core/p-mul…
matekelemen Mar 27, 2025
d688e8c
remove unused lambda capture
matekelemen Mar 27, 2025
a212885
handholding for poor old, senile MSVC
matekelemen Mar 27, 2025
a1289d7
export symbols for PMultigridBuilderAndSolver
matekelemen Mar 27, 2025
bc814a5
I guess I have to work around decade-old compiler bugs if I want my s…
matekelemen Mar 27, 2025
60195d2
attempt to appease rocky linux' ancient gcc
matekelemen Mar 27, 2025
d353b03
msvc and logical operators ...
matekelemen Mar 27, 2025
81913aa
attempt to appease rocky linux' ancient gcc. round 2
matekelemen Mar 27, 2025
0962e30
msvc and logical operators ...
matekelemen Mar 27, 2025
4ea9661
has gcc 8.5 never heard of move semantics?
matekelemen Mar 27, 2025
ff261cd
fix PointerVectorSet::count
matekelemen Mar 28, 2025
3ab7c25
shove operations on system vectors into one loop
matekelemen Mar 28, 2025
080550c
maybe explicitly noexcept defaulted constructors/assignment operators…
matekelemen Mar 28, 2025
8aa9305
remove obsolete container
matekelemen Mar 28, 2025
bd5ad29
attempt to appease rocky linux' ancient gcc. vol3
matekelemen Mar 28, 2025
fa35892
explicitly export symbols from BuilderAndSolver
matekelemen Mar 28, 2025
fcc9d8f
Revert "explicitly export symbols from BuilderAndSolver"
matekelemen Mar 28, 2025
712d64e
don't expose any symbols then?
matekelemen Mar 28, 2025
2b7b515
Revert "don't expose any symbols then?"
matekelemen Mar 28, 2025
7d16e25
Reapply "explicitly export symbols from BuilderAndSolver"
matekelemen Mar 28, 2025
f3d4584
ばんさくつきた
matekelemen Mar 28, 2025
49aa389
Merge branch 'geo/avoid-derived-template-param' into core/p-multigrid
matekelemen Mar 29, 2025
a267d40
add missing copy constructor definition for NodalData
matekelemen Mar 29, 2025
d8f1237
pull index set into a type alias
matekelemen Mar 29, 2025
4fbb6a3
pull node index locator into free-float function
matekelemen Mar 29, 2025
2301dab
lock mutexes for every DoF separately (massive performance improvement)
matekelemen Mar 29, 2025
94c2554
include all heap containers in thread-local vars
matekelemen Mar 29, 2025
df96c56
Merge branch 'hdf5/traceback' into core/p-multigrid
matekelemen Apr 6, 2025
e39a390
improve status reports
matekelemen Apr 6, 2025
1c0fcac
move constraint utilities
matekelemen Apr 6, 2025
224d5a2
dynamic penalty factors and diagonal scales
matekelemen Apr 7, 2025
6ad494f
replace pair with struct to help rocky?
matekelemen Apr 7, 2025
9be5cbb
Merge branch 'master' of https://github.com/kratosmultiphysics/kratos…
matekelemen Apr 8, 2025
837d39a
remove unused include
matekelemen Apr 10, 2025
479191f
Merge branch 'master' of https://github.com/KratosMultiphysics/Kratos…
matekelemen Apr 10, 2025
dd4768a
minor optimizations in sparse utilities
matekelemen Apr 10, 2025
c9c304a
remove junk from AugmentedLagrangeConstraintAssembler
matekelemen Apr 10, 2025
37d8c2b
Merge branch 'core/p-multigrid' of https://github.com/kratosmultiphys…
matekelemen Apr 11, 2025
8fdebe9
Merge branch 'master' of https://github.com/kratosmultiphysics/kratos…
matekelemen Apr 11, 2025
8c310e4
pimpl master slave constraint assembler
matekelemen Apr 11, 2025
f822f7c
fix integer mismatch in BalancedProduct
matekelemen Apr 11, 2025
ecb578b
write constraint equations if requested
matekelemen Apr 11, 2025
b313b6c
forbid ConstraintAssembler from being moved
matekelemen Apr 11, 2025
b494ecd
pass the parent's constraint assembler during coarsening
matekelemen Apr 11, 2025
67b9f8c
source bashrc on rocky (should probably be /etc/profile)
matekelemen Apr 11, 2025
e4e8fb5
Merge branch 'master' of https://github.com/KratosMultiphysics/Kratos…
matekelemen Apr 11, 2025
a130137
Merge branch 'core/p-multigrid' of https://github.com/kratosmultiphys…
matekelemen Apr 11, 2025
12828bd
explicitly source the gcc-11 toolchain
matekelemen Apr 12, 2025
6102498
update ci rocky image reference
matekelemen Apr 12, 2025
38c8956
Revert "explicitly source the gcc-11 toolchain"
matekelemen Apr 12, 2025
b45091c
Revert "source bashrc on rocky (should probably be /etc/profile)"
matekelemen Apr 12, 2025
3fe4f7c
Reapply "source bashrc on rocky (should probably be /etc/profile)"
matekelemen Apr 12, 2025
7f8007d
source /etc/bashrc in the rocky CI
matekelemen Apr 12, 2025
ac60143
add docs for PMultigridBuilderAndSolver and PGrid
matekelemen Apr 12, 2025
0f5dc94
add docs for utilities
matekelemen Apr 12, 2025
4cba87a
add docs for constraints
matekelemen Apr 12, 2025
4fe757d
add docs for constraint assemblers
matekelemen Apr 12, 2025
3321333
Merge branch 'master' of https://github.com/KratosMultiphysics/Kratos…
matekelemen Apr 12, 2025
37d151c
extend docs for ConstraintAssemblerFactory
matekelemen Apr 13, 2025
9271289
Merge branch 'master' of https://github.com/KratosMultiphysics/Kratos…
matekelemen Apr 18, 2025
9581c01
fix status stream header
matekelemen Apr 18, 2025
44f8eb8
consistent index types
matekelemen Apr 18, 2025
1635f17
remove the linear solver type from PMultigridBuilderAndSolver's templ…
matekelemen Apr 18, 2025
faf8660
add infrastructure for constraints' hessians
matekelemen Apr 18, 2025
3bbcd45
add link constraint
matekelemen Apr 18, 2025
68c27db
expose LinkConstraint to python
matekelemen Apr 18, 2025
7460d2b
remove the linear solver type from PMultigridBuilderAndSolver's templ…
matekelemen Apr 18, 2025
d34079b
Merge branch 'core/pmg-hessian' into structural/link-constraint-pr
matekelemen Apr 18, 2025
55a304a
add python process for constructing LinkConstraints
matekelemen Apr 18, 2025
6482876
add tests for LinkConstraint
matekelemen Apr 18, 2025
3ef0667
update docs
matekelemen Apr 18, 2025
8165fab
explicitly delete copy/move constructor and assignment operator
matekelemen Apr 18, 2025
a8933e3
fix linear solver config
matekelemen Apr 19, 2025
661b465
add support for intermediate solution/residual outputs
matekelemen Apr 21, 2025
5570366
resolve merge conflicts
matekelemen Apr 21, 2025
75dccc3
Merge branch 'core/pmg-hessian' into structural/link-constraint-pr
matekelemen Apr 21, 2025
d0742f0
fix delegating constructor
matekelemen Apr 21, 2025
4dbda6a
My bad. I guess it's too much to ask of MSVC to support C++17 in 2025.
matekelemen Apr 21, 2025
3e8796d
extend docs
matekelemen Apr 21, 2025
46e469d
try working around yet another MSVC ICE
matekelemen Apr 21, 2025
f5e343e
try working around yet another MSVC ICE; round 2
matekelemen Apr 21, 2025
33198c7
Merge branch 'master' of https://github.com/kratosmultiphysics/kratos…
matekelemen Apr 22, 2025
e8777cc
improve status logs
matekelemen Apr 22, 2025
0b38806
resolve merge conflicts
matekelemen Apr 22, 2025
d0d97ce
Merge branch 'core/pmg-hessian' into structural/link-constraint-pr
matekelemen Apr 22, 2025
e741e60
remove godbolt link
matekelemen Apr 23, 2025
21e9726
change annotation blocks from C++ style to old C style
matekelemen Apr 23, 2025
0a5a095
extend docs about verbosity level 5
matekelemen Apr 23, 2025
5cf6e48
include whitespace in JSON strings
matekelemen Apr 23, 2025
ae314ec
Merge pull request #13348 from KratosMultiphysics/structural/link-con…
matekelemen Apr 23, 2025
a50b928
Merge pull request #13345 from KratosMultiphysics/core/pmg-hessian
matekelemen Apr 23, 2025
2050106
initialize the LinkConstraint's DataValueContainer at construction
matekelemen Apr 23, 2025
8e780c6
fix indexing bug
matekelemen Apr 23, 2025
d13f992
CI trigger
matekelemen Apr 24, 2025
9871049
fix operator checks
matekelemen Apr 25, 2025
ceae677
fix compound variables
matekelemen Apr 25, 2025
b708dc4
Merge branch 'master' of https://github.com/kratosmultiphysics/kratos…
matekelemen May 2, 2025
7f567ad
extend binding docs
matekelemen May 2, 2025
1b77f80
add sanity checks
matekelemen May 2, 2025
c69adba
remove support for nonzero initial lagrange multipliers
matekelemen May 2, 2025
d22a90c
Merge branch 'master' of https://github.com/kratosmultiphysics/kratos…
matekelemen May 6, 2025
ad4ca25
add utility classes for equality comparison and ordering
matekelemen May 15, 2025
4894b71
add tests for equality comparisons and orderings
matekelemen May 15, 2025
0fb562d
Merge branch 'master' of https://github.com/kratosmultiphysics/kratos…
matekelemen Jun 12, 2025
638f752
resolve merge conflicts
matekelemen Jun 23, 2025
99c6e29
implicitly assume that norm always refers to the 2-norm
matekelemen Jul 12, 2025
be285e7
pass preserve = false to ublas resizing functions
matekelemen Jul 12, 2025
6c708b3
add MPI support for finding an available ID
matekelemen Jul 12, 2025
b3fd289
apply suggestion
matekelemen Jul 12, 2025
3d365a7
replace CaseWorkingDirectory with WorkFolderScope
matekelemen Jul 12, 2025
b26d015
compute node distances in 3D even if the analysis is in 2D
matekelemen Jul 12, 2025
b7c0208
update docs
matekelemen Jul 12, 2025
8e1a5da
add docs for ProcessMasterSlaveConstraint and ProcessMultifreedomCons…
matekelemen Jul 12, 2025
8e8a3cc
add docs for NoOpConstraintAssembler
matekelemen Jul 12, 2025
af17a0c
remove leftover comments
matekelemen Jul 12, 2025
a407fe6
fix docs
matekelemen Jul 12, 2025
040b6fc
fix docs
matekelemen Jul 12, 2025
0d7d15e
remove unused include
matekelemen Jul 12, 2025
c071bce
Merge branch 'master' of https://github.com/KratosMultiphysics/Kratos…
matekelemen Jul 12, 2025
89d4bea
replace explicit fills with ZeroMatrix and ZeroVector
matekelemen Jul 15, 2025
27a4014
Merge branch 'master' of https://github.com/kratosmultiphysics/kratos…
matekelemen Jul 15, 2025
94266e0
resolve merge conflicts
matekelemen Jul 15, 2025
76ebd40
oopsies
matekelemen Jul 15, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ file(GLOB_RECURSE KRATOS_STRUCTURAL_MECHANICS_APPLICATION_CORE
${CMAKE_CURRENT_SOURCE_DIR}/structural_mechanics_application.cpp
${CMAKE_CURRENT_SOURCE_DIR}/structural_mechanics_application_variables.cpp
${CMAKE_CURRENT_SOURCE_DIR}/custom_conditions/*.cpp
${CMAKE_CURRENT_SOURCE_DIR}/custom_constraints/*.cpp
${CMAKE_CURRENT_SOURCE_DIR}/custom_constitutive/*.cpp
${CMAKE_CURRENT_SOURCE_DIR}/custom_elements/*.cpp
${CMAKE_CURRENT_SOURCE_DIR}/custom_io/*.cpp
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,323 @@
// | / |
// ' / __| _` | __| _ \ __|
// . \ | ( | | ( |\__ `
// _|\_\_| \__,_|\__|\___/ ____/
// Multi-Physics
//
// License: BSD License
// Kratos default license: kratos/license.txt
//
// Main authors: Máté Kelemen
//

// Project includes
#include "custom_constraints/link_constraint.hpp" // LinkConstraint
#include "includes/define.h"
#include "includes/process_info.h"
#include "includes/variables.h" // DISPLACEMENT_X, DISPLACEMENT_Y, DISPLACEMENT_Z
#include "includes/serializer.h" // Serializer
#include "includes/variables.h" // CONSTITUTIVE_MATRIX, INTERNAL_FORCES_VECTOR

// STL includes
#include <algorithm> // std::max_element, std::equal, std::transform


namespace Kratos {


struct LinkConstraint::Impl
{
using ValueType = double;

static void ComputeRelationMatrix(LinkConstraint::MatrixType& rRelationMatrix,
LinkConstraint::MatrixType& rHessian,
LinkConstraint::VectorType& rConstraintGaps,
const std::array<ValueType,6>& rLastPositions,
const std::array<ValueType,6>& rLastDisplacements,
const unsigned Dimensions)
{
// Set output sizes.
rRelationMatrix = ZeroMatrix(1, 2 * Dimensions);
rHessian = ZeroMatrix(2 * Dimensions, 2 * Dimensions);
rConstraintGaps = ZeroVector(1);

// Compute constraint violation.
double current_norm_square = 0.0;
for (std::size_t i_component=0ul; i_component<Dimensions; ++i_component) {
const auto current_diff = rLastPositions[i_component] - rLastPositions[i_component + Dimensions]
+ rLastDisplacements[i_component] - rLastDisplacements[i_component + Dimensions];
current_norm_square += current_diff * current_diff;
} // for i_component in range(Dimensions)

KRATOS_ERROR_IF_NOT(current_norm_square) << "degenerate link constraint";
const auto current_norm = std::sqrt(current_norm_square);

// Dof order:
// {u^0_x, ..., u^0_w, u^1_x, ..., u^1_w}
// Where w is the axis with the highest index for the provided dimensions
// (e.g.: z-axis in 3 dimensions).

for (std::size_t i_component=0u; i_component<Dimensions; ++i_component) {
const auto current_diff = rLastPositions[i_component] - rLastPositions[i_component + Dimensions]
+ rLastDisplacements[i_component] - rLastDisplacements[i_component + Dimensions];

rRelationMatrix(0, i_component) = current_diff / current_norm;
rRelationMatrix(0, i_component + Dimensions) = -rRelationMatrix(0, i_component);

const auto hessian_entry = (current_norm - current_diff * current_diff / current_norm) / current_norm;

rHessian(i_component, i_component) = hessian_entry;
rHessian(i_component, i_component + Dimensions) = -hessian_entry;
rHessian(i_component + Dimensions, i_component) = -hessian_entry;
rHessian(i_component + Dimensions, i_component + Dimensions) = hessian_entry;
} // for i_component in range(mDimensions)
}


static LinkConstraint::DofPointerVectorType CollectDofs(Node& rFirst,
Node& rSecond,
const std::size_t Dimensions)
{
DofPointerVectorType dofs;

KRATOS_TRY
using ValueType = double;

const std::array<const Variable<ValueType>*,3> displacement_components {
&DISPLACEMENT_X,
&DISPLACEMENT_Y,
&DISPLACEMENT_Z
};

std::array<Node*, 2> nodes {&rFirst, &rSecond};
dofs.resize(2 * Dimensions);

// Collect dofs from nodes in the following order:
// {u^0_x, ..., u^0_w, u^1_x, ..., u^1_w}
// Where w is the axis with the highest index for the provided dimensions
// (e.g.: z-axis in 3 dimensions).
for (std::size_t i_dimension=0ul; i_dimension<Dimensions; ++i_dimension) {
const auto component_id = displacement_components[i_dimension]->Key();

for (std::size_t i_node=0ul; i_node<2; ++i_node) {
Node& r_node = *nodes[i_node];
const auto it_dof = std::find_if(r_node.GetDofs().begin(),
r_node.GetDofs().end(),
[component_id](auto& rp_dof){
return rp_dof->GetVariable().Key() == component_id;
});
KRATOS_ERROR_IF(it_dof == r_node.GetDofs().end())
<< "cannot find DoF " << displacement_components[i_dimension]->Name()
<< " in node " << r_node.Id();
dofs[i_node * Dimensions + i_dimension] = it_dof->get();
} // for i_node in range(2)
} // for i_dimension in range(Dimensions)
KRATOS_CATCH("")

return dofs;
}


void FetchNodePositions(std::array<ValueType,6>& rPositions,
std::array<ValueType,6>& rDisplacements) const {
KRATOS_TRY

const std::array<const Variable<Impl::ValueType>*,3> displacement_components {
&DISPLACEMENT_X,
&DISPLACEMENT_Y,
&DISPLACEMENT_Z
};

for (std::size_t i_component=0u; i_component<mDimensions; ++i_component) {
for (std::size_t i_node=0u; i_node<2; ++i_node) {
const std::size_t i_dof = i_component + (i_node ? mDimensions : 0u);
rPositions[i_dof] = mNodePair[i_node]->Coordinates()[i_component];
rDisplacements[i_dof] = mNodePair[i_node]->GetSolutionStepValue(*displacement_components[i_component]);
} // for i_node in range(2)
} // for i_component in range(mDimensions)

KRATOS_CATCH("")
}


std::size_t mDimensions;

bool mIsMeshMoved;

/// @details MasterSlaveConstraint::GetSlaveDofsVector and MasterSlaveConstraint::GetMasterDofsVector
/// require arrays of mutable Dof pointers, which are only obtainable from mutable nodes,
/// so the nodes' pointers stored here cannot be immutable. Risky business.
std::array<Node*,2> mNodePair;

std::array<ValueType,6> mLastPositions;

std::array<ValueType,6> mLastDisplacements;
}; // struct LinkConstraint::Impl


LinkConstraint::LinkConstraint(const IndexType Id,
Node& rFirst,
Node& rSecond,
const std::size_t Dimensions,
bool IsMeshMoved)
: MultifreedomConstraint(/*Id : */Id,
/*rDofs : */Impl::CollectDofs(rFirst, rSecond, Dimensions),
/*rConstraintLabels: */std::vector<std::size_t> {Id}),
mpImpl(new Impl{/*mDimensions : */Dimensions,
/*mIsMeshMoved : */IsMeshMoved,
/*mNodePair : */{&rFirst, &rSecond},
/*mLastPositions : */{0.0, 0.0, 0.0, 0.0, 0.0, 0.0},
/*mLastDisplacements : */{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}})
{
this->Data().GetValue(CONSTITUTIVE_MATRIX) = ZeroMatrix(0);
this->Data().GetValue(INTERNAL_FORCES_VECTOR) = ZeroVector(0);
}


LinkConstraint::~LinkConstraint() = default;


MasterSlaveConstraint::Pointer LinkConstraint::Clone(IndexType NewId) const
{
KRATOS_TRY
auto p_other = LinkConstraint::Pointer(
new LinkConstraint(NewId,
*mpImpl->mNodePair.front(),
*mpImpl->mNodePair.back(),
mpImpl->mDimensions,
mpImpl->mIsMeshMoved)
);
return p_other;
KRATOS_CATCH("")
}


void LinkConstraint::Initialize([[maybe_unused]] const ProcessInfo&)
{
}


void LinkConstraint::InitializeSolutionStep(const ProcessInfo&)
{
KRATOS_TRY
// Store displacements before nonlinear iterations begin.
// At this point, displacements are at their last converged
// state, when the constraint is supposed to be still satisfied.
mpImpl->FetchNodePositions(mpImpl->mLastPositions,
mpImpl->mLastDisplacements);

if (!mpImpl->mIsMeshMoved)
for (std::size_t i_component=0ul; i_component<mpImpl->mLastPositions.size(); ++i_component)
mpImpl->mLastPositions[i_component] += mpImpl->mLastDisplacements[i_component];

Impl::ComputeRelationMatrix(this->Data().GetValue(CONSTITUTIVE_MATRIX),
this->GetHessian(),
this->Data().GetValue(INTERNAL_FORCES_VECTOR),
mpImpl->mLastPositions,
mpImpl->mLastDisplacements,
mpImpl->mDimensions);
KRATOS_CATCH("")
}


void LinkConstraint::InitializeNonLinearIteration(const ProcessInfo&)
{
KRATOS_TRY
[[maybe_unused]] std::array<Impl::ValueType,6> dummy;
mpImpl->FetchNodePositions(dummy, mpImpl->mLastDisplacements);

Impl::ComputeRelationMatrix(this->Data().GetValue(CONSTITUTIVE_MATRIX),
this->GetHessian(),
this->Data().GetValue(INTERNAL_FORCES_VECTOR),
mpImpl->mLastPositions,
mpImpl->mLastDisplacements,
mpImpl->mDimensions);
KRATOS_CATCH("")
}


void LinkConstraint::FinalizeNonLinearIteration(const ProcessInfo& rProcessInfo)
{
}


void LinkConstraint::FinalizeSolutionStep(const ProcessInfo&)
{
this->Data().GetValue(CONSTITUTIVE_MATRIX).clear();
this->Data().GetValue(INTERNAL_FORCES_VECTOR).clear();
}


void LinkConstraint::Finalize(const ProcessInfo&)
{
}


void LinkConstraint::CalculateLocalSystem(MatrixType& rRelationMatrix,
VectorType& rConstraintGaps,
[[maybe_unused]] const ProcessInfo& rProcessInfo) const
{
rRelationMatrix = this->GetData().GetValue(CONSTITUTIVE_MATRIX);
rConstraintGaps = this->GetData().GetValue(INTERNAL_FORCES_VECTOR);
}


int LinkConstraint::Check(const ProcessInfo& rProcessInfo) const
{
// Check whatever the base class checks.
MasterSlaveConstraint::Check(rProcessInfo);

// Restrict dimensions to 1, 2, or 3.
KRATOS_ERROR_IF_NOT(0 < mpImpl->mDimensions || mpImpl->mDimensions <= 3) << "unsupported dimensions (" << mpImpl->mDimensions << ")";

// Make sure that the nodes have the necessary Dofs.
const std::array<const Variable<Impl::ValueType>*,3> displacement_components {
&DISPLACEMENT_X,
&DISPLACEMENT_Y,
&DISPLACEMENT_Z
};

for (unsigned i_component=0u; i_component<mpImpl->mDimensions; ++i_component) {
for (unsigned i_node=0u; i_node<2; ++i_node) {
KRATOS_ERROR_IF_NOT(mpImpl->mNodePair[i_node]->HasDofFor(*displacement_components[i_component]))
<< "node " << mpImpl->mNodePair[i_node]->Id()
<< " has no Dof for " << displacement_components[i_component]->Name();
} // for i_node in range(2)
} // for i_component in range(mDimensions)

// Check for overlapping nodes.
constexpr Impl::ValueType tolerance = 1e-16;
KRATOS_ERROR_IF(norm_2(mpImpl->mNodePair.front()->Coordinates() - mpImpl->mNodePair.back()->Coordinates()) < tolerance)
<< "coincident nodes in LinkConstraint";

return 0;
}


void LinkConstraint::save(Serializer& rSerializer) const
{
KRATOS_SERIALIZE_SAVE_BASE_CLASS(rSerializer, MultifreedomConstraint);
rSerializer.save("Dimensions", mpImpl->mDimensions);
rSerializer.save("Nodes", mpImpl->mNodePair);
// The rest of the private members should be computed/cached after restarting.
}


void LinkConstraint::load(Serializer& rDeserializer)
{
KRATOS_SERIALIZE_LOAD_BASE_CLASS(rDeserializer, MultifreedomConstraint);
rDeserializer.load("Dimensions", mpImpl->mDimensions);
rDeserializer.load("Nodes", mpImpl->mNodePair);
}


std::ostream& operator<<(std::ostream& rStream, const LinkConstraint& rInstance)
{
return rStream << "LinkConstraint between nodes "
<< rInstance.mpImpl->mNodePair.front()->Id()
<< " and "
<< rInstance.mpImpl->mNodePair.back()->Id();
}


} // namespace Kratos
Loading
Loading