Openfoam中求解努塞尔数和fluent的结果相差较大,求各位大佬答疑解惑。
-
模型采用的是矩形槽道,求解器采用的是PimpleFoam。并采用如下方式添加了温度场:https://zhuanlan.zhihu.com/p/485714816
根据李老师写的求解努塞尔数的小代码,并对其进行改进,实现了实时输出,修改后的代码如下:coded { libs ( "libutilityFunctionObjects.so" ); enabled true; type coded; name printMinU; executeControl timeStep; executeInterval 200; writeControl timeStep; writeInterval 200; codeOptions #{ -I$(LIB_SRC)/meshTools/lnInclude #}; codeExecute #{ const volScalarField& T ( mesh().lookupObject<volScalarField>("T") ); const fvPatchList& patches = mesh().boundary(); std::ofstream file; file.open ("nus", std::ofstream::out | std::ofstream::app); forAll(patches, patchi) { const fvPatch& currPatch = patches[patchi]; if (currPatch.name() == "bottomWall") { fvPatchScalarField nus = T.boundaryField()[patchi]; scalar L = 0.1; scalar Timp = 343; const volScalarField& T = mesh().lookupObject<volScalarField>("T"); scalarField Tinternal = T.internalField(); scalar sumT = gSum(Tinternal * mesh().V()); scalar V = gSum(mesh().V()); scalar avgT = sumT / V; nus = T.boundaryField()[patchi].snGrad()*L/(Timp - avgT); //nus2file << "Time: " << mesh().time().timeName() << " " << nus << nl; forAll(T.boundaryField()[patchi], facei) { //Pout << mesh().C().boundaryField()[patchi][facei].x()/0.1 // << " " << nus[facei] << nl; file << "Time: " << mesh().time().timeName() << " " << mesh().C().boundaryField()[patchi][facei].x() << " " << mesh().C().boundaryField()[patchi][facei].z() << " " << nus[facei] << std::endl; } } } file.close(); #}; }
其中计算努塞尔数时,之前采用的参考温度和fluent中的温度是一样的,都是采用的300,但是求解出的努塞尔数差距过大,后来将参考温度改成实时体积平均温度,努塞尔数变大不少,但是和fluent计算得出的还是相差不少。在百度上我看有人说fluent中的努塞尔数是导出热通量以后计算的努塞尔数,而不是用采用的温度梯度。温度梯度这种计算方式与第一层网格的高度关系很大。不知道有没有大佬计算过这种问题,求解。
-
这部分fluent壁面传热计算有一些独有的未公开技术,它的壁面处理与OpenFOAM差异还是蛮大的,可以去看看相关手册,尤其是SA和SST模型的壁面处理
-
我觉得你需要使用传热求解器,而不是把温度当做一个变量来处理。
也可以参考这个帖子 http://dyfluid.com/openfoam.html#id12
-
@李东岳 谢谢李老师,也谢谢楼上几位。目前找到一些问题所在了。在fluent中进出口的温度不是周期性的而流场是,每个周期都会重置入口温度(之前用fluent的人不清楚),所以这一点是我们自己的问题所在。另外还有一个问题就是在计算之前fluent进行初始化为300K,但是计算一段时间后会发现有小于300K的,这个问题就不知道是什么原因了。目前计划是对温度场T+、y+了。和实验的验证结果如下图所示,个人感觉能凑合用吧。
-
@2019201300 在 Openfoam中求解努塞尔数和fluent的结果相差较大,求各位大佬答疑解惑。 中说:
模型采用的是矩形槽道,求解器采用的是PimpleFoam。并采用如下方式添加了温度场:https://zhuanlan.zhihu.com/p/485714816
根据李老师写的求解努塞尔数的小代码,并对其进行改进,实现了实时输出,修改后的代码如下:coded { libs ( "libutilityFunctionObjects.so" ); enabled true; type coded; name printMinU; executeControl timeStep; executeInterval 200; writeControl timeStep; writeInterval 200; codeOptions #{ -I$(LIB_SRC)/meshTools/lnInclude #}; codeExecute #{ const volScalarField& T ( mesh().lookupObject<volScalarField>("T") ); const fvPatchList& patches = mesh().boundary(); std::ofstream file; file.open ("nus", std::ofstream::out | std::ofstream::app); forAll(patches, patchi) { const fvPatch& currPatch = patches[patchi]; if (currPatch.name() == "bottomWall") { fvPatchScalarField nus = T.boundaryField()[patchi]; scalar L = 0.1; scalar Timp = 343; const volScalarField& T = mesh().lookupObject<volScalarField>("T"); scalarField Tinternal = T.internalField(); scalar sumT = gSum(Tinternal * mesh().V()); scalar V = gSum(mesh().V()); scalar avgT = sumT / V; nus = T.boundaryField()[patchi].snGrad()*L/(Timp - avgT); //nus2file << "Time: " << mesh().time().timeName() << " " << nus << nl; forAll(T.boundaryField()[patchi], facei) { //Pout << mesh().C().boundaryField()[patchi][facei].x()/0.1 // << " " << nus[facei] << nl; file << "Time: " << mesh().time().timeName() << " " << mesh().C().boundaryField()[patchi][facei].x() << " " << mesh().C().boundaryField()[patchi][facei].z() << " " << nus[facei] << std::endl; } } } file.close(); #}; }
其中计算努塞尔数时,之前采用的参考温度和fluent中的温度是一样的,都是采用的300,但是求解出的努塞尔数差距过大,后来将参考温度改成实时体积平均温度,努塞尔数变大不少,但是和fluent计算得出的还是相差不少。在百度上我看有人说fluent中的努塞尔数是导出热通量以后计算的努塞尔数,而不是用采用的温度梯度。温度梯度这种计算方式与第一层网格的高度关系很大。不知道有没有大佬计算过这种问题,求解。
您好,请问Nu数这个代码直接加载controldict文件后面就行了吗,不需要再加其他的了
-
@东方白杨 我是这样干的。
2/6