在fortran 77中求和数组的值

时间:2014-01-23 15:54:19

标签: arrays sum subroutine fortran77

我正在编写一个程序,以最小化四参数最小二乘拟合的卡方。我有很多问题,但现在程序一直给我同样的三个问题,我的子程序调用; " Assignment.f:12.25:

  REAL sum0,sum1,sum2,sumWt0,sumWt,sumWt2                           
                     1

Assignment.f:48.72:

  CALL sum2(sumWt2,Wt2)                                             
                                                                    2

错误:' sum2' at(1)的类型与(2)"的CALL不一致。 代码如下:

      PROGRAM assignment

      ! A program designed to fit experiemental data, using the method
      ! of least squares to minimise the associated chi-squared and
      ! obtain the four control parameters A,B,h1 and h2.
      !*****************************************************************

      IMPLICIT NONE
      INTEGER i,t0
      REAL t(17),t2(17),Ct(17),eCt(17),W(17),Wt0(17),Wt(17),Wt2(17)
      REAL A,B,h1,h2,Cs,matrix(2:2),inverse(2:2)
      REAL sum0,sum1,sum2,sumWt0,sumWt,sumWt2

      OPEN(21, FILE='data.txt', STATUS='OLD')
      DO i=1,17
         READ (21,*)t(i),Ct(i),eCt(i)
      END DO
      CLOSE(21)

      !*****************************************************************
      OPEN(21, FILE='outtest.txt', FORM='FORMATTED', STATUS='NEW')
      DO i=1,17
         WRITE(21,*)t(i),Ct(i),eCt(i)
      END DO
      CLOSE(21)

      !Just to check input file is being read correctly.
      !*****************************************************************


      DO i= 1,17,1

      t0= 1

      t2(i)= (t(i))**2
      W(i)= 1/(eCt(i))**2
      Wt0(i)= W(i)*t0
      Wt(i)= W(i)*t(i)
      Wt2(i)= W(i)*t2(i)

      !The above calculates Wt2, Wt and Wt0 for data.txt
      END DO

      CALL sum0(sumWt0,Wt0)
      WRITE(*,*) 'sumWt0=', sumWt0
      CALL sum1(sumWt,Wt)
      WRITE(*,*) 'sumWt=', sumWt
      CALL sum2(sumWt2,Wt2)
      WRITE(*,*) 'sumWt2=', sumWt2

      END

      !Assign weighted t values to the A matrix
      !*****************************************************************


      !*****************************************************************
      !****************************FUNCTIONS****************************
      !*****************************************************************

      !*****************************************************************
      REAL FUNCTION sum0(sumWt0,Wt0)
      IMPLICIT NONE
      INTEGER i,t0
      REAL sumWt0,Wt0(17),eCt(17),W(17)

      W(i)= 1/((eCt(i))**2)

      DO i= 1,17,1
      t0= 1

      Wt0(i)= W(i)*t0
      END DO


      SumWt0= 0.0
      DO 10 i=1,17
         sumWt0= sumWt0 + Wt0(i)
 10   CONTINUE

      RETURN
      END
      !Function used to sum weighted values of t^0
      !*****************************************************************


      !*****************************************************************
      DOUBLE PRECISION FUNCTION sum1(sumWt,Wt)
      IMPLICIT NONE
      INTEGER i, t(17)
      DOUBLE PRECISION sumWt,Wt(17),eCt(17),W(17)

      W(i)= 1/((eCt(i))**2)

      DO i= 1,17,1

      Wt(i)= W(i)*t(i)
      END DO


      SumWt= 0.0
      DO 10 i=1,17
         sumWt= sumWt + Wt(i)
 10   CONTINUE

      RETURN
      END
      !Function used to sum weighted values of t^0
      !*****************************************************************


      !*****************************************************************
      DOUBLE PRECISION FUNCTION sum2(sumWt2,Wt2)
      IMPLICIT NONE
      INTEGER i,t2(17)
      DOUBLE PRECISION sumWt2,Wt2(17),eCt(17),W(17)

      W(i)= 1/((eCt(i))**2)

      DO i= 1,17,1

      Wt2(i)= W(i)*t2(i)
      END DO


      SumWt2= 0.0
      DO 10 i=1,17
         sumWt2= sumWt2 + Wt2(i)
 10   CONTINUE

      RETURN
      END
      !Function used to sum weighted values of t^0
      !*****************************************************************

不知道为什么一直这样做。

2 个答案:

答案 0 :(得分:2)

你为什么要打电话?您正在撰写诸如

之类的陈述
CALL sum2(sumWt2,Wt2)

sum2被声明为

DOUBLE PRECISION FUNCTION sum2(sumWt2,Wt2)

CALL仅适用于子程序。如果您不理解子例程和函数之间的区别,请返回教科书或其他喜欢的教程资源,并重新阅读相关章节。在Fortran中,函数返回一个值,通常用于赋值的rhs,例如

mysum = sum2(values)

除了这种混淆之外,您在程序开头声明sum2REAL类型,然后定义同名的double precision函数。我怀疑这种不一致可能是您报告错误消息的直接原因。

现在它看起来像是在尝试编写超出当前功能的程序。忘掉它,直到你可以写一个函数(这是我建议的)或一个子程序来返回一个值为1的数组之和。换句话说,写一个FORTRAN77函数来实现Fortran 90 sum内在的禁果。

如果您再次编辑问题,请确保:

  • 所有代码都被格式化为代码,现在有格式化为文本的杂散语句;
  • 删除continue语句,将其替换为end do;
  • 删除所有多余的空格和星号行,它们无助于我们阅读和理解您的代码;
  • 使用缩进使您和我们的代码结构清晰;如果您觉得受到转换为固定格式源的作业条款的限制,请执行此操作,但请向我们显示缩进代码。

答案 1 :(得分:0)

您收到了哪些错误消息?编译器是否接受DO 10"循环"中的多行语句? (不需要第6列延续标记?),你还在做什么?我认为你只需在上面的1..17循环中粘贴一个sumWt0 = sumWt0 + Wt0(i)(我认为这是一个错字,你在尝试使用sumWt0(*)时它是一个错误标量)。

PROGRAM test

IMPLICIT NONE
INTEGER i,t0
REAL t(17),Ct(17),eCt(17),W(17),Wt0(17),sumWt0,sum0

OPEN(21, FILE='data.txt', STATUS='OLD')
DO i=1,17
  READ (21,*)t(i),Ct(i),eCt(i)
END DO
CLOSE(21)

SumWt0 = 0.0
DO i= 1,17
  t0= 1            ' What is the purpose of this?

  Wt0(i)=W(i)*t0
  SumWt0 = SumWt0 + Wt0(i)

END DO


WRITE(*,*) 'sumWt0=', sumWt0

STOP
END