对fortran来说很新鲜而且感觉很迷茫。我想做的是根据初始大气压计算水深处的压力。然后,每一种压力都将基于之前的压力。每一步深度将增加(-5)。编译器不喜欢z(i)=(0:5: -50 )的符号,我的意思是“从0跳到-50跳-5”。
这一过程需要在5种不同的初始大气压下重复。怎样才能将这些信息组织成要打印的列呢?
这看起来是实现这一目标的合理方式吗?
非常感谢!
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)发布于 2022-02-12 10:21:17
好吧,我们从上面走吧。
implicit none。如果你不使用implicit none,那你就是会有臭虫。end program行或enddo行,大概是因为这只是一段代码片段。do i=1,11行必须是一行,而不是两行。让我们先修复这些,给
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好吧,现在我们可以试着编译,看看会发生什么。编译器将对我们大喊大叫,原因如下:
i、d和p尚未声明。z(i)要么是函数调用,要么是数组元素访问(从上下文来看,您想要后者),但是z被定义为标量变量,而不是函数或数组。p_atm被初始化为数组,但被声明为标量。您还试图将p_atm添加为标量,所以让我们在这些压力上添加一个循环。if和endif语句不匹配;您需要endif您的第一个if块。'0.97'是字符串,0.97是浮点数)。if语句需要有适当的括号和一个then。p(i)=...行中,您关闭的括号比打开的要多。我得在这里猜一下。d==0是一个非常糟糕的主意。永远不要把浮标比作平等。,让我们用i==1代替它。好吧,让我们解决这些问题:
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。最简单的方法是使用一个简单的循环:
do i=1,11
z(i) = 5-5*i
enddo但是如果你想花掉它,你可以使用隐式do循环
z = [(5-5*i, i=1, 11)]此外,给定输出文件头,为i和j的所有值存储i可能是有意义的,所以让它成为一个2D数组。在计算了p的所有值之后,让我们将文件写入移到。然后,在进行一些现代化的过程中,您的程序看起来如下:
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 programhttps://stackoverflow.com/questions/71085991
复制相似问题