首页/文章/ 详情

外行人看CFD,四种傲慢与偏见,你肯定100%遇到过

1月前浏览1144

 CFD这玩意儿在20世纪末那会儿,基本上就是学术界的专属,或者只有那些财大气粗的航空航天巨头才玩得起。为啥呢?因为那会儿搞CFD,成本高得吓人,而且耗时得让人想打瞌睡。

但是,转眼间,时间跳到了过去这十几二十年,CFD这门技术可算是鸟枪换炮了。随着计算能力的飞速提升,CFD也变得越来越靠谱,成本也亲民多了,不再是只有大公司才能享受的奢侈品。你看看现在,小公司和个人都能用上CFD,而且效果还挺不错。

不过呢,即便是这样,关于CFD的误解和传说还是挺多的,尤其是外行人。比如,有些人可能还觉得CFD不靠谱,或者认为它太复杂,一般人搞不定。但实际上,内行人才懂它的威力和准确性。虽然这个准确性不能达到100%,但是比算命的准确性高很多。


1. CFD计算“不靠谱”


     

   

CFD软件,说白了就是用纳维尔-斯托克斯方程来模拟流体怎么流。这方程,数学界公认的铁板钉钉,但直接解它?不存在的。

咱们得靠简化和迭代来搞定。挑模型、设边界、选数值方法,这些选择决定了仿真的靠谱程度。要是结果和现实对不上眼,多半是用户自己哪里没弄对,不是软件的锅(你懂的)。经验足的用户,通过和实验结果一对比,CFD的可靠性就稳了。

正如网上有报告说,某公司用CFD省了一大笔风洞测试费,这投资回报率,简直了!


2. CFD要花大钱伤不起


     

   

搞CFD仿真,成本分三块:软件、硬件和人工。

软件就是需要购买一套正版license授权的软件,这块费大概从几万到几百万不等,看购买哪家的、多少个、租用还是买 断?可能有点小贵而已(从公司角度看这块投入)。

硬件就是得有台牛X的电脑,或者一整排服务器,这样算起来快,不用等到花儿都谢了。现在这年头,硬件算力越来越便宜,所以这块成本不是大头。除非你要搞的是超复杂的仿真,那可能就得砸钱了。

人工这块儿,就是得自己上手。从弄CAD模型,搭网格,设置仿真,到处理结果,最后还得把结果给整明白。但别急,一旦基础模型搭好,后续调整就轻松多了,成本也直线下降。就像打游戏升级,一开始得慢慢攒经验,后面等级高了,技能点一加,轻松过关。大家都知道,用CFD仿真优化了飞机设计,省了大把银子,这人工投入,一个字“值”!


3. CFD计算耗时等不起


     

   

CFD这玩意儿,以前搞起来成本高得吓人,但现在不一样了,计算能力跟开了挂似的,嗖嗖的。现在用大型集群搞并行计算,几天就能把仿真跑完,比起以前,这速度简直是坐火箭。

不过,别以为这就完事了,用户自己准备仿真和处理结果的时间,可能比仿真本身还要长,这就好比追剧,下载只要几分钟,看剧却要几小时。

说到整个CFD项目的周期,从CAD建模到网格化,再到仿真设置和结果处理,一般得2到5周,具体看项目的复杂程度。但一旦基础打好了,后续的仿真就快多了,几天就能搞定,这就像是游戏里的快速存档,方便又快捷。波音公司自己说的,用CFD仿真来设计飞机,大大缩短了研发周期,这效率,杠杠的!


4. 物理测量总是比模拟好


     

   

物理测量,听起来挺高大上,但有时候真是贵得离谱,或者干脆就没法测。想想看,那些测量设备,通常只能在一个点上给你数据,想全面了解整个流动情况?难上加难。就像你用 自 拍 杆拍照,只能拍到脸,全身照就拍不到了。

但是别急,咱们有招。把CFD模拟和物理测试结合起来,效果杠杠的。比如分析个原型或者现有产品,物理测量能帮咱们减少不确定性,验证仿真方法的靠谱程度。这样一来,经过验证的仿真方法就能用来分析各种设计变体了。就像你玩游戏,先试玩一下,熟悉了再正式开玩。

至于开发新产品或建筑的早期,物理测量还没法搞,这时候就得靠用户在仿真方面的经验来保证CFD仿真的可靠性了。


来源:CFD饭圈
航空航天建筑理论科普游戏
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2024-09-08
最近编辑:1月前
CFD饭圈
硕士 分享CFD文章,感谢关注
获赞 27粉丝 27文章 378课程 0
点赞
收藏
作者推荐

能用ChatGPT写一个CFD求解器吗?

ChatGPT是啥?我就不在这里展开了,因为这是街知巷闻的了。用CFD时使用ChatGPT吗?嗯,你可以在几乎所有项目中使用ChatGPT来满足你的兴趣。但一个大问题是:你对工具有什么期望?正如你们可能知道的,CFD是一个需要广泛经验和比ChatGPT目前能力(至少在目前)更详细建模的复杂主题。然而,你仍然可以使用它来生成2D/3D典型流动的简单CFD求解器。一旦你增加了问题的复杂性,你就必须非常小心地处理你输入给模型的内容(这需要你自己编写代码的经验水平)。我不是说这个工具在这方面没用;我是说为了使用它,你必须有基础水平的知识,成为工具输出给你的内容的一个好的裁判。换句话说,让工具提高你的效率,但不要盲目跟随输出的文本。例如,我让ChatGPT为使用有限差分法(FDM)的层流2D盖驱动腔流编写了一个Python脚本。第一次它给了我一个非常基础的脚本,它不起作用,我不断细化我的输入(通过非常具体地说明代码结构、问题设置和编写解决方案结果的方式)。这是结果:正方形腔盖驱动流动在Paraview中可视化输出vtk文件如下:[代码片段见下面]:importnumpyasnimportsysfromdatetimeimportdatetimeimportdatetimeasdt#clockstartstotickT0=datetime.now()#Definingspatialresolutiondefcreate_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)returnX,Y,dx,dy#Initializingthedomaindefinitial_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_topreturnU,V,P#pressurePoissonequationdefpressure_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_inrange(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]#Leftboundary#P_new[:,-1]=P_new[:,-2]#Rightboundary#P_new[0,:]=P_new[1,:]#Bottomboundary#P_new[-1,:]=P_new[-2,:]#Topboundary#Iterateoverthepressuresolverforaspecifiednumberofiterationsfor_inrange(n_iter_pressure):#UpdatethepressurefieldusingthefinitevolumemethodP_new[1:-1,1:-1]=((#Pressurevaluesfromtheneighboringcellsinthexandydirections(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))#Dividebythesumofsquareddistancesinxandydirections-dx**2*dy**2/(2*(dx**2+dy**2))*b[1:-1,1:-1]#Subtractthepressurecorrectionterm)#UpdateboundaryconditionsforpressureP_new[:,0]=P_new[:,1]#LeftboundaryP_new[:,-1]=P_new[:,-2]#RightboundaryP_new[0,:]=P_new[1,:]#BottomboundaryP_new[-1,:]=P_new[-2,:]#TopboundaryreturnP_new#Updatethevelocityfielddefvelocity_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])))#BoundaryconditionsU_new[0,:]=0U_new[-1,:]=U_topU_new[:,0]=0U_new[:,-1]=0V_new[0,:]=0V_new[-1,:]=0V_new[:,0]=0V_new[:,-1]=0returnU_new,V_new#contentofVTKfilesforsolutionresultsdefwrite_vtk(X,Y,U,V,P,file_name,nx,ny):withopen(file_name,'w')asf:f.write('#vtkDataFileVersion3.0\n')f.write('2DCavityFlow\n')f.write('ASCII\n')f.write('DATASETSTRUCTURED_GRID\n')f.write('DIMENSIONS{0}{1}1\n'.format(nx,ny))f.write('POINTS{0}float\n'.format(nx*ny))forjinrange(ny):foriinrange(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('VECTORSvelocityfloat\n')forjinrange(ny):foriinrange(nx):f.write('{0}{1}0\n'.format(U[j,i],V[j,i]))f.write('SCALARSpressurefloat\n')f.write('LOOKUP_TABLEdefault\n')forjinrange(ny):foriinrange(nx):f.write('{0}\n'.format(P[j,i]))defmain():Lx,Ly=1.0,1.0nx,ny=41,41n_iter_pressure=50n_time_steps=10000U_top=0.5rho=1.0nu=0.01dt=0.001#CreatemeshX,Y,dx,dy=create_mesh(nx,ny,Lx,Ly)#InitializevelocityandpressurefieldsU,V,P=initial_conditions(X,Y,nx,ny,U_top)#Time-steppingloopforninrange(n_time_steps):#UpdatepressurefieldP=pressure_poisson(P,dx,dy,U,V,rho,dt,n_iter_pressure)#UpdatevelocityfieldU,V=velocity_field(U,V,P,dx,dy,dt,nu,rho,U_top)#SaveresultseveryNtimestepsN=200ifn%N==0:file_name=f'cavity_flow_2D_{n:04d}.vtk'print('====================================')print('Writingsolutionfortimestep:',n)#print('====================================')write_vtk(X,Y,U,V,P,file_name,nx,ny)ifn==n_time_steps:print('====================================')print('Jobiscompletedsuccessfully')print('====================================')#WriteresultstoaVTKfile[whenuncommented,willwritethesolutionateverytimestep!]#write_vtk(X,Y,U,V,P,'cavity_flow.vtk',nx,ny)if__name__=='__main__':main()#PrintinitalandfinaltimesTf=datetime.now()print()print('+++++++++++++++++++++++++++++++++++++++++++')print('---------------DATE&TIME---------------')print(T0)print('+++++++++++++++++++++++++++++++++++++++++++')print(Tf)print('+++++++++++++++++++++++++++++++++++++++++++')#=========#Summary#========#ThisPythoncodeisascriptforsimulating2Dincompressibleflowinacavityusingthefinitedifferencemethod.Thecavityhasatoplidthatismovingataconstantvelocity,whiletheotherthreewallsarestationary.ThesimulationaimstosolvetheNavier-Stokesequationsforfluidflow,whichdescribetheconservationofmomentum,andthepressurePoissonequation,whichisderivedfromthecontinuityequationtomaintaintheincompressibleflowcondition.#Here'sabriefoverviewofthecode:#Importthenecessarylibraries:numpyandsys.#Defineafunctioncreate_mesh()tocreateastructuredgridinthex-yplanewithspecifieddimensionsandnumberofpointsineachdirection.#Defineafunctioninitial_conditions()tosettheinitialvaluesforthevelocity(UandV)andpressure(P)fields.Thetoplidisinitializedwithagivenvelocity(U_top).#Defineafunctionpressure_poisson()tosolvethepressurePoissonequationusinggivennumberofiterations.#Defineafunctionvelocity_field()toupdatethevelocityfields(UandV)usingtheupdatedpressurefieldandthegivenparameters(timestep,fluidviscosity,fluiddensity,andlidvelocity).#Defineafunctionwrite_vtk()tooutputtheresults(velocityandpressurefields)toaVTKfile,whichcanbevisualizedusingasoftwarelikeParaView.#Definethemain()function,whichinitializesthesimulationparameters,createsthemesh,setstheinitialconditions,runsthetime-steppingloopforupdatingthepressureandvelocityfields,andwritestheresultstoaVTKfile.#Finally,thescriptchecksifitisbeingrunasthemainmoduleandcallsthemain()function.#Thecodeisstructuredandwritteninawaythatitcanbeeasilymodifiedtoaccommodatedifferentsimulationparametersorotherboundaryconditions.注意!正如我上面提到的,你不应该直接信任来自ChatGPT的代码。生成的代码必须逐行追踪,并且在使用前必须经过验证和测试。这只是一个说明性的例子,用来展示到目前为止这个工具能走多远。VisualChat-GPT在CFD中的应用你可能听说过,Visual-ChatGPT是ChatGPT架构的一个最新扩展,专门设计用来根据视觉输入(如图像或视频)生成自然语言文本。该模型是在大量图像-标题对的数据集上训练的,每张图像都与一个或多个描述图像内容的自然语言标题相关联。到目前为止,Visual-ChatGPT在生成图像的自然语言描述、回答视觉场景的问题,甚至根据文本描述生成新图像方面,都显示出了非常令人印象深刻的结果。这些能力可能在优化CFD模拟中的网格时非常有用,例如,允许用户使用自然语言文本描述几何形状,结果将是:基于这些描述生成高质量的网格🤯这将是CFD领域真正的游戏规则改变者。例如,你可以提供所需的网格特性描述,如“一个高质量的网格,具有统一的单元大小和低畸变,集中在锐利边缘周围的区域,并在靠近墙壁的地方至少生成15层棱柱层”,Visual-ChatGPT可以生成满足这些要求的相应网格。这可以帮助简化网格生成过程,使其更容易为非专家使用,同时也提高了CFD模拟的准确性和效率。另一个特性可能是提供网格的快照,并要求在某些区域提高质量。或者输入一个网格图片,比如说2D网格,然后让ChatGPT为这个网格生成一个可定制的脚本。再次强调,这只是一个语言模型。因此,请记住,生成高质量的网格不仅需要描述所需的网格特性,还需要理解被模拟的物理几何和流场,这可能需要事先在网格生成方面拥有现有的专业知识。如何更好使用ChatGPT1)记住,这是一个AI语言模型!这意味着什么?这意味着,尽管这个工具非常能够生成优化的基于文本的输出,但它仍然容易"出错"。2)请记住,ChatGPT以块结构化的方式工作,这意味着你必须逐步构建块才能得到你需要的东西。如果你从一个非常详细的问题开始,提出一个高度技术性的问题,它可能会给你一个非常通用的答案(这里我指的是它可能给出的最通用的答案)。相反,给出你来自哪里和你去哪里的想法(介绍性背景-->明确定义的问题-->有用的答案)。3)你必须充分意识到ChatGPT不是谷歌那样的搜索引擎。除了每个工具给出的单一/多重输出外,ChatGPT基于它的训练数据和它接收到的输入。也就是说,除非你用正确的输入喂养它,否则ChatGPT不会给你你寻求的效率-你需要具体(记住我们关于注意力基础变换器的话)。假设你需要知道你想承担的项目预算的大致估计。不要输入像“为巧克力工厂的平面设计项目可能的预算是多少”这样的内容,你需要更详细,并为模型提供“参数”,以便它考虑计算你项目的预算。你可以写一些像“我是一名有XX年经验的平面设计师,我即将承担一个为巧克力工厂设计标志的项目。这个标志需要以动画版本交付,可能需要像Adobe软件包这样的复杂工具。设计可能需要一个高规格的图形卡进行渲染。考虑到设计可能需要多次迭代直到最终标志被同意,你能给我一个这个项目应该花费多少的大致估计吗”。4)为了最大限度地利用ChatGPT(如第2点所述),你需要花些时间首先了解你的情况。当ChatGPT在任何领域通过复制粘贴的方式使用时,这是毫无意义的。5)你必须意识到,除了ChatGPT可能存在的文字/编码错误外,它也可能给出不完整的答案(特别是当你的输入不足时)-因为简单地说,它没有足够的数据来知道你想知道什么。来源:CFD饭圈

未登录
还没有评论
课程
培训
服务
行家
VIP会员 学习 福利任务 兑换礼品
下载APP
联系我们
帮助与反馈