2.8  Display shapes : geometry declaration, pre-test#

Before actually taking measurements, it is good practice to prepare a wire frame-display (section 2.8.1 and section 4.1.1 for other examples) and define the sensor configuration (section 2.8.2).

The information is typically saved in a specific .m file which should look like the d_mesh('TutoPre-s3') demo without the various plot commands. The d_pre demo also talks about test preparation.

2.8.2  Sensor/shaker configurations#

The wireframe (experimental geometry) declaration needs a structure with fields

  • .Node positions, see node
  • .Elt display elements, see elt
  • .tdof sensors in the 5 column format ([SensID NodeID tx ty tz] giving a sensor identifier (integer or real), a node identifier (integer, negative if wire frame), and the measurement direction in the test mesh axes. This format supports arbitrary orientation.
  • .nmap optional field used for mapping between ids (NodeId, GID,...) and associated labels. This is managed by sdth urn.nmap.
  • Additional fields that are used when performing test/analysis correlation are described in section 4.8.
  • For non-translation senors, see  section 4.7 for sensor definitions and  section 4.7.1 for topology correlation.

Alternatives to the 5 column .tdof are provided for convenience, readability or to ease specification

  • a DOF definition vector (see mdof) allows the description of translation DOFs in global directions. The convention that DOFs .07 to .09 correspond to translations in the −x,−y,−z directions is implemented specifically for the common case where test sensors are oriented this way.
  • the tabular (cell array,  section 4.6) or URN text definition (see section 4.6.4) of sensors and their position, which is more appropriate for large configurations.
  • a 2 column form DOF where each DOF is associated with a local basis, that must be defined in wire.bas. This format is accepted for interfacing with other codes that use local bases associated with each sensors. SDTools finds this to be cumbersome, so that to you have to build wire.tdof in the global coordinate using the function fe_sens('tdofFromBas').

Once a sensor configuration defined and consistent with input/output pair declarations in measurements (using the .dof field described in  section 2.2.4), you can directly animate measured shapes (called Operational Deflection Shapes) as detailed in section 2.8.3. For interpolation of unmeasured DOFs see section 3.3.2. Except for roving hammer tests, the number of input locations is usually small and only used for MIMO identification (see section 2.9).

The following illustrates the first two forms

[wire,XF,id]=demosdt('DemoGartDataId');

% simply give DOFs (as a column vector) wire.tdof = [1011.03 1001.03 2012.07 1012.03 2005.07 1005.03 1008.03 ... 1111.03 1101.03 2112.07 1112.03 2105.07 1105.03 1108.03 1201.07 ... 2201.08 3201.03 1206.03 1205.08 1302.08 2301.07 1301.03 2303.07 1303.03]';

% Transform to 5 column format, which allow arbitrary orientation wire.tdof=fe_sens('tdof',wire);wire.tdof

cf=feplot(wire); % With a .tdof field, a SensDof,Test is defined automatically sdth.urn('Tab(Cases,Test){Proview,on,DefLen,.1}',cf) % see sdtweb sdth#urn

% You can now display FRFs or modes using [ci,cf]=iicom('dockid',struct('cf',cf,'XF',XF,'id',id)); % Display FRF cf.def=ci.Stack{'Test'}; % automatically uses sensor definition 'Test' % Local estimation, displayed before validation idcom('e .05 6.5') cf.def=ci.Stack{'IdAlt'}; % Same as right click->animate modes on left pole list

This other example deals with the definition of sensors from local bases.

wire=demosdt('DemoGartDataTest'); % Load test gemetry
wire=feutil('rmfield',wire,'tdof'); % tdof will be edefined later from bas
% In this example, each node is associated to a local basis
wire.Node(:,3)=1:size(wire.Node,1);
% They all correspond to the same basis doing this transformation
% xtest -> -yfem, ytest -> zfem, ztest -> -xfem,
wire.bas=[wire.Node(:,3) ... % see sdtweb basis for .bas format
 repmat([1 0  0.0 0.0 0.0   0.0 -1.0 0.0  0.0 0.0 1.0   -1.0 0.0 0.0],size(wire.Node,1),1)];
cf=feplot(wire);fecom(cf,'showbasDID'); % Show all three directions at each node location
% Define the orientation of the sensors in the local basis 
tdof = [1011.02 1001.02 2012.03 1012.02 2005.03 1005.02 1008.02  ...
 1111.02 1101.02 2112.03 1112.02 2105.03 1105.02 1108.02 1201.03 ...
 2201.01 3201.02 1206.02 1205.01 1302.01 2301.03 1301.02 2303.03 1303.02]';
% Build tdof in global coordinate using wire.bas.
wire2=fe_sens('tdofFromBas',wire,struct('tdof',tdof));
% Display Sensors
cf=feplot(wire2);sdth.urn('Tab(Cases,Test){Proview,on}',cf);

It is also fairly common to glue sensors normal to a surface. The sensor array table (see section 4.6) is the easiest approach for this objective since it allows mixing global, normal, triax, laser, ... sensors. The following example shows how this can also be done by hand how to obtain normals to a volume and use them to define sensors.

% This is an advanced code sample
model=demosdt('demo ubeam');

MAP=feutil('getnormal node MAP',model.Node, ... feutil('selelt selface',model)); % select outer boundary for normal

i1=ismember(MAP.ID,[360 365 327 137]); % nodes where sensors are placed MAP.ID=MAP.ID(i1);MAP.normal=MAP.normal(i1,:); model=fe_case(model,'sensdof','test', ... [(1:length(MAP.ID))' MAP.ID MAP.normal]);

% display the mesh and sensors cf=clean_get_uf('feplotcf',model); cf.sel(1)='groupall';cf.sel(2)='-test'; cf.o(1)={'sel2ty7','edgecolor','r','linewidth',2}

2.8.3  Animating test data, operational deflection shapes#

Operational Deflection Shapes is a generic name used to designate the spatial relation of forced vibration measured at two or more sensors. Time responses of simultaneously acquired measurements, frequency responses to a possibly unknown input, transfer functions, transmissibilities, ... are example of ODS.

When the response is known at global DOFs no specific information is needed to relate node motion and measurements. Thus any deformation with DOFs will be acceptable. The two basic displays are a wire-frame defined as a FEM model or a wire-frame defined as a SensDof entry.

 % A wire frame and Identification results
 [wire,IdMain]=demosdt('DemoGartDataTest')  
 cf=feplot(wire);   % wire frame
 cf.def=IdMain;     % to fill .dof field see sdtweb('diiplot#xfread')
 % or the low level call : cf.def={IdMain.res.',IdMain.dof,IdMain.po}

% Sensors in a model and identification results [model,wire]=demosdt('DemoGartDataCoTopo'); cf=feplot(model);cf.mdl=fe_case(cf.mdl,'sensdof','outputs',wire);

cf.sel='-outputs'; % Build a selection that displays the wire frame cf.def=IdMain; % Display motion on sensors

fecom('curtab Plot');

When the response is known at sensors that need to be combined (non global directions, non-orthogonal measurements, ...) a SensDof entry must really be defined.

When displaying responses with iiplot and a test geometry with feplot, iiplot supports an ODS cursor. Run demosdt('DemoGartDataId plot') then open the context menu associated with any iiplot axis and select ODS Cursor. The deflection show in the feplot figure will change as you move the cursor in the iiplot window.

More generally, you can use fecom InitDef commands to display any shape as soon as you have a defined geometry and a response at DOFs. The Deformations tab of the feplot properties figure then lets you select deformations within a set.

[ci,cf]=demosdt('DemoGartDataId dock');
 cf.def=ci.Stack{'Test'};
 % or the low level call : 
 % cf.def={ci.Stack{'Test'}.xf,ci.Stack{'Test'}.dof,ci.Stack{'Test'}.w}
 fecom('CurTab Plot');

You can also display the actual measurements as arrows using

 cf.sens=ci.Stack{'Test'}.dof; fecom ShowArrow; fecom scc1;

For a tutorial on the use of feplot see section 4.4.