Professional Documents
Culture Documents
//-----------------------------------------------
// CALCULATE DEFLECTIONS AT SECTIONS ALONG BEAM
//-----------------------------------------------
// Deflection = Integral (ms[k1].mx)/EI dx
// Simpson's Rule:
// Integral ydx = (s/3).[(Sum of end ordinates +
// 4(sum of even ordinates) + 2(sum of odd
ordinates)]
// where s = length of increment between sections
considered.
// i.e. for 20m span with 21 sections s = 20/(21-1)
= 1.
//NUMERICAL INTEGRATION
if(z<=zd) {
mx = z * (L - zd)/L;
}
else {
if(z>zd) {
mx = zd * (L - z)/L;
}
}
ds[k] = dk * L * pow(10,12)/(ns-1)/3/i2/ec;
#include <iostream>
#include <iomanip>
#include <cmath>
#include <algorithm>
#include <vector>
using namespace std;
class Beam
{
public:
double L, EI;
double V0, dV0;
Beam( double L_ = 1.0, double EI_ = 1.0 ) : L( L_ ), EI(
EI_ ) {}
};
class PLoad
{
public:
double x, W;
PLoad( double x_ = 0.0, double W_ = 0.0 ) : x( x_ ), W( W_
) {}
};
class CLoad
{
public:
double xl, xr, wl, wr;
double dx, dwdx;
CLoad( double XL = 0.0, double XR = 1.0, double WL = 0.0,
double WR = 0.0 ) : xl( XL ), xr( XR ), wl( WL ), wr( WR )
{
dx = xr - xl;
dwdx = ( wr - wl ) / dx;
}
};
class React
{
public:
double x;
char type;
class Monitor
{
public:
double x;
double v, dvdx, S, M;
Monitor( double X = 0.0 ) : x( X ) {}
};
//
Beam beam;
vector<PLoad> load;
vector<CLoad> cont;
vector<React> react;
vector<Monitor> pt;
void prob();
void init();
void calc();
void outp();
double Defl( double x );
double Grad( double x );
double BM( double x );
double SF( double x );
double Vnr( double x );
double dVnr( double x );
double Mnr( double x );
double Snr( double x );
double loadInt( double x, int p );
double Mac( double x, double x0, int n );
//
int main()
{
init();
prob();
calc();
outp();
}
//
void prob()
{
// Loads
load.push_back( PLoad( L / 2.0, 3.0e4 ) ); // pt
// cont.push_back( CLoad( 0.0, L, 2.5, 2.5 ) ); // UDL
// Reactions
react.push_back( React( 0.0, 'F', 0.0 ) );
react.push_back( React( L , 'F', 0.0 ) );
double x1 = 0.0, x2 = L;
int nx = 20;
double dx = ( x2 - x1 ) / nx;
for ( int i = 0; i <= nx; i++ ) pt.push_back( Monitor( x1 +
i * dx ) );
}
//
void init()
{
beam = Beam( 1.0, 1.0 );
load.clear();
cont.clear();
react.clear();
pt.clear();
}
//
void calc()
{
int i, ii, ibig, j, m, n;
double f, big, temp, xm, xn;
int nR = react.size();
int size = nR + 2;
vector< vector<double> > A( size, vector<double>( size, 0.0
) );
vector<double> b( size, 0.0 );
vector<double> x( size, 0.0 );
// Load
i = 0;
for ( n = 0; n < nR; n++ )
{
if ( react[n].type == 'F' ) A[i][n+2] = 1.0;
}
b[i] = Snr( beam.L );
// Constraints
for ( m = 0; m < nR; m++ )
{
xm = react[m].x;
i = m + 2;
if ( react[m].type == 'F' )
{
A[i][0] = 1.0;
A[i][1] = xm;
for ( n = 0; n < nR; n++ )
{
xn = react[n].x;
j = n + 2;
if ( react[n].type == 'M' ) A[i][j] = Mac( xm,
xn, 2 );
if ( react[n].type == 'F' ) A[i][j] = -Mac( xm,
xn, 3 );
}
b[i] = beam.EI * react[m].v - Vnr( xm );
}
if ( react[m].type == 'M' )
{
A[i][0] = 0.0;
A[i][1] = 1.0;
for ( n = 0; n < nR; n++ )
{
xn = react[n].x;
j = n + 2;
if ( react[n].type == 'M' ) A[i][j] = Mac( xm,
xn, 1 );
if ( react[n].type == 'F' ) A[i][j] = -Mac( xm,
xn, 2 );
}
b[i] = beam.EI * react[m].v - dVnr( xm );
}
}
// Solve
// Norm rows
for ( i = 0; i < size; i++ )
{
// Triangular
for ( i = 0; i < size - 1; i++ )
{
// Make A[i][i] largest on diagonal or below
big = abs( A[i][i] );
ibig = i;
for ( ii = i + 1; ii < size; ii++ )
{
temp = abs( A[ii][i] );
if ( temp > big)
{
big = temp;
ibig = ii;
}
}
if ( ibig != i )
{
for ( j = i; j < size; j++ ) swap( A[i][j],
A[ibig][j] );
swap( b[i], b[ibig] );
}
// Pivot
for ( ii = i + 1; ii < size; ii++ )
{
f = A[ii][i] / A[i][i];
for ( j = 0; j < size; j++ ) A[ii][j] -= f * A[i][j];
b[ii] -= f * b[i];
}
}
// Back-sub
for ( i = size - 1; i >= 0; i-- )
{
x[i] = b[i];
for ( j = i + 1; j < size; j++ ) x[i] -= A[i][j] * x[j];
x[i] /= A[i][i];
}
beam.V0 = x[0];
beam.dV0 = x[1];
for ( n = 0; n < nR; n++ )
{
i = n + 2;
//
void outp()
{
#define SP << setw( 15 ) <<
//
//
//
//
//
//
//
//
//
//
void P_SS::P_SS::prepare_table(){
double L = m_beam.L;
double slope = 0.0;
double deflection = 0.0;
Ra = P * (L - a) / L; // reaction end a
Rb = P - Ra; // reaction end b
double x = 0.0;
double V = 0.0;
double BM = 0.0;
x = i * m_beam.dx;
V = Ra;
BM = Ra * x;
slope = (Ra*x*x/2 + C1)/EI;
deflection = (Ra*x*x*x/6 + C1*x)/EI;
}
else{ // Macaulay - to do better one day :)
V = Ra - P;
BM = Ra * x - P * (x - a);
slope = (Ra*x*x/2 - P*(x-a)*(x-a)/2 + C1)/EI;
deflection = (Ra*x*x*x/6 - P*(x-a)*(x-a)*(x-a)/6 +
C1*x)/EI;
}
actions.push_back(std::make_tuple(V, BM, slope,
deflection));
}
}
//-----------------------------------------------
// CALCULATE DEFLECTIONS AT SECTIONS ALONG BEAM
//-----------------------------------------------
// Deflection = Integral (ms[k1].mx)/EI dx
// Simpson's Rule:
// Integral ydx = (s/3).[(Sum of end ordinates +
// 4(sum of even ordinates) + 2(sum of odd
ordinates)]
// where s = length of increment between sections
considered.
// i.e. for 20m span with 21 sections s = 20/(21-1)
= 1.
//NUMERICAL INTEGRATION
if(z<=zd) {
mx = z * (L - zd)/L;
}
else {
if(z>zd) {
mx = zd * (L - z)/L;
}
}
ds[k] = dk * L * pow(10,12)/(ns-1)/3/i2/ec;
#include <iostream>
#include <iomanip>
#include <cmath>
#include <algorithm>
#include <vector>
using namespace std;
class Beam
{
public:
double L, EI;
double V0, dV0;
Beam( double L_ = 1.0, double EI_ = 1.0 ) : L( L_ ), EI(
EI_ ) {}
};
class PLoad
{
public:
double x, W;
PLoad( double x_ = 0.0, double W_ = 0.0 ) : x( x_ ), W( W_
) {}
};
class CLoad
{
public:
double xl, xr, wl, wr;
double dx, dwdx;
CLoad( double XL = 0.0, double XR = 1.0, double WL = 0.0,
double WR = 0.0 ) : xl( XL ), xr( XR ), wl( WL ), wr( WR )
{
dx = xr - xl;
dwdx = ( wr - wl ) / dx;
}
};
class React
{
public:
double x;
char type;
double v;
double R;
class Monitor
{
public:
double x;
double v, dvdx, S, M;
Monitor( double X = 0.0 ) : x( X ) {}
};
//
Beam beam;
vector<PLoad> load;
vector<CLoad> cont;
vector<React> react;
vector<Monitor> pt;
void prob();
void init();
void calc();
void outp();
double Defl( double x );
double Grad( double x );
double BM( double x );
double SF( double x );
double Vnr( double x );
double dVnr( double x );
double Mnr( double x );
double Snr( double x );
double loadInt( double x, int p );
double Mac( double x, double x0, int n );
//
int main()
{
init();
prob();
calc();
outp();
}
//
void prob()
{
// Beam
double L = 20000.0, E = 25000.0, I = 7.2e9;
// Loads
load.push_back( PLoad( L / 2.0, 3.0e4 ) ); // pt
// cont.push_back( CLoad( 0.0, L, 2.5, 2.5 ) ); // UDL
// Reactions
react.push_back( React( 0.0, 'F', 0.0 ) );
react.push_back( React( L , 'F', 0.0 ) );
double x1 = 0.0, x2 = L;
int nx = 20;
double dx = ( x2 - x1 ) / nx;
for ( int i = 0; i <= nx; i++ ) pt.push_back( Monitor( x1 +
i * dx ) );
}
//
void init()
{
beam = Beam( 1.0, 1.0 );
load.clear();
cont.clear();
react.clear();
pt.clear();
}
//
void calc()
{
int i, ii, ibig, j, m, n;
double f, big, temp, xm, xn;
int nR = react.size();
int size = nR + 2;
vector< vector<double> > A( size, vector<double>( size, 0.0
) );
vector<double> b( size, 0.0 );
vector<double> x( size, 0.0 );
// Load
i = 0;
for ( n = 0; n < nR; n++ )
{
if ( react[n].type == 'F' ) A[i][n+2] = 1.0;
}
b[i] = Snr( beam.L );
// Moment
i = 1;
// Constraints
for ( m = 0; m < nR; m++ )
{
xm = react[m].x;
i = m + 2;
if ( react[m].type == 'F' )
{
A[i][0] = 1.0;
A[i][1] = xm;
for ( n = 0; n < nR; n++ )
{
xn = react[n].x;
j = n + 2;
if ( react[n].type == 'M' ) A[i][j] = Mac( xm,
xn, 2 );
if ( react[n].type == 'F' ) A[i][j] = -Mac( xm,
xn, 3 );
}
b[i] = beam.EI * react[m].v - Vnr( xm );
}
if ( react[m].type == 'M' )
{
A[i][0] = 0.0;
A[i][1] = 1.0;
for ( n = 0; n < nR; n++ )
{
xn = react[n].x;
j = n + 2;
if ( react[n].type == 'M' ) A[i][j] = Mac( xm,
xn, 1 );
if ( react[n].type == 'F' ) A[i][j] = -Mac( xm,
xn, 2 );
}
b[i] = beam.EI * react[m].v - dVnr( xm );
}
}
// Solve
// Norm rows
for ( i = 0; i < size; i++ )
{
big = abs( A[i][0] );
// Triangular
for ( i = 0; i < size - 1; i++ )
{
// Make A[i][i] largest on diagonal or below
big = abs( A[i][i] );
ibig = i;
for ( ii = i + 1; ii < size; ii++ )
{
temp = abs( A[ii][i] );
if ( temp > big)
{
big = temp;
ibig = ii;
}
}
if ( ibig != i )
{
for ( j = i; j < size; j++ ) swap( A[i][j],
A[ibig][j] );
swap( b[i], b[ibig] );
}
// Pivot
for ( ii = i + 1; ii < size; ii++ )
{
f = A[ii][i] / A[i][i];
for ( j = 0; j < size; j++ ) A[ii][j] -= f * A[i][j];
b[ii] -= f * b[i];
}
}
// Back-sub
for ( i = size - 1; i >= 0; i-- )
{
x[i] = b[i];
for ( j = i + 1; j < size; j++ ) x[i] -= A[i][j] * x[j];
x[i] /= A[i][i];
}
beam.V0 = x[0];
beam.dV0 = x[1];
for ( n = 0; n < nR; n++ )
{
i = n + 2;
react[n].R = x[i];
//
void outp()
{
#define SP << setw( 15 ) <<
//
//
//
//
//
//
//
//
//