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 現時間の非ニュートンモデルから計算される 粘性係数とひずみ速度を読み込みたい
© Copyright 2024 ExpyDoc