运行我的代码(使用gfortran编译)时,我得到fortran运行时警告"创建了一个数组临时",我想知道是否有更好的方法来解决此警告.
我的原始代码是这样的:
allocate(flx_est(lsign,3))
allocate(flx_err(lsign,3))
do i=1,lsign
call combflx_calc(flx_est(i,:),flx_err(i,:))
enddo
Run Code Online (Sandbox Code Playgroud)
在子例程中我定义了这样的变量:
subroutine combflx_calc(flx_est,flx_err)
use,intrinsic :: ISO_Fortran_env, only: real64
implicit none
real(real64),intent(inout) :: flx_est(3),flx_err(3)
Run Code Online (Sandbox Code Playgroud)
flux_est并且flx_err矢量可能会在子程序内部发生变化,具体取决于几个条件,我需要相应地更新它们的值.
Fortran似乎不喜欢这种结构.我可以解决它定义临时变量:
tmp_flx_est=flx_est(i,:)
tmp_flx_err=flx_err(i,:)
call combflx_calc(tmp_flx_est,tmp_flx_err)
flx_est(i,:)=tmp_flx_est
flx_err(i,:)=tmp_flx_err
Run Code Online (Sandbox Code Playgroud)
但在我看来,修复它是一种非常愚蠢的方式.
你可能已经看到我不是Fortran的专家,所以任何帮助都非常受欢迎.
我想计算Fortran 90中两个向量的叉积.例如,在单词中,(1,2,3)和(4,5,6)的叉积结果为(-3,6, -3)在笛卡尔坐标系中.我编写了以下代码(主程序后跟函数定义):
PROGRAM crosstest
IMPLICIT NONE
INTEGER, DIMENSION(3) :: m, n
INTEGER, DIMENSION(3) :: cross
INTEGER, DIMENSION(3) :: r
m=(/1, 2, 3/)
n=(/4, 5, 6/)
r=cross(m,n)
END PROGRAM crosstest
FUNCTION cross(a, b)
INTEGER, DIMENSION(3) :: cross
INTEGER, DIMENSION(3), INTENT(IN) :: a, b
cross(1) = a(2) * b(3) - a(3) * b(2)
cross(2) = a(3) * b(1) - a(1) * b(3)
cross(3) = a(1) * b(2) - a(2) * b(1)
END FUNCTION cross
Run Code Online (Sandbox Code Playgroud)
但是,我收到一条错误消息:
crosstest.f90:10.9:
r=cross(m,n)
1
Error: Rank mismatch …Run Code Online (Sandbox Code Playgroud) 我正在开发一个需要在FORTRAN中实现很少数值方法的项目.为此,我需要编写一些递归函数.这是我的代码.
!
! File: main.F95
!
RECURSIVE FUNCTION integrate(n) RESULT(rv)
IMPLICIT NONE
DOUBLE PRECISION :: rv
INTEGER, INTENT(IN) :: n
DOUBLE PRECISION, PARAMETER :: minusone = -1.0
IF (n == 1) THEN
rv = 10 !exp(minusone)
RETURN
ELSE
rv = 1 - (n * integrate(n - 1))
RETURN
END IF
END FUNCTION integrate
RECURSIVE FUNCTION factorial(n) RESULT(res)
INTEGER res, n
IF (n .EQ. 0) THEN
res = 1
ELSE
res = n * factorial(n - 1)
END IF
END
PROGRAM …Run Code Online (Sandbox Code Playgroud) 我刚刚在这里阅读了关于在Fortran中使用模块的正确方法的非常好的问题/答案.通过在模块中编写子程序,除了澄清代码之外,还可以使它们显式化.
据我所知,模块必须放在一个文件中,例如"mod_exemple.f90".我编写的程序通常很长,许多子程序确实可以按目的排序,因此可以放在模块中.问题是:那会有很长的模块文件,有数百行.
你能把模块拆分成几个文件吗?是否建议?为什么?你有其他拆分的建议吗?
我在fortran中有一个分段错误问题.我通过调用子程序来分配一个指针数组,并将该数组传递给另一个子程序.
我在Linux机器上用PGI fortran 9.0.2编译这个程序.这是我的测试程序.我该如何解决这个问题?
非常感谢您的帮助.
module hogehoge
implicit none
type foo
real, pointer :: x(:)=>null()
end type foo
contains
subroutine hogehoge_func(foox)
type(foo), intent(inout) :: foox
integer i
allocate(foox%x(2048))
do i = 1, 2048
foox%x(i)=i
end do
end subroutine hogehoge_func
end module hogehoge
!main program------------------------------------------
program test
use hogehoge
implicit none
type(foo) :: foox
call hogehoge_func(foox)
print*, 'in main program'
print*, foox%x(1:20)
call hoge(foox%x)
end program test
subroutine hoge(foox)
use hogehoge
implicit none
type(foo), intent(in) :: foox
print*, 'in subroutine'
print*, …Run Code Online (Sandbox Code Playgroud)