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. 如何在src文件中创建标量物理filed并且调用

如何在src文件中创建标量物理filed并且调用

已定时 已固定 已锁定 已移动 OpenFOAM
27 帖子 3 发布者 17.1k 浏览
  • 从旧到新
  • 从新到旧
  • 最多赞同
回复
  • 在新帖中回复
登录后回复
此主题已被删除。只有拥有主题管理权限的用户可以查看。
  • chengan.wangC 离线
    chengan.wangC 离线
    chengan.wang
    写于 最后由 编辑
    #1

    大家好,请教一个问题:
    我知道如何在求解器中的createFields.H建立field,

        volScalarField summass
        (
            IOobject
            (
                "summass",
                runTime.timeName(),
                mesh,
                IOobject::NO_READ,
                IOobject::AUTO_WRITE
            ),
            mesh,
            dimensionedScalar ("zero", dimMass, 0.0)
        );
    

    我想进一步在src文件中创建标量物理filed并且调用,比如ParticleCollector.H,ParticleCollector.C等库文件?

    谢谢大家。

    1 条回复 最后回复
  • 李东岳李 离线
    李东岳李 离线
    李东岳 管理员
    写于 最后由 编辑
    #2

    @chengan-wang 在 如何在src文件中创建标量物理filed并且调用 中说:

    src文件中创建标量物理filed并且调用,比如ParticleCollector.H,ParticleCollector.C等库文件?

    为什么要必须在src文件中,openfoam的src文件?

    http://dyfluid.com/index.html
    需要帮助debug算例的看这个 https://cfd-china.com/topic/8018

    chengan.wangC 1 条回复 最后回复
  • chengan.wangC 离线
    chengan.wangC 离线
    chengan.wang
    在 中回复了 李东岳 最后由 chengan.wang 编辑
    #3

    @李东岳 感谢李老师回复。
    我先在求解器中的createFields.H建立过这个field:Euler-Lagrange的一些解析,sprayFoam

    之后在ParticleCollector.C文件添加了

    cellI = p.cell();
    scalar& PPC = summass_->primitiveFieldRef() [cellI];
    PPC += p.nParticle()*p.mass();
    

    但我编译时候出现错误,找不到summass

    所以我猜应该是把这个field建立到ParticleCollector.H,ParticleCollector.C等文件中吧?!瞎猜的。

    李老师能指点一下吗?

    李东岳李 1 条回复 最后回复
  • 李东岳李 离线
    李东岳李 离线
    李东岳 管理员
    在 中回复了 chengan.wang 最后由 编辑
    #4

    @chengan-wang 你在库文件里面要使用求解器层面的volScalarField是调用不起来的。你可以试一下用这个:

    const volScalarField& summass = p.mesh().lookupObject<volScalarField>("summass");
    
    scalar& PPC = summass.primitiveFieldRef() [cellI];
    
    

    http://dyfluid.com/index.html
    需要帮助debug算例的看这个 https://cfd-china.com/topic/8018

    chengan.wangC 1 条回复 最后回复
  • chengan.wangC 离线
    chengan.wangC 离线
    chengan.wang
    在 中回复了 李东岳 最后由 编辑
    #5

    @李东岳 谢谢李老师帮忙!
    我我的是2.4.0版本,这样写的:

            const volScalarField& summass = p.mesh().lookupObject<volScalarField>("summass");
            const label cellIp = p.cell(); 
            scalar& PPC = summass.primitiveFieldRef() [cellIp]; 
            PPC += p.nParticle()*p.mass();
    

    运行出现如下错误

    lnInclude/ParticleCollector.C: In member function ‘virtual void Foam::ParticleCollector<CloudType>::postMove(Foam::ParticleCollector<CloudType>::parcelType&, Foam::label, Foam::scalar, const point&, bool&)’:
    lnInclude/ParticleCollector.C:748:77: error: expected primary-expression before ‘>’ token
             const volScalarField& summass = p.mesh().lookupObject<volScalarField>("summass");
                                                                                 ^
    lnInclude/ParticleCollector.C:750:31: error: ‘const volScalarField {aka const class Foam::GeometricField<double, Foam::fvPatchField, Foam::volMesh>}’ has no member named ‘primitiveFieldRef’
             scalar& PPC = summass.primitiveFieldRef() [cellIp]; 
                                   ^
    lnInclude/ParticleCollector.C: In member function ‘virtual void Foam::ParticleCollector<CloudType>::postMove(Foam::ParticleCollector<CloudType>::parcelType&, Foam::label, Foam::scalar, const point&, bool&)’:
    lnInclude/ParticleCollector.C:748:77: error: expected primary-expression before ‘>’ token
             const volScalarField& summass = p.mesh().lookupObject<volScalarField>("summass");
                                                                                 ^
    lnInclude/ParticleCollector.C:750:31: error: ‘const volScalarField {aka const class Foam::GeometricField<double, Foam::fvPatchField, Foam::volMesh>}’ has no member named ‘primitiveFieldRef’
             scalar& PPC = summass.primitiveFieldRef() [cellIp]; 
    

    不知道从哪里入手,麻烦李老师了

    1 条回复 最后回复
  • 李东岳李 离线
    李东岳李 离线
    李东岳 管理员
    写于 最后由 编辑
    #6

    @chengan-wang 在 如何在src文件中创建标量物理filed并且调用 中说:

    mesh().lookupObject<volScalarField>

    p.mesh().objectRegistry::lookupObject<volScalarField>("summass")
    这个可以么

    http://dyfluid.com/index.html
    需要帮助debug算例的看这个 https://cfd-china.com/topic/8018

    chengan.wangC 1 条回复 最后回复
  • chengan.wangC 离线
    chengan.wangC 离线
    chengan.wang
    在 中回复了 李东岳 最后由 编辑
    #7

    @李东岳 在 如何在src文件中创建标量物理filed并且调用 中说:

    p.mesh().objectRegistry::lookupObject<volScalarField>("summass")

    lnInclude/ParticleCollector.C: In member function ‘virtual void Foam::ParticleCollector<CloudType>::postMove(Foam::ParticleCollector<CloudType>::parcelType&, Foam::label, Foam::scalar, const point&, bool&)’:
    lnInclude/ParticleCollector.C:750:31: error: ‘const volScalarField {aka const class Foam::GeometricField<double, Foam::fvPatchField, Foam::volMesh>}’ has no member named ‘primitiveFieldRef’
             scalar& PPC = summass.primitiveFieldRef() [cellIp]; 
                                   ^
    lnInclude/ParticleCollector.C: In member function ‘virtual void Foam::ParticleCollector<CloudType>::postMove(Foam::ParticleCollector<CloudType>::parcelType&, Foam::label, Foam::scalar, const point&, bool&)’:
    lnInclude/ParticleCollector.C:750:31: error: ‘const volScalarField {aka const class Foam::GeometricField<double, Foam::fvPatchField, Foam::volMesh>}’ has no member named ‘primitiveFieldRef’
             scalar& PPC = summass.primitiveFieldRef() [cellIp]; 
    

    好像是没有 member named ‘primitiveFieldRef’,我用的是of2.4.0

    李东岳李 1 条回复 最后回复
  • 李东岳李 离线
    李东岳李 离线
    李东岳 管理员
    在 中回复了 chengan.wang 最后由 编辑
    #8

    scalar& PPC = summass.internalField() [cellIp]

    http://dyfluid.com/index.html
    需要帮助debug算例的看这个 https://cfd-china.com/topic/8018

    chengan.wangC 1 条回复 最后回复
  • chengan.wangC 离线
    chengan.wangC 离线
    chengan.wang
    在 中回复了 李东岳 最后由 编辑
    #9

    @李东岳 麻烦李老师了。

            const volScalarField& summass = p.mesh().objectRegistry::lookupObject<volScalarField>("summass");
            const label cellIp = p.cell(); 
            scalar& PPC = summass.internalField()[cellIp]; 
            PPC += p.nParticle()*p.mass();
    

    还是有错误如下

    lnInclude/ParticleCollector.C:750:53: error: binding ‘const double’ to reference of type ‘Foam::scalar& {aka double&}’ discards qualifiers
             scalar& PPC = summass.internalField()[cellIp]; 
    
    
    1 条回复 最后回复
  • 李东岳李 离线
    李东岳李 离线
    李东岳 管理员
    写于 最后由 编辑
    #10

    scalar& PPC = summass.internalFieldRef() [cellIp]

    http://dyfluid.com/index.html
    需要帮助debug算例的看这个 https://cfd-china.com/topic/8018

    chengan.wangC 1 条回复 最后回复
  • chengan.wangC 离线
    chengan.wangC 离线
    chengan.wang
    在 中回复了 李东岳 最后由 编辑
    #11

    @李东岳 李老师,又出现了之前的问题:

    lnInclude/ParticleCollector.C: In member function ‘virtual void Foam::ParticleCollector<CloudType>::postMove(Foam::ParticleCollector<CloudType>::parcelType&, Foam::label, Foam::scalar, const point&, bool&)’:
    lnInclude/ParticleCollector.C:750:31: error: ‘const volScalarField {aka const class Foam::GeometricField<double, Foam::fvPatchField, Foam::volMesh>}’ has no member named ‘internalFieldRef’
             scalar& PPC = summass.internalFieldRef() [cellIp]; 
                                   ^
    lnInclude/ParticleCollector.C: In member function ‘virtual void Foam::ParticleCollector<CloudType>::postMove(Foam::ParticleCollector<CloudType>::parcelType&, Foam::label, Foam::scalar, const point&, bool&)’:
    lnInclude/ParticleCollector.C:750:31: error: ‘const volScalarField {aka const class Foam::GeometricField<double, Foam::fvPatchField, Foam::volMesh>}’ has no member named ‘internalFieldRef’
             scalar& PPC = summass.internalFieldRef() [cellIp]; 
    

    我用grep查了一下,有些函数中用的是internalField()而查不到internalFieldRef(),但如果采用

    scalar& PPC = summass.internalField() [cellIp]
    

    错误如下

    lnInclude/ParticleCollector.C:750:53: error: binding ‘const double’ to reference of type ‘Foam::scalar& {aka double&}’ discards qualifiers
             scalar& PPC = summass.internalField()[cellIp]; 
    
    1 条回复 最后回复
  • 李东岳李 离线
    李东岳李 离线
    李东岳 管理员
    写于 最后由 编辑
    #12

    2.4版本太老了,我也忘了怎么用了,

    scalar PPC = summass.internalField() [cellIp]
    

    这个呢

    http://dyfluid.com/index.html
    需要帮助debug算例的看这个 https://cfd-china.com/topic/8018

    chengan.wangC 1 条回复 最后回复
  • chengan.wangC 离线
    chengan.wangC 离线
    chengan.wang
    在 中回复了 李东岳 最后由 编辑
    #13

    @李东岳 编译倒是能通过了,但是运行算例log文件显示错误

    [12] 
    [12] 
    [12] --> FOAM FATAL ERROR: 
    [12] 
        request for volScalarField summass from objectRegistry region0 failed
        available objects of type volScalarField are
    
    19
    (
    thermo:mu
    thermo:psi
    K
    h
    kappa
    air
    rho
    k
    Cp
    dpdt
    thermo:psi_0
    alphat
    dQ
    p
    T
    mut
    H2O
    epsilon
    thermo:alpha
    )
    [12] 
    [12] 
    [12]     From function objectRegistry::lookupObject<Type>(const word&) const
    [12]     in file /home/chengan/OpenFOAM/OpenFOAM-2.4.0/src/OpenFOAM/lnInclude/objectRegistryTemplates.C at line 198.
    [12] 
    
    1 条回复 最后回复
  • 李东岳李 离线
    李东岳李 离线
    李东岳 管理员
    写于 最后由 编辑
    #14

    应该是你summass这个代码还没创立的时候就寻找了。把这个代码提前几行

    http://dyfluid.com/index.html
    需要帮助debug算例的看这个 https://cfd-china.com/topic/8018

    chengan.wangC 1 条回复 最后回复
  • chengan.wangC 离线
    chengan.wangC 离线
    chengan.wang
    在 中回复了 李东岳 最后由 编辑
    #15

    @李东岳 我把

    const volScalarField& summass = p.mesh().objectRegistry::lookupObject<volScalarField>("summass");
    

    挪到程序前面了,还是同样的错误:135:

    1 条回复 最后回复
  • 李东岳李 离线
    李东岳李 离线
    李东岳 管理员
    写于 最后由 编辑
    #16

    @chengan-wang 在 如何在src文件中创建标量物理filed并且调用 中说:

    volScalarField summass
    (
    IOobject
    (
    "summass",
    runTime.timeName(),
    mesh,
    IOobject::NO_READ,
    IOobject::AUTO_WRITE
    ),
    mesh,
    dimensionedScalar ("zero", dimMass, 0.0)
    );

    把这个提前

    http://dyfluid.com/index.html
    需要帮助debug算例的看这个 https://cfd-china.com/topic/8018

    chengan.wangC 1 条回复 最后回复
  • chengan.wangC 离线
    chengan.wangC 离线
    chengan.wang
    在 中回复了 李东岳 最后由 编辑
    #17

    @李东岳 李老师,按照下列代码

            const label cellIp = p.cell(); 
            scalar PPC = summass.internalField() [cellIp]; 
            PPC += p.nParticle()*p.mass();
    

    编译通过了,也能算了,但是好像没有赋值进去,结果是0

    FoamFile
    {
        version     2.0;
        format      binary;
        class       volScalarField;
        location    "0.0002";
        object      summass;
    }
    // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
    
    dimensions      [1 0 0 0 0 0 0];
    
    internalField   uniform 0;
    
    boundaryField
    {
        walls
        {
            type            calculated;
            value           uniform 0;
        }
    }
    
    
    
    T 1 条回复 最后回复
  • T 离线
    T 离线
    Tens 神
    在 中回复了 chengan.wang 最后由 编辑
    #18

    @chengan-wang 在 如何在src文件中创建标量物理filed并且调用 中说:

        const label cellIp = p.cell(); 
        scalar PPC = summass.internalField() [cellIp]; 
        PPC += p.nParticle()*p.mass();
    

    这样只有PPC这个量在变,summass不跟着变。
    我感觉如果是在src库中进行调用和操作,还是应该在库中创建这个量

    chengan.wangC 1 条回复 最后回复
  • chengan.wangC 离线
    chengan.wangC 离线
    chengan.wang
    在 中回复了 Tens 最后由 编辑
    #19

    @tens 应该是这样的,感觉应该带个指针啥的

    1 条回复 最后回复
  • 李东岳李 离线
    李东岳李 离线
    李东岳 管理员
    写于 最后由 编辑
    #20

    scalar& PPC = summass.internalField().ref() [cellIp]

    http://dyfluid.com/index.html
    需要帮助debug算例的看这个 https://cfd-china.com/topic/8018

    chengan.wangC 1 条回复 最后回复

  • 登录

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