Skip to content

AlgoSkyNet/gsStructuralAnalysis

 
 

Repository files navigation

GitHub commits since latest release GitHub commit activity

gsStructuralAnalysis

Module for structural analysis with solids (gsElasticity) or Kirchhoff-Love shells (gsKLShell).

CMake flags -DGISMO_OPTIONAL="<other submodules>;gsStructuralAnalysis;gsSpectra"
License GitHub License
DOI DOI
OS support Linux, Windows, macOS
Build status ci
Developers/maintainers Static Badge Static Badge

Dependencies

gsSpectra via -cmake . -DGISMO_OPTIONAL="<other submodules>;gsSpectra". The use of gsSpectra is not required, but strongly adviced.

Installation

cd path/to/build/dir cmake . -DGISMO_OPTIONAL="<other submodules>;gsStructuralAnalysis;gsSpectra" make 

Use of the gsStructuralAnalysis module

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 method
  • gsTimeIntegrator        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

Linear and nonlinear static analysis with gsStaticAnalysis

To use the gsStaticAnalysis class for a structural assembler (gsElasticityAssembler or gsThinShellAssembler), one simply performs the steps below.

Initialization of nonlinear solver
gsSparseMatrix<T> matrix = any_assembler.function_for_StiffnessMatrix(); gsVector<T> vector = any_assembler.function_for_rhs(); gsStaticNewton<T> staticSolver(matrix,vector); 
Initialization of nonlinear solver
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 
General use
// 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(); 

Linear buckling analysis with gsBucklingSolver

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(); 

Post-Buckling analysis using arc-length methods

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(); } 

Linear vibration analysis with gsModalAnalysis

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(); 

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • C++ 99.3%
  • CMake 0.7%