12#ifndef __ARC_LENGTH_TOOLS_HPP__
13#define __ARC_LENGTH_TOOLS_HPP__
87 SmartPetscObj<Vec>
x0;
88 SmartPetscObj<Vec>
dx;
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;
207 SmartPetscObj<Mat>
Aij;
212 string problem_name);
217 string problem_name);
223 boost::shared_ptr<ArcLengthCtx>
arcPtr;
237 SmartPetscObj<KSP>
kSP;
238 SmartPetscObj<PC>
pC;
240 SmartPetscObj<Mat>
Aij;
243 boost::shared_ptr<ArcLengthCtx> arc_ptr);
246 boost::shared_ptr<ArcLengthCtx> arc_ptr);
260 boost::shared_ptr<ArcLengthCtx>
arcPtr;
285 boost::shared_ptr<ArcLengthCtx>
arcPtr;
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;
336 boost::shared_ptr<ArcLengthCtx>
arcPtr;
340 const bool assemble =
false);
412 boost::shared_ptr<ArcLengthCtx>
arcPtr;
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...
ArcLengthCtx(MoFEM::Interface &m_field, const std::string &problem_name, const std::string &field_name="LAMBDA")
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)
DEPRECATED ArcLengthMatShell(Mat aij, ArcLengthCtx *arc_ptr_raw, string problem_name)
ArcLengthMatShell(Mat aij, boost::shared_ptr< ArcLengthCtx > arc_ptr, string problem_name)
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)
PCArcLengthCtx(PC pc, Mat shell_Aij, Mat aij, boost::shared_ptr< ArcLengthCtx > arc_ptr)
boost::shared_ptr< ArcLengthCtx > arcPtr
friend MoFEMErrorCode PCSetupArcLength(PC pc)
DEPRECATED PCArcLengthCtx(Mat shell_Aij, Mat aij, ArcLengthCtx *arc_ptr_raw)
DEPRECATED PCArcLengthCtx(PC pc, Mat shell_Aij, Mat aij, ArcLengthCtx *arc_ptr_raw)
SmartPetscObj< Mat > shellAij
PCArcLengthCtx(Mat shell_Aij, Mat aij, boost::shared_ptr< ArcLengthCtx > arc_ptr)
MoFEMErrorCode preProcess()
MoFEMErrorCode calculateDb()
Calculate db.
MoFEMErrorCode operator()()
SimpleArcLengthControl(boost::shared_ptr< ArcLengthCtx > &arc_ptr, const bool assemble=false)
double calculateLambdaInt()
Calculate internal lambda.
MoFEMErrorCode calculateDxAndDlambda(Vec x)
MoFEMErrorCode postProcess()
boost::shared_ptr< ArcLengthCtx > arcPtr
~SimpleArcLengthControl()
Implementation of spherical arc-length method.
virtual MoFEMErrorCode calculateDb()
Calculate db.
MoFEMErrorCode postProcess()
DEPRECATED SphericalArcLengthControl(ArcLengthCtx *arc_ptr_raw)
boost::shared_ptr< ArcLengthCtx > arcPtr
SphericalArcLengthControl(boost::shared_ptr< ArcLengthCtx > &arc_ptr)
MoFEMErrorCode preProcess()
virtual MoFEMErrorCode setDlambdaToX(Vec x, double dlambda)
MoFEMErrorCode operator()()
virtual double calculateLambdaInt()
Calculate f_lambda(dx,lambda)
virtual MoFEMErrorCode calculateDxAndDlambda(Vec x)
virtual ~SphericalArcLengthControl()
virtual MoFEMErrorCode calculateInitDlambda(double *dlambda)
ZeroFLmabda(boost::shared_ptr< ArcLengthCtx > arc_ptr)
MoFEMErrorCode preProcess()
boost::shared_ptr< ArcLengthCtx > arcPtr