我有一个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) 我有一个数据文件,其中以这种方式填充数据
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)
但我没有得到正确的价值观.
说我有以下代码:
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
我们有一个用Fortran 90编写的复杂程序,我只能找到Fortran 95编译器.不幸的是,我的访问和体验有限,但需要立即了解问题.
Fortran 90代码是否总能使用Fortran 95编译器(例如gfortran)正确编译?
我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编写的程序的研究员。我具有非常基本的编码技能,因此需要一些帮助来使一些代码正确编译。
在显示代码之前,我将提供一些背景知识。我正在处理大量数据,这将需要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
我有几十个f77函数的文件,我想将它们包含在我的f90程序中.我如何与gfortran一起带来它?如果我只是尝试
gfortran myprogram.f90
Run Code Online (Sandbox Code Playgroud)
它抱怨其他文件中的f77代码.据我所知,它希望看到所有文件都符合明确的标准(f90的f77).
我有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.两个图中的选秀权的差异是由于四舍五入?我可以以某种方式消除或减少它吗?
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) 如果我知道传递给函数或子例程的数组的等级和/或大小,是否有任何理由使用假定形状或假定大小的数组?例如,如果我可以替换
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或更高版本中)不这样做?
我想在fortran 90中选择数组中的10个最大值(size~1e9元素).这样做的最有效时间是什么?我正在研究有效的排序算法,它是要走的路吗?我需要对整个阵列进行排序吗?