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. OF5版本以后重心坐标与绝对坐标的相互转换的问题。

OF5版本以后重心坐标与绝对坐标的相互转换的问题。

已定时 已固定 已锁定 已移动 OpenFOAM
9 帖子 3 发布者 7.4k 浏览
  • 从旧到新
  • 从新到旧
  • 最多赞同
回复
  • 在新帖中回复
登录后回复
此主题已被删除。只有拥有主题管理权限的用户可以查看。
  • 上 离线
    上 离线
    上级
    写于2020年9月10日 09:18 最后由 上级 编辑 2020年9月10日 17:21
    #1

    最近在研读OpenFOAM中particle类的barycentric coordinates 和global coordinates转换矩阵的程序,遇到一点问题,现总结出来和大家讨论一下。
    OF5.0以后对颗粒追踪采用了barycentric方法,目的是更好的捕捉颗粒轨迹与tetrahedra网格面的交点,四面体内任意一点p的global coordinates 可以表示为barycentric coordinates (λi)与顶点的乘积和:
    (1)p=∑i=14λivi
    其中vi是四面体顶点坐标。
    示意图如下:
    1.JPG
    如上图,四面体中有一点p,则p点的重心坐标(λ1,λ2,λ3,λ4)的计算方法为点p将四面体分成的四个小四面体与大四面体的体积之比:
    (2)λ1=VpbcdVabcd=1−λ2−λ3−λ4,
    (3)λ2=VpacdVabcd=6Vpacd6Vabcd=ap⋅(ac×ad)ab⋅(ac×ad);,
    ,,(4)λ3=VpabdVabcd=6Vpabd6Vabcd=ap⋅(ad×ab)ab⋅(ac×ad),
    ,,(5)λ4=VpabcVabcd=6Vpabc6Vabcd=ap⋅(ab×ac)ab⋅(ac×ad),
    其中 Vpbcd, Vpacd, Vpabd, 和 Vpabc 是小四面体的体积, ap=p−a, ab=b−a, ac=c−a, ad=d−a.
    定义从barycentric coordinates到global coordinates的转换矩阵A,则
    (6)p=Aλ(p)→[xpypzp]=[xaxbxcxdyaybycydzazbzczd][λ1λ2λ3λ4];.
    其中λi就是p的重心坐标,矩阵A就是由四面体各个顶点的global coordinates组成的坐标矩阵。
    既然有了正向变换,同样需要逆向变换,定义一个逆向变换矩阵T=[bd×bcac×adad×abab×ac]将global coordinates转换为barycentric coordinates:
    (7)λ=ap⋅TdetA=[ap⋅(bd×bc)ap⋅(ac×ad)ap⋅(ad×ab)ap⋅(ab×ac)]ab⋅(ac×ad),
    公式(7)的四个组成成分其实就是上面的公式(2),(3),(4),(5)。detA是矩阵A的行列式,表示为ab⋅(ac×ad)。
    至此,barycentric coordinates与global coordinates的正向变换和逆向变化都已经定义完成了,上面的分析是基于我看OF6的代码以及查阅相关的文献总结出来的。
    但是有一个问题困扰了我很久了:zoule: ,那就是逆向变换矩阵的第一个元素是:
    (8)λ1=ap⋅(bd×bc)ab⋅(ac×ad),
    这个和公式(2)的定义不同,因为分子上算的不是图中小四面体pbcd的体积,就这儿我无法理解为什么OF里要这么定义,并且我看OF5-OF8里面都是这么定义的,我觉得有点问题,所有发出来和大家讨论一下,我觉得我自己是解决不了这个问题了:141:

    1 条回复 最后回复
  • 李 在线
    李 在线
    李东岳 管理员
    写于2020年9月10日 23:26 最后由 编辑
    #2

    简直是大作!!我一直在想研究下这方面工作没倒出空来。我先留言学习一下,在讨论

    感谢分享!!!!!!!:146: :146: :146:

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

    1 条回复 最后回复
  • 李 在线
    李 在线
    李东岳 管理员
    写于2020年9月11日 01:12 最后由 李东岳 编辑 2020年9月11日 09:30
    #3

    首先跟随你的思想:按照理论,应该是:
    (9)λ=ap⋅TdetA=[bp⋅(bd×bc)ap⋅(ac×ad)ap⋅(ad×ab)ap⋅(ab×ac)]ab⋅(ac×ad),
    同时
    (10)bp≠ap
    所以代码跟理论对不上?

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

    上 1 条回复 最后回复 2020年9月11日 12:09
  • 上 离线
    上 离线
    上级
    在 2020年9月11日 12:09 中回复了 李东岳 最后由 编辑
    #4

    @东岳 是的李老师,我的疑惑就在这儿,bp≠ap,和代码对不上,细读代码发现不一样。

    1 条回复 最后回复
  • 李 在线
    李 在线
    李东岳 管理员
    写于2020年9月21日 01:40 最后由 编辑
    #5

    问题解决了么?

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

    1 条回复 最后回复
  • 上 离线
    上 离线
    上级
    写于2020年9月22日 01:36 最后由 编辑
    #6

    仔细读了代码,现在还剩最后一点小问题,其实说到底还是原来的问题,barycentric追踪是通过bary displacement元素的正负来判断颗粒运动轨迹与四面体网格面的交点的,例如这个图形
    捕获.JPG
    颗粒p运动到n,轨迹pn与面bcd_相交于点s,那么矢量pn的barycentric displacement的计算方法为:
    (11)λp→n=λ(n)−λ(p)=an⋅TdetA−ap⋅TdetA=pn⋅TdetA =[pn⋅(bd×bc)pn⋅(ac×ad)pn⋅(ad×ab)pn⋅(ab×ac)]ab⋅(ac×ad);.
    此时barycentric dispalcement的符号为(-,+++),可以判断轨迹与面bcd_相交,同根根据p和n的barycentric coordinates可以求出点s的barycentric coordinates,再转换为点的的s的gobal coordinates,然后进如下一个四面体网格追踪。
    上面我只是简述了颗粒在一个四面体网格内的追踪过程,从计算barycentric dispalcement的角度来看,逆向变换矩阵T是没有问题的,但是问题还是在于从barycentric coordinates to global coordinates的过程,矩阵T的第一个元素有问题。如果把???变为λ1=1−λ2−λ3−λ4就好了,但是程序里没有这么写,说到底还是原来的问题:jingya: 如果李老师有时间的话可不可以读一下particle类,我觉得您可以帮我释疑:xinxin:

    上 1 条回复 最后回复 2020年9月22日 01:38
  • 上 离线
    上 离线
    上级
    在 2020年9月22日 01:38 中回复了 上级 最后由 编辑
    #7

    上面那个公式引用是公式(8)

    1 条回复 最后回复
  • B 离线
    B 离线
    BlookCFD
    写于2020年9月23日 14:22 最后由 编辑
    #8

    (7)这个公式确实是错的,但是particle里面都用的是(11)这个公式,用来计算“位移”的barycentric坐标,而不是点的barycentric坐标,OpenFOAM/meshes/primitiveShapes/tetrahedron/tetrahedronI.H有计算点的barycentric坐标,你可以比较下。

    上 1 条回复 最后回复 2020年9月24日 01:49
  • 上 离线
    上 离线
    上级
    在 2020年9月24日 01:49 中回复了 BlookCFD 最后由 编辑
    #9

    @BlookCFD 谢谢您的指点,我有看了一眼程序,我理解错了,OF里面是通过计算barycentric displacement来获得barycentric coordinates的,我一直被src/lagrangian/basic/particle/particle.C里面的一句代码给误导了,现贴出来:

    particle.C 1062-1096 OpenFOAM6
    void Foam::particle::correctAfterInteractionListReferral(const label celli)
    {
    // Get the position from the barycentric data
    const vector pos(coordinates_.b(), coordinates_.c(), coordinates_.d());
    // Create some arbitrary topology for the supplied cell
    celli_ = celli;
    tetFacei_ = mesh_.cells()[celli_][0];
    tetPti_ = 1;
    facei_ = -1;
    // Get the reverse transform and directly set the coordinates from the
    // position. This isn't likely to be correct; the particle is probably not
    // in this tet. It will, however, generate the correct vector when the
    // position method is called. A referred particle should never be tracked,
    // so this approximate topology is good enough. By using the nearby cell we
    // minimize the error associated with the incorrect topology.
    coordinates_ = barycentric(1, 0, 0, 0);
    if (mesh_.moving())
    {
    Pair<vector> centre;
    FixedList<scalar, 4> detA;
    FixedList<barycentricTensor, 3> T;
    movingTetReverseTransform(0, centre, detA, T);
    coordinates_ += (pos - centre[0]) & T[0]/detA[0];
    }
    else
    {
    vector centre;
    scalar detA;
    barycentricTensor T;
    stationaryTetReverseTransform(centre, detA, T);
    coordinates_ += (pos - centre) & T/detA;
    }
    }

    其中的这句代码

    coordinates_ += (pos - centre) & T/detA;
    

    其实前面已经先定义了

    coordinates_ = barycentric(1, 0, 0, 0);
    

    后面计算单点的barycentric coordinates其实还是用的barycentric displacement的概念来转换的。

    困扰了我两周的问题终于解决了,现在异常开心,在此对@东岳 和@BlookCFD 表示万分感谢。

    1 条回复 最后回复
2020年9月10日 09:18

5/9

2020年9月21日 01:40

未读 4
2020年9月24日 01:49
  • 登录

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