## How many modes to include in the modal anlaysis

hi all,

Having those input in hand, mass ([M]) n*n matrix , stiffness ([K]) n*n matrices and having obtained the eigen-values, eigenvectors for the higher-frequencies with subspace or simlutaneous iteration respectively, eigen-values ([$\Phi$]) as m*m diagonal matrix, and m*m eigen-vectors as ([Ω]).

To summarize the inputs:
n = the total DoFs in system
m = number of interested modes (m<n)
M = Mass matrix (n*n)
K = Stiffness matrix (n*n)
$\Phi$=eigen value matrix (m*m diagonal)
Ω=eigen-vectors (m*m)

How am I supposed to find the that m number of modes are enough for modal analysis for the given case?

Generally in books suggest that, modal particiaption factors are (MPF) = R*$\Phi$nT / ( $\Phi$nT*M*$\Phi$n ) where R is the time independent spatial loading type of external loads( p(t) = R*f (t) ).

But we are interested with eigen-solution of the problem, so there is no any external loading and reasonably there is no R spatial vector. So what actually is book refering with that p(t) = R*f (t) description ?

Regards,
 PhysOrg.com engineering news on PhysOrg.com >> Company pioneering new types of material for 3-D printer 'ink'>> Student-built innovations to help improve and save lives>> Researchers use light projector and single-pixel detectors to create 3-D images
 The magnitudes of the eigenvalues should with respect to one another should represent the total energy captured by their respective modes. Order your eigenvalues/eigenvectors such that the eigenvalues are in decreasing order and pick the first m that capture the proportion of energy you are looking to capture. As an example from signals analysis, you can often use methods like proper orthogonal decomposition to generate hundreds of modes if you need them but often it's the first half dozen or so that contain 99% of the signal energy.
 Thanks for commenting, Signal processing may also have similar behaviour but generally I was focusing on structural dynamics. But still didn't get that how spatial vector for loading type is formed in eigen value problem. In order to get a better view I post the results from my program. Stiffness and mass matrices are 20x20, but I'm only interested with first 12 modes, so m =12 in my case. I solve equations with simultaneous iteration and iteration ends after 1000 steps, eigen values are as posted below. I'm bit of dubious here that algorithm produces the correct results, there is a big ratio especially between 1st and 2nd eigen values, is it normal? The rest of the modes are decreasing gradually and looks normal in my idea. ITERATION NUMBER 1000 ESTIMATED EIGEN-VALUES 0.1039E+07 0.5100E+01 0.3648E+01 0.3630E+01 0.3601E+01 0.3569E+01 0.3509E+01 0.3491E+01 0.3392E+01 0.3083E+01 0.1793E+01 0.2905E+00 I've abstained from posting eigen vectors here, cause it's really not readable, but I depict the calculation process. Based on the instruction in the book I use the $\Gamma$=$\Phi$T*M*I; Meff=$\Gamma$2 ; MPR=Meff/Mtotal and the output is as follow. 1: mode contribution = % 0.0000 2: mode contribution = % 0.0125 3: mode contribution = % 0.0000 4: mode contribution = % 0.0105 5: mode contribution = % 0.0439 6: mode contribution = % 0.0106 7: mode contribution = % 0.0443 8: mode contribution = % 0.1031 9: mode contribution = % 0.0452 10: mode contribution = % 0.0106 11: mode contribution = % 0.0001 12: mode contribution = % 0.0137 TOTAL MODAL PARTICIPATION 0.2945 Isn't is strange that even If I include %60 percent of modes, I got %29 in response? Regards,

## How many modes to include in the modal anlaysis

Whether it is signals analysis or structural dynamics makes no difference. The concepts in eigenvalue problems stay the same either way.

How is your first "mode contribution" 0%? What are you using the calculate those percentages. It should be like 99.999% based on the fact that your first eigenvalue appears to be 6 orders of magnitude larger than the rest.

Recognitions:
 Quote by Ronankeating I'm bit of dubious here that algorithm produces the correct results, there is a big ratio especially between 1st and 2nd eigen values, is it normal?
The jump from 51 to 106 looks very odd to me, unless you have a reason why it should happen. 1000 iterations seems a big number for such a small matrix as well, but since your output claims you have 8 eignevalues clustered between about 30 and 35 that might slow down the convergence of whatever you are doing.

Have you plotted out the mode shapes to check if they make any sense?

Or compare your results with a standard library routine like
http://www.netlib.org/lapack/explore...241373469dd7f8
 Sorry for being late for reponse, but it took me a while to sort out all the packages to run the lapack library. To obtain the mass pariticipation ratios I use the Γ=ΦT*M*I; Meff=Γ2 ; MPR=Meff/Mtotal, where ΦT is the eigenvector column corresponding to the mode of interest. Based on the AlephZero suggection I used lapack(DSYGV subroutine) with all the modes and the results are as follow: Code:  Eigenvalues -1.8174 -1.3285 -0.4110 0.2897 0.7568 2.1237 5.1803 16.0423 Estimate of reciprocal condition number for B 6.3E-02 Error estimates for the eigenvalues 1.2E-14 1.1E-14 9.1E-15 8.9E-15 9.7E-15 1.2E-14 1.8E-14 3.7E-14 Error estimates for the eigenvectors 7.5E-14 7.3E-14 4.9E-14 7.3E-14 7.4E-14 2.7E-14 1.4E-14 5.7E-15 1 mode contribution 6.0501 2 mode contribution 1.3497 3 mode contribution 0.5748 4 mode contribution 0.0096 5 mode contribution 1.8717 6 mode contribution 10.7302 7 mode contribution 54.4733 8 mode contribution 24.9407 Total mass participation ratios are 100.0000 Regarding the data above, 1. Why am I getting the negative values of eigen values, is it normal? 2. While eigenvalues are in increasing order why modal mass particiaption ratios aren't in harmony with eigenvalues, but having some kind of arbitrary order. Is it normal? 3. What other participation ratios can be introduced in the modal analysis? Generally I observe that those being mentioned in books (i.e. static load participation ratio, dynamic load PR , modal PR etc..) but have never seen any explicit formulation for them. Could you elaborate that a bit further? 4. Is that mass particiaption and modal participatin factors are different things or can used identically? 5. AFAIK Lapack doesn't support iterative methods (subspace), what other trustworthy packages can i use for that? Regards,

Recognitions:
 Quote by Ronankeating 1. Why am I getting the negative values of eigen values, is it normal?
It would be normal for nominally zero eigenvalues to be slightly negative beause of rounding errors, but your numbers look too big for that. Most like the reason is some combination of
- K and/or M are wrong
- you supplied the data in the wrong format to the Lapack routine.

I would check out the eigenvalues of K and M separately. If you don't want to fight with more Lapack routines, you could set K to a unit matrix to check M, and M to a unit matrix to check K.

Or try a simple problem where you know the exact answers, like vibration of a stretched string with$$K = \begin{bmatrix} 2 & -1 \\ -1 & 2 & -1 \\ & -1 & 2 &-1 \\ & & & \ddots \\ & & & -1 & 2 & -1 \\ & & & & -1 & 2 \end{bmatrix} \qquad M = \begin{bmatrix} 4 & 1 \\ 1 & 4 & 1 \\ & 1 & 4 & 1 \\ & & & \ddots \\ & & & 1 & 4 & 1 \\ & & & & 1 & 4 \end{bmatrix}$$

I think questions 2 - 4 are premature until you get your eigensolutions working properly.
 5. AFAIK Lapack doesn't support iterative methods (subspace), what other trustworthy packages can i use for that?
This is by the guy who invented it. IIRC there is some code in the book in Ref 7 in the paper.
http://web.mit.edu/kjb/www/Publicati...ion_Method.pdf

 It would be normal for nominally zero eigenvalues to be slightly negative beause of rounding errors, but your numbers look too big for that. Most like the reason is some combination of - K and/or M are wrong - you supplied the data in the wrong format to the Lapack routine.
I've started from lapack original example program (DSYGV example http://www.nag.com/lapack-ex/node103.html) which produced the exactly same results as expected for original example. The only thing that I altered for convenince in original program was, populating the K and M matrices with random numbers (ranging from 1 to 100) with help of random_seed() and random_number(int num) intrinsic subroutines. So "supplying the wrong format" item has been elimiated here in my idea.

If the hassle is "- K and/or M are wrong", then how can they be wrong ? At least the program is supposed to create the correct results for any arbitrary numerical value.

Sample K and M feeding for program , respectively (8x8)

K Matrix
0.5853E+02 0.9035E+02 0.7809E+02 0.1528E+02 0.9121E+02 0.2352E+02 0.5716E+01 0.5881E+02
0.9035E+02 0.7766E+02 0.5863E+02 0.8436E+02 0.3492E+02 0.4297E+02 0.2118E+02 0.2012E+02
0.7809E+02 0.5863E+02 0.8398E+01 0.5321E+01 0.5338E+02 0.7025E+02 0.3487E+02 0.6501E+02
0.1528E+02 0.8436E+02 0.5321E+01 0.3902E+02 0.7173E+02 0.2549E+02 0.1677E+02 0.2786E+02
0.9121E+02 0.3492E+02 0.5338E+02 0.7173E+02 0.5647E+02 0.5001E+02 0.2059E+02 0.4064E+02
0.2352E+02 0.4297E+02 0.7025E+02 0.2549E+02 0.5001E+02 0.5009E+02 0.6648E+02 0.4308E+02
0.5716E+01 0.2118E+02 0.3487E+02 0.1677E+02 0.2059E+02 0.6648E+02 0.6846E+02 0.1888E+02
0.5881E+02 0.2012E+02 0.6501E+02 0.2786E+02 0.4064E+02 0.4308E+02 0.1888E+02 0.9342E+02

M Matrix
20 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000
0.0000 30 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000
0.0000 0.0000 30 0.0000 0.0000 0.0000 0.0000 0.0000
0.0000 0.0000 0.0000 30 0.0000 0.0000 0.0000 0.0000
0.0000 0.0000 0.0000 0.0000 40 0.0000 0.0000 0.0000
0.0000 0.0000 0.0000 0.0000 0.0000 40 0.0000 0.0000
0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 40 0.0000
0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 40

Recognitions:
 Quote by Ronankeating The only thing that I altered for convenince in original program was, populating the K and M matrices with random numbers (ranging from 1 to 100) with help of random_seed() and random_number(int num) intrinsic subroutines. So "supplying the wrong format" item has been elimiated here in my idea. If the hassle is "- K and/or M are wrong", then how can they be wrong ? At least the program is supposed to create the correct results for any arbitrary numerical value.
Yes, but if you populate K and/or M with random numbers they may not be positive definite, so you shouldn't expect the eigenvalues to be all positive.

I assumed the results in the previous post were from your actual structural matrices.

In any case, if your input matrices are generated from random numbers, how do you know if the output is right or wrong? (You could check the output by reconstructing K and M from the eigenvalues and eigenvectors, but you didn't say you had done anything like that).

 Yes, but if you populate K and/or M with random numbers they may not be positive definite, so you shouldn't expect the eigenvalues to be all positive. I assumed the results in the previous post were from your actual structural matrices.
Sorry for not being explanatory and verbose enough, but it seems that issue has been cleared out, lapack library works well produces the consistent results and if I feed it with correct input(K and M obtained from structural matrices) I'll get correct results I think (non negative eigenvalues).

All other items have been eliminated, except that :

 3. What other participation ratios can be introduced in the modal analysis? Generally I observe that those being mentioned in books (i.e. static load participation ratio, dynamic load PR , modal PR etc..) but have never seen any explicit formulation for them. Could you elaborate that a bit further? 4. Is that mass particiaption and modal participatin factors are different things or can be used identically?

Could shed some light on those topics as well?

Thanks for helping,

Regards,
 Recognitions: Science Advisor The equation you quoted is the mathmematically correct way to find the modal components of an arbitrary applied force. The maths of modal analysis is simpler if you always normalize the mode shape amplitudes, so that ##\Phi^T M \Phi = 1## and ##\Phi^T K \Phi = \omega^2## for each mode. Using modes that are "mass normalized" in that way is the obvious choice if you are using modes calculated from a model of the mass and stiffness. But for practical engineering, working with a small mount of measured data and no theoretical model of the structure, it may be simpler just to normalize all the mode shapes to unit amplitude one point on the strucutre, or normalize each mode so its own maximum amplitude is 1. That leads to various measures of "modal participation", "effective modal mass", etc. The terminology used to describe this is not standardized and sometimes not even defined, except by "reverse engineering" what a particular report or paper means. If you do a properly planned modal test, you can get the mathematically consistent scale factors from the measured data. But if the only measurements you have are from a couple of strain gauges put on the structure for some other purpose, doing something (even if it's not nice mathematically) may be better than doing nothing at all.
 Thank you very much indeed for your valuable posts, One final question, how am I supposed to obtain the element forces after modal analysis? If I obtain the element forces with Fs= k*x formulaiton there shuldn't be any problem but the glitch here is I've applied the Guyan reduction to whole structural system, and so the structural matrices K and M are reduced. How to expand the formulation of obtaining the element forces from reduced system to original system? Regards,
 Recognitions: Science Advisor You have two options. 1. Back substitute to get the unreduced model displacements from the reduced displacements, then find the element forces. 2. If the element forces are a linear function of the element displacements, they will also be a linear function of the reduced model displacements. When you do the reduction, you can construct a set of coefficients to get a particular element force from the reduced displacements. Which is the "best" way depends how many element forces you want form the model. If you want to back substitute the displacments anyway to do computer graphics etc, option 1 is easiest to program. If you want to find only a few forces and the number of reduced variables is << the full model size, option 2 may run faster. The maths for option 2 is to think of the reduction in terms of ##x_s = L x_m## (see some earlier posts) and transform any matrix ##A## between "master" and "slave" variables using ##L^T A L##.