@upc_ngh 有一个更简单的方法,我最近发现的,你索引的时候不要用
···lookupObject···
用
···lookupObjectRef···
用这个函数查找的结果可以直接修改并传值回去
@upc_ngh 有一个更简单的方法,我最近发现的,你索引的时候不要用
···lookupObject···
用
···lookupObjectRef···
用这个函数查找的结果可以直接修改并传值回去
@李东岳 谢谢李老师的回复,这个问题我最后发现是一个很简单的错误导致的。因为decompsePar没有把边界场进行拆分 ,导致各个处理器文件夹下的场定义缺失所以发生了错误
为了实现一些特殊需求,所以需要两个边界相互交互。但是修改后的边界条件仅在串行条件下可以运行。
下述代码为例:
//~in patch
label patchi = this->patch().boundaryMesh().findPatchID(patchName_);
const volScalarField& paraGet = this->db().objectRegistry::lookupObject<volScalarField>("paraA");//这一步可以正常运行
const scalarField& para = paraGet.boundaryField()[patchi];//这一步OK
Info << para << endl;//这一步在并行条件下会报错,也就是引用的对象在使用的时候会报错
在此基础上,我修改了代码,发现如果不是引用,直接取值,也会报错,因此可以断定是取边界值的函数在并行条件下有问题。
报错代码
//~in patch
label patchi = this->patch().boundaryMesh().findPatchID(patchName_);
const volScalarField& paraGet = this->db().objectRegistry::lookupObject<volScalarField>("paraA");//这一步可以正常运行
const scalarField para = paraGet.boundaryField()[patchi];////这一步在并行条件下会报错
最后,也尝试过从网格转移获取边界值,但是并行时也会在取值时报错。
//~in patch
label patchi = this->patch().boundaryMesh().findPatchID(patchName_);
const volScalarField& paraGet = this->db().objectRegistry::lookupObject<volScalarField>("paraA");//这一步可以正常运行
const fvMesh& mesh = patch().boundaryMesh().mesh();//正常运行
const fvPatchField<scalar>& para = mesh.boundary()[patchi].lookupPatchField<volScalarField, scalar>("paraA");//这一步可以正常运行
Info << para << endl;//这一步在并行条件下会报错,也就是引用的对象在使用的时候会报错
所以想向各位老师和同僚请教下怎么处理这种问题
一般而言,组分方程中的拉普拉斯项,其广义扩散系数为D,即一种流体在另外一种流体中的扩散系数。然而,在OpenFOAM中的组分方程中,没有一个使用的是D,均使用的是alpha(热扩散系数)和mu(粘度,或者叫动量扩散系数)。
源代码中:
在chtMultiRegionFoam的组分方程中
fvScalarMatrix YiEqn
(
fvm::ddt(rho, Yi)
+ mvConvection->fvmDiv(phi, Yi)
- fvm::laplacian(turbulence.muEff(), Yi)//注意,这里调用了粘度
==
reaction.R(Yi)
+ fvOptions(rho, Yi)
);
在fireFoam的组分方程中
fvScalarMatrix YiEqn
(
fvm::ddt(rho, Yi)
+ mvConvection->fvmDiv(phi, Yi)
- fvm::laplacian(turbulence->alphaEff(), Yi)//注意,此处为热扩散系数
==
parcels.SYi(i, Yi)
+ surfaceFilm.Srho(i)
+ combustion->R(Yi)
+ fvOptions(rho, Yi)
);
那么,为什么好像从来没有人提到或者询问这个问题(甚至可以说是很根本的问题),还是说我对代码的理解有误。望各位老师和同僚赐教
@upc_ngh 从const转换到非const是怎么做的 ,我现在只能通过mesh.lookupObject<volScalarField>获得场值。
@upc_ngh 您好,我刚好最近也遇到这个问题,想要把src文件夹下的值传递到application中,请问您具体是怎么实现和解决的呢,望赐教,感激不尽
@bestucan 谢谢老师的回复,我这里关于第③点的说法可能不太准确。我只输入rho时(也就是Air源项为0),此时Air的质量是增加的,且水蒸气的总体质量也在变小,但是总体的质量分数是守恒为1的 所以还是比较奇怪吧,他这里怎么处理的代码我还没找到,好难挖,OpenFOAM这种嵌套