Skip to content
  • 最新
  • 版块
  • 东岳流体
  • 随机看[请狂点我]
皮肤
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • 默认(不使用皮肤)
  • 不使用皮肤
折叠
CFD中文网

CFD中文网

  1. CFD中文网
  2. OpenFOAM
  3. 基于hPolynomial热物理模型实现Cp多段多项式拟合过程中遇到的问题

基于hPolynomial热物理模型实现Cp多段多项式拟合过程中遇到的问题

已定时 已固定 已锁定 已移动 OpenFOAM
13 帖子 7 发布者 15.1k 浏览
  • 从旧到新
  • 从新到旧
  • 最多赞同
回复
  • 在新帖中回复
登录后回复
此主题已被删除。只有拥有主题管理权限的用户可以查看。
  • 深 离线
    深 离线
    深白色
    在 中回复了 李东岳 最后由 编辑
    #4

    @李东岳 非常感谢!不过我试验拟合的这两段还在蓝色线区域,并没有到峰值,应该不存在极大值的情况。难道是拟合的这两段交界处?这个应该也没问题啊,因为我是100<=T<150,150<=T<=180。 @xpqiu 说有可能是拟合的两段连接处不连续导致,这个目前感觉貌似不太可能,因为janaf是两段拟合,它的求解和hPolynomial有点类似,不过它有High and Low temperature enthalpy offset a5,High and Low temperature entropy offset a6,这两个常数我不知道怎么确定的。

    1 条回复 最后回复
  • 深 离线
    深 离线
    深白色
    在 中回复了 random_ran 最后由 编辑
    #5

    @random_ran 多谢。目前试验的拟合还在180K以内,所以还没涉及到Cp梯度大的情况。

    1 条回复 最后回复
  • X 在线
    X 在线
    xpqiu 超神
    写于 最后由 xpqiu 编辑
    #6

    我最初看错了范围,我以为你的曲线里包含了200K附近的那个间断点,所以才会说是牛顿法不适合。现在发现你的温度范围是100-180K,这一段就不包含间断点了,所以牛顿法应该没问题。
    从你上面提供的调试信息,我认为主要问题在于,当T < 100K 和 T > 180K 时,你的cp函数将无定义,return 值是无定义的。你看出现开始发散的地方:

    Test=100.516 Tnew=99.569 F=-1.34695e+06 f=-1.35014e+06 Cp=3365.81
    Test=99.569 Tnew=-144277 F=9.35162 f=-1.35014e+06 Cp=9.35162
    

    Tnew = 99.569 K ,小于100,此时,下一步得到的 Tnew就完全错了。我认为就是因为 99.569K对于的cp函数返回值无定义,程序不知道给你返回什么。

    所以,我认为你程序里必须给出 T < 100 和 T > 180 时 cp 的定义。

    另外,还有一个问题是,理论上如果能量值在正常范围内,应该牛顿法迭代得到的温度值不会小于100k,我相信你也是这么认为的。但是,据我的理解,那个迭代的函数里面,参数 f 对应的应该是能量(焓或者内能)。从你输出的信息来看,你的 f 的值似乎一直都是负数,这应该是不对的。所以,可能你的算例设置也有点问题。

    以上仅供参考,欢迎讨论。

    1 条回复 最后回复
  • 深 离线
    深 离线
    深白色
    写于 最后由 编辑
    #7

    "Tnew = 99.569 K ,小于100,此时,下一步得到的 Tnew就完全错了。我认为就是因为 99.569K对于的cp函数返回值无定义,程序不知道给你返回什么。
    所以,我认为你程序里必须给出 T < 100 和 T > 180 时 cp 的定义。"
    ——————————————————————————————
    这个我有点疑问,我的初始值在130K或者更高,壁面加热在170K左右,算出来的温度怎么会低于100K,而且当我限定了cp 在 T < 100 和 T > 180 时 的情况,比如T < 100令T=100,T > 180 令T=180,结果用不了几步还是发散。

    “还有一个问题是,理论上如果能量值在正常范围内,应该牛顿法迭代得到的温度值不会小于100k,我相信你也是这么认为的。但是,据我的理解,那个迭代的函数里面,参数 f 对应的应该是能量(焓或者内能)。从你输出的信息来看,你的 f 的值似乎一直都是负数,这应该是不对的。”
    ———————————————————————————————
    这个跟hPolynomial本身焓的设定有关系,他有一个参考值(偏移量):

    hCoeffs_[0] += Hf_ - hCoeffs_.value(Tstd_);
    
    template<int PolySize>
    Foam::scalar Foam::Polynomial<PolySize>::value(const scalar x) const
    {
        scalar val = this->v_[0];
    
        // avoid costly pow() in calculation
        scalar powX = 1;
        for (label i=1; i<PolySize; ++i)
        {
            powX *= x;
            val += this->v_[i]*powX;
        }
    
        if (logActive_)
        {
            val += logCoeff_*log(x);
        }
    
        return val;
    }
    

    理论上应该没问题,如果有问题那么在100~150K或150~180K也应当有问题。

    1 条回复 最后回复
  • 深 离线
    深 离线
    深白色
    写于 最后由 编辑
    #8

    有了点新发现,当在hPolynomialThermoI.H(src/thermophysicalModels/specie/thermo/hPolynomial/)的ha()函数中添加如下内容,能正常求解:

    template<class EquationOfState, int PolySize>
    inline Foam::scalar Foam::hPolynomialThermo<EquationOfState, PolySize>::ha
    (
        const scalar p, const scalar T
    ) const
    {
        if ( T >= 100 && T < 150){
        return hCoeffs_.value(T);
        }
        else {
                return hCoeffs_.value(T);
            }
    }
    

    但是如果改为下面这种就求解不了(当然Cp也是跟着改的):

    template<class EquationOfState, int PolySize>
    inline Foam::scalar Foam::hPolynomialThermo<EquationOfState, PolySize>::ha
    (
        const scalar p, const scalar T
    ) const
    {
        if ( T >= 100 && T < 150){
        return hCoeffs_.value(T);
        }
        else {
            if ( T >= 150 && T < 180 ){
                return hCoeffs1_.value(T);(实际上这里改为其他的比如多项式,查表之类的都一样)
            }
            else {
                return hCoeffs_.value(T);
            }
        }
    }
    
    template<class EquationOfState, int PolySize>
    inline Foam::scalar Foam::hPolynomialThermo<EquationOfState, PolySize>::cp
    (
        const scalar p, const scalar T
    ) const
    {
    //    return CpCoeffs_.value(T);
        if ( T >= 100 && T < 150){
        return CpCoeffs_.value(T);
        }
        else {
            if ( T >= 150 && T < 180 ){
                return CpCoeffs1_.value(T);
            }
            else {
                return CpCoeffs_.value(T);
            }
        }
    }
    

    感觉问题是由这里引起的。

    1 条回复 最后回复
  • 深 离线
    深 离线
    深白色
    写于 最后由 编辑
    #9

    @李东岳 @xpqiu
    我想我可能找到原因了:因为单段拟合时,Cp系数组成的多项式计算的Cp连续(Cp连续),进而由Cp系数算出的焓he的系数组成的多项式算出的焓he连续(焓值连续)。而当多段拟合时,由于各段Cp系数不一致导致算出的焓值he与其它多项式的焓值不连续,导致出现焓值跳跃点(焓值间断)。在焓值间断点算出的(h1-h0)异常而导致温度异常,最终发散。
    对于这种情况是否还有其他出路?求教!:crying:

    CpCoeffs1_ *= this->W();
    hCoeffs_ = CpCoeffs_.integral();
    hCoeffs_[0] += Hf_ - hCoeffs_.value(Tstd_);
    return hCoeffs_.value(T);
    
    template<int PolySize>
    Foam::scalar Foam::Polynomial<PolySize>::value(const scalar x) const
    {
        scalar val = this->v_[0];
    
        // avoid costly pow() in calculation
        scalar powX = 1;
        for (label i=1; i<PolySize; ++i)
        {
            powX *= x;
            val += this->v_[i]*powX;
        }
    
        if (logActive_)
        {
            val += logCoeff_*log(x);
        }
    
        return val;
    }
    
    template<int PolySize>
    typename Foam::Polynomial<PolySize>::intPolyType
    Foam::Polynomial<PolySize>::integral(const scalar intConstant) const
    {
        intPolyType newCoeffs;
    
        newCoeffs[0] = intConstant;
        forAll(*this, i)
        {
            newCoeffs[i+1] = this->v_[i]/(i + 1);
        }
    
        return newCoeffs;
    }
    
    程 1 条回复 最后回复
  • 程 离线
    程 离线
    程迪
    在 中回复了 深白色 最后由 编辑
    #10

    @深白色
    h间断,newton法可能会来回迭代。

    还有,你那个临界点附近的cp曲线看着像Runge函数,这玩意儿用多项式拟合本来就不合适,参考
    替代文字

    已婚,勿扰。
    本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。

    深 1 条回复 最后回复
  • 深 离线
    深 离线
    深白色
    在 中回复了 程迪 最后由 编辑
    #11

    @程迪 多谢指教。焓值不连续可以通过光顺进行处理。这个问题本身研究的就是分多段多项式来解决Runge现象。

    T 1 条回复 最后回复
  • T 离线
    T 离线
    TangShangyu
    在 中回复了 深白色 最后由 编辑
    #12

    @深白色 您好,打扰您了,请问highcpcoeffs、lowcpcoeffs具体的取值是怎么取的呢?对此非常困惑,不知道这里面的七个系数是从哪里得来的?

    1 条回复 最后回复
  • 鲸 离线
    鲸 离线
    鲸落
    写于 最后由 编辑
    #13

    老师们好,关于janaf我发现教程里的算例中对于同一气体它的a1到a7的值取得不一样(hotBoxes和simplifiedSiwek),如果都是查表得出的数据的话那为什么不一样,是因为不同的压力温度下需要查不同的表吗?还是表一直在不断更新?希望老师们能指点迷津,非常感谢!

    1 条回复 最后回复

  • 登录

  • 登录或注册以进行搜索。
  • 第一个帖子
    最后一个帖子
0
  • 最新
  • 版块
  • 东岳流体
  • 随机看[请狂点我]