2016-12-28 1 views
0

공학용 교과서에서 FORTRAN 77 코드를 사용하고 싶습니다. 참고로 FDAM1(61),FDAM2(61),FPOW1(61),FPOW2(61),UDAM(61)UPOW(61).배열로 데이터를 읽는 방법

을 코드 페이지 49에서이 책의 ​​촬영되었습니다 : 문제는 내가 즉 호출되는 배열에 데이터를 어떻게 입력을 이해 할 수없는 생각이다 https://books.google.pt/books?id=i2hyniQpecYC&lpg=PR6&dq=optimal%20design%20siddall&pg=PA49#v=onepage&q=optimal%20design%20siddall&f=false

C  PROGRAM TST (INPUT,OUTPUT,TAPE5=INPUT,TAPE6=OUTPUT) 
C 
C  PROGRAM TO ESTIMATE MAXIMUM EXPECTED VALUE FOR ALTERNATE DESIGNS 
C 
C  FDENS(I)= ARRAYS FOR DATA DEFINING DENSITY FUNCTIONS 
C  FDAM1(I)= ARRAY DEFINING DENSITY FUNCTION FOR DAMAGE IN DESIGN 1 
C  DFAM2(I)= ARRAY DEFINING DENSITY FUNCTION FOR DAMAGE IN DESIGN 2 
C  FPOW1(I)= ARRAY DEFINING DENSITY FUNCTION FOR POWER IN DESIGN 1 
C  FPOW2(I)= ARRAY DEFINING DENSITY FUNCTION FOR POWER IN DESIGN 2 
C  UDAM(I)= VALUE CURVE FOR DAMAGE 
C  UPOW(I)= VALUE CURVE FOR POWER 
C 
     DIMENSION FDENS(61),FDAM1(61),FDAM2(61),FPOW1(61),FPOW2(61), 
    1UDAM(61),UPOW(61),FUNC(61) 
C 
C  NORMALIZE DENSITY FUNCTIONS 
C 
     DO 1 I=1,4 
     READ(5,10)(FDENS(J),J=1,61) 
     READ(5,11)RANGE 
     AREA=FSIMP(FDENS,RANGE,61) 
     DO 2 J=1,61 
     GO TO(3,4,5,6)I 
3  FDAM1(J)=FDENS(J)/AREA 
     GO TO 2 
4  FDAM2(J)=FDENS(J)/AREA 
     GO TO 2 
5  FPOW1(J)=FDENS(J)/AREA 
     GO TO 2 
6  FPOW2(J)=FDENS(J)/AREA 
2  CONTINUE 
1  CONTINUE 
C 
C  DETERMINE EXPECTED VALUES 
C 
     READ(5,10)(UDAM(J),J=1,61) 
     READ(5,10)(UPOW(J),J=1,61) 
     DO 20 I=1,6 
     GO TO (30,31,32,33,34,35)I 
30 DO 40 J=1,61 
40 FUNC(J)=FDAM1(J)*UDAM(J) 
     RANGE=12. 
     E1=FSIMP(FUNC,RANGE,61) 
     GO TO 20 
31 DO 41 J=1,61 
41 FUNC(J)=FDAM2(J)*UDAM(J) 
C 
     RANGE=12. 
     E2=FSIMP(FUNC,RANGE,61) 
     GO TO 20 
32 DO 42 J=1,61 
     RANGE=60. 
42 FUNC(J)=FPOW1(J)*UPOW(J) 
     E3=FSIMP(FUNC,RANGE,61) 
33 DO 43 J=1,61 
43 FUNC(J)=FPOW2(J)*UPOW(J) 
     RANGE=60. 
     E4=FSIMP(FUNC,RANGE,61) 
     GO TO 20 
34 E5=8.17 
     GO TO 20 
35 E6=2.20 
20 CONTINUE 
     DES1=E1+E3+E5 
     DES2=E2+E4+E6 
C 
C  OUTPUT 
C 
     WRITE(6,100) 
100 FORMAT(/,1H ,15X,24HEXPECTED VALUES OF VALUE,//) 
     WRITE(6,101) 
101 FORMAT(/,1H ,12X,6HDAMAGE,7X,5HPOWER,9X,5HPARTS,8X,5HTOTAL,//) 
     WRITE(6,102)E1,E3,E5,DES1 
102 FORMAT(/,1H ,8HDESIGN 1,4X,F5.3,8X,F5.3,9X,F5.3,8X,F6.3) 
     WRITE(6,103)E2,E4,E6,DES2 
103 FORMAT(/,1H ,8HDESIGN 2,4X,F5.3,8X,F5.3,9X,F5.3,8X,F6.3) 
10 FORMAT(16F5.2) 
11 FORMAT(F5.0) 
     STOP 
     END 
여기

enter image description here

+0

Welcome to Stack Overflow. 귀하의 게시물을 간결하게 유지하십시오. 인사와 감사를 피하십시오. 이름 옆에 아이콘이 있습니다. 제목은 태그로 표시되는 넓은 주제가 아니라 문제를 소개해야합니다. 제목에서 태그를 반복하지 마십시오. [tag : fortran]과 같이 다소 일반적이고 광범위한 태그를 사용하고, 최신 버전을 사용하는 솔루션을 원하지 않는다고 구별하거나 나타내야 할 경우에만 특정 버전의 태그를 추가하십시오. –

+0

묻는 배열 중 일부는 프로그램 내에서 자동으로 계산됩니다. 다른 하나는'read' 문으로 읽혀집니다. 입력 데이터 형식에 대한 설명이 있습니까? 예인 경우 질문을 편집하여 포함하십시오. –

+0

@VladimirF 귀하의 회신에 감사드립니다. 데이터가있는 원본 코드 목록은 원래 질문에 표시된 링크에서 찾을 수 있습니다. 작성자가 주 코드 아래에 추가했기 때문에 혼란 스럽습니다. – Andy

답변

0


SUBROUTINE FSIMP 

     FUNCTION FSIMP(FUNC,RANGE,MINT) 
C.... CALCULATES INTEGRAL BY SIMPSONS RULE WITH 
C  MODIFICATION IF MINT IS EVEN 
C.... INPUT 
C  FUNC = ARRAY OF EQUALLY SPACED VALUES OF FUNCTION 
C    DIMENSION MINT 
C  RANGE = RANGE OF INTEGRATION 
C  MINT = NUMBER OF STATIONS 
C.... OUTPUT 
C  FSIMP = AREA 
     DIMENSION FUNC(1) 
C.... CHECK MINT FOR ODD OR EVEN 
     XX=RANGE/(3.*FLOAT(MINT-1)) 
     M=MINT/2*2 
     IF(M.EQ.MINT) GO TO 3 
C.... ODD 
     AREA=FUNC(1)+FUNC(M) 
     MM=MINT-1 
     DO 1 I=2,MM,2 
1  AREA=AREA+4.*FUNC(I) 
     MM=MM-1 
     DO 2 I=3,MM,2 
2  AREA=AREA+2.*FUNC(I) 
     FSIMP=XX*AREA 
     RETURN 
C.... EVEN 
C.... USE SIMPSONS RULE FOR ALL BUT THE LAST 3 INTERVALS 
3  M=MINT-3 
     AREA=FUNC(1)+FUNC(M) 
     MM=M-1 
     DO 4 I=2,MM,2 
4  AREA=AREA+4.*FUNC(I) 
     MM=MM-1 
     DO 5 I=3,MM,2 
5  AREA=AREA+2.*FUNC(I) 
     FSIMP=XX*AREA 
C.... USE NEWTONS 3/3 RULE FOR LAST THREE INTERVALS 
     FSIMP=FSIMP+9./3.*XX*(FUNC(MINT-3)+3.*(FUNC(MINT-2)+FUNC(MINT-1)) 
     1 +FUNC(MINT)) 
     RETURN 
     END 
은 시작하는 데 도움이되는 최소한의 예입니다 :

C Minimal working example of creaky old FORTRAN I/O 
     PROGRAM ABYSS 
     IMPLICIT NONE 
C 
     REAL FDENS(61) 
     REAL XRANGE 
     INTEGER J 
C 
10 FORMAT(16F5.2) 
11 FORMAT(F5.0) 

909 FORMAT(/, 'BEHOLD! A DENSITY DISTRIBUTION',/) 
910 FORMAT(10(F5.2, 3X),/) 
911 FORMAT(/, 'XRANGE is ', F6.1) 
C 
     CONTINUE 
C 
     READ(5,10) (FDENS(J), J=1,61) 
     READ(5,11) XRANGE 
C 
     WRITE(6,909) 
     WRITE(6,910) (FDENS(J), J=1,61) 
     WRITE(6,911) XRANGE 
C 
     STOP 
     END 

F77에 이것을 쓰는 것에 대한 사과; 나는이 예제를 위해 위에 게시 된 코드의 스타일을 고수하고있다. 이상적으로는 F03 또는 F08을 새로운 코드 나 완전히 다른 언어로 사용하고 I/O 기능이 풍부하고 표준 라이브러리가 풍부해야합니다. 그러나 나는 빗 나간다.

이 코드는 데이터 상에 동작한다 (공간을 보존하기 위해주의) 코드 abyss.f, 입력 데이터 abyss.dat 인 경우

       0.1 0.3 0.5 0.9 1.30 1.90 2.50 3.20 3.80 4.20 
4.70 5.0 5.1 5.2 5.2 5.1 4.9 4.7 4.6 4.4 4.2 3.9 3.8 3.6 3.4 3.2 
3.0 2.9 2.7 2.5 2.4 2.2 2.1 1.9 1.8 1.6 1.5 1.4 1.2 1.1 1.0 0.9 
0.8 0.7 0.6 0.5 0.4 0.3 0.3 0.2 0.1 0.1     
12. 

BEHOLD! A DENSITY DISTRIBUTION 

0.00 0.00 0.00 0.00 0.00 0.00 0.10 0.30 0.50 0.90 

1.30 1.90 2.50 3.20 3.80 4.20 4.70 5.00 5.10 5.20 

5.20 5.10 4.90 4.70 4.60 4.40 4.20 3.90 3.80 3.60 

3.40 3.20 3.00 2.90 2.70 2.50 2.40 2.20 2.10 1.90 

1.80 1.60 1.50 1.40 1.20 1.10 1.00 0.90 0.80 0.70 

0.60 0.50 0.40 0.30 0.30 0.20 0.10 0.10 0.00 0.00 

0.00 

XRANGE is 12.0 

생산,

gfortran -g -Wall -Og -o abyss abyss.f 

으로 코드를 생성 할 수 있어야합니다. 주의하는 것이

abyss <abyss.dat> abyss.out 

핵심 포인트를 실행하여 테 유사한 결과는 원래의 코드는 (전통적으로 INPUT_UNIT로 이제 공식적으로 iso_fortran_env에 시성, stdin로 촬영) (5)에서 읽고 있다는 것입니다. 자신의 코드에서 데이터 파일을 읽을 것을 권장하므로 문자 파일 5을 읽고있는 파일의 유닛 번호가 들어있는 변수로 바꾸십시오 (힌트 : open 포트란에 도입 된 명령어에 대한 newunit 인수 사용을 고려하십시오). 그것은 자유로운 I/O 유닛 번호를 찾기 위해 여러 해 동안 포트란 문제를 해결했다.) 당신이 I/O 리다이렉션을 사용할 수는 있지만, 차선책이다. 원래 코드의 한계를 해결하는 방법을 보여주기 위해 여기에 사용됩니다.

또한 차세대와 자신의 온건함을 위해 냉전 시대의 FORTRAN의 잘못된 기능 (예 :이 공백, 0과 같은 의미없는 말)을 사용하지 마십시오. 데이터를 사용할 가치가 있다면 쉽게 파싱 할 수있는 합리적인 형식을 사용하는 것이 좋습니다. 기둥 모양의 공백으로 구분 된 값은 모든 것과 마찬가지로 좋은 선택입니다. 포트란은 실제로 2156 년 (주고 또는 세기 걸릴) 언젠가는 CSV 파일을 읽고 쓸 수있는 표준 라이브러리를 얻을 수 있습니다. 그래서 무언가를 고칠 시간을 충분히 가질 수 있습니다 ...

+1

* F77 *에서이 글을 쓰는 것에 사과드립니다.하지만 'IMPLICIT NONE'이 너를 막을 수는 없습니다! –

+0

이봐 요, 내가 F77에서 작성했기 때문에/bad/F77에 써야한다는 뜻은 아닙니다.) – arclight

관련 문제