19 void truss2d_postpro (
const double *x,
double E,
const double *r,
double &eps,
double &s)
21 double l2 = ( (x[2]-x[0])*(x[2]-x[0]) + (x[3]-x[1])*(x[3]-x[1]) );
23 double x12 = x[0] - x[2];
24 double y12 = x[1] - x[3];
25 double x21 = x[2] - x[0];
26 double y21 = x[3] - x[1];
28 double u12 = r[0] - r[2];
29 double v12 = r[1] - r[3];
30 double u21 = r[2] - r[0];
31 double v21 = r[3] - r[1];
33 eps = (1/l2)*(x12*r[0]+y12*r[1]+x21*r[2]+y21*r[3]) + (1/(l2*2))*(u12*r[0]+v12*r[1]+u21*r[2]+v21*r[3]);
48 void truss2d_fint (
const double *x,
const double *r,
double s,
double A,
double *fint)
50 double l = sqrt( (x[2]-x[0])*(x[2]-x[0]) + (x[3]-x[1])*(x[3]-x[1]) );
53 for (
int i = 0; i<4; i++)
56 fint[0] = s * (A/l) * (xu[0]-xu[2]);
57 fint[1] = s * (A/l) * (xu[1]-xu[3]);
58 fint[2] = s * (A/l) * (xu[2]-xu[0]);
59 fint[3] = s * (A/l) * (xu[3]-xu[1]);
71 void truss2d (
const double *x,
double EA,
double ke[4][4])
73 double length = sqrt( (x[2]-x[0])*(x[2]-x[0]) + (x[3]-x[1])*(x[3]-x[1]) );
75 double c = (x[2]-x[0]) / length;
double c2 = c*c;
76 double s = (x[3]-x[1]) / length;
double s2 = s*s;
78 double k = (EA/length);
80 ke[0][0] = k * c2; ke[0][1] = k * c*s; ke[0][2] = k * -c2; ke[0][3] = k * -c*s;
81 ke[1][0] = k * c*s; ke[1][1] = k * s2; ke[1][2] = k * -c*s; ke[1][3] = k * -s2;
82 ke[2][0] = k * -c2; ke[2][1] = k * -c*s; ke[2][2] = k * c2; ke[2][3] = k * c*s;
83 ke[3][0] = k * -c*s; ke[3][1] = k * -s2; ke[3][2] = k * c*s; ke[3][3] = k * s2;
89 if (val < 0) val *= -1;
124 if (step == this->
nsteps-1){
125 FILE *file = fopen(
"graf1.xalm.dat",
"w");
126 for (
long i = 0; i <=
nsteps; i++)
127 fprintf (file,
"%g %g\n",
tisk1[i],
tisk2[i]);
149 double xz[2][2] = { {0,0}, {4,3} };
210 r[0] = r[1] = r[2] = 0.0;
218 (*internalForces)[0] = fint[3];
224 (*X)[0] = (*R)[0] /
k;
233 double xz[2][2] = {{0,0},{4,3}};
262 double df[
neq] = {0};
268 double ru[
neq] = {0};
271 double r[
neq+pneq] = {0};
274 double res[
neq] = {0};
285 double limit = 1.e-6;
289 FILE *file = fopen(
"graf1.mumech.dat",
"w");
291 fprintf (file,
"%g %g\n", 0.0, 0.0);
293 double xze[] = { xz[en[0]][0], xz[en[0]][1], xz[en[1]][0], xz[en[1]][1] };
294 for (
int i = 1; i<=35; i++) {
295 r[0] = r[1] = r[2] = 0.0;
302 fprintf (file,
"%g %g\n", r[3], fint[3]);
309 file = fopen(
"graf2.mumech.dat",
"w");
311 fprintf (file,
"%lf %lf\n", 0.0, 0.0);
314 for (
int i = 0; i<5; i++) {
323 while (
norm(res[0]) > limit) {
337 ru[0] = res[0] / klin[3][3];
346 res[0] = -1.0*(fint[3] - f[0] - df[0]);
351 fprintf (file,
"%g %g\n", r[3], fint[3]);
virtual void update_internal_forces(Dvctr *internalForces, const Dvctr *X)
Dvctr * resize_ignore_vals(long newsize)
double minStepLength
Minimalní délka kroku.
void truss2d_postpro(const double *x, double E, const double *r, double &eps, double &s)
Dvctr initialLoadVector
Vektor pocatecniho zatizeni, nemeni se behem vypoctu, je aplikovan cely.
virtual void initialize(void)
Funkce nemá parametry a nic nevrací.
virtual void update_stiffness_matrix(const Dvctr *X)
long nsteps
Počet zatěžovacích kroků.
const double * give_totalDisplacement(void) const
Funkce vrátí konstantní ukazatel na vektor celkových posunů.
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í.
double rtolf
Tolerance relativní chyby nevyrovnaných sil.
void truss2d_fint(const double *x, const double *r, double s, double A, double *fint)
double maxStepLength
Maximalní délka kroku.
Dvctr incrementalLoadVector
Vektor prirustkoveho zatizeni, meni se se stupnem lambda.
void initialize_local(void)
virtual void update_step(void)
Ve funkci je možné po každém provedeném iteračním kroku vykonat požadované úkony. ...
int give_step(void)
Funkce vrací číslo aktuálního zatěžovacího kroku.
double give_loadLevel(void) const
Funkce vrátí loadLevel - dosažený stupeň přírůstkového zatížení.
double initialStepLength
Počáteční délka kroku.
Interface to library XALM.
void truss2d(const double *x, double EA, double ke[4][4])
funkce pocita matici tuhosti tazeneho-tlaceneho prutu ve 2d (truss 2d) In: x - vektor souradnic uzlu ...
virtual void lineq_solve(Dvctr *X, const Dvctr *R)
double norm(double val)
norma = delka vektoru, pro vektor delky 1 je to absolutni hodnota
long neq
Pocet rovnic v matici soustavy = pocet neznamych.