10#ifndef __ARC_LENGTH_TOOLS_HPP__
11 #define __ARC_LENGTH_TOOLS_HPP__
85 SmartPetscObj<Vec>
x0;
86 SmartPetscObj<Vec>
dx;
91 MoFEMErrorCode
setS(
double s);
125 #ifdef __SNESCTX_HPP__
131struct ArcLengthSnesCtx :
public SnesCtx {
134 ArcLengthSnesCtx(
MoFEM::Interface &m_field,
const std::string &problem_name,
136 : SnesCtx(m_field, problem_name), arcPtrRaw(arc_ptr_raw) {}
138 ArcLengthSnesCtx(
MoFEM::Interface &m_field,
const std::string &problem_name,
139 boost::shared_ptr<ArcLengthCtx> arc_ptr)
140 : SnesCtx(m_field, problem_name), arcPtrRaw(arc_ptr.get()),
144 boost::shared_ptr<ArcLengthCtx> arcPtr;
155struct ArcLengthTsCtx :
public TsCtx {
160 const std::string &problem_name,
162 : TsCtx(m_field, problem_name), arcPtrRaw(arc_ptr_raw) {}
165 boost::shared_ptr<ArcLengthCtx> arc_ptr)
166 : TsCtx(m_field, problem_name), arcPtrRaw(arc_ptr.get()),
170 boost::shared_ptr<ArcLengthCtx> arcPtr;
210 string problem_name);
215 string problem_name);
217 MoFEMErrorCode
setLambda(Vec ksp_x,
double *
lambda, ScatterMode scattermode);
236 SmartPetscObj<PC>
pC;
241 boost::shared_ptr<ArcLengthCtx> arc_ptr);
244 boost::shared_ptr<ArcLengthCtx> arc_ptr);
285 ZeroFLmabda(boost::shared_ptr<ArcLengthCtx> arc_ptr);
290 #ifdef __DIRICHLET_HPP__
298struct AssembleFlambda :
public FEMethod {
300 boost::shared_ptr<ArcLengthCtx> arcPtr;
302 AssembleFlambda(boost::shared_ptr<ArcLengthCtx> arc_ptr,
303 boost::shared_ptr<DirichletDisplacementBc> bc =
304 boost::shared_ptr<DirichletDisplacementBc>());
306 MoFEMErrorCode preProcess();
307 MoFEMErrorCode operator()();
308 MoFEMErrorCode postProcess();
310 inline void pushDirichletBC(boost::shared_ptr<DirichletDisplacementBc> bc) {
315 std::vector<boost::shared_ptr<DirichletDisplacementBc>> bCs;
338 const bool assemble =
false);
constexpr auto field_name
Store variables for ArcLength analysis.
double s
arc length radius
SmartPetscObj< Vec > xLambda
solution of eq. K*xLambda = F_lambda
double res_lambda
f_lambda - s
DofIdx getPetscLocalDofIdx()
Get local index of load factor.
NumeredDofEntity * arcDofRawPtr
MoFEMErrorCode setAlphaBeta(double alpha, double beta)
set parameters controlling arc-length equations alpha controls off diagonal therms beta controls diag...
double alpha
displacement scaling factor
MoFEMErrorCode setS(double s)
set arc radius
double F_lambda2
inner_prod(F_lambda,F_lambda);
SmartPetscObj< Vec > dx
dx = x-x0
double dIag
diagonal value
double dx2
inner_prod(dX,dX)
virtual ~ArcLengthCtx()=default
FieldData & getFieldData()
Get value of load factor.
MoFEM::Interface & mField
SmartPetscObj< Vec > F_lambda
F_lambda reference load vector.
SmartPetscObj< Vec > ghostDiag
SmartPetscObj< Vec > ghosTdLambda
double dLambda
increment of load factor
double beta
force scaling factor
int getPart()
Get proc owning lambda dof.
SmartPetscObj< Vec > db
db derivative of f(dx*dx), i.e. db = d[ f(dx*dx) ]/dx
DofIdx getPetscGlobalDofIdx()
Get global index of load factor.
SmartPetscObj< Vec > x0
displacement vector at beginning of step
shell matrix for arc-length method
boost::shared_ptr< ArcLengthCtx > arcPtr
friend MoFEMErrorCode ArcLengthMatMultShellOp(Mat A, Vec x, Vec f)
MoFEMErrorCode setLambda(Vec ksp_x, double *lambda, ScatterMode scattermode)
virtual ~ArcLengthMatShell()=default
Deprecated interface functions.
structure for Arc Length pre-conditioner
friend MoFEMErrorCode PCApplyArcLength(PC pc, Vec pc_f, Vec pc_x)
boost::shared_ptr< ArcLengthCtx > arcPtr
friend MoFEMErrorCode PCSetupArcLength(PC pc)
SmartPetscObj< Mat > shellAij
MoFEMErrorCode preProcess()
MoFEMErrorCode calculateDb()
Calculate db.
MoFEMErrorCode operator()()
double calculateLambdaInt()
Calculate internal lambda.
MoFEMErrorCode calculateDxAndDlambda(Vec x)
MoFEMErrorCode postProcess()
boost::shared_ptr< ArcLengthCtx > arcPtr
~SimpleArcLengthControl()
Implementation of spherical arc-length method.
MoFEMErrorCode postProcess()
virtual MoFEMErrorCode calculateDxAndDlambda(Vec x)
boost::shared_ptr< ArcLengthCtx > arcPtr
MoFEMErrorCode preProcess()
MoFEMErrorCode operator()()
virtual ~SphericalArcLengthControl()
virtual MoFEMErrorCode calculateDb()
Calculate db.
virtual double calculateLambdaInt()
Calculate f_lambda(dx,lambda)
virtual MoFEMErrorCode calculateInitDlambda(double *dlambda)
virtual MoFEMErrorCode setDlambdaToX(Vec x, double dlambda)
MoFEMErrorCode preProcess()
boost::shared_ptr< ArcLengthCtx > arcPtr