Lennard Jones 잠재력에 대한 Fortran 코드를 작성하려고하고 posinp_38.xyz 파일에서 좌표를 읽으려고했지만 SIGSEGV, segmentation fault occurred
이 발생합니다. 어떻게 문제를 찾을 수 있습니까? Fortran에서 새로운 기능이므로 도움이 도움이됩니다.Fortran에서 파일 번호 읽기, SIGSEGV 오류
PROGRAM lennardjones_1
IMPLICIT NONE
REAL(8), allocatable :: rat(:,:) ! coordinates of atoms
REAL(8), allocatable :: fat(:,:) ! force between atoms
INTEGER :: nat ! number of atoms
!INTEGER :: iat, jat ! loop counter
REAL :: epot ! potential energy
REAL :: ftot ! total force on atoms
CHARACTER(len=20) :: filename ! Input data file name
CHARACTER(len=3) :: sat ! for reading the file
INTEGER :: status ! I/O status: 0 for success
! Get the name of the file containing the input data.
WRITE (*,1000)
1000 FORMAT (1X,'Enter the file name with the data to be sorted: ')
WRITE (*,*) 'The file name is: posinp_38.xyz or posinp_1000.xyz '
READ (*,'(A20)') filename
! Open input data file.
OPEN (UNIT=21, FILE=filename, status='OLD', ACTION='READ', &
IOSTAT=status)
READ (21,*) nat
READ (21,*)
CALL force_energy(rat, nat)
write (*,*) epot, ftot
END PROGRAM lennardjones_1
SUBROUTINE force_energy(rat,nat)
IMPLICIT NONE
REAL(8), allocatable :: rat(:,:)
REAL(8), allocatable :: fat(:,:)
INTEGER, INTENT(IN) :: nat
INTEGER :: iat, jat ! local variables
REAL :: epot
REAL :: r , dx, dy, dz, d
REAL :: ftot
INTEGER :: status ! I/O status: 0 for success
CHARACTER(len=3) :: sat
allocate (rat(3,nat))
allocate (fat(3,nat))
! Was the OPEN successful?
fileopen: IF (status == 0) THEN ! Open successful
DO iat = 1, nat
READ (21,*) sat, rat(1, iat), rat(2, iat), rat(3, iat)
END DO
CLOSE(21)
END if fileopen
DO iat = 1, nat
DO jat = iat+1, nat
dx = rat(1,jat)-rat(1,iat)
dy = rat(2,jat)-rat(2,iat)
dz = rat(3,jat)-rat(3,iat)
r = sqrt(dx**2 + dy**2 + dz**2)
d = 4*(-12/r**14 + 6/r**8)
fat(1,iat) = fat(1,iat) + d * dx
fat(2,iat) = fat(2,iat) + d * dy
fat(3,iat) = fat(3,iat) + d * dz
fat(1,jat) = fat(1,jat) - d * dx
fat(2,jat) = fat(1,jat) - d * dy
fat(3,jat) = fat(1,jat) - d * dz
ftot = ftot + (fat(1,iat)**2+fat(2,iat)**2+fat(3,iat)**2)+ &
(fat(1,jat)**2+fat(2,jat)**2+fat(3,jat)**2)
epot = epot+4*(1/r**12-1/r**6)
END DO
END DO
END SUBROUTINE force_energy
디버거 사용에 대해 알고 있습니까? 이것이 Linux 나 Unix의 경우,'-g'로 컴파일하고'gdb'로 실행하십시오. – wallyk
그것은 리눅스에 있습니다. 디버거에 관한 것입니다. 나는 그것을 google한다. – Abolfazl
항상 태그 [tag : fortran]을 사용하고 질문이 구체적이라는 것을 구별하기 위해 필요한 경우에만 버전을 추가하십시오. 예를 들어 포트란 2008을 사용할 수는 없지만 포트란 90 만 사용할 수 있습니다. –