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