atena

Lang cs
In [1]:
import os
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import weibull_min, norm
from scipy.stats import skew, kurtosis
import pathlib
import subprocess
from IPython.display import FileLink
#os.chdir('/home/kelidas/workspace_git/python_examples/atena_2')
In [2]:
%config InlineBackend.figure_format = 'svg'
%matplotlib inline

Postprocessing výsledků z numerických výpočtů

  • ve složce C_AtenaResults jsou soubory C_1.txt až C_64.txt, které obsahují hodnoty z čtyř monitorů zaznamenaných programem Atena (monitory jsou uvozeny hlavičkou a jsou za sebou)

  • velikostí bylo cca 10, simulací (pilotní studie 32 s opakováním dokud se nenašly optimální parametry, finální 64) - tzn. toto vyhodnocení je nutné zopakovat ještě mnohokrát (např. 20-30x)

  • bohužel nic lepšího než excel jsem neuměl, takže to vypadalo viz C_AtenaResults\C_W64.xls + trochu mně pomáhalo C a gnuplot

  • cílem je vykreslit graf všech křivek posun vs síla se zvýrazněním maxim, kde posun = (monitor1 - monitor2) * 1e6 [mm] a síla = monitor3

  • najít maximální sílu všech křivek a spočítat střední hodnotu, smodch, šikmost a špičatost

  • vykreslit histogramy maximální síly a jí příslušející deformace

  • fit maximální síly pomocí weibullova a normálního rozdělení

In [3]:
data_dir = 'C_AtenaResults'
data_all = []
for i in range(1,65):
    c = 0
    data = []
    with open(os.path.join(data_dir, 'C_%d.txt' % i), 'r', encoding='cp1250') as f:
        monitor = np.array([])
        for l in f.readlines():
            if l == '-----------------\n':
                c += 1
                continue
            if c == 2:
                if l == '\n':
                    c = 0
                    data.append(monitor)
                    monitor = np.array([])
                else:
                    v = np.float64(l.split()[1])
                    monitor = np.append(monitor, v)
    data_all.append(np.array(data).T)  
In [4]:
data_all[0][:3, :]
Out[4]:
array([[5.600e-08, 2.400e-08, 1.343e-04, 1.119e-02],
       [1.120e-07, 4.800e-08, 2.686e-04, 2.238e-02],
       [1.680e-07, 7.201e-08, 4.029e-04, 3.357e-02]])

Vykreslení ld křivek se zvýrazněním maxim

In [5]:
fig, ax = plt.subplots(figsize=(6,4), dpi=100)

for data in data_all:
    displ = (data[:, 0] - data[:, 1]) * 1e6
    force = data[:, 3]
    ax.plot(displ, force, 'k-', lw=.5)
    
    fidx = np.argmax(force)
    ax.plot(displ[fidx], force[fidx], 'ro', lw=.5, ms=2)
    
ax.set_xlim(0,20)
ax.set_xlabel('displ [mm]')
ax.set_ylabel('force [kN]');
2022-11-21T12:11:07.480449 image/svg+xml Matplotlib v3.4.3, https://matplotlib.org/

Analýza maxim a jim odpovídajících posunů

In [6]:
f_max = np.array([])
d_fmax = np.array([])
for data in data_all:
    f = data[:,3]
    fm_idx = np.argmax(f)
    f_max = np.append(f_max, f[fm_idx])
    displ = (data[:, 0] - data[:, 1]) * 1e6
    d_fmax = np.append(d_fmax, displ[fm_idx])
In [7]:
fig, (ax1, ax2) = plt.subplots(nrows=1, ncols=2, figsize=(8,4), dpi=100)

pn = norm.fit(f_max)
pw = weibull_min.fit(f_max, floc=0)
rv_norm = norm(*pn)
rv_weib = weibull_min(*pw)
print('parametry normálního rozdělení (mu, var) =', rv_norm.stats('mv'))
print('parametry dvouparametrického weibullova rozdělení (mu, var) =', rv_weib.stats('mv'))

ax1.hist(f_max, density=True)
x = np.linspace(1.5,3.5,1000)
ax1.plot(x, rv_norm.pdf(x), label='norm')
ax1.plot(x, rv_weib.pdf(x), label='weibull')

ax1.set_xlabel(u'maximální síla [kN]')
ax1.set_ylabel(u'relativní četnosti')
ax1.legend(loc='best')

ax2.hist(d_fmax, density=True)

ax2.set_xlabel('deformace [mm]')

fig.tight_layout()
parametry normálního rozdělení (mu, var) = (array(2.729125), array(0.14435252))
parametry dvouparametrického weibullova rozdělení (mu, var) = (array(2.72809326), array(0.15355103))
2022-11-21T12:11:09.780434 image/svg+xml Matplotlib v3.4.3, https://matplotlib.org/
In [8]:
print('{:40} = {:+.6f}'.format(u'střední hodnota maximální síly', np.mean(f_max)))
print('{:40} = {:+.6f}'.format(u'směrodatná odchylka maximální síly', np.std(f_max)))
print('{:40} = {:+.6f}'.format(u'šikmost maximální síly', skew(f_max)))
print('{:40} = {:+.6f}'.format(u'špičatost maximální síly', kurtosis(f_max)))
střední hodnota maximální síly           = +2.729125
směrodatná odchylka maximální síly       = +0.379938
šikmost maximální síly                   = -0.266260
špičatost maximální síly                 = -0.408317

Pro každý vzorek vygenerovat A4

  • obsahuje graf
  • hodnotu max síly a odpovídajícího posunu
In [9]:
path = pathlib.Path('report') / 'figs'
path.mkdir(parents=True, exist_ok=True)
In [10]:
report = r"""\documentclass[a4paper,10pt,titlepage]{article}
\usepackage[left=2cm,
            textwidth=17cm,
            textheight=24cm,
            top=3cm]{geometry}
\usepackage[utf8]{inputenc}
\usepackage[czech]{babel}
%\usepackage{times}
\usepackage{lmodern}
\usepackage[unicode]{hyperref}
\usepackage[T1]{fontenc}
\usepackage{graphicx}

\usepackage{verbatim}

%\usepackage{layouts}

\title{Report}
\date{\today}
\author{Václav Sadílek}

\maxdeadcycles=200

\begin{document}

\maketitle

\listoffigures

\section{Vzorky}

"""
In [11]:
fig, ax = plt.subplots(figsize=(6,4), tight_layout=True)

for di, data in enumerate(data_all):
    displ = (data[:, 0] - data[:, 1]) * 1e6
    force = data[:, 3]
    
    fidx = np.argmax(force)
    
    if di == 0:
        l1, = ax.plot(displ, force, 'k-', lw=1)
        p1, = ax.plot(displ[fidx], force[fidx], 'ro', lw=1, ms=2)

        ax.set_xlim(0,20)
        ax.set_ylim(0, 3.6)
        ax.set_xlabel('displ [mm]')
        ax.set_ylabel('force [kN]')
    else:
        l1.set_xdata(displ)
        l1.set_ydata(force)
        p1.set_xdata(displ[fidx])
        p1.set_ydata(force[fidx])
    
    fig.savefig('report/figs/fig_{:02d}.pdf'.format(di), bbox_inches='tight', pad_inches=.01)
    
    report += r"""
\subsection{{Vzorek č.{}}}
\begin{{figure}}[htb!]
    \centering
    \includegraphics[width=10cm]{{figs/fig_{:02d}.pdf}}
    \caption{{Vzorek č.~{} - maximální síla {:.3f}\,kN a příslušný posun {:.3f}\,mm}}
    \label{{fig:vzorek{:02d}}}
\end{{figure}}
\clearpage
    """.format(di+1, di, di+1, force[fidx], displ[fidx], di+1)
2022-11-21T12:11:20.678921 image/svg+xml Matplotlib v3.4.3, https://matplotlib.org/
In [12]:
report += '\end{document}'
fname = 'report/report.tex'
with open(fname, 'w') as f:
    f.write(report)
In [13]:
#os.system('pdflatex -output-directory report report/report.tex')
subprocess.Popen(['pdflatex', '-output-directory', 'report', 'report/report.tex'])
FileLink(fname.replace('tex', 'pdf'))
Out[13]:
Path (report/report.pdf) doesn't exist. It may still be in the process of being generated, or you may have the incorrect path.
This is pdfTeX, Version 3.141592653-2.6-1.40.24 (TeX Live 2022) (preloaded format=pdflatex)
 restricted \write18 enabled.
entering extended mode
(./report/report.tex
LaTeX2e <2022-06-01> patch level 2
L3 programming layer <2022-06-16>
(/usr/local/texlive/2022/texmf-dist/tex/latex/base/article.cls
Document Class: article 2021/10/04 v1.4n Standard LaTeX document class
(/usr/local/texlive/2022/texmf-dist/tex/latex/base/size10.clo))
(/usr/local/texlive/2022/texmf-dist/tex/latex/geometry/geometry.sty
(/usr/local/texlive/2022/texmf-dist/tex/latex/graphics/keyval.sty)
(/usr/local/texlive/2022/texmf-dist/tex/generic/iftex/ifvtex.sty
(/usr/local/texlive/2022/texmf-dist/tex/generic/iftex/iftex.sty)))
(/usr/local/texlive/2022/texmf-dist/tex/latex/base/inputenc.sty)
(/usr/local/texlive/2022/texmf-dist/tex/generic/babel/babel.sty
(/usr/local/texlive/2022/texmf-dist/tex/generic/babel/txtbabel.def)
(/usr/local/texlive/2022/texmf-dist/tex/generic/babel-czech/czech.ldf))
(/usr/local/texlive/2022/texmf-dist/tex/generic/babel/locale/cs/babel-czech.tex
) (/usr/local/texlive/2022/texmf-dist/tex/latex/lm/lmodern.sty)
(/usr/local/texlive/2022/texmf-dist/tex/latex/hyperref/hyperref.sty
(/usr/local/texlive/2022/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty)
(/usr/local/texlive/2022/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty
(/usr/local/texlive/2022/texmf-dist/tex/generic/infwarerr/infwarerr.sty))
(/usr/local/texlive/2022/texmf-dist/tex/generic/kvsetkeys/kvsetkeys.sty)
(/usr/local/texlive/2022/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty)
(/usr/local/texlive/2022/texmf-dist/tex/generic/pdfescape/pdfescape.sty)
(/usr/local/texlive/2022/texmf-dist/tex/latex/hycolor/hycolor.sty)
(/usr/local/texlive/2022/texmf-dist/tex/latex/letltxmacro/letltxmacro.sty)
(/usr/local/texlive/2022/texmf-dist/tex/latex/auxhook/auxhook.sty)
(/usr/local/texlive/2022/texmf-dist/tex/latex/hyperref/nameref.sty
(/usr/local/texlive/2022/texmf-dist/tex/latex/refcount/refcount.sty)
(/usr/local/texlive/2022/texmf-dist/tex/generic/gettitlestring/gettitlestring.s
ty (/usr/local/texlive/2022/texmf-dist/tex/latex/kvoptions/kvoptions.sty)))
(/usr/local/texlive/2022/texmf-dist/tex/latex/hyperref/pd1enc.def)
(/usr/local/texlive/2022/texmf-dist/tex/generic/intcalc/intcalc.sty)
(/usr/local/texlive/2022/texmf-dist/tex/generic/etexcmds/etexcmds.sty)
(/usr/local/texlive/2022/texmf-dist/tex/latex/hyperref/puenc.def)
(/usr/local/texlive/2022/texmf-dist/tex/latex/url/url.sty)
(/usr/local/texlive/2022/texmf-dist/tex/generic/bitset/bitset.sty
(/usr/local/texlive/2022/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty))
(/usr/local/texlive/2022/texmf-dist/tex/latex/base/atbegshi-ltx.sty))
(/usr/local/texlive/2022/texmf-dist/tex/latex/hyperref/hpdftex.def
(/usr/local/texlive/2022/texmf-dist/tex/latex/base/atveryend-ltx.sty)
(/usr/local/texlive/2022/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty

(/usr/local/texlive/2022/texmf-dist/tex/generic/uniquecounter/uniquecounter.sty
))) (/usr/local/texlive/2022/texmf-dist/tex/latex/base/fontenc.sty
(/usr/local/texlive/2022/texmf-dist/tex/latex/lm/t1lmr.fd))
(/usr/local/texlive/2022/texmf-dist/tex/latex/graphics/graphicx.sty
(/usr/local/texlive/2022/texmf-dist/tex/latex/graphics/graphics.sty
(/usr/local/texlive/2022/texmf-dist/tex/latex/graphics/trig.sty)
(/usr/local/texlive/2022/texmf-dist/tex/latex/graphics-cfg/graphics.cfg)
(/usr/local/texlive/2022/texmf-dist/tex/latex/graphics-def/pdftex.def)))
(/usr/local/texlive/2022/texmf-dist/tex/latex/tools/verbatim.sty)
(/usr/local/texlive/2022/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def)
No file report.aux.
*geometry* driver: auto-detecting
*geometry* detected driver: pdftex
(/usr/local/texlive/2022/texmf-dist/tex/context/base/mkii/supp-pdf.mkii
[Loading MPS to PDF converter (version 2006.09.02).]
) (/usr/local/texlive/2022/texmf-dist/tex/latex/epstopdf-pkg/epstopdf-base.sty
(/usr/local/texlive/2022/texmf-dist/tex/latex/latexconfig/epstopdf-sys.cfg))
(/usr/local/texlive/2022/texmf-dist/tex/latex/lm/ot1lmr.fd)
(/usr/local/texlive/2022/texmf-dist/tex/latex/lm/omllmm.fd)
(/usr/local/texlive/2022/texmf-dist/tex/latex/lm/omslmsy.fd)
(/usr/local/texlive/2022/texmf-dist/tex/latex/lm/omxlmex.fd) [1{/usr/local/texl
ive/2022/texmf-var/fonts/map/pdftex/updmap/pdftex.map}]
No file report.lof.

pdfTeX warning (ext4): destination with the same identifier (name{page.1}) has 
been already used, duplicate ignored
 
                   \relax 
l.40 \clearpage
                [1 ] [2 ]
[3 ] [4 ] [5 ] [6 ] [7 ] [8 ] [9 ] [10 ]
[11 ] [12 ] [13 ] [14 ] [15 ] [16 ] [17 ] [18 ] [19 ] [20 ] [21 ] [22 ] [23 ]
[24 ] [25 ] [26 ] [27 ] [28 ] [29 ] [30 ] [31 ] [32 ] [33 ] [34 ] [35 ] [36 ]
[37 ] [38 ] [39 ] [40 ] [41 ] [42 ] [43 ] [44 ] [45 ] [46 ] [47 ] [48 ] [49 ]
[50 ] [51 ] [52 ] [53 ] [54 ] [55 ] [56 ] [57 ] [58 ] [59 ] [60 ] [61 ] [62 ]
[63 ] [64 ] (report/report.aux)


LaTeX Warning: Label(s) may have changed. Rerun to get cross-references right.


Package rerunfilecheck Warning: File `report.out' has changed.
(rerunfilecheck)                Rerun to get outlines right
(rerunfilecheck)                or use package `bookmark'.

 )
(see the transcript file for additional information){/usr/local/texlive/2022/te
xmf-dist/fonts/enc/dvips/lm/lm-ec.enc}
Output written on report/report.pdf (65 pages, 623848 bytes).
Transcript written on report/report.log.