今野です.
例えば次のような過程でエラーの原因を特定していったら如何でしょうか?
1. ログでのエラーメッセージで内のキーワードを拾って,エラーの原因のあたりをつける.
log_pimplyDyMFoam
```
#0 Foam::error::printStack(Foam::Ostream&) at ??:?
#1 Foam::sigFpe::sigHandler(int) at ??:?
//sigFpe→浮動小数点例外シグナル
#2 ? in "/lib/x86_64-linux-gnu/libc.so.6"
#3 Foam::divide(Foam::Field<double>&, Foam::UList<double> const&, Foam::UList<double> const&) at ??:?
//divide→除算→浮動小数点例外と併せて考えると,恐らく0割りのエラー
#4 Foam::tmp<Foam::GeometricField<double, Foam::fvPatchField, Foam::volMesh> > Foam::operator/<Foam::fvPatchField, Foam::volMesh>(Foam::tmp<Foam::GeometricField<double, Foam::fvPatchField, Foam::volMesh> > const&, Foam::tmp<Foam::GeometricField<double, Foam::fvPatchField, Foam::volMesh> > const&) at ??:?
#5 Foam::kOmegaSST<Foam::eddyViscosity<Foam::RASModel<Foam::IncompressibleTurbulenceModel<Foam::transportModel> > >,Foam::IncompressibleTurbulenceModel<Foam::transportModel> >::F2() const at ??:?
#6 Foam::kOmegaSST<Foam::eddyViscosity<Foam::RASModel<Foam::IncompressibleTurbulenceModel<Foam::transportModel>>>,Foam::IncompressibleTurbulenceModel<Foam::transportModel> >::correctNut() at ??:?
//kOmegaSSTモデルでのcorrectNut() で0割りをしている可能性が高い
#7 ? in "/home/hirota/OpenFOAM4.0/OpenFOAM-4.x/platforms/linux64GccDPInt32Opt/bin/pimpleDyMFoam"
#8 __libc_start_main in "/lib/x86_64-linux-gnu/libc.so.6"
#9 ? in "/home/hirota/OpenFOAM4.0/OpenFOAM-4.x/platforms/linux64GccDPInt32Opt/bin/pimpleDyMFoam"
浮動小数点例外 (コアダンプ)
```
2. エラーが発生した箇所のソースを読むために,ソースコードをgrep等で検索するか,
site:
https://cpp.openfoam.org/ Foam::kOmegaSST<Foam::eddyViscosity<Foam::RASModel<Foam::IncompressibleTurbulenceModel<Foam::transportModel> > >,Foam::IncompressibleTurbulenceModel<Foam::transportModel> >::correctNut
3. kOmegaSSTのクラスのページから, correctNut を検索する.
```
◆ correctNut() [1/2]
void correctNut ( const volScalarField & S2,
const volScalarField & F2
)
protectedvirtual
Reimplemented in kOmegaSSTSato< BasicTurbulenceModel >.
Definition at line 115 of file kOmegaSSTBase.C.
```
'Definition at line 115 of file kOmegaSSTBase.C.' とあるので,kOmegaSSTBase.C のリンクに飛ぶ.
5. ソースコード kOmegaSSTBase.C のページ内で,correctNut を検索し,ソースコードの中身を見る.
```
template<class TurbulenceModel, class BasicTurbulenceModel>
void kOmegaSST<TurbulenceModel, BasicTurbulenceModel>::correctNut
(
const volScalarField& S2,
const volScalarField& F2
)
{
this->nut_ = a1_*k_/max(a1_*omega_, b1_*F2*sqrt(S2));
this->nut_.correctBoundaryConditions();
fv::options::New(this->mesh_).correct(this->nut_);
BasicTurbulenceModel::correctNut();
}
```
6. 除算をしている箇所が無いか調べる.
a1_*k_/max(a1_*omega_, b1_*F2*sqrt(S2));
```
確かに割っている.
7. 0に設定されている変数を調べる.
a1_ と b1_ は,kOmegaSSTBase.C 内でデフォルト値が適宜されているので,
これらの乱流モデルパラメータを0に設定していない限り0でない.
F2やS2は複雑に算出された値(場)なのですぐにはわからないが,
残るomega_ は0ではないか?
なお,omega_は,ソースコードより,元々場ファイルomegaを読んだもの.
omega_
(
IOobject
(
IOobject::groupName("omega", U.group()),
this->runTime_.timeName(),
this->mesh_,
IOobject::MUST_READ,
IOobject::AUTO_WRITE
),
this->mesh_
)
```
8. 場ファイルomegaの初期値を調べる.
9. RASモデルを用いて解析する時に,乱流統計量の場k, omega, epsilon (k-epsilon系の場合)に必要な条件を調べる.
2021年7月31日土曜日 0:08:23 UTC+9 simano: