FLife


NameFLife JSON
Version 1.4.4 PyPI version JSON
download
home_pageNone
SummaryVibration Fatigue by Spectral Methods.
upload_time2024-12-23 09:51:26
maintainerNone
docs_urlNone
authorNone
requires_python>=3.9
licenseNone
keywords fatigue spectral methods structural dynamics vibration
VCS
bugtrack_url
requirements numpy scipy fatpack rainflow pylint pytest lvm_read matplotlib pyExSi
Travis-CI
coveralls test coverage No coveralls.
            |pytest| |Docs Status| |zenodo|

FLife - Vibration Fatigue by Spectral Methods
---------------------------------------------

Obtaining vibration fatigue life in the spectral domain. For general theoretical
background on vibration fatigue (structural dynamics, uniaxial/multiaxial fatigue, 
non-Gaussianity, non-stationarity, etc), please see Slavič et al. [1], for 
theoretical background on different spectral domain methods, please see the review 
article by Zorman et al. [2] or original articles as given in the docstring
of the methods.

The review article [2] results are completely reproducible with ipynb file:
https://github.com/ladisk/FLife/blob/main/data/Vibration%20fatigue%20by%20spectral%20methods%20-%20a%20review%20with%20open-source%20support.ipynb

See the `documentation <https://flife.readthedocs.io/en/latest/index.html>`_ for more information.

Installing this package
-----------------------

Use `pip` to install it by:

.. code-block:: console

    $ pip install FLife


Supported methods in the frequency-domain
-----------------------------------------

    - Narrowband,
    - Wirsching Light,
    - Ortiz Chen,
    - Alpha 0.75,
    - Tovo Benasciutti,
    - Dirlik,
    - Zhao Baker,
    - Park,
    - Jun Park,
    - Jiao Moan,
    - Sakai Okamura,
    - Fu Cebon,
    - modified Fu Cebon,
    - Low's bimodal,
    - Low 2014,
    - Lotsberg,
    - Huang Moan,
    - Gao Moan,
    - Single moment,
    - Bands method

Rainflow (time-domain) is supported using the `fatpack` (four-points algorithm) and `rainflow` (three-points algorithm) packages.


Simple example
---------------

Here is a simple example on how to use the code:

.. code-block:: python

    import FLife
    import numpy as np


    dt = 1e-4
    x = np.random.normal(scale=100, size=10000)

    C = 1.8e+22  # S-N curve intercept [MPa**k]
    k = 7.3 # S-N curve inverse slope [/]

    # Spectral data
    sd = FLife.SpectralData(input=(x, dt))

    # Rainflow reference fatigue life 
    # (do not be confused here, spectral data object also holds the time domain data)
    rf = FLife.Rainflow(sd)

    # Spectral methods
    dirlik = FLife.Dirlik(sd)
    tb = FLife.TovoBenasciutti(sd)
    print(f'          Rainflow: {rf.get_life(C = C, k=k):4.0f} s')
    print(f'            Dirlik: {dirlik.get_life(C = C, k=k):4.0f} s')
    print(f'Tovo Benasciutti 2: {tb.get_life(C = C, k=k, method="method 2"):4.0f} s')

SpectralData
-------------
SpectralData object contains data, required for fatigue-life estimation: power spectral density (PSD), spectral moments, spectral band estimators and others parameters. 

SpectralData is instantiated with `input` parameter:

    - `input` = 'GUI' - PSD is provided by user via GUI (graphically and tabulary)
    - `input` = (PSD, freq) - tuple of PSD and frequency vector is provided.
    - `input` = (x, dt) - tuple of time history and sampling period is provided.

GUI
***
.. code-block:: python

    sd1 = FLife.SpectralData(input='GUI')
    sd2 = FLife.SpectralData()
    
This is default argument. User is prompted to enter PSD graphically and/or tabulary.

|GUI_img| 

Stationary Gaussian time-history is generated, if parameters `T` and `fs` are provided. Otherwise, time-history is generated subsequently, when Rainflow fatigue-life is calculated.
Optional parameter for time-history is random generator instance `rg` (numpy.random._generator.Generator), which determines phase of random process.

.. code-block:: python

    seed = 111
    rg =  np.random.default_rng(seed)
    # time-history can be generated at SpectralData object instantiation. Sampling frequency `fs` and signal length `T` parameter are needed.
    sd3 = FLife.SpectralData(input='GUI', T=1, fs=1e5, rg=rg)  
    
    time_history = sd3.data
    # time-history duration and sampling period are dependent on frequency vector length and step
    T = sd3.t # time-history duration
    dt = sd3.dt # sampling period 
    time = np.arange(0, T, dt)
    plt.plot(time, time_history)

(PSD, freq)
***********
PSD and frequency arrays are given as input. Both arrays must be of type np.ndarray. 

Stationary Gaussian time-history is generated, if parameters `T` and `fs` are provided. Otherwise, time-history is generated subsequently, when Rainflow fatigue-life is calculated.
Optional parameter for time-history is random generator instance `rg` (numpy.random._generator.Generator), which determines phase of random process.

.. code-block:: python

    seed = 111
    rg =  np.random.default_rng(seed)
    freq = np.arange(0,300)
    f_low, f_high = 100, 120
    A = 1 # PSD value
    PSD = np.interp(freq, [f_low, f_high], [A,A], left=0, right=0) # Flat-shaped one-sided PSD
    
    sd4 = FLife.SpectralData(input = (PSD, freq))
    # time-history can be generated at SpectralData object instantiation. Sampling frequency `fs` and signal length `T` parameter are needed.
    sd5 = FLife.SpectralData(input = (PSD, freq), T=1, fs=1e5, rg=rg)

    time_history = sd5.data
    # time-history duration and sampling period are dependent on frequency vector length and step
    T = sd5.t # time-history duration
    dt = sd5.dt # sampling period 
    time = np.arange(0, T, dt)
    plt.plot(time, time_history)

(x, dt)
*******
Time history `x` and sampling period `dt` are given as input. `x` must be of type np.ndarray and `dt` of type float, int.

.. code-block:: python

    seed = 111
    rg =  np.random.default_rng(seed)
    freq = np.arange(0,100)
    f_low, f_high = 40, 70
    A = 1 # PSD value
    PSD = np.interp(freq, [f_low, f_high], [A,A], left=0, right=0) # Flat-shaped one-sided PSD

    time, signal = FLife.tools.random_gaussian(freq=freq, PSD=PSD, T=10, fs=1e3, rg=rg)
    dt = time[1]

    sd6 = FLife.SpectralData(input=(signal,dt))

    # Get PSD data from spectralData object
    freq = sd6.psd[:,0]
    PSD = sd6.psd[:,1]
    plt.plot(freq, PSD)

Spectral Methods
-----------------
Currently 20 spectral methods are supported. Methods for broadband process are organized into 4 subgroups: 

    - Narrowband correction factor; methods are based on narrowband approximation, accounting for broadband procces with correction factor.
    - RFC PDF approximation; methods are based on approximation of Rainflow Probability Density Function.
    - Combined fatigue damage - cycle damage combination; methods are based on splitting of PSD of broadband process into N narrowband approximations and accounting the formation of distinct categories of cycles.
    - Combined fatigue damage - narrowband damage combination; methods are based on splitting of PSD of broadband process into N narrowband approximations and summing narrowband damages by suitable damage conbination rule.

|SpectralMethods_img|

SpectralData instance is prerequisite for spectral method instantiation. For multimodal spectral methods, PSD splitting type can be specified:

    - PSD_splitting=('equalAreaBands', N) - PSD is divided into N equal area bands. 
    - PSD_splitting=('userDefinedBands', [f_1_ub, f_2_ub, ..., f_i_ub, ..., f_N_ub])) - Band upper boundary frequency f_i_ub is taken as boundary between two bands, i.e.  i-th upper boundary frequency equals i+1-th lower boundary frequency.

.. code-block:: python
    
    nb = FLife.Narrowband(sd)
    dirlik = FLife.Dirlik(sd)
    tb = FLife.TovoBenasciutti(sd)
    jm1 = FLife.JiaoMoan(sd)
    jm2 = FLife.JiaoMoan(sd, PSD_splitting=('equalAreaBands', 2)) # same as jm1, PSD is divided in 2 bands with equal area
    jm3 = FLife.JiaoMoan(sd, PSD_splitting=('userDefinedBands', [80,150])) #80 and 150 are bands upper limits [Hz]
    
PDF
***
Some spectral methods supports PDF stress cycle amplitude via get_PDF(s, \**kwargs) function:

.. code-block:: python

    s = np.arange(0,np.max(x),.001)
    plt.plot(s,nb.get_PDF(s), label='Narrowband')
    plt.plot(s,dirlik.get_PDF(s), label='Dirlik')
    plt.plot(s,tb.get_PDF(s, method='method 2'), label='Tovo-Benasciutti')
    plt.legend()
    plt.show()

Vibration-fatigue life
**********************
Vibration-fatigue life is returned by function get_life(C,k,\**kwargs):

.. code-block:: python

    C = 1.8e+22  # S-N curve intercept [MPa**k]
    k = 7.3 # S-N curve inverse slope [/]
    
    life_nb = nb.get_life(C = C, k=k)
    life_dirlik = dirlik.get_life(C = C, k=k)
    life_tb = tb.get_life(C = C, k=k, method='method 1')

Rainflow
--------
Vibration-fatigue life can be compared to rainflow method. When Rainflow class is instantiated, time-history is generated and assigned to SpectralData instance, if not already exist. By providing optional parameter `rg` (numpy.random._generator.Generator instance) phase of stationary Gaussian time history is controlled.

    
.. code-block:: python

    sd = FLife.SpectralData(input='GUI') # time history is not generated at this point
    
    seed = 111
    rg =  np.random.default_rng(seed)
    rf1 = FLife.Rainflow(sd T=100, fs=1e3) # time history is generated and assigned to parameter SpectralData.data
    rf2 = FLife.Rainflow(sd, T=100, fs =1e3,  rg=rg) # time history is generated and assigned to parameter SpectralData.data, signal phase is defined by random generator
    rf_life_3pt = rf2.get_life(C, k, algorithm='three-point')
    rf_life_4pt = rf2.get_life(C, k, algorithm='four-point', nr_load_classes=1024) 
    
    error_nb = FLife.tools.relative_error(life_nb, rf_life_3pt)
    error_dirlik = FLife.tools.relative_error(life_dirlik, rf_life_3pt)
    error_tb = FLife.tools.relative_error(life_tb, rf_life_3pt)


References:
    1. Janko Slavič, Matjaž Mršnik, Martin Česnik, Jaka Javh, Miha Boltežar. 
       Vibration Fatigue by Spectral Methods, From Structural Dynamics to Fatigue Damage – Theory and Experiments, 
       ISBN: 9780128221907, Elsevier, 1st September 2020, 
       `see Elsevier page. <https://www.elsevier.com/books/Vibration%20Fatigue%20by%20Spectral%20Methods/9780128221907?utm_campaign=ELS%20STBK%20AuthorConnect%20Release&utm_campaignPK=1695759095&utm_term=OP66802&utm_content=1695850484&utm_source=93&BID=1212165450>`_
    2. Aleš Zorman and Janko Slavič and Miha Boltežar. 
       Vibration fatigue by spectral methods—A review with open-source support, 
       Mechanical Systems and Signal Processing, 2023, 
       `see https://doi.org/10.1016/j.ymssp.2023.110149`


.. |Docs Status| image:: https://readthedocs.org/projects/flife/badge/
   :target: https://flife.readthedocs.io

.. |pytest| image:: https://github.com/ladisk/flife/actions/workflows/python-package.yml/badge.svg
    :target: https://github.com/ladisk/flife/actions
   
.. |GUI_img| image:: PSDinput.png
    :target: https://github.com/ladisk/FLife
    :alt: GUI - PSD input
    
.. |SpectralMethods_img| image:: FreqMethodsTree.png
    :target: https://github.com/ladisk/FLife/tree/main/FLife/freq_domain
    :alt: Spectral methods

.. |zenodo| image:: https://zenodo.org/badge/DOI/10.5281/zenodo.7417587.svg?
   :target: https://doi.org/10.5281/zenodo.7417587

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "FLife",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.9",
    "maintainer_email": "\"Janko Slavi\u010d, Domen Gorjup\" <janko.slavic@fs.uni-lj.si>",
    "keywords": "fatigue, spectral methods, structural dynamics, vibration",
    "author": null,
    "author_email": "\"Ale\u0161 Zorman, Matja\u017e Mr\u0161nik, Janko Slavi\u010d\" <janko.slavic@fs.uni-lj.si>",
    "download_url": "https://files.pythonhosted.org/packages/fe/78/000247a8928f61cda38d858f7fbd87db868e4134121924f815dd2a20ff5a/flife-1.4.4.tar.gz",
    "platform": null,
    "description": "|pytest| |Docs Status| |zenodo|\n\nFLife - Vibration Fatigue by Spectral Methods\n---------------------------------------------\n\nObtaining vibration fatigue life in the spectral domain. For general theoretical\nbackground on vibration fatigue (structural dynamics, uniaxial/multiaxial fatigue, \nnon-Gaussianity, non-stationarity, etc), please see Slavi\u010d et al. [1], for \ntheoretical background on different spectral domain methods, please see the review \narticle by Zorman et al. [2] or original articles as given in the docstring\nof the methods.\n\nThe review article [2] results are completely reproducible with ipynb file:\nhttps://github.com/ladisk/FLife/blob/main/data/Vibration%20fatigue%20by%20spectral%20methods%20-%20a%20review%20with%20open-source%20support.ipynb\n\nSee the `documentation <https://flife.readthedocs.io/en/latest/index.html>`_ for more information.\n\nInstalling this package\n-----------------------\n\nUse `pip` to install it by:\n\n.. code-block:: console\n\n    $ pip install FLife\n\n\nSupported methods in the frequency-domain\n-----------------------------------------\n\n    - Narrowband,\n    - Wirsching Light,\n    - Ortiz Chen,\n    - Alpha 0.75,\n    - Tovo Benasciutti,\n    - Dirlik,\n    - Zhao Baker,\n    - Park,\n    - Jun Park,\n    - Jiao Moan,\n    - Sakai Okamura,\n    - Fu Cebon,\n    - modified Fu Cebon,\n    - Low's bimodal,\n    - Low 2014,\n    - Lotsberg,\n    - Huang Moan,\n    - Gao Moan,\n    - Single moment,\n    - Bands method\n\nRainflow (time-domain) is supported using the `fatpack` (four-points algorithm) and `rainflow` (three-points algorithm) packages.\n\n\nSimple example\n---------------\n\nHere is a simple example on how to use the code:\n\n.. code-block:: python\n\n    import FLife\n    import numpy as np\n\n\n    dt = 1e-4\n    x = np.random.normal(scale=100, size=10000)\n\n    C = 1.8e+22  # S-N curve intercept [MPa**k]\n    k = 7.3 # S-N curve inverse slope [/]\n\n    # Spectral data\n    sd = FLife.SpectralData(input=(x, dt))\n\n    # Rainflow reference fatigue life \n    # (do not be confused here, spectral data object also holds the time domain data)\n    rf = FLife.Rainflow(sd)\n\n    # Spectral methods\n    dirlik = FLife.Dirlik(sd)\n    tb = FLife.TovoBenasciutti(sd)\n    print(f'          Rainflow: {rf.get_life(C = C, k=k):4.0f} s')\n    print(f'            Dirlik: {dirlik.get_life(C = C, k=k):4.0f} s')\n    print(f'Tovo Benasciutti 2: {tb.get_life(C = C, k=k, method=\"method 2\"):4.0f} s')\n\nSpectralData\n-------------\nSpectralData object contains data, required for fatigue-life estimation: power spectral density (PSD), spectral moments, spectral band estimators and others parameters. \n\nSpectralData is instantiated with `input` parameter:\n\n    - `input` = 'GUI' - PSD is provided by user via GUI (graphically and tabulary)\n    - `input` = (PSD, freq) - tuple of PSD and frequency vector is provided.\n    - `input` = (x, dt) - tuple of time history and sampling period is provided.\n\nGUI\n***\n.. code-block:: python\n\n    sd1 = FLife.SpectralData(input='GUI')\n    sd2 = FLife.SpectralData()\n    \nThis is default argument. User is prompted to enter PSD graphically and/or tabulary.\n\n|GUI_img| \n\nStationary Gaussian time-history is generated, if parameters `T` and `fs` are provided. Otherwise, time-history is generated subsequently, when Rainflow fatigue-life is calculated.\nOptional parameter for time-history is random generator instance `rg` (numpy.random._generator.Generator), which determines phase of random process.\n\n.. code-block:: python\n\n    seed = 111\n    rg =  np.random.default_rng(seed)\n    # time-history can be generated at SpectralData object instantiation. Sampling frequency `fs` and signal length `T` parameter are needed.\n    sd3 = FLife.SpectralData(input='GUI', T=1, fs=1e5, rg=rg)  \n    \n    time_history = sd3.data\n    # time-history duration and sampling period are dependent on frequency vector length and step\n    T = sd3.t # time-history duration\n    dt = sd3.dt # sampling period \n    time = np.arange(0, T, dt)\n    plt.plot(time, time_history)\n\n(PSD, freq)\n***********\nPSD and frequency arrays are given as input. Both arrays must be of type np.ndarray. \n\nStationary Gaussian time-history is generated, if parameters `T` and `fs` are provided. Otherwise, time-history is generated subsequently, when Rainflow fatigue-life is calculated.\nOptional parameter for time-history is random generator instance `rg` (numpy.random._generator.Generator), which determines phase of random process.\n\n.. code-block:: python\n\n    seed = 111\n    rg =  np.random.default_rng(seed)\n    freq = np.arange(0,300)\n    f_low, f_high = 100, 120\n    A = 1 # PSD value\n    PSD = np.interp(freq, [f_low, f_high], [A,A], left=0, right=0) # Flat-shaped one-sided PSD\n    \n    sd4 = FLife.SpectralData(input = (PSD, freq))\n    # time-history can be generated at SpectralData object instantiation. Sampling frequency `fs` and signal length `T` parameter are needed.\n    sd5 = FLife.SpectralData(input = (PSD, freq), T=1, fs=1e5, rg=rg)\n\n    time_history = sd5.data\n    # time-history duration and sampling period are dependent on frequency vector length and step\n    T = sd5.t # time-history duration\n    dt = sd5.dt # sampling period \n    time = np.arange(0, T, dt)\n    plt.plot(time, time_history)\n\n(x, dt)\n*******\nTime history `x` and sampling period `dt` are given as input. `x` must be of type np.ndarray and `dt` of type float, int.\n\n.. code-block:: python\n\n    seed = 111\n    rg =  np.random.default_rng(seed)\n    freq = np.arange(0,100)\n    f_low, f_high = 40, 70\n    A = 1 # PSD value\n    PSD = np.interp(freq, [f_low, f_high], [A,A], left=0, right=0) # Flat-shaped one-sided PSD\n\n    time, signal = FLife.tools.random_gaussian(freq=freq, PSD=PSD, T=10, fs=1e3, rg=rg)\n    dt = time[1]\n\n    sd6 = FLife.SpectralData(input=(signal,dt))\n\n    # Get PSD data from spectralData object\n    freq = sd6.psd[:,0]\n    PSD = sd6.psd[:,1]\n    plt.plot(freq, PSD)\n\nSpectral Methods\n-----------------\nCurrently 20 spectral methods are supported. Methods for broadband process are organized into 4 subgroups: \n\n    - Narrowband correction factor; methods are based on narrowband approximation, accounting for broadband procces with correction factor.\n    - RFC PDF approximation; methods are based on approximation of Rainflow Probability Density Function.\n    - Combined fatigue damage - cycle damage combination; methods are based on splitting of PSD of broadband process into N narrowband approximations and accounting the formation of distinct categories of cycles.\n    - Combined fatigue damage - narrowband damage combination; methods are based on splitting of PSD of broadband process into N narrowband approximations and summing narrowband damages by suitable damage conbination rule.\n\n|SpectralMethods_img|\n\nSpectralData instance is prerequisite for spectral method instantiation. For multimodal spectral methods, PSD splitting type can be specified:\n\n    - PSD_splitting=('equalAreaBands', N) - PSD is divided into N equal area bands. \n    - PSD_splitting=('userDefinedBands', [f_1_ub, f_2_ub, ..., f_i_ub, ..., f_N_ub])) - Band upper boundary frequency f_i_ub is taken as boundary between two bands, i.e.  i-th upper boundary frequency equals i+1-th lower boundary frequency.\n\n.. code-block:: python\n    \n    nb = FLife.Narrowband(sd)\n    dirlik = FLife.Dirlik(sd)\n    tb = FLife.TovoBenasciutti(sd)\n    jm1 = FLife.JiaoMoan(sd)\n    jm2 = FLife.JiaoMoan(sd, PSD_splitting=('equalAreaBands', 2)) # same as jm1, PSD is divided in 2 bands with equal area\n    jm3 = FLife.JiaoMoan(sd, PSD_splitting=('userDefinedBands', [80,150])) #80 and 150 are bands upper limits [Hz]\n    \nPDF\n***\nSome spectral methods supports PDF stress cycle amplitude via get_PDF(s, \\**kwargs) function:\n\n.. code-block:: python\n\n    s = np.arange(0,np.max(x),.001)\n    plt.plot(s,nb.get_PDF(s), label='Narrowband')\n    plt.plot(s,dirlik.get_PDF(s), label='Dirlik')\n    plt.plot(s,tb.get_PDF(s, method='method 2'), label='Tovo-Benasciutti')\n    plt.legend()\n    plt.show()\n\nVibration-fatigue life\n**********************\nVibration-fatigue life is returned by function get_life(C,k,\\**kwargs):\n\n.. code-block:: python\n\n    C = 1.8e+22  # S-N curve intercept [MPa**k]\n    k = 7.3 # S-N curve inverse slope [/]\n    \n    life_nb = nb.get_life(C = C, k=k)\n    life_dirlik = dirlik.get_life(C = C, k=k)\n    life_tb = tb.get_life(C = C, k=k, method='method 1')\n\nRainflow\n--------\nVibration-fatigue life can be compared to rainflow method. When Rainflow class is instantiated, time-history is generated and assigned to SpectralData instance, if not already exist. By providing optional parameter `rg` (numpy.random._generator.Generator instance) phase of stationary Gaussian time history is controlled.\n\n    \n.. code-block:: python\n\n    sd = FLife.SpectralData(input='GUI') # time history is not generated at this point\n    \n    seed = 111\n    rg =  np.random.default_rng(seed)\n    rf1 = FLife.Rainflow(sd T=100, fs=1e3) # time history is generated and assigned to parameter SpectralData.data\n    rf2 = FLife.Rainflow(sd, T=100, fs =1e3,  rg=rg) # time history is generated and assigned to parameter SpectralData.data, signal phase is defined by random generator\n    rf_life_3pt = rf2.get_life(C, k, algorithm='three-point')\n    rf_life_4pt = rf2.get_life(C, k, algorithm='four-point', nr_load_classes=1024) \n    \n    error_nb = FLife.tools.relative_error(life_nb, rf_life_3pt)\n    error_dirlik = FLife.tools.relative_error(life_dirlik, rf_life_3pt)\n    error_tb = FLife.tools.relative_error(life_tb, rf_life_3pt)\n\n\nReferences:\n    1. Janko Slavi\u010d, Matja\u017e Mr\u0161nik, Martin \u010cesnik, Jaka Javh, Miha Bolte\u017ear. \n       Vibration Fatigue by Spectral Methods, From Structural Dynamics to Fatigue Damage \u2013 Theory and Experiments, \n       ISBN: 9780128221907, Elsevier, 1st September 2020, \n       `see Elsevier page. <https://www.elsevier.com/books/Vibration%20Fatigue%20by%20Spectral%20Methods/9780128221907?utm_campaign=ELS%20STBK%20AuthorConnect%20Release&utm_campaignPK=1695759095&utm_term=OP66802&utm_content=1695850484&utm_source=93&BID=1212165450>`_\n    2. Ale\u0161 Zorman and Janko Slavi\u010d and Miha Bolte\u017ear. \n       Vibration fatigue by spectral methods\u2014A review with open-source support, \n       Mechanical Systems and Signal Processing, 2023, \n       `see https://doi.org/10.1016/j.ymssp.2023.110149`\n\n\n.. |Docs Status| image:: https://readthedocs.org/projects/flife/badge/\n   :target: https://flife.readthedocs.io\n\n.. |pytest| image:: https://github.com/ladisk/flife/actions/workflows/python-package.yml/badge.svg\n    :target: https://github.com/ladisk/flife/actions\n   \n.. |GUI_img| image:: PSDinput.png\n    :target: https://github.com/ladisk/FLife\n    :alt: GUI - PSD input\n    \n.. |SpectralMethods_img| image:: FreqMethodsTree.png\n    :target: https://github.com/ladisk/FLife/tree/main/FLife/freq_domain\n    :alt: Spectral methods\n\n.. |zenodo| image:: https://zenodo.org/badge/DOI/10.5281/zenodo.7417587.svg?\n   :target: https://doi.org/10.5281/zenodo.7417587\n",
    "bugtrack_url": null,
    "license": null,
    "summary": "Vibration Fatigue by Spectral Methods.",
    "version": "1.4.4",
    "project_urls": {
        "documentation": "https://flife.readthedocs.io/en/latest/index.html",
        "homepage": "https://github.com/ladisk/FLife",
        "source": "https://github.com/ladisk/FLife"
    },
    "split_keywords": [
        "fatigue",
        " spectral methods",
        " structural dynamics",
        " vibration"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "6a2a3104a227bab591e8640b6b5122060174b7da703493f56cd83583de5ff4b9",
                "md5": "f06a6b670fdb4c30d4e5ac92f0207cd7",
                "sha256": "cc6cceac381ccf569e745d15d0a16821617f2e9ed13cda6906dee0bbf7175851"
            },
            "downloads": -1,
            "filename": "flife-1.4.4-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "f06a6b670fdb4c30d4e5ac92f0207cd7",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.9",
            "size": 68828,
            "upload_time": "2024-12-23T09:51:24",
            "upload_time_iso_8601": "2024-12-23T09:51:24.622131Z",
            "url": "https://files.pythonhosted.org/packages/6a/2a/3104a227bab591e8640b6b5122060174b7da703493f56cd83583de5ff4b9/flife-1.4.4-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "fe78000247a8928f61cda38d858f7fbd87db868e4134121924f815dd2a20ff5a",
                "md5": "8d44ac5b4d6896266eb40eca53188d1c",
                "sha256": "64fcf8424ea22205b795a89e3900878ed9e3170e2ed0bc1edd6188beee0f7a1c"
            },
            "downloads": -1,
            "filename": "flife-1.4.4.tar.gz",
            "has_sig": false,
            "md5_digest": "8d44ac5b4d6896266eb40eca53188d1c",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.9",
            "size": 34924,
            "upload_time": "2024-12-23T09:51:26",
            "upload_time_iso_8601": "2024-12-23T09:51:26.058337Z",
            "url": "https://files.pythonhosted.org/packages/fe/78/000247a8928f61cda38d858f7fbd87db868e4134121924f815dd2a20ff5a/flife-1.4.4.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-12-23 09:51:26",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "ladisk",
    "github_project": "FLife",
    "travis_ci": true,
    "coveralls": false,
    "github_actions": true,
    "requirements": [
        {
            "name": "numpy",
            "specs": []
        },
        {
            "name": "scipy",
            "specs": []
        },
        {
            "name": "fatpack",
            "specs": []
        },
        {
            "name": "rainflow",
            "specs": []
        },
        {
            "name": "pylint",
            "specs": []
        },
        {
            "name": "pytest",
            "specs": []
        },
        {
            "name": "lvm_read",
            "specs": []
        },
        {
            "name": "matplotlib",
            "specs": [
                [
                    ">=",
                    "3.3"
                ]
            ]
        },
        {
            "name": "pyExSi",
            "specs": []
        }
    ],
    "lcname": "flife"
}
        
Elapsed time: 0.40150s