Contents

Universal File Modal Demo

This demo shows how to import modal analysis data and a geometry from a universal file. In this script data are imported, then curve fitted. A predefined geometry is imported for animation of the modes, and finally an AVI file is generated of the animation of the first mode.

% Comments:
% The curve fitting is done with COMPLEXP, which is NOT a polyreference implementation.
% However, you can still use several references to obtain the poles. The data come from
% a 2-input shaker test on a small plastic airplane model. In this demo we use both
% references.

% Copyright (c) 2003-2006, Axiom EduTech AB, Ljusterö, Sweden. All rights reserved.
% URL: http://www.vibratools.com Email: info@vibratools.com

Ref=[1:2];

UnvDataName='ModelPlaneFRF.unv';
UnvGeoName='ModelPlaneGeo.unv';

Import Universal Data File

lo=100;                        % File names will start with uf100
nseq=univread(100,UnvDataName);
hi=nseq-1;
Reading 58
Saved data as uf100.mat
Reading 58
Saved data as uf101.mat
Reading 58
Saved data as uf102.mat
Reading 58
Saved data as uf103.mat
Reading 58
Saved data as uf104.mat
Reading 58
Saved data as uf105.mat
Reading 58
Saved data as uf106.mat
Reading 58
Saved data as uf107.mat
Reading 58
Saved data as uf108.mat
Reading 58
Saved data as uf109.mat
Reading 58
Saved data as uf110.mat
Reading 58
Saved data as uf111.mat
Reading 58
Saved data as uf112.mat
Reading 58
Saved data as uf113.mat
Reading 58
Saved data as uf114.mat
Reading 58
Saved data as uf115.mat
Reading 58
Saved data as uf116.mat
Reading 58
Saved data as uf117.mat
Reading 58
Saved data as uf118.mat
Reading 58
Saved data as uf119.mat
Reading 58
Saved data as uf120.mat
Reading 58
Saved data as uf121.mat
Reading 58
Saved data as uf122.mat
Reading 58
Saved data as uf123.mat
Reading 58
Saved data as uf124.mat
Reading 58
Saved data as uf125.mat
Reading 58
Saved data as uf126.mat
Reading 58
Saved data as uf127.mat
Reading 58
Saved data as uf128.mat
Reading 58
Saved data as uf129.mat
Reading 58
Saved data as uf130.mat
Reading 58
Saved data as uf131.mat
Reading 58
Saved data as uf132.mat
Reading 58
Saved data as uf133.mat
Reading 58
Saved data as uf134.mat
Reading 58
Saved data as uf135.mat
Reading 58
Saved data as uf136.mat
Reading 58
Saved data as uf137.mat
Reading 58
Saved data as uf138.mat
Reading 58
Saved data as uf139.mat
Reading 58
Saved data as uf140.mat
Reading 58
Saved data as uf141.mat
Reading 58
Saved data as uf142.mat
Reading 58
Saved data as uf143.mat
Reading 58
Saved data as uf144.mat
Reading 58
Saved data as uf145.mat
Reading 58
Saved data as uf146.mat
Reading 58
Saved data as uf147.mat
Reading 58
Saved data as uf148.mat
Reading 58
Saved data as uf149.mat
Reading 58
Saved data as uf150.mat
Reading 58
Saved data as uf151.mat
Reading 58
Saved data as uf152.mat
Reading 58
Saved data as uf153.mat
Reading 58
Saved data as uf154.mat
Reading 58
Saved data as uf155.mat
Reading 58
Saved data as uf156.mat
Reading 58
Saved data as uf157.mat
Reading 58
Saved data as uf158.mat
Reading 58
Saved data as uf159.mat
Reading 58
Saved data as uf160.mat
Reading 58
Saved data as uf161.mat
Reading 58
Saved data as uf162.mat
Reading 58
Saved data as uf163.mat
Reading 58
Saved data as uf164.mat
Reading 58
Saved data as uf165.mat
Reading 58
Saved data as uf166.mat
Reading 58
Saved data as uf167.mat
Reading 58
Saved data as uf168.mat
Reading 58
Saved data as uf169.mat
Reading 58
Saved data as uf170.mat
Reading 58
Saved data as uf171.mat
Reading 58
Saved data as uf172.mat
Reading 58
Saved data as uf173.mat
Reading 58
Saved data as uf174.mat
Reading 58
Saved data as uf175.mat
Reading 58
Saved data as uf176.mat
Reading 58
Saved data as uf177.mat
Reading 58
Saved data as uf178.mat
Reading 58
Saved data as uf179.mat
Reading 58
Saved data as uf180.mat
Reading 58
Saved data as uf181.mat
Reading 58
Saved data as uf182.mat
Reading 58
Saved data as uf183.mat
Reading 58
Saved data as uf184.mat
Reading 58
Saved data as uf185.mat
Reading 58
Saved data as uf186.mat
Reading 58
Saved data as uf187.mat
Reading 58
Saved data as uf188.mat
Reading 58
Saved data as uf189.mat
Reading 58
Saved data as uf190.mat
Reading 58
Saved data as uf191.mat
Reading 58
Saved data as uf192.mat

List the Contents of First 20 Files

%There are some useful commands to list the contents of the imported
% universal file, for example:
funclist([100:119],'ref','uf');
File no  Response  Reference   Func Type
    101       1Z+        7Z+         FRF
    102       2Z+        7Z+         FRF
    103       3Z+        7Z+         FRF
    104      28Z-        7Z+         FRF
    105      20Z+        7Z+         FRF
    106      30Z+        7Z+         FRF
    107       4Z+        7Z+         FRF
    108       5Z+        7Z+         FRF
    109       7Z-        7Z+         FRF
    110       9Z+        7Z+         FRF
    111       8Z+        7Z+         FRF
    112       6Z+        7Z+         FRF
    113      21Z+        7Z+         FRF
    114      22Z+        7Z+         FRF
    115      23Z+        7Z+         FRF
    116      26Z+        7Z+         FRF
    117      25Z+        7Z+         FRF
    118      24Z+        7Z+         FRF
    119      33Z+        7Z+         FRF
    100      56Z+       28Z+         FRF

Read All FRFs Into a Single FRF matrix

This will create a matrix, H, NoFreqs-By-NoResponses-By-NoForces and some vectors with DOFs and directions.

[H,f,ForceNo,ForceDir,RespNo,RespDir]=uf2frf(lo,hi,'no');
Warning: Duplicate FRF found for Response: 56Z+ and Force: 28Z+. Discarded.

Find and Plot Driving Point FRF of First Reference

idx=find(RespNo == ForceNo(Ref(1)));
figure
semilogy(f,abs(H(:,idx,1)))
xlabel('Frequency, Hz')
ylabel('Mobility, (m/s)/N')

Select Frequency Range for Curve Fitting

figtext(10,5,'Select Frequency range (low/high)')
[ff,dd]=ginput(2);
flo=ff(1); fhi=ff(2);
fprintf('Frequency range %6.1f to %6.1f Hz selected.\n',ff)
Frequency range   25.9 to  103.3 Hz selected.

Truncate H and Convert to Mobility

All ModalTools curve fitting is done on mobility data

[Ht,ft]=frftrunc(H(:,:,Ref),f,flo,fhi);
Hv=cvfrfa2v(Ht,ft);

Calculate Impulse Responses of All FRFs in H

[h,t,fs] = impresp(Hv,ft);

Calculate Multivariate Mode Indicator Function

MIF = muvamif(Hv);

Curvefit for Poles

poles = complexp(h,fs,min(200,length(ft)),40,MIF,ft);
[fr,zr]=poles2fd(poles);
fprintf('Resonance frequencies and damping ratios:\n')
fprintf('%16s%16s\n','Undamped Freq.','Rel. Damping')
fprintf('%11s%15s\n','Hz','%')
fprintf('%12.2f%16.3f\n',[fr zr].')
fprintf('\nPress any key to continue...\n')
%
Resonance frequencies and damping ratios:
  Undamped Freq.    Rel. Damping
         Hz              %
       28.35           1.223
       40.23           1.223
       75.08           0.709
       83.79           0.742
       91.38           1.066
       94.22           0.666
       97.67           0.861
       99.61           0.794

Press any key to continue...

Curve Fit for Residues

DispTime=0;          % Suppress plotting
[residues,residuals] = pol2resf(H(:,:,1),f,poles,5,120,DispTime);

Import Geometry

geo=univr15(UnvGeoName);
plotseq=univr82(UnvGeoName);
% UF2FRF sorts response dofs in ascending order.
% So we need to sort geo in the same order.
[dum,I]=sort(geo(:,1));
% Sort geo so first column is in ascending order
geo=geo(I,:);
[geonew,psnew,list] = geocond(geo,plotseq);
% Check that "list" is equal to RespNo from the universal file FRFs
if min((list == RespNo')) == 1
    [M,N]=size(geonew);
    [MM,NN,RR]=size(residues);
    geoadd=[zeros(M,2) sign(RespDir').*[1:46]'];
else
    error('Imported geometry and FRF are not consistent.')
end
geonew=[geonew geoadd];
Reading UF Type 15 Data block
Reading UF Type 82 Data block
Reading UF Type 82 Data block
Reading UF Type 82 Data block
Reading UF Type 82 Data block
Reading UF Type 82 Data block
Reading UF Type 82 Data block

Set Up Animation

N = length(poles);
for n = 1:N
    sn = int2str(n);
    eval(['[gpoint,G',sn,',ref] = animcalc(geonew,psnew,residues(',sn,',:),.1,0);'])
end
x = 10*ones(1,N);
y = linspace(10,90,N);
y = fliplr(y);
txt=sprintf('%4s%7.1f%3s','#1:',fr(1),' Hz');
for n = 2:N
    S=sprintf('%4s%7.1f%3s',['#' int2str(n) ':'],fr(n),' Hz');
    txt = str2mat(txt,S);
end
%
call = str2mat('animatebutt(1,gpoint,G1,ref,5,x,y,txt,call)');
for n = 2:N
    eval(['st = ''animatebutt(1,gpoint,G',int2str(n),',ref,5,x,y,txt,call)'';']);
    call = str2mat(call,st);
end
animatebutt(1,gpoint,G1,ref,5,x,y,txt,call);
figtext(100,160,'Animate modes as you please. When done, continue by pressing');
fprintf(' <RETURN> when the Again button shows');
pause
 <RETURN> when the Again button shows

Save the Third Mode Shape as an AVI File

mno = 3;            % Mode number: change for another mode!
[gpoint,G,gref]=animcalc(geonew,psnew,residues(mno,:),.05,0);
FileName=strcat('Mode',num2str(fr(mno)),'Hz.avi');
close all
avimode(FileName,gpoint,G,0,8,[-135,-360-135],[17,17]);

Watch the video