Intel MKL을 처음 사용했습니다. 여기에 문제가 있습니다 - 분명히 MKL 자체와 관련이없는 문제입니다. 그러나 지금까지 알려지지 않은 크기의 배열을 선언하고 다른 서브 루틴으로 서브 루틴의 출력으로 전달하는 방법의 문제에 대한 문제입니다. 내가 PARDISO에 의해 호출에 적합한 자사의 CSR 형식으로 행렬을 변환 mkl_ddnscsr를 사용하기 위해 노력하고있어알 수없는 크기의 배열 (서브 루틴 출력)을 다른 서브 루틴으로 전달
:
CALL mkl_ddnscsr(job,Nt,Nt,Adns,Nt,Acsr,ja,ia,info)
CALL PARDISO(pt,1,1,11,13,Nt,Acsr,ia,ja,perm,1,iparm,0,b,x,errr)
문제는, 나는 CSR의 길이가 ACSR 인덱스를 형성 무슨 생각이 없다 벡터 mkl_ddnscsr 서브 루틴을 호출하기 전에 ja. 주 프로그램이나이 두 줄이있는 서브 루틴에서 Acsr과 ja를 어떻게 선언해야합니까?
나는 메인 프로그램에서 인터페이스 외부INTEGER, ALLOCATABLE :: ja(:)
REAL(KIND=8), ALLOCATABLE :: Acsr(:)
다음
INTERFACE
SUBROUTINE mkl_ddnscsr(job, m, n, Adns, lda, Acsr, ja, ia, info)
IMPLICIT NONE
INTEGER :: job(8)
INTEGER :: m, n, lda, info
INTEGER, ALLOCATABLE :: ja(:)
INTEGER :: ia(m+1)
REAL(KIND=8), ALLOCATABLE :: Acsr(:)
REAL(KIND=8) :: Adns(:)
END SUBROUTINE
END INTERFACE
같은 것을 시도했다. 그러나이 구성을 사용하면 실행 중 분할 오류가 발생합니다. 한편
, 내가
INTERFACE
SUBROUTINE mkl_ddnscsr(job, m, n, Adns, lda, Acsr, ja, ia, info)
IMPLICIT NONE
INTEGER :: job(8)
INTEGER :: m, n, lda, info
INTEGER :: ja(:), ia(m+1)
REAL(KIND=8) :: Acsr(:), Adns(:)
END SUBROUTINE
END INTERFACE
다음
INTEGER, DIMENSION(:) :: ja
REAL(KIND=8), DIMENSION(:) :: Acsr
같은 그런 다음 ifort 나에게 다음과 같은 메시지를 줄 것이라고 시도하는 경우 :
error #6596: If a deferred-shape array is intended, then the ALLOCATABLE or POINTER attribute is missing; if an assumed-shape array is intended, the array must be a dummy argument.
사람은 어떤 생각을 가지고 이 문제를 해결하는 방법? 주 프로그램 (또는 주요 서브 루틴)에서 ja와 Acsr을 선언하고이를 전달하는 올바른 방법은 무엇입니까?
서브 루틴은 인텔 MKL 패키지의 일부이며, 독자적으로 쓰는 것이 아니므로 module
은 문제가되지 않습니다.
태그 fortran을 사용하십시오. 제목에서 반복 할 필요는 없습니다. 'kind = 8'은 추악한 코드 냄새입니다 –