59
Keywords: OpenFOAM SRF MRF cyclicAMI Sliding Interface Fumiya Nozaki Last Updated: 22 May 2014 English CFD for Rotating Machinery OpenFOAM v2.3.0

CFD for Rotating Machinery using OpenFOAM

Embed Size (px)

Citation preview

Page 1: CFD for Rotating Machinery using OpenFOAM

Keywords: • OpenFOAM • SRF • MRF • cyclicAMI • Sliding Interface

Fumiya Nozaki

Last Updated: 22 May 2014

English

CFD for Rotating Machinery

OpenFOAM v2.3.0

Page 2: CFD for Rotating Machinery using OpenFOAM

2

Preface

This document covers

how to set up CFD simulation for a rotating machinery using OpenFOAM.

In particular,

• Single Rotating Frame (SRF)

• Multiple Reference Frame (MRF)

• Arbitraly Mesh Interface (AMI) are and will be described in detail.

Page 3: CFD for Rotating Machinery using OpenFOAM

3

Chapter 1 Introduction

In this chapter we shall describe the classification of the methods for solving a flow around a rotating machinery

using OpenFOAM.

Page 4: CFD for Rotating Machinery using OpenFOAM

4

What we need to decide

Our simulation begins with deciding the following conditions:

1. Computational Domain

2. Time Dependency

Page 5: CFD for Rotating Machinery using OpenFOAM

5

What we need to decide

Our simulation begins with deciding the following conditions:

1. Computational Domain

2. Time Dependency

Does our model include some stationary regions or not?

Page 6: CFD for Rotating Machinery using OpenFOAM

6

What we need to decide

Our simulation begins with deciding the following conditions:

1. Computational Domain

2. Time Dependency

Which do we want to obtain, a steady or transient solution?

Page 7: CFD for Rotating Machinery using OpenFOAM

7

Classification of methods

Only Rotating Region

Include Stationary Region(s)

Steady SRFSimpleFoam

Chapter 2

SimpleFoam + fvOptions

Transient SRFPimpleFoam

Chapter 2

pimpleDyMFoam

1. Computational Domain 2.Tim

e D

ependency

Chapter 2

Chapter 2

Chapter 3

Chapter 4

Page 8: CFD for Rotating Machinery using OpenFOAM

8

Chapter 2 Single Rotating Frame

In this chapter we shall describe how to set up the solvers

and

to simulate an incompressible flow field

in a single rotating frame.

SRFSimpleFoam SRFPimpleFoam

Page 9: CFD for Rotating Machinery using OpenFOAM

9

Overview

The Single Rotating Frame (SRF) model computes fluid flow in a rotating frame of reference that is adhere to a rotating machinery.

• Steady-state solutions are possible • Without any mesh motion

OpenFOAM solvers using Single Rotating Frame (SRF) model

SRFSimpleFoam

SRFPimpleFoam

Steady-state solver

Transient solver

Page 10: CFD for Rotating Machinery using OpenFOAM

10

Governing equations

Governing Equations of SRFSimpleFoam

𝒖𝑅 ∙ 𝛻 𝒖𝑅 + 2𝜴 × 𝒖𝑅 + 𝜴× 𝜴 × 𝒓 = −𝛻𝑝 + 𝛻 ∙ 𝜈𝑒𝑓𝑓 𝛻𝒖𝑅 + 𝛻𝒖𝑅

𝑇

𝛻 ∙ 𝒖𝑅 = 0

𝒖 = 𝒖𝑅 + 𝜴 × 𝒓

𝜴 :angular velocity

axis of rotation

𝒓

Absolute velocity (the velocity viewed from the stationary frame)

Relative velocity (the velocity viewed from the rotating frame)

:position vector

Coriolis force Centrifugal force

Page 11: CFD for Rotating Machinery using OpenFOAM

11

Let’s run the tutorials

Tutorials of SRFSimpleFoam and SRFPimpleFoam

• SRFSimpleFoam • SRFPimpleFoam

Page 12: CFD for Rotating Machinery using OpenFOAM

12

mixer tutorial | Computational domain

tutorials/incompressible/SRFSimpleFoam/mixer

A blade named “innerWall” is rotating counterclockwise at 5000 rpm.

outlet

outerWall

innerWall

cyclic_half1 cyclic_half0

“inlet” patch is hidden for facilitating visualization. inlet

Page 13: CFD for Rotating Machinery using OpenFOAM

13

mixer tutorial | Boundary conditions

cyclic_half1

cyclic_half0

Cyclic boundary condition

innerWall

𝒖𝑅 = 𝟎

outerWall

𝒖 = 𝟎

inlet

𝒖 = 0 0 − 10

Fixed absolute velocity

Boundary conditions of velocity field

Rotating wall

Stationary wall

Page 14: CFD for Rotating Machinery using OpenFOAM

14

mixer tutorial | Case structure

transportProperties

polyMesh

RASProperties

system constant 0

controlDict

fvSchemes

fvSolution

boundary

faces

neighbour

owner

points

Urel

p

k

omega

nut

case

SRFProperties

Pay attention to these files!

• “Urel” represents the relative velocity. • Rotating velocity condition is described in “SRFProperties” file.

SRFSimpleFoam

Page 15: CFD for Rotating Machinery using OpenFOAM

15

SRFProperties

Angular velocity condition is described in “SRFProperties” file.

/*--------------------------------*- C++ -*----------------------------------*¥

| ========= | |

| ¥¥ / F ield | OpenFOAM: The Open Source CFD Toolbox |

| ¥¥ / O peration | Version: 2.3.0 |

| ¥¥ / A nd | Web: www.OpenFOAM.org |

| ¥¥/ M anipulation | |

¥*---------------------------------------------------------------------------*/

FoamFile

{

version 2.0;

format ascii;

class dictionary;

location "constant";

object SRFProperties;

}

// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //

SRFModel rpm;

axis ( 0 0 1 );

rpmCoeffs

{

rpm 5000;

}

// ************************************************************************* //

Angular velocity is specified in terms of revolutions-per-minute [rpm]

Axis of rotation

5000 rpm ⇒ 5000 ∗ 2π 60 = 523.6 [rad/s]

When the axis vector points to you • rpm>0 ⇒ rotation in counterclockwise direction • rpm<0 ⇒ rotation in clockwise direction

Rotational direction

Page 16: CFD for Rotating Machinery using OpenFOAM

16

Urel

In this tutorial,”SRFVelocity” boundary condition is used on inlet and outerWall boundaries.

inlet

{

type SRFVelocity;

inletValue uniform (0 0 -10);

relative no;

value uniform (0 0 0);

}

This means 𝒖 = 𝟎 (a stationary wall).

This means 𝒖 = 0 0 − 10 .

By setting “relative” up as ”no”

Boundary condition of the relative velocity 𝒖𝑟 (Urel) is able to be specified in terms of the absolute velocity.

outerWall

{

type SRFVelocity;

inletValue uniform (0 0 0);

relative no;

value uniform (0 0 0);

}

Page 17: CFD for Rotating Machinery using OpenFOAM

17

Closer look at the velocity on outerWall

In the stationary coordinate system

In the rotating coordinate system

Radius of outerWall is 0.1 m

𝒖 = 𝟎

𝒖𝒓 = 𝒖 − 𝛀 × 𝒓

= 523.6 ∙ 0.1 = 52.36 [𝑚/𝑠]

Vectors show 𝒖𝑟

Rotational direction

Page 18: CFD for Rotating Machinery using OpenFOAM

18

Let’s run the tutorials

Tutorials of SRFSimpleFoam and SRFPimpleFoam

• SRFSimpleFoam • SRFPimpleFoam

Page 19: CFD for Rotating Machinery using OpenFOAM

19

rotor2D tutorial | Computational domain

tutorials/incompressible/SRFPimpleFoam/rotor2D

A wall named “rotor” is rotating counterclockwise at 60 rpm.

rotor

freestream

0.2m

Page 20: CFD for Rotating Machinery using OpenFOAM

20

rotor2D tutorial | Boundary conditions

Boundary conditions of velocity field

rotor

freestream

𝒖𝑅 = 𝟎

Rotating wall

Page 21: CFD for Rotating Machinery using OpenFOAM

21

Implementation | Calculation of additional forces and absolute velocity

𝒖𝑅 ∙ 𝛻 𝒖𝑅 + 2𝜴 × 𝒖𝑅 + 𝜴× 𝜴 × 𝒓 = −𝛻𝑝 + 𝛻 ∙ 𝜈𝑒𝑓𝑓 𝛻𝒖𝑅 + 𝛻𝒖𝑅

𝑇

𝛻 ∙ 𝒖𝑅 = 0

// Relative momentum predictor

tmp<fvVectorMatrix> UrelEqn (

fvm::div(phi, Urel)

+ turbulence->divDevReff(Urel)

+ SRF->Su() ==

fvOptions(Urel) );

UrelEqn.H

Foam::tmp<Foam::DimensionedField<Foam::vector, Foam::volMesh> >

Foam::SRF::SRFModel::Su() const {

return Fcoriolis() + Fcentrifugal(); }

SRFModel.H

2.0*omega_ ^ Urel_ omega_ ^ (omega_ ^ mesh_.C())

l.126 l.147

Calculation of the absolute velocity (Uabs)

Urel + SRF->U()

SRFSimpleFoam.C

omega_ ^ (mesh_.C() - axis_*(axis_ & mesh_.C()))

Calculation of the additional force terms

Page 22: CFD for Rotating Machinery using OpenFOAM

22

Implementation | SRFVelocity

void Foam::SRFVelocityFvPatchVectorField::updateCoeffs()

{

if (updated())

{

return;

}

// If not relative to the SRF include the effect of the SRF

if (!relative_)

{

// Get reference to the SRF model

const SRF::SRFModel& srf =

db().lookupObject<SRF::SRFModel>("SRFProperties");

// Determine patch velocity due to SRF

const vectorField SRFVelocity(srf.velocity(patch().Cf()));

operator==(-SRFVelocity + inletValue_);

}

// If already relative to the SRF simply supply the inlet value as a fixed

// value

else

{

operator==(inletValue_);

}

fixedValueFvPatchVectorField::updateCoeffs();

}

If ”relative” is ”no”

SRFModel.C l.60 Calculate 𝜴 × 𝒓

𝒖𝑅 = −𝜴 × 𝒓 + 𝒖

If ”relative” is ”yes”

Page 23: CFD for Rotating Machinery using OpenFOAM

23

Chapter 3 Multiple Reference Frame

In this chapter we shall describe how to set up

the multiple reference frame simulation in OpenFOAM.

This model is activated using

“fvOptions” functionality.

Page 24: CFD for Rotating Machinery using OpenFOAM

24

Overview

The Multiple Reference Frame (SRF) model computes fluid flow using both the rotating and stationary reference frame.

• Rotating zone is solved in the rotating frame • Stationary zone is solved in the stationary frame

simpleFoam

Steady-state solver

MRFSource +

fvOptions

OpenFOAM solvers using Multiple Reference Frame (MRF) model

Multiple frames

Page 25: CFD for Rotating Machinery using OpenFOAM

25

Conceptual image

Rotating zone

Stationary zone

Page 26: CFD for Rotating Machinery using OpenFOAM

26

Governing equations

𝒖𝑅 ∙ 𝛻 𝒖 − 𝛀 × 𝒖 = −𝛻𝑝 + 𝛻 ∙ 𝜈𝑒𝑓𝑓 𝛻𝒖 + 𝛻𝒖 𝑇

𝛻 ∙ 𝒖𝑅 = 0

In a rotating zone • the Coriolis force is added to the governing equations

• the flux is calculated from the relative velocity 𝒖𝑅

Governing equations

Coriolis force

𝒖 ∙ 𝛻 𝒖 − 𝛀 × 𝒖 = −𝛻𝑝 + 𝛻 ∙ 𝜈𝑒𝑓𝑓 𝛻𝒖 + 𝛻𝒖 𝑇

𝛻 ∙ 𝒖 = 0

Rotating zone

Stationary zone

1

2

1

2

Page 27: CFD for Rotating Machinery using OpenFOAM

27

mixerVessel2D tutorial | Computational domain

tutorials/incompressible/simpleFoam/mixerVessel2D

A wall named “rotor” is rotating counterclockwise at 104.72 rad/s.

rotor

stator

0.1m

0.04m

Page 28: CFD for Rotating Machinery using OpenFOAM

28

mixerVessel2D tutorial | Rotating zone

Rotating zone

Stationary zone

0.12m

Page 29: CFD for Rotating Machinery using OpenFOAM

29

mixerVessel2D tutorial | Boundary condition

Rotating wall

rotor

stator

Stationary wall

Page 30: CFD for Rotating Machinery using OpenFOAM

30

mixerVessel2D tutorial | Case structure

transportProperties

polyMesh

RASProperties

system constant 0

controlDict

fvSchemes

fvSolution

fvOptions boundary

faces

neighbour

owner

points

cellZones

U

p

k

epsilon

nut

case

Pay attention to these files!

• “Urel” represents the relative velocity. • Rotating velocity condition is described in “SRFProperties” file.

Page 31: CFD for Rotating Machinery using OpenFOAM

31

fvOptions

MRF1

{

type MRFSource;

active ture;

selectionMode cellZone;

cellZone rotor;

MRFSourceCoeffs

{

origin (0 0 0);

axis (0 0 1);

omega 104.72;

}

}

Specifying the rotating zone by cellZone named rotor.

Unit: [rad/s]

axis

Following options are available for “selectionMode” • all • cellSet • cellZone • mapRegion • points

origin

Page 32: CFD for Rotating Machinery using OpenFOAM

32

What is cellZones?

FoamFile

{

version 2.0;

format ascii;

class regIOobject;

location "constant/polyMesh";

object cellZones;

}

// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //

1

(

rotor

{

type cellZone;

cellLabels List<label>

1536

(

0

1

2

3

(snip)

1533

1534

1535

)

;

}

)

// ************************************************************************* //

The number of cellZones

The name of cellZones

The number of cells that make up cellZones “rotor”

List of their cell labels

constant/polyMesh/cellZones

Page 33: CFD for Rotating Machinery using OpenFOAM

355 void Foam::MRFZone::addCoriolis(fvVectorMatrix& UEqn, const bool rhs) const

356 {

357 if (cellZoneID_ == -1)

358 {

359 return;

360 }

361

362 const labelList& cells = mesh_.cellZones()[cellZoneID_];

363 const scalarField& V = mesh_.V();

364 vectorField& Usource = UEqn.source();

365 const vectorField& U = UEqn.psi();

366

367 const vector Omega = this->Omega();

368

369 if (rhs)

370 {

371 forAll(cells, i)

372 {

373 label celli = cells[i];

374 Usource[celli] += V[celli]*(Omega ^ U[celli]);

375 }

376 }

377 else

378 {

379 forAll(cells, i)

380 {

381 label celli = cells[i];

382 Usource[celli] -= V[celli]*(Omega ^ U[celli]);

383 }

384 }

385 }

33

Implementation | Calculation of Coriolis force

MRFZone.C

List of cell labels included in cellZones

Adding the Coriolis force as a source term

Page 34: CFD for Rotating Machinery using OpenFOAM

34

Implementation | Calculation of relative flux

34 template<class RhoFieldType>

35 void Foam::MRFZone::makeRelativeRhoFlux

36 (

37 const RhoFieldType& rho,

38 surfaceScalarField& phi

39 ) const

40 {

41 const surfaceVectorField& Cf = mesh_.Cf();

42 const surfaceVectorField& Sf = mesh_.Sf();

43

44 const vector Omega = omega_->value(mesh_.time().timeOutputValue())*axis_;

45

46 const vectorField& Cfi = Cf.internalField();

47 const vectorField& Sfi = Sf.internalField();

48 scalarField& phii = phi.internalField();

49

50 // Internal faces

51 forAll(internalFaces_, i)

52 {

53 label facei = internalFaces_[i];

54 phii[facei] -= rho[facei]*(Omega ^ (Cfi[facei] - origin_)) & Sfi[facei];

55 }

56

57 makeRelativeRhoFlux(rho.boundaryField(), phi.boundaryField());

58 }

MRFZoneTemplates.C

Making the relative flux by subtracting 𝜴 × 𝒓 ∙ 𝑺𝑓 from the absolute flux

Page 35: CFD for Rotating Machinery using OpenFOAM

35

Chapter 4 Dynamic Mesh

In this chapter we shall describe how to set up

a transient simulation with mesh motion in OpenFOAM.

Page 36: CFD for Rotating Machinery using OpenFOAM

36

mixerVesselAMI2D tutorial | Computational domain

First run the tutorial and enjoy post-processing:

incompressible/pimpleDyMFoam/mixerVesselAMI2D

Static Pressure t=5.90 s

Page 37: CFD for Rotating Machinery using OpenFOAM

37

mixerVesselAMI2D tutorial | Results

Velocity Magnitude t=5.90 s

Page 38: CFD for Rotating Machinery using OpenFOAM

38

mixerVesselAMI2D tutorial | Results

Velocity Magnitude t=5.905 s

Page 39: CFD for Rotating Machinery using OpenFOAM

39

mixerVesselAMI2D tutorial | Results

Velocity Magnitude t=5.91 s

Page 40: CFD for Rotating Machinery using OpenFOAM

40

mixerVesselAMI2D tutorial | Results

Velocity Magnitude t=5.915 s

Page 41: CFD for Rotating Machinery using OpenFOAM

41

mixerVesselAMI2D tutorial | Results

Velocity Magnitude t=5.92 s

Page 42: CFD for Rotating Machinery using OpenFOAM

42

mixerVesselAMI2D tutorial | Results

Velocity Magnitude t=5.925 s

Page 43: CFD for Rotating Machinery using OpenFOAM

43

mixerVesselAMI2D tutorial | Results

Velocity Magnitude t=5.93 s

Page 44: CFD for Rotating Machinery using OpenFOAM

44

mixerVesselAMI2D tutorial | Results

Velocity Magnitude t=5.935 s

Page 45: CFD for Rotating Machinery using OpenFOAM

45

mixerVesselAMI2D tutorial | Results

Velocity Magnitude t=5.94 s

Page 46: CFD for Rotating Machinery using OpenFOAM

46

mixerVesselAMI2D tutorial | Results

Velocity Magnitude t=5.945 s

Page 47: CFD for Rotating Machinery using OpenFOAM

47

mixerVesselAMI2D tutorial | Results

Velocity Magnitude t=5.95 s

Page 48: CFD for Rotating Machinery using OpenFOAM

48

mixerVesselAMI2D tutorial | Mesh motion

Mesh is in rotating motion

Mesh is stationary

Settings are in the next page.

Page 49: CFD for Rotating Machinery using OpenFOAM

49

dynamicMeshDict

FoamFile

{

version 2.0;

format ascii;

class dictionary;

location "constant";

object dynamicMeshDict;

}

// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //

dynamicFvMesh solidBodyMotionFvMesh;

motionSolverLibs ( "libfvMotionSolvers.so" );

solidBodyMotionFvMeshCoeffs

{

cellZone rotor;

solidBodyMotionFunction rotatingMotion;

rotatingMotionCoeffs

{

origin (0 0 0);

axis (0 0 1);

omega 6.2832; // rad/s

}

}

cellZone: rotor

The cellZone “rotor” is rotating counterclockwise at 6.2832 rad/s about the origin.

Page 50: CFD for Rotating Machinery using OpenFOAM

50

Sliding interface capability

Patch: AMI1

Patch: AMI2

Coupled through

“cyclicAMI “

stationary

rotating

Page 51: CFD for Rotating Machinery using OpenFOAM

51

cyclicAMI

nFaces 192;

startFace 6048;

}

AMI1

{

type cyclicAMI;

inGroups 1(cyclicAMI);

nFaces 96;

startFace 6240;

matchTolerance 0.0001;

transform noOrdering;

neighbourPatch AMI2;

}

AMI2

{

type cyclicAMI;

inGroups 1(cyclicAMI);

nFaces 96;

startFace 6336;

matchTolerance 0.0001;

transform noOrdering;

neighbourPatch AMI1;

}

front

{

type empty;

inGroups 1(empty);

constant/polyMesh/boundary file

Sliding interface capability , e.g. for rotating machinery is available using cyclicAMI boundary patch class.

In “neighbourPatch”, the coupled patch name is specified.

Page 52: CFD for Rotating Machinery using OpenFOAM

52

Appendix

Page 53: CFD for Rotating Machinery using OpenFOAM

53

AMI1

{

type cyclicAMI;

inGroups 1 (cyclicAMI);

nFaces 20;

startFace 2440;

neighbourPatch AMI2;

transform noOrdering;

}

AMI2

{

type cyclicAMI;

inGroups 1 (cyclicAMI);

nFaces 40;

startFace 2460;

neighbourPatch AMI1;

transform noOrdering;

}

AMI1 AMI2

Coupled through

“cyclicAMI “

Page 54: CFD for Rotating Machinery using OpenFOAM

54

AMI: Creating addressing and weights between 20 source faces and 40 target faces AMI: Patch source sum(weights) min/max/average = 1, 1, 1 AMI: Patch target sum(weights) min/max/average = 1, 1, 1

Let’s check the weights!

sum(weights)=1 is the ideal value. This means the patches conform perfectly.

AMI1

{

type cyclicAMI;

inGroups 1 (cyclicAMI);

nFaces 20;

startFace 2440;

neighbourPatch AMI2;

transform noOrdering;

}

AMI2

{

type cyclicAMI;

inGroups 1 (cyclicAMI);

nFaces 40;

startFace 2460;

neighbourPatch AMI1;

transform noOrdering;

}

source patch

target patch

Appearing first in “boundary” file

Page 55: CFD for Rotating Machinery using OpenFOAM

55

Translate the pink-colored volume upward by 0.02m

Page 56: CFD for Rotating Machinery using OpenFOAM

56

AMI: Creating addressing and weights between 20 source faces and 40 target faces AMI: Patch source sum(weights) min/max/average = 0.6, 1, 0.98 AMI: Patch target sum(weights) min/max/average = 0.2, 1, 0.98

Let’s recheck the weights!

𝑠𝑢𝑚(𝑤𝑒𝑖𝑔ℎ𝑡𝑠) =0.03

0.05= 0.6

0.05𝑚2 0.03𝑚2

Fraction of the intersecting areas

Page 57: CFD for Rotating Machinery using OpenFOAM

57

AMI: Creating addressing and weights between 20 source faces and 40 target faces AMI: Patch source sum(weights) min/max/average = 0.6, 1, 0.98 AMI: Patch target sum(weights) min/max/average = 0.2, 1, 0.98

Let’s recheck the weights!

0.025𝑚2

0.005𝑚2

𝑤𝑒𝑖𝑔ℎ𝑡 =0.005

0.025= 0.2

Page 58: CFD for Rotating Machinery using OpenFOAM

58

User specified threshold for sum(weights)

Release note Version2.3.0

Page 59: CFD for Rotating Machinery using OpenFOAM

59

Thank You!

Kindly let me know if you have trouble downloading this slide.