Fortran Coder

标题: 定义了一个方程,怎么ivf还说我没有初值呢 [打印本页]

作者: renlu617    时间: 2014-10-25 18:41
标题: 定义了一个方程,怎么ivf还说我没有初值呢
这是错误类型:
这是错误的程序:
[Fortran] 纯文本查看 复制代码
C     **************************************************************************
      SUBROUTINE CANOPY (DOY, MAXHT, RELHT, MAXLAI, MXMAI,RELLAI,RELMAI,
     *    SNOW,SNODEN, MXRTLN, MXKPL, CS, DENSEF, HEIGHT, LAI, SAI,
     *   MAI, RTLEN,  RPLANT)
C     canopy parameters
      IMPLICIT NONE
C     input
         INTEGER DOY      ! day of year (first day of DFILE and run)"
         REAL    MAXHT    ! maximum height for the year, m, minimum of 0.01 m
         REAL   RELHT(*)  ! ten pairs of DOY and relative canopy height
         REAL   MAXLAI    ! maximum projected leaf area index for the year,m2/m2
         REAL   MXMAI
         REAL   RELLAI(*) ! ten pairs of DOY and relative LAI
         REAL   RELMAI(*)
         REAL   SNOW      ! water equivalent of snow on the ground, mm
         REAL   SNODEN    ! snow density, mm/mm
         REAL   MXRTLN    ! maximum root length per unit land area, m/m2
         REAL   MXKPL     ! maximum plant conductivity, (mm/d)/MPa
         REAL   CS        ! ratio of projected SAI to canopy height, m-1
         REAL   DENSEF    ! density factor
C     output
         REAL   HEIGHT    ! canopy height above any snow, m, minimum of 0.01 m
         REAL   LAI       ! leaf area index, m2/m2, minimum of 0.00001
         REAL   SAI       ! stem area index, m2/m2
         REAL   MAI
         REAL   RTLEN     ! root length per unit land area, m/m2
         REAL   RPLANT    ! plant resistivity to water flow, MPa d/mm
C     local
         REAL   SNODEP    ! snow depth
         REAL   HNOSNO    ! height of canopy without snow
         REAL   HSNO      ! height of canopy above snow
         REAL   RATIO     ! fraction of canopy above snow
         REAL   RELHIT    ! RELHT for DOY
         REAL   KPL       ! plant conductivity, mm d-1 MPa-1
C     intrinsic
C        REAL, MAX
C     external functions needed
         REAL   INTERP
C
      RELHIT = INTERP(10, RELHT, REAL(DOY))
      SNODEP = .001 * SNOW / SNODEN
      HNOSNO = MAX(.01, RELHIT * MAXHT)
      HSNO = MAX(0., HNOSNO - SNODEP)
      RATIO = HSNO / HNOSNO
      HEIGHT = MAX(.01, HSNO)
C
      LAI = RATIO * DENSEF * INTERP(10, RELLAI, REAL(DOY)) * MAXLAI
      SAI = DENSEF * CS * HEIGHT
      MAI = INTERP(10, RELMAI, REAL(DOY)) * MXMAI
      IF (LAI .LT. .00001) LAI = .00001
C
      RTLEN = DENSEF * RELHIT * MXRTLN
      KPL = DENSEF * RELHIT * MXKPL
      IF (KPL .LT. 1E-08) KPL = 1E-08
      RPLANT = 1. / KPL
C
      END

    FUNCTION INTERP (NPAIRS, FUNCT, XVALUE)
C     interpolates between points in data functions
      IMPLICIT NONE
C     input
         INTEGER NPAIRS  ! number of pairs of values to be used
         REAL    FUNCT(*)! array of pairs of values: x1, y1, x2, y2, ...
         REAL    XVALUE  ! x value
C     output
         REAL    INTERP  ! y value
C     local
         INTEGER    I, J ! DO indexes
         REAL XX(1:10) ! Cseries of x values of FUNCT
         REAL YY(1:10) ! Cseries of y values of FUNCT
C
C     put FUNCT into XX and YY
      I = 0
      DO 10 j = 1, 2 * NPAIRS - 1, 2
         I = I + 1
         XX(I) = FUNCT(j)
         YY(I) = FUNCT(j + 1)
   10 CONTINUE
C     interpolate using XX and YY
      DO 20 j = 1, NPAIRS
         IF (XVALUE .EQ. XX(j)) THEN
            INTERP = YY(j)
            RETURN
         ELSEIF (XVALUE .LT. XX(j)) THEN
            INTERP = YY(j - 1) + (XVALUE - XX(j - 1)) *
     *         (YY(j) - YY(j - 1)) / (XX(j) - XX(j - 1))
            RETURN
         ELSE
         END IF
   20 CONTINUE
      END


QQ截图20141025184322.jpg (95.42 KB, 下载次数: 364)

QQ截图20141025184322.jpg

作者: 楚香饭    时间: 2014-10-25 19:34
可能是 interp 函数里的循环(81-91行)始终没有满足条件。于是 interp 没有值就返回了。
作者: 百事可乐    时间: 2014-10-27 15:30
这不是说你没定义哦,这是说这个变量没有值.

没有定义,一定是编译错误.
没有值,一定是运行时错误
作者: renlu617    时间: 2014-10-28 10:39
楚香饭 发表于 2014-10-25 19:34
可能是 interp 函数里的循环(81-91行)始终没有满足条件。于是 interp 没有值就返回了。 ...

应该满足了,我在xp里的ivf跑就没有问题,移植到win7就不行了,说interp没定义
作者: 楚香饭    时间: 2014-10-28 11:01
1.我和百事可乐都告诉你了,这不是没定义,而是没有初值。请不要只顾自己说,完全不管别人的回复。
2.再次强调,你的代码不足,无法调试。
3.请自行 debug,看是否满足了。如何 debug 请阅读 http://debug.w.fcode.cn
作者: renlu617    时间: 2014-10-28 11:19
我看了看函数中的变量值已经读取了,另外我怎么把主程序发给你?行数比较多

123.jpg (401.25 KB, 下载次数: 376)

123.jpg

作者: renlu617    时间: 2014-10-28 11:21
楚香饭 发表于 2014-10-28 11:01
1.我和百事可乐都告诉你了,这不是没定义,而是没有初值。请不要只顾自己说,完全不管别人的回复。
2.再次 ...

哥们,您看这种情况下是不是RELMAI有初始值了?
作者: 楚香饭    时间: 2014-10-28 12:21
我建议你学习一下 debug ,下个断点一跟踪 ,立即可以得出是否有值。

如要给长代码,可直接上传附件。
作者: renlu617    时间: 2014-10-28 14:29
这是所有的源代码

b90v4.zip

405.15 KB, 下载次数: 5


作者: renlu617    时间: 2014-10-28 14:37
楚香饭 发表于 2014-10-28 12:21
我建议你学习一下 debug ,下个断点一跟踪 ,立即可以得出是否有值。

如要给长代码,可直接上传附件。 ...

我传了程序的源代码,按照网页说的进行了逐句调试,可是输出值确实很大,而且每次我在运行之前都要加上/check:uninit.  不知道是不是必须要这是调试出的断点数据:
作者: renlu617    时间: 2014-10-28 14:37
这是断点输出的数据

345.jpg (184.16 KB, 下载次数: 289)

345.jpg

作者: fcode    时间: 2014-10-28 15:45
PET.for 文件42行,50行,55行。
类似这种调用语句:
RELHIT = INTERP(10, RELHT(20), REAL(DOY))
是否应该是
RELHIT = INTERP(10, RELHT, REAL(DOY))




欢迎光临 Fortran Coder (http://bbs.fcode.cn/) Powered by Discuz! X3.2