Module for structural analysis with solids (gsElasticity
) or Kirchhoff-Love shells (gsKLShell
).
CMake flags | -DGISMO_OPTIONAL="<other submodules>;gsStructuralAnalysis;gsSpectra" |
---|---|
License | MPL 2.0 |
OS support | Linux, Windows, macOS |
Build status | CDash |
Repository | gismo/gismo |
Status | completed |
Developer | Hugo Verhelst |
Maintainer | h.m.verhelst@tudelft.nl |
Last checked | 09-12-2021 |
gsSpectra
via -cmake . -DGISMO_OPTIONAL="<other submodules>;gsSpectra"
. The use of gsSpectra
is not required, but strongly adviced.
cd path/to/build/dir
cmake . -DGISMO_OPTIONAL="<other submodules>;gsStructuralAnalysis;gsSpectra"
make
The gsStructuralAnalysis
module provides the following analysis tools:
gsStaticAnalysis
Requires (nonlinear) stiffness matrix and a right-hand side (residual for nonlinear). Simply solves Newton iterations.gsModalSolver
Solves the vibration problem to find eigenfrequencies and mode shapes given linear mass and stiffness matrices.gsBucklingSolver
Solves the a buckling eigenvalue problem given a solution u from a linear analysis, the linear stiffness matrix and the jacobian given u.gsALMBase
Used for nonlinear buckling analysis (i.e. post buckling analysis). It includes arc-length schemes, extended arc-length methods and branch-switching methods.gsAPALM
Parallel implementation of the arc-length methodgsTimeIntegrator
Solves the (nonlinear) second-order structural dynamics problem.
All the tools in the gsStructuralAnalysis
structural mass matrices, (linear/nonlinear) siffness matrices and forcing vectors/jacobians. The nonlinear modules typically work with jacobians and residuals of the following form (example using gsThinShellAssembler
):
- Jacobian with solution u; K(u):
gsStructuralAnalysisOps<real_t>::Jacobian_t Jacobian = [&assembler,&mp_def](gsVector<real_t> const &x, gsSparseMatrix<real_t> & m)
{
ThinShellAssemblerStatus status;
assembler->constructSolution(x,mp_def);
status = assembler->assembleMatrix(mp_def);
m = assembler->matrix();
return status == ThinShellAssemblerStatus::Success;
};
- Residual with solution u; R(u):
// Function for the Residual
gsStructuralAnalysisOps<real_t>::Residual_t Residual = [&assembler,&mp_def](gsVector<real_t> const &x, gsVector<real_t> & result)
{
ThinShellAssemblerStatus status;
assembler->constructSolution(x,mp_def);
status = assembler->assembleVector(mp_def);
result = assembler->rhs();
return status == ThinShellAssemblerStatus::Success;
};
- Arc-Length method residual with solution u, load factor lambda and linear forcing vector F; R(u,\lambda,F):
gsStructuralAnalysisOps<real_t>::Residual_t Residual = [&assembler,&mp_def](gsVector<real_t> const &x, real_t lambda, gsVector<real_t> & result)
{
ThinShellAssemblerStatus status;
assembler.constructSolution(x,mp_def);
assembler.assembleVector(mp_def);
gsVector<T> Fint = -(assembler.rhs() - force);
gsVector<T> result = Fint - lam * force;
return status == ThinShellAssemblerStatus::Success;
};
Where the std::function
types are the ones accepted by the gsStructuralAnalysis module. See the struct
gsStructuralAnalysisOps
in the file gsStructuralAnalysisTools/gsStructuralAnalysisTypes
To use the gsStaticAnalysis
class for a structural assembler (gsElasticityAssembler
or gsThinShellAssembler
), one simply performs the steps below.
gsSparseMatrix<T> matrix = any_assembler.function_for_StiffnessMatrix();
gsVector<T> vector = any_assembler.function_for_rhs();
gsStaticNewton<T> staticSolver(matrix,vector);
gsSparseMatrix<T> matrix = any_assembler.function_for_StiffnessMatrix();
gsVector<T> vector = any_assembler.function_for_rhs();
Jacobian_t<T> Jacobian = { your_jacobian };
Residual_t<T> Residual = { your_residual };
gsStaticNewton<T> staticSolver(matrix,vector,Jacobian,Residual); // see above documentation for definitions of Jacobian_t and Residual_t
// get options
gsOptionList solverOptions = staticSolver.options();
// change some options
solverOptions.setInt("Verbose",1);
solverOptions.setInt("MaxIterations",10);
solverOptions.setReal("Tolerance",1e-6);
// set options
staticSolver.setOptions(solverOptions);
gsVector<T> solVector = staticSolver.solveNonlinear();
To use the gsBucklingSolver
class for a structural assembler (gsElasticityAssembler
or gsThinShellAssembler
), one simply performs the following steps:
Jacobian_t<T> Jacobian = { your_jacobian };
Residual_t<T> Residual = { your_residual };
gsBucklingSolver<T> buckling(K_L,rhs,K_NL);
// computation using Eigen
buckling.compute();
// computation using gsSpectra for 10 buckling modes using a shift
buckling.computeSparse(shift,10);
// get results
gsMatrix<T> values = buckling.values();
gsMatrix<T> vectors = buckling.vectors();
The implementation includes the Riks Method, the (Consistent) Crisfield Method and a simple Load Control Method.
To use the gsALMBase
class (here the derived gsALMCrisfield
) for a structural assembler (gsElasticityAssembler
or gsThinShellAssembler
), one simply performs the following steps:
gsVector<T> vector = any_assembler.function_for_rhs(); // this is the force of the linear system
Jacobian_t<T> Jacobian = { your_jacobian };
ALResidual_t<T> ALResidual = { your_arclenght_residual };
gsALMCrisfield<T> arclength(Jacobian, ALResidual, Force);
// example for setting options
arcLength.options().setInt("Method",method); // method 0: 1: 2: 3: 4:
arcLength.setLength(dL); // set arclength
arcLength.applyOptions();
arcLength.initialize();
for (index_t k=0; k<step; k++)
{
gsInfo<<"Load step "<< k<<"\n";
arcLength.step();
arcLength.computeStability(quasiNewton);
if (arcLength.stabilityChange())
{
gsInfo<<"Bifurcation spotted!"<<"\n";
arcLength.computeSingularPoint(false);
arcLength.switchBranch();
}
gsVector<T> solVector = arcLength.solutionU();
T LoadFactor = arcLength.solutionL();
}
To use the gsModalAnalysis
class for a structural assembler (gsElasticityAssembler
or gsThinShellAssembler
), one simply performs the following steps:
gsSparseMatrix<T> stif = any_assembler.function_for_StiffnessMatrix();
gsSparseMatrix<T> mass = any_assembler.function_for_MassMatrix();
gsBucklingSolver<T> modal(stif,mass);
// computation using Eigen
modal.compute();
// computation using gsSpectra for 10 buckling modes using a shift
modal.computeSparse(shift,10);
// get results
gsMatrix<T> values = modal.values();
gsMatrix<T> vectors = modal.vectors();