diff --git a/LICENSE b/LICENSE index 0190061..77da6be 100644 --- a/LICENSE +++ b/LICENSE @@ -1,15 +1,21 @@ -# Copyright (C) 2014-2017 Primož Čermelj, Matjaž Mršnik, Miha Pirnat, Janko Slavič, Blaž Starc (in alphabetic order) -# -# This file is part of OpenModal. -# -# OpenModal is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, version 3 of the License. -# -# OpenModal is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with OpenModal. If not, see . \ No newline at end of file +MIT License + +Acknowledgement: from 2014-2017 this package was part of the OpenModal project + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/pyuff/__init__.py b/pyuff/__init__.py index 58592df..b611b33 100644 --- a/pyuff/__init__.py +++ b/pyuff/__init__.py @@ -1,4 +1,4 @@ -__version__ = "2.2" +__version__ = "2.3" from .pyuff import * from .datasets import * diff --git a/pyuff/pyuff.py b/pyuff/pyuff.py index 1545637..1d317a4 100644 --- a/pyuff/pyuff.py +++ b/pyuff/pyuff.py @@ -1,27 +1,9 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# Copyright (C) 2014-2017 Primož Čermelj, Matjaž Mršnik, Miha Pirnat, Janko Slavič, Blaž Starc (in alphabetic order) -# -# This file is part of pyuff. -# -# pyFRF is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, version 3 of the License. -# -# pyuff is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with pyuff. If not, see . """ ========== pyuff module ========== -This module is part of the www.openmodal.com project and -defines an UFF class to manipulate with the +This module defines an UFF class to manipulate with the UFF (Universal File Format) files, i.e., to read from and write to UFF files. Among the variety of UFF formats, only some of the formats (data-set types) frequently used in structural dynamics @@ -44,14 +26,13 @@ * This source (py2.7) was first written in 2007, 2008 by Primoz Cermelj (primoz.cermelj@gmail.com) * As part of the www.openmodal.com project the first source was adopted for Python 3 by Matjaz Mrsnik + * 2014-2017 the package was part of the OpenModal project maintained by: Martin Česnik, + Matjaž Mršnik, Miha Pirnat, Janko Slavič, Blaž Starc (in alphabetic order) * The package is maintained by Janko Slavič Notes: - * 58 data-set is always written in double precision, even if it is - read in single precision. - - * ``numpy`` module is required as all the vector/matrix-type data are read - or written using ``numpy.array`` objects. + * by default 58 data-set is written in double precision (see option `force_double=True`), + even if it is read in single precision (). Example: >>> import pyuff diff --git a/pyuff_Showcase.ipynb b/pyuff_Showcase.ipynb index 0a002f6..4e4eb0d 100644 --- a/pyuff_Showcase.ipynb +++ b/pyuff_Showcase.ipynb @@ -2,129 +2,126 @@ "cells": [ { "cell_type": "markdown", + "metadata": {}, "source": [ "Aug 2021: Janko Slavič (janko.slavic@fs.uni-lj.si), Klemen Zaletelj (klemen.zaletelj@fs.uni-lj.si), Matej Razpotnik (matej.razpotnik@gmail.com), Blaž Starc (sbtlaarzc@gmail.com), Matjaž Mršnik (matjaz.mrsnik@gmail.com), Matija Brumat (matija.brumat@gmail.com)" - ], - "metadata": {} + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "# pyuff Showcase" - ], - "metadata": {} + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "See the [documentation](https://pyuff.readthedocs.io/en/latest/index.html) for the ``pyUFF`` package!" - ], - "metadata": {} + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ - "This module is part of the [www.openmodal.com](www.openmodal.com) project and defines an UFF class to manipulate with the UFF (Universal File Format) files." - ], - "metadata": {} + "This module was part of the [www.openmodal.com](www.openmodal.com) project and defines an UFF class to manipulate with the UFF (Universal File Format) files." + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "UFF file format was originally developed by the Structural Dynamics Research Corporation (SDRC) to standardize data transfer mainly between various modal analysis, measurement or CAD geometry software products. UFF file is composed into several *datasets*, most important being the *dataset* 58 for measurement data and *dataset* 55 for modal data. More info on specific *datasets* can be obtained at https://www.ceas3.uc.edu/sdrluff" - ], - "metadata": {} + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "If required, install ``pyuff`` and ``matplotlib``" - ], - "metadata": {} + ] }, { "cell_type": "code", "execution_count": 1, - "source": [ - "#!!pip install pyuff\r\n", - "#!!pip install matplotlib" - ], - "outputs": [], "metadata": { "tags": [] - } + }, + "outputs": [], + "source": [ + "#!!pip install pyuff\n", + "#!!pip install matplotlib" + ] }, { "cell_type": "code", "execution_count": 2, + "metadata": {}, + "outputs": [], "source": [ - "import numpy as np\r\n", - "import matplotlib.pyplot as plt\r\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", "%matplotlib inline" - ], - "outputs": [], - "metadata": {} + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "To analyse UFF file we first load the uff module and example file:" - ], - "metadata": {} + ] }, { "cell_type": "code", "execution_count": 3, + "metadata": {}, + "outputs": [], "source": [ - "import pyuff\r\n", + "import pyuff\n", "uff_file = pyuff.UFF('data/beam.uff')" - ], - "outputs": [], - "metadata": {} + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "First we can check which *datasets* are written in the file:" - ], - "metadata": {} + ] }, { "cell_type": "code", "execution_count": 4, - "source": [ - "uff_file.get_set_types()" - ], + "metadata": {}, "outputs": [ { - "output_type": "execute_result", "data": { "text/plain": [ "array([ 151, 164, 2420, 2411, 58, 58, 58])" ] }, + "execution_count": 4, "metadata": {}, - "execution_count": 4 + "output_type": "execute_result" } ], - "metadata": {} + "source": [ + "uff_file.get_set_types()" + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "we see that first 4 *datasets* are *151: Header, 164: Units, 2420: Coordinate Systems* and *2411: Nodes - Double Precision*. Next we have several *datasets* 58 containing measurement data. To check what is written in the header (first *dataset*) use:" - ], - "metadata": {} + ] }, { "cell_type": "code", "execution_count": 5, - "source": [ - "uff_file.read_sets(0)" - ], + "metadata": {}, "outputs": [ { - "output_type": "execute_result", "data": { "text/plain": [ "{'type': 151,\n", @@ -143,187 +140,3315 @@ " 'time_file_written': '14:48:16'}" ] }, + "execution_count": 5, "metadata": {}, - "execution_count": 5 + "output_type": "execute_result" } ], - "metadata": {} + "source": [ + "uff_file.read_sets(0)" + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "We see that each *dataset* consists number of dictionary-like *keys*. We read and write directly to *keys*." - ], - "metadata": {} + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "## Reading from the UFF file" - ], - "metadata": {} + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "To load all *datasets* from the UFF file to `data` object use:" - ], - "metadata": {} + ] }, { "cell_type": "code", "execution_count": 6, + "metadata": {}, + "outputs": [], "source": [ "data = uff_file.read_sets()" - ], - "outputs": [], - "metadata": {} + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "The first *dataset* 58 (this is the fifth in the example file) contains following *keys*:" - ], - "metadata": {} + ] }, { "cell_type": "code", "execution_count": 7, - "source": [ - "data[4].keys()" - ], + "metadata": {}, "outputs": [ { - "output_type": "execute_result", "data": { "text/plain": [ "dict_keys(['type', 'binary', 'id1', 'id2', 'id3', 'id4', 'id5', 'func_type', 'func_id', 'ver_num', 'load_case_id', 'rsp_ent_name', 'rsp_node', 'rsp_dir', 'ref_ent_name', 'ref_node', 'ref_dir', 'ord_data_type', 'num_pts', 'abscissa_spacing', 'abscissa_min', 'abscissa_inc', 'z_axis_value', 'abscissa_spec_data_type', 'abscissa_len_unit_exp', 'abscissa_force_unit_exp', 'abscissa_temp_unit_exp', 'abscissa_axis_lab', 'abscissa_axis_units_lab', 'ordinate_spec_data_type', 'ordinate_len_unit_exp', 'ordinate_force_unit_exp', 'ordinate_temp_unit_exp', 'ordinate_axis_lab', 'ordinate_axis_units_lab', 'orddenom_spec_data_type', 'orddenom_len_unit_exp', 'orddenom_force_unit_exp', 'orddenom_temp_unit_exp', 'orddenom_axis_lab', 'orddenom_axis_units_lab', 'z_axis_spec_data_type', 'z_axis_len_unit_exp', 'z_axis_force_unit_exp', 'z_axis_temp_unit_exp', 'z_axis_axis_lab', 'z_axis_axis_units_lab', 'x', 'data'])" ] }, + "execution_count": 7, "metadata": {}, - "execution_count": 7 + "output_type": "execute_result" } ], - "metadata": {} + "source": [ + "data[4].keys()" + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "To read specific *key* form the desired *dataset* use:" - ], - "metadata": {} + ] }, { "cell_type": "code", "execution_count": 8, - "source": [ - "data[4]['func_type']" - ], + "metadata": {}, "outputs": [ { - "output_type": "execute_result", "data": { "text/plain": [ "4" ] }, + "execution_count": 8, "metadata": {}, - "execution_count": 8 + "output_type": "execute_result" } ], - "metadata": {} + "source": [ + "data[4]['func_type']" + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "e.g. *key* `'func_type'`: 4 in the *dataset* 58 means that the function type in this *dataset* is frequency response function." - ], - "metadata": {} + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "Most important *keys* are 'x': x_axis and 'data': y_axis that define the stored response:" - ], - "metadata": {} + ] }, { "cell_type": "code", "execution_count": 9, - "source": [ - "plt.semilogy(data[4]['x'], np.abs(data[4]['data']))\r\n", - "plt.xlabel('Frequency [Hz]')\r\n", - "plt.ylabel('FRF Magnitude [dB m/N]')\r\n", - "plt.xlim([0,1000])\r\n", - "plt.show()" - ], + "metadata": {}, "outputs": [ { - "output_type": "display_data", "data": { + "image/png": "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", + "image/svg+xml": [ + "\r\n", + "\r\n", + "\r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " 2021-08-26T09:07:46.168643\r\n", + " image/svg+xml\r\n", + " \r\n", + " \r\n", + " Matplotlib v3.4.1, https://matplotlib.org/\r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + "\r\n" + ], "text/plain": [ "
" - ], - "image/svg+xml": "\r\n\r\n\r\n \r\n \r\n \r\n \r\n 2021-08-26T09:07:46.168643\r\n image/svg+xml\r\n \r\n \r\n Matplotlib v3.4.1, https://matplotlib.org/\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n", - "image/png": "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" + ] }, "metadata": { "needs_background": "light" - } + }, + "output_type": "display_data" } ], - "metadata": {} + "source": [ + "plt.semilogy(data[4]['x'], np.abs(data[4]['data']))\n", + "plt.xlabel('Frequency [Hz]')\n", + "plt.ylabel('FRF Magnitude [dB m/N]')\n", + "plt.xlim([0,1000])\n", + "plt.show()" + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "Other keys in the *dataset* 58 are explained here: http://www.sdrl.uc.edu/sdrl/referenceinfo/universalfileformats/file-format-storehouse/universal-dataset-number-58 Similarly we could read the data from *dataset* 55 that is used for modal data." - ], - "metadata": {} + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "## Write measurement data to UFF file" - ], - "metadata": {} + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "Here you can see a minimal working example for writing three measured accelerance FRF data to the UFF file *measurement_123.uff*. First we load the accelerances:" - ], - "metadata": {} + ] }, { "cell_type": "code", "execution_count": 10, + "metadata": {}, + "outputs": [], "source": [ - "measurement_point_1 = np.genfromtxt('data/meas_point_1.txt', dtype=complex)\r\n", - "measurement_point_2 = np.genfromtxt('data/meas_point_2.txt', dtype=complex)\r\n", + "measurement_point_1 = np.genfromtxt('data/meas_point_1.txt', dtype=complex)\n", + "measurement_point_2 = np.genfromtxt('data/meas_point_2.txt', dtype=complex)\n", "measurement_point_3 = np.genfromtxt('data/meas_point_3.txt', dtype=complex)" - ], - "outputs": [], - "metadata": {} + ] }, { "cell_type": "code", "execution_count": 11, + "metadata": {}, + "outputs": [], "source": [ "measurement_point_1[0] = np.nan*(1+1.j)" - ], - "outputs": [], - "metadata": {} + ] }, { "cell_type": "code", "execution_count": 12, - "source": [ - "measurement_point_1" - ], + "metadata": {}, "outputs": [ { - "output_type": "execute_result", "data": { "text/plain": [ "array([ nan +nanj, -0.17515115-0.12042372j,\n", @@ -331,63 +3456,39 @@ " -0.5316 +0.00659625j, -0.53797177+0.01138392j])" ] }, + "execution_count": 12, "metadata": {}, - "execution_count": 12 + "output_type": "execute_result" } ], - "metadata": {} + "source": [ + "measurement_point_1" + ] }, { "cell_type": "code", "execution_count": 13, + "metadata": {}, + "outputs": [], "source": [ "measurement = [measurement_point_1, measurement_point_2, measurement_point_3]" - ], - "outputs": [], - "metadata": {} + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "In the next step we create a UFF file where we add *dataset* 58 for each measurement point consisting of the dictionary-like *keys* containing the measurement data and the information about the mesurement point." - ], - "metadata": {} + ] }, { "cell_type": "code", "execution_count": 14, - "source": [ - "for i in range(3):\r\n", - " print('Adding point {:}'.format(i + 1))\r\n", - " response_node = 1\r\n", - " response_direction = 1\r\n", - " reference_node = i + 1\r\n", - " reference_direction = 1\r\n", - " acceleration_complex = measurement[i]\r\n", - " frequency = np.arange(0, 1001)\r\n", - " name = 'TestCase'\r\n", - " data = {'type':58, \r\n", - " 'func_type':4, \r\n", - " 'rsp_node': response_node, \r\n", - " 'rsp_dir': response_direction, \r\n", - " 'ref_dir': reference_direction, \r\n", - " 'ref_node': reference_node,\r\n", - " 'data': acceleration_complex,\r\n", - " 'x': frequency,\r\n", - " 'id1': 'id1', \r\n", - " 'rsp_ent_name': name,\r\n", - " 'ref_ent_name': name,\r\n", - " 'abscissa_spacing':1,\r\n", - " 'abscissa_spec_data_type':18,\r\n", - " 'ordinate_spec_data_type':12,\r\n", - " 'orddenom_spec_data_type':13}\r\n", - " uffwrite = pyuff.UFF('./data/measurement.uff')\r\n", - " uffwrite.write_sets(data, 'add')" - ], + "metadata": {}, "outputs": [ { - "output_type": "stream", "name": "stdout", + "output_type": "stream", "text": [ "Adding point 1\n", "Adding point 2\n", @@ -395,62 +3496,59 @@ ] } ], - "metadata": {} + "source": [ + "for i in range(3):\n", + " print('Adding point {:}'.format(i + 1))\n", + " response_node = 1\n", + " response_direction = 1\n", + " reference_node = i + 1\n", + " reference_direction = 1\n", + " acceleration_complex = measurement[i]\n", + " frequency = np.arange(0, 1001)\n", + " name = 'TestCase'\n", + " data = {'type':58, \n", + " 'func_type':4, \n", + " 'rsp_node': response_node, \n", + " 'rsp_dir': response_direction, \n", + " 'ref_dir': reference_direction, \n", + " 'ref_node': reference_node,\n", + " 'data': acceleration_complex,\n", + " 'x': frequency,\n", + " 'id1': 'id1', \n", + " 'rsp_ent_name': name,\n", + " 'ref_ent_name': name,\n", + " 'abscissa_spacing':1,\n", + " 'abscissa_spec_data_type':18,\n", + " 'ordinate_spec_data_type':12,\n", + " 'orddenom_spec_data_type':13}\n", + " uffwrite = pyuff.UFF('./data/measurement.uff')\n", + " uffwrite.write_sets(data, 'add')" + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "Note: If we run upper example twice we add the data two-times! `._write_set` Does not check if the nodal responses are allready written in the file, it just writes the defined dataset at the end of choosen file!" - ], - "metadata": {} + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "If you would like to write is as dataset 58b, all you need to add is the key `binary: 1` (which is by default `0`). \n", "\n", "The data dictionary in the example below is built using the ``prepare_58()`` function." - ], - "metadata": {} + ] }, { "cell_type": "code", "execution_count": 16, - "source": [ - "for i in range(3):\r\n", - " print('Adding point {:}'.format(i + 1))\r\n", - " response_node = 1\r\n", - " response_direction = 1\r\n", - " reference_node = i + 1\r\n", - " reference_direction = 1\r\n", - " acceleration_complex = measurement[i]\r\n", - " frequency = np.arange(0, 1001)\r\n", - " name = 'TestCase'\r\n", - " \r\n", - " data = pyuff.prepare_58(\r\n", - " binary=1,\r\n", - " func_type=4,\r\n", - " rsp_node=response_node,\r\n", - " rsp_dir=response_direction,\r\n", - " ref_dir=reference_direction,\r\n", - " ref_node=reference_node,\r\n", - " data=acceleration_complex,\r\n", - " x=frequency,\r\n", - " id1='id1',\r\n", - " rsp_ent_name=name,\r\n", - " ref_ent_name=name,\r\n", - " abscissa_spacing=1,\r\n", - " abscissa_spec_data_type=18,\r\n", - " ordinate_spec_data_type=12,\r\n", - " orddenom_spec_data_type=13)\r\n", - " \r\n", - " uffwrite = pyuff.UFF('./data/measurement_58b.uff')\r\n", - " uffwrite.write_sets(data, 'add')" - ], + "metadata": {}, "outputs": [ { - "output_type": "stream", "name": "stdout", + "output_type": "stream", "text": [ "Adding point 1\n", "Adding point 2\n", @@ -458,36 +3556,64 @@ ] } ], - "metadata": {} + "source": [ + "for i in range(3):\n", + " print('Adding point {:}'.format(i + 1))\n", + " response_node = 1\n", + " response_direction = 1\n", + " reference_node = i + 1\n", + " reference_direction = 1\n", + " acceleration_complex = measurement[i]\n", + " frequency = np.arange(0, 1001)\n", + " name = 'TestCase'\n", + " \n", + " data = pyuff.prepare_58(\n", + " binary=1,\n", + " func_type=4,\n", + " rsp_node=response_node,\n", + " rsp_dir=response_direction,\n", + " ref_dir=reference_direction,\n", + " ref_node=reference_node,\n", + " data=acceleration_complex,\n", + " x=frequency,\n", + " id1='id1',\n", + " rsp_ent_name=name,\n", + " ref_ent_name=name,\n", + " abscissa_spacing=1,\n", + " abscissa_spec_data_type=18,\n", + " ordinate_spec_data_type=12,\n", + " orddenom_spec_data_type=13)\n", + " \n", + " uffwrite = pyuff.UFF('./data/measurement_58b.uff')\n", + " uffwrite.write_sets(data, 'add')" + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "## The ``prepare_xx()`` functions" - ], - "metadata": {} + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "The new ``prepare_xx()`` functions enable easy dictionary construction. \n", "\n", "Each function contains the arguments that are available for a certain dataset and the arguments are documented in the docstring along with the reference to the **record** and **field** in the UFF file.\n", "\n", "All of the docstrings are available in the ``pyUFF`` [documentation](https://pyuff.readthedocs.io/en/latest/index.html). To see the docstring for, e.g., ``prepare_15()`` function:" - ], - "metadata": {} + ] }, { "cell_type": "code", "execution_count": 17, - "source": [ - "? pyuff.prepare_15" - ], + "metadata": {}, "outputs": [ { - "output_type": "stream", "name": "stdout", + "output_type": "stream", "text": [ "\u001b[1;31mSignature:\u001b[0m\n", " \u001b[0mpyuff\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mprepare_15\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m\n", @@ -537,22 +3663,27 @@ ] } ], - "metadata": {} + "source": [ + "? pyuff.prepare_15" + ] }, { "cell_type": "code", "execution_count": null, - "source": [], + "metadata": {}, "outputs": [], - "metadata": {} + "source": [] } ], "metadata": { "anaconda-cloud": {}, "hide_input": false, + "interpreter": { + "hash": "b3ba2566441a7c06988d0923437866b63cedc61552a5af99d1f4fb67d367b25f" + }, "kernelspec": { - "name": "python3", - "display_name": "Python 3.7.4 64-bit ('base': conda)" + "display_name": "Python 3.7.4 64-bit ('base': conda)", + "name": "python3" }, "language_info": { "codemirror_mode": { @@ -615,11 +3746,8 @@ "_Feature" ], "window_display": false - }, - "interpreter": { - "hash": "b3ba2566441a7c06988d0923437866b63cedc61552a5af99d1f4fb67d367b25f" } }, "nbformat": 4, "nbformat_minor": 4 -} \ No newline at end of file +} diff --git a/requirements.txt b/requirements.txt index 9e030eb..1cc18fc 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,2 +1,2 @@ -numpy>=1.12.0 -pytest>=3.0.5 +numpy +pytest diff --git a/setup.py b/setup.py index cbcee38..7e0e845 100644 --- a/setup.py +++ b/setup.py @@ -1,21 +1,3 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# Copyright (C) 2014-2017 Primož Čermelj, Matjaž Mršnik, Miha Pirnat, Janko Slavič, Blaž Starc (in alphabetic order) -# -# This file is part of pyuff. -# -# pyFRF is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, version 3 of the License. -# -# pyuff is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with pyuff. If not, see . - import os import re from setuptools import setup