相关疑难解决方法(0)

Fortran运行时警告:临时数组

运行我的代码(使用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的专家,所以任何帮助都非常受欢迎.

warnings fortran temporary gfortran

8
推荐指数
2
解决办法
3213
查看次数

计算Fortran 90中两个向量的叉积

我想计算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 function cross-product

7
推荐指数
2
解决办法
2万
查看次数

FORTRAN功能

我正在开发一个需要在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)

recursion fortran function fortran95

6
推荐指数
2
解决办法
1万
查看次数

多个文件中的单个fortran模块

我刚刚在这里阅读了关于在Fortran中使用模块的正确方法的非常好的问题/答案.通过在模块中编写子程序,除了澄清代码之外,还可以使它们显式化.

据我所知,模块必须放在一个文件中,例如"mod_exemple.f90".我编写的程序通常很长,许多子程序确实可以按目的排序,因此可以放在模块中.问题是:那会有长的模块文件,有数百行.

你能把模块拆分成几个文件吗?是否建议?为什么?你有其他拆分的建议吗?

fortran module file explicit-interface

3
推荐指数
1
解决办法
2022
查看次数

指针数组中的Fortran分段错误

我在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)

fortran segmentation-fault

0
推荐指数
1
解决办法
672
查看次数