相关疑难解决方法(0)

在Fortran中正确使用模块,子例程和函数

我最近在向Fortran程序添加函数时学习了tinterface块.一切都很好,整洁,但现在我想在接口块中添加第二个功能.

这是我的界面块:

interface
    function correctNeighLabel (A,i,j,k)
    integer :: correctNeighLabel
    integer, intent(in) :: i,j,k
    integer,dimension(:,:,:),intent(inout) :: A
    end function

    function correctNeighArray (B,d,e,f)
        character :: correctNeighArray
    integer, intent(in) :: d,e,f
    character, dimension(:,:,:),intent(inout) :: B
    end function
end interface
Run Code Online (Sandbox Code Playgroud)

在我看来,这可能不是最好的选择.

我已经研究过子程序,但我不太相信它是正确的解决方案.我正在做的是相对简单的,我需要将参数传递给子例程,但我看到的所有子例程都是a)复杂的(即函数太复杂),和b)不接受参数,它们表现得好像他们操纵变量而不将它们传递给它们.

我没有真正正确地研究模块,但从我所看到的不适合使用的模块.

我应该在哪个时候使用,以及如何最好地使用它?

fortran module function subroutine fortran90

28
推荐指数
3
解决办法
4万
查看次数

计算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 77子程序作为独立程序,从C++调用

所以我一直在像瘟疫一样避开Fortran,但最后我的时间到了......我需要参与其他人的Fortran代码(让我们称之为程序A)并用它做两件事:

(1)将其与第三人的Fortran代码合并(让我们称之为程序B),以便B可以调用A

(2)将它与我的C++代码(程序C)合并,以便C可以调用A.

B和C是优化算法,A是基准函数的集合......但在所有可怕的事情发生之前,我必须首先编译我需要的A部分.我需要的所有A子程序都包含在一个文件中.我已根据我上网的信息(例如在代码中添加"IMPLICIT NONE"并使其适合gfortran)进行了整形.但是我有两个顽固的错误和一个警告(我会留下另一个帖子的警告).

这是我目前正在编译它的方式(通过Makefile):

all:
    gfortran progA.FOR
    g++ -c progC.cpp
    g++ -o Program.out progA.o progC.o
    rm *.o
Run Code Online (Sandbox Code Playgroud)

但第一行未能完成以下错误,

第一个错误:

SUBROUTINE TP1(MODE)
1
Error: Unclassifiable statement at (1)
Run Code Online (Sandbox Code Playgroud)

相关代码(从文件顶部开始):

      IMPLICIT NONE  
      INTEGER    NMAX,MMAX,LMAX,MNNMAX,LWA,LIWA,LACTIV,N,NILI,NINL,
     /           NELI,NENL,NEX, MODE              
      PARAMETER (NMAX   = 101, 
     /           MMAX   = 50, 
     /           LMAX   = 50, 
     /           MNNMAX = NMAX + NMAX + MMAX + 2,
     /           LWA    = 2*NMAX*NMAX + 33*NMAX + 10*MMAX + 200,
     /           LIWA   = MMAX + NMAX + 150,
     /           LACTIV = …
Run Code Online (Sandbox Code Playgroud)

c++ fortran compiler-errors

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