标签: fortran90

从fortran调用C的open()函数时文件权限不正确

我有一个fortran程序调用C函数并使用open()打开一个文件

main.f90时:

PROGRAM TEST

    integer                        :: oflag, mode

    !Set oflag to O_CREAT|O_RDWR
    oflag = 66   
    mode = 600 

    call test2("test.txt", oflag, mode)

END PROGRAM
Run Code Online (Sandbox Code Playgroud)

test.c的:

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/types.h>

#pragma weak test2_     = test2
#pragma weak test2__    = test2
#pragma weak TEST2      = test2

void test2(char* filename, int* flag, int* mode)
{
    int fd; 
    if(-1 == (fd = open(filename, *flag, *mode)))
        puts("Returned -1");
}
Run Code Online (Sandbox Code Playgroud)

我编译为:

gcc -c test.c
gfortran main.f90 test.o
Run Code Online (Sandbox Code Playgroud)

当我运行程序时,它会创建文件test.txt,但权限不正确:

---x--x--T 1 xyz users …
Run Code Online (Sandbox Code Playgroud)

fortran gfortran fortran90

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

在读取数据时出错

我有一个数据文件,其中以这种方式填充数据

1 2 3 4 5 6 7 8 9 10
11 12 13 14 15 16 17 18 19 20
    .
    .

    .

    .
    .
91 92 93 94 95 96 97 98 99 100
Run Code Online (Sandbox Code Playgroud)

我想将这些数据存储在(10,10)的矩阵中,这是我的程序

program test
integer j,n,m
character,dimension(10,10) ::text
character*50 line
open(unit=3,file="tmp.txt",status='old')
n=1
read(3,"(a50)"),line

read(line,*,end=1),(text(1,i),i=1,10)
1 read(3,"(a50)",end=3),line
n=n+1
read(line,*,end=1)(text(n,i),i=i,10)

3 close(3)

end program test
Run Code Online (Sandbox Code Playgroud)

但我没有得到正确的价值观.

fortran fortran90

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

Fortran可分配的数组生命周期

说我有以下代码:

program test
  call foo
  call foo
contains
  subroutine foo
    integer(8),dimension(:),allocatable:: var1
    allocate(var1(10))
    ...
    return
  end subroutine foo
end
Run Code Online (Sandbox Code Playgroud)

变量var1会被分配两次吗?(我猜是).如果为每个呼叫分配,第一次呼叫期间分配的内存是否会空闲?

fortran memory-management dynamic-memory-allocation fortran90 fortran95

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

Fortran 90代码是否总能与Fortran 95编译器配合使用?

我们有一个用Fortran 90编写的复杂程序,我只能找到Fortran 95编译器.不幸的是,我的访问和体验有限,但需要立即了解问题.

Fortran 90代码是否总能使用Fortran 95编译器(例如gfortran)正确编译?

fortran fortran90 fortran95

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

为什么这个Fortran随机数生成器会导致分段错误?

ran0从文本数字食谱中获取了以下功能.我写了自己的程序random2来打电话ran0.

为什么此代码会导致分段错误?谢谢你的时间.

FUNCTION ran0(idum)
  INTEGER idum,IA,IM,IQ,IR,MASK
  REAL ran0,AM
  PARAMETER (IA=16807,IM=2147483647,AM=1./IM,IQ=127773,IR=2836,MASK=123459876)
  INTEGER k
  idum=ieor(idum,MASK)
  k=idum/IQ
  idum=IA*(idum-k*IQ)-IR*k
  if (idum.lt.0) idum=idum+IM
  ran0=AM*idum
  idum=ieor(idum,MASK)
  return
END FUNCTION

PROGRAM random2
  IMPLICIT NONE
  REAL :: ran0
  PRINT *, ran0(6)
END PROGRAM
Run Code Online (Sandbox Code Playgroud)

fortran fortran90

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

将通用块转换为模块

我是使用Fortran编写的程序的研究员。我具有非常基本的编码技能,因此需要一些帮助来使一些代码正确编译。

在显示代码之前,我将提供一些背景知识。我正在处理大量数据,这将需要64位编译和大于2 gb的内存。我在代码中注意到的第一件事是,许多变量被写为“实数”,但是在我的研究中,我发现“双精度”允许更大的变量,并且将是一个更灵活的选择,因此我更改了所有从“真实”变量到“双精度”变量。

fortran构建文件“ dist.f”的编译中还包含一个文件,称为“ geocoord.inc”。我发现变量已保存到一个公共块中,但是再一次,我需要一些可以容纳大量数据的东西。正如我一直相信的那样,模块将是一个更好的程序。在转换此包含文件以使其与模块程序正常工作时,我需要一些建议,我将在下面列出。

Dist.f:

c Convert latitude and longitude to kilometers relative
c to center of coordinates by short distance conversion.

subroutine dist(xlat, xlon, xkm, ykm)

implicit none

c   Parameters:
double precision    xlat, xlon  ! (input)
double precision        xkm, ykm    ! (output)

c   Local variables:
double precision lat1, lat2, lat3
double precision    q
double precision    xx
double precision    yp

include "geocoord.inc"

c Set up short distance conversion by subr. SETORG
  q=60*xlat-olat
  yp=q+olat
  lat1=datan(rlatc*dtan(RAD*yp/60.0))
  lat2=datan(rlatc*dtan(RAD*OLAT/60.0))
  LAT3=(LAT2+LAT1)/2.
  xx=60*xlon-olon  ! …
Run Code Online (Sandbox Code Playgroud)

fortran module double-precision fortran90 fortran-common-block

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

如何与gfortran一起编译f77和f90文件

我有几十个f77函数的文件,我想将它们包含在我的f90程序中.我如何与gfortran一起带来它?如果我只是尝试

gfortran myprogram.f90
Run Code Online (Sandbox Code Playgroud)

它抱怨其他文件中的f77代码.据我所知,它希望看到所有文件都符合明确的标准(f90的f77).

fortran gfortran fortran77 fortran90

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

FFT:fortran与python

我有fortran代码计算离散信号的FFT(具有两个不同频率的双正弦信号),从以下提取:

y = 0.5*np.sin(2 * np.pi * ff1 * t) + 0.1*np.sin(2 * np.pi * ff2 * t)

当我使用fortran代码计算FFT并且与使用python计算的FFT进行比较时,我可以看到:

1.两个图中的选秀权的差异是由于四舍五入?我可以以某种方式消除或减少它吗?

FFT python

python中使用的代码是:

import numpy as np
import matplotlib.pyplot as plt
from scipy import fft

Fs = 2048    # sampling rate = number of lines in the input file
Ts = 1.0/Fs  # sampling interval
data = np.loadtxt('input.dat')
t =  data[:,0]
y    = data[:,1]

plt.subplot(2,1,1)
plt.plot(t,y,'ro')
plt.xlabel('time')
plt.ylabel('amplitude')
plt.subplot(2,1,2)

n = len(y)                       # length of the signal
k = np.arange(n)
T …
Run Code Online (Sandbox Code Playgroud)

python fortran fft gfortran fortran90

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

如果阵列等级/大小可用,是否有任何理由使用假定大小的数组?

如果我知道传递给函数或子例程的数组的等级和/或大小,是否有任何理由使用假定形状或假定大小的数组?例如,如果我可以替换

function f(a,m,n)
   real,dimension(*),intent(inout) :: a
   ! ...
end function
Run Code Online (Sandbox Code Playgroud)

function f(a,m,n)
    real,dimension(m,n),intent(inout) :: a
    ! ...
end function
Run Code Online (Sandbox Code Playgroud)

是否有任何理由(在Fortran 90或更高版本中)不这样做?

arrays fortran multidimensional-array fortran90

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

选择数组中的10个最大值

我想在fortran 90中选择数组中的10个最大值(size~1e9元素).这样做的最有效时间是什么?我正在研究有效的排序算法,它是要走的路吗?我需要对整个阵列进行排序吗?

sorting algorithm fortran quicksort fortran90

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