SDT-rotor         Contents     Functions         Previous Next     PDF Index

3.1  Rotor meshing

3.1.1  Meshing utilities

1D

The SDT/Rotor toolbox supports analysis of 1D models of symmetric rotors composed of

You can generate a beam model of your rotor by providing a skyline (points not on the axis defining the radius at various locations). Use NaN to define 2 segments. See rotor1d Skyline for more details.

xy=[0 0; 0 .1;1 .1;1 1;1.1 1;1.1 .1;2 .1];
xy(:,3)=0;  figure(1);plot(xy(:,1),xy(:,2));
% Mesh as beams
mo1d=rotor1d('skylineToBeam',xy);
% Add bearings as spring elements:
mo1d=rotor1d('AddBearing DOF -123 k 1e4 -keep',mo1d,[0.1 0 0]);
mo1d=rotor1d('AddBearing DOF -123 k 1e4 -keep',mo1d,[1.9 0 0]);
 
% now view as 3D model
mo2d=rotor1d('1To2d lc 5e-2',mo1d);
cf=feplot;cf.model=rotor2d('buildFrom2D nsec16',mo2d); 

You can also add beam through rotor1d Addbeam command.

mo1d=rotor1d('AddBeam x1 0 x2 0.7 r2 0.77 MatID 1',[]); % add rod 
mo1d=rotor1d('AddBeam x1 0.5 x2 0.8 r1 0.77 r2 0.90 MatID 1',mo1d); %add tube
mo2d=rotor1d('1To2d lc 5e-2',mo1d);
cf=feplot; cf.model=mo2d; fecom colordatapro;

2D

For 2D rotor representations, the SkyLineTo2d command eases the generation of simple rotors. Note how in the following example Nan separators are used to generate a rotor in multiple parts : center shaft first, then after the separator various disks.

xy=[ 0 0;0  0.00945;0.0088  0.00945; 0.0088  0.0057;
0.042  0.0057;0.042  0.00938; 0.057  0.00938;
0.057  0.008;0.0637  0.008; 0.0637  0.00595;
0.0919  0.00595;0.0919  0.00925; 0.0979  0.00925;
0.0979  0.006;0.121  0.006; 0.121  0.008;
0.127  0.008;0.127  0.0095; 0.142  0.0095;
0.142  0.006;0.175  0.00565; 0.226  0.00565; 0.226  0.0088;
0.232  0.0088;
NaN 0.0057; % Disk
0.00952  0.0057;0.00952  0.008;
 0.0209  0.008; 0.0209  0.0369;
 0.0242  0.0369; 0.0242  0.0572; 0.0266  0.0572;0.0266  0.0369;
 0.0299  0.0369; 0.0299  0.008;0.0413 0.008
NaN .00565; % Separator giving non zero internal diameter .00565
0.177+.01  0.0057;0.177+.01  0.02;0.191  0.02; 0.191  0.0057;
NaN .00565; % Separator giving non zero internal diameter .00565
0.197+.005  0.0374; 0.215-.005  0.0374;  % Impeller
 0.215-.005  0.006+.003;0.222-.002  0.006+.003; % between sub disks
 0.222-.002  0.0775; 0.2259  0.0775;
];
xy(:,3)=0;  
mo2d=rotor1d('skyline To2d -lc .005',xy); % x axis
mo2d.pl=[ ...
   1 fe_mat('m_elastic',1,1)  200000000000 0.29 7800
   2 fe_mat('m_elastic',1,1)  7.17e10 0.33 2830 %2830
   3 fe_mat('m_elastic',1,1)  3.07e12 0.3 .78 % 7800
];
mo2d.Elt(feutil('findelt matid 2 3 4 5',mo2d),5:6)=2;
mo2d.Elt(feutil('findelt innode {x>=.15 & y<=.0057}',mo2d),5:6)=3;
mo2d.Elt(feutil('findelt innode {x>=.22 & y<=.01}',mo2d),5:6)=3;
feplot(mo2d); fecom colordatamat

cf=feplot;cf.model=rotor2d('buildFrom2D nsec16',mo2d);
cf.sel={'-disk1','ColorDataMat'};fecom(';view1')

Figure 3.1: Example rotor generated with meshing utilities

3.1.2  Basic 1D rotor example

Following example builds by hand a simple 1D rotor, with one shaft, one disk and 2 bearing stifnesses. It is almost the same as one accessible through d_rotor TestShaftDiskMdl.

 % define mesh :
 model=struct('Node', ...
         [1 0 0 0  0 0 0; 2 0 0 0  0.4/3 0 0;
          3 0 0 0  0.4*2/3 0 0; 4 0 0 0  0.4 0 0]);
 model.Elt=feutil('ObjectBeamLine',(1:4)'); % define shaft
 model.Elt=feutil('ObjectMass',model,2,...
     [16.5 16.5 16.5 0.18608 0.093 0.093]); % add disk
 model=feutil('AddElt',model,'celas', ... 
      [3 0 2 0 100 0 0; 3 0 3 0 101 0 0]); % add bearings (y and z stifness)
 % define properties
 model.pl=m_elastic('dbval 1 steel');  % shaft material 
 model.il=p_beam('dbval 1 circle 1e-2'); % shaft, r=1e-2
 model.il=p_spring(model.il,'dbval 100 5e5','dbval 101 5e5'); % bearings
 % ends boundaries :  
 model=fe_case(model,'fixdof','Ends',...
     [1.01;1.02;1.03;4.01;4.02;4.03]);
 % Assemble nominal matrices:
 model=fe_caseg('assemble -reset -secdof -matdes 2 1 70',model);
 cf=feplot(model);
 % For solution see sdtweb('freqstud')

Note that at this time only fixed frame representation is available for such 1d rotors (beam1 and mass1 elements). Gyroscopic coupling is then computed under MatType 70 ( The formula for gyroscopic coupling can be found in [6]) The nominal representation for these models is then the Eulerian point of view where the displacement of the rotor is expressed in a non-rotating frame. For the 1D representation, the model nodes are always placed on the nominal rotation axis. Thermal and pre-stress effects are not accounted for.

3.1.3  Meshing 3D rotor from 1D and 2D models

The rotor module supports all 3D elements of SDT. 2D models are only considered through an extrusion and 3D cyclic symmetry. One can import a volume model, or mesh it using feutil meshing commands. This section describes procedures to mesh volumes from 1D and 2D models.

From 1D rotor model meshed using beam1 elements, one can create a 2D model using rotor1d 1To3D command. Note that mass1 elements can not be converted for the moment. For example, with section ?? rotor model

xy=[0 0; 0 .1;1 .1;1 1;1.1 1;1.1 .1;2 .1]; 
mo1d=rotor1d('skyline ToBeam',xy); % Mesh as beams
% Add bearings as spring elements:
mo1d=rotor1d('AddBearing DOF -123 k 1e4 -keep',mo1d,[0.1 0 0]);
mo1d=rotor1d('AddBearing DOF -123 k 1e4 -keep',mo1d,[1.9 0 0]);
mdl3d=rotor1d('1To3d-quad-lc0.02-div24',mo1d); % build 3d rotor
cf=feplot(mdl3d)

Command option -quad force the use of quadratic elements (hexa20) instead of linear elements (hexa8).
Shaft is meshed using hexa8 degenerated elements. The edges on the axis of the shaft are using the same nodes as the beam nodes so that bearings described by celas in 1D intial rotor can remain the same. RBE3 rings are created at each bearing celas. Concentrated masses (no inertia) on the axis are also left.
THIS IS NO LONGER TRUE BUT SHOULD BE REACTIVATED XXX: mass1 elements with inertia that represents disks, are meshed as volume disks of arbitrary thickness (dt) 0.005, with radius R2 computed so that inertia along rotation axis is the same (Ir=0.5m(R22+R12)) and then density is computed to match the mass m (m=(R22R12)*dt). (R1 is shaft radius). Young modulus of disk is taken at 100*steel modulus.
Gyroscopic coupling and centrifugal stifness for 3D elements are only described in the rotating frame, that is to say under MatType 7 and MatType 8.

 mdl3d=fe_mat('defaultil',mdl3d); % default element pro
 mdl3d=fe_mat('defaultpl',mdl3d); % default material pro
 % Assemble nominal matrices:
 mdl3d=fe_caseg('assemble -reset -secdof -matdes 2 1 7 8',mdl3d);

One can also find an example of a 3D rotor in d_rotor('TestVolShaftDiskMdl').

  data={'Rs'  ,0.01  , 'shaft radius';
        'Rd'  ,0.15  , 'disk radius';
        'Ls'  ,0.4   , 'shaft length';
        'Ld'  ,0.03,   'disk thickness';
        'yd'  ,0.4/3,  'disk position on the shaft'
        'yb'  ,0.4*2/3,'bearing stifness position on the shaft'
        'Tol' ,0.05,   'elt length Tol'
        };
  model=d_rotor('TestVolShaftDiskMdl',data);

rotor2d BuildFrom2D convert 2d model to 3d model using cyclic symetry. For example, to convert previous 2D model:

mdl2d=rotor1d('1To2d-quad-lc0.02',mo1d);
mdl3d=rotor2d('buildFrom2D -close nsec3 div8',mdl2d);

3.1.4  From sector to shaft in the case of cyclic symmetry

Closing a disk

The SDT fe_cyclic function only handles single sector models using symmetry conditions. SDT/Rotor extends the capabilities by dealing with a full (possibly multi-stage, then called shaft) rotor model.

Building a disk/shaft model is done in two steps. For each sector, one defines matching edges using a fe_cyclic Build command, the generates a disk/shaft model using fe_cyclicb DiskFromSector.

demosdt(['download-back donnees_secteur.dat'])% xxx missing patchfile
% -removeface : removes skin elements
samcef('read-removeface',fullfile(sdtdef('tempdir'),'donnees_secteur.dat'));
cf=feplot;
% Fix sector edges
fe_cyclic('buildepsl .1 fix',cf.mdl);
fecom('curtabCases','Symmetry')
fecom(';view3;proViewOn');

Figure 3.2: Left and right sides of the sector

The left and right edges of sectors should be conform ! Practically you need to mesh the two surfaces first (possibly generate the second by rotation of the first). Then mesh the interior. You will note that this typically requires at least two layers of element for tetra10 meshing.

3.1.5  Utilities for handling slanted blades

Typically blades have an angle with respect to the er,ez plane. In a number of cases, removing this angle makes node and element selection easier. With two nodes the FixTheta command modifies node positions by removing the angle. The transformation is saved in info,FixTheta stack entry and the back transformation is obtained using a FixTheta call with no argument.

 cf=feplot(2);cf=d_rotor('TestSector');%sdtweb('d_rotor.m#TestSector')
 n1=cf.mdl.Node; % save nodes

 cg=feplot(5); % place rectified model in figure(5)
 cg.mdl=fe_cyclicb('MeshFixTheta 10061 10086 -offset 80',cf.mdl);
 fecom(cg,'view2')
 % verify that the back step works
 cf.mdl=fe_cyclicb('MeshFixTheta',cg.mdl);fecom(cf,'view1')
 if norm(cf.mdl.Node-n1)>1e-10; error('Back transform failed');end

3.1.6  Disk connections in multi-stage cyclic symmetry

In multi-stage cyclic symmetry, each stage is modeled using a superelement called diski (see fe_cyclicb DiskFromSector). Coupling between stages is done using elements. The most consistent approach is to use a physical area that is properly meshed for the full 360 degrees, but this may be difficult in particular when the mesh refinement is notably different between the two stages, so that a node to surface penalized connection is also implemented and an example given at the end of this section.

Two steps are required:

  1. the first step is a manual declaration of the nodes that belong to the two regarding surfaces. The declaration of the nodes in the 2D cut provided by fe_cyclicb DisplayAllEdges command is sufficient (and therefore recommended).
  2. the second step is the automatic reconstruction of the rims as volumes (using automated 3D tessellation) or penalty based node to surface bilateral contact in the MeshRim command.

    Note that fe_shapeoptim can be used to local deform the disk in order to allow rim meshing.

 % load two disk example with space between disks
 cf=demo_cyclic('TestForMeshRimVol')

 % RimStep1: select nodes at the matching interfaces
 fe_cyclicb('DisplayAllEdges',cf);
 % start cursor to pick values : fe_fmesh('3dlineinit')
 n1=[12 18 24 1127 1133 1139];

 % RimStep2: build rims and tessellate
 fe_cyclicb('MeshRimStep2 epsl.1',cf,n1);
 cf.sel='EltName~=SE';fecom('showpatch');

Figure 3.3: Selected disk edge nodes for rim tesselation

If you choose the penalty approach here is a working example where the edges of sector edges are assumed coincident thus allowing an automated search of intersection with the -FindIntersect option.

 % load two disk example with space between disks
 cf=demo_cyclic('testrotor 7 10 3 -NoRim -RimH .1 -blade -cf 2 reset');

 % RimStep1: find nodes at the matching interfaces
 n1=fe_cyclicb('DisplayAllEdges -FindIntersect epsl .2',cf);

 % RimStep2: build rims as springs
fe_cyclicb('MeshRimStep2 epsl.1 -kp 1e12 -slavedisk 1 3 -masterdisk 2',cf,n1);

cf.sel={'groupall','colordatagroup -edgealpha .05 -alpha.1'}
 def=fe_cyclicb('shaft eig 0',cf.mdl);
sel={'disk1','groupall';'disk2','groupall';'disk3','groupall';'rim',''};
 cf.def=fe_cyclicb('DisplaySel',cf,def,sel);
fecom('ColorDataEvalTanz')

3.1.7  View meshes for cyclic symmetry


Figure 3.4: Sample viewing mesh for post-processing multi-stage computations

Meshing tools also include procedures to build viewing meshes from the finite element mesh. fe_cyclicb('MeshRimLine2Patch',cf,sel) aims to build viewing meshes made of surface elements connecting selected nodes of the true mesh of the rotor. sel can be:

The selection is stored in the cf.mdl.Stack{'info','ViewMesh'}. If the -reset option is not specified, the current selection is appended to the existing one. For each project, you should typically edit a script similar to the following

 cf=demo_cyclic('BuildStep0');
 
 % Viewing mesh step 1: disk elements
 fe_cyclicb('DisplayAllEdges',cf);
 %fe_fmesh('3dLineInit',cf); % right click 'Type' or 'Done'
 L=[1 3 5 15 26 0 1121 1123 1125 1135 1146 0 13 15 18 1133 1135 1138];
 fe_cyclicb('MeshRimLine2Patch -reset',cf,L);

 % Viewing mesh step 2: blade elements
 % disk1
 fe_cyclicb('DisplayFirst',cf,{'disk1'});
 %fe_fmesh('3dLineInitAddInfo Quad4',cf); % pick four nodes to form a quad
 % use right click 'Type' or 'Done' to display
 Elt=[Inf abs('quad4');
 154 156 152 148 1 1;148 146 150 154 1 1;
 146 142 144 150 1 1;142 111 83 144 1 1];
 fe_cyclicb('MeshRimLine2Patch',cf,Elt);

 % disk2
 fe_cyclicb('DisplayFirst',cf,{'disk2'});
 fe_fmesh('3dLineInitAddInfo Quad4',cf); % pick four nodes to form a quad
 model.Elt=[Inf abs('quad4');
 1274 1276 1272 1270 1 1;1270 1272 1268 1266 1 1
 1266 1268 1264 1262 1 1;1262 1231 1203 1264 1 1];
 fe_cyclicb('MeshRimLine2Patch',cf,model.Elt);
 fecom('ShowPatch');
 % save cf.Stack{'info','ViewMesh'}

 % Once the geometry generated typical calls are
 fesuper('Sebuildsel -initrot',cf,cf.Stack{'info','ViewMesh'})
 fe_cyclicb('Displaysel 2',cf,def,cf.Stack{'info','ViewMesh'})

©1991-2023 by SDTools
Previous Up Next