怎么对标量场进行体积积分求总量
-
两种方法,一个是在代码里加入一些操作,然后输出得到的量。另一个是使用functionObject后处理。
第一种方法:
使用举例
scalar sumHRRate = gSum(chemistry.dQ()());//总放热率等于每个网格放热率之和,这里的dQ单位是J/s totalHeatRR_ = fvc::domainIntegrate(chemistryQdot_); dimensionedScalar totalMass = fvc::domainIntegrate(rho);//总质量等于密度乘以网格体积,然后求和。 p.weightedAverage(mesh.V()).value() //就是缸内压力的平均值
gSum的功能是全场求和。
domainIntegrate 的功能是对某个物理量,乘以其网格体积,然后对所有网格求和。domainIntegrate(df) = gSum(fvc::volumeIntegrate(df))//df是被操作的场。
volumeIntegrate 的功能是对每个网格的某个物理量,乘以其网格体积,然后形成一个新的场。volumeIntegrate(df)=df.mesh().V()*df.field()//df是被操作的场
加权平均 weightedAverage:p.weightedAverage(weightField) = gSum(weightField*p)/gSum(weightField)
//这里的p是被操作的场,操作之后,dimension信息仍在。第二种方法:
在 controlDict 中加入:
functions { my_name { type volFieldValue; functionObjectLibs ("libfieldFunctionObjects.so"); fields (Qdot); writeFields no; operation volIntegrate; } }
然后在solver运行时,就会自动在case目录下生成postProcessing信息。
或者运行完之后,也可以用过运行OF自带的后处理工具postProcess:postProcess -fields '(Qdot)'
我这里的Qdot单位是[kg/m/s3],体积分之后的单位是J/s。区别
上述两个方法使用上的不同之处在于functionObject可以方便地对某个特定的Zone进行操作。加入这两个关键词:regionType和name。
functionObject 中针对 volFieldValue 一共有以下这些操作:none | No operation sum | Sum weightedSum | Weighted sum sumMag | Sum of component magnitudes average | Ensemble average weightedAverage | Weighted average volAverage | Volume weighted average weightedVolAverage | Weighted volume average volIntegrate | Volume integral weightedVolIntegrate | Weighted volume integral min | Minimum max | Maximum CoV | Coefficient of variation: standard deviation/mean