www.pudn.com > simulator.zip > General_eigen.cpp
#include "General_ext.h"
void eigen_finder(float[][MAX_CTRL_CHAN], float[], float[][MAX_CTRL_CHAN], int);
/**************************************************************************/
/* Function: mode_solution */
/* Purpose: solve natural periods and mode shapes of an [M]-[K] system */
/**************************************************************************/
void mode_solution(float eig_val[MAX_CTRL_CHAN])
{
const float pi=3.14159f;
float Stiff_i [MAX_CTRL_CHAN][MAX_CTRL_CHAN],
temp [MAX_CTRL_CHAN][MAX_CTRL_CHAN],
period [MAX_CTRL_CHAN],
eig_vec [MAX_CTRL_CHAN][MAX_CTRL_CHAN];
// Mass[][]*v[]=lambda*Stif[][]*v[] to find eigs(lambda,v[])
// with lambda=(1/omega)^2, equals to A[][]*v[]=lambda*v[]
// with A[][]=Flex[][]*Mass[][], where Flex[][]=Stif[][]^(-1)
invert_matrix(Stiff, Stiff_i);
mpy_matrix_matrix(Stiff_i, Mass, temp);
eigen_finder(temp, eig_val, eig_vec, 10);
printf("\n No. Periods Mode Shapes\n");
for(int i=0; i4) && (fabs(d[ip])+g==fabs(d[ip])) && (fabs(d[iq])+g==fabs(d[iq])) )
{
a[ip][iq]=0.f;
}
else if (fabs(a[ip][iq])>tresh)
{
h=d[iq]-d[ip];
if (fabs(h)+g==fabs(h))
{
t=a[ip][iq]/h;
}
else
{
theta=0.5f*h/a[ip][iq];
t=1.f/((float)fabs(theta)+(float)sqrt(1.f+theta*theta));
{
if (theta<0.f) t=-t;
}
};
c=1.f/(float)sqrt(1.f+t*t);
s=t*c;
tau=s/(1.f+c);
h=t*a[ip][iq];
z[ip]-=h;
z[iq]+=h;
d[ip]-=h;
d[iq]+=h;
a[ip][iq]=0.f;
for( j=0 ; j