Rotor: rotor specific post-processing

Specific post-processing for rotors or propellers.

Those functions work with a solution tree “t” or a blade surface tree “teff”.

List of functions

– Force extractions

 Post.Rotor.extractSlices(teff, bladeName, …) Extract slices on blade and compute Kp,Cf,CnM2,CmM2. Post.Rotor.computeZb(teff, psi, RoInf, …) Compute Zb. Post.Rotor.computeThrustAndTorque(teff, psi, …) Compute thrust.

– Accumulator export

 Post.Rotor.exportAccumulatorPerPsi(accumulator) Export accumulator (psi,rad) in a zone for a given psi. Export accumulator (psi,rad) in a zone for a given radius. Post.Rotor.exportAccumulatorMap(accumulator) Export accumulator (psi,rad) in a map zone.

Contents

Force extractions

Post.Rotor.extractSlices(teff, bladeName, psi, radius, RoInf, PInf, ASOUND, Mtip, AR, CHORD, MU, relativeShaft=0., localFrame=True, delta=0.05, accumulatorSlices=None, accumulatorCnM2=None, accumulatorCmM2=None)

Extract slices on blades. Export Cp, Cf on those slices. Compute CnM2 and CmM2 on those slices.

Parameters
• teff ([zone, list of zones, base, tree]) – surface stress tree

• bladeName (string) – name of the blade base to work with

• psi (float) – angular angle of blade in teff (in degree)

• RoInf (float) – infinite flow density

• PInf (float) – infinite flow pressure

• ASOUND (float) – infinite flow sound speed

• Mtip (float) – blade mach tip

• AR (float) – blade length

• CHORD (float) – blade mean chord

• MU (float) – advance ratio

• relativeShaft (float) – relative shaft angle if the mesh is not in the wind frame

• localFrame (boolean) – if True, return CnM2 and CmM2 in relative (blade section) frame

• delta (float) – mean mesh step on blade in the span wise direction

• accumulatorSlices (dictionary) – if not None, accumulate slices

• accumulatorCnM2 (dictionary) – if not None, accumulate CnM2

• accumulatorCmM2 (dictionary) – if not None, accumulate CmM2

Returns

list of slices, list of CnM2, list of CmM2 (one for each radius)

Return type

list of zones, list of 3 floats, list of 3 floats

Example of use:

# - extractSlices (pyTree) -
import Converter.PyTree as C
import Post.Rotor as PR
import math

Mtip = 0.6462; MU = 0.4
CHORD = 0.14; AR = 2.1
RoInf = 1.225; PInf = 101325.; AINF = 340.1
SIGMA = 4*CHORD / (math.pi*AR)
teff = C.convertFile2PyTree('stress_419.cgns')

accu = {}
psi = 419.; radius = [1.2,1.3,2.]
RoInf, PInf, AINF, Mtip, AR, CHORD, MU,
accumulatorCnM2=accu, localFrame=True,
relativeShaft=-12.12)

# export for Cp, Cf
C.convertPyTree2File(slices, 'slice.cgns')

# export for CnM2 maps
exp = PR.exportAccumulatorMap(accu, vars=['CnM2x','CnM2y','CnM2z'])
C.convertPyTree2File(exp, 'map.cgns')


Post.Rotor.computeZb(teff, psi, RoInf, ASOUND, Mtip, AR, SIGMA, relativeShaft=0., accumulatorZb=None)

Compute Zb in the wind frame.

Parameters
• teff ([zone, list of zones, base, tree]) – surface stress tree

• psi (float) – angular angle of blade in teff (in degree)

• RoInf (float) – infinite flow density

• ASOUND (float) – infinite flow sound speed

• Mtip (float) – blade mach tip

• AR (float) – blade length in m

• SIGMA (float) – rotor solidity (= Nb*c / pi*AR)

• relativeShaft (float) – relative shaft angle if the mesh is not in the wind frame

• accumulatorZb (dictionary) – if not None, accumulate Zb

Returns

[Xb,Yb,Zb]

Return type

list of 3 floats

Example of use:

# - computeZb (pyTree) -
import Converter.PyTree as C
import Post.Rotor as PR
import math

Mtip = 0.6462; MU = 0.4
CHORD = 0.14; AR = 2.1
RoInf = 1.225; PInf = 101325.; AINF = 340.1
SIGMA = 4*CHORD / (math.pi*AR)
teff = C.convertFile2PyTree('stress_419.cgns')

zb = PR.computeZb(teff, 419., RoInf, AINF, Mtip, AR, SIGMA, relativeShaft=-12.12); print(zb)
#> [-1.101453126880057, -0.11259440192933268, 10.18004327358801]

accu = {}
zb = PR.computeZb(teff, 419., RoInf, AINF, Mtip, AR, SIGMA, relativeShaft=-12.12, accumulatorZb=accu)
C.convertPyTree2File(ret, 'Zb.cgns')


Post.Rotor.computeThrustAndTorque(teff, psi, PInf, center=(0, 0, 0), relativeShaft=0., accumulatorThrust=None)

Compute Thrust in the rotor frame (that is orthogonal to rotor).

Parameters
• teff ([zone, list of zones, base, tree]) – surface stress tree

• psi (float) – angular angle of blade in teff (in degree)

• PInf (float) – infinite flow pressure

• center (list of 3 floats) – center for momentum computations

• relativeShaft (float) – relative shaft angle if the mesh is not in the rotor frame

• accumulatorThrust (dictionary) – if not None, accumulate thrust and torque

Returns

thrust=[tx,ty,tz] and torque=[mx,my,mz]

Return type

2 lists of 3 floats

Example of use:

# - computeThrustAndTorque (pyTree) -
import Converter.PyTree as C
import Post.Rotor as PR
import math

Mtip = 0.6462; MU = 0.4
CHORD = 0.14; AR = 2.1
RoInf = 1.225; PInf = 101325.; AINF = 340.1
SIGMA = 4*CHORD / (math.pi*AR)
teff = C.convertFile2PyTree('stress_419.cgns')

thrust,torque = PR.computeThrustAndTorque(teff, 419., PInf, center=(0,0,0), relativeShaft=0.); print('thrust', thrust, 'torque',torque)
#> thrust [368.952736931205, -39.172151751517326, 3543.2002154791667] torque [226.5518638611441, 950.9479780913017, -935.2791149345967]

accu = {}
thrust, torque = PR.computeThrustAndTorque(teff, 419., PInf, center=(0,0,0), relativeShaft=0., accumulatorThrust=accu)
C.convertPyTree2File(ret, 'Thrust.cgns')


Accumulator export

Post.Rotor.exportAccumulatorPerPsi(accumulator, psi=0., vars=['F1','F2'])

Export a given psi of an accumulator (psi,rad) in a 1D zone. For distributed computations, the exported zone is identical on all processors.

Parameters
• accumulator (dictionary) – (psi,rad) accumulator

• psi (float) – angular angle to be extracted (in degree)

• vars (list of strings) – the name of variables stored in accumulator

Returns

a single Zone with vars corresponding to psi

Return type

Zone

Example of use:

# - exportAccumulatorPerPsi (pyTree) -
import Post.Rotor as PR
import Converter.PyTree as C

accu = {}
for psi in range(0, 360, 10):

z = PR.exportAccumulatorPerPsi(accu, psi=10., vars=['F'])
C.convertPyTree2File(z, 'out.cgns')


Post.Rotor.exportAccumulatorPerRadius(accumulator, rad=0., vars=['F1','F2'])

Export a given radius of an accumulator (psi,rad) in a 1D zone. For distributed computations, the exported zone is identical on all processors.

Parameters
• accumulator (dictionary) – (psi,rad) accumulator

• vars (list of strings) – the name of variables stored in accumulator

Returns

a single Zone with vars corresponding to rad

Return type

Zone

Example of use:

# - exportAccumulatorPerRadius (pyTree) -
import Post.Rotor as PR
import Converter.PyTree as C

accu = {}
for psi in range(0, 360, 10):

C.convertPyTree2File(z, 'out.cgns')


Post.Rotor.exportAccumulatorMap(accumulator, vars=['Fx','Fy','Fz'])

Export accumulator (psi,rad) to a 2D zone. For distributed computations, the exported zone is identical on all processors.

Parameters
• accumulator (dictionary) – (psi,rad) accumulator

• vars (list of strings) – the name of variables stored in accumulator

Returns

a single Zone with fields

Return type

Zone

Example of use:

# - exportAccumulatorMap (pyTree) -
import Post.Rotor as PR
import Converter.PyTree as C

accu = {}
for psi in range(0, 360, 10):