12#ifndef __ARC_LENGTH_TOOLS_HPP__
13#define __ARC_LENGTH_TOOLS_HPP__
87 SmartPetscObj<Vec>
x0;
88 SmartPetscObj<Vec>
dx;
93 MoFEMErrorCode
setS(
double s);
127#ifdef __SNESCTX_HPP__
133struct ArcLengthSnesCtx :
public SnesCtx {
136 ArcLengthSnesCtx(
MoFEM::Interface &m_field,
const std::string &problem_name,
138 :
SnesCtx(m_field, problem_name), arcPtrRaw(arc_ptr_raw) {}
140 ArcLengthSnesCtx(
MoFEM::Interface &m_field,
const std::string &problem_name,
141 boost::shared_ptr<ArcLengthCtx> arc_ptr)
142 :
SnesCtx(m_field, problem_name), arcPtrRaw(arc_ptr.get()),
146 boost::shared_ptr<ArcLengthCtx> arcPtr;
157struct ArcLengthTsCtx :
public TsCtx {
162 const std::string &problem_name,
164 : TsCtx(m_field, problem_name), arcPtrRaw(arc_ptr_raw) {}
167 boost::shared_ptr<ArcLengthCtx> arc_ptr)
168 : TsCtx(m_field, problem_name), arcPtrRaw(arc_ptr.get()),
172 boost::shared_ptr<ArcLengthCtx> arcPtr;
212 string problem_name);
217 string problem_name);
219 MoFEMErrorCode
setLambda(Vec ksp_x,
double *
lambda, ScatterMode scattermode);
238 SmartPetscObj<PC>
pC;
243 boost::shared_ptr<ArcLengthCtx> arc_ptr);
246 boost::shared_ptr<ArcLengthCtx> arc_ptr);
287 ZeroFLmabda(boost::shared_ptr<ArcLengthCtx> arc_ptr);
292#ifdef __DIRICHLET_HPP__
300struct AssembleFlambda :
public FEMethod {
302 boost::shared_ptr<ArcLengthCtx> arcPtr;
304 AssembleFlambda(boost::shared_ptr<ArcLengthCtx> arc_ptr,
305 boost::shared_ptr<DirichletDisplacementBc> bc =
306 boost::shared_ptr<DirichletDisplacementBc>());
308 MoFEMErrorCode preProcess();
309 MoFEMErrorCode operator()();
310 MoFEMErrorCode postProcess();
312 inline void pushDirichletBC(boost::shared_ptr<DirichletDisplacementBc> bc) {
317 std::vector<boost::shared_ptr<DirichletDisplacementBc>> bCs;
340 const bool assemble =
false);
constexpr auto field_name
Store variables for ArcLength analysis.
SmartPetscObj< Vec > db
db derivative of f(dx*dx), i.e. db = d[ f(dx*dx) ]/dx
double s
arc length radius
double res_lambda
f_lambda - s
DofIdx getPetscLocalDofIdx()
Get local index of load factor.
SmartPetscObj< Vec > dx
dx = x-x0
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
SmartPetscObj< Vec > F_lambda
F_lambda reference load vector.
MoFEMErrorCode setS(double s)
set arc radius
MoFEM::Interface & mField
double F_lambda2
inner_prod(F_lambda,F_lambda);
double dIag
diagonal value
double dx2
inner_prod(dX,dX)
virtual ~ArcLengthCtx()=default
FieldData & getFieldData()
Get value of load factor.
SmartPetscObj< Vec > ghostDiag
SmartPetscObj< Vec > x0
displacement vector at beginning of step
double dLambda
increment of load factor
double beta
force scaling factor
SmartPetscObj< Vec > ghosTdLambda
int getPart()
Get proc owning lambda dof.
NumeredDofEntity * arcDofRawPtr
DofIdx getPetscGlobalDofIdx()
Get global index of load factor.
SmartPetscObj< Vec > xLambda
solution of eq. K*xLambda = F_lambda
shell matrix for arc-length method
friend MoFEMErrorCode ArcLengthMatMultShellOp(Mat A, Vec x, Vec f)
boost::shared_ptr< ArcLengthCtx > arcPtr
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)
boost::shared_ptr< ArcLengthCtx > arcPtr
MoFEMErrorCode postProcess()
~SimpleArcLengthControl()
Implementation of spherical arc-length method.
boost::shared_ptr< ArcLengthCtx > arcPtr
MoFEMErrorCode postProcess()
virtual MoFEMErrorCode calculateDxAndDlambda(Vec x)
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)
boost::shared_ptr< ArcLengthCtx > arcPtr
MoFEMErrorCode preProcess()