2017-05-22 1 views
0

나는 Abaqus의 사용자 서브 루틴 파일을 만들고 있습니다. 그러나 파일을 읽는데 어려움을 만났습니다. Fortran 77 기반으로 정확한 솔루션을 찾기가 너무 어렵습니다. 내 의도는 1X1 배열이 포함 된 파일을 읽는 것입니다. 그런 다음 배열에서 값의 인덱스를 찾으십시오. 파일을 읽을 수있는Fortran에서 파일을 읽고 값의 색인을 배열

내 코드는 다음과 같습니다

는 그리고 배열의 값의 인덱스를 찾기위한 코드는
open (unit=99,file='D:\SIMULATION\dist.txt',status='old') 
read (99,*) dist 
close (99) 

:

loc=minloc(abs(dist-1),1) 

내가 minloc 포트란 90에 대한 생각, 맞죠? 포트란 77에 minloc과 비슷한 기능이 있습니까?

+0

'minloc'은 f95이지만, f77 전용 컴파일러에서 abaqus를 사용하는 방법은 없습니다. – agentp

+0

dist 란 무엇입니까? 더 많은 코드를 보여주세요! 선언문을 보여주십시오. 'read (99, *) dist '도 Fortran 90입니다. Fortran 90을 피해야한다고 생각하지 않습니다. –

+0

확인. 고맙습니다. Fortran 90 또는 95를 사용해 보겠습니다. – Kim

답변

2

표시된 코드는 컴파일되어 예상대로 실행되어야합니다. 나는 당신이 실제로 1xN 배열을 읽고 있다고 가정하고, "1X1"이라고 말했을 때 오타였습니다. 그렇지 않으면, minloc을 사용하는 데 아무런 의미가 없습니다.

그러나 스칼라 값에 내장형 minloc을 사용하는 경우 주석 (An array-valued argument is required in this context)에보고 한 오류 메시지가 발생합니다. 따라서, 제 생각에 dist을 배열로 선언하지 않았기 때문입니다. read(funit1,*) x

! The contents of 'values.txt' are: -3.1, 4.1, 5.9, 2.6, -5.4 
! Values may be separated by commas or blanks. 

program get_min_dist 
    implicit none 
    real :: x     ! <-- Cannot be used to represent an array. 
    real, dimension(5) :: a  ! <-- An array of 5 reals. Do this instead. 
    integer :: loc, funit1 

    open(newunit=funit1, file="values.txt", status="old") 
    read(funit1,*) x 
    rewind(funit1) 
    read(funit1,*) a 
    close(funit1) 

    loc = minloc(abs(a-1),1) ! <-- I'm assuming there is a reason to 
           ! subtract 1 from all values in the array 

    ! loc = minloc(abs(x-1),1) ! <-- Error 'An array-valued arg is required` 
    print*, "x=",x 
    print*, "a=",a 
    print*, "index=", loc 
    print*, "value=", a(loc) 
end program get_min_dist 

첫 번째 값은 파일이 당신이 본 오류 메시지의 결과를 읽을 때 할당됩니다 : 여기에 내가 무엇을 의미하는지에 대한 간단한 예입니다. 그러나 배열 a을 사용하면 예상되는 결과를 얻게됩니다.

아바쿠스는 F77 스타일의 고정 서식 예제와 문서를 제공하기 위해 계속하고, 포트란 소스 코드를 필요로한다는 사실로 인해 수 있습니다 F77 호환 코드를 사용할 필요 귀하의 혼란이 제공 할 수있는 .F 또는 .for 확장자 . 기본적으로이 확장은 ifort에 고정 형식 코드를 요구합니다. 입니다. 그러나 사용하는 컴파일러 버전에서 지원하는 Fortran 기능은 고정 형식 인 경우에도 유효합니다. 다른 Fortran 버전의 기능을 사용할 수 있는지에 대한 자세한 내용은 (Intel Fortran) 설명서를 참조하십시오. 이 예를 들어, 어떻게 든 변경 될 수있는 경우

1 나도 기쁠 것 확장자는 .f90입니다.

2이 설정 적어도 내가 사용했던 버전 (6.9-6.14)를 들어, 아바쿠스 환경 파일에서 변경할 수 있습니다. 나는 그것이 더 새로운 방출로 바뀌 었다고 생각하지 않는다, 그러나 아마. 동의하지 않고 다른 사용자와 환경을 공유하는 경우, 특히 초보자에게 환경을 변경하는 경우 변경하지 않는 것이 좋습니다.

+1

당신은 지시어를 로컬'abaqus_v6.env' 파일에 넣을 수 있고 다른 사용자들을 귀찮게하지 않을 수 있습니다. ('compile_fortran = compile_fortran + [ "- free",]'작동하는 것 같습니다.) – agentp

+0

@agentp 좋은 지적입니다. 고정 형식을 피할 수있는 모든 것. –

+0

고맙습니다. 나는 네 충고에 따라 나의 문제를 해결했다. – Kim

관련 문제