2017-10-09 23 views
2

다른 입력 매개 변수 세트를 사용하여 fortran 77 프로그램을 여러 번 실행하고 싶습니다. 이미 출력 파일 이름이 내가 사용하는 여러 입력 매개 변수에 대해 변경되도록했지만 매개 변수를 변경할 때마다 코드로 갈 필요없이 다른 입력 매개 변수 집합으로 프로그램을 실행할 수 있는지 잘 모르겠습니다.다른 입력 매개 변수로 fortran을 여러 번 실행하십시오.

제 질문을 설명하기 위해 다음은 간단한 코드입니다.

PROGRAM CODE 
    IMPLICIT DOUBLE PRECISION (A-H, J-Z) 
    COMMON/param/radius 

    radius = 2 
    write(*,*) 'radius = ', radius 
    write(*,*) 'the area is = ', 3.14*radius*radius 

    END 

내가 다른 반경이 코드를 실행하려면, 대신 코드로 가서 수동으로 값을 변경 할 필요없이, 내가 다른 매개 변수의 선택을 가진 파일을 갖고 싶어하고 여러 번 실행 말해봐.

물론 다양한 매개 변수 선택 및 반복 배열을 만들어 해결 방법이 있습니다. 그러나 실제로는 각 실행마다 변경하려는 여러 매개 변수가 있으므로이 작업을 수행하고 싶지 않습니다.

아래 주석 중 하나에 대한 응답으로 각 실행마다 다른 입력 옵션을 가진 파일이있는 경우 프로그램마다 각기 다른 매개 변수 선택을 위해 다른 행을 가져야합니까?

+3

어떤 사람들은 스크립트의 일부를 입력 스크립트로 작성하여 각 프로그램 실행에 몇 가지 입력 매개 변수를 제공합니다. 진짜 대답 같은 것이 있으면 질문을하십시오. (아니, 게시 한 것은 질문이 아닙니다.) –

+1

아마도 Get_command_argument를 찾아야 할 것입니다. – agentp

+1

또 다른 옵션은 각 실행에 필요한 입력 매개 변수가 들어있는 데이터 파일을 읽는 것입니다. –

답변

6

내가 여러 번 사용했던 "보행자"유형 접근법이 있습니다.

재 컴파일을 피하려면 해결 방법은 매개 변수 파일의 이름을 하드 코딩하고이 파일에서 데이터를 읽는 것입니다. 모든 코드 실행에는 매개 변수의 자체 복사본과 자체 디렉터리가 있어야합니다.

아래에 단일 매개 변수에 대한 예제가 있지만 필요한 경우 일반화 할 수 있습니다. 그것은 bash의 드라이버 스크립트에 의존합니다.

포트란 프로그램 :

 PROGRAM CODE 
     IMPLICIT DOUBLE PRECISION (A-H, J-Z) 
     COMMON/param/radius 

     open(11, file='parameters.txt') 
     read(11,*) radius 
     close(11) 
     write(*,*) 'radius = ', radius 
     write(*,*) 'the area is = ', 3.14*radius*radius 

     END 

배쉬 프로그램 :

for radius in 01 02 05 10 
do 
RUNDIR=run_${radius} 
mkdir ${RUNDIR} 
echo "${radius}" > ${RUNDIR}/parameters.txt 
(cd ${RUNDIR} ; ../code) 
done 

는 포트란 코드를 컴파일

gfortran -std=legacy -o code code.f 

과 같은 파라 메트릭 실행을 실행

bash parametricrun.sh 
  1. 포트란 코드가 수행하는 작업 : parameters.txt 파일을 열고 radius 값의 첫 번째 항목을 읽습니다.

  2. bash는 스크립트가 수행하는 작업 : 매개 변수의 값의 개수를 들어, 그 디렉토리에 parameters.txt라는 이름의 파일을 만들고, 새 디렉토리를 만들고 그 디렉토리에 포트란 프로그램 code을 실행합니다.

코멘트 :

  1. 이것은 배시 프로그램의 2 루프를 사용하여 어느 하나 parameters.txt 라인 당 한 줄 또는 여러 여러 변수를 확장 할 수있다.

  2. 최신 버전의 Fortran을 사용할 수 있다면 언급하십시오. 거기에 더 많은 옵션이 있습니다.

  3. 스크립팅에 다른 언어 (arclight가 제안한 것 또는 다른 언어)를 사용할 수 있습니다. 많은 컴퓨팅 클러스터는 bash를 사용하여 작업을 실행하므로 매개 변수 실행에 사용될 수 있습니다 (반경 값은 작업 대기열 시스템을 통해 전달 될 수 있음).

  4. 파일 유닛 번호에 임의로 11을 사용했습니다. 실제 상황에서는 프로그램에 사용할 수있는 장치 번호를 사용해야합니다. 대신 iargcgetarg을 사용한다 고대 컴파일러

+0

이것은 내가 사용하고자하는 접근법이지만 쓰기에는 너무 게을 렀다. Windows에서도 사용 가능하며 스크립트는 약간 다릅니다. 특별한 프로그래밍 언어가 필요 없습니다. 솔직히 기본 질문을하는 사용자가 코드 없이도 일부 설명에서 파이썬 스크립트를 작성할 수 있다고 생각하지 않습니다. –

+0

파일 접근 방식은 입력 파일을 아카이브 할 수 있다는 장점이 있습니다. 나는 소수의 매개 변수 이상이있는 경우 일반적으로이를 사용합니다. – agentp

+0

도움 주셔서 감사합니다. 제가 fortran 77을 고집 한 이유는 동료가 fortran 77에서 이미 작성한 코드를 사용하고 있기 때문입니다. 저는 프로그래머가별로 없지만 단순히 fortran 77 코드를보다 현대적인 버전으로 변경하는 방법이 있습니까? –

0

코드로 변경하면 다시 컴파일해야합니다.

프로그램이 얼마나 복잡한 지 알지 못합니다. 대개 사용자 인터페이스 또는 파일에서 값을 읽는 방식으로 프로그램을 작성하는 것이 가장 좋습니다.

어떻게 할 지 아이디어가 있으시면 CHECK_COMMAND_ARGUMENT 또는 Namelists을 확인하십시오.

하지만 경로를 다시 컴파일하여 매번 다시 컴파일하려면 전처리기를 사용하여 코드의 특정 부분을 설정할 수 있습니다.

하는 예제 코드를 참조하십시오 :

 PROGRAM area 
     IMPLICIT NONE 
     PRINT *, "area of circle with radius ", RADIUS, " is ", 
    &   3.15159 * RADIUS**2 
     END PROGRAM area 

는 프리 프로세서를 사용하려면을 (당신은 명시 적으로 (gfortran -cpp 또는 예를 들어 ifort -fpp)을 수행하는 컴파일러 말할 필요하거나, 당신은 자본 .F로 확장자를 변경 할 수 있습니다 또는 현대 포트란의 경우 .F90) 전 처리기를 기본적으로 사용할 수 있습니다. 내가 매개 변수의 단일 세트에서 작동하도록 기대 코드에 대한 파라 메트릭 분석을 실행했다 한 경우

$ gfortran -D RADIUS=2 area.F -o area 
$ ./area 
area of circle with radius   2 is 12.6063604 
$ gfortran -D RADIUS=20 area.F -o area 
$ ./area 
area of circle with radius   20 is 1260.63599 
+0

전 프로세서에 대해 많은 프로그래밍 경험없이 사람들에게 이야기하는 것에 대한 두 번째 생각을 가지고 있지만 ... 이상한 효과를 낼 수 있습니다 ... – chw21

+5

가르치는 사람들은 프로그램의 각기 다른 실행을 위해 다시 컴파일해야합니다. 효과 * ... –

0

, 나는 큰를 생성하는 Jinja2 템플릿 라이브러리를 사용하여 파이썬의 작은 스크립트를 작성했습니다 입력 파일의 수. 어떤 입력 파일이 어느 입력 순열에 해당하는지 쉽게 결정할 수있는 명명 규칙을 선택하여 결과를 사후 처리하는 데 도움을줍니다. Python & Jinja2의 특정 용도는 입력 생성 스크립트 외부에 텍스트 템플릿을 갖는 것만 큼 중요하지 않으므로 입력 생성자를 편집하지 않고 생성 된 파일을 조정할 수 있습니다. 효율적으로 입력 텍스트 파일을 생성 할 수있는 성숙하고 간단한 웹 템플릿 시스템이 많이 있습니다.

입력 매개 변수와 파일 이름 간의 상호 참조는 데이터 구조의 배열 (즉, 해시 또는 사전)에 대한 색인처럼 간단 할 수 있습니다. 좀 더 의미있는 것을 사용하고 생성 된 입력에 설명적인 주석을 추가하려고합니다 (입력 형식이 주석을 허용한다고 가정 할 때 ...)

필자가 한 달 동안의 QA 사이클없이 컴파일 할 수없는 코드를 사용하고있을 수 있으므로 매개 변수 변형 코드를 별도의 스크립트로 작성하는 것이 훨씬 저렴합니다. 내 포트란 코드.

필자가 파이썬에서 파라 메트릭 분석 코드를 작성하는 다른 이유는 Fortran에서 복잡한 입력 처리를 작성하는 것보다 훨씬 쉽기 때문입니다. numpy을 사용하여 선형, 로그 또는 기타 유사 패턴 (예 : Chebyshev 노드)을 생성 할 수 있다면 Fortran에서 시도하는 것보다 훨씬 쉽습니다.

표준 면책 조항 : 본인의 운영 환경과 사용 사례는 귀하와 다를 수 있으므로이 방법이 적절하지 않을 수 있습니다. 환경에 따라 몇 가지 장점이있는 옵션이라고 지적하고 있습니다.

1

명령 행 인수 방식

implicit none 
    real r 
    character*30 arg 
    integer ios 
    if(command_argument_count().eq.0)then 
! default for no argument 
    r=1. 
    else 
    call get_command_argument(1,arg) 
    read(arg,*,iostat=ios)r 
    if(ios.ne.0)then 
     write(*,*)'error expected number arg got ',arg 
     stop 
    endif 
    endif 
    write(*,*)r 
    end 

참고. 순수 주의자들은 이것들이 비표준 f77이지만, 많은 컴파일러에서 공통적으로 사용 가능하다는 것을 알 수 있습니다. 인수 목록을 통해 루프

전형적인 파이썬 스크립트 : 당신은 당신이 편안 어떤 스크립트 언어를 사용해야합니다 물론

import os 
for r in (1.2,6.6): os.system('fortran_program %g'%r) 

. 나는 필연적으로 스크립트에서 계산을 끝내는 것처럼 보이기 때문에 "높은 수준"의 언어를 좋아합니다.