haw*_*aii 3 arrays precision double fortran dimension
首先,我想说我对Fortran 77的经验很少.
我发现此代码存在精度问题.它使用子例程implicit double precision (a-h,o-z)内所有变量的定义igrf12syn.
但是,在尝试调试此代码时,我注意到大多数值在某些时候会丢失精度,并且在静态定义结束时使用终结符D0可以解决此问题.
但是,如何定义维度变量gh上的值是否显式加倍?我试图在数据声明中的静态值的末尾添加D0,但是我遇到了编译器错误.
编辑:
将"d0"添加到值的末尾后编译器错误.
请注意,将"d0"添加到数组外部的代码中的其他值时不会发生此错误.
igrf.f:527.10:
data g0/ -31543.d0,-2298., 5922., -677., 2905.,-1061., 924., 1121
1
Error: DATA statement at (1) has more variables than values
Run Code Online (Sandbox Code Playgroud)
TL/DR; Fortran代码存在精度问题,我需要将D0添加到代码中静态定义值的末尾.但是,当将D0添加到数组内的值时,我遇到了编译器错误.
你的问题是由于固定格式Fortran的约束,它只允许72行的字符.例如,请参阅g0源中的处理方式:
dimension gh(3451),g0(120) !... more declarations cut from this
c
data g0/ -31543.,-2298., 5922., -677., 2905.,-1061., 924., 1121., 1900
1 1022.,-1469., -330., 1256., 3., 572., 523., 876., 1900
2 628., 195., 660., -69., -361., -210., 134., -75., 1900
3 -184., 328., -210., 264., 53., 5., -33., -86., 1900
4 -124., -16., 3., 63., 61., -9., -11., 83., 1900
5 -217., 2., -58., -35., 59., 36., -90., -69., 1900
6 70., -55., -45., 0., -13., 34., -10., -41., 1900
7 -1., -21., 28., 18., -12., 6., -22., 11., 1900
8 8., 8., -4., -14., -9., 7., 1., -13., 1900
9 2., 5., -9., 16., 5., -5., 8., -18., 1900
a 8., 10., -20., 1., 14., -11., 5., 12., 1900
b -3., 1., -2., -2., 8., 2., 10., -1., 1900
c -2., -1., 2., -3., -4., 2., 2., 1., 1900
d -5., 2., -2., 6., 6., -4., 4., 0., 1900
e 0., -2., 2., 4., 2., 0., 0., -6./ 1900
!23456789012345678901234567890123456789012345678901234567890123456789012XXXXX
! 1 2 3 4 5 6 7 XXXXX
Run Code Online (Sandbox Code Playgroud)
这里需要注意两件事.这些值1900不是数组的一部分.第72个字符是最后一个逗号,这些剩余的数字被截断.其次,当您添加D0到这些数字时,您将推送经过第72列的最后一个实际值,然后将其截断,现在您的值比变量少.
要解决此问题,您可以使用编译器选项增加固定格式的行长度,但是您需要确保尾随值(例如1900)仍然被截断.或者,您可以使用更多延续行重新构建数据声明,以使其全部符合72列限制.无论您选择做什么,您都需要确保1900值超出列限制或全部删除.