ChatGPT是啥?我就不在这里展开了,因为这是街知巷闻的了。
用CFD时使用ChatGPT吗?
嗯,你可以在几乎所有项目中使用ChatGPT来满足你的兴趣。但一个大问题是:你对工具有什么期望?正如你们可能知道的,CFD是一个需要广泛经验和比ChatGPT目前能力(至少在目前)更详细建模的复杂主题。然而,你仍然可以使用它来生成2D/3D典型流动的简单CFD求解器。一旦你增加了问题的复杂性,你就必须非常小心地处理你输入给模型的内容(这需要你自己编写代码的经验水平)。我不是说这个工具在这方面没用;我是说为了使用它,你必须有基础水平的知识,成为工具输出给你的内容的一个好的裁判。换句话说,让工具提高你的效率,但不要盲目跟随输出的文本。
例如,我让ChatGPT为使用有限差分法(FDM)的层流2D盖驱动腔流编写了一个Python脚本。第一次它给了我一个非常基础的脚本,它不起作用,我不断细化我的输入(通过非常具体地说明代码结构、问题设置和编写解决方案结果的方式)。这是结果:
正方形腔盖驱动流动
在Paraview中可视化输出vtk文件如下:
[代码片段见下面]:
import numpy as n
import sys
from datetime import datetime
import datetime as dt
# clock starts to tick
T0 = datetime.now()
# Defining spatial resolution
def create_mesh(nx, ny, Lx, Ly):
dx = Lx / (nx - 1)
dy = Ly / (ny - 1)
x = np.linspace(0, Lx, nx)
y = np.linspace(0, Ly, ny)
X, Y = np.meshgrid(x, y)
return X, Y, dx, dy
# Initializing the domain
def initial_conditions(X, Y, nx, ny, U_top):
U = np.zeros((ny, nx))
V = np.zeros((ny, nx))
P = np.zeros((ny, nx))
U[-1, :] = U_top
return U, V, P
# pressure Poisson equation
def pressure_poisson(P, dx, dy, U, V, rho, dt, n_iter_pressure):
P_new = np.copy(P)
b = np.zeros_like(P)
b[1:-1, 1:-1] = (rho * (1 / dt * ((U[1:-1, 2:] - U[1:-1, 0:-2]) / (2 * dx) + (V[2:, 1:-1] - V[0:-2, 1:-1]) / (2 * dy)) - ((U[1:-1, 2:] - U[1:-1, 0:-2]) / (2 * dx)) ** 2 - 2 * ((U[2:, 1:-1] - U[0:-2, 1:-1]) / (2 * dy) * (V[1:-1, 2:] - V[1:-1, 0:-2]) / (2 * dx)) - ((V[2:, 1:-1] - V[0:-2, 1:-1]) / (2 * dy)) ** 2))
#for _ in range(n_iter_pressure):
# P_new[1:-1, 1:-1] = (((P[1:-1, 2:] + P[1:-1, 0:-2]) * dy ** 2 + (P[2:, 1:-1] + P[0:-2, 1:-1]) * dx ** 2) / (2 * (dx ** 2 + dy ** 2)) - dx ** 2 * dy ** 2 / (2 * (dx ** 2 + dy ** 2)) * b[1:-1, 1:-1])
# P_new[:, 0] = P_new[:, 1] # Left boundary
# P_new[:, -1] = P_new[:, -2] # Right boundary
# P_new[0, :] = P_new[1, :] # Bottom boundary
# P_new[-1, :] = P_new[-2, :] # Top boundary
# Iterate over the pressure solver for a specified number of iterations
for _ in range(n_iter_pressure):
# Update the pressure field using the finite volume method
P_new[1:-1, 1:-1] = (
(
# Pressure values from the neighboring cells in the x and y directions
(P[1:-1, 2:] + P[1:-1, 0:-2]) * dy ** 2
+ (P[2:, 1:-1] + P[0:-2, 1:-1]) * dx ** 2
)
/ (2 * (dx ** 2 + dy ** 2)) # Divide by the sum of squared distances in x and y directions
- dx ** 2 * dy ** 2 / (2 * (dx ** 2 + dy ** 2)) * b[1:-1, 1:-1] # Subtract the pressure correction term
)
# Update boundary conditions for pressure
P_new[:, 0] = P_new[:, 1] # Left boundary
P_new[:, -1] = P_new[:, -2] # Right boundary
P_new[0, :] = P_new[1, :] # Bottom boundary
P_new[-1, :] = P_new[-2, :] # Top boundary
return P_new
# Update the velocity field
def velocity_field(U, V, P, dx, dy, dt, nu, rho, U_top):
U_new = np.copy(U)
V_new = np.copy(V)
U_new[1:-1, 1:-1] = (U[1:-1, 1:-1] - U[1:-1, 1:-1] * dt / dx * (U[1:-1, 1:-1] - U[1:-1, 0:-2]) - V[1:-1, 1:-1] * dt / dy * (U[1:-1, 1:-1] - U[0:-2, 1:-1]) - dt / (2 * rho * dx) * (P[1:-1, 2:] - P[1:-1, 0:-2]) + nu * (dt / (dx ** 2) * (U[1:-1, 2:] - 2 * U[1:-1, 1:-1] + U[1:-1, 0:-2]) + dt / (dy ** 2) * (U[2:, 1:-1] - 2 * U[1:-1, 1:-1] + U[0:-2, 1:-1])))
V_new[1:-1, 1:-1] = (V[1:-1, 1:-1] - U[1:-1, 1:-1] * dt / dx * (V[1:-1, 1:-1] - V[1:-1, 0:-2]) - V[1:-1, 1:-1] * dt / dy * (V[1:-1, 1:-1] - V[0:-2, 1:-1]) - dt / (2 * rho * dy) * (P[2:, 1:-1] - P[0:-2, 1:-1]) + nu * (dt / (dx ** 2) * (V[1:-1, 2:] - 2 * V[1:-1, 1:-1] + V[1:-1, 0:-2]) + dt / (dy ** 2) * (V[2:, 1:-1] - 2 * V[1:-1, 1:-1] + V[0:-2, 1:-1])))
# Boundary conditions
U_new[0, :] = 0
U_new[-1, :] = U_top
U_new[:, 0] = 0
U_new[:, -1] = 0
V_new[0, :] = 0
V_new[-1, :] = 0
V_new[:, 0] = 0
V_new[:, -1] = 0
return U_new, V_new
# content of VTK files for solution results
def write_vtk(X, Y, U, V, P, file_name, nx, ny):
with open(file_name, 'w') as f:
f.write('# vtk DataFile Version 3.0\n')
f.write('2D Cavity Flow\n')
f.write('ASCII\n')
f.write('DATASET STRUCTURED_GRID\n')
f.write('DIMENSIONS {0} {1} 1\n'.format(nx, ny))
f.write('POINTS {0} float\n'.format(nx * ny))
for j in range(ny):
for i in range(nx):
f.write('{0} {1} 0\n'.format(X[j, i], Y[j, i]))
f.write('POINT_DATA {0}\n'.format(nx * ny))
f.write('VECTORS velocity float\n')
for j in range(ny):
for i in range(nx):
f.write('{0} {1} 0\n'.format(U[j, i], V[j, i]))
f.write('SCALARS pressure float\n')
f.write('LOOKUP_TABLE default\n')
for j in range(ny):
for i in range(nx):
f.write('{0}\n'.format(P[j, i]))
def main():
Lx, Ly = 1.0, 1.0
nx, ny = 41, 41
n_iter_pressure = 50
n_time_steps = 10000
U_top = 0.5
rho = 1.0
nu = 0.01
dt = 0.001
# Create mesh
X, Y, dx, dy = create_mesh(nx, ny, Lx, Ly)
# Initialize velocity and pressure fields
U, V, P = initial_conditions(X, Y, nx, ny, U_top)
# Time-stepping loop
for n in range(n_time_steps):
# Update pressure field
P = pressure_poisson(P, dx, dy, U, V, rho, dt, n_iter_pressure)
# Update velocity field
U, V = velocity_field(U, V, P, dx, dy, dt, nu, rho, U_top)
# Save results every N time steps
N = 200
if n % N == 0:
file_name = f'cavity_flow_2D_{n:04d}.vtk'
print('====================================')
print('Writing solution for time step:', n)
#print('====================================')
write_vtk(X, Y, U, V, P, file_name, nx, ny)
if n == n_time_steps:
print('====================================')
print('Job is completed successfully ')
print('====================================')
# Write results to a VTK file [when uncommented, will write the solution at every time step!]
#write_vtk(X, Y, U, V, P, 'cavity_flow.vtk', nx, ny)
if __name__ == '__main__':
main()
# Print inital and final times
Tf = datetime.now()
print()
print('+++++++++++++++++++++++++++++++++++++++++++')
print('--------------- DATE & TIME ---------------')
print(T0)
print('+++++++++++++++++++++++++++++++++++++++++++')
print(Tf)
print('+++++++++++++++++++++++++++++++++++++++++++')
#=========
# Summary
# ========
# This Python code is a script for simulating 2D incompressible flow in a cavity using the finite difference method. The cavity has a top lid that is moving at a constant velocity, while the other three walls are stationary. The simulation aims to solve the Navier-Stokes equations for fluid flow, which describe the conservation of momentum, and the pressure Poisson equation, which is derived from the continuity equation to maintain the incompressible flow condition.
# Here's a brief overview of the code:
# Import the necessary libraries: numpy and sys.
# Define a function create_mesh() to create a structured grid in the x-y plane with specified dimensions and number of points in each direction.
# Define a function initial_conditions() to set the initial values for the velocity (U and V) and pressure (P) fields. The top lid is initialized with a given velocity (U_top).
# Define a function pressure_poisson() to solve the pressure Poisson equation using given number of iterations.
# Define a function velocity_field() to update the velocity fields (U and V) using the updated pressure field and the given parameters (time step, fluid viscosity, fluid density, and lid velocity).
# Define a function write_vtk() to output the results (velocity and pressure fields) to a VTK file, which can be visualized using a software like ParaView.
# Define the main() function, which initializes the simulation parameters, creates the mesh, sets the initial conditions, runs the time-stepping loop for updating the pressure and velocity fields, and writes the results to a VTK file.
# Finally, the script checks if it is being run as the main module and calls the main() function.
# The code is structured and written in a way that it can be easily modified to accommodate different simulation parameters or other boundary conditions.
注意!正如我上面提到的,你不应该直接信任来自ChatGPT的代码。生成的代码必须逐行追踪,并且在使用前必须经过验证和测试。这只是一个说明性的例子,用来展示到目前为止这个工具能走多远。
Visual Chat-GPT在CFD中的应用
你可能听说过,Visual-ChatGPT是ChatGPT架构的一个最新扩展,专门设计用来根据视觉输入(如图像或视频)生成自然语言文本。该模型是在大量图像-标题对的数据集上训练的,每张图像都与一个或多个描述图像内容的自然语言标题相关联。
到目前为止,Visual-ChatGPT在生成图像的自然语言描述、回答视觉场景的问题,甚至根据文本描述生成新图像方面,都显示出了非常令人印象深刻的结果。这些能力可能在优化CFD模拟中的网格时非常有用,例如,允许用户使用自然语言文本描述几何形状,结果将是:基于这些描述生成高质量的网格🤯这将是CFD领域真正的游戏规则改变者。
例如,你可以提供所需的网格特性描述,如“一个高质量的网格,具有统一的单元大小和低畸变,集中在锐利边缘周围的区域,并在靠近墙壁的地方至少生成15层棱柱层”,Visual-ChatGPT可以生成满足这些要求的相应网格。这可以帮助简化网格生成过程,使其更容易为非专家使用,同时也提高了CFD模拟的准确性和效率。另一个特性可能是提供网格的快照,并要求在某些区域提高质量。或者输入一个网格图片,比如说2D网格,然后让ChatGPT为这个网格生成一个可定制的脚本。
再次强调,这只是一个语言模型。因此,请记住,生成高质量的网格不仅需要描述所需的网格特性,还需要理解被模拟的物理几何和流场,这可能需要事先在网格生成方面拥有现有的专业知识。
如何更好使用ChatGPT
1)记住,这是一个AI语言模型!这意味着什么?这意味着,尽管这个工具非常能够生成优化的基于文本的输出,但它仍然容易"出错"。
2)请记住,ChatGPT以块结构化的方式工作,这意味着你必须逐步构建块才能得到你需要的东西。如果你从一个非常详细的问题开始,提出一个高度技术性的问题,它可能会给你一个非常通用的答案(这里我指的是它可能给出的最通用的答案)。相反,给出你来自哪里和你去哪里的想法(介绍性背景 --> 明确定义的问题 --> 有用的答案)。
3)你必须充分意识到ChatGPT不是谷歌那样的搜索引擎。除了每个工具给出的单一/多重输出外,ChatGPT基于它的训练数据和它接收到的输入。也就是说,除非你用正确的输入喂养它,否则ChatGPT不会给你你寻求的效率 - 你需要具体(记住我们关于注意力基础变换器的话)。假设你需要知道你想承担的项目预算的大致估计。不要输入像“为巧克力工厂的平面设计项目可能的预算是多少”这样的内容,你需要更详细,并为模型提供“参数”,以便它考虑计算你项目的预算。你可以写一些像 “我是一名有XX年经验的平面设计师,我即将承担一个为巧克力工厂设计标志的项目。这个标志需要以动画版本交付,可能需要像Adobe软件包这样的复杂工具。设计可能需要一个高规格的图形卡进行渲染。考虑到设计可能需要多次迭代直到最终标志被同意,你能给我一个这个项目应该花费多少的大致估计吗”。
4)为了最大限度地利用ChatGPT(如第2点所述),你需要花些时间首先了解你的情况。当ChatGPT在任何领域通过复 制粘贴的方式使用时,这是毫无意义的。
5)你必须意识到,除了ChatGPT可能存在的文字/编码错误外,它也可能给出不完整的答案(特别是当你的输入不足时) - 因为简单地说,它没有足够的数据来知道你想知道什么。