G+Smo  25.01.0
Geometry + Simulation Modules
 
Loading...
Searching...
No Matches
Tutorial: Non-Linear solid analysis using the gsStructuralAnalysis module

Static simulations of a solid

Annotated source file

Here is the full file nonlinear_solid_static.cpp. Clicking on a function or class name will lead you to its reference documentation.

#include <gismo.h>
#ifdef gsElasticity_ENABLED
#endif
using namespace gismo;
#ifdef gsElasticity_ENABLED
int main(int argc, char *argv[])
{
bool plot = false;
index_t numRefine = 1;
index_t numElevate = 1;
gsCmdLine cmd("Linear shell tutorial.");
cmd.addInt( "e", "degreeElevation","Number of degree elevation steps to perform before solving (0: equalize degree in all directions)", numElevate );
cmd.addInt( "r", "uniformRefine", "Number of Uniform h-refinement steps to perform before solving", numRefine );
cmd.addSwitch("plot", "Create a ParaView visualization file with the solution", plot);
try { cmd.getValues(argc,argv); } catch (int rv) { return rv; }
// Initialize [ori]ginal and [def]ormed geometry
std::string fileName = "paraboloid_volume.xml";
gsReadFile<>(fileName, ori);
// p-refine
if (numElevate!=0)
ori.degreeElevate(numElevate);
// h-refine (only in first two directions)
for (int r =0; r < numRefine; ++r)
{
ori.uniformRefine(1,1,0);
ori.uniformRefine(1,1,1);
}
// creating basis
gsMultiBasis<> basis(ori);
// Define the boundary conditions object
// Set the geometry map for computation of the Dirichlet BCs
bc.setGeoMap(ori);
// Set the boundary conditions
gsFunctionExpr<> surf_force("0","0","-1e5",3);
for (index_t c=0; c!=3; c++)
{
bc.addCornerValue(boundary::southwestfront, 0.0, 0, c); // (corner,value, patch, unknown)
bc.addCornerValue(boundary::southeastfront, 0.0, 0, c); // (corner,value, patch, unknown)
bc.addCornerValue(boundary::northwestfront, 0.0, 0, c); // (corner,value, patch, unknown)
bc.addCornerValue(boundary::northeastfront, 0.0, 0, c); // (corner,value, patch, unknown)
}
bc.addCondition(boundary::front, condition_type::neumann, &surf_force);
bc.addCondition(boundary::front, condition_type::neumann, &surf_force);
// The surface force is defined in the physical space, i.e. 3D
gsFunctionExpr<> body_force("0","0","0",3);
gsElasticityAssembler<real_t> assembler(ori,basis,bc,body_force);
assembler.options().setReal("YoungsModulus",1.E9);
assembler.options().setReal("PoissonsRatio",0.45);
assembler.options().setInt("MaterialLaw",material_law::saint_venant_kirchhoff);
assembler.options().setInt("DirichletValues",dirichlet::l2Projection);
std::vector<gsMatrix<> > fixedDofs = assembler.allFixedDofs();
// Function for the Jacobian
{
assembler.assemble(x,fixedDofs);
m = assembler.matrix();
return true;
};
// Function for the Residual
gsStructuralAnalysisOps<real_t>::Residual_t Residual = [&fixedDofs,&assembler](gsVector<real_t> const &x, gsVector<real_t> & v)
{
assembler.assemble(x,fixedDofs);
v = assembler.rhs();
return true;
};
assembler.assemble();
gsSparseMatrix<> K = assembler.matrix();
gsVector<> F = assembler.rhs();
gsStaticNewton<real_t> solver(K,F,Jacobian,Residual);
solver.options().setInt("verbose",1);
solver.initialize();
gsInfo<<"Solving system with "<<assembler.numDofs()<<" DoFs\n";
gsStatus status = solver.solve();
GISMO_ASSERT(status==gsStatus::Success,"Solver failed");
gsVector<> solVector = solver.solution();
// constructing solution as an IGA function
assembler.constructSolution(solVector,assembler.allFixedDofs(),displ);
gsMultiPatch<> def = ori;
for (index_t p = 0; p < def.nPieces(); ++p)
def.patch(p).coefs() += displ.patch(p).coefs();
// Evaluate the solution on a reference point (parametric coordinates)
// The reference points are stored column-wise
gsMatrix<> refPoint(3,1);
refPoint<<0.5,0.5,1.0;
// Compute the values
gsVector<> physpoint = def.patch(0).eval(refPoint);
gsVector<> refVals = displ.patch(0).eval(refPoint);
// gsInfo << "Displacement at reference point: "<<numVal<<"\n";
gsInfo << "Displacement at reference point ("
<<ori.patch(0).eval(refPoint).transpose()<<"): "
<<": "<<refVals.transpose()<<"\n";
// ! [Export visualization in ParaView]
if (plot)
{
// Plot the displacements on the deformed geometry
gsField<> solField(def, displ);
gsInfo<<"Plotting in Paraview...\n";
gsWriteParaview<>( solField, "Deformation", 10000, true);
// Plot the membrane Von-Mises stresses on the geometry
assembler.constructCauchyStresses(displ,VMm,stress_components::von_mises);
gsField<> membraneStress(def,VMm, true);
gsWriteParaview(membraneStress,"MembraneStress",10000);
}
// ! [Export visualization in ParaView]
return EXIT_SUCCESS;
#else
GISMO_ERROR("The tutorial needs to be compiled with gsElasticity enabled");
return EXIT_FAILED;
#endif
}// end main
Class containing a set of boundary conditions.
Definition gsBoundaryConditions.h:342
void addCondition(int p, boxSide s, condition_type::type t, gsFunctionSet< T > *f, short_t unknown=0, bool parametric=false, int comp=-1)
Adds another boundary condition.
Definition gsBoundaryConditions.h:650
void addCornerValue(boxCorner c, T value, int p=0, short_t unknown=0, int component=-1)
Adds a boundary condition with value on a corner c of patch p for unknown component.
Definition gsBoundaryConditions.h:726
void setGeoMap(const gsFunctionSet< T > &gm)
Set the geometry map to evaluate boundary conditions.
Definition gsBoundaryConditions.h:916
Class for command-line argument parsing.
Definition gsCmdLine.h:57
Assembles the stiffness matrix and the right-hand side vector for linear and nonlinear elasticity for...
Definition gsElasticityAssembler.h:32
A scalar of vector field defined on a m_parametric geometry.
Definition gsField.h:55
Class defining a multivariate (real or vector) function given by a string mathematical expression.
Definition gsFunctionExpr.h:52
A matrix with arbitrary coefficient type and fixed or dynamic size.
Definition gsMatrix.h:41
Holds a set of patch-wise bases and their topology information.
Definition gsMultiBasis.h:37
Container class for a set of geometry patches and their topology, that is, the interface connections ...
Definition gsMultiPatch.h:100
void degreeElevate(short_t const elevationSteps=1, short_t const dir=-1)
Elevate the degree of all patches by elevationSteps, preserves smoothness.
Definition gsMultiPatch.hpp:282
gsGeometry< T > & patch(size_t i) const
Return the i-th patch.
Definition gsMultiPatch.h:292
index_t nPieces() const
Number of pieces in the domain of definition.
Definition gsMultiPatch.h:193
void uniformRefine(int numKnots=1, int mul=1, short_t const dir=-1)
Refine uniformly all patches by inserting numKnots in each knot-span with multipliplicity mul.
Definition gsMultiPatch.hpp:271
A function depending on an index i, typically referring to a patch/sub-domain. On each patch a differ...
Definition gsPiecewiseFunction.h:29
Reads an object from a data file, if such the requested object exists in the file.
Definition gsReadFile.h:43
Sparse matrix class, based on gsEigen::SparseMatrix.
Definition gsSparseMatrix.h:139
Static solver using a newton method.
Definition gsStaticNewton.h:30
A vector with arbitrary coefficient type and fixed or dynamic size.
Definition gsVector.h:37
Main header to be included by clients using the G+Smo library.
#define index_t
Definition gsConfig.h:32
#define GISMO_ERROR(message)
Definition gsDebug.h:118
#define gsInfo
Definition gsDebug.h:43
#define GISMO_ASSERT(cond, message)
Definition gsDebug.h:89
Provides linear and nonlinear elasticity systems for 2D plain strain and 3D continua.
Provides isogeometric meshing and modelling routines.
Static solver using a newton method.
Class providing Structural Analysis Utilities.
Allows to write several fields defined on the same geometry in one file, making it easier to operate ...
The G+Smo namespace, containing all definitions for the library.
gsStatus
Definition gsStructuralAnalysisTypes.h:21
@ Success
Successful.
@ neumann
Neumann type.
Definition gsBoundaryConditions.h:33
std::function< bool(gsVector< T > const &, gsSparseMatrix< T > &) > Jacobian_t
Jacobian.
Definition gsStructuralAnalysisTypes.h:86
std::function< bool(gsVector< T > const &, gsVector< T > &)> Residual_t
Residual, Fint-Fext.
Definition gsStructuralAnalysisTypes.h:68
@ saint_venant_kirchhoff
sigma = 2*mu*eps + lambda*tr(eps)*I
Definition gsBaseUtils.h:132