Note
Go to the end to download the full example code.
3D Acoustic Analysis#
This example shows how to perform an acoustic analysis using PyMAPDL and FLUID
elements.
Launch PyMAPDL#
Launch PyMAPDL and load matplotlib
.
from matplotlib import pyplot as plt
from ansys.mapdl.core import launch_mapdl
mapdl = launch_mapdl()
mapdl.clear()
mapdl.prep7()
mapdl.units("SI") # SI - International system (m, kg, s, K).
SI UNITS SPECIFIED FOR INTERNAL
LENGTH (l) = METER (M)
MASS (M) = KILOGRAM (KG)
TIME (t) = SECOND (SEC)
TEMPERATURE (T) = KELVIN (K)
TOFFSET = 0.0 KELVIN
CHARGE (Q) = COULOMB
FORCE (f) = NEWTON (N) (KG-M/SEC2)
HEAT = JOULE (N-M)
PRESSURE = PASCAL (NEWTON/M**2)
ENERGY (W) = JOULE (N-M)
POWER (P) = WATT (N-M/SEC)
CURRENT (i) = AMPERE (COULOMBS/SEC)
CAPACITANCE (C) = FARAD
INDUCTANCE (L) = HENRY
MAGNETIC FLUX = WEBER
RESISTANCE (R) = OHM
ELECTRIC POTENTIAL = VOLT
INPUT UNITS ARE ALSO SET TO SI
Element and Material Properties#
Define the FLUID30
and FLUID130
element types.
mapdl.et(1, "FLUID30", kop1=2)
# Define the material properties
mapdl.mp("SONC", 1, 1500) # sonc in m/s
mapdl.mp("DENS", 1, 1000) # Density in kg/m3
print(mapdl.mplist())
# Define the real const
mapdl.r("1", "1e-6") # Reference pressure for R set 1
print(mapdl.rlist())
LIST MATERIALS 1 TO 1 BY 1
PROPERTY= ALL
MATERIAL NUMBER 1
TEMP DENS
1000.000
TEMP SONC
1500.000
*****MAPDL VERIFICATION RUN ONLY*****
DO NOT USE RESULTS FOR PRODUCTION
LIST REAL SETS 1 TO 1 BY 1
REAL CONSTANT SET 1 ITEMS 1 TO 6
0.10000E-05 0.0000 0.0000 0.0000 0.0000 0.0000
Geometry Definition#
Create a simple sphere.
vnum = mapdl.sphere(rad1=0.5, rad2=1.0)
mapdl.vsbw("all")
mapdl.vplot(show_area_numbering=True)
Geometry Meshing#
First select the material and elements.
mapdl.type(itype=1)
mapdl.real(nset=1)
mapdl.mat(mat=1)
mapdl.mshape(1, "3D")
PRODUCE ALL TETRAHEDRAL ELEMENTS IN 3D.
*** WARNING *** CP = 0.000 TIME= 00:00:00
Structural elements without mid nodes usually produce much more
accurate results in quad or brick shape.
Then choose the element size and perform the mesh.
mapdl.esize(0.25)
mapdl.vmesh("all")
mapdl.eplot(show_node_numbering=False)
Boundary Conditions#
Add surface boundary condition to the nodes using Mapdl.sf()
and the option SHLD
for Surface normal velocity or acceleration.
mapdl.csys(2)
mapdl.asel("s", "loc", "x", 0.5)
mapdl.csys(0)
mapdl.nsla("S", 1)
mapdl.sf("all", "SHLD", 5)
mapdl.allsel()
SELECT ALL ENTITIES OF TYPE= ALL AND BELOW
Solve the model#
Using Mapdl.solve()
mapdl.allsel()
mapdl.run("/SOLU")
mapdl.antype(3)
mapdl.harfrq(freqb=200, freqe=1000)
mapdl.autots("off")
mapdl.nsubst(40)
mapdl.kbc(0)
mapdl.outres("erase") # Save less data in order to reduce the size of .rst file
mapdl.outres("all", "none") # NOTE that other output like stresses is not saved
mapdl.outres("nsol", "all") # Save pressure and displacement
mapdl.outres("fgrad", "all") # Save velocities
mapdl.outres("misc", "all") # For post processing calculations
mapdl.solve()
***** MAPDL SOLVE COMMAND *****
*** NOTE *** CP = 0.000 TIME= 00:00:00
There is no title defined for this analysis.
*****MAPDL VERIFICATION RUN ONLY*****
DO NOT USE RESULTS FOR PRODUCTION
S O L U T I O N O P T I O N S
PROBLEM DIMENSIONALITY. . . . . . . . . . . . .3-D
DEGREES OF FREEDOM. . . . . . UX UY UZ PRES
ANALYSIS TYPE . . . . . . . . . . . . . . . . .HARMONIC
SOLUTION METHOD. . . . . . . . . . . . . . .AUTO
COMPLEX DISPLACEMENT PRINT OPTION . . . . . . .REAL AND IMAGINARY
GLOBALLY ASSEMBLED MATRIX . . . . . . . . . . .SYMMETRIC
*** WARNING *** CP = 0.000 TIME= 00:00:00
No constraints have been defined using the D command.
*** WARNING *** CP = 0.000 TIME= 00:00:00
Load amplitudes will be ramped over the frequency range. Use the KBC,1
command to use a step change.
*** NOTE *** CP = 0.000 TIME= 00:00:00
The step data was checked and warning messages were found.
Please review output or errors file ( ) for these warning messages.
D I S T R I B U T E D D O M A I N D E C O M P O S E R
...Number of elements: 1566
...Number of nodes: 406
...Decompose to 0 CPU domains
...Element load balance ratio = 0.000
L O A D S T E P O P T I O N S
LOAD STEP NUMBER. . . . . . . . . . . . . . . . 1
FREQUENCY RANGE . . . . . . . . . . . . . . . . 200.00 TO 1000.0
NUMBER OF SUBSTEPS. . . . . . . . . . . . . . . 40
STEP CHANGE BOUNDARY CONDITIONS . . . . . . . . YES
PRINT OUTPUT CONTROLS . . . . . . . . . . . . .NO PRINTOUT
DATABASE OUTPUT CONTROLS
ITEM FREQUENCY COMPONENT
ALL NONE
NSOL ALL
FGRA ALL
MISC ALL
AUTO SELECTION OF VT FOR FREQUENCY SWEEP. . . .YES
**** CENTER OF MASS, MASS, AND MASS MOMENTS OF INERTIA ****
CALCULATIONS ASSUME ELEMENT MASS AT ELEMENT CENTROID
TOTAL MASS = 3585.5
MOM. OF INERTIA MOM. OF INERTIA
CENTER OF MASS ABOUT ORIGIN ABOUT CENTER OF MASS
XC = -0.40695E-03 IXX = 1531. IXX = 1531.
YC = 0.48812E-04 IYY = 1535. IYY = 1535.
ZC = -0.30309E-04 IZZ = 1528. IZZ = 1528.
IXY = -0.3614 IXY = -0.3615
IYZ = 0.4602 IYZ = 0.4602
IZX = 0.1969 IZX = 0.1970
*** MASS SUMMARY BY ELEMENT TYPE ***
TYPE MASS
1 3585.52
Range of element maximum matrix coefficients in global coordinates
Maximum = 0.229393189 at element 0.
Minimum = 4.10733557E-02 at element 0.
*** ELEMENT MATRIX FORMULATION TIMES
TYPE NUMBER ENAME TOTAL CP AVE CP
1 1566 FLUID30 0.000 0.000000
Time at end of element matrix formulation CP = 0.
*** ELEMENT RESULT CALCULATION TIMES
TYPE NUMBER ENAME TOTAL CP AVE CP
1 1566 FLUID30 0.000 0.000000
*** NODAL LOAD CALCULATION TIMES
TYPE NUMBER ENAME TOTAL CP AVE CP
1 1566 FLUID30 0.000 0.000000
*** LOAD STEP 1 SUBSTEP 1 COMPLETED. FREQUENCY= 220.000
*** LOAD STEP 1 SUBSTEP 2 COMPLETED. FREQUENCY= 240.000
*** LOAD STEP 1 SUBSTEP 3 COMPLETED. FREQUENCY= 260.000
*** LOAD STEP 1 SUBSTEP 4 COMPLETED. FREQUENCY= 280.000
*** LOAD STEP 1 SUBSTEP 5 COMPLETED. FREQUENCY= 300.000
*** LOAD STEP 1 SUBSTEP 6 COMPLETED. FREQUENCY= 320.000
*** LOAD STEP 1 SUBSTEP 7 COMPLETED. FREQUENCY= 340.000
*** LOAD STEP 1 SUBSTEP 8 COMPLETED. FREQUENCY= 360.000
*** LOAD STEP 1 SUBSTEP 9 COMPLETED. FREQUENCY= 380.000
*** LOAD STEP 1 SUBSTEP 10 COMPLETED. FREQUENCY= 400.000
*** LOAD STEP 1 SUBSTEP 11 COMPLETED. FREQUENCY= 420.000
*** LOAD STEP 1 SUBSTEP 12 COMPLETED. FREQUENCY= 440.000
*** LOAD STEP 1 SUBSTEP 13 COMPLETED. FREQUENCY= 460.000
*** LOAD STEP 1 SUBSTEP 14 COMPLETED. FREQUENCY= 480.000
*** LOAD STEP 1 SUBSTEP 15 COMPLETED. FREQUENCY= 500.000
*** LOAD STEP 1 SUBSTEP 16 COMPLETED. FREQUENCY= 520.000
*** LOAD STEP 1 SUBSTEP 17 COMPLETED. FREQUENCY= 540.000
*** LOAD STEP 1 SUBSTEP 18 COMPLETED. FREQUENCY= 560.000
*** LOAD STEP 1 SUBSTEP 19 COMPLETED. FREQUENCY= 580.000
*** LOAD STEP 1 SUBSTEP 20 COMPLETED. FREQUENCY= 600.000
*** LOAD STEP 1 SUBSTEP 21 COMPLETED. FREQUENCY= 620.000
*** LOAD STEP 1 SUBSTEP 22 COMPLETED. FREQUENCY= 640.000
*** LOAD STEP 1 SUBSTEP 23 COMPLETED. FREQUENCY= 660.000
*** LOAD STEP 1 SUBSTEP 24 COMPLETED. FREQUENCY= 680.000
*** LOAD STEP 1 SUBSTEP 25 COMPLETED. FREQUENCY= 700.000
*** LOAD STEP 1 SUBSTEP 26 COMPLETED. FREQUENCY= 720.000
*** LOAD STEP 1 SUBSTEP 27 COMPLETED. FREQUENCY= 740.000
*** LOAD STEP 1 SUBSTEP 28 COMPLETED. FREQUENCY= 760.000
*** LOAD STEP 1 SUBSTEP 29 COMPLETED. FREQUENCY= 780.000
*** LOAD STEP 1 SUBSTEP 30 COMPLETED. FREQUENCY= 800.000
*** LOAD STEP 1 SUBSTEP 31 COMPLETED. FREQUENCY= 820.000
*** LOAD STEP 1 SUBSTEP 32 COMPLETED. FREQUENCY= 840.000
*** LOAD STEP 1 SUBSTEP 33 COMPLETED. FREQUENCY= 860.000
*** LOAD STEP 1 SUBSTEP 34 COMPLETED. FREQUENCY= 880.000
*** LOAD STEP 1 SUBSTEP 35 COMPLETED. FREQUENCY= 900.000
*** LOAD STEP 1 SUBSTEP 36 COMPLETED. FREQUENCY= 920.000
*** LOAD STEP 1 SUBSTEP 37 COMPLETED. FREQUENCY= 940.000
*** LOAD STEP 1 SUBSTEP 38 COMPLETED. FREQUENCY= 960.000
*** LOAD STEP 1 SUBSTEP 39 COMPLETED. FREQUENCY= 980.000
*** LOAD STEP 1 SUBSTEP 40 COMPLETED. FREQUENCY= 1000.00
Post1: Time step results#
Listing the results
mapdl.post1()
print(mapdl.set("LIST"))
***** INDEX OF DATA SETS ON RESULTS FILE *****
SET TIME/FREQ LOAD STEP SUBSTEP CUMULATIVE
1 220.00000 1 1 1
2 220.00000 1 1 1
3 240.00000 1 2 2
4 240.00000 1 2 2
5 260.00000 1 3 3
6 260.00000 1 3 3
7 280.00000 1 4 4
8 280.00000 1 4 4
9 300.00000 1 5 5
10 300.00000 1 5 5
11 320.00000 1 6 6
12 320.00000 1 6 6
13 340.00000 1 7 7
14 340.00000 1 7 7
15 360.00000 1 8 8
16 360.00000 1 8 8
17 380.00000 1 9 9
18 380.00000 1 9 9
19 400.00000 1 10 10
20 400.00000 1 10 10
21 420.00000 1 11 11
22 420.00000 1 11 11
23 440.00000 1 12 12
24 440.00000 1 12 12
25 460.00000 1 13 13
26 460.00000 1 13 13
27 480.00000 1 14 14
28 480.00000 1 14 14
29 500.00000 1 15 15
30 500.00000 1 15 15
31 520.00000 1 16 16
32 520.00000 1 16 16
33 540.00000 1 17 17
34 540.00000 1 17 17
35 560.00000 1 18 18
36 560.00000 1 18 18
37 580.00000 1 19 19
38 580.00000 1 19 19
39 600.00000 1 20 20
40 600.00000 1 20 20
41 620.00000 1 21 21
42 620.00000 1 21 21
43 640.00000 1 22 22
44 640.00000 1 22 22
45 660.00000 1 23 23
46 660.00000 1 23 23
47 680.00000 1 24 24
48 680.00000 1 24 24
49 700.00000 1 25 25
50 700.00000 1 25 25
51 720.00000 1 26 26
52 720.00000 1 26 26
53 740.00000 1 27 27
54 740.00000 1 27 27
55 760.00000 1 28 28
56 760.00000 1 28 28
57 780.00000 1 29 29
58 780.00000 1 29 29
59 800.00000 1 30 30
60 800.00000 1 30 30
61 820.00000 1 31 31
62 820.00000 1 31 31
63 840.00000 1 32 32
64 840.00000 1 32 32
65 860.00000 1 33 33
66 860.00000 1 33 33
67 880.00000 1 34 34
68 880.00000 1 34 34
69 900.00000 1 35 35
70 900.00000 1 35 35
71 920.00000 1 36 36
72 920.00000 1 36 36
73 940.00000 1 37 37
74 940.00000 1 37 37
75 960.00000 1 38 38
76 960.00000 1 38 38
77 980.00000 1 39 39
78 980.00000 1 39 39
79 1000.0000 1 40 40
80 1000.0000 1 40 40
Post26: Time dependent results#
Getting results for specific nodes
mapdl.post26()
freqs = mapdl.post_processing.time_values[::2]
node = 276
# Getting results
node_pressure = mapdl.nsol(3, node, "spl")
node_sound_pressure_level = mapdl.nsol(4, node, "SPLA")
# Plotting
fig, ax = plt.subplots(1, 2)
ax[0].plot(freqs, node_pressure)
ax[0].set_xlabel("Frequencies (Hz)")
ax[0].set_ylabel("Sound pressure level (Pa)")
ax[1].plot(freqs, node_sound_pressure_level, label="Nodal Sound Pressure")
ax[1].set_xlabel("Frequencies (Hz)")
ax[1].set_ylabel("A-weighted sound\npressure level (dBA)")
fig.suptitle(f"Node {node} Results")
fig.tight_layout()
fig.show()
Stop MAPDL
mapdl.exit()
Total running time of the script: (0 minutes 10.485 seconds)