11回オープンCAE初心者勉強会 秋山善克
発表内容 Salome-mecaのヘキサメッシュ作成方法 Salome-mecaの熱伝導解析 OpenFOAMの非ニュートンモデル
メッシュ
Salome-mecaヘキサメッシュ作成方法 Partitionにより六面体になるようにCADを分割する→要素の分割数毎にグループ化(サブメッシュで使用)
Salome-mecaヘキサメッシュ作成方法 六面体を作成できればエッジは途中で分割されていても作成可能 つじつまが合うようにメッシュ分割数を指定する(平面でマップドメッシュが作成できるようにする) 2 2 4 2 2 2 2 2 4 4 4 2 4
Salome-mecaヘキサメッシュ作成方法 3Dの指定 2Dの指定 1Dの指定 サブメッシュも同様の指定 分割数を変える
メッシュ
変位結果(変形量100倍) 12.2299μm 変位(mm) 0.015
節点値・要素値の取得 View→Windows→Selection 節点及び要素をピックすることで値を取得可能
応力値 応力(MPa) 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 CrossPowerLaw HerschelBulkley Newtonian powerLaw ) BirdCarreau CrossPowerLaw
非ニュートンモデルの使用方法 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それぞれに指定する
ひずみ速度の出力 同様に記述することで simpleFoam interFoam buoyantBoussinesqSimpleFoam applications\solvers\incompressible\nonNewtonianIcoFoam内 createFields.H内に下記を追加 nonNewtonianIcoFoam.C内に下記を追加 volScalarField strRatio ( IOobject "strRatio", runTime.timeName(), mesh, IOobject::NO_READ, IOobject::AUTO_WRITE ), dimensionedScalar("strRatio", dimensionSet(0,0,-1,0,0,0,0), scalar(0.0)) ); 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" #include "surfaceFields.H" // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // namespace Foam { namespace viscosityModels defineTypeNameAndDebug(HerschelBulkley, 0); addToRunTimeSelectionTable ( viscosityModel, HerschelBulkley, dictionary ); } // * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * * // Foam::tmp<Foam::volScalarField> Foam::viscosityModels::HerschelBulkley::calcNu() const { dimensionedScalar tone("tone", dimTime, 1.0); dimensionedScalar rtone("rtone", dimless/dimTime, 1.0); tmp<volScalarField> sr(strainRate()); return ( min nu0_, (tau0_ + k_*rtone*pow(tone*sr(), n_)) /(max(sr(), dimensionedScalar ("VSMALL", dimless/dimTime, VSMALL))) ) ); }
HerschelBulkley.C // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // Foam::viscosityModels::HerschelBulkley::HerschelBulkley ( const word& name, const dictionary& viscosityProperties, const volVectorField& U, const surfaceScalarField& phi): viscosityModel(name, viscosityProperties, U, phi), HerschelBulkleyCoeffs_(viscosityProperties.subDict(typeName + "Coeffs")), k_(HerschelBulkleyCoeffs_.lookup("k")), n_(HerschelBulkleyCoeffs_.lookup("n")), tau0_(HerschelBulkleyCoeffs_.lookup("tau0")), nu0_(HerschelBulkleyCoeffs_.lookup("nu0")), nu_ ( IOobject ( name, U_.time().timeName(), U_.db(), IOobject::NO_READ, IOobject::AUTO_WRITE ), calcNu() ) {} // * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * // bool Foam::viscosityModels::HerschelBulkley::read ( const dictionary& viscosityProperties ) { viscosityModel::read(viscosityProperties); HerschelBulkleyCoeffs_ = viscosityProperties.subDict(typeName + "Coeffs"); HerschelBulkleyCoeffs_.lookup("k") >> k_; HerschelBulkleyCoeffs_.lookup("n") >> n_; HerschelBulkleyCoeffs_.lookup("tau0") >> tau0_; HerschelBulkleyCoeffs_.lookup("nu0") >> nu0_; return true; }
powerLaw.C // * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * * // Foam::tmp<Foam::volScalarField> Foam::viscosityModels::powerLaw::calcNu() const { return max ( nuMin_, min nuMax_, k_*pow max dimensionedScalar("one", dimTime, 1.0)*strainRate(), dimensionedScalar("VSMALL", dimless, VSMALL) ), n_.value() - scalar(1.0) ) ) ); } #include "powerLaw.H" #include "addToRunTimeSelectionTable.H" #include "surfaceFields.H" // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // namespace Foam { namespace viscosityModels defineTypeNameAndDebug(powerLaw, 0); addToRunTimeSelectionTable ( viscosityModel, powerLaw, dictionary ); }
powerLaw.C // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // Foam::viscosityModels::powerLaw::powerLaw ( const word& name, const dictionary& viscosityProperties, const volVectorField& U, const surfaceScalarField& phi): viscosityModel(name, viscosityProperties, U, phi), powerLawCoeffs_(viscosityProperties.subDict(typeName + "Coeffs")), k_(powerLawCoeffs_.lookup("k")), n_(powerLawCoeffs_.lookup("n")), nuMin_(powerLawCoeffs_.lookup("nuMin")), nuMax_(powerLawCoeffs_.lookup("nuMax")), nu_ (IOobject ( name, U_.time().timeName(), U_.db(), IOobject::NO_READ, IOobject::AUTO_WRITE ), calcNu() ) {} // * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * // bool Foam::viscosityModels::powerLaw::read ( const dictionary& viscosityProperties ) { viscosityModel::read(viscosityProperties); powerLawCoeffs_ = viscosityProperties.subDict(typeName + "Coeffs"); powerLawCoeffs_.lookup("k") >> k_; powerLawCoeffs_.lookup("n") >> n_; powerLawCoeffs_.lookup("nuMin") >> nuMin_; powerLawCoeffs_.lookup("nuMax") >> nuMax_; return true; }
CrossLawの作成 Src\transportModels\incompressible\viscosityModels内のCrossPowerLawをコピー 名前をCrossPowerLawからCrossLawに変更(フォルダ、ファイル名) CrossLaw.C内 粘性を計算しているところのnuInf_を削除 CrossPowerLawをCrossLawに置き換え CrossLaw.H内 dimensionedScalar nuInf_を削除 CrossLaw.dep内 Src\transportModels\incompressible\Make内のfiles viscosityModels/CrossLaw/CrossLaw.Cを追加 Src\transportModelsで./Allmake CrossLaw 6 ( BirdCarreau CrossLaw CrossPowerLaw HerschelBulkley Newtonian powerLaw ) ←CrossLawが追加される
質問 非ニュートンモデルでArrheniusLawを作りたいがどのように温度変数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 ); 現時間の非ニュートンモデルから計算される粘性係数とひずみ速度を読み込みたい ←