落月黎明 发表于 2019-12-16 20:55:38

需要输入变量参数的程序,如何批量读取并处理不同文件

编译环境为 IVS+IVF

对于不需要在命令行中输入参数的Fortran程序,
我采用do循环和open就可以让它重复生成不同的chem.asc文件(完成我所需的工作)

      PROGRAM CKINTERP
      IMPLICIT NONE
      INTEGER MDIM,KDIM,IDIM,MAXTP,MAXSP,MAXTB,LIN,LOUT,LTHRM,LINCK,
   &MAXORD,LIWORK,LRWORK,LCWORK

      PARAMETER(MDIM=10,KDIM=100,IDIM=500,MAXTP=3,MAXSP=12,MAXTB=10,
   &LIN=15,LOUT=16,LTHRM=17,LINCK=25,MAXORD=10,
   &LIWORK=40000,LRWORK=40000,LCWORK=10000)

      INTEGER IWORK(LIWORK)
      DOUBLE PRECISION RWORK(LRWORK)
      CHARACTER*16 CWORK(LCWORK)
      LOGICAL L(KDIM)
      integer i
      character*2 filelist
      do i=1,3
      write(filelist,"(i2)") i
      OPEN (LIN,FILE="chem"//trim(adjustl(filelist))//".inp",
   & STATUS='UNKNOWN',FORM='FORMATTED')
      OPEN (LOUT, FILE="chem"//trim(adjustl(filelist))//".out",
   & FORM='FORMATTED', STATUS='UNKNOWN')
      OPEN (LTHRM, FILE="therm"//trim(adjustl(filelist))//".dat",
   1       FORM='FORMATTED', STATUS='UNKNOWN')
      open(LINCK,file="chem"//trim(adjustl(filelist))//".asc",
   &               FORM='FORMATTED',STATUS='UNKNOWN')

      CALL CKINTP (MDIM, KDIM, IDIM, MAXTP, MAXSP, MAXTB,
   1                   LIN, LOUT, LTHRM, LINCK, MAXORD,
   2                   LIWORK, IWORK, LRWORK, RWORK, LCWORK, CWORK, L)

但是对于会有需要输入命令行参数的程序,就只能出现运行完成第一个,然后就关闭,运行完成了。
如何让它继续处理第二个chem2.asc 和第三个 chem3.asc?

      PARAMETER (LENRWK=100000, LENIWK=100000, LENLWK=200, LENCWK=200,
   1         LIN=5, LOUT=6, LREST=14, LSAVE=15, LRCRVR=16,
   2         LINKCK=25)
      DIMENSION RWORK(LENRWK), IWORK(LENIWK)
      CHARACTER CWORK(LENCWK)*16
      LOGICAL LWORK(LENLWK)
integer i
      character*2 filelist
      do i=1,3
      write(filelist,"(i2)") i
      OPEN (LINKCK, FORM='FORMATTED',STATUS='UNKNOWN',
   1            FILE="chem"//trim(adjustl(filelist))//".asc")
      OPEN (LREST,FORM='UNFORMATTED',STATUS='UNKNOWN',
   1            FILE="rest"//trim(adjustl(filelist))//".bin")
      OPEN (LRCRVR, FORM='UNFORMATTED',STATUS='UNKNOWN',
   1            FILE="recov"//trim(adjustl(filelist))//".bin")
      OPEN (LSAVE,FORM='UNFORMATTED',STATUS='UNKNOWN',
   1            FILE="save"//trim(adjustl(filelist))//".bin")
      CALL PSR (LIN, LOUT, LINKCK,LREST, LSAVE, LRCRVR, LENLWK,
   1          LWORK, LENIWK, IWORK, LENRWK, RWORK, LENCWK, CWORK)
      STOP
      END

请问应该如何解决这一问题?能够让它重复读取这几个文件并执行?

vvt 发表于 2019-12-16 21:14:37

操作系统的批处理(windows)或 shell(linux)了解一下

necrohan 发表于 2019-12-17 08:35:43

http://bbs.fcode.cn/thread-2157-1-1.html

落月黎明 发表于 2019-12-17 16:04:35

vvt 发表于 2019-12-16 21:14
操作系统的批处理(windows)或 shell(linux)了解一下

好的,我了解一下。主要是想在源程序上改改

落月黎明 发表于 2019-12-17 16:05:28

necrohan 发表于 2019-12-17 08:35
http://bbs.fcode.cn/thread-2157-1-1.html

主要是没找到源程序修改的思路

necrohan 发表于 2019-12-17 17:04:37

落月黎明 发表于 2019-12-17 16:05
主要是没找到源程序修改的思路

没太明白你的意思,你在源程序里不是已经用do循环实现了吗?
如果要反复执行,用输入修改参数,直接 do while true ... end 套在输入参数那部分外面不就行了,用负数判断退出循环。

落月黎明 发表于 2019-12-17 19:47:19

necrohan 发表于 2019-12-17 17:04
没太明白你的意思,你在源程序里不是已经用do循环实现了吗?
如果要反复执行,用输入修改参数,直接 do w ...

我原以为加上do循环以后,它可以实现打开第一个文件,然后输入参数,运行完成。再打开第二个文件,输入参数,运行完成..........
实际上,在打开完第一个文件之后,输入参数,运行完成。就结束了。
对于不用输入参数的程序,它就可以像我原以为的那样。
感谢回复

落月黎明 发表于 2019-12-18 16:50:26

vvt 发表于 2019-12-16 21:14
操作系统的批处理(windows)或 shell(linux)了解一下

您好,我了解了一下批处理,但是发现出了一些问题,想请您帮忙看一下。
这是我的批处理文件。我的exe程序是需要一个chem.asc文件,所以我将chem.asc文件与exe程序放到了一个文件夹下。 当我运行我的批处理文件时候,它只有当chem.asc文件与批处理文件在一起时,才能运行成功,并在批处理文件所在的文件夹里生成结果。 但我想要实现的是在他们各自的文件夹里运行,不太明白哪里出错了。
@echo off
E:\20191028工作\ChemkinIII\Chemkin\Debug\Console1\Console1\chem1\Console1.exe < E:\20191028工作\ChemkinIII\Chemkin\Debug\Console1\Console1\chem1\1.txt
E:\20191028工作\ChemkinIII\Chemkin\Debug\Console1\Console1\chem2\Console1.exe < E:\20191028工作\ChemkinIII\Chemkin\Debug\Console1\Console1\chem2\1.txt
echo

之后我采用调用2个批处理文件的方式,集成在同一个批处理文件中。如
call 1.bat
call 2.bat
仍然需要chem.asc文件,并生成结果在当前目录下。

请问这应该如何处理?

pasuka 发表于 2019-12-19 22:41:23

本帖最后由 pasuka 于 2019-12-19 22:44 编辑

非要绕开shell,那么就定义结构体,自己编写个namelist来实现
01.asc N1 param01 param02 ... paramN1
02.asc N2 param01 ... paramN2
每次主程序读取namelist然后for循环处理

落月黎明 发表于 2019-12-20 20:42:21

pasuka 发表于 2019-12-19 22:41
非要绕开shell,那么就定义结构体,自己编写个namelist来实现
01.asc N1 param01 param02 ... paramN1
02.a ...

感谢回答,我是菜鸟,我得去查查相关内容学习学习
页: [1] 2
查看完整版本: 需要输入变量参数的程序,如何批量读取并处理不同文件