In this tutorial, the structural dynamics of structure A and structure B will be coupled using Frequency Based Substructuring. The two separate structures have collocated DoFs on their interface. The nodal description of the interface is obtained with the Virtual Point Transformation.
% Load the FRFs of the two separate structures A and B. YA = vibes.load('VIBES,Examples,Datasets','mat','Benchmark','YAqm.FRFMatrix.mat'); YB = vibes.load('VIBES,Examples,Datasets','mat','Benchmark','YBqm.FRFMatrix.mat'); % Load the FRFs of the assembled structure. YAB = vibes.load('VIBES,Examples,Datasets','mat','Benchmark','YAB.FRFMatrix.mat');
Both FRFMatrix objects contain Channel and RefChannels information. The toolbox will automatically match the right Degrees of Freedom, resulting in fully coupled substructures. This means that both compatibility and equilibrium conditions are met. The default operation returns the DoFs of the dual assembly, meaning that the coupling DoFs appear twice.
FRFMatrix
Channel
RefChannels
YAB_DS = couple(YA,YB);
Verify the results. Compare the coupled FRFs with the ones of the validation measurement.
Select the channel DoFs. Use DoF matching to find the same response channels in the substructured dataset. Use a small tolerance on the positions (10 mm) to cope with slight offsets.
[i_AB, i_DS] = match(YAB.Channels,YAB_DS.Channels,'Position',0.01); i = 1; % Select the RefChannel DoFs. In this case, refer to the name of the % impact. ch_j = {'Name','Ref. Impact 101'}; % Plot the validation FRF and substructured FRF vibes.figure('Dynamic Substructuring'); clf YAB.plot(i_AB(i),ch_j,'PlotType','log','Style','2b','Label','Validation'), hold on YAB_DS.plot(i_DS(i),ch_j,'PlotType','log','Style','2r','Label','DS') ylim([1e-4 1e2]) legend show
Plotting the validation and substructured FRFs
For reference, show the FRF that has been plotted in the 3D Viewer.
fn_geoAB = vibes.fullfile('VIBES,Examples,geometry','subsAB.mat'); % Open the 3D viewer and display the geometry V = vibes.figure3d(); V.clf; V.skyMode(); V.addGeometry(fn_geoAB); % Plot the channels YAB.Channels(i_AB(i)).plot(); YAB.RefChannels.select(ch_j{:}).plot(); V.view(0) V.zoom(2)
Displaying the geometry in the 3D viewer
Using additional options of the couple command, one can control the compatibility and equilibrium conditions of FBS. The available options include:
Compatibility
Equilibrium
OutputDoFs
Symmetrize
% FBS coupling with control over the coupling conditions: [YAB_DS2, Info] = couple(YA,YB, ... 'Compatibility',{'Quantity','Rot','Grouping',1}, ... 'Equilibrium',{'Unit','N','Grouping',1}, ... 'OutputDoFs','primal');
The compatibility (Bc) and equilibrium (Be) Boolean matrices that are used for the assembly are returned in the additional output structure:
disp(Info)
The couple method allows to couple with a compliant interface. The stiffness can be specified in various ways. In this tutorial we will use a frequency-dependent function.
% We begin by defining stiffness k and damping c for the 6 coupling DoFs. k_int = [2e8 2e8 2e8, 20000 20000 20000].'; c_int = [1000 1000 1000, 10 10 10].'; % Implement the frequency dependence in the form of a function handle. stiffnessFcn = @(freq) k_int + 2j*pi*freq*c_int; % Use the InterfaceStiffness property/value pair. [Yu,Opts] = couple(YA,YB,'InterfaceStiffness',stiffnessFcn); % Plot the uncoupled, coupled and flexibly coupled systems for comparison. vibes.figure('Flexible coupling comparison'); hold on YA.plot(1,1,'Label','Uncoupled') YAB.plot(1,1,'Label','Coupled') Yu.plot(1,1,'Label','Flexible coupling') % Notice how the flexible coupling resembles the rigid coupling at lower % frequencies, but behaves more like the uncoupled system at higher % frequencies.
Plotting uncoupled, coupled and flexibly coupled systems
It is also possible to define the compatibility (Bc) and equilibrium (Be) matrices yourself; hereby, one has full freedom to apply FBS. Obviously, you are free to develop your own (de-)coupling routines, leveraging the mathematics functions of the VIBES Toolbox.
% Define Boolean matrices yourself using the vibes.math.bmatrix function Bc = [-vibes.math.bmatrix(YA.nChannels,1:6), vibes.math.bmatrix(YB.nChannels,1:6)]; Be = [-vibes.math.bmatrix(YA.nRefChannels,1:6), vibes.math.bmatrix(YB.nRefChannels,1:6)]; % Perform LM-FBS using the vibes.math.lmfbs function YAB_DS.Data = vibes.math.lmfbs({YA.Data,YB.Data},Bc,Be);
One can now store the substructured result, for instance in the export repository.
YAB_DS.save('VIBES,Examples,Export','YAB_DS');
Contact us for more VIBES
Contact our support team or call us on +31 85 822 50 49
Subscribe to our newsletter
Privacy statement. By submitting this form you agree to having your details registered in our database. At your request, we'll remove your details from our database immediately *