标签: fortran90

返回数组策略比较

在Fortran中,我可以使用三种方法从子例程返回数组.第一个是通过intent(out)参数.第二个是通过具有阵列的函数result.第三个是具有作为result指向数组的指针的函数,该函数在函数中分配.

每种方法的优点和缺点是什么?

fortran fortran90

7
推荐指数
1
解决办法
4679
查看次数

从Fortran90中的文本文件中略过一行

我写的是fortran(90).我的程序必须读取file1,对它的每一行做一些事情并将结果写入file2.但问题是 - file1在第一行有一些不需要的信息.

如何使用Fortran从输入文件中跳过一行?

代码:

open (18, file='m3dv.dat')
open (19, file='m3dv2.dat')
do
  read(18,*) x
  tmp = sqrt(x**2 + 1)
  write(19, *) tmp
end do
Run Code Online (Sandbox Code Playgroud)

第一行是文本和数字的组合.

fortran fortran90

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

Fortran中的深层阵列副本

我需要Fortran(90)中的(真实)数组的深层副本,但我不确定如何获得一个,因为我不完全理解引用是如何工作的.直观地说,我希望这能得到我想要的东西:

do i=1,n
  b(i) = a(i)
end do
Run Code Online (Sandbox Code Playgroud)

但是,最近我向我指出这b(1:n) = a(1:n)相当于上面的代码.直观地说,我希望这b(1:n) = a(1:n)只会导致引用b(1:n)指向a(1:n)内存中的位置.

b(1:n) = a(1:n)深刻的副本?为什么?与基础参考相反的是b = a什么?

arrays fortran fortran90

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

包含陈述

我不了解FORtran 90 中CONTAINS语句的重要性

例如

PROGRAM BLABLA

IMPLICIT NONE

INTEGER :: i,j,k

i = 1; j = 1;k =1

PRINT *, i,j,k

CALL ABC(i,j,k)

PRINT *, i,j,k

CONTAINS

    SUBROUTINE ABC(r,s,t)

    IMPLICIT NONE

    INTEGER, INTENT(IN) :: r,s
    INTEGER, INTENT(OUT) :: t

    t = r + s

   END SUBROUTINE ABC
END PROGRAM BLABLA
Run Code Online (Sandbox Code Playgroud)

一种是通过在主程序之外定义子例程。我知道对于函数来说,需要指定函数的类型,但是对于子例程则不需要。我有兴趣了解这样做是否还有其他警告?

PROGRAM BLABLA

IMPLICIT NONE

INTEGER :: i,j,k

i = 1; j = 1;k =1

PRINT *, i,j,k

CALL ABC(i,j,k)

PRINT *, i,j,k

END PROGRAM BLABLA

SUBROUTINE ABC(r,s,t) …
Run Code Online (Sandbox Code Playgroud)

fortran contains subroutine fortran90

7
推荐指数
1
解决办法
5050
查看次数

从Julia调用Fortran子程序.数组工作,但整数不工作

我有这个简单的Fortran 90程序:

subroutine apc_wrapper(i, j, k)
implicit none

integer*8, intent(in) :: i, j
integer*8, intent(out) :: k
double precision t

k = i + js 
end subroutine
Run Code Online (Sandbox Code Playgroud)

编译为共享库

gfortran -O2 -shared -fPIC apc_wrapper.f90 -o apc_wrapper.so
Run Code Online (Sandbox Code Playgroud)

现在,我想从Julia调用这个子例程,带有所有整数参数,就像这样

i = 2
j = 3
k = 0

ccall( (:apc_wrapper_, "./apc_wrapper.so"), Void, (Ptr{Int64}, Ptr{Int64}, Ptr{Int64}), &i, &j, &k)
Run Code Online (Sandbox Code Playgroud)

但它不会起作用.k不会改变它的值并继续评估为0.

但是,如果我这样做

 i = 2
 j = 3
 kk = [0]

 ccall( (:apc_wrapper_, "./apc_wrapper.so"), Void, (Ptr{Int64}, Ptr{Int64}, Ptr{Int64}), &i, &j, kk)
Run Code Online (Sandbox Code Playgroud)

也就是说,使用数组存储输出,它的工作原理!调用子例程后,kk …

fortran fortran90 julia

7
推荐指数
1
解决办法
402
查看次数

带有数字/标签的Fortran IF语句而不是另一个语句

这个Fortran代码的含义是什么:

   IF (J1-3) 20, 20, 21
21 J1 = J1 - 3
20 IF (J2-3) 22, 22, 23
23 J2 = J2 - 3
22 CONTINUE
Run Code Online (Sandbox Code Playgroud)

我在旧项目中看到过,我不知道带有数字(标签)的IF是什么意思.

fortran fortran90

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

将数据写入列中的文件(Fortran)

我需要在Fortran 90中将一些数据写入文件.我应该如何使用WRITE (*,*) input分组的值?总是在每次通话后放一个,这就是问题所在.WRITEnew line

代码示例:

open (unit = 4, file = 'generated_trajectories1.dat', form='formatted')

do time_nr=0, N
   write (4,*) dble(time_nr)*dt, initial_traj(time_nr)
end do
Run Code Online (Sandbox Code Playgroud)

现在重点是将它写在不同的列中.

formatting file-io fortran fortran90

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

可以使用GDB在Fortran 90中打印派生类型的可分配数组的值吗?

我在Fortran90程序中有以下数据结构:

TYPE derivedType
  CHARACTER(100)     :: name      = ' '
  INTEGER            :: type      = 0
  REAL(KIND(1.0D0))  :: property  = 0.0
END TYPE derivedType

TYPE (derivedType), ALLOCATABLE, DIMENSION(:) :: arrayOfDerivedTypes
Run Code Online (Sandbox Code Playgroud)

当我尝试在GDB中调试和打印值时:

(gdb) p arrayOfDerivedTypes(1)%name
Run Code Online (Sandbox Code Playgroud)

我得到非敏感值(通常为零,正斜杠和字母串)或完全错误的值(如arrayOfDerivedTypes(1)%name = 9,当我知道它是= 2时).如何让GDB打印正确的值?

背景

我知道:

我不想经历编译GDB的单独分支以测试它是否解决了这个问题的麻烦,如果有人已经知道它不会或者是否有更好的解决方案可用.

我很难想象还没有解决方案.fortran社区没有更好的免费调试器解决方案吗?

fortran gdb gfortran fortran90 derived-types

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

Fortran 中函数返回值的直接索引

是否有可能直接在函数的返回值上使用索引?像这样的东西:

readStr()(2:5)
Run Code Online (Sandbox Code Playgroud)

wherereadStr()是一个返回字符串或数组的函数。在许多其他语言中,这是很有可能的,但是 Fortran 呢?我的示例中的语法当然无法编译。有没有其他语法可以使用?

fortran fortran90 fortran2003

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

Fortran DO循环,警告仅使用整数

我在我的Ubuntu 15.04系统上安装了gfortran.在编译Fortran代码时,DO循环仅要求获取整数参数,而不是实数值或变量.这包括循环变量和步骤表达式.为什么它也不能采取真正的价值观呢?

以下是从这里开始的程序,练习3.5的嵌套do循环部分.

        program  xytab
        implicit none
        !constructs a table of z=x/y for values of x from 1 to 2 and 
        !y from 1 to 4 in  steps of .5
        real         ::   x, y, z 
        print *, '           x           y           z'
        do  x = 1,2
            do y = 1,4,0.5
                z = x/y
                print *, x,y,z
            end do
        end  do
        end  program xytab
Run Code Online (Sandbox Code Playgroud)

编译后显示的错误是:

xytab.f95:8.4:

 do y = 1,4,0.5
    1
Warning: Deleted feature: Loop variable at (1) …
Run Code Online (Sandbox Code Playgroud)

fortran gfortran fortran90 fortran95

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