OnScale integrates a new modal solver which is actually in Beta Testing Phase.
If you are interested to try it, I will detail briefly in this article how to structure your input file to calculate a number of modal frequencies and export the mode shape pictures.
Note: this modal solver is only available in Analyst Mode through script, it is not integrated yet in the Designer mode.
Important: Implicit mechanical requires double precision for reliable result
Because of that, you will need to go in the Options>Solver Settings and choose "Double Precision" for local run. If you are using the cloud, choose "Double Precision" when you run the script.

Example of Modal Analysis:
This is a very simple 3D model that you can use to test the modal solver:

Here is a sample code to run a modal analysis of a 3D Strip:
c mem 800 200 /* Allocate 800 megawords of memory - 3 GigaBytes (Not necesarry for Windows Operating Systems)
c NOTE: MEM Command must be first command in file, if used. (Line 1)
rest no
c *************************************************************************************************************
c
c Generated Flex Input File
c
c *************************************************************************************************************
c
c DESIGNER :OnScale - Designer Generated
c MODEL DESCRIPTION :
c DATE CREATED :11 Feb 2020
c VERSION :1.0
c
c BASE UNITS : kg-m-s
c STRESS : Pa
c FORCE : N
c *************************************************************************************************************
mp
omp * * /* Number of CPUs to be used in the execution.
end
titl modal strip 3D
c *************************************************************************************************************
c
c Define User Variables
c
c *************************************************************************************************************
c
c These variables have been set by the user through the interface.
c
c *************************************************************************************************************
c Simulation Variables
symb AccelGrav = 9.81 /* m/s^2
symb nbFreqs = 10 /* Number of Modes
symb neigar = 3 /* number of Arnoldi vectors
c
symb #get { JobName } jobname
text File_prcs = '$(JobName)_prcs.flxrsto'
symb coordFactor = 1.0 /* Coordinate conversion factor
symb timeFactor = 1.0 /* Time conversion factor
symb dMassFactor = 1.0 /* Mass conversion factor
c *************************************************************************************************************
c
c Define Materials
c
c *************************************************************************************************************
matr
c --------------------------------------------------------------
c type : MISC :
c name : steel :
c desc : Steel, generic :
c --------------------------------------------------------------
wvsp off
type elas
prop steel 7700. 160.e9 80.e9 0.010000
end
c *************************************************************************************************************
c
c Define Meshing
c
c *************************************************************************************************************
c
c Set the variable for the approximate element size for the model. Must be
c sufficient to represent the wavelengths of interest. Recommended that at least
c 15 elements per wavelength are used.
c
c *************************************************************************************************************
symb box = 0.005 /* Size in X,Y Dir
symb box2 = 0.005 /* Size in Z Dir
c *************************************************************************************************************
c
c Geometry Locations (XYZ)
c
c *************************************************************************************************************
c Scale Parameters
symb xmin = 0.0 * $coordFactor
symb xmax = 0.04 * $coordFactor
symb ymin = 0.0 * $coordFactor
symb ymax = 0.4 * $coordFactor
symb zmin = 0.0 * $coordFactor
symb zmax = 0.04 * $coordFactor
c Determine lengths of the model
symb xlen = ( $xmax - $xmin )
symb ylen = ( $ymax - $ymin )
symb zlen = ( $zmax - $zmin )
c ***************************************************
c
c Keypoints in the X-Direction
c
c ***************************************************
symb #keycord x 1 $xmin $xlen
symb #get { idx } rootmax x
c ***************************************************
c
c Keypoints in the Y-Direction
c
c ***************************************************
symb #keycord y 1 $ymin $ylen
symb #get { jdx } rootmax y
c ***************************************************
c
c Keypoints in the Z-Direction
c
c ***************************************************
symb #keycord z 1 $zmin $zlen
symb #get { kdx } rootmax z
c *************************************************************************************************************
c
c Indices Locations (IJK)
c
c *************************************************************************************************************
c Grid in I direction, using approximately element size of 'box' and at least 1 element
symb #keyindx i 1 $idx 1 $box 1
symb indgrd = $i$idx
c Grid in J direction, using approximately element size of 'box' and at least 1 element
symb #keyindx j 1 $jdx 1 $box 1
symb jndgrd = $j$jdx
c Grid in K direction, using approximately element size of 'box' and at least 1 element
symb #keyindx k 1 $kdx 1 $box2 1
symb kndgrd = $k$kdx
c *************************************************************************************************************
c
c GCON Grid & Geometry Allocation
c
c *************************************************************************************************************
grid $i$idx $j$jdx $k$kdx
geom
keypnt $idx $jdx $kdx
end
c --------------------------------------------------------------
c Project Material List
c --------------------------------------------------------------
site
regn void
blok steel 0.0 0.04 0.0 0.4 0.0 0.04
end
grph
set imag png
type standard
line on
plot matr
imag model
end
term
c *************************************************************************************************************
c
c Boundary Definitions
c
c *************************************************************************************************************
c grav 0 0 -$AccelGrav
boun
side xmin free
side xmax free
side ymin fixd
side ymax free
side zmin free
side zmax free
end
c *************************************************************************************************************
c
c Calculated Properties
c
c *************************************************************************************************************
c
c By default, Flex only calculates the minimum required data set, typically this
c means only velocities. This is done for memory efficiency. Should other
c properites be required (e.g. displacements, stresses, strains, pressure), then
c these must be requested by the CALC command. The manual lists all these options
c
c *************************************************************************************************************
calc
disp x y z
end
eign
modes $nbFreqs 1 $neigar
end
symb #msg 1
Checking Model Integrity......
prcs
grph
type standard
line on
set imag png
plot matr
imag model.png
end
c term
proc NormalizeDisps save
data
symb #get { rMaxDisp } datamax tdsp
symb ScaleFactor = 1. / $rMaxDisp * 0.05
scal tdsp $ScaleFactor
end
end$ proc
do loop1 I 1 $nbFreqs 1
eign
modes $nbFreqs $I $neigar
end
exec 1
calc
vmag tdsp xdsp ydsp zdsp
end
proc NormalizeDisps
grph
type standard
line on
set imag png
nvew 1 1
disp $ScaleFactor
plot tdsp
imag mode_$I.png
end
c term
end$ loop1
symb #msg 2 > 'freqs.txt'
Mode frequencies and relative residuals
---------------------------------------
do expFreqLoop I 1 $nbFreqs 1
symb #get { freq } arpack/d $I 1 1
symb #msg 1 >> 'freqs.txt'
Freq $I : $freq
end$ expFreqLoop
c *************************************************************************************************************
c
c Save modal frequencies to file for later use
c
c *************************************************************************************************************
symb #msg 2 > 'freqs.txt'
Mode frequencies and relative residuals
---------------------------------------
do expFreqLoop I 1 $nbFreqs 1
symb #get { freq } arpack/d $I 1 1
symb #msg 1 >> 'freqs.txt'
Freq_$I $freq
end$ expFreqLoop
c *************************************************************************************************************
c
c Save symbol variables to file for later use
c
c *************************************************************************************************************
symb #get { labl } jobname
symb #save '$labl.symb'
stop /* return to command prompt
Results:
Mode frequencies and relative residuals
---------------------------------------
Col 1 Col 2
Row 1: 2.08198D+02 1.12139D-15
Row 2: 2.08198D+02 1.05739D-15
Row 3: 1.24897D+03 9.84899D-17
Row 4: 1.24897D+03 2.40239D-17
Row 5: 1.83727D+03 1.58142D-17
Row 6: 3.23913D+03 2.67841D-17
Row 7: 3.29010D+03 1.39523D-17
Row 8: 3.29010D+03 1.30021D-17
Row 9: 5.51091D+03 5.44624D-17
Row 10: 5.97917D+03 2.20058D-17
Modes Shapes:

Comparison with Theory (Roark's formula for stress and strain):
|
Kn |
fn (Hz) |
OnScale fn (Hz) |
Error |
|
3.51601527 |
51.01706952 |
51.02811 |
0.0216% |
|
22.0344915 |
319.7185161 |
317.7999 |
0.6037% |
|
61.6972144 |
895.2211052 |
881.1394 |
1.5981% |
|
120.901916 |
1754.276071 |
1702.803 |
3.0228% |
Explanations:
The way to use this solver is the following:
Use this new eign command after calc and before prcs
eign
modes 10 1 3
end
10: number of modes
1: mode shape requested
3: nb of arnoldi vectors ( for control of precision)
After that, use exec 1 to execute 1 step of calculation.
exec 1
Right after the exec:
calc
vmag tdsp xdsp ydsp
grph
type standard
line on
set imag png
nvew 1 1
disp 0.0000001
plot tdsp
imag mode_1.png
end
vmag calculates total displacement array called tdsp from the xdsp and ydsp arrays.
grph will plot the mode shape requested
Note: Currently it is only possible to plot one mode shape at the time (second argument of “modes 10 1 3”). If you want all mode shapes, you have to use a loop like in the 3D strip example
You can then use the following code after the exec to write all the frequencies to a text file
symb #msg 2 > 'freqs.txt'
Mode frequencies and relative residuals
---------------------------------------
symb nbFreqs = 10
do expFreqLoop I 1 $nbFreqs 1
symb #get { freq } arpack/d $I 1 1
symb #msg 1 >> 'freqs.txt'
Freq $I : $freq
end$ expFreqLoop
The modal frequencies calculated are stored in the array arpack/d
(You can see it in the data manager)

Note: The “symb #msg nb” command print to console the nb next code lines. If you add “ > filename.txt” it will save to a file instead. If you use “>>” it will append to the end of the file. You can then make a loop which find the frequency variable in the arpack/d array and save it into a variable freq
Limitations of the current modal solver
The current modal solver doesn't support viscous damping vdmp. Thus you can only calculate the modal shapes of a transducer without the water around it.
Make sure that you do not have the vdmp damping model in your material properties.