Calls to the callables of the non-linear solvers (pyfe3d.solver.callbacks)#
The callables of Analysis, calc_fext, calc_fint,
calc_kC and calc_kG, may depend on the load factor and on the
configuration through optional keyword arguments, which are passed only
when the callable declares them explicitly in its signature (a **kwargs
does not count), such that the simplest callables are called with the
minimum set of arguments:
inc: the current load factor, passed tocalc_fint,calc_kCandcalc_kG. It allows configuration-dependent loads, e.g. follower pressures, whose configuration-dependent part enterscalc_fintand whose load stiffness enterscalc_kCorcalc_kG, both scaled by the load factor.c: the current configuration, passed tocalc_fext, which must then return the load vector of that configuration for a unit load factor. The arc-length solvers use it in the predictor and in the constraint instead of the constant reference vectorcalc_fext(inc=1.).lbd: the current load factor, passed tocalc_fexttogether withc, for a load vector that depends on the load factor as well, e.g. prescribed displacements imposed exactly as linear constraints. The keywordinckeeps its meaning, the factor that multiplies the returned vector, and the solvers keep callingcalc_fext(inc=1., ...). Whencalc_fextdeclareslbd:the arc-length solvers pass
lbdwithcin the predictor and in the constraint;the arc-length solvers scale the displacements with the linear solution of the load vector at
c = 0,lbd = 0, instead of the linear solution of the reference vectorcalc_fext(inc=1.), and the Newton-Raphson solver uses this linear solution as the predictor of its first increment;the load factor times the load vector is an additional reference of the convergence criteria, see
convergence;calc_fext(c=c, lbd=lbd)is called at the configurations where the tangent stiffness matrix is updated, right aftercalc_kCandcalc_kGat the samecand load factor, such that the callables may share their computations, and the last load vector evaluated is the reference of the convergence checks until the next update.
lbdis never passed by the linear static analysis,Analysis.static(NLgeom=False).
The prescribed displacements of Analysis with bu and uk
are implemented with these keyword arguments, see FreeDofs.
Notes#
With inc, the residual is
with calc_kC + calc_kG its exact Jacobian \(\partial \boldsymbol{R}/\partial \boldsymbol{c}\).
With c, calc_fext(inc=1., c=c) is \(-\partial \boldsymbol{R}/\partial \lambda\) at
\(c\).
With lbd, prescribed displacements imposed exactly as linear
constraints \(\boldsymbol{c} = \boldsymbol{Z} \boldsymbol{c}_r + \boldsymbol{c}_{p0} + \lambda \boldsymbol{c}_{p1}\) give the
reduced residual
which has \(-\partial \boldsymbol{R}_r/\partial \lambda = \boldsymbol{Z}^\top(\boldsymbol{F}_{ext} - \boldsymbol{K}_T
\boldsymbol{c}_{p1})\), with \(\boldsymbol{K}_T\) evaluated at the current configuration and
load factor, the vector that calc_fext(inc=1., c=c, lbd=lbd) must
return. Under a prescribed displacement alone the reference vector and the
reduced internal force vector both vanish at equilibrium, and the
convergence criteria use \(-\lambda \, \partial \boldsymbol{R}/\partial \lambda\) as an
additional reference; the displacements of the arc-length solvers are
scaled with the linear solution of \(-\partial \boldsymbol{R}/\partial \lambda\) at \(\boldsymbol{c} = \boldsymbol{0},
\lambda = 0\), since the reference vector calc_fext(inc=1.) may then be
null.
- pyfe3d.solver.callbacks.accepts_kwarg(func, name)#
Tell whether
funcdeclares the keyword argumentnameThe argument is declared when it is a named parameter of the signature, positional-or-keyword or keyword-only; a
**kwargsdoes not count. A callable whose signature cannot be read byinspect.signature()does not declare it.- Parameters:
- funccallable
Function or method to inspect.
- namestr
Name of the keyword argument.
- Returns:
- acceptsbool
Truewhenfunchas a parameternamethat can be passed by keyword.
See also
calc_fint,calc_kT,calc_load_vectorcalls that depend on it.
- pyfe3d.solver.callbacks.calc_fint(pb, c, lbd)#
pb.calc_fintatc, withinc=lbdwhen acceptedCalls
pb.calc_fint(c=c, silent=True), addinginc=lbdonly whenpb.calc_fintdeclaresinc, seeaccepts_kwarg().
- pyfe3d.solver.callbacks.calc_kT(pb, c, lbd)#
Tangent stiffness matrix
calc_kC + calc_kGatcCalls
pb.calc_kC(c=c, NLgeom=True, silent=True)andpb.calc_kG(c=c, NLgeom=True, silent=True), each withinc=lbdonly when it declaresinc, seeaccepts_kwarg(), and returns their sum.- Parameters:
- Returns:
- kTsparse_matrix or np.ndarray
The sum of the matrices returned by
pb.calc_kCandpb.calc_kG, of the type given by them.
- pyfe3d.solver.callbacks.calc_load_vector(pb, c, fext, lbd=None)#
Load vector, minus the derivative of the residual with respect to the load factor
Returns the load vector
qgiven bypb.calc_fextfor a unit load factor at the configurationcand the load factorlbd, used by the solvers in the predictors, in the arc-length constraint and in the convergence criteria. With prescribed displacements,qis not their reaction force: it has the size of the reduced problem and acts on the free degrees-of-freedom.pb.calc_fextis called withinc=1.and only with the keyword arguments that it declares:c=c, when it declaresc;lbd=lbd, when it declareslbdandlbdis notNone.
When none of them is passed,
qis the constant reference vector, andfextis returned without callingpb.calc_fext.- Parameters:
- pbobject
Object providing
calc_fext.- cnp.ndarray
Configuration.
- fextnp.ndarray
Reference vector
pb.calc_fext(inc=1.).- lbdfloat or None, optional
Load factor, dimensionless. Default
None.
- Returns:
- qnp.ndarray
\(-\partial \boldsymbol{R}/\partial \lambda\), of the size of
c.
Notes
\(\boldsymbol{q} = -\partial \boldsymbol{R}/\partial \lambda\) is the external load vector only for loads that do not depend on the configuration; with prescribed displacements imposed exactly it also contains \(-\boldsymbol{Z}^\top \boldsymbol{K}_T \boldsymbol{c}_{p1}\), see the module documentation, i.e. the out-of-balance force produced by a unit increment of the load factor at the current configuration with the free degrees-of-freedom held fixed. The reaction is a quantity of the full problem, \(\boldsymbol{F}_{int}(\boldsymbol{c}) - \lambda \boldsymbol{F}_{ext}\) at the constrained degrees-of-freedom.
- pyfe3d.solver.callbacks.is_load_configuration_dependent(pb)#
Tell whether
pb.calc_fextaccepts the configurationcWhen it does, the solvers evaluate the load vector at the current configuration, see
calc_load_vector(), and the linear static analysis iterates on the load, seeAnalysis.static().- Parameters:
- pbobject
Object providing
calc_fext.
- Returns:
- dependentbool
Truewhenpb.calc_fextdeclares the keyword argumentc, seeaccepts_kwarg().
- pyfe3d.solver.callbacks.is_load_factor_dependent(pb)#
Tell whether
pb.calc_fextaccepts the load factorlbdWhen it does, the solvers pass the current load factor to
calc_fexttogether withc, seecalc_load_vector()and the module documentation.- Parameters:
- pbobject
Object providing
calc_fext.
- Returns:
- dependentbool
Truewhenpb.calc_fextdeclares the keyword argumentlbd, seeaccepts_kwarg().