我有以下命令来设置我的数组
Use, Intrinsic :: iso_fortran_env
Integer (Int8), Allocatable :: iu(:)
Allocate (iu(4))
iu = [4,3,2,1]
Run Code Online (Sandbox Code Playgroud)
我怎么能阻止编译器给我
Allocate (iu(4)); iu = [4,3,2,1]
1
Warning: Possible change of value in conversion
from INTEGER(4) to INTEGER(1) at (1) [-Wconversion]
Run Code Online (Sandbox Code Playgroud) 我需要将Fortran代码转换为C++代码,我有以下问题:
我正在尝试计算一个R12用Fortran 77和C++语言命名的double值,但是我获得了两个彼此非常接近的值但具有两个不同的精度.这是我的Fortran代码:
R12 = sqrt(95699.68D0+1123.6D0*flx) - 408.99D0
Run Code Online (Sandbox Code Playgroud)
与double flx = 192.9D0.我获得的价值是R12 = 149.97522253177789
我用C++做同样的事情:
R12 = sqrt(95699.68+1123.6*flx) - 408.99 ;
Run Code Online (Sandbox Code Playgroud)
我在这里获得的价值是R12 = 149.97522253177794.
你们能帮助我找到这种差异的来源,因为对我的工作来说,确保精确度非常重要
我想通过矩阵并检查它的任何块是否与预定义单位相同.这是我的代码.'sd5'是2乘2的预定义单位.
ALLOCATE (fList((n-1)**2,3))
fList = 0
p = 1
DO i = 1, n-1, 1
DO j = 1, n-1, 1
IF (TEST(i:i+1, j:j+1) == sd5) THEN
fList(p,1:3) = (i, j+1, 101) ! 101 should be replaced by submatrix number
END IF
p = p+1
END DO
END DO
Run Code Online (Sandbox Code Playgroud)
问题似乎在IF声明中,因为返回了四个逻辑语句TEST(i:i+1, j:j+1) == sd5.我收到此错误:
Error: IF clause at (1) requires a scalar LOGICAL expression
Run Code Online (Sandbox Code Playgroud)
我收到另一个错误:
fList(p,1:3) = (i, j+1, 101) ! 101 should be replaced by sub …Run Code Online (Sandbox Code Playgroud) 值selected_int_kind(int16)显示为1而不是2.这是编译器错误吗?
在下面的输出中请注意其差异bint是2个字节,INT16.(为清楚起见,添加了注释<===.)
compiler version = GCC version 5.1.0
compiler options = -fPIC -mmacosx-version-min=10.9.4 -mtune=core2 -Og -Wall -Wextra -Wconversion -Wpedantic -fcheck=bounds -fmax-errors=5
execution command = ./a.out
Number of bytes in type default = 4
Number of bytes in type int_8 = 1
Number of bytes in type int_16 = 2 <===
Number of bytes in type int_32 = 4
Number of bytes in type int_64 = 8
Number of bytes in type int_a = 1 …Run Code Online (Sandbox Code Playgroud) 我有几十个f77函数的文件,我想将它们包含在我的f90程序中.我如何与gfortran一起带来它?如果我只是尝试
gfortran myprogram.f90
Run Code Online (Sandbox Code Playgroud)
它抱怨其他文件中的f77代码.据我所知,它希望看到所有文件都符合明确的标准(f90的f77).
我对Fortran的典型使用始于读取未知大小的文件(通常为5-100MB).我目前的数组分配方法涉及读取文件两次.首先确定问题的大小(分配数组),然后第二次将数据读入这些数组.
是否有更好的尺寸确定/阵列分配方法?我刚刚阅读了另一篇文章中的自动数组分配(例如下面的例子),这看起来更容易.
array = [array,new_data]
Run Code Online (Sandbox Code Playgroud)
有哪些选择及其优缺点?
我正在将FORTRAN代码转换为C++.在理解FORTRAN代码的同时,我在FORTRAN中遇到了以下代码片段.
DIMENSION X(50),Y(50),PARA(6,9)
DIMENSION AMPA(12),FCUR(20),VER(20),AMPS(20)
Run Code Online (Sandbox Code Playgroud)
据我所知,DIMENSION在FORTRAN中不需要任何数据类型.但是我无法理解X,Y,PARA等的默认数据类型.默认情况下它是整数吗?
我正在尝试对旧代码进行现代化(或者至少让它更容易理解)但是我已经遇到了一个奇怪的格式,对于一个呃,FORMAT语句.
具体来说,它是一个FORMAT带有Hollerith常量的声明(nHwhere n是一个数字):
FORMAT(15H ((C(I,J),J=1,I3,12H),(D(J),J=1,I3, 6H),I=1,I3,') te'
1,'xt' )
Run Code Online (Sandbox Code Playgroud)
这与语法突出显示混淆,因为它看起来有未闭括号.它使用这种格式语句编译得很好,但是关闭括号会导致编译错误(使用intel或gfortran编译器).
据我了解,Hollerith常量是Fortran 66的一个生物,并且被CHARACTERFortran 77中的出现所取代.我通常在用作类似角色的东西时理解它们,但是用作FORMAT混淆我.
此外,如果我15H ((...改为15H ((...(即我删除一个空格),它将无法编译.事实上,即使我将代码更改为此代码,它也无法编译:
FORMAT(15H ((C(I,J),J=1,I3,12H),(D(J),J=1,I3, 6H),I=1,I3,') text' )
Run Code Online (Sandbox Code Playgroud)
我希望这是一个更正常(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) 我正在尝试分析MPI/OpenACC Fortran代码.我找到了一个网站,详细说明如何在这里使用MPI运行nvprof .给出的示例适用于OpenMPI.但是,我仅限于MPICH,我无法弄清楚它的等价物.谁知道它会是什么?