曲面における単位法線ベクトルの算出

847 views
Skip to first unread message

mou

unread,
Oct 24, 2011, 8:59:30 AM10/24/11
to OpenFOAM
お世話になっております,mouです.

熱伝導解析において曲面における熱流束を求めようと考えています.
x,y,z成分の熱流束であればtutorials/basic/laplacianFoam/flangeを参考にすれば計算できますが,
法線成分を求めるためには,下式のように熱流束と単位法線ベクトルの内積をとってやればいいと思われます.

q(x,y,z)・n(x,y,z)
(qは温度勾配ベクトルに熱伝導率を掛けたもの)

そこでパッチ(各セル表面)における単位法線ベクトルn(x,y,z)をsampleDict等でサンプリングしたいのですが,
どのファイルをどのように変更すれば良いのでしょうか?
また,接線方向成分の算出は可能でしょうか?
ご教授お願いいたします.

なお,曲面を含んだモデルはGAMBIT2.3を用いて作成し,非構造格子となっています.

mou

ohbuchi

unread,
Oct 24, 2011, 4:39:05 PM10/24/11
to OpenFOAM
こんにちは。
fvPatchクラスのnf()が法線ベクトルになります。
面積ベクトルSf()をmagSf()で割って正規化したものです。

mou

unread,
Oct 24, 2011, 10:07:44 PM10/24/11
to OpenFOAM
ohbuchi様

ご回答ありがとうございます.
fvPatchクラスのnf()が単位法線ベクトルであるということ,
Sf()が面の面積ベクトル,magSf()が面の面積の絶対値ということは確認できました.

しかし,これらの値を得るためには作業フォルダ(計算実行フォルダ)のどこで変数として定義をして,またどのように書き出されるかがよくわかりませ
ん.
それともソルバの方を改良しなければならないのでしょうか?
もう少し具体的な変更点を教えていただきたいのです…素人ですみません.

mou

Masashi Imano

unread,
Oct 24, 2011, 10:39:40 PM10/24/11
to open...@googlegroups.com
今野です。

前に私が御送りした改造ソルバーのcreateFilelds.Hに

volVectorField hf
(
IOobject
(
"hf",
runTime.timeName(),
mesh,
IOobject::NO_READ,
IOobject::AUTO_WRITE
),
-gradT*DT*C
);

と熱流のベクトル場を宣言するコードがありますが、この後に

surfaceScalarField shf
(
IOobject
(
"shf",
runTime.timeName(),
mesh,
IOobject::NO_READ,
IOobject::AUTO_WRITE
),
fvc::interpolate(hf)
);

と界面で定義される熱流のサーフェス場を定義しておけば、
以下のようなfunctionをsystem/controlDictに書くことによって、
任意の形状のパッチにおける熱流束を求めることが出来ると思います。
(ただし、試していません。)

areaIntegrate_top_metal
{
type faceSource;
functionObjectLibs ("libfieldFunctionObjects.so");
enabled true;
outputControl timeStep;
outputInterval 1;
log false;
valueOutput false;
source patch;
sourceName top_metal;
operation areaIntegrate;
fields
(
shf
);
}

2011/10/25 mou <kon...@yahoo.co.jp>:

> --
> このメールは Google グループのグループ「OpenFOAM」の登録者に送られています。
> このグループに投稿するには、open...@googlegroups.com にメールを送信してください。
> このグループから退会するには、openfoam+u...@googlegroups.com にメールを送信してください。
> 詳細については、http://groups.google.com/group/openfoam?hl=ja からこのグループにアクセスしてください。
>
>

--
IMANO Masashi, Ph.D.
Assistant Professor
Department of Architecture, Graduate School of Engineering,
The University of Tokyo
7-3-1, Hongo, Bunkyo-ku, Tokyo, Japan, 113-8656
E-mail:im...@arch.t.u-tokyo.ac.jp
Phone:+81-3-5841-6164(direct), +81-3-5841-6179(Labo.)
Facsimile:+81-3-5841-8511

mou

unread,
Oct 25, 2011, 1:22:44 AM10/25/11
to OpenFOAM
今野先生

ご回答ありがとうございます.
上記方法で改良ソルバをwmakeしてみましたが,以下のようなエラーが出てしまいました.
no matching function for … とありますが,GeometricFieldの定義に問題があるのでしょうか…

個人的には「各セル表面の面積」,「単位法線ベクトル値」なども一緒に出力できれば都合が良いので,
magSf()やnf()も求めた上で,
できればohbuchi様のおっしゃるnf()を用いる方法と今野先生のshfが一致することも確認したいです.

アドバイスよろしくお願いします.

mou


[mou@localhost laplacianFoamExperiment_steady]$ wmake
SOURCE=laplacianFoamExperiment_steady.C ; g++ -m64 -Dlinux64 -DWM_DP -
Wall -Wextra -Wno-unused-parameter -Wold-style-cast -Wnon-virtual-dtor
-O3 -DNoRepository -ftemplate-depth-40 -I/home/mou/OpenFOAM/
OpenFOAM-1.7.1/src/finiteVolume/lnInclude -IlnInclude -I. -I/home/mou/
OpenFOAM/OpenFOAM-1.7.1/src/OpenFOAM/lnInclude -I/home/mou/OpenFOAM/
OpenFOAM-1.7.1/src/OSspecific/POSIX/lnInclude -fPIC -c $SOURCE -o
Make/linux64GccDPOpt/laplacianFoamExperiment_steady.o
In file included from laplacianFoamExperiment_steady.C:45:
createFields.H: In function ‘int main(int, char**)’:
createFields.H:94: error: no matching function for call to
‘Foam::GeometricField<double, Foam::fvsPatchField,
Foam::surfaceMesh>::GeometricField(Foam::IOobject,
Foam::tmp<Foam::GeometricField<Foam::Vector<double>,
Foam::fvPatchField, Foam::volMesh> >)’
/home/mou/OpenFOAM/OpenFOAM-1.7.1/src/OpenFOAM/lnInclude/
GeometricField.C:652: note: candidates are: Foam::GeometricField<Type,
PatchField, GeoMesh>::GeometricField(const Foam::IOobject&, const
Foam::GeometricField<Type, PatchField, GeoMesh>&, const
Foam::wordList&) [with Type = double, PatchField =
Foam::fvsPatchField, GeoMesh = Foam::surfaceMesh]
/home/mou/OpenFOAM/OpenFOAM-1.7.1/src/OpenFOAM/lnInclude/
GeometricField.C:617: note: Foam::GeometricField<Type,
PatchField, GeoMesh>::GeometricField(const Foam::IOobject&, const
Foam::GeometricField<Type, PatchField, GeoMesh>&, const Foam::word&)
[with Type = double, PatchField = Foam::fvsPatchField, GeoMesh =
Foam::surfaceMesh]
/home/mou/OpenFOAM/OpenFOAM-1.7.1/src/OpenFOAM/lnInclude/
GeometricField.C:587: note: Foam::GeometricField<Type,
PatchField, GeoMesh>::GeometricField(const Foam::word&, const
Foam::tmp<Foam::GeometricField<Type, PatchField, GeoMesh> >&) [with
Type = double, PatchField = Foam::fvsPatchField, GeoMesh =
Foam::surfaceMesh]
/home/mou/OpenFOAM/OpenFOAM-1.7.1/src/OpenFOAM/lnInclude/
GeometricField.C:554: note: Foam::GeometricField<Type,
PatchField, GeoMesh>::GeometricField(const Foam::word&, const
Foam::GeometricField<Type, PatchField, GeoMesh>&) [with Type = double,
PatchField = Foam::fvsPatchField, GeoMesh = Foam::surfaceMesh]
/home/mou/OpenFOAM/OpenFOAM-1.7.1/src/OpenFOAM/lnInclude/
GeometricField.C:522: note: Foam::GeometricField<Type,
PatchField, GeoMesh>::GeometricField(const Foam::IOobject&, const
Foam::GeometricField<Type, PatchField, GeoMesh>&) [with Type = double,
PatchField = Foam::fvsPatchField, GeoMesh = Foam::surfaceMesh]
/home/mou/OpenFOAM/OpenFOAM-1.7.1/src/OpenFOAM/lnInclude/
GeometricField.C:491: note: Foam::GeometricField<Type,
PatchField, GeoMesh>::GeometricField(const
Foam::tmp<Foam::GeometricField<Type, PatchField, GeoMesh> >&) [with
Type = double, PatchField = Foam::fvsPatchField, GeoMesh =
Foam::surfaceMesh]
/home/mou/OpenFOAM/OpenFOAM-1.7.1/src/OpenFOAM/lnInclude/
GeometricField.C:459: note: Foam::GeometricField<Type,
PatchField, GeoMesh>::GeometricField(const Foam::GeometricField<Type,
PatchField, GeoMesh>&) [with Type = double, PatchField =
Foam::fvsPatchField, GeoMesh = Foam::surfaceMesh]
/home/mou/OpenFOAM/OpenFOAM-1.7.1/src/OpenFOAM/lnInclude/
GeometricField.C:420: note: Foam::GeometricField<Type,
PatchField, GeoMesh>::GeometricField(const Foam::IOobject&, const
typename GeoMesh::Mesh&, const Foam::dictionary&) [with Type = double,
PatchField = Foam::fvsPatchField, GeoMesh = Foam::surfaceMesh]
/home/mou/OpenFOAM/OpenFOAM-1.7.1/src/OpenFOAM/lnInclude/
GeometricField.C:381: note: Foam::GeometricField<Type,
PatchField, GeoMesh>::GeometricField(const Foam::IOobject&, const
typename GeoMesh::Mesh&, Foam::Istream&) [with Type = double,
PatchField = Foam::fvsPatchField, GeoMesh = Foam::surfaceMesh]
/home/mou/OpenFOAM/OpenFOAM-1.7.1/src/OpenFOAM/lnInclude/
GeometricField.C:341: note: Foam::GeometricField<Type,
PatchField, GeoMesh>::GeometricField(const Foam::IOobject&, const
typename GeoMesh::Mesh&) [with Type = double, PatchField =
Foam::fvsPatchField, GeoMesh = Foam::surfaceMesh]
/home/mou/OpenFOAM/OpenFOAM-1.7.1/src/OpenFOAM/lnInclude/
GeometricField.C:314: note: Foam::GeometricField<Type,
PatchField, GeoMesh>::GeometricField(const Foam::IOobject&, const
typename GeoMesh::Mesh&, const Foam::dimensionSet&, const
Foam::Field<Type>&, const Foam::PtrList<PatchField<Type> >&) [with
Type = double, PatchField = Foam::fvsPatchField, GeoMesh =
Foam::surfaceMesh]
/home/mou/OpenFOAM/OpenFOAM-1.7.1/src/OpenFOAM/lnInclude/
GeometricField.C:285: note: Foam::GeometricField<Type,
PatchField, GeoMesh>::GeometricField(const Foam::IOobject&, const
typename GeoMesh::Mesh&, const Foam::dimensioned<Type>&, const
Foam::wordList&) [with Type = double, PatchField =
Foam::fvsPatchField, GeoMesh = Foam::surfaceMesh]
/home/mou/OpenFOAM/OpenFOAM-1.7.1/src/OpenFOAM/lnInclude/
GeometricField.C:256: note: Foam::GeometricField<Type,
PatchField, GeoMesh>::GeometricField(const Foam::IOobject&, const
typename GeoMesh::Mesh&, const Foam::dimensioned<Type>&, const
Foam::word&) [with Type = double, PatchField = Foam::fvsPatchField,
GeoMesh = Foam::surfaceMesh]
/home/mou/OpenFOAM/OpenFOAM-1.7.1/src/OpenFOAM/lnInclude/
GeometricField.C:229: note: Foam::GeometricField<Type,
PatchField, GeoMesh>::GeometricField(const Foam::IOobject&, const
typename GeoMesh::Mesh&, const Foam::dimensionSet&, const
Foam::wordList&) [with Type = double, PatchField =
Foam::fvsPatchField, GeoMesh = Foam::surfaceMesh]
/home/mou/OpenFOAM/OpenFOAM-1.7.1/src/OpenFOAM/lnInclude/
GeometricField.C:199: note: Foam::GeometricField<Type,
PatchField, GeoMesh>::GeometricField(const Foam::IOobject&, const
typename GeoMesh::Mesh&, const Foam::dimensionSet&, const Foam::word&)
[with Type = double, PatchField = Foam::fvsPatchField, GeoMesh =
Foam::surfaceMesh]
createFields.H:106: error: no matching function for call to
‘interpolate(Foam::surfaceScalarField&)’
laplacianFoamExperiment_steady.C:71: error: no match for ‘operator=’
in ‘hf = Foam::operator*(const Foam::tmp<Foam::GeometricField<double,
PatchField, GeoMesh> >&, const Foam::GeometricField<Type, PatchField,
GeoMesh>&) [with Type = Foam::Vector<double>, PatchField =
Foam::fvPatchField, GeoMesh = Foam::volMesh](((const
Foam::GeometricField<Foam::Vector<double>, Foam::fvPatchField,
Foam::volMesh>&)((const Foam::GeometricField<Foam::Vector<double>,
Foam::fvPatchField, Foam::volMesh>*)(& gradT))))’
/home/mou/OpenFOAM/OpenFOAM-1.7.1/src/OpenFOAM/lnInclude/
GeometricField.C:1086: note: candidates are: void
Foam::GeometricField<Type, PatchField, GeoMesh>::operator=(const
Foam::GeometricField<Type, PatchField, GeoMesh>&) [with Type = double,
PatchField = Foam::fvsPatchField, GeoMesh = Foam::surfaceMesh]
/home/mou/OpenFOAM/OpenFOAM-1.7.1/src/OpenFOAM/lnInclude/
GeometricField.C:1111: note: void
Foam::GeometricField<Type, PatchField, GeoMesh>::operator=(const
Foam::tmp<Foam::GeometricField<Type, PatchField, GeoMesh> >&) [with
Type = double, PatchField = Foam::fvsPatchField, GeoMesh =
Foam::surfaceMesh]
/home/mou/OpenFOAM/OpenFOAM-1.7.1/src/OpenFOAM/lnInclude/
GeometricField.C:1147: note: void
Foam::GeometricField<Type, PatchField, GeoMesh>::operator=(const
Foam::dimensioned<Type>&) [with Type = double, PatchField =
Foam::fvsPatchField, GeoMesh = Foam::surfaceMesh]
/home/mou/OpenFOAM/OpenFOAM-1.7.1/src/finiteVolume/lnInclude/
readSIMPLEControls.H:6: warning: unused variable ‘momentumPredictor’
/home/mou/OpenFOAM/OpenFOAM-1.7.1/src/finiteVolume/lnInclude/
readSIMPLEControls.H:9: warning: unused variable ‘transonic’
make: *** [Make/linux64GccDPOpt/laplacianFoamExperiment_steady.o] エラー
1

Masashi Imano

unread,
Oct 25, 2011, 5:50:29 AM10/25/11
to open...@googlegroups.com
今野です。

> 上記方法で改良ソルバをwmakeしてみましたが,以下のようなエラーが出てしまいました.

試していなかったもので、すみません間違ってました。

createFields.H に以下を加えてください。

surfaceScalarField shf
(
IOobject
(
"shf",
runTime.timeName(),
mesh,
IOobject::NO_READ,
IOobject::AUTO_WRITE
),

-fvc::interpolate(DT*C)*fvc::snGrad(T)
);

また、 laplacianFoamExperiment_steady.C の

hf = - DT*C*gradT;

の後に、

shf = -fvc::interpolate(DT*C)*fvc::snGrad(T);

を加えて、反復毎にshfを計算する必要もありました。
修正版を添付します。

ちなみに自分は、壁面での流体の熱流束を求める以下のユーティリティ
のソースを参考にして、このような修正を行ないました。

applications/utilities/postProcessing/wall/wallHeatFlux

2011/10/25 mou <kon...@yahoo.co.jp>:

mou-20111025.tar.gz

mou

unread,
Oct 25, 2011, 7:24:55 PM10/25/11
to OpenFOAM
mouです。

今野先生、訂正ありがとうございました。
ひとまず熱流束を求めることはできました。

できればmagSf()やnf()の値を出力する方法についても伺いたいです。
よろしくお願いします。

mou

On 10月25日, 午後6:50, Masashi Imano <masashi.im...@gmail.com> wrote:
> 今野です。
>
> > 上記方法で改良ソルバをwmakeしてみましたが,以下のようなエラーが出てしまいました.
>
> 試していなかったもので、すみません間違ってました。
>
> createFields.H に以下を加えてください。
>
> surfaceScalarField shf
> (
> IOobject
> (
> "shf",
> runTime.timeName(),
> mesh,
> IOobject::NO_READ,
> IOobject::AUTO_WRITE
> ),
> -fvc::interpolate(DT*C)*fvc::snGrad(T)
> );
>
> また、 laplacianFoamExperiment_steady.C の
>
> hf = - DT*C*gradT;
>
> の後に、
>
> shf = -fvc::interpolate(DT*C)*fvc::snGrad(T);
>
> を加えて、反復毎にshfを計算する必要もありました。
> 修正版を添付します。
>
> ちなみに自分は、壁面での流体の熱流束を求める以下のユーティリティ
> のソースを参考にして、このような修正を行ないました。
>
> applications/utilities/postProcessing/wall/wallHeatFlux
>
> 2011/10/25 mou <koni...@yahoo.co.jp>:
> ...
>
> もっと読む ≫
>
> mou-20111025.tar.gz
> 13K表示ダウンロード
Reply all
Reply to author
Forward
0 new messages