Showcase
If required, install pyuff and matplotlib.
#!!pip install pyuff
#!!pip install matplotlib
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
To analyse UFF file we first load the uff module and example file:
import pyuff
uff_file = pyuff.UFF('data/beam.uff')
First we can check which datasets are written in the file:
uff_file.get_set_types()
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:
uff_file.read_sets(0)
We see that each dataset consists number of dictionary-like keys. We read and write directly to keys.
Reading from the UFF file
To load all datasets from the UFF file to data object use:
data = uff_file.read_sets()
The first dataset 58 (this is the fifth in the example file) contains following keys:
data[4].keys()
Most important keys are x
: x-axis and data
: y-axis that define the stored response:
plt.semilogy(data[4]['x'], np.abs(data[4]['data']))
plt.xlabel('Frequency [Hz]')
plt.ylabel('FRF Magnitude [dB m/N]')
plt.xlim([0,1000])
plt.show()
Writing measurement data to UFF file
Here you can see a minimal working example for writing measured accelerance FRF data to the UFF file. First we load the accelerances:
measurement_point_1 = np.genfromtxt('data/meas_point_1.txt', dtype=complex)
measurement_point_2 = np.genfromtxt('data/meas_point_2.txt', dtype=complex)
measurement_point_3 = np.genfromtxt('data/meas_point_3.txt', dtype=complex)
measurement_point_1[0] = np.nan*(1+1.j)
measurement = [measurement_point_1, measurement_point_2, measurement_point_3]
In the next step we create a UFF file where we add dataset 58 for measurement consisting of the dictionary-like keys containing the measurement data and the information about the mesurement.
for i in range(3):
print('Adding point {:}'.format(i + 1))
response_node = 1
response_direction = 1
reference_node = i + 1
reference_direction = 1
acceleration_complex = measurement[i]
frequency = np.arange(0, 1001)
name = 'TestCase'
data = {'type':58,
'func_type': 4,
'rsp_node': response_node,
'rsp_dir': response_direction,
'ref_dir': reference_direction,
'ref_node': reference_node,
'data': acceleration_complex,
'x': frequency,
'id1': 'id1',
'rsp_ent_name': name,
'ref_ent_name': name,
'abscissa_spacing':1,
'abscissa_spec_data_type':18,
'ordinate_spec_data_type':12,
'orddenom_spec_data_type':13}
uffwrite = pyuff.UFF('./data/measurement.uff')
uffwrite._write_set(data,'add')
Or we can use support function prepare_58
to prepare the dictionary for creating the UFF file. Functions for other datasets can be found in Supported datasets
for i in range(3):
print('Adding point {:}'.format(i + 1))
response_node = 1
response_direction = 1
reference_node = i + 1
reference_direction = 1
acceleration_complex = measurement[i]
frequency = np.arange(0, 1001)
name = 'TestCase'
pyuff.prepare_58(func_type=4,
rsp_node=response_node,
rsp_dir=response_direction,
ref_dir=reference_direction,
ref_node=reference_node,
data=acceleration_complex,
x=frequency,
id1='id1',
rsp_ent_name=name,
ref_ent_name=name,
abscissa_spacing=1,
abscissa_spec_data_type=18,
ordinate_spec_data_type=12,
orddenom_spec_data_type=13)