Document

11回オープンCAE初心者勉強会
秋山善克
発表内容



Salome-mecaのヘキサメッシュ作成方法
Salome-mecaの熱伝導解析
OpenFOAMの非ニュートンモデル
メッシュ
Salome-mecaヘキサメッシュ作成方法
Partitionにより六面体になるようにCADを分割する→要素の分割数毎にグループ化(サブメッシュで使用)
Salome-mecaヘキサメッシュ作成方法
六面体を作成できればエッジは途中で分割されていても作成可能
つじつまが合うようにメッシュ分割数を指定する(平面でマップドメッシュが作成できるようにする)
2
2
4
2
2
2
4
2
2
4
4
2
4
Salome-mecaヘキサメッシュ作成方法
3Dの指定
2Dの指定
1Dの指定
サブメッシュも同様の指定
分割数を変える
メッシュ
変位結果(変形量100倍)
12.2299μm
変位(mm)
0
0.015
節点値・要素値の取得
View→Windows→Selection
節点及び要素をピックすることで値を取得可能
応力値
応力(MPa)
0
100
Salome-mecaによる定常熱伝導解析
Eficas
Inlet:雰囲気温度15℃、熱伝達率500W/m2℃
Outlet:190℃
条件
熱伝達率
雰囲気温度
結果
Salome-mecaによる非定常熱伝導解析
Inlet:雰囲気温度15℃、熱伝達率500W/m2℃
Eficas
初期温度:190℃
条件
NommerConceptが入力できない
10sを10stepで計算
初期温度
熱伝導解析
設定できない
不要?
Inlet設定
OpenFOAMに組み込まれている非ニュートンモデル
Src\transportModels\incompressible\viscosityModels内
5
(
BirdCarreau

BirdCarreau
    0   1.0  k 
CrossPowerLaw

0  

 
n

1.0  m 
CrossPowerLaw
HerschelBulkley
Newtonian
powerLaw
)
2

n 1.0
2.0
非ニュートンモデルの使用方法
Constant\transportProperties
transportModel CrossPowerLaw;
nu
←任意の非ニュートンモデルを記述
nu [ 0 2 -1 0 0 0 0 ] 1;
CrossPowerLawCoeffs
{
}
nu0
nu0 [ 0 2 -1 0 0 0 0 ] 0.01;
nuInf
nuInf [ 0 2 -1 0 0 0 0 ] 10;
m
m [ 0 0 1 0 0 0 0 ] 0.4;
n
n [ 0 0 0 0 0 0 0 ] 3;
各モデルの定数(材料にあわせて変更する)
粘性係数は密度で割る(動粘性係数で入力)
interFoamの場合はphase1、phase2それぞれに指定する
ひずみ速度の出力
applications\solvers\incompressible\nonNewtonianIcoFoam内
createFields.H内に下記を追加
volScalarField strRatio
(
IOobject
(
"strRatio",
runTime.timeName(),
mesh,
IOobject::NO_READ,
IOobject::AUTO_WRITE
),
mesh,
dimensionedScalar("strRatio", dimensionSet(0,0,-1,0,0,0,0),
scalar(0.0))
);
nonNewtonianIcoFoam.C内に下記を追加
strRatio =
Foam::sqrt(2.0)*mag(symm(fvc::grad(U)));
runTime.write();
runTime.write()の直前に追加する
同様に記述することで
simpleFoam
interFoam
buoyantBoussinesqSimpleFoam
でも可能
HerschelBulkley.C
#include "HerschelBulkley.H"
#include "addToRunTimeSelectionTable.H"
// * * * * * * * * * * * * Private Member Functions * * * * * *
* * * * * * //
#include "surfaceFields.H"
Foam::tmp<Foam::volScalarField>
// * * * * * * * * * * * * * * Static Data Members * * * * * * * Foam::viscosityModels::HerschelBulkley::calcNu() const
* * * * * * //
{
namespace Foam
dimensionedScalar tone("tone", dimTime, 1.0);
{
dimensionedScalar rtone("rtone", dimless/dimTime, 1.0);
namespace viscosityModels
tmp<volScalarField> sr(strainRate());
{
return
defineTypeNameAndDebug(HerschelBulkley, 0);
(
addToRunTimeSelectionTable
min
(
(
viscosityModel,
nu0_,
HerschelBulkley,
(tau0_ + k_*rtone*pow(tone*sr(), n_))
dictionary
);
/(max(sr(), dimensionedScalar ("VSMALL",
dimless/dimTime, VSMALL)))
)
}
);
}
}
HerschelBulkley.C
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * // * * * * * * * * * * * * * * Member Functions * * * * * * * *
* * * * * //
* * * * * * //
Foam::viscosityModels::HerschelBulkley::HerschelBulkley
bool Foam::viscosityModels::HerschelBulkley::read
(
(
const word& name,
const dictionary& viscosityProperties,
const dictionary& viscosityProperties
const volVectorField& U,
)
const surfaceScalarField& phi):
{
viscosityModel(name, viscosityProperties, U, phi),
HerschelBulkleyCoeffs_(viscosityProperties.subDict(typeName
+ "Coeffs")),
k_(HerschelBulkleyCoeffs_.lookup("k")),
viscosityModel::read(viscosityProperties);
HerschelBulkleyCoeffs_ =
viscosityProperties.subDict(typeName + "Coeffs");
n_(HerschelBulkleyCoeffs_.lookup("n")),
tau0_(HerschelBulkleyCoeffs_.lookup("tau0")),
HerschelBulkleyCoeffs_.lookup("k") >> k_;
nu0_(HerschelBulkleyCoeffs_.lookup("nu0")),
HerschelBulkleyCoeffs_.lookup("n") >> n_;
nu_
HerschelBulkleyCoeffs_.lookup("tau0") >> tau0_;
( IOobject
HerschelBulkleyCoeffs_.lookup("nu0") >> nu0_;
( name,
U_.time().timeName(),
return true;
U_.db(),
}
IOobject::NO_READ,
IOobject::AUTO_WRITE
calcNu()
)
),
powerLaw.C
#include "powerLaw.H"
// * * * * * * * * * * * * Private Member Functions * * * * * *
* * * * * * //
#include "addToRunTimeSelectionTable.H"
Foam::tmp<Foam::volScalarField>
#include "surfaceFields.H"
Foam::viscosityModels::powerLaw::calcNu() const
{
// * * * * * * * * * * * * * * Static Data Members * * * * * * *
* * * * * * //
namespace Foam
return max
(
nuMin_,
min
{
(
namespace viscosityModels
nuMax_,
{
k_*pow
defineTypeNameAndDebug(powerLaw, 0);
(
max
addToRunTimeSelectionTable
(
viscosityModel,
(
dimensionedScalar("one", dimTime,
1.0)*strainRate(),
powerLaw,
dimensionedScalar("VSMALL", dimless, VSMALL)
dictionary
),
);
n_.value() - scalar(1.0)
}
}
)
}
)
);
powerLaw.C
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * *
* * * * * //
// * * * * * * * * * * * * * * Member Functions * * * * * * * *
* * * * * * //
Foam::viscosityModels::powerLaw::powerLaw
bool Foam::viscosityModels::powerLaw::read
(
(
const word& name,
const dictionary& viscosityProperties,
const dictionary& viscosityProperties
const volVectorField& U,
)
const surfaceScalarField& phi):
{
viscosityModel(name, viscosityProperties, U, phi),
powerLawCoeffs_(viscosityProperties.subDict(typeName +
"Coeffs")),
k_(powerLawCoeffs_.lookup("k")),
viscosityModel::read(viscosityProperties);
powerLawCoeffs_ = viscosityProperties.subDict(typeName +
"Coeffs");
n_(powerLawCoeffs_.lookup("n")),
nuMin_(powerLawCoeffs_.lookup("nuMin")),
powerLawCoeffs_.lookup("k") >> k_;
nuMax_(powerLawCoeffs_.lookup("nuMax")),
powerLawCoeffs_.lookup("n") >> n_;
nu_
powerLawCoeffs_.lookup("nuMin") >> nuMin_;
(IOobject
powerLawCoeffs_.lookup("nuMax") >> nuMax_;
( name,
U_.time().timeName(),
return true;
U_.db(),
}
IOobject::NO_READ,
IOobject::AUTO_WRITE
),
CrossLawの作成
Src\transportModels\incompressible\viscosityModels内のCrossPowerLawをコピー
名前をCrossPowerLawからCrossLawに変更(フォルダ、ファイル名)
CrossLaw.C内
粘性を計算しているところのnuInf_を削除
CrossPowerLawをCrossLawに置き換え
CrossLaw

 0 
n
1.0  m 
CrossLaw.H内
CrossPowerLawをCrossLawに置き換え
dimensionedScalar nuInf_を削除
CrossLaw.dep内
CrossPowerLawをCrossLawに置き換え
Src\transportModels\incompressible\Make内のfiles
viscosityModels/CrossLaw/CrossLaw.Cを追加
6
Src\transportModelsで./Allmake
(
BirdCarreau
CrossLaw
CrossPowerLaw
HerschelBulkley
Newtonian
powerLaw
)
←CrossLawが追加される
質問
非ニュートンモデルでArrheniusLawを作りたいがどのように温度変数Tを読み
込めばよいかわからない

  H T 
ArrheniusLaw
CrossLaw作成と同じような手順でArrheniusLaw.CまたはArrheniusLaw.Hで現在計算している温度Tを読み込みたい
温度計算にせん断発熱を組み込みたいがどのように作ればよいかわからない

どのように粘度とひずみ速度を定義し計算に組み込むのか
buoyantBoussinesqSimpleFoam内のTeqn.h
fvScalarMatrix TEqn
(
fvm::div(phi, T)
- fvm::Sp(fvc::div(phi), T)
- fvm::laplacian(kappaEff, T)
==Q
);
←
Q  
2
現時間の非ニュートンモデルから計算される
粘性係数とひずみ速度を読み込みたい