Eigenvalue analysis of Eiffel tower is done using JuliaFEM 0.3.3 and Julia 0.6. Assembly of global matrices and writing results is optimized a bit. Results show that when models are big enough, solution of eigenvalue problem takes about 80 % of time.

Code

using JuliaFEM
using JuliaFEM.Preprocess
using JuliaFEM.Postprocess

#model = "EIFFEL_TOWER_TET10_220271"
model = ARGS[1]
mesh = joinpath("eiffel-tower", "$model.inp")
results = "$model"

@timeit "run performance test" begin

@timeit "parse input data" begin
    mesh = abaqus_read_mesh(mesh)
    for (nid, ncoords) in mesh.nodes
        mesh.nodes[nid] = 304.8 * ncoords
    end
    info("element sets = ", collect(keys(mesh.element_sets)))
    info("surface sets = ", collect(keys(mesh.surface_sets)))
end

@timeit "initialize model" begin
    tower = Problem(Elasticity, "tower", 3)
    tower.elements = create_elements(mesh, "TOWER")
    update!(tower, "youngs modulus", 210.0E3)
    update!(tower, "poissons ratio", 0.3)
    update!(tower, "density", 7.85E-9)

    support = Problem(Dirichlet, "fixed", 3, "displacement")
    support.elements = create_surface_elements(mesh, "SUPPORT")
    update!(support, "geometry", mesh.nodes)
    update!(support, "displacement 1", 0.0)
    update!(support, "displacement 2", 0.0)
    update!(support, "displacement 3", 0.0)
end

@timeit "solve eigenvalue problem" begin
    solver = Solver(Modal, tower, support)
    solver.xdmf = Xdmf(results; overwrite=true)
    solver.properties.nev = 5
    solver.properties.which = :SM
    solver()
    println("Eigenvalues: ", sqrt.(solver.properties.eigvals) / (2*pi))
end

end

print_timer()

Results

220271 nodes

Eigenvalues: [0.554667, 0.557987, 1.59926, 1.60043, 2.37304]
 ──────────────────────────────────────────────────────────────────────────────
                                       Time                   Allocations
                               ──────────────────────   ───────────────────────
       Tot / % measured:        18436996367s / 0.00%        46.1GiB / 97.8%

 Section               ncalls     time   %tot     avg     alloc   %tot      avg
 ──────────────────────────────────────────────────────────────────────────────
 run performance test       1     122s   100%    122s   45.1GiB  100%   45.1GiB
   solve eigenvalue...      1     116s  95.2%    116s   44.3GiB  98.1%  44.3GiB
     assemble matrices      1    46.0s  37.8%   46.0s   24.6GiB  54.5%  24.6GiB
       assemble tow...      1    22.3s  18.3%   22.3s   14.0GiB  31.0%  14.0GiB
       assemble tower       1    16.4s  13.5%   16.4s   5.10GiB  11.3%  5.10GiB
       assemble fixed       1    334ms  0.27%   334ms   14.6MiB  0.03%  14.6MiB
     solve eigenval...      1    37.9s  31.1%   37.9s   8.92GiB  19.8%  8.92GiB
     eliminate boun...      1    10.4s  8.50%   10.4s   5.11GiB  11.3%  5.11GiB
     save results t...      1    6.39s  5.24%   6.39s    793MiB  1.72%   793MiB
       fetch geometry       1    2.94s  2.42%   2.94s    298MiB  0.65%   298MiB
       save modes           1    1.55s  1.27%   1.55s    336MiB  0.73%   336MiB
         store eige...      5    689ms  0.57%   138ms    287MiB  0.62%  57.4MiB
           create m...      5    646ms  0.53%   129ms    260MiB  0.56%  52.1MiB
         save topol...      5    261ms  0.21%  52.1ms   28.1MiB  0.06%  5.62MiB
         save topol...      5   26.6ms  0.02%  5.32ms   77.7KiB  0.00%  15.5KiB
       create topol...      1    1.25s  1.02%   1.25s    108MiB  0.23%   108MiB
       create node ...      1    122ms  0.10%   122ms   16.0MiB  0.03%  16.0MiB
       create ncoor...      1    106ms  0.09%   106ms   25.7MiB  0.06%  25.7MiB
   parse input data         1    4.77s  3.92%   4.77s    689MiB  1.49%   689MiB
   initialize model         1    1.13s  0.93%   1.13s    180MiB  0.39%   180MiB
 ──────────────────────────────────────────────────────────────────────────────

376120 nodes

Eigenvalues: [0.548343, 0.548526, 1.56613, 1.56662, 2.32376]
 ──────────────────────────────────────────────────────────────────────────────
                                       Time                   Allocations
                               ──────────────────────   ───────────────────────
       Tot / % measured:        18436996624s / 0.00%        81.2GiB / 98.7%

 Section               ncalls     time   %tot     avg     alloc   %tot      avg
 ──────────────────────────────────────────────────────────────────────────────
 run performance test       1     231s   100%    231s   80.2GiB  100%   80.2GiB
   solve eigenvalue...      1     221s  96.0%    221s   78.7GiB  98.1%  78.7GiB
     assemble matrices      1    87.1s  37.7%   87.1s   43.8GiB  54.6%  43.8GiB
       assemble tow...      1    44.0s  19.1%   44.0s   24.5GiB  30.6%  24.5GiB
       assemble tower       1    23.1s  10.0%   23.1s   9.59GiB  12.0%  9.59GiB
       assemble fixed       1    386ms  0.17%   386ms   44.0MiB  0.05%  44.0MiB
     solve eigenval...      1    74.7s  32.4%   74.7s   16.5GiB  20.6%  16.5GiB
     eliminate boun...      1    22.9s  9.93%   22.9s   8.78GiB  11.0%  8.78GiB
     save results t...      1    13.6s  5.89%   13.6s   1.34GiB  1.67%  1.34GiB
       fetch geometry       1    6.69s  2.90%   6.69s    535MiB  0.65%   535MiB
       save modes           1    3.68s  1.59%   3.68s    558MiB  0.68%   558MiB
         store eige...      5    2.82s  1.22%   565ms    489MiB  0.60%  97.7MiB
           create m...      5    2.74s  1.19%   547ms    445MiB  0.54%  88.9MiB
         save topol...      5    349ms  0.15%  69.7ms   41.8MiB  0.05%  8.36MiB
         save topol...      5   46.3ms  0.02%  9.25ms    164KiB  0.00%  32.7KiB
       create topol...      1    2.03s  0.88%   2.03s    190MiB  0.23%   190MiB
       create ncoor...      1    489ms  0.21%   489ms   43.5MiB  0.05%  43.5MiB
       create node ...      1    150ms  0.07%   150ms   33.0MiB  0.04%  33.0MiB
   parse input data         1    7.44s  3.22%   7.44s   1.20GiB  1.50%  1.20GiB
   initialize model         1    1.88s  0.82%   1.88s    316MiB  0.38%   316MiB
 ──────────────────────────────────────────────────────────────────────────────

921317 nodes

Eigenvalues: [0.542289, 0.542386, 1.54818, 1.54852, 2.26661]
 ──────────────────────────────────────────────────────────────────────────────
                                       Time                   Allocations
                               ──────────────────────   ───────────────────────
       Tot / % measured:        18436997275s / 0.00%         204GiB / 99.5%

 Section               ncalls     time   %tot     avg     alloc   %tot      avg
 ──────────────────────────────────────────────────────────────────────────────
 run performance test       1     627s   100%    627s    203GiB  100%    203GiB
   solve eigenvalue...      1     604s  96.4%    604s    199GiB  98.2%   199GiB
     assemble matrices      1     231s  36.8%    231s    108GiB  53.2%   108GiB
       assemble tow...      1     126s  20.1%    126s   62.4GiB  30.8%  62.4GiB
       assemble tower       1    50.0s  7.97%   50.0s   20.7GiB  10.2%  20.7GiB
       assemble fixed       1    518ms  0.08%   518ms    151MiB  0.07%   151MiB
     solve eigenval...      1     205s  32.7%    205s   45.6GiB  22.5%  45.6GiB
     eliminate boun...      1    80.3s  12.8%   80.3s   21.8GiB  10.8%  21.8GiB
     save results t...      1    36.8s  5.86%   36.8s   3.27GiB  1.61%  3.27GiB
       save modes           1    13.2s  2.11%   13.2s   1.30GiB  0.64%  1.30GiB
         store eige...      5    12.0s  1.91%   2.40s   1.17GiB  0.58%   239MiB
           create m...      5    11.7s  1.87%   2.35s   1.06GiB  0.52%   218MiB
         save topol...      5    450ms  0.07%  89.9ms   83.5MiB  0.04%  16.7MiB
         save topol...      5    116ms  0.02%  23.3ms    496KiB  0.00%  99.2KiB
       fetch geometry       1    12.1s  1.93%   12.1s   1.31GiB  0.65%  1.31GiB
       create ncoor...      1    3.14s  0.50%   3.14s    106MiB  0.05%   106MiB
       create topol...      1    2.66s  0.42%   2.66s    485MiB  0.23%   485MiB
       create node ...      1    232ms  0.04%   232ms   67.0MiB  0.03%  67.0MiB
   parse input data         1    18.7s  2.98%   18.7s   2.94GiB  1.45%  2.94GiB
   initialize model         1    3.71s  0.59%   3.71s    802MiB  0.39%   802MiB
 ──────────────────────────────────────────────────────────────────────────────

1327989 nodes

Eigenvalues: [0.541056, 0.541163, 1.54381, 1.54408, 2.25313]
 ──────────────────────────────────────────────────────────────────────────────
                                       Time                   Allocations
                               ──────────────────────   ───────────────────────
       Tot / % measured:        18436998213s / 0.00%         307GiB / 100%

 Section               ncalls     time   %tot     avg     alloc   %tot      avg
 ──────────────────────────────────────────────────────────────────────────────
 run performance test       1     905s   100%    905s    306GiB  100%    306GiB
   solve eigenvalue...      1     873s  96.5%    873s    301GiB  98.3%   301GiB
     solve eigenval...      1     350s  38.7%    350s   71.8GiB  23.5%  71.8GiB
     assemble matrices      1     256s  28.3%    256s    168GiB  54.9%   168GiB
       assemble tow...      1     135s  14.9%    135s   94.5GiB  30.9%  94.5GiB
       assemble tower       1    73.6s  8.13%   73.6s   36.7GiB  12.0%  36.7GiB
       assemble fixed       1    680ms  0.08%   680ms    229MiB  0.07%   229MiB
     eliminate boun...      1     115s  12.7%    115s   26.4GiB  8.64%  26.4GiB
     save results t...      1    65.9s  7.28%   65.9s   4.71GiB  1.54%  4.71GiB
       save modes           1    29.8s  3.29%   29.8s   1.87GiB  0.61%  1.87GiB
         store eige...      5    27.9s  3.09%   5.59s   1.68GiB  0.55%   345MiB
           create m...      5    27.5s  3.04%   5.51s   1.53GiB  0.50%   314MiB
         save topol...      5    830ms  0.09%   166ms    129MiB  0.04%  25.8MiB
         save topol...      5    206ms  0.02%  41.1ms    887KiB  0.00%   177KiB
       fetch geometry       1    20.6s  2.27%   20.6s   1.89GiB  0.62%  1.89GiB
       create topol...      1    8.58s  0.95%   8.58s    724MiB  0.23%   724MiB
       create ncoor...      1    4.74s  0.52%   4.74s    152MiB  0.05%   152MiB
       create node ...      1    581ms  0.06%   581ms   67.0MiB  0.02%  67.0MiB
   parse input data         1    27.0s  2.98%   27.0s   4.19GiB  1.37%  4.19GiB
   initialize model         1    4.84s  0.53%   4.84s   1.16GiB  0.38%  1.16GiB
 ──────────────────────────────────────────────────────────────────────────────

2357071 nodes

 ──────────────────────────────────────────────────────────────────────────────
                                       Time                   Allocations
                               ──────────────────────   ───────────────────────
       Tot / % measured:        18437001397s / 0.00%         587GiB / 100%

 Section               ncalls     time   %tot     avg     alloc   %tot      avg
 ──────────────────────────────────────────────────────────────────────────────
 run performance test       1    3158s   100%   3158s    586GiB  100%    586GiB
   solve eigenvalue...      1    3112s  98.5%   3112s    576GiB  98.3%   576GiB
     solve eigenval...      1    1381s  43.7%   1381s    149GiB  25.5%   149GiB
     assemble matrices      1     928s  29.4%    928s    306GiB  52.2%   306GiB
       assemble tow...      1     589s  18.6%    589s    174GiB  29.6%   174GiB
       assemble tower       1     143s  4.52%    143s   63.5GiB  10.8%  63.5GiB
       assemble fixed       1    902ms  0.03%   902ms    401MiB  0.07%   401MiB
     eliminate boun...      1     381s  12.1%    381s   58.0GiB  9.90%  58.0GiB
     save results t...      1     206s  6.51%    206s   8.66GiB  1.48%  8.66GiB
       save modes           1    78.6s  2.49%   78.6s   3.32GiB  0.57%  3.32GiB
         store eige...      5    75.1s  2.38%   15.0s   2.99GiB  0.51%   612MiB
           create m...      5    73.3s  2.32%   14.7s   2.72GiB  0.46%   557MiB
         save topol...      5    2.16s  0.07%   433ms    236MiB  0.04%  47.3MiB
         save topol...      5    358ms  0.01%  71.5ms   1.63MiB  0.00%   335KiB
       fetch geometry       1    64.6s  2.04%   64.6s   3.58GiB  0.61%  3.58GiB
       create ncoor...      1    22.9s  0.72%   22.9s    270MiB  0.05%   270MiB
       create topol...      1    22.1s  0.70%   22.1s   1.32GiB  0.23%  1.32GiB
       create node ...      1    14.5s  0.46%   14.5s    135MiB  0.02%   135MiB
   parse input data         1    38.2s  1.21%   38.2s   7.75GiB  1.32%  7.75GiB
   initialize model         1    7.85s  0.25%   7.85s   2.17GiB  0.37%  2.17GiB
 ──────────────────────────────────────────────────────────────────────────────

3640549 nodes

 ──────────────────────────────────────────────────────────────────────────────
                                       Time                   Allocations
                               ──────────────────────   ───────────────────────
       Tot / % measured:        18436983005s / 0.00%         805GiB / 100%

 Section               ncalls     time   %tot     avg     alloc   %tot      avg
 ──────────────────────────────────────────────────────────────────────────────
 run performance test       1    9182s   100%   9182s    804GiB  100%    804GiB
   solve eigenvalue...      1    9133s  99.5%   9133s    788GiB  98.0%   788GiB
     solve eigenval...      1    7484s  81.5%   7484s    279GiB  34.7%   279GiB
     assemble matrices      1     580s  6.32%    580s    318GiB  39.5%   318GiB
       assemble tower       1     220s  2.40%    220s   93.2GiB  11.6%  93.2GiB
       assemble tow...      1     188s  2.04%    188s    114GiB  14.1%   114GiB
       assemble fixed       1    1.17s  0.01%   1.17s    586MiB  0.07%   586MiB
     save results t...      1     377s  4.11%    377s   13.8GiB  1.72%  13.8GiB
       fetch geometry       1     143s  1.56%    143s   5.90GiB  0.73%  5.90GiB
       save modes           1     135s  1.47%    135s   5.08GiB  0.63%  5.08GiB
         store eige...      5     129s  1.41%   25.8s   4.61GiB  0.57%   944MiB
           create m...      5     127s  1.39%   25.5s   4.20GiB  0.52%   861MiB
         save topol...      5    3.34s  0.04%   669ms    326MiB  0.04%  65.1MiB
         save topol...      5    582ms  0.01%   116ms   1.79MiB  0.00%   366KiB
       create topol...      1    40.7s  0.44%   40.7s   2.13GiB  0.26%  2.13GiB
       create ncoor...      1    35.2s  0.38%   35.2s    417MiB  0.05%   417MiB
       create node ...      1    18.3s  0.20%   18.3s    271MiB  0.03%   271MiB
     eliminate boun...      1     326s  3.55%    326s   91.6GiB  11.4%  91.6GiB
   parse input data         1    40.1s  0.44%   40.1s   12.5GiB  1.56%  12.5GiB
   initialize model         1    8.80s  0.10%   8.80s   3.51GiB  0.44%  3.51GiB
 ──────────────────────────────────────────────────────────────────────────────

Further analysis and discussion

Dashed results are calculated using JuliaFEM 0.3.2 and solid lines are for 0.3.3.

Assemly of stiffness and mass matrix is optimized without sacrificing readablity of code (too much). It can still be optimized more to get even better performance, or run assembler using threads. The results however shows that vast major of the time is spend in a single command eigs(K, M). So when model sizes are realistic, the assembly time is under 10 % of total solution time. The result is totally different compared to small toy models, where assembly time can be over 50 % of total solution time. That’s the reason why performance tests must be done using full size models.

Conclusions are, that we get 80-90 % of performance with 10 % of effort using dynamic language like Julia. The performance penalty, compared to some statically typed languages like FORTRAN or C, is acceptable by taking into account that development time of the software itself is reduced dramatically.

Next steps are to optimize memory usage during the solution of eigenmodes to be able to calculate even bigger models.