问题描述
我想将此Matlab代码转换为Fortran代码。我在这里提供了Matlab和Fortran的代码。参数也在此处给出。
Matlab代码
L_10 = 1.0e-10;
e = 0.4;
n = 100000;
R = 3.1e+5;
K0_10 = 1.0e-10;
Ci = 1.0e-15;
zv = 1.2;
Dv = 1
Rho = 2.0e-4
dt = 0.01
for i=1:n
L_10(i+1) = L_10(i) + dt*(e*K0_10- R*L_10(i)*Ci- zv*Dv*L_10(i)*Rho);
end
我已经编写了以下Fortran代码,但是它不起作用
real,dimension (:),allocatable:: L_10
real,parameter :: e = 0.4
integer,parameter :: n = 100000
real,parameter :: R = 3.1e+5
real,parameter :: K0_10 = 1.0e-10
real,parameter :: Ci = 1.0e-15
real,parameter :: zv = 1.2
real,parameter :: Dv = 1.0
real,parameter :: Rho = 2.0e-4
real,parameter :: dt = 0.01
integer:: i
do i=1:n
L_10(i+1) = L_10(i) + dt*(e*K0_10- R*L_10(i)*Ci- zv*Dv*L_10(i)*Rho);
end
如何在Fortran代码中初始化数组值?迭代如何在Fortran中工作?在Matlab中效果很好。
解决方法
我可以立即看到Fortran的两个问题。您已选择使L_10
可以分配,但是代码没有分配它。您可以通过将其声明更改为
real,dimension (n+1) :: L_10
如果选择此方法,则必须将声明移动到n
本身声明之后,否则编译器将无法使用正向声明。另一种选择是保留声明不变,但插入语句
allocate(L_10(n+1))
在声明之后但在您尝试首先使用数组之前。查看文档中的allocate
语句,并了解如何在出现问题的情况下报告状态代码。
然后您可以按照与Matlab中相同的方式设置所有元素的值,
L_10 = 1.0e-10
您对do
语句的语法有误,应该以该行开头
do i = 1,n
使用Matlab使用冒号的逗号。
在Fortran中可能还存在其他一些我尚未发现的问题,但是您的编译器将为您提供帮助。
,Fortran中的该程序产生的输出与Matlab中的输出相同。数组的迭代在Fortran中的do循环中有所不同,如下所示。迭代被保存在Fortran中而不建立索引,但是在Matlab中,它是按照Matlab代码中所示的索引来完成的。
program oneDimention
implicit none
integer,parameter :: n = 10
real,dimension (n):: L_10
real,parameter :: e = 0.4
real,parameter :: R = 3.1e+5
real,parameter :: K0_10 = 1.0e-10
real,parameter :: Ci = 1.0e-15
real,parameter :: zv = 1.2
real,parameter :: Dv = 1.0
real,parameter :: Rho = 2.0e-4
real,parameter :: dt = 0.01
integer:: i
L_10 = 1.0e-10
do i=1,n
L_10 = L_10(i) + dt*(e*K0_10- R*L_10(i)*Ci- zv*Dv*L_10(i)*Rho);
print*,L_10(i)
end do
end program oneDimention