找回密码
 注册
Simdroid-非首页
查看: 198|回复: 15

[3. Fortran] 请大虾帮忙看看77的程序,哪里错了?谢谢

[复制链接]
发表于 2008-9-12 08:21:54 | 显示全部楼层 |阅读模式 来自 上海
c        bearing type:        tilting pad.4pads
c        !LBP(load between pad)                                
c        !L/D ratio:        0.5                                
c        !special items                                       
c        !mp:        0                                
c        !β:        80                                
c        !α/β:        0.5  
      program tilt4no24
      IMPLICIT REAL*8 (A-H)
        IMPLICIT REAL*8 (O-Z)
        INTEGER I
      DIMENSION T1K11(24), T1K12(24), T1K21(24), T1K22(24), T1B11(24), T
     &1B12(24), T1B21(24), T1B22(24), ETH(24), QS(24), Qe(24), fJΨ(24)
c     DATA(ETH(I),I=1,24)/S1,ETH1,S2,ETH2,...,S12,ETH12/
C     DATA(QS(I),I=1,24)/S1,QS1,S2,QS2,...,S12,QS12/
C     DATA(Qe(I),I=1,24)/S1,QE1,S2,QE2,...,S12,QE12/        
C     DATA(fJΨ(I),I=1,24)/S1,fJΨ1,S2,fJΨ2,...,S12,fJΨ12/
C     DATA(T1K11(I),I=1,24)/S1,T1K111,S2,T1K112,...,S12,T1K1112)
C        DATA(T1K22(I),I=1,24)/S1,T1K221,S2,T1K222,...,S12,T1K2212)
C        DATA(T1B11(I),I=1,24)/S1,T1B111,S2,T1B112,...,S12,T1B1112)
C        DATA(T1B22(I),I=1,24)/S1,T1B221,S2,T1B222,...,S12,T1B2212)     
      DATA (ETH(I),I=1,23,2)/5.76,2.68,1.59,1.05,0.756,0.55,0.381,0.259,
     &0.168,0.103,0.0576,0.0277/
      DATA (ETH(I),I=2,24,2)/0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1,1.1,1
     &.2/
      DATA (QS(I),I=1,23,2)/5.76,2.68,1.59,1.05,0.756,0.55,0.381,0.259,
     &0.168,0.103,0.0576,0.0277/
      DATA (QS(I),I=2,24,2)/0.459,0.803,1.07,1.26,1.34,1.35,1.39,1.39,1.
     &39,1.35,1.27,1.14/
      DATA (Qe(I),I=1,23,2)/5.76,2.68,1.59,1.05,0.756,0.55,0.381,0.259,
     &0.168,0.103,0.0576,0.0277/
      DATA (Qe(I),I=2,24,2)/5.71,5.13,4.59,4.09,3.67,3.24,2.82,2.4,1.99,
     &1.59,1.2,0.817/
      DATA (fJΨ(I),I=1,23,2)/5.76,2.68,1.59,1.05,0.756,0.55,0.381,0.259
     &,0.168,0.103,0.0576,0.0277/
        DATA (fJΨ(I),I=2,24,2)/54.3,27.4,17.7,12.9,10.3,8.39,6.64,5.27,4.
     &1,3.14,2.34,1.65/
        DATA (T1K11(I),I=1,23,2)/5.76,2.68,1.59,1.05,0.756,0.55,0.381,0.25
     &9,0.168,0.103,0.0576,0.0277/
        DATA (T1K11(I),I=2,24,2)/0.901,1.22,1.46,1.68,1.94,2.26,2.65,3.15,
     &3.72,4.47,5.63,7.83/
        DATA (T1K22(I),I=1,23,2)/5.76,2.68,1.59,1.05,0.756,0.55,0.381,0.25
     &9,0.168,0.103,0.0576,0.0277/
        DATA (T1K22(I),I=2,24,2)/0.901,1.22,1.46,1.68,1.94,2.26,2.65,3.15,
     &3.72,4.47,5.63,7.83/
      DATA (T1B11(I),I=1,23,2)/5.76,2.68,1.59,1.05,0.756,0.55,0.381,0.25
     &9,0.168,0.103,0.0576,0.0277/
        DATA (T1B11(I),I=2,24,2)/10.8,6.03,4.37,3.61,3.33,3.21,3.06,3.01,2
     &.97,2.99,3.11,3.05/
        DATA (T1B22(I),I=1,23,2)/5.76,2.68,1.59,1.05,0.756,0.55,0.381,0.25
     &9,0.168,0.103,0.0576,0.0277/
        DATA (T1B22(I),I=2,24,2)/10.8,6.03,4.37,3.61,3.33,3.21,3.06,3.01,2
     &.97,2.99,3.11,3.05/
C
        WRITE(*,*) "INPUT A SOMFELD NUMBER:"
        READ(*,*) S0
        do I=1,23,2
        IF ((S0 .GE. ETH(I)).AND.(SS.LE.ETH(I+2)))THEN
        call subroutine LINEAR_EVALU(S0,ETH(I),ETH(I+1),ETH(I+2),ETH(I+3),
     &FUNC)
        ELSE
         EXIT
        ENDIF
        END DO
        stop
        end
c        线形插值
        SUBROUTINE LINEAR_EVALU(S0,FUNC1,FUNC2,FUNC3,FUNC4,FUNC)
        implicit none
        real FUNC1,FUNC2,FUNC3,FUNC4,S0   
        real FUNC        !  插出来的值
        
        FUNC=FUNC2+(FUNC4-FUNC2)/(FUNC3-FUNC1)*(S0-FUNC1)
        WRITE(*,*)  FUNC
        RETURN
        END SUBROUTINE LINEAR_EVALU

[ 本帖最后由 wxj2002 于 2008-9-12 08:25 编辑 ]
 楼主| 发表于 2008-9-12 08:22:35 | 显示全部楼层 来自 上海
Simdroid开发平台
--------------------Configuration: cz - Win32 Debug--------------------
Compiling Fortran...
G:\Project\HQ600MW453\TILT4NO24.for
G:\Project\HQ600MW453\TILT4NO24.for(13) : Error: Unrecognized token '&' skipped
     &1B12(24), T1B21(24), T1B22(24), ETH(24), QS(24), Qe(24), fJΨ(24)
-----------------------------------------------------------------^
G:\Project\HQ600MW453\TILT4NO24.for(13) : Error: Syntax error, found '.' when expecting one of: ( [
     &1B12(24), T1B21(24), T1B22(24), ETH(24), QS(24), Qe(24), fJΨ(24)
------------------------------------------------------------------^
G:\Project\HQ600MW453\TILT4NO24.for(34) : Error: Unrecognized token '&' skipped
      DATA (fJΨ(I),I=1,23,2)/5.76,2.68,1.59,1.05,0.756,0.55,0.381,0.259
--------------^
G:\Project\HQ600MW453\TILT4NO24.for(34) : Error: Syntax error, found '.' when expecting one of: ( , % . =
      DATA (fJΨ(I),I=1,23,2)/5.76,2.68,1.59,1.05,0.756,0.55,0.381,0.259
---------------^
G:\Project\HQ600MW453\TILT4NO24.for(36) : Error: Unrecognized token '&' skipped
DATA (fJΨ(I),I=2,24,2)/54.3,27.4,17.7,12.9,10.3,8.39,6.64,5.27,4.
----------------^
G:\Project\HQ600MW453\TILT4NO24.for(36) : Error: Syntax error, found '.' when expecting one of: ( , % . =
DATA (fJΨ(I),I=2,24,2)/54.3,27.4,17.7,12.9,10.3,8.39,6.64,5.27,4.
-----------------^
Error executing df.exe.

cz.exe - 6 error(s), 0 warning(s)
回复 不支持

使用道具 举报

发表于 2008-9-12 10:15:46 | 显示全部楼层 来自 江苏南京
Ψ不是合法字符吧??
将Ψ替换掉试试,如换成FAI
回复 不支持

使用道具 举报

发表于 2008-9-16 14:03:03 | 显示全部楼层 来自 吉林长春
我觉得是符号“&”放错了位置
应该放在头一句话的后面,而不是下面一句话的前面!
例如:
DIMENSION T1K11(24), T1K12(24), T1K21(24), T1K22(24), T1B11(24), T       &
     1B12(24), T1B21(24), T1B22(24), ETH(24), QS(24), Qe(24), fJΨ(24)
回复 不支持

使用道具 举报

发表于 2008-9-21 10:02:57 | 显示全部楼层 来自 大连理工大学
主要有这么几个问题:
第一:在DIMENSION T1K11(24), T1K12(24), T1K21(24), T1K22(24), T1B11(24), T
     &1B12(24), T1B21(24), T1B22(24), ETH(24), QS(24), Qe(24), fJΨ(24)这句语句中,
应该改成:
      DIMENSION T1K11(24),T1K12(24),T1K21(24),T1K22(24),T1B11(24),
     &T1B12(24),T1B21(24), T1B22(24), ETH(24), QS(24), Qe(24), fJfai(24)
原因如下:T1B11是一个数组,不能用&分割成 T和1B12(24)两部分;fJΨ(24)中Ψ在fortran中是非法字符,须换成fJfai(24),或者是其他的英文字母
第二:问题出现在data语句中:主要是两类问题,1)fortran语句的语句可执行部分只能在7~72列编写,程序中有好多已经超出了这个限制,应该在下一行续行编写,例如:
        DATA (T1K11(I),I=2,24,2)/0.901,1.22,1.46,1.68,1.94,2.26,2.65,3.15,
     &3.72,4.47,5.63,7.83/中3.15,就超出了,应该改为:
        DATA (T1K11(I),I=2,24,2)/0.901,1.22,1.46,1.68,1.94,2.26,2.65,
     &3.15,3.72,4.47,5.63,7.83/
2)还是上面第一中的问题,数字用&分开了,例如:
        DATA (fJfai(I),I=2,24,2)/54.3,27.4,17.7,12.9,10.3,8.39,6.64,5.27,4.
     &1,3.14,2.34,1.65/中4.1就被分开了,应改为:
        DATA (fJfai(I),I=2,24,2)/54.3,27.4,17.7,12.9,10.3,8.39,6.64,5.27,
     &4.1,3.14,2.34,1.65/
第三:SS变量没有赋值就被使用,应该在使用之前进行赋值。例如:
        SS=5.0
        do I=1,21,2
        IF ((S0 .GE. ETH(I)).AND.(SS.LE.ETH(I+2)))THEN
        call LINEAREVALU(S0,ETH(I),ETH(I+1),ETH(I+2),ETH(I+3),

     &FUNC)
        ELSE
         EXIT
        ENDIF
        END DO
第四:call subroutine LINEAR_EVALU(S0,ETH(I),ETH(I+1),ETH(I+2),ETH(I+3),
     &FUNC)一行中,去掉subroutine,这个地方不需要,subroutine是定义子程序的关键字,而call是调用子程序的关键字
回复 不支持

使用道具 举报

发表于 2008-9-21 10:05:06 | 显示全部楼层 来自 大连理工大学
还有一个第五:应该将子程序中的real FUNC1,FUNC2,FUNC3,FUNC4,S0   
        real FUNC        !  插出来的值
两行改成:
   real*8 FUNC1,FUNC2,FUNC3,FUNC4,S0
      real*8 FUNC          !  插出来的值
以保证变量字长相等
回复 不支持

使用道具 举报

发表于 2008-9-21 10:06:21 | 显示全部楼层 来自 大连理工大学
下面是依据上面的几个问题而修改过的程序,这个程序没有问题了,可以直接运行了
c        bearing type:        tilting pad.4pads
c        !LBP(load between pad)                                
c        !L/D ratio:        0.5                                
c        !special items                                       
c        !mp:        0                                
c        !β:        80                                
c        !α/β:        0.5  
      program tilt4no24
      IMPLICIT REAL*8 (A-H)
        IMPLICIT REAL*8 (O-Z)
        INTEGER I
      DIMENSION T1K11(24),T1K12(24),T1K21(24),T1K22(24),T1B11(24),
     &T1B12(24),T1B21(24), T1B22(24), ETH(24), QS(24), Qe(24), fJfai(24)
c     DATA(ETH(I),I=1,24)/S1,ETH1,S2,ETH2,...,S12,ETH12/
C     DATA(QS(I),I=1,24)/S1,QS1,S2,QS2,...,S12,QS12/
C     DATA(Qe(I),I=1,24)/S1,QE1,S2,QE2,...,S12,QE12/        
C     DATA(fJΨ(I),I=1,24)/S1,fJΨ1,S2,fJΨ2,...,S12,fJΨ12/
C     DATA(T1K11(I),I=1,24)/S1,T1K111,S2,T1K112,...,S12,T1K1112)
C        DATA(T1K22(I),I=1,24)/S1,T1K221,S2,T1K222,...,S12,T1K2212)
C        DATA(T1B11(I),I=1,24)/S1,T1B111,S2,T1B112,...,S12,T1B1112)
C        DATA(T1B22(I),I=1,24)/S1,T1B221,S2,T1B222,...,S12,T1B2212)
     
      DATA (ETH(I),I=1,23,2)/5.76,2.68,1.59,1.05,0.756,0.55,0.381,0.259,
     &0.168,0.103,0.0576,0.0277/
      DATA (ETH(I),I=2,24,2)/0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0,
     &1.1,1.2/
      DATA (QS(I),I=1,23,2)/5.76,2.68,1.59,1.05,0.756,0.55,0.381,0.259,
     &0.168,0.103,0.0576,0.0277/
      DATA (QS(I),I=2,24,2)/0.459,0.803,1.07,1.26,1.34,1.35,1.39,1.39,1.
     &39,1.35,1.27,1.14/
      DATA (Qe(I),I=1,23,2)/5.76,2.68,1.59,1.05,0.756,0.55,0.381,0.259,
     &0.168,0.103,0.0576,0.0277/
      DATA (Qe(I),I=2,24,2)/5.71,5.13,4.59,4.09,3.67,3.24,2.82,2.4,1.99,
     &1.59,1.2,0.817/
      DATA (fJfai(I),I=1,23,2)/5.76,2.68,1.59,1.05,0.756,0.55,0.381,
     &0.259,0.168,0.103,0.0576,0.0277/
        DATA (fJfai(I),I=2,24,2)/54.3,27.4,17.7,12.9,10.3,8.39,6.64,
     &5.27,4.1,3.14,2.34,1.65/
        DATA (T1K11(I),I=1,23,2)/5.76,2.68,1.59,1.05,0.756,0.55,0.381,
     &0.259,0.168,0.103,0.0576,0.0277/
        DATA (T1K11(I),I=2,24,2)/0.901,1.22,1.46,1.68,1.94,2.26,2.65,
     &3.15,3.72,4.47,5.63,7.83/
        DATA (T1K22(I),I=1,23,2)/5.76,2.68,1.59,1.05,0.756,0.55,0.381,
     &0.259,0.168,0.103,0.0576,0.0277/
        DATA (T1K22(I),I=2,24,2)/0.901,1.22,1.46,1.68,1.94,2.26,2.65,
     &3.15,3.72,4.47,5.63,7.83/
      DATA (T1B11(I),I=1,23,2)/5.76,2.68,1.59,1.05,0.756,0.55,0.381,
     &0.259,0.168,0.103,0.0576,0.0277/
        DATA (T1B11(I),I=2,24,2)/10.8,6.03,4.37,3.61,3.33,3.21,3.06,
     &3.01,2.97,2.99,3.11,3.05/
        DATA (T1B22(I),I=1,23,2)/5.76,2.68,1.59,1.05,0.756,0.55,0.381,
     &0.259,0.168,0.103,0.0576,0.0277/
        DATA (T1B22(I),I=2,24,2)/10.8,6.03,4.37,3.61,3.33,3.21,3.06,
     &3.01,2.97,2.99,3.11,3.05/
C
        WRITE(*,*) "INPUT A SOMFELD NUMBER:"
        READ(*,*) S0

c        write (*,*) 'ss==',ss
c          pause

c          SS=5.0;S0=5.0
        SS=5.0
        do I=1,21,2
        IF ((S0 .GE. ETH(I)).AND.(SS.LE.ETH(I+2)))THEN
        call LINEAREVALU(S0,ETH(I),ETH(I+1),ETH(I+2),ETH(I+3),

     &FUNC)
        ELSE
         EXIT
        ENDIF
        END DO

        stop
        end


c        线形插值
        SUBROUTINE LINEAREVALU(S0,FUNC1,FUNC2,FUNC3,FUNC4,FUNC)
        implicit none
      real*8 FUNC1,FUNC2,FUNC3,FUNC4,S0
      real*8 FUNC          !  插出来的值
        
c          write (*,*) 'S0,FUNC1,FUNC2,FUNC3,FUNC4=',
c     &S0,FUNC1,FUNC2,FUNC3,FUNC4,FUNC
c      pause

        FUNC=FUNC2+(FUNC4-FUNC2)/(FUNC3-FUNC1)*(S0-FUNC1)
        WRITE(*,*)  FUNC
        RETURN
        END

评分

1

查看全部评分

回复 不支持

使用道具 举报

发表于 2008-9-21 10:17:54 | 显示全部楼层 来自 大连理工大学
其实编制程序很重要的一点是尽量不要犯语法错误,这就要求精通语法规则,一定要首先遵守一个语言的语法规则,上面的程序有好多错误就是语法错误。第二:就是要编制正确的算法,这个比较难一点,要求要很好的数学基础。第三:尽量不要用特别长的程序,或者说利用一个主程序就把所要求解的问题做完(当然非常简单的问题除外),一定要将程序尽可能的简化(主要就是编制一些函数和子程序,尽量让一个子程序或者一个函数就完成一个功能,这样条理清晰,无论是自己看,还是别人看,都会很快读懂一个程序的)。第四:要对程序加载一些注释,并对程序中的关键字有一个统一而易懂的规定,主要是为了程序的继承性和可移植性服务的。第五:在编制程序以前一定要有一个总体的规划,什么地方是子程序,什么地方是函数,要执行什么什么功能,都要有一个清晰的思路。最好是提前划一个程序框图,指导自己编制程序,虽然麻烦一点,但是可以达到事半功倍的效果,不信你就试试。
回复 不支持

使用道具 举报

发表于 2008-9-21 21:02:53 | 显示全部楼层 来自 陕西西安

回复 4# 444444 的帖子

人家告诉你是77的了。
回复 不支持

使用道具 举报

 楼主| 发表于 2008-9-22 09:46:38 | 显示全部楼层 来自 上海
非常感谢zhoulon及各位大虾的帮忙,十分感谢阿!!!
我读书时用过for77,现在工作需要用到,感觉好生疏。
多谢各位了~~~~~建议帮主给杰出贡献者加分阿~
回复 不支持

使用道具 举报

 楼主| 发表于 2008-9-22 10:45:06 | 显示全部楼层 来自 上海
各位的指导收益良多,谢谢
不过程序没有错误和警告了,但是需要的插值FUNC却没输出,大虾再指导一下阿~~~
回复 不支持

使用道具 举报

 楼主| 发表于 2008-9-22 10:57:46 | 显示全部楼层 来自 上海

线性插值,如何显示出插值的结果FUNC呢?

program tilt4no24
      IMPLICIT REAL*8 (A-H)
        IMPLICIT REAL*8 (O-Z)
        INTEGER I
      DIMENSION T1K11(24),T1K12(24),T1K21(24),T1K22(24),T1B11(24),
     &T1B12(24),T1B21(24), T1B22(24), ETH(24), QS(24), Qe(24), fJfai(24)
c     DATA(ETH(I),I=1,24)/S1,ETH1,S2,ETH2,...,S12,ETH12/
C     DATA(QS(I),I=1,24)/S1,QS1,S2,QS2,...,S12,QS12/
C     DATA(Qe(I),I=1,24)/S1,QE1,S2,QE2,...,S12,QE12/        
     
      DATA (ETH(I),I=1,23,2)/5.76,2.68,1.59,1.05,0.756,0.55,0.381,0.259,
     &0.168,0.103,0.0576,0.0277/
      DATA (ETH(I),I=2,24,2)/0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0,
     &1.1,1.2/
      DATA (QS(I),I=1,23,2)/5.76,2.68,1.59,1.05,0.756,0.55,0.381,0.259,
     &0.168,0.103,0.0576,0.0277/
      DATA (QS(I),I=2,24,2)/0.459,0.803,1.07,1.26,1.34,1.35,1.39,1.39,1.
     &39,1.35,1.27,1.14/
C
        WRITE(*,*) "INPUT A SOMFELD NUMBER:"
        READ(*,*) S0

        do I=1,21,2
        IF ((S0 .GE. ETH(I)).AND.(S0.LE.ETH(I+2)))THEN
        call LINEAREVALU(S0,ETH(I),ETH(I+1),ETH(I+2),ETH(I+3),

     &FUNC)
          write(*,*) FUNC
        ELSE
         EXIT
        ENDIF
        END DO

        stop
        end


c        线形插值
        SUBROUTINE LINEAREVALU(S0,FUNC1,FUNC2,FUNC3,FUNC4,FUNC)
        implicit none
      real*8 FUNC1,FUNC2,FUNC3,FUNC4,S0
      real*8 FUNC          !  插出来的值
        
c          write (*,*) 'S0,FUNC1,FUNC2,FUNC3,FUNC4=',
c     &S0,FUNC1,FUNC2,FUNC3,FUNC4,FUNC
c      pause

        FUNC=FUNC2+(FUNC4-FUNC2)/(FUNC3-FUNC1)*(S0-FUNC1)
        WRITE(*,*)  FUNC
        RETURN
        END
回复 不支持

使用道具 举报

发表于 2008-9-22 11:50:50 | 显示全部楼层 来自 大连理工大学
你加一个语句;
    WRITE(*,*) ‘FUNC==',   FUNC
       pause
不就可以了吗,要在主程序显示就在主程序调用程序以后加,要在子程序显示就在func计算语句以后加就可以了
回复 不支持

使用道具 举报

发表于 2008-9-22 11:52:02 | 显示全部楼层 来自 大连理工大学
我给你的程序里面的这些
c          write (*,*) 'S0,FUNC1,FUNC2,FUNC3,FUNC4=',
c     &S0,FUNC1,FUNC2,FUNC3,FUNC4,FUNC
c      pause
是调试用的
回复 不支持

使用道具 举报

 楼主| 发表于 2008-9-22 13:51:55 | 显示全部楼层 来自 上海
这是一个计算线性插值的程序
数据结构是这样的eth=(x1,y1,x2,y2,...,xn,yn)
想要任意给个x,查y的值,并输出到文件或者屏幕。
经调试,现在发现程序do循环好像有问题,只能在第一个区间插值。
请指教!谢谢
初试,见笑了~~
回复 不支持

使用道具 举报

 楼主| 发表于 2008-9-22 14:10:27 | 显示全部楼层 来自 上海
搞定了,谢谢各位指导!
回复 不支持

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Simapps系列直播

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-11-1 13:29 , Processed in 0.072914 second(s), 17 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表