#include "arclength.h"
#include "nssolver.h"
#include "mechprint.h"
#include "mathem.h"
#include "global.h"
#include "globmat.h"
#include "mtsolver.h"
#include <stdlib.h>
Go to the source code of this file.
Functions | |
void | adapt_psi_coeff (long i, double ddlambda, double &ddlambda0, double &psi0, double &psi) |
The function modifies the psi coefficient according to the ddlambda increment adaptively. | |
void | determine_dlambda (double *ddr, double *u, double *v, double *ddrprev, long n, double ddlambda, double psi, double norfp, double dl, double &dlambda, long &stop, nonlinman *nlman) |
double | displincr (double *dr1, double *dr2, long n) |
double | garclength (long lcid, nonlinman *nlman, double *ra, double *fa, double *fc, double *fp, long li, double ilambda, flagsw outres) |
double | loadincr (double *fp, long n, double lambda, nonlinman *nlman) |
The function calculates generalized norm of the load vector. | |
long | one_step_arcl (long lcid, nonlinman *nlman, double *ra, double *fa, double *fc, double *fp, aux_arcl_vec &aav, double norfp, long i, long li, double &lambda, double &totl, double &psi, double &psi0, long modif_psi, long &modif, flagsw outres) |
void | quadeqcoeff (double *ddr, double *v, long n, double ddlambda, double psi, double norfp, double dl, double &a0, double &a1, double &a2) |
void | seldofinit () |
The function initializes selected dofs used for the arclength method controling. |
void adapt_psi_coeff | ( | long | i, | |
double | ddlambda, | |||
double & | ddlambda0, | |||
double & | psi0, | |||
double & | psi | |||
) |
The function modifies the psi coefficient according to the ddlambda increment adaptively.
The function modifies the psi coefficient according to the ddlambda increment adaptively. If the increment decreases comparing to the initial/reference ddlambda increment (ddlamda0) than the value should be also decreased and thus the arclength is controlled rather by the displacements than by the load. The initial/reference value of the load increment ddlambda0 and proportional coefficient psi0 are updated at the beginning of the main iteration loop and if the ddlambda changes the sign comparing to the ddlambda 0 (peak point of loading curve).
i | - step id | |
ddlambda | - actual increment of the load coefficeint lambda | |
ddlambda0 | - initial/reference value of the load coefficeint lambda increment (input/output parameter) | |
psi0 | - initial/reference value of the proportional coefficeint (input/output parameter) | |
psi | - actual value of the proportional coefficeint (input/output parameter) |
Created by Tomas Koudelka 07.2011
Definition at line 962 of file arclength_new.cpp.
References sgn().
void determine_dlambda | ( | double * | ddr, | |
double * | u, | |||
double * | v, | |||
double * | ddrprev, | |||
long | n, | |||
double | ddlambda, | |||
double | psi, | |||
double | norfp, | |||
double | dl, | |||
double & | dlambda, | |||
long & | stop, | |||
nonlinman * | nlman | |||
) |
The function determines increment of lambda (delta lambda).
ddr | - Delta r + u | |
u | - u = K^{-1}*(fa-fi) | |
v | - v = K^{-1}*fp | |
ddrprev | - Delta r (not updated by the vector u) | |
n | - number of unknowns | |
ddlambda | - Delta lambda | |
psi | - proportional coefficient between load and displacement vectors | |
norfp | - the norm of proportional vector | |
dl | - length of the arc | |
dlambda | - delta lambda (output of this function) | |
stop | - indicator of end of iteration (output of this function) | |
nlman | - pointer to structure with arclength setup (it is used for full arclength method) |
Created by JK, 30.8.2010 Modified by TKo, 8.2011
Definition at line 823 of file arclength_new.cpp.
References displincr(), nonlinman::dlam, fullmethod, linearizedmeth, maxvalue, minangle, minvalue, Mp, probdesc::nlman, nodetermination, print_err(), quadeqcoeff(), and solv_polynom_2().
double displincr | ( | double * | dr1, | |
double * | dr2, | |||
long | n | |||
) |
The function computes square of generalized norm of vector of displacemnt increments. The function returns either square of vector norm computed from the selected componets or it returns increment of distance between selected nodes. It is used in the arclength method.
dr1 | - array with components of the first vector of displacement increments | |
dr2 | - array with components of the second vector of displacement increments | |
n | - number of components of displincr array |
Created by JK,
Definition at line 694 of file arclength_new.cpp.
References alldofs, nonlinman::displnorm, Mp, probdesc::nlman, nodesdistincr, nonlinman::nsdofal, nonlinman::nxal, nonlinman::nyal, nonlinman::nzal, print_err(), nonlinman::probdimal, scprd(), nonlinman::seldofal, seldofs, seldofscoord, and selecnodes.
double garclength | ( | long | lcid, | |
nonlinman * | nlman, | |||
double * | ra, | |||
double * | fa, | |||
double * | fc, | |||
double * | fp, | |||
long | li, | |||
double | ilambda, | |||
flagsw | outres | |||
) |
The function solves system of nonlinear algebraic equations by the arc-length method. This method was modified to reach the given value lambdar of the lambda parameter. lambdar value is reached with required error errl. Only one right hand side vector is supported with respect to nonlinearity and absence of superposition. Proportional vector grows until the nial number of steps is reached.
lcid | - load case id | |
nlman | - pointer to structure conatining setup of the solver | |
ra | - vector of attained displacements | |
fa | - attained load vector | |
fc | - constant part of load vector (it is not influenced by lambda) | |
fp | - proportional part of load vector (it is increased by load coefficient lambda up to the nlman->lambdar) | |
li | - initial value of step id (default is 0) | |
ilambda | - initial value of load coefficient (default is 0) | |
outres | - flag for performing of output of results (if on -> print_step procedure is called for the each step) |
Created by JK, 16.8.2001 Rewritten by TKo, JK 08.2011
Definition at line 36 of file arclength_new.cpp.
References assemble_attained_load_vector(), nonlinman::check_lambdar, nonlinman::check_tot_al, compute_req_val(), nonlinman::dlal, nonlinman::dlmaxal, nonlinman::dlminal, nonlinman::erral, nonlinman::errl, f, probdesc::hdbcont, nonlinman::lambdar, nonlinman::max_tot_al, Mespr, Mp, Ndofm, nonlinman::nial, nonlinman::niilal, normv(), on, one_step_arcl(), print_err(), print_flush(), print_step_forced(), nonlinman::psial, hdbcontr::save_stat(), and solver_save().
double loadincr | ( | double * | fp, | |
long | n, | |||
double | lambda, | |||
nonlinman * | nlman | |||
) |
The function calculates generalized norm of the load vector.
The function computes generalized norm of load vector. It is used in the arclength method.
fc | - array with components of constant load vector | |
n | - the number of components of displincr array | |
lambda | - attained value of the load coefficient | |
nlman | - structure with setup of handling of lambda and lambda tresholds |
Created by JK,
Definition at line 645 of file arclength_new.cpp.
References addv(), alldofs, nonlinman::check_lambdar, nonlinman::displnorm, nonlinman::lambdar, loadincr(), Mp, probdesc::nlman, nodesdistincr, nonlinman::nsdofal, nullv(), off, nonlinman::seldofal, seldofs, seldofscoord, selecnodes, and ss().
long one_step_arcl | ( | long | lcid, | |
nonlinman * | nlman, | |||
double * | ra, | |||
double * | fa, | |||
double * | fc, | |||
double * | fp, | |||
aux_arcl_vec & | aav, | |||
double | norfp, | |||
long | i, | |||
long | li, | |||
double & | lambda, | |||
double & | totl, | |||
double & | psi, | |||
double & | psi0, | |||
long | modif_psi, | |||
long & | modif, | |||
flagsw | outres | |||
) |
The function performs one step of arc-length method which solves the system of nonlinear algebraic equations. This method was modified to reach the given value lambdar of the lambda parameter. lambdar value is reached with required error errl. Only one right hand side vector is supported with respect to nonlinearity and absence of superposition. Proportional vector grows until the nial number of steps is reached.
lcid | - load case id | |
nlman | - pointer to structure conatining setup of the solver | |
ra | - vector of attained displacements | |
fa | - attained load vector | |
fc | - constant part of load vector (it is not influenced by lambda) | |
fp | - proportional part of load vector, it is increased by load coefficient lambda up to the nlman->lambdar | |
aav | - structure with auxiliary vectors used in the inner iteration loop, they are allocated once outside the function due to speed | |
norfp | - norm of proportional load vector | |
li | - initial value of step id (default is 0) | |
i | - actual step id | |
lambda | - actual value of load coefficient which will be modified in the case of performing of the given step sucessfully | |
totl | - actual value of total (cummulative) length of arc corresponding to the actual load level, which will be modified in the case of performing of the given step sucessfully | |
psi | - proportional coefficient between load vector and displacement vector | |
psi0 | - initial value of proportional coefficient psi | |
modif | - flag for adaptive increasing of length of arc (modif == 2 => increase length) | |
modif_psi | - flag for adaptive modification of psi coefficient | |
outres | - flag for performing of output of results (if on -> print_step procedure is called for the each step) |
0 | - equilibrium was attained in the given i-th step of arc-length method | |
1 | - equilibrium cannot be attained in the given i-th step of arc-length method |
Created by JK, 16.8.2001 Rewritten by TKo, JK 12.2011
Definition at line 243 of file arclength_new.cpp.
References adapt_psi_coeff(), addmultv(), addv(), assemble_stiffness_matrix(), check_divergency(), nonlinman::check_lambdar, nonlinman::check_tot_al, compute_req_val(), copymultv(), copyv(), determine_dlambda(), displincr(), nonlinman::dlal, nonlinman::dlmaxal, nonlinman::dlminal, nonlinman::erral, f, fillm(), fillv(), Gtm, internal_forces(), probdesc::istep, probdesc::jstep, nonlinman::lambdar, nonlinman::max_tot_al, Mespr, Mm, Mp, Ndofm, nonlinman::niilal, normv(), off, on, probdesc::otherstate, Out, print_flush(), print_step(), nonlinman::psial, Smat, slesolv::solve_system(), probdesc::ssle, probdesc::strainstate, probdesc::stressstate, subv(), mechmat::updateipval(), yes, and probdesc::zero.
Referenced by garclength().
void quadeqcoeff | ( | double * | ddr, | |
double * | v, | |||
long | n, | |||
double | ddlambda, | |||
double | psi, | |||
double | norfp, | |||
double | dl, | |||
double & | a0, | |||
double & | a1, | |||
double & | a2 | |||
) |
Function computes coefficients of the quadratic equation used in the arclength method. The coefficients are computed with respect to type of load/displacement control.
ddr | - increment of load coefficient lambda for the given step | |
v | - vector of displacement increments | |
n | - total number of DOFs (i.e. size of ddr and v arrays) | |
ddlambda | - correction of increment of load coefficient lambda | |
psi | - proportional weight coeffient (swithces between load/displacement control) | |
norfp | - norm of proportional load vector | |
dl | - length of arc | |
a0 | - zero order coefficient (output) | |
a1 | - first order coefficient (output) | |
a2 | - second order coefficient (output) |
Created by JK,
Definition at line 763 of file arclength_new.cpp.
References alldofs, displincr(), nonlinman::displnorm, Mp, probdesc::nlman, nodesdistincr, print_err(), seldofs, seldofscoord, and selecnodes.
void seldofinit | ( | ) |
The function initializes selected dofs used for the arclength method controling.
The function initializes dof numbers for the particular types of displacement control. It is used in the arclength method.
Created by JK,
Definition at line 568 of file arclength_new.cpp.
References alldofs, nonlinman::displnorm, mechtop::give_dof(), mechtop::give_ndofn(), gtopology::gnodes, Gtm, length(), Mp, Mt, probdesc::nlman, nodesdistincr, nonlinman::nsdofal, nonlinman::nsnal, nonlinman::nxal, nonlinman::nyal, nonlinman::nzal, nonlinman::seldofal, seldofs, seldofscoord, selecnodes, nonlinman::selnodal, gnode::x, gnode::y, and gnode::z.