具有显式双精度的 Fortran 数组

Fortran array with explicit double precision

首先,我想说我对 Fortran 77 的经验很少。

我发现 this code 存在精度问题。它对 igrf12syn 子例程中的所有变量使用 implicit double precision (a-h,o-z) 定义。

但是,在尝试调试此代码时,我注意到大多数值在某些时候会失去精度,因此在静态定义末尾使用终止符 D0 可以解决此问题。

但是我如何定义我的维度变量 gh 的值是明确的双倍?我试图在数据声明中的静态值末尾添加 D0,但出现编译器错误。

编辑:

Compiler error after adding the "d0" to the end of a value.

请注意,将 "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

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

这里有两点需要注意。值 1900 不是数组的一部分。第 72 个字符是最后一个逗号,这些剩余数字将被截断。其次,当您将 D0 添加到这些数字时,您将最后一个实际值推到第 72 列之后,然后将其截断,现在您的值比变量少。

要解决此问题,您可以使用编译器选项增加固定格式的行长度,但您需要确保尾随值(例如 1900)仍被截断。或者,您可以用更多的续行重组数据声明,以使其全部符合 72 列的限制。无论您选择做什么,都需要确保 1900 个值超出列限制或将其全部删除。