You need to enable JavaScript to run this app. Fortran高斯烟羽模型代码do循环仅执行第一步卡住问题排查
优惠活动
大模型
产品
解决方案
定价
更多

Fortran高斯烟羽模型代码do循环仅执行第一步卡住问题排查

问题原因定位
  • 赋值顺序错误
    你在代码中先执行了dy = dx、dz = dx,之后才给dx赋值为2 * kx * t。此时dx未初始化,值为内存随机数,极大概率出现无效浮点数(比如极大值、NaN),导致后续计算卡死。
  • 整数除法错误
    代码中(1/2)是整数运算,Fortran中整数相除结果会截断为整数,最终得到的结果是0而非预期的0.5,会导致所有f2计算结果恒为exp(0) = 1,属于逻辑错误。
  • 输出格式冗余导致写入速度极慢
    你使用了F50.48的输出格式,要求每个浮点数输出48位小数,但单精度REAL类型的有效位数仅为6~7位,冗余的格式会让单次写入的内容大幅增加。你的三层循环总执行次数为101 * 101 * 51 = 520251次,过慢的写入速度会让程序看起来处于卡住状态。
  • 逻辑缺失(非卡死直接原因,但不符合高斯烟羽计算要求)
    你的三层循环中x变量完全没有参与浓度计算,标准高斯烟羽模型的扩散参数σy、σz都和下风距离x相关,当前代码所有x位置的浓度输出完全一致,不符合需求。
修复后的参考代码
PROGRAM plume
IMPLICIT NONE
REAL,PARAMETER :: pi=3.141592, q=1000, u=5, t=10, &
                  kx=1, ky=1, kz=1
REAL :: dx, dy, dz, f2, C
INTEGER :: x, y, z
! 声明函数返回值类型
REAL :: f1

! 先给dx赋值,再给dy、dz赋值
dx = (2 * kx * t)
dy = dx
dz = dx

OPEN(10, file='./results/plume.txt')
! 修改输出格式为合理范围
WRITE(10,'(3(A4),2(x,A15))') "x","y","z", "f2", "C"

PRINT*, "f1=", f1(q,pi,u,dx)

DO x = 0, 1000, 10
 ! 可在这里补充σy、σz和x的关联逻辑,比如 sigma_y = ky*sqrt(real(x)) 之类的,根据你的模型调整
 DO y = -500,500,10 
  DO z = 0,500,10 
   ! 把1/2改成1.0/2.0,用浮点数运算
   f2 = exp( -(1.0/2.0) * ( ( (real(y)**2.) + (real(z)**2.) ) / dx ) ) 
   C = f1(q,pi,u,dx) * f2
   ! 修改输出格式为合理的浮点格式
   WRITE(10,'(3(I4),2(x,E15.7))') x, y, z, f2, C
  END DO
 END DO
END DO
     

END PROGRAM


FUNCTION f1(q,pi,u,dx)
IMPLICIT NONE
REAL :: q, pi, u
REAL :: f1, dx
 f1 = q / (2 * pi * u * dx)
END FUNCTION f1

内容的提问来源于stack exchange,提问作者won

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.19 13:15:05