流体体积法(Volume ofFluid)是一种典型的界面追踪方法,这种方法选取流体体积分数为界面函数S。它通过定义一个体积分数$ C $(指定的流体体积分数占网格体积的百分比)来描述界面。因此只有所在网格体积分数来描述 $ 0<C<1 $ ,而界面两侧的网格内体积分数分别满足 $ C=0 $ 和$ C=1 $。体积分数 $ C $的输运方程为: $$ {\partial C \over \partial t}+ \vec v \cdot \nabla C =0 $$

由体积分数的物理意义可知,可以采取精确的数值算法来构造体积分数的对流量,这样就可以保证VOF方法有很好的守恒性。VOF 方法中对满网格和空网格是容易的,关键问题是够着界面所在的网格即$ 0<C<1 $ 处的数值通量。我们采用两次界面推进两次界面重构的方法,分两次在x 和 y 方向进行推进。

不同网格下计算的结果:

1. 50X50

2. 100 X 100 网格

3. 200 X100 网格

4. 不同网格情况下,一定时间步长时质量损失图。

分析:

可以看出,VOF方法对界面的捕捉能力较好,通过加密网格可以有效的减少质量的损失。

附代码:

其中类和头文件的定义如下:

详细的代码托管在 githup 上

  1. ```C++
  2. #include <iostream>
  3. #include <vector>
  4. #include <fstream>
  5. #include <stdlib.h>
  6. #include <string>
  7. #include <sstream>
  8.  
  9. using namespace std;
  10. class vof;
  11. class node;
  12. class element;
  13. extern bool judgev;
  14.  
  15. double check_norline(const double nnx, const double ny, const double alpha, const double pfi, const double dx);
  16.  
  17. #ifndef VOF_H
  18. #define VOF_H
  19. class vof
  20. {
  21. public:
  22. vof();
  23. virtual ~vof();
  24.  
  25. public:
  26. void initial_nodes();
  27. void calculate(const int & maxTime,int & iouput);
  28.  
  29. private:
  30. void output(int &filenum);
  31. void advance(int & now);
  32. void vof::check_pfi(ofstream & fcout);
  33. void vof::check_pfi(double & fcout);
  34.  
  35. private:
  36. const double PI = 3.14159;
  37. double xmax; //the length of calculate area
  38. double ymax; //the wifth of calculate area
  39. int l; //the node number in x director
  40. int m; //the node number in y director
  41. int ioutput;
  42.  
  43. double dx;
  44. double dy;
  45. double dt;
  46. vector<vector<node> > nodes;
  47. vector<vector<element> > nelem;
  48. };
  49.  
  50. #endif // VOF_H
  51.  
  52. #ifndef ELEMENT_H
  53. #define ELEMENT_H
  54. class element
  55. {
  56. friend void vof::output(int &);
  57. friend void vof::check_pfi(ofstream & fcout);
  58. friend void vof::check_pfi(double & fcout);
  59.  
  60. public:
  61. element();
  62. virtual ~element();
  63. element& operator=(const element &rhs);
  64.  
  65. public:
  66. void init_pfi(int i, int j, const double dx, vector<vector<node> > & nodes);
  67. void get_norline(const int & ii, const int & jj, const double & dx, vector<vector<element> > & nelem);
  68. double element::get_alpha(const double &nx, const double & ny, const double &pfi, const double &dx);
  69. void ele_xflux(const double &dt, const int &ii, const int &jj, const double &dx, vector<vector<node> > & nodes, int &inow);
  70. void ele_xadvance(const int ii, const int jj, vector<vector<element> > & nelem);
  71. void ele_yflux(const double &dt, const int &ii, const int &jj, const double &dx, vector<vector<node> > & nodes,int &inow);
  72. void ele_yadvance(const int ii, const int jj, vector<vector<element> > & nelem);
  73.  
  74. private:
  75. double element::hea_func(const double & x);
  76. double element::dichotomy_func(const double & aalpha, const double & area, const double & h, const double &nnx, const double& nny);
  77. double element::sign(const double & x);
  78. void element::crossline(const double &x1, const double y1, const double &x2, const double &y2, double &x0, double &y0);
  79.  
  80. private:
  81. const double EPS = 1.0E-9;
  82. const double EPSpfi = 5.0E-3;
  83. double pfi;
  84. double nx;
  85. double ny;
  86. double alpha;
  87.  
  88. double left_flux;
  89. double right_flux;
  90.  
  91. //vector<node> elem_node; //the four nodes of this element
  92.  
  93. };
  94.  
  95. #endif // ELEMENT_H
  96.  
  97. #ifndef NODE_H
  98. #define NODE_H
  99.  
  100. class node
  101. {
  102. friend void vof::output(int &);
  103. friend void element::ele_xflux(const double &dt, const int &ii, const int &jj, const double &dx, vector<vector<node> > & nodes, int &inow);
  104. friend void element::ele_yflux(const double &dt, const int &ii, const int &jj, const double &dy, vector<vector<node> > & nodes,int &inow);
  105. public:
  106. node(const double &xx, const double & yy);
  107. node& operator=(const node &rhs);
  108. node();
  109. virtual ~node();
  110.  
  111. public:
  112. double distance();
  113. void initial_node(double x,double y);
  114.  
  115. private:
  116. void get_velicity();
  117.  
  118. private:
  119. const double PI = 3.1415926;
  120. double x;
  121. double y;
  122. double vx, vy;
  123.  
  124. };
  125.  
  126. #endif // NODE_H
  127.  
  128. ```

VOF 方法捕捉界面--粘性剪切流动算例的更多相关文章

  1. Fluent算例精选|02瞬态滑移网格分析叶轮机械内部流动

    本算例使用的软件:fluent.icem 通过学习本算例您将获得? 1.学会周期区域创建 2.学会瞬态求解器及滑移网格边界条件设置 3.学会周期面.滑移面设置 4.学会如何监测压力脉动(声学仿真) 5 ...

  2. Fluent算例精选|03利用VOF和蒸发-冷凝模型

    通过学习本算例您将获得? 1.学会基本的VOF模型设置流程 2.学会利用蒸发-冷凝模型来模拟传热沸腾 目录 1摘要4 2传热沸腾模型介绍4 3前处理4 4求解设置5 4.1启动Fluent5 4.2网 ...

  3. 【OpenFOAM】——OpenFOAM入门算例学习

    1  明确目标——为啥费老大劲儿学习OpenFOAM 学习OpenFOAM主要出于课题需要,希望实现以下几个目标: l  [ ]学会用SnappyHexMesh生成高质量网格: l  [ ]学习使用O ...

  4. CFD-Post批处理(在一系列算例同一位置截取速度云图)

    批量在一系列算例的同一位置截取面,并显示截面的速度分布云图 现在我们有一系列的算例 我们打开CFD-Post 我们编写如下的Python代码来实现在一系列算例的同一位置截面,并显示界面的速度分布云图 ...

  5. 初始化错误——从一个简单的算例看UDF各个宏的调用顺序

    感谢西安交通大学en_phert的问题和尝试 Fluent版本:Fluent 19.0 Visual Studio版本:Visual Studio 2013 在UDF的宏的调用中大家常看见下图: 这个 ...

  6. JAVA 图形开发中组件对齐方法及界面开发

    /*文章中用到的代码只是一部分,需要源码的可通过邮箱联系我 1978702969@qq.com*/ 在上篇博客中提到了JAVA图形界面开发时的两种布局,流式布局和边框布局. 在实际使用中可能会发现,往 ...

  7. 【iOS开发】IOS界面开发使用viewWithTag:(int)findTag方法获取界面元素

    http://blog.csdn.net/lxp1021/article/details/43952551 今天在开发OS界面的时候,遇到通过界面UIview viewWithTag:(int)fin ...

  8. Java复制文件用数据流方法,renameTO()方法是相当于剪切操作

    我想达到的效果是,一个文件复制到另一个地方,然后重命名 //判断是否存在 File file = new File("D:/tomcat9.0.12/apache-tomcat-9.0.12 ...

  9. Matlab-9:中心差分方法解常微分算例(SOR完整版)

    函数文件: function [x,n,flag]=sor(A,b,eps,M,max1) %sor函数为用松弛迭代法求解线性方程组 %A为线性方程组的系数矩阵 %b为线性方程组的常数向量 %eps为 ...

随机推荐

  1. angularjs之Restangular用法

    参考资料: angularjs 获取服务端口数据的方法(三种) 学习-[前端]-angularjs基本框架以及向服务器发送请求的方法 Restangular on Angular

  2. logging 文件日志

    1. 例子 import logging logging.basicConfig(filename='log.txt', #文件名 level=logging.DEBUG, #级别 format=u' ...

  3. vue2.0实战

    学了几周的vue2.0,终于有时间去做一个应用了. 为了全面联系相关知识,所以用到了vue-router,以及作者最新推荐的axios,组件库用的是饿了么的mint-ui2.0. 项目构建使用官方vu ...

  4. 修改Centos 6.5的yum源

    1.进入目录 cd /etc/yum.repos.d/ 2.保持副本 mv CentOS-Base.repo CentOS-Base.repo.backup 3.下载新的CentOS-Base.rep ...

  5. Error:failed to find Build Tools revision 23.0.0 rc3

    解决,选择AS里有的版本就可以了,已有的我这就一个23.0.3,导入的项目是23.0.2 Donate:)

  6. linux 下安装mongodb

    1.初始化docker:    -v 设置docker和host共享目录,格式hostPath:dockerContainerPath    -p 端口映射    --name,容器名称    cen ...

  7. zepto之tap事件点透问题分析及解决方案

    点透现象出现的场景: 当A/B两个层上下z轴重叠,上层的A点击后消失或移开(这一点很重要),并且B元素本身有默认click事件(如a标签)或绑定了click事件.在这种情况下,点击A/B重叠的部分,就 ...

  8. sublime text快捷键

    Ctrl+Shift+V:粘贴并格式化Ctrl+D:选择单词,重复可增加选择下一个相同的单词Ctrl+L:选择行,重复可依次增加选择下一行Ctrl+M:跳转到对应括号Ctrl+K+B:开关侧栏Ctrl ...

  9. java中面向对象的一些知识(一)

    一:基本概念 举例:写一个程序,实现如下功能: 一群宠物,宠物有各种类型,如猫.狗.企鹅等 让这群宠物,按照各自的能力不同,进行各种比赛(如爬树.游泳.跳水):扩展性需求: 游泳比赛游泳池的参数.飞盘 ...

  10. 不一样的dynamic解析json 万能方法

    写过javascript的人都知道js解析json 1:(JSON) 字符串转换为对象. var str = '{"name":"lsw","hobb ...