SDT-rotor
Contents  
Functions  
 ![]() ![]() |
Purpose
Support for advanced cyclic symmetry computations.
Description
fe_cyclicb groups advanced commands used to build and manipulate reduced order models of single symmetric structures and their assemblies. For more details on the associated theory you can refer to [8].
Rotor Construction
This command builds a disk/rotor model from (a) physical sector model(s). Shafts can be generated by combining multiple calls to disk from sector. Once, disks are combine, their connection trough rim models is described in section 3.1.6.
Command DiskFromSector also handles the construction of the cyclic sector models. Cyclic symmetry information can be already given in the sector model (calls to fe_cyclic('build') done beforehand) or done in the command. In the later case, an optional epsl tol can be declared so that it is propagated to the subsequent call to fe_cyclic('build epsl tol',...), where tol is the desired tolerance for left-right interface node matching.
The example below demonstrates the capability of the function for two disks with 7 and 10 blades respectively.
cf=demo_cyclic('buildstep0'); sector1=cf.Stack{'disk1'}; sector2=cf.Stack{'disk2'}; % build disk1 from sector1 model=fe_cyclicb('DiskFromSector epsl 1e-6',[],sector1); % build disk2 from sector2 and append to disk1 model=fe_cyclicb('DiskFromSector epsl 1e-6',model,sector2); fe_cyclicb('DisplayFirst',model) % Avoids full display for large models
In cases when cf already contains one sector per disk, the shaft model can be created in a single operation with the command fe_cyclicb('diskfromsector',[],cf,{'sel_disk1','sel_disk2',...}); where sel_diski selects the sector model of disk i. The example below illustrate this by putting the two sector models into a single one prior to the rotor assembly.
cf=demo_cyclic('buildstep0'); % See sdtweb demo_cyclic('Step0') sectors=cf.Stack{'disk1'}; % Build a model with two sectors sectors=feutil('addtest',sectors,cf.Stack{'disk2'}); sectors.Stack={}; cf.model=sectors; % build rotor from sectors and auto display fe_cyclicb('DiskFromSector epsl 1e-3',cf,{'group1:2','group3:4'});
During the build process, sectors are automatically renumbered so that node numbers are left interface, interior, right interface (in order matching that of the left interface). The renumbering can be forced with the -renumber option. This allows to have nodal overlap between the superelements of two adjacent sectors. The command then adds a mpc,diski_end multiple point constraint to account for the fact that the disk is closed circumferentially.
Meshing utilities See fe_cyclicb Mesh.
ConnectionRing builds a "ring connection" where the structure is fixed axially and radially on a set of nodes and first point only in tangential direction
Display commands group tools to build mesh views specific to disk assemblies.
Sel is a cell array specifying how each stage is displayed. In the example from section 3.5.1, one uses
Sel={'','EltName SE'; % Keep only SE for display (no interstage rim) 'disk1(1:2)','groupall'; % all elements from sectors 1:2 'disk2(1:3)','groupall'};% all elements from sectors 1:3
See sdtweb fesuper#SeBuildSel for details on partial superelement display and more examples on the way to define Sel). The last command can be any valid fe_stress command. Without output argument the result is displayed.
[cf,def]=demo_cyclic('buildstep1'); def=fe_def('subdef',def,def.data(:,2)>=0); % remove fixed edge solutions fe_cyclicb('Display',cf,def);fecom('ColorDataEvalA'); fe_cyclicb('DisplaySel',cf,def,cf.Stack('ViewMesh')); fecom('ColorDataEvalA');
During the command one defines SE.cGL0 corresponding to a rotation by one sector. And the SE.Alpha for the harmonic shift. fesuper('sedefinit -rot',cf); is then used to define a restitution by disk. The SeRestit then contains the def so that SeDefinit is performed for every restitution.
cf=demo_cyclic('buildstep0'); fe_cyclicb('DisplayAllEdges',cf); fecom('colordatag');
cf=demo_cyclic('buildstep0'); fe_cyclicb('DisplayFirst',cf,{'disk2'});
cf=demo_cyclic('buildstep0'); fe_cyclicb('DisplaySkin',cf,{'disk1'}); fecom('showpatch');set(cf.o(1),'FaceAlpha',.33);
cf=demo_cyclic('buildstep0'); % rim nodes n1=feutil('getnode NodeId',cf.mdl,[12 18 24 1127 1133 1139]'); fe_cyclicb('DisplayInterDisk',cf,n1);
Mono-harmonic solutions
These commands apply to sector models used to compute mono-harmonic eigensolutions.
These commands compute mono-harmonic solutions with specified Fourier harmonics (classical cyclic solution for single stage models). For a tutorial on generating the proper models, see section 3.1.6. For the associated theory, please refer to [9].
The calling format is def=fe_cyclicb('shaft Teig delta_list',model);. ShatTeig accepts multiple diameters in the delta_list and packages individual calls that to ShatTeig. For a disk example section 3.5.2.
The main command options are
One then typically expects to have set a cf.mdl.Dbfile='file_DB.mat' to allow memory off-loading during the computation.
cf=demo_cyclic('testrotor 7 -blade -cf 2'); root=fullfile(sdtdef('tempdir'),'Disk_7_Batch') %setpref('SdtRuntime','ExecLocal',1) % May be needed % cf.mdl.Dbfile=[root '_DB.mat']; % out of core matrices fe_cyclicb('shaft Teig 0 1 5 -batch',[root '.mat']); % multiple Disk_7_batch_diam.mat files are generated % Now reload pointers to selected solutions RO=struct('Fmax',8000,'diams',[0 1 5]); d1=fe_cyclicb('DefList',root,RO);
fe_cyclicb('ShaftSeAssemble -force',cf.mdl,fname) is used to assemble superelement matrices of each of the disk* superelements. If a curve,StaticState is defined in the model stack, fe_cyclic assemble is used, otherwise SE=fe_mknl(SE,'NoT') is called.
If the -force option is omitted an attempt to reload the variable Stack_SE_diski from the file is first made and assembly is only performed if that variable does not contain the matrices.
If a mdl.Dbfile field is defined, the argument fname may be omitted.
-reset xxx.
Cyclic symmetry results can be stored in three main forms
The test for usage of this format is that the last dof is above .05 rem(d2.DOF(end),1)>.5.
d1.def=[real(d1.def(:,1));imag(d1.def(:,1)]; d1.data=[d1.data(1,:);NaN NaN]
DefDouble, DefLong, DefBasic commands allow transformations between formats while handling out-of-core files properly.
When reading results, def=fe_cyclicb('DefList','root'); reads all root*.mat files and combines the vectors into a single deformation set in the double vector format. Selection of diameters and frequency range during the read process is peformed using
RO=struct('Fmax',8000,'diams',[0 1 5 18]); d1=fe_cyclicb('DefList','root',RO);
Specific cases require to sort the output vectors according to the list of diameters specified in the .diams field, especially when one wants to put fixed interfaces solutions first for reduction purposes. The command to use becomes DefListSortDiam.
Full rotor SE model
fe_cyclicb('ShaftPrep',cf,def); generates reduced sector super-elements.
Each bladed sector is divided into two regions. A first super-element is attached to the elements with the left interface nodes, it is called the inter-sector super-element. A second one is attached to the remaining elements to form the sector super-element.
A reduced kinematic subspace of the sector super-element (with the definition above) is built from def, disk by disk.
Vectors are first sorted with respect to their contribution to the considered disk if the -svdtruncate option is used.
Then, they are sorted according to their contribution to subsets of physical DOF of the initial sector. If one specifies -mseq 0 (default call), these subsets are
If -mseq 1 is enforced, these subsets are
Both these sortings make the subsets of vectors linearly independent from each other. They require that fixed edge solutions are stored at the beginning in def.
The following step is to make the vectors linearly independent within each set. Vectors in sets (1.), (2.) and (4.), when applicable, are processed with an Iterative Maximum Sequence Algorithm ([10]). Vectors in set (3.), when applicable, are processed with a Singular Value Decomposition.
See Ref. [5] for details.
-handle option controls whether the resulting bases are stored in memory or on the disk.
-norestit suppresses the explicit construction of the Restit variable, normally stored in cf.mdl.Stack.
Once the sector superelements have been generated, the disk model is assembled using the subsequent fesuper('fassemble',cf) call which generates the reduced disk model in cf.Stack{'SE','MVR'}.
A compact example is provided below. A fully developed example can be found in demo_cyclic ShaftMulti.
[cf,def]=demo_cyclic('buildstep1'); fe_cyclicb('ShaftPrep -svdtruncate -mseq1 -norestit',cf,def); fesuper('fassemble',cf);
fe_cyclicb('ShaftLoadMulti',cf,data); generates a reduced mono-harmonic load for each disk specified in data. It is a cell array whose a typical line is {'diski',def_i,delta_i} where for each disk i, the shape def_i and harmonic coefficient delta_i are specified.
fe_cyclicb('ShaftSELoad',cf,def); generates a reduced load from its physical counterpart. In practice, it is used for very specific loading cases, e.g. single DOF load or random load.
Developed examples are presented in demo_cyclic ShaftMulti.
% define model cf=demo_cyclic('buildstep4'); % build the excitation on first all sectors, with specified % diameters 3 on disk1 and 4 on disk 2 data={'disk1',cf.Stack{'disk1'}.Stack{'Enforce_mode_7'},3; 'disk2',cf.Stack{'disk2'}.Stack{'Enforce_mode_7'},4 'disk1l',struct('def',1,'DOF',cf.Stack{'disk1l'}.Elt(2,1)+.01),3; 'disk2l',struct('def',1,'DOF',cf.Stack{'disk2l'}.Elt(2,1)+.01),4}; def34=fe_cyclicb('ShaftLoadMulti',cf,data); def34.def=sum(def34.def,2); % one column in def34.def per row in data def34.data=[0 0]; fe_cyclicb('fourier 1 -red -cf 1',cf,def34); % checkout shape % now keep the same shapes but force delta=0 on both disks data(:,3)={0}; def00=fe_cyclicb('ShaftLoadMulti',cf,data); def00.def=sum(def00.def,2); % one column in def00.def per row in data def00.data=[0 0]; fe_cyclicb('fourier 1 -red -cf 1',cf,def00); % checkout shape % now try a random load r1=fesuper('fnode',cf.mdl); r1=[r1(:,1)'+.01;r1(:,1)'+.02;r1(:,1)'+.03]; defrnd=struct('DOF',r1(:),'def',[]); defrnd.def=randn(length(defrnd.DOF),1); defrnd=fe_cyclicb('ShaftSELoad',cf,defrnd); defrnd.data=[0 0]; fe_cyclicb('fourier 1 -red -cf 1',cf,defrnd); % checkout shape % now consider a physical load on first sector of disk 1 r1=fesuper('fnode',cf.mdl); r1=[r1(:,1)'+.01;r1(:,1)'+.02;r1(:,1)'+.03]; defsp=struct('DOF',r1(:),'def',[]); defsp.def=fe_c(defsp.DOF,1+[.01;.02;.03])'*randn(3,1); defsp=fe_cyclicb('ShaftSELoad',cf,defsp); defsp.data=[0 0]; fe_cyclicb('fourier 1 -red -cf 1',cf,defsp); % retrieve a Dirac's comb
This command allows to build the Frequency Response Functions of a rotor model, either full or reduced. A load and a set of observation DOF have to be defined and added to the model with fe_case. The frequency range is stored in the stack as a 'info','Freq' entry.
The general call is
xF=fe_cyclicb('ShaftFRFD',disk,lossfac) xF=fe_cyclicb('ShaftFRFD -rest',disk,lossfac,cf,sel) xF=fe_cyclicb('ShaftFRFMS',disk,def,damp) xF=fe_cyclicb('ShaftFRFMS -rest',disk,def,damp,cf,sel)
The command FRFD assembles the matrices of the model then uses them to compute the response. An optional loss factor can be specified.
The command FRFMS synthetizes the response from a set of modeshapes. A damping ratio for all modes can be specified.
The option -rest restores the response computed on the reduced model to a given selection of physical DOF. Without selection, the response is restored to the whole physical DOF set. This option must be disabled when dealing with a full rotor model.
The example developed in demo_cyclic ShaftMulti builds the sythetized response of a reduced rotor model to a random excitation.
% define model [cf,load,def]=demo_cyclic('buildstep5'); % Compute the response to the random excitation mdl=fe_case(cf.Stack('mvr'),'dofload','Load',load); mdl=stack_set(mdl,'info','Freq',linspace(900,2000,2201)); xF=fe_cyclicb('shaft frfms',mdl,def,.001); % select where to restore (upper blade corner) Sel1={'','eltname SE';'disk1','selface & withnode{NodeId 154}'}; Sel1=fesuper('SeBuildSel -initrot',cf,Sel1); Sel2={'','eltname SE';'disk2','selface & withnode{NodeId 154}'}; Sel2=fesuper('SeBuildSel -initrot',cf,Sel2); % ... and do restore xF1=fesuper('SeDef',Sel1.cna{1},xF); xF2=fesuper('SeDef',Sel2.cna{1},xF); % plot responses ci=iiplot(3); XF=iicom(ci,'curveXF'); XF('Disk1')=struct('w',xF.data,'xf',xF1.def','dof',xF1.DOF); XF('Disk2')=struct('w',xF.data,'xf',xF2.def','dof',xF2.DOF); iicom('subMagPha') iicom(ci,'IIxOnly',{'Disk1','Disk2'}); ii_plp(def.data);
This command allows to perform a 3D Fourier analysis of given modeshapes. The maximum norm of each harmonic is plotted against the harmonic coefficient. The plot is different when dealing with a single modeshape or a set of modeshapes.
Accepted options are
[cf,def]=demo_cyclic('buildstep1'); % sdtweb demo_cyclic('step1') Curve=fe_cyclicb('fourier 1:50 -mono -egyfrac',cf,... fe_def('subdef',def,def.data(:,2)~=-1)); 'xxx'%fe_cyclicb('fourier -mono -egyfrac -cf 3',Curve);
% sdtweb demo_cyclic('step4') multi-harmonic analysis [cf,def]=demo_cyclic('buildstep4'); % fe_cyclicb('fourier 7:25 -red -egyfrac -cf 11',cf,def); fe_cyclicb('fourier 7:25 -red -egyfrac -sortbyd -cf 13',cf,def);
See also