文章目录

  • getDynamics()会去哪?
    • 套娃一层
    • 套娃二层
    • 套娃三层
    • 套娃四层
  • 其他地方的computeEquilibrium

之前我提到过这个computeEquilibrium可以用来修改cell内部属性,
它的调用平平无奇

cell[iPop]=cell.getDynamics().computeEquilibrium(iPop, rhoBar, j, jSqr);

getDynamics()会去哪?

cell.getDynamics()后面可以接很多函数,而定义这些函数的地方为src/core/dynamics.h和.hh,这个源码值得单独开一篇博文介绍

套娃一层

h文件

   /// Compute equilibrium distribution functionvirtual T computeEquilibrium(plint iPop, T rhoBar, Array<T,Descriptor<T>::d> const& j,T jSqr, T thetaBar=T()) const =0;

hh文件

template<typename T, template<typename U> class Descriptor>
T CompositeDynamics<T,Descriptor>::computeEquilibrium (plint iPop, T rhoBar, Array<T,Descriptor<T>::d> const& j, T jSqr, T thetaBar) const
{return baseDynamics -> computeEquilibrium(iPop, rhoBar, j, jSqr, thetaBar);
}

可以看到其他的dynamics里,对于定义为NoDynamics和BounceBack等地方,它会返回T()。

template<typename T, template<typename U> class Descriptor>
T NoDynamics<T,Descriptor>::computeEquilibrium(plint iPop, T rhoBar, Array<T,Descriptor<T>::d> const& j,T jSqr, T thetaBar) const
{return T();
}
template<typename T, template<typename U> class Descriptor>
T BounceBack<T,Descriptor>::computeEquilibrium(plint iPop, T rhoBar, Array<T,Descriptor<T>::d> const& j,T jSqr, T thetaBar) const
{return T();
}

附近也有computeEquilibria

template<typename T, template<typename U> class Descriptor>
void Dynamics<T,Descriptor>::computeEquilibria (Array<T,Descriptor<T>::q>& fEq,  T rhoBar, Array<T,Descriptor<T>::d> const& j, T jSqr, T thetaBar ) const
{for (int iPop=0; iPop<Descriptor<T>::q; ++iPop) {fEq[iPop] = computeEquilibrium(iPop, rhoBar, j, jSqr, thetaBar);}
}
套娃二层

但现在仅仅停留在下面这行代码,我们仍未知道 computeEquilibrium的内部代码。

return baseDynamics -> computeEquilibrium(iPop, rhoBar, j, jSqr, thetaBar);

经过一番寻找,在src/basicDynamics/isoThermalDynamics.h和hh文件中,找到了如下:
以class BGKdynamics内的 computeEquilibrium为例,我们找到了如下代码:

template<typename T, template<typename U> class Descriptor>
T BGKdynamics<T,Descriptor>::computeEquilibrium(plint iPop, T rhoBar, Array<T,Descriptor<T>::d> const& j,T jSqr, T thetaBar) const
{T invRho = Descriptor<T>::invRho(rhoBar);return dynamicsTemplates<T,Descriptor>::bgk_ma2_equilibrium(iPop, rhoBar, invRho, j, jSqr);
}
套娃三层

接下来我们找一找bgk_ma2_equilibrium,让我们来看看位于src/latticeBoltzmann的dynamicTemplate.h
在struct dynamicsTemplates里面,显然它与Descriptor也有关

static T bgk_ma2_equilibrium(plint iPop, T rhoBar, T invRho, Array<T,Descriptor<T>::d> const& j, T jSqr) {return dynamicsTemplatesImpl<T,typename Descriptor<T>::BaseDescriptor>::bgk_ma2_equilibrium(iPop, rhoBar, invRho, j, jSqr);
}
套娃四层

接下来看src/latticeBoltzmann的dynamicTemplate3D.h
检索一下D3Q19,就能定位到如下代码区域
此处的c_j是microscopic flow velocity vector点乘方向向量,看 是不是很符合书上的feq公式呢?

static T bgk_ma2_equilibrium(plint iPop, T rhoBar, T invRho, Array<T,3> const& j, T jSqr ) {T c_j = D::c[iPop][0]*j[0] + D::c[iPop][1]*j[1] + D::c[iPop][2]*j[2];return D::t[iPop] * ( rhoBar + (T)3.*c_j + invRho*((T)4.5*c_j*c_j - (T)1.5*jSqr) );
}

其他地方的computeEquilibrium

以GuoExternalForceBGKdynamics为例
(basicDynamics/externalForceDynamics.h)

暂时不清楚这里的函数会被何时调用,猜测是在算例的迭代过程时内部运算。
virtual T computeEquilibrium(plint iPop, T rhoBar, Array<T,Descriptor<T>::d> const& j, T jSqr, T thetaBar=T()) const;

/// Implementation of O(Ma^2) BGK dynamics with an external force (Guo approach)
template<typename T, template<typename U> class Descriptor>
class GuoExternalForceBGKdynamics : public ExternalForceDynamics<T,Descriptor> {public:
/* *************** Construction / Destruction ************************ */GuoExternalForceBGKdynamics(T omega_);GuoExternalForceBGKdynamics(HierarchicUnserializer& unserializer);/// Clone the object on its dynamic type.virtual GuoExternalForceBGKdynamics<T,Descriptor>* clone() const;/// Return a unique ID for this class.virtual int getId() const;/* *************** Collision and Equilibrium ************************* *//// Implementation of the collision stepvirtual void collide(Cell<T,Descriptor>& cell,BlockStatistics& statistics_);/// Implementation of the collision step, with imposed macroscopic variablesvirtual void collideExternal(Cell<T,Descriptor>& cell, T rhoBar,Array<T,Descriptor<T>::d> const& j, T thetaBar, BlockStatistics& stat);/// Compute equilibrium distribution functionvirtual T computeEquilibrium(plint iPop, T rhoBar, Array<T,Descriptor<T>::d> const& j,T jSqr, T thetaBar=T()) const;
private:static int id;
};

basicDynamics/externalForceDynamics.hh

template<typename T, template<typename U> class Descriptor>
T GuoExternalForceBGKdynamics<T,Descriptor>::computeEquilibrium (plint iPop, T rhoBar, Array<T,Descriptor<T>::d> const& j,T jSqr, T thetaBar) const
{T invRho = Descriptor<T>::invRho(rhoBar);return dynamicsTemplates<T,Descriptor>::bgk_ma2_equilibrium(iPop, rhoBar, invRho, j, jSqr);
}

Palabos源码:computeEquilibrium(iPop, rhoBar, j, jSqr)的过程相关推荐

  1. JVM源码简析(楔子)-对象内存分配过程和PS回收器中YGC触发FGC的现象

    前言 想要搞明白Java对象内存申请过程的原因,是因为第一次接触线上GC日志的时候,发现了一些很奇怪的现象,就是young gc触发了full gc.为了搞清楚这个现象,得先要来个测试去复现. 复现现 ...

  2. Spring AOP 源码分析 - 拦截器链的执行过程

    1.简介 本篇文章是 AOP 源码分析系列文章的最后一篇文章,在前面的两篇文章中,我分别介绍了 Spring AOP 是如何为目标 bean 筛选合适的通知器,以及如何创建代理对象的过程.现在我们的得 ...

  3. Spring IOC 容器源码分析 - 创建单例 bean 的过程

    1. 简介 在上一篇文章中,我比较详细的分析了获取 bean 的方法,也就是getBean(String)的实现逻辑.对于已实例化好的单例 bean,getBean(String) 方法并不会再一次去 ...

  4. Spring源码解析:自定义标签的解析过程

    2019独角兽企业重金招聘Python工程师标准>>> spring version : 4.3.x Spring 中的标签分为默认标签和自定义标签两类,上一篇我们探究了默认标签的解 ...

  5. linux7squid编译安装,CentOS 7.3 源码安装squid 4.12 及安装过程遇到的一些问题

    CentOS 7.3 源码安装squid 4.12 及安装过程遇到的一些问题 一.源码安装squid 4.12 1.下载squid-4.12源码包 wget http://www.squid-cach ...

  6. phpcms 指定id范围 调用_Dubbogo 源码笔记(二)客户端调用过程

    作者 | 李志信 导读:有了上一篇文章<Dubbo-go 源码笔记(一)Server 端开启服务过程>的铺垫,可以类比客户端启动于服务端的启动过程.其中最大的区别是服务端通过 zk 注册服 ...

  7. 一对一直播源码开发,如何改善音视频通话过程中的用户体验?

    在一对一直播源码开发中,由于是单个用户对话单个用户,所以对音视频通话质量的要求会比较高,那应该如何在开发时改善音视频通话中的用户体验呢? 一.选择播放模式 在一对一直播源码中视频通话过程中出现马赛克或 ...

  8. Spring AOP源码解析-拦截器链的执行过程

    一.简介 在前面的两篇文章中,分别介绍了 Spring AOP 是如何为目标 bean 筛选合适的通知器,以及如何创建代理对象的过程.现在得到了 bean 的代理对象,且通知也以合适的方式插在了目标方 ...

  9. Spring源码阅读之bean对象的创建过程

    Spring源码阅读之bean对象的创建过程 ​ Spring是通过IOC容器来管理对象的,该容器不仅仅只是帮我们创建了对象那么简单,它负责了对象的整个生命周期-创建.装配.销毁.这种方式成为控制反转 ...

  10. Palabos源码:collideAndStream

    几乎每个算例里都会有这一行代码,它背后的源代码如下: /** This operation is more efficient than a successive application of* co ...

最新文章

  1. OC实用转换model的工具
  2. Android跳转intent简单教程
  3. 第十七章 Python网络编程
  4. ABAP 负号 提前
  5. CF-477C(Dreamoon and Strings) DP
  6. qt creator php扩展,用qt creator搭建开发、调试php扩展的环境
  7. idea 阿里巴巴规范插件_阿里巴巴 Java 开发者手册,编码事半功倍
  8. LeetCode 105. Construct Binary Tree from Preorder and Inorder Traversal
  9. Windows10上安装VS2017社区版操作步骤
  10. 面试题33:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。 * 例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
  11. 华视 CVR-100UC 身份证读取 Python 二次开发(包含SDK下载地址)
  12. 笔记本电脑突然无法链接wifi、无法连接宽带
  13. 博友关于炒股理念的思考
  14. keil 烧录时 Full Chip Erase Failed问题
  15. Tomcat启动时遇到的问题(找不到网页)
  16. 怎么计算一个项目的最佳容积率
  17. useSSL=true和false区别:
  18. 《Python网络爬虫从入门到实践 第2版》第15章 爬虫实践二:知乎Live
  19. 论文解读|存储集中化对多地点报童问题中预期成本的影响
  20. spring源码学习:spring初始化流程

热门文章

  1. python中浮点型占几个字节_python的浮点数占多少个字节
  2. Kafka权威指南,Kafka生产者
  3. win10怎么更新Android驱动,w10怎么更新驱动程序_教你win10更新驱动程序的方法步骤...
  4. 立创开源 | 基于lm393的模数温度传感器
  5. oracle模糊查询用法
  6. Turnserver服务器搭建
  7. 【蓝桥杯】历年真题题目及题解汇总
  8. 《逻辑学导论》(第11版)学习(一)
  9. (4) IFC属性及属性集 (Industry Foundation Class)
  10. 《云计算核心技术剖析》学习笔记