56 if (
neq == -1)
_errorr(
"Number of equations was not set.");
109 Dvctr rhs, deltaXt, deltaX_, dXm1, ddX;
112 double XX, RR, RR0, XR, p;
113 double deltaLambda, Lambda, eta, DeltaLambdam1, DeltaLambda;
119 bool converged, errorOutOfRangeFlag;
124 if (
verbose) fprintf(stdout,
"XALM: Initial step length: %-15e\n", deltaL);
125 if (
verbose) fprintf(stdout,
"XALM: Iteration LoadLevel ForceError DisplError \n");
126 if (
verbose) fprintf(stdout,
"----------------------------------------------------------------------------\n");
173 p = sqrt(XX +
Psi *
Psi * RR);
179 for (i=0; i < HPsize; i++) {
181 _XX += deltaXt[ind] * deltaXt[ind];
182 _RR += (*R)[ind] * (*R)[ind];
186 p = sqrt(_XX +
Psi *
Psi * _RR);
191 for (i=0; i < HPsize; i++) {
205 DeltaLambda = deltaLambda =
sgn(XR) * deltaL / p;
206 Lambda += DeltaLambda;
212 rhs.
tmsby(DeltaLambda);
227 DeltaLambdam1 = DeltaLambda;
237 if (R0) rhs.
add(*R0);
245 if ( this->
computeDeltaLambda(deltaLambda, * dX, deltaXt, deltaX_, * R, RR, eta, deltaL, DeltaLambda,
neq) ) {
260 if (
verbose) fprintf(stdout,
"XALM: Iteration Reset ...\n");
276 ddX.
addtms(deltaXt, eta*deltaLambda);
286 DeltaLambda = DeltaLambdam1 + deltaLambda;
292 converged = this->
checkConvergence(* R, R0, * F, * X, ddX, Lambda, RR0, RR, drProduct,
293 nite, errorOutOfRangeFlag);
295 if ( ( nite >=
nsMax ) || errorOutOfRangeFlag ) {
310 if (
verbose) fprintf(stdout,
"XALM: Iteration Reset ...\n");
323 }
while ( !converged || ( nite <
nsMin ) );
326 if ( nite >
nsReq ) {
327 deltaL = deltaL *
nsReq / nite;
330 deltaL = deltaL * sqrt( sqrt( (
double )
nsReq / (
double ) nite ) );
336 if (
verbose) fprintf(stdout,
"XALM: Adjusted step length: %-15e\n", deltaL);
344 double Lambda,
double RR0,
double RR,
double drProduct,
345 int nite,
bool &errorOutOfRange)
347 double forceErr, dispErr;
352 errorOutOfRange =
false;
377 forceErr = sqrt( forceErr / ( RR0 + RR * Lambda * Lambda ) );
383 forceErr = sqrt(forceErr);
392 dispErr = drProduct / dXX;
393 dispErr = sqrt(dispErr);
397 ( fabs(dispErr) >
rtold * XALM_MAX_REL_ERROR_BOUND ) ) {
398 errorOutOfRange =
true;
401 if ( ( fabs(forceErr) >
rtolf ) || ( fabs(dispErr) >
rtold ) ) {
405 if (
verbose) fprintf (stdout,
"XALM: %-15d %-15e %-15e %-15e\n", nite, Lambda, forceErr, dispErr);
498 const Dvctr &deltaX_,
const Dvctr &R,
double RR,
double eta,
499 double deltaL,
double DeltaLambda0,
int neq)
501 double a1 = 0.0, a2 = 0.0, a3 = 0.0, a4, a5;
502 double _RR, _rr, _a2, _a3, _pr;
503 double lam1, lam2, cos1, cos2;
504 int i, ind, HPsize = 0;
517 a1 = eta * eta * XX +
Psi *
Psi * RR;
518 a2 = RR *
Psi *
Psi * DeltaLambda0 * 2.0;
524 a3 += DeltaLambda0 * DeltaLambda0 * RR *
Psi *
Psi - deltaL * deltaL;
532 for ( i = 0; i < HPsize; i++ ) {
534 _rr += deltaXt[ind] * deltaXt[ind];
535 _RR += R[ind] * R[ind];
536 _pr = ( dX[ind] + eta * deltaX_[ind] );
537 _a2 += eta * deltaXt[ind] * _pr;
542 a1 = eta * eta * _rr +
Psi *
Psi * _RR;
543 a2 = _RR *
Psi *
Psi * DeltaLambda0 * 2.0;
545 a3 = _a3 - deltaL * deltaL + DeltaLambda0 * DeltaLambda0 * _RR *
Psi *
Psi;
551 double discr = a2 * a2 - 4.0 * a1 * a3;
554 if (
verbose)
_warningg(
"XALM :: computeDeltaLambda: discriminant is negative, solution failed");
559 lam1 = ( -a2 + discr ) / 2. / a1;
560 lam2 = ( -a2 - discr ) / 2. / a1;
573 for ( i = 0; i < HPsize; i++ ) {
575 a4 += eta * dX[ind] * deltaX_[ind] + dX[ind] * dX[ind];
576 a5 += eta * dX[ind] * deltaXt[ind];
581 cos1 = ( a4 + a5 * lam1 ) / deltaL / deltaL;
582 cos2 = ( a4 + a5 * lam2 ) / deltaL / deltaL;
584 if ( cos1 > cos2 ) deltaLambda = lam1;
585 else deltaLambda = lam2;
591 double nom = 0., denom = 0.;
594 for ( i = 0; i < HPsize; i++ ) {
602 if (
verbose)
_warningg(
"XALM :: \nxalm: zero denominator in linearized control");
606 deltaLambda = ( deltaL - nom ) / denom;
double sgn(double i)
Returns the signum of given value (if value is < 0 returns -1, otherwise returns 1) ...
double give_dotproduct(const Dvctr &v) const
int xalm_NR_ModeTick
Počet kroků zbývajících do konce dočasné změny iteračního schématu.
Dvctr * resize_ignore_vals(long newsize)
double minStepLength
Minimalní délka kroku.
void initialize_and_check_consistency(void)
Funkce pro nastavení soukromých atributů a kontrolu konzistence zadání.
int nsMin
Minimální počet kroků dorovnání nerovnováhy v jednom iteračním přitěžovacím kroku.
virtual void lineq_solve(Dvctr *X, const Dvctr *R)=0
Linearized ALM (only displacements), taking into account only selected dofs with given weight...
virtual long give_size(void) const
double compute_squared_norm(void) const
int verbose
Pokud je větší než nule - budou vypisovány informace.
#define XALM_MAX_REL_ERROR_BOUND
int computeDeltaLambda(double &deltaLambda, const Dvctr &dX, const Dvctr &deltaXt, const Dvctr &deltaX_, const Dvctr &R, double RR, double eta, double deltaL, double DeltaLambda0, int neq)
int nsReq
Požadovaný počet kroků dorovnání nerovnováhy v jednom iteračním přitěžovacím kroku.
Modifikovaná NR metoda (defaultní hodnota) - matice se počítá jen na začátku každého zatěžovacího kro...
Dvctr initialLoadVector
Vektor pocatecniho zatizeni, nemeni se behem vypoctu, je aplikovan cely.
Lvctr xalm_HPCIndirectDofMask
Dvctr totalDisplacement
Vektor celkových posunutí.
Dvctr incrementOfDisplacement
Vektor přírůstku posunutí.
xalm_NR_ModeType xalm_NR_OldMode
Záloha proměnné xalm_NR_Mode.
void sbt(const Dvctr &src)
int solve(void)
Funkce solve je hlavní, a jediná, výkonná funkce knihovny XALM.
#define XALM_DEFAULT_NRM_TICKS
Structs Elem3D, PoinT and VectoR; classes Array, Array1d, Xscal, Dscal, Xvctr, Lvctr, Dvctr, Xmtrx, Lmtrx and Dmtrx.
long nsteps
Počet zatěžovacích kroků.
void beCopyOf(const PoinT &src)
double rtold
Tolerance relativní chyby nevyrovnaných posunů.
double Psi
Parametr kontroly kroku. Pokud je rovno 0, tak se jedná o kontrolu přírůstkem posunutí, pokud je rovno nekonečnu, tak se jedná o kontrolu přírůstkem zatížení.
virtual void update_internal_forces(Dvctr *internalForces, const Dvctr *X)=0
double rtolf
Tolerance relativní chyby nevyrovnaných sil.
bool checkConvergence(const Dvctr &R, const Dvctr *R0, const Dvctr &F, const Dvctr &X, const Dvctr &ddX, double Lambda, double RR0, double RR, double drProduct, int nite, bool &errorOutOfRange)
Kontrola konvergence.
#define XALM_SMALL_ERROR_NUM
int nsMax
Maximální počet kroků dorovnání nerovnováhy v jednom iteračním přitěžovacím kroku.
double maxStepLength
Maximalní délka kroku.
Full ALM with quadratic constrain and all dofs.
virtual void initialize(void)=0
Funkce nemá parametry a nic nevrací.
Dvctr incrementalLoadVector
Vektor prirustkoveho zatizeni, meni se se stupnem lambda.
xalm_NR_ModeType xalm_NR_Mode
Proměnná určující strategii, kdy se bude počítat tečná matice tuhosti soustavy.
#define XALM_MAX_RESTARTS
virtual ~XALM(void)
Destructor.
double initialStepLength
Počáteční délka kroku.
Plná NR metoda - matice se během zatěžovacího kroku počítá při každé iteraci.
virtual void update_stiffness_matrix(const Dvctr *X)=0
int status
0 - nedopočítáno, 1- spočítáno, 2 - počítáno s problémy, změněn krok
void solve_step(Dvctr *R, Dvctr *R0, Dvctr *X, Dvctr *dX, Dvctr *F, long step)
R - incrementalLoadVector R0 - initialLoadVector.
double loadLevel
Dosažený stupeň přírůstkového zatížení.
void help(void)
prints help / syntax
Akcelerovaná NR metoda - matice se počítá jen na začátku každého n-tého zatěžovacího kroku...
Dvctr internalForces
Vektor vnitřních sil v uzlech.
void add(const Dvctr &src)
virtual void update_step(void)=0
Ve funkci je možné po každém provedeném iteračním kroku vykonat požadované úkony. ...
Full ALM with quadratic constrain, taking into account only selected dofs.
void addtms(const Dvctr &src, double tms)
int xalm_MANRMSteps
Počet kroků, po kterých se má znovu počítat matice, pouze pokud xalm_NR_Mode == xalm_accelNRM.
#define XALM_RESET_STEP_REDUCE
long neq
Pocet rovnic v matici soustavy = pocet neznamych.
xalm_ControlType xalm_Control