24小时热门版块排行榜    

查看: 993  |  回复: 2

opticspcs

金虫 (正式写手)


[交流] 【求助】fortran一程序解读

本人对Fortran不大熟,而且要研究的一程序又太大(5000多行),所以请各位帮忙,解读一下其中的一些问题。
     主程序要从一个文件中读取数据,文件中的数据如下。
      TEST DATA SET 1 (MOLECULAR WEIGHT DISTRIBUTION)                            5826
LAST                   -1.                                                 5827
GMNMX     1          5.E+2                                                 5828
GMNMX     2          5.E+6                                                 5829
IWT                     5.                                                 5830
NERFIT                  0.                                                 5831
NINTT                   3.                                                 5832
NLINF                   1.                                                 5833
IFORMY                                                                     5834
(6F8.6)                                                                    5835
DOUSNQ                  1.                                                 5836
IUSER    10             1.                                                 5837
RUSER    15           1.43                                                 5838
RUSER    16           488.                                                 5839
RUSER    17            60.                                                 5840
RUSER    18        1.37E-4                                                 5841
RUSER    22            -.5                                                 5842
RUSER    10            -1.                                                 5843
END                                                                        5844
NSTEND   17          5.E-6         85.E-6                                  5845
NSTEND   16         95.E-6        245.E-6                                  5846
NSTEND    4        265.E-6        325.E-6                                  5847
.450999 .410113 .372522 .340069 .310318 .283569                            5848
.258853 .236028 .216811 .199376 .181524 .165491                            5849
.153746 .139687 .128724 .117704 .109878 .094114                            5850
.080559 .068725 .058679 .053363 .045275 .039581                            5851
.033519 .031586 .027971 .023976 .021711 .021533                            5852
.020312 .016487 .017212 .016077 .011657 .013386                            5853
.010805                                                                    5854
    主程序要读取其中的变量的值,比如LAST 变量,读取其变量值为-1,GMNMX     1 5.E+2   是指数组 GMNMX第一个元素为  5.E+2,最后一个变量是Y数组,即从5848到5853行的内容。
   所以,我想知道主程序中是怎么样读取它们的,当然了解程序应该根据主程序内容,但主程序太长了,我挑一些有用的贴上。
      SUBROUTINE READYT (MY,NIOERR,SQRTW,T,Y)                               4271
      DOUBLE PRECISION PRECIS, RANGE                                        4272
      LOGICAL DOCHOS, DOMOM, DOUSIN, DOUSNQ, LAST, NEWPG1,                  4273
     1 NONNEG, ONLY1, PRWT, PRY, SIMULA, LUSER                              4274
      DIMENSION SQRTW(MY), T(MY), Y(MY)                                     4275
      DIMENSION LIN(6), LA(6,2), IHOLER(6)                                  4276
      COMMON /DBLOCK/ PRECIS, RANGE                                         4277
      COMMON /SBLOCK/ DFMIN, SRMIN,                                         4278
     1 ALPST(2), EXMAX, GMNMX(2), PLEVEL(2,2), RSVMNX(2,2), RUSER(551),     4279
     2 SRANGE                                                               4280
      COMMON /IBLOCK/ IGRID, IQUAD, IUNIT, IWT, LINEPG,                     4281
     1 MIOERR, MPKMOM, MQPITR, NEQ, NERFIT, NG, NINTT, NLINF, NORDER,       4282
     2 IAPACK(6), ICRIT(2), IFORMT(70), IFORMW(70), IFORMY(70),             4283
     3 IPLFIT(2), IPLRES(2), IPRINT(2), ITITLE(80), IUSER(50),              4284
     4 IUSROU(2), LSIGN(4,4), MOMNMX(2), NENDZ(2), NFLAT(4,2), NGL,         4285
     5 NGLP1, NIN, NINEQ, NNSGN(2), NOUT, NQPROG(2), NSGN(4), NY            4286
      COMMON /LBLOCK/ DOCHOS, DOMOM, DOUSIN, DOUSNQ, LAST,                  4287
     1 NEWPG1, NONNEG, ONLY1, PRWT, PRY, SIMULA,                            4288
     2 LUSER(30)                                                            4289
      DATA IHOLER/1HR, 1HE, 1HA, 1HD, 1HY, 1HT/, LA/                        4290
     1 1HN, 1HS, 1HT, 1HE, 1HN, 1HD,   1HN, 1HY, 4*1H /                     4291
      IF (NINTT .LE. 0) GO TO 200                                           4292
C-----------------------------------------------------------------------    4293
C  COMPUTE T IN EQUAL INTERVALS.                                            4294
C-----------------------------------------------------------------------    4295
      NY=0                                                                  4296
      DO 110 J=1,NINTT                                                      4297
5110 FORMAT (1X,6A1,I5,2E15.6)                                             4298
      READ (NIN,5110) LIN,NT,TSTART,TEND                                    4299
5120 FORMAT (1X,6A1,I5,1P2E15.5)                                           4300
      WRITE (NOUT,5120) LIN,NT,TSTART,TEND                                  4301
      DO 120 K=1,6                                                          4302
        IF (LIN(K) .NE. LA(K,1)) GO TO 130                                  4303
  120 CONTINUE                                                              4304
      GO TO 140                                                             4305
  130 CALL ERRMES (1,.FALSE.,IHOLER,NOUT)                                   4306
      GO TO 190                                                             4307
  140 IF (NT.GE.2 .AND. NT+NY.LE.MY) GO TO 150                              4308
      CALL ERRMES (2,.FALSE.,IHOLER,NOUT)                                   4309
      GO TO 190                                                             4310
  150 DUM=(TEND-TSTART)/FLOAT(NT-1)                                         4311
      NY=NY+1                                                               4312
      T(NY)=TSTART                                                          4313
      DO 160 K=2,NT                                                         4314
      NY=NY+1                                                               4315
  160 T(NY)=T(NY-1)+DUM                                                     4316
      GO TO 110                                                             4317
  190 NIOERR=NIOERR+1                                                       4318
      IF (NIOERR .GE. MIOERR) STOP                                          4319
  110 CONTINUE                                                              4320
      GO TO 300                                                             4321
C-----------------------------------------------------------------------    4322
C  READ IN NY AND THEN T ARRAY.                                             4323
C-----------------------------------------------------------------------    4324
  200 READ (NIN,5110) LIN,NY                                                4325
      WRITE (NOUT,5110) LIN,NY                                              4326
      DO 210 K=1,6                                                          4327
        IF (LIN(K) .NE. LA(K,2)) GO TO 220                                  4328
  210 CONTINUE                                                              4329
      GO TO 230                                                             4330
  220 CALL ERRMES (3,.FALSE.,IHOLER,NOUT)                                   4331
      GO TO 235                                                             4332
  230 IF (NY .LE. MY) GO TO 240                                             4333
      CALL ERRMES (4,.FALSE.,IHOLER,NOUT)                                   4334
  235 NIOERR=NIOERR+1                                                       4335
      RETURN                                                                4336
  240 READ (NIN,IFORMT) (T(J),J=1,NY)                                       4337
C-----------------------------------------------------------------------    4338
C  READ IN Y ARRAY.                                                         4339
C-----------------------------------------------------------------------    4340
  300 IF (.NOT.SIMULA) READ (NIN,IFORMY) (Y(J),J=1,NY)                      4341
      IF (IWT .EQ. 4) GO TO 420                                             4342
C-----------------------------------------------------------------------    4343
C  INITIALIZE SQRTW (SQUARE ROOTS OF LEAST SQUARES WEIGHTS) TO UNITY.       4344
C-----------------------------------------------------------------------    4345
      DO 410 J=1,NY                                                         4346
      SQRTW(J)=1.                                                           4347
  410 CONTINUE                                                              4348
   
      其中,我对4341行代码有疑问,即 300 IF (.NOT.SIMULA) READ (NIN,IFORMY) (Y(J),J=1,NY)                      4341,不知道这行命令怎么把文件中数据读入到数组Y的,因为,它好像没指明从第几行读入数据。事实上,这个数组Y的数据,正式数据文件中的最后几行,即.450999 .410113 .372522 .340069 .310318 .283569                            5848
.258853 .236028 .216811 .199376 .181524 .165491                            5849
.153746 .139687 .128724 .117704 .109878 .094114                            5850
.080559 .068725 .058679 .053363 .045275 .039581                            5851
.033519 .031586 .027971 .023976 .021711 .021533                            5852
.020312 .016487 .017212 .016077 .011657 .013386                            5853
.010805 。而且,它怎么就可以避过后面的行标 5848 5849等而不读入它们。单凭        300 IF (.NOT.SIMULA) READ (NIN,IFORMY) (Y(J),J=1,NY) 这一行应该不能实现吧,因为它既没有指明从哪行开始读,也没有指明道哪行结束。
     最后,我的那个数据文件是.in格式的,难道和这个有关?
     不知道我说明白了没有,请高手帮忙解释!谢谢!

[ Last edited by opticspcs on 2011-1-21 at 15:01 ]
回复此楼

» 猜你喜欢

» 抢金币啦!回帖就可以得到:

查看全部散金贴

已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

老虎大王

木虫 (著名写手)



opticspcs(金币+5): 2011-01-21 19:33:29
opticspcs(金币+5): 2011-01-22 08:56:49
余泽成(金币+1): 谢谢参与应助! 2011-02-09 16:10:52
在这一句之前,已经READ了很多东西了。你从头读起,把每个READ语句找出来,与输入文件相对比就知道了。必然是顺序读下来,读到这里刚好是数组开始。
2楼2011-01-21 17:52:55
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
★ ★ ★
opticspcs(金币+10): 非常感谢 2011-01-22 08:56:40
余泽成(金币+3): 辛苦了! 2011-02-09 16:11:00
READ (NIN,IFORMY) (Y(J),J=1,NY)

这一句中,NIN 是指的设备号,也就是你的那个 .in 文件;IFORMY 是格式,这个格式是事先读入的,可以看 5834,5835 两行,其中 IFORMY 的值是 5835 行,即 (6F8.6)

每一行就读6个数,所以,后面的标号自然不必考虑。另外,我还有一个猜测,你的程序是固定格式的,而这些标号是在72列之后,所以它根本就没有意义,呵呵,当然,这只是一个猜测……

现在一切清楚了吧,呵呵……
3楼2011-01-21 19:35:55
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 opticspcs 的主题更新
普通表情 高级回复 (可上传附件)
信息提示
请填处理意见