An example: 2D immersed boundary lattice Boltzmann method code--By Timm Krüger.2011.

本文主要是介绍An example: 2D immersed boundary lattice Boltzmann method code--By Timm Krüger.2011.,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  1. //  谢谢Timm Krüger大佬的代码。 还是老样子,有啥问题Feel free to tell us~毕竟群众力量大嘛~QQ群:293267908。
  2. //  话不多说,上干货!
  3.  // ISBN 978-3-319-44649-3 (Electronic)
  4. //       978-3-319-44647-9 (Print)
  5. //  http://www.springer.com/978-3-319-44647-9       文章地址。
  6. // This is an example 2D immersed boundary lattice Boltzmann method code.   
  7. // It uses the D2Q9 lattice with Guo's forcing term.   
  8. // Rigid bottom and top walls are parallel to the x-axis (channel).   
  9. // The flow is periodic along the x-axis.   
  10. // One initially cylindrical particle is positioned in the flow.   
  11. // This particle can be rigid/deformable and stationary/moving.   
  12.  
  13. // Last update 21-Aug-2011 by Timm Krüger.   
  14. // This code may be changed and distributed freely.   
  15. //   
  16. // The lattice velocities are defined according to the following scheme:   
  17. // index:   0  1  2  3  4  5  6  7  8   
  18. // ----------------------------------   
  19. // x:       0 +1 -1  0  0 +1 -1 +1 -1   
  20. // y:       0  0  0 +1 -1 +1 -1 -1 +1   
  21. //   
  22. // 8 3 5  ^y   
  23. //  \|/   |   x   
  24. // 2-0-1   --->   
  25. //  /|\   
  26. // 6 4 7   
  27.    
  28. /// *********************   
  29. /// PREPROCESSOR COMMANDS   
  30. /// *********************   
  31.    
  32. #include <vector> // vector containers   
  33. #include <cmath> // mathematical library   
  34. #include <iostream> // for the use of 'cout'   
  35. #include <fstream> // file streams   
  36. #include <sstream> // string streams   
  37. #include <cstdlib> // standard library   
  38. #define SQ(x) ((x) * (x)) // square function; replaces SQ(x) by ((x) * (x)) in the code   
  39.    
  40. using namespace std; // permanently use the standard namespace   
  41.    
  42. /// *********************   
  43. /// SIMULATION PARAMETERS   
  44. /// *********************   
  45.    
  46. // These are the relevant simulation parameters.   
  47. // They can be changed by the user.   
  48. // If a bottom or top wall shall move in negative x-direction, a negative velocity has to be specified.   
  49. // Moving walls and gravity can be switched on simultaneously.   
  50.    
  51. /// Simulation types   
  52. // Exactly one of the following options has to be defined.   
  53. // RIGID_CYLINDER   
  54. // - for simulation of, e.g., Karman vortex street   
  55. // - the cylinder is kept in space, it does not move   
  56. // DEFORMABLE_CYLINDER   
  57. // - for simulation of a deformable cylinder   
  58. // - the cylinder moves along with the flow   
  59. // DEFORMABLE_RBC   
  60. // - for simulation of a deformable red blood cell   
  61. // - the cell moves along with the flow   
  62.    
  63. //这个代码一次只能算一个边界。 可以定义这几个。
  64. //#define RIGID_CYLINDER   
  65. //#define DEFORMABLE_CYLINDER   
  66.  
  67. #define DEFORMABLE_RBC   
  68.    
  69. /// Fluid/lattice properties   
  70.    
  71. #ifdef RIGID_CYLINDER   
  72.   const int Nx = 300; // number of lattice nodes along the x-axis (periodic)   
  73.   const int Ny = 62; // number of lattice nodes along the y-axis (including two wall nodes)   
  74.   const double tau = 0.53; // relaxation time   
  75.   const int t_num = 100000; // number of time steps (running from 1 to t_num)   
  76.   const int t_disk = 200; // disk write time step (data will be written to the disk every t_disk step)   
  77.   const int t_info = 5000; // info time step (screen message will be printed every t_info step)   
  78.   const double gravity = 0.000005; // force density due to gravity (in positive x-direction)   
  79.   const double wall_vel_bottom = 0; // velocity of the bottom wall (in positive x-direction)   
  80.   const double wall_vel_top = 0; // velocity of the top wall (in positive x-direction)   
  81. #else   
  82.   const int Nx = 30; // number of lattice nodes along the x-axis (periodic)   
  83.   const int Ny = 32; // number of lattice nodes along the y-axis (including two wall nodes)   
  84.   const double tau = 1; // relaxation time   
  85.   const int t_num = 50000; // number of time steps (running from 1 to t_num)   
  86.   const int t_disk = 200; // disk write time step (data will be written to the disk every t_disk step)   
  87.   const int t_info = 1000; // info time step (screen message will be printed every t_info step)   
  88.   const double gravity = 0; // force density due to gravity (in positive x-direction)   
  89.   const double wall_vel_bottom = -0.02; // velocity of the bottom wall (in positive x-direction)   
  90.   const double wall_vel_top = 0.02; // velocity of the top wall (in positive x-direction)   
  91. #endif   
  92.    
  93. /// Particle properties   
  94.    
  95. #ifdef RIGID_CYLINDER   
  96.   const int particle_num_nodes = 36; // number of surface nodes   
  97.   const double particle_radius = 8; // radius   
  98.   const double particle_stiffness = 0.3; // stiffness modulus   
  99.   const double particle_center_x = 15; // center position (x-component)   
  100.   const double particle_center_y = 29; // center position (y-component)   
  101. #else   
  102.   const int particle_num_nodes = 32; // number of surface nodes   
  103.   const double particle_radius = 6; // radius   
  104.   const double particle_stiffness = 0.1; // stiffness modulus   
  105.   const double particle_bending = 0.001; // stiffness modulus   
  106.   const double particle_center_x = 15; // center position (x-component)   
  107.   const double particle_center_y = 15; // center position (y-component)   
  108. #endif   
  109.    
  110. /// *****************   
  111. /// DECLARE VARIABLES   
  112. /// *****************   
  113.    
  114. // The following code should not be modified when it is first used.   
  115.    
  116. const double omega = 1. / tau; // relaxation frequency (inverse of relaxation time)   
  117. double ***pop, ***pop_old; // LBM populations (old and new)   
  118. double **density; // fluid density   
  119. double **velocity_x; // fluid velocity (x-component)   
  120. double **velocity_y; // fluid velocity (y-component)   
  121. double **force_x; // fluid force (x-component)   
  122. double **force_y; // fluid force (y-component)   
  123. double force_latt[9]; // lattice force term entering the lattice Boltzmann equation   
  124. double pop_eq[9]; // equilibrium populations   
  125. const double weight[9] = {4./9., 1./9., 1./9., 1./9., 1./9., 1./36., 1./36., 1./36., 1./36.}; // lattice weights   
  126.    
  127. /// ******************   
  128. /// PARTICLE STRUCTURE   
  129. /// ******************   
  130.    
  131. // The following code handles the object immersed in the flow.   
  132. // In the present implementation, only a single object can be put into the flow.   
  133.    
  134. /// Structure for surface nodes   
  135. // Each node has a current x- and y-position and a reference x- and y-position.   
  136.    
  137. struct node_struct {   
  138.    
  139.   /// Constructor   
  140.    
  141.   node_struct() {   
  142. //x分成了x和x_ref ,是为了后面的相减,求边界上的力密度大小。
  143.    x = 0;   
  144.    y = 0;   
  145.    x_ref = 0;   
  146.    y_ref = 0;   
  147.    vel_x = 0;   
  148.    vel_y = 0;   
  149.    force_x = 0;   
  150.    force_y = 0;   
  151.   }   
  152.    
  153.   /// Elements   
  154.    
  155.   double x; // current x-position   
  156.   double y; // current y-position   
  157.   double x_ref; // reference x-position   
  158.   double y_ref; // reference y-position   
  159.   double vel_x; // node velocity (x-component)   
  160.   double vel_y; // node velocity (y-component)   
  161.   double force_x; // node force (x-component)   
  162.   double force_y; // node force (y-component)   
  163. };   
  164.    
  165. /// Structure for object (either cylinder or red blood cell)   
  166.    
  167. struct particle_struct {   
  168.    
  169.   /// Constructor   
  170.    
  171.   particle_struct() {   
  172.     num_nodes = particle_num_nodes;   
  173.     radius = particle_radius;   
  174.  
  175. // 设置流体刚度,用于计算边界力密度
  176.     stiffness = particle_stiffness;   
  177.     center.x = particle_center_x;   
  178.     center.y = particle_center_y;   
  179.     center.x_ref = particle_center_x;   
  180.     center.y_ref = particle_center_y;   
  181.     node = new node_struct[num_nodes];   
  182.    
  183.     // The initial shape of the object is set in the following.   
  184.     // For a cylinder (rigid or deformable), the nodes define a circle.   
  185.     // For a red blood cell, the y-position has to be changed in order to describe a red blood cell.   
  186.     // Initially, the current node positions and reference node positions are identical.   
  187.     // During the simulation, only the current positions are updated,   
  188.     // the reference node positions are fixed.   
  189.    
  190.     for(int n = 0; n < num_nodes; ++n) {   
  191.       #if defined RIGID_CYLINDER || defined DEFORMABLE_CYLINDER   
  192.         node[n].x = center.x + radius * sin(2. * M_PI * (double) n / num_nodes);   
  193.         node[n].x_ref = center.x + radius * sin(2. * M_PI * (double) n / num_nodes);   
  194.         node[n].y = center.y + radius * cos(2. * M_PI * (double) n / num_nodes);   
  195.         node[n].y_ref = center.y + radius * cos(2. * M_PI * (double) n / num_nodes);   
  196.       #endif   
  197.    
  198.       #ifdef DEFORMABLE_RBC   
  199.         node[n].x = center.x + radius * sin(2. * M_PI * (double) n / num_nodes);   
  200.         node[n].x_ref = center.x + radius * sin(2. * M_PI * (double) n / num_nodes);   
  201.         node[n].y = radius * cos(2. * M_PI * (double) n / num_nodes);   
  202.    
  203.         // Parametrization of the red blood cell shape in 2D   
  204.    
  205.         

这篇关于An example: 2D immersed boundary lattice Boltzmann method code--By Timm Krüger.2011.的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/653416

相关文章

模版方法模式template method

学习笔记,原文链接 https://refactoringguru.cn/design-patterns/template-method 超类中定义了一个算法的框架, 允许子类在不修改结构的情况下重写算法的特定步骤。 上层接口有默认实现的方法和子类需要自己实现的方法

Debugging Lua Project created in Cocos Code IDE creates “Waiting for debugger to connect” in Win-7

转自 I Installed Cocos Code IDE and created a new Lua Project. When Debugging the Project(F11) the game window pops up and gives me the message waiting for debugger to connect and then freezes. Also a

LLVM入门2:如何基于自己的代码生成IR-LLVM IR code generation实例介绍

概述 本节将通过一个简单的例子来介绍如何生成llvm IR,以Kaleidoscope IR中的例子为例,我们基于LLVM接口构建一个简单的编译器,实现简单的语句解析并转化为LLVM IR,生成对应的LLVM IR部分,代码如下,文件名为toy.cpp,先给出代码,后面会详细介绍每一步分代码: #include "llvm/ADT/APFloat.h"#include "llvm/ADT/S

Matter.js:Web开发者的2D物理引擎

Matter.js:Web开发者的2D物理引擎 前言 在现代网页开发中,交互性和动态效果是提升用户体验的关键因素。 Matter.js,一个专为网页设计的2D物理引擎,为开发者提供了一种简单而强大的方式,来实现复杂的物理交互效果。 无论是模拟重力、碰撞还是复杂的物体运动,Matter.js 都能轻松应对。 本文将带你深入了解 Matter.js ,并提供实际的代码示例,让你一窥其强大功能

VS Code 调试go程序的相关配置说明

用 VS code 调试Go程序需要在.vscode/launch.json文件中增加如下配置:  // launch.json{// Use IntelliSense to learn about possible attributes.// Hover to view descriptions of existing attributes.// For more information,

code: 400, msg: Required request body is missing 错误解决

引起这个错误的原因是,请求参数按照get方式给。 应该给json字符串才对 补充: 1. @RequestBody String resource 加@RequestBody必须给json字符串,否则会报错400,记如标题错误。 不加这个的进行请求的话,其实post和get就没有什么区别了。 2. List<String> indexCodes=(List<String>)json.

Unity3D在2D游戏中获取触屏物体的方法

我们的需求是: 假如屏幕中一个棋盘,每个棋子是button构成的,我们希望手指或者鼠标在哪里,就显示那个位置的button信息。 网上有很多获取触屏物体信息的信息的方法如下面代码所示: Camera cam = Camera.main; // pre-defined...if (touch.phase == TouchPhase.Bagan)){ // 如果触控点状态为按下Ray

iOS项目发布提交出现invalid code signing entitlements错误。

1、进入开发者账号,选择App IDs,找到自己项目对应的AppId,点击进去编辑, 2、看下错误提示出现  --Specifically, value "CVYZ6723728.*" for key "com.apple.developer.ubiquity-container-identifiers" in XX is not supported.-- 这样的错误提示 将ubiquity

解决服务器VS Code中Jupyter突然崩溃的问题

问题 本来在服务器Anaconda的Python环境里装其他的包,装完了想在Jupyter里写代码验证一下有没有装好,一运行发现Jupyter崩溃了!?报错如下所示 Failed to start the Kernel. ImportError: /home/hujh/anaconda3/envs/mia/lib/python3.12/lib-dynload/_sqlite3.cpython-

兔子--The method setLatestEventInfo(Context, CharSequence, CharSequence, PendingIntent) from the type

notification.setLatestEventInfo(context, title, message, pendingIntent);     不建议使用 低于API Level 11版本,也就是Android 2.3.3以下的系统中,setLatestEventInfo()函数是唯一的实现方法。  Intent  intent = new Intent(