algorithmic modeling for Rhino
Hello Karamba team,
(Further to previous discussions on email)
We are in the process of creating a tool which uses the dynamic analysis module in Karamba to enable the real-time calculation of the Response Factor (dynamic serviceability criteria) for structures such as office floors which are often governed by dynamic considerations and sensitivity to accelerations. This response factor calculation node is then used in an optimisation loop (Hoopsnake) along with a Eurocode section sizing node to determine required sections from a standard database for a given geometry, support, and loading condition. We have done some work with the new version of Karamba and have a few questions regarding the eigenvectors and the normalisation thereof.
You have mentioned that the eigenvectors in Karamba are scaled to unity with respect to the mass matrix. In other words the eigenvectors form a mass orthonormal set, i.e. for mode r, the modal mass = [eigenvectorr]T . [mass matrix] . [eigenvectorr] = 1.
As you also mentioned, this implies that the length of each mode’s eigenvector = 1/Sqrt(m*) where m* is the modal mass in that mode. We have taken your modal analysis example and re-analysed it in Autodesk Robot to compare results. I have used a consistent mass matrix to calculate the results (I assume Karamba has used a lumped mass matrix for computational efficiency?). The results (frequencies, mass-normalised eigenvectors, modal masses, and mass participation factors) of this analysis are shown below:
mX,mY,mZ are the modal masses of the current mode calculated assuming unity-normalised eigenvectors (if they were calculated with mass-normalised eigenvectors, all of the modal masses would of necessity be 1).
miX,miY,miZ are the nodal modal masses (∑miX=mX)
Cur.mas.Ux gives the mass participation (%) of the current mode.
Modal mass and participation coefficients are calculated in Robot as described in this link. Dynamic analysis methods used by Robot are presented here – I used the subspace iteration method for the results above (but all methods give almost identical results as long as enough modes are calculated).
The above analysis shows a modal mass mY=40.5 kg (½ of the total mass) for the first mode. This result satisfies the basic theory: for mode n of a uniform simply-supported beam of span L and mass/unit length m, the (unity-normalised) mode shape is given by ɸ = sin (nπx/L), and the modal mass M* = m*Integral(Sin2(nπx/L),dx,[0,L]) = 0.5*m*L. In discrete form this is M* = ∑Mi*ɸi.
I attach a slight modification to your modal analysis example where I have attempted to back-calculate the modal mass from the length of the eigenvectors output for each mode. This seems to return low modal masses less than 1 – I was expecting them to be one (as the Karamba eigenvectors I am back-calculating from are mass-normalised). Would you be able to shed some light on this?
I also attempted to calculate the eigenvectors and modal masses in Karamba for the same 10m long beam, but with a 1000kg point mass at the centre of the beam, so I could compare the simpler three modes of that nodal mass with Robot. However I could not set the density of the beam to zero hence could not get pure modal results for the point mass. Should this be possible?
We also had a couple of requests (some already mentioned by email):
Thanks again for Karamba - it is an extremely useful tool!
thank you for your contribution - it was a great help (especially the comparative calculations with Robot and your literature links). I have now updated the trial version of Karamba so that the NaturalVibrations-component also returns modal masses and participation factors in global directions. The natural modes are scaled in such a way that their largest displacement component is +/-1. There is now also a Disp-component that lets on retrieve displacements along elements. I attached an example.
Here my answers to your questions:
Regarding your feature requests:
Best regards, Clemens
I am wondering if it's possible to have Karamba also output mass-normalized natural modes (such that the eigenvectors form a mass orthonormal set, i.e. for mode r, the modal mass = [eigenvectorr]T. [mass matrix] . [eigenvectorr] = 1.)
I think in the past this is what Karamba did, but as you mentioned above, Karamba was changed to output unity-normalized natural modes (such that the max displacement is +/- 1). Having access to mass-normalized eigenvectors can be very helpful in some situations as it becomes easier to do response spectrum analysis. We are working on programming some components which use the dynamic results from Karamba to perform seismic and footfall analysis.
Also any coding examples you have using the dynamic results from Karamba would be very helpful.
I am currently working on the Karamba3D API and an example collection. I will try to include
a corresponding example.
Wondering when this example might be available?
I've successfully implemented footfall analysis and related modal summation, but wanted to see your code example before I get too far into the modal response spectrum analysis.
thanks for the reminder.
The repository is available at https://github.com/karamba3d/K3D_tests. I haven't manage to include the example yet. I hope I can add a dynamics-related example next week.
I have updated the repository https://github.com/karamba3d/K3D_tests. Under Algorithms/NaturalVibes_tests there is an example which shows how to scale the mode shapes 'd' with respect to the mass matrix 'M' such that transpose(d) x M x d = 1).