Simulation of Planar Magnetic membranes; tweeter and midrange

So I know that my model will have a chance to work, and I am back to just simulate the PEN membrane.

The membrane’s rim is fixed:

And I’m using temperature expansion to get a pretension of the membrane:

My first goal is to get the first eigenmode’s frequency to be about 320Hz as that is what I measured in reality, so I fiddle with these temperatures.

The temperature “method” is rather coarse. Is there another way to pre tension the membrane?

When I try to view the results I often get:

There seems to be no logic as to why this happens. Are there any countermeasures?

Here’s the DAT-file:

                    S T E P       2


 E I G E N V A L U E   O U T P U T

MODE NO EIGENVALUE FREQUENCY
REAL PART IMAGINARY PART
(RAD/TIME) (CYCLES/TIME (RAD/TIME)

 P A R T I C I P A T I O N   F A C T O R S

MODE NO. X-COMPONENT Y-COMPONENT Z-COMPONENT X-ROTATION Y-ROTATION Z-ROTATION

  1   0.4805654E-04  -0.4781339E-04  -0.6178585E-08  -0.9077684E-05  -0.3505507E-04  -0.3850795E-05
  2   0.4784251E-04   0.4809577E-04   0.3429643E-08   0.1673309E-04  -0.2075604E-04  -0.1227164E-05
  3  -0.9618200E-07   0.7626926E-07  -0.1542278E-07   0.4763707E-05  -0.7419172E-05  -0.5271971E-02
  4   0.5050000E-07   0.9643509E-06  -0.7744432E-06   0.5044108E-04  -0.8830798E-04   0.1482727E-03
  5   0.6067477E-08   0.8511546E-08   0.2133424E-07  -0.6823401E-06  -0.3667271E-06   0.2088709E-05
  6  -0.5705710E-06  -0.7224026E-06   0.1033308E-05  -0.4670891E-04   0.8088956E-04  -0.1247624E-03
  7  -0.8034729E-07   0.2417688E-08  -0.4586292E-06  -0.6010596E-06   0.1227483E-05  -0.2337483E-05
  8   0.9049364E-07   0.1774469E-07   0.2241060E-03   0.6583203E-06  -0.8465985E-06   0.4377087E-06
  9   0.6269662E-04   0.2137695E-03  -0.6009653E-07  -0.3400669E-06   0.2183151E-07  -0.3022991E-06
 10  -0.2137844E-03   0.6272385E-04   0.7997729E-07   0.6411683E-06  -0.1646654E-05   0.2250747E-05

 E F F E C T I V E   M O D A L   M A S S

MODE NO. X-COMPONENT Y-COMPONENT Z-COMPONENT X-ROTATION Y-ROTATION Z-ROTATION

  1   0.2309431E-08   0.2286120E-08   0.3817491E-16   0.8240435E-10   0.1228858E-08   0.1482862E-10
  2   0.2288906E-08   0.2313203E-08   0.1176245E-16   0.2799963E-09   0.4308131E-09   0.1505931E-11
  3   0.9250978E-14   0.5817000E-14   0.2378621E-15   0.2269290E-10   0.5504411E-10   0.2779368E-04
  4   0.2550250E-14   0.9299727E-12   0.5997623E-12   0.2544302E-08   0.7798300E-08   0.2198480E-07
  5   0.3681428E-16   0.7244642E-16   0.4551498E-15   0.4655880E-12   0.1344888E-12   0.4362707E-11
  6   0.3255513E-12   0.5218655E-12   0.1067725E-11   0.2181722E-08   0.6543120E-08   0.1556566E-07
  7   0.6455687E-14   0.5845214E-17   0.2103407E-12   0.3612726E-12   0.1506714E-11   0.5463827E-11
  8   0.8189099E-14   0.3148741E-15   0.5022350E-07   0.4333856E-12   0.7167290E-12   0.1915889E-12
  9   0.3930866E-08   0.4569741E-07   0.3611593E-14   0.1156455E-12   0.4766150E-15   0.9138477E-13
 10   0.4570378E-07   0.3934281E-08   0.6396367E-14   0.4110968E-12   0.2711468E-11   0.5065863E-11

TOTAL 0.5423333E-07 0.5423247E-07 0.5022539E-07 0.5112905E-08 0.1606120E-07 0.2783126E-04

 T O T A L   E F F E C T I V E   M A S S

MODE NO. X-COMPONENT Y-COMPONENT Z-COMPONENT X-ROTATION Y-ROTATION Z-ROTATION

      0.7191612E-07   0.7194411E-07   0.7206956E-07   0.2514253E-04   0.2513712E-04   0.5010322E-04

You could stretch it with boundary condition or load at the edgd. If it’s a circular membrane then it should be in a cylindrical coordinate system (radial direction to stretch it uniformly).

Not really, it may mean that the .dat file has some missing contents, for instance. In such a case, you should open it from the working directory folder and check its contents in any text editor. See if it includes the eigenfrequency output.

Regarding the thermal expansion approach, make sure that the three temperatures you specify (reference, initial and final) have proper values to achieve the desired thermal strain. CalculiX uses:

ε_th = α (T - T_0) - α (T_i - T_0)

where α is the thermal expansion coefficient, T is the current temperature (due to a defined temperature field here), T_0 is the temperature after which the thermal expansion will start (this is specified together with the expansion coefficient), and T_i is the initial temperature.

CalculiX also has orthotropic and anisotropic thermal expansion, but it requires keyword edits in PrePoMax.

Ok, I did not realize that the formula means that the initial temperature shall be higher than the current temperature for the method to work.

Now I get some real results. But why does this list start at 2,6?

It seems like the simulation discards the first step 2 results due to unstable values.

How is the model constrained ? Is it just that one membrane or all the parts ?

I think I know the reason why the first five modes fail.

I had the Lower frequency bound set too low (100Hz).

Changing it to 10Hz got me the first five modes:

Now I can “trim” the temperature parameters to obtain my real world first mode at 320Hz.

1 Like

Right now I’m simulating the PEN membrane with these constraints:

Yeah, that would explain it. It’s usually best to use 0 Hz (if you want potential rigid body modes too) or just slightly above that (if you won’to to discard potential RBMs).

Ok, just be careful when constraining rotations - sometimes it may cause overstiffening and non-convergence, at least for shells. Membranes only have translational DOFs anyway.

Yes, but it doesn’t seem to make any difference anyway.

I’ll remove just to be on the safe side.

For membrane elements (using Membrane section) it wouldn’t matter. But if you use shell elements then it may have some negative impact (not always, but it least in some nonlinear static analyses).

1 Like

So I’ve made a simulation with the first 1000 modes. It took almost 2.5 hours.

In the resulting frd-files there is a lot of data for each mode, but I’ve failed to make anything useful of it apart from getting the actual modes by evaluating non-zero U3 results.

I tried several automatic metrics based on the FRD data, including maximum U3 displacement, RMS(U3), percentage of active nodes and U3 dominance. None of these metrics correlated well with what visually appears to be an acoustically relevant membrane mode in PrePoMax.

If I group them together within 10 Hz I get:
(python file included here:frd_cruncher.zip (1.5 KB))

Main Mode   Frequency(Hz)   Mode Members
--------------------------------------------------------------
        1          320.00     1
        2          509.87     2,3
        4          540.54     4,5
        6          683.38     6,7
        8          700.52     8
        9          734.53     9
       10          848.98     10,11,12,13
       14          933.54     14,15
       16          975.66     16,17
       18         1002.17     18,19,20
       21         1120.05     21,22
       23         1131.85     23,24

Where the frequency is of the first mode in the mode members group, just to get the list shorter.
Here’s the whole file:Tweeter-PEN_Modes.zip (3.8 KB)

I suspect that many of these modes or groups of modes are of no interest, as they probably have too little acoustic impact/amplitude. As I understand it, PrePoMax only shows the mode with no realistic U3 amplitudes. In fact, many of them are just “flat”:

While others clearly resonate in U3

In a modal analysis of a thin membrane, how can one automatically identify the modes that are acoustically significant and exclude modes that mainly represent in-plane motion or local numerical buckling effects?

And for the SMACK membrane: Which modes are most likely to create distortion because the conductors move through regions of non-uniform magnetic flux density?

I guess that I have to add SSD steps for the frequencies above 3000 Hz, which is the cut-off frequency for the tweeter.

Especially when I add the Lorentz forces from the aluminum strips.

Do you need that many modes ? You can use effective masses to see if you extracted enough modes - their sum in a given direction should be roughly the total mass of the model.

Keep in mind that displacement values are non-physical in this analysis procedure - those are relative/normalized values only.

Check the participation factors - they show how strongly each mode responds in a given direction.

Yeah, I was also going to suggest that. The frequency analysis only shows you the mode shapes with no real displacements/stresses. By adding SSD steps, you can evaluate the actual response to loads in a frequency domain based on this modes.

I think that I need even more. With 1000 modes, I only got to 6500 Hz.
But the goal is 10000 Hz, which produces the highest audible second harmonic.
I will go for a jogging tour while PrePoMax works.

Yes, but the eigenfrequencies will be correct, right?

Do you mean some kind of U3 max? I had several versions of the Python script evaluating different aspects of that, but it all came out the same anyway.

When I have added the aluminum strips, I will do the frequency step again.
Once I have done that, I can skip that step when doing the SSD steps with the eigenfrequencies obtained in the frequency steps without having to do that step for every SSD step, right?

I will now look at the SSD tutorials and after that I will for have some more questions…

And you need all the lower modes up to that one as well ? Because you could increase the lower bound. Or run several steps with different ranges. Of course, you can also set the number of modes to extract.

Sure, natural frequencies and mode shapes are the key outputs. Only the maps such as displacement or stress are relative (so they can be used to see where it deforms more but not by how much).

Participation factors are listed in the .dat files. They don’t provide the actual displacement values (there’s no load here, after all - unlike in SSD), but they show which modes have the strongest response in a given direction.

130.149.89.49:2080/v2016/books/stm/default.htm?startat=ch02s05ath25.html

Yes, you need just one frequency step to generate sufficient number of modes for SSD (it uses modal superposition). They should be generated for a larger range than the one you evaluate in SSD steps.

Just make sure that you enable Storage in the frequency step so that modes can be used for SSD.

Yes, but then CalculiX throws up.

So I will use the eigenfrequency from the frd-file to know the mode and then the actual displacement values are in which column?


                        S T E P       2


     E I G E N V A L U E   O U T P U T

 MODE NO    EIGENVALUE                       FREQUENCY   
                                     REAL PART            IMAGINARY PART
                           (RAD/TIME)      (CYCLES/TIME     (RAD/TIME)

      1   0.4042600E+07   0.2010622E+04   0.3200004E+03   0.0000000E+00
      2   0.1026309E+08   0.3203606E+04   0.5098697E+03   0.0000000E+00
      3   0.1026309E+08   0.3203606E+04   0.5098697E+03   0.0000000E+00
      4   0.1153476E+08   0.3396287E+04   0.5405358E+03   0.0000000E+00
      5   0.1153478E+08   0.3396289E+04   0.5405362E+03   0.0000000E+00
      6   0.1843659E+08   0.4293785E+04   0.6833771E+03   0.0000000E+00
      7   0.1843659E+08   0.4293785E+04   0.6833772E+03   0.0000000E+00
      8   0.1937326E+08   0.4401507E+04   0.7005215E+03   0.0000000E+00
      9   0.2130023E+08   0.4615218E+04   0.7345347E+03   0.0000000E+00
     10   0.2845502E+08   0.5334325E+04   0.8489841E+03   0.0000000E+00
     11   0.2845502E+08   0.5334325E+04   0.8489842E+03   0.0000000E+00
     12   0.2878818E+08   0.5365461E+04   0.8539397E+03   0.0000000E+00
     13   0.2878837E+08   0.5365479E+04   0.8539425E+03   0.0000000E+00
     14   0.3440508E+08   0.5865584E+04   0.9335367E+03   0.0000000E+00
     15   0.3440508E+08   0.5865584E+04   0.9335368E+03   0.0000000E+00
     16   0.3758027E+08   0.6130275E+04   0.9756635E+03   0.0000000E+00

Got it!

Already did that without knowing why:

I’m really super excited to have come this far!

Again, thank you very much for your support!

Disclaimer: I didn’t write the Python script; ChatGPT did :face_with_peeking_eye: