fe_sens#

Purpose

Utilities for sensor/shaker placement and sensor/DOF correlation.

Syntax

Command dependent syntax. See sections on placement and correlation below.

Placement

In cases where an analytical model of the structure is available before a modal test, you can use it for test preparation, see section 3.1.3 and the associated d_cor('TutoSensPlace') demo. fe_sens provides sensor/shaker placement methods.

InAcceptable#

Command InAcceptable defines a set of acceptable sensors measuring normal displacement on a surface. This is typically used for hammer testing where duality/reciprocity is used to place sensors that are then used as impact locations (while shaker placement to define locations of reference accelerometers). Normal displacement is also typical for shaker placement.

Syntax is model=fe_sens('InAcceptable',model); with model a standard SDT model. The output model is the same model with a SensDof case entry named Acceptable containing the surface normal displacement observation, and a FaceId set named AcceptableMap containing the faces selected for the observation.

The main advantage of this command is the possibility to restrict the acceptable positions by using a third argument structure to possibly alter selection,

  • .sel to provide a FindElt model selection on which the search is performed. By default a selface selection is performed.
  • .EdgeTol to remove sharp edges. Shaker positioning is indeed impossible or difficult on nodes placed on sharp edges. Field .EdgeTol if present is a numeric value taken as an angle threshold in degrees. Facets showing angles on edges with others facets over the given threshold are eliminated.
  • .radius to restrict the search to element groups (in the SDT terms, see elt) with a significant spatial span. If present, field .radius is a numeric threshold taken as the minimum sphere radius in which groups should not fit.

Example:

% Find acceptable position for shaker placement 
demosdt('demoubeam'); cf=feplot; def=cf.def;
RO=struct('sel','selface', ...
 'EdgeTol',20);
model=cf.mdl.GetData; % Temporary model

model=fe_sens('InAcceptable',cf.mdl,RO);

% display model with new stack entries feplot('initmodel',model) % display added SensDof entry sdth.urn('Tab(Cases,Acceptable){Proview,on,DefLen,.2}',cf)

InGetDn#

model=fe_sens('InGetDn',model,def); appends normal displacement associated with DOF .19.

model is a FEM model, def is a curve defined on the model. By default, this command expects to find the SensDof entry Acceptable generated by fe_sens InAcceptable. One can however provide a custom observation using a third argument SensDofName as string defining a SensDof entry in model.

By default the output is model with added stack entries

  • curve,InDef providing the def structure with added observations on DOF .19.
  • info,SensDofName providing the observation structure used. Note that SensDofName is here the name provided in third argument with default set to Acceptable.

The following command options are available

  • -def outputs the def structure with added observations on DOF .19 instead of model.
  • -d19 only generates the def output on DOF .19.

The following example is based on the pre-treatment performed by fe_sens InAcceptable.

% Add additional nodal observations to an existing curve
% Normal displacement appended for shaker placementp procedures
model=fe_sens('InGetDn',model,def); 
d1=stack_get(model,'curve','InDef','get')

indep#

sdof=fe_sens('indep',DEF) uses the effective independence algorithm [21] to sort the selected sensors in terms of their ability to distinguish the shapes of the considered modes. The output sdof is the DOF definition vector cdof sorted according to this algorithm (the first elements give the best locations).

See example in the d_cor('TutoSensPlace') demo. The mseq algorithm is much faster and typically gives better results.

mseq#

sdof = fe_sens('mseq Nsens target',DEF,sdof0) places Nsens sensors, with an optional initial set sdof0. The maximum response sequence algorithm [55] used here can only place meaningfully NM (number of modes in DEF) sensors, for additional sensors, the algorithm tries to minimize the off-diagonal auto-MAC terms in modes in DEF.def whose indices are selected by target.

 [FEM,def]=demosdt('demo gartfe');
 def=fe_def('subdef',def,6:15); % Keep ten modes
 d1=fe_def('subdof',def,[.01;.02;.03]) % Keep translations
 % Select subpart as target location
 d1=fe_def('subdof',d1,feutil('findnode group 4:6',FEM));
 sdof= fe_sens('mseq 10',def); 
 FEM=fe_case(FEM,'sensdof','Test',sdof);
 feplot(FEM);fecom('curtabCase -viewOn','Test');
 % see also  garsens demo 

ma[,mmif]#

[sdof,load] = fe_sens('ma val',po,cphi,IndB,IndPo,Ind0)

Shaker placement based on most important components for force appropriation of a mode. The input arguments are poles po, modal output shape matrix cphi, indices IndB of sensor positions where a collocated force could be applied, IndPo tells which mode is to be appropriated with the selected force pattern. Ind0 can optionally be used to specify shakers that must be included.

sdof(:,1) sorts the indices IndB of positions where a force can be applied by order of importance. sdof(:,2) gives the associated MMIF. load gives the positions and forces needed to have a MMIF below the value val (default 0.01). The value is used as a threshold to stop the algorithm early.

ma uses a sequential building algorithm (add one position a time) while mmif uses a decimation strategy (remove one position at a time).

Correlation

fe_sens provides a user interface that helps obtaining test/analysis correlation for industrial models. To get started you can refer to the following sections

  • defining a wire-frame with translation sensors in section 2.8.1 and section 2.8.2
  • adding sensors to a FEM as a SensDof entry is illustrated in the topology correlation tutorial section 3.1.

Commands supported by fe_sens are

basis#

These commands are used to handle cases where the test geometry is defined in a different frame than the FEM. An example is detailed in section 3.1.2.

BasisEstimate guesses a local coordinate system for test nodes that matches the FEM model reasonably and displays the result in a fashion that lets you edit the estimated basis. Arguments are the model, and the name of the SensDof entry containing a test frame.

model = fe_sens('basisEstimate',model,'Test');

A list of node pairs in the FEM and test frames can be provided as an additional argument to improve results. The list is a two columns matrix containing FEM (resp. test) NodeId in the first (resp. second) column. If four nodes are provided, the estimation is an exact triplet positioning, the first node being the origin and the 3 other being directions (must be non collinear). For shorter or longer node lists, the positioning is based on global distance minimization between paired nodes.

BasisEstimate2 uses another strategy to guess a reasonable superposition of the test wireframe over the FEM, based on finding main directions (SVD of the node sets) and their corresponding orientations. It should be used rather than BasisEstimate when it is not expected that global coordinates (X,Y,Z directions) of both the test and the FEM coincide.

Basis is used to set the local test basis in a script (see example in section 3.1.2). Once the script is set, command option -noShow allows not printing the setting script to the screen.

BasisToFEM is used to transform the SensDof entry to FEM coordinates. This transformation is done after basis adjustment and makes verification easier by clarifying the fact that the sens.tdof uses the 5 column format with measurement directions given in the FEM format. The only reference to test is the identifier in sens.tdof(:,1) which is kept unchanged and thus where a 1.01 will refer to test direction x which may be another direction in the FEM.

SensMatch, sens, ...#

For the basic definition of translation sensors is associated with cell arrays giving {'SensId','x','y','z','DirSpec'}, as detailed in section 4.6.

The building of observation matrices for SensDof entries is now described under sensor SensMatch (building topology correlation to locate test nodes in the FEM model) and sensor Sens (building of the observation matrix after matching). Please read section 4.7.1 for more details.

The obsolete near,rigid,arigid commands are supported through SensMatch calls.

tdof, ...#

tdof = fe_sens('tdof',sens.tdof) returns the 5 column form of tdof if sens.tdof is defined as a DOF definition vector. For more details see sens.tdof, section 2.8 for test geometry definition, and section 4.7 for general sensor definitions in FEM models.

sens=fe_sens('tdoftable',tcell,sens); is used to generate a group of sensors from a table a illustrated in section 4.6. The sens may be omitted of all the information is given in the table. The command option InFEM is used to generate sensors that use FEM degree of freedom.

fe_sens('tdoftable',model,'SensDofEntry'); is used to generate the table description of the given group of sensors (with no output argument, the table is displayed).

WireExp#

def = fe_sens('wireexp',sens) uses the wire-frame topology define in sens to create an interpolation for un-measured directions. For a tutorial on this issue see section 3.3.2.

The following example applies this method for the GARTEUR example. You can note that the in-plane bending mode (mode 8) is clearly interpolated with this approach (the drums of the green deformation have global motion rather than just one point moving horizontally).

 [TEST,test_mode]=demosdt('DemoGartDataTest');
 TR=fe_sens('wireexp',TEST);
 cf=feplot;cf.model=TEST;fe_sens('WireExpShow',cf,TR)
 pause %Use +/- to scan trough deformations as a verification

cf.def(1)=test_mode; cf.def(2)={test_mode,TR}; fecom(';show2def;ScaleEqual;ch8;view2'); legend(cf.o(1:2),'Nominal','Wire-exp')

The command builds default properties associated with the wire frame (beams properties for segments, shells properties for surfaces, elastic properties for volumes). In some cases you may get better properties by defining properties yourself (see section 7.4 and section 7.3).

Test mesh handling

fe_sens provides commands dedicated to test mesh manipulations prior to correlation.

MeshGrid#

Generates a mesh from a uniform planar grid projected along a normal on a model. The result an be used as a test mesh as coming from a laser measurement.

Syntax sens=fe_sens('MeshGrid',model,struct('div',d1,'normal',n1));, with a model input. The grid to be matched will be divided into d1 by d1 subdivisions, along normal n1 a 1x3 vector.

MeshProject#

TEST=fe_sens('MeshProject',TEST,'x',[x1 x2 x3],...); Projects the test mesh from a basis declaration. This allows keeping a test mesh in a specific basis for reuse in different FEM. Usual options are x, y, origin, scale. The command then defines a basis compatible with the input arguments and projects nodes and tdof in the mesh output.

TEST=fe_sens('MeshProject',TEST,...
{'x',   [-0.0724899 0.0460858 -0.996304], ... % x_test in FEM coordinates
 'y',   [-0.0846775 0.995041 0.0521884], ... % y_test in FEM coordinates
 'origin',[182.78955815663335 25.33640608720782 -1.0],... % test origin in FEM coor
 'scale', [1]};

MeshSensAsMPC#

Generates a fe_caseMPC entry with control points corresponding to sensors.

mo1=fe_sens('MeshSensAsMPC',model); will generate in mo1 a contraint named SensAsMPC from all fe_caseSensDOF entries of model.

Following command options are available

  • shiftval to shift sensor NodeId by val. Default is 0.
  • addMasterNodes to add free master nodes to each slave node. The constraint is thus release, this should be combined with residual modes or other coupling.
  • noMass no to add small masses for visualization.
  • doNMapNodes to add sensor labels in corresponding nmap.
  • tolDropval sets a tolerance not to include a weighting coefficient under val. This allows size controls regarding numerical roundoff errors, not to include insignificant terms in the export.
  • dotag adavanced option. Set tag to nl to work on non-linearities instead of SensDof entries.
  • Cb to implement a callback after the standard command. A strong format called with eval is expected.
% Get demo model with sensors
model=demosdt('DemoGartData');
% Generate MPC from sensors observation
mo1=fe_sens('MeshSensAsMPC',model)
% see new entry AsMPC
fe_case(mo1,'stack_get','mpc','SensAsMpc','get')

MeshSub#

T1=fe_sens('MeshSub',TEST,NodeSel); Generates a test mesh T1 excluding nodes provided in NodeSel in test mesh TEST. NodeSel can be a list if NodeId or a FindNode selection. Remaining edges of cut surface elements will be kept as beams.

Section 4.7, femesh, fe_exp, fe_c,ii_mac, ii_comac