RANDOM_SEED와 RANDOM_NUMBER를 이용하여
핵반응기 차폐 모사 프로그램 작성
PROGRAM Shielding
IMPLICIT NONE
REAL :: RandomReal
INTEGER :: Thickness, DirectionChangeLimit, NewDirection, &
OldDirection, NumDirectionChanges, Forward, &
NumNeutrons, NumEscaped, I
PRINT *, "Enter thickness of shield, limit on # of direction changes"
PRINT *, "and the number of neutrons to simulate : "
READ *, Thickness, DirectionChangeLimit, NumNeutrons
NumEscaped = 0
CALL RANDOM_SEED
DO I = 1, NumNeutrons
Forward = 0
OldDirection = 0
NumDirectionChanges = 0
DO
CALL RANDOM_NUMBER(RandomReal)
NewDirection = 1 + INT(4 * RandomReal)
IF (NewDirection /= OldDirection) THEN
NumDirectionChanges = NumDirectionChanges + 1
OldDirection = NewDirection
END IF
IF (NewDirection == 1) THEN
Forward = Forward + 1
ELSE IF (NewDirection == 2) THEN
Forward = Forward - 1
END IF
IF ((Forward >= Thickness) .OR. (Forward <= 0) .OR. &
(NumDirectionChanges >= DirectionChangeLimit)) EXIT
END DO
IF (Forward == Thickness) NumEscaped = NumEscaped + 1
END DO
PRINT '(1X, F5.2, "% of the neutrons escaped")', &
100 * REAL(NumEscaped) / REAL(NumNeutrons)
END PROGRAM Shielding
위 소스를 07_03_Shielding.f95로 저장
컴파일 및 프로그램 테스트
'Programming > Fortran' 카테고리의 다른 글
사다리꼴 적분 근사(외부 프로그램을 서브루틴의 인수로 사용) (0) | 2008.09.15 |
---|---|
사다리꼴 적분 근사(모듈을 서브루틴의 인수로 사용) (0) | 2008.09.15 |
극좌표로 직교좌표로 전환(값을 반환하는 SUBROUTINE) (0) | 2008.09.13 |
각도(도,분,초)를 도로 표시하기(subroutine) (0) | 2008.09.13 |
도로망의 경로 수 계산(Recursive, 재귀함수) (0) | 2008.09.09 |