首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用递推回路计算fortran中的压力

用递推回路计算fortran中的压力
EN

Stack Overflow用户
提问于 2022-02-11 20:07:21
回答 1查看 88关注 0票数 0

对fortran来说很新鲜而且感觉很迷茫。我想做的是根据初始大气压计算水深处的压力。然后,每一种压力都将基于之前的压力。每一步深度将增加(-5)。编译器不喜欢z(i)=(0:5: -50 )的符号,我的意思是“从0跳到-50跳-5”。

这一过程需要在5种不同的初始大气压下重复。怎样才能将这些信息组织成要打印的列呢?

这看起来是实现这一目标的合理方式吗?

非常感谢!

代码语言:javascript
运行
复制
       program pressure
       real pk(11), zp(11), g, rz,z,dz, p_atm
       g= 9.81
       z(i)=(0:5:-50)
       dz= -5
       p_atm= (/0.97, 1.02, 1.04, 1.03, 1.01/)
       
       do 
         i= 1,11
         d= z(i)
         
         if(d.GT.-10.0) then
           rz= 1020.0
         elseif(d.LT.-10.0 .and. d.GT.-50.0) then 
           rz= 1020.0+(0.25*(ABS(d+10.0)))
     
         if d == 0
           p(i)= -(((-rz*g)*dz))+p_atm)
         else
           p(i)= -(((-rz*g)*dz))+p(i-1)
         
         endif

       open(20,file='pressure.txt', status='unknown')
       rewind(20)
       write(20,25) 'Model Day', '1', '2', '3', '4', '5'
       write(20,26) 'Patm (10^5 Pa)', '0.97', '1.02', '1.04', '1.03', '1.01'
  26   format(a14,12F9.2)
  25   format(a10,12F9.0)
EN

回答 1

Stack Overflow用户

发布于 2022-02-12 10:21:17

好吧,我们从上面走吧。

  1. 始终使用implicit none。如果你不使用implicit none,那你就是会有臭虫
  2. 你的缩进看起来有点像固定形式的fortran,但是你实际上使用的是自由形式的fortran (我们在2022年,每个人都应该使用自由形式的fortran),所以缩进应该是一致的。
  3. 您没有end program行或enddo行,大概是因为这只是一段代码片段。
  4. 正如VladimirF所指出的,do i=1,11行必须是一行,而不是两行。

让我们先修复这些,给

代码语言:javascript
运行
复制
program pressure
  implicit none
  
  real pk(11), zp(11), g, rz,z,dz, p_atm
  
  g= 9.81
  z(i)=(0:5:-50)
  dz= -5
  p_atm= (/0.97, 1.02, 1.04, 1.03, 1.01/)
  
  do i= 1,11
    d= z(i)
    
    if(d.GT.-10.0) then
      rz= 1020.0
    elseif(d.LT.-10.0 .and. d.GT.-50.0) then 
      rz= 1020.0+(0.25*(ABS(d+10.0)))
     
    if d == 0
      p(i)= -(((-rz*g)*dz))+p_atm)
    else
      p(i)= -(((-rz*g)*dz))+p(i-1)
    endif

    open(20,file='pressure.txt', status='unknown')
    rewind(20)
    write(20,25) 'Model Day', '1', '2', '3', '4', '5'
    write(20,26) 'Patm (10^5 Pa)', '0.97', '1.02', '1.04', '1.03', '1.01'
    26   format(a14,12F9.2)
    25   format(a10,12F9.0)
  enddo
end program

好吧,现在我们可以试着编译,看看会发生什么。编译器将对我们大喊大叫,原因如下:

  1. 变量idp尚未声明。
  2. z(i)要么是函数调用,要么是数组元素访问(从上下文来看,您想要后者),但是z被定义为标量变量,而不是函数或数组。
  3. p_atm被初始化为数组,但被声明为标量。您还试图将p_atm添加为标量,所以让我们在这些压力上添加一个循环。
  4. ifendif语句不匹配;您需要endif您的第一个if块。
  5. 您的格式字符串不匹配:您正在打印字符串,但将它们格式化为浮点数('0.97'是字符串,0.97是浮点数)。
  6. 第二个if语句需要有适当的括号和一个then
  7. 在第一个p(i)=...行中,您关闭的括号比打开的要多。我得在这里猜一下。
  8. 比较d==0是一个非常糟糕的主意。永远不要把浮标比作平等。,让我们用i==1代替它。

好吧,让我们解决这些问题:

代码语言:javascript
运行
复制
program pressure
  implicit none
  
  real pk(11), zp(11), g, rz, z(11), dz, p_atm(5), p(11), d
  integer i,j
  
  g= 9.81
  z(i)=(0:5:-50)
  dz= -5
  p_atm= (/0.97, 1.02, 1.04, 1.03, 1.01/)
  
  do j=1,5
    do i= 1,11
      d= z(i)
      
      if(d.GT.-10.0) then
        rz= 1020.0
      elseif(d.LT.-10.0 .and. d.GT.-50.0) then 
        rz= 1020.0+(0.25*(ABS(d+10.0)))
      endif
     
      if (i == 1) then
        p(i)= -(((-rz*g)*dz))+p_atm(j)
      else
        p(i)= -(((-rz*g)*dz))+p(i-1)
      endif
      
      open(20,file='pressure.txt', status='unknown')
      rewind(20)
      write(20,'(a14,5a9)') 'Model Day', '1', '2', '3', '4', '5'
      write(20,'(a14,5a9)') 'Patm (10^5 Pa)', '0.97', '1.02', '1.04', '1.03', '1.01'
    enddo
  enddo
end program

好了,现在我们开始初始化z。最简单的方法是使用一个简单的循环:

代码语言:javascript
运行
复制
do i=1,11
  z(i) = 5-5*i
enddo

但是如果你想花掉它,你可以使用隐式do循环

代码语言:javascript
运行
复制
z = [(5-5*i, i=1, 11)]

此外,给定输出文件头,为ij的所有值存储i可能是有意义的,所以让它成为一个2D数组。在计算了p的所有值之后,让我们将文件写入移到。然后,在进行一些现代化的过程中,您的程序看起来如下:

代码语言:javascript
运行
复制
program pressure
  implicit none
  
  real :: pk(11), zp(11), g, rz, z(11), dz, p_atm(5), p(11,5), d
  integer :: i,j
  
  g = 9.81
  z = [(5-5*i, i=1, 11)]
  dz = -5
  p_atm = [0.97, 1.02, 1.04, 1.03, 1.01]
  
  do j=1,5
    do i=1,11
      d = z(i)
      
      if (d > -10.0) then
        rz = 1020.0
      elseif (d < -10.0 .and. d > -50.0) then 
        rz = 1020.0 + 0.25*abs(d+10.0)
      endif
     
      if (i == 1) then
        p(i,j) = -(-rz*g*dz)+p_atm(j)
      else
        p(i,j) = -(-rz*g*dz)+p(i-1,j)
      endif
    enddo
  enddo
  
  open(20, file='pressure.txt', status='unknown')
  write(20,'(a14,5a9)') 'Model Day', '1', '2', '3', '4', '5'
  write(20,'(a14,5a9)') 'Patm (10^5 Pa)', '0.97', '1.02', '1.04', '1.03', '1.01'
  do i=1,11
    write(20,'(5f9.2)') p(i,:)
  enddo
  close(20)
end program
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71085991

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档