LAPACKのdgetrf
およびdgetri
ルーチンでは苦労しています。以下は、私が作成したサブルーチンです(変数fit_coeffsは外部で定義され、割り付け可能ですが、問題はありません)。私が実行すると、メモリ割り当てエラーが発生します。これは、matmul(ATA、AT)行のためにfit_coeffsを割り当てたときに表示されます。私はこれが印刷文の束を挿入することからこれを知っています。また、LAPACKサブルーチンを呼び出した後の両方のエラーチェック文が出力され、エラーが示唆されます。 どこから来たのか誰も理解していますか?私はコマンドを使用してコンパイルしています:LAPACKを使用したFortran2003での動的メモリ割り当てエラー
gfortran -Wall -cpp -std=f2003 -ffree-form -L/home/binningtont/lapack-3.4.0/ read_grib.f -llapack -lrefblas
ありがとうございます!
subroutine polynomial_fit(x_array, y_array, D)
integer, intent(in) :: D
real, intent(in), dimension(:) :: x_array, y_array
real, allocatable, dimension(:,:) :: A, AT, ATA
real, allocatable, dimension(:) :: work
integer, dimension(:), allocatable :: pivot
integer :: l, m, n, lda, lwork, ok
l = D + 1
lda = l
lwork = l
allocate(fit_coeffs(l))
allocate(pivot(l))
allocate(work(l))
allocate(A(size(x_array),l))
allocate(AT(l,size(x_array)))
allocate(ATA(l,l))
do m = 1,size(x_array),1
do n = 1,l,1
A(m,n) = x_array(m)**(n-1)
end do
end do
AT = transpose(A)
ATA = matmul(AT,A)
call dgetrf(l, l, ATA, lda, pivot, ok)
! ATA is now represented as PLU (permutation, lower, upper)
if (ok /= 0) then
write(6,*) "HERE"
end if
call dgetri(l, ATA, lda, pivot, work, lwork, ok)
! ATA now contains the inverse of the matrix ATA
if (ok /= 0) then
write(6,*) "HERE"
end if
fit_coeffs = matmul(matmul(ATA,AT),y_array)
deallocate(pivot)
deallocate(fit_coeffs)
deallocate(work)
deallocate(A)
deallocate(AT)
deallocate(ATA)
end subroutine polynomial_fit
特定のエラーメッセージは何ですか?アレイの大きさは十分ですか? –
こんにちは、ありがとう。エラーは*** glibcが検出されました*** ./a.out:malloc():メモリ破損:0x00000000020dfbd0 ***、バックトレースとメモリマップが続きますが、これは実際にはわかりません。 LAPACKライブラリの理解によれば、配列が十分に大きいことを確認しました。私は、挿入したエラーチェック文のために、外部関数呼び出しに問題があると確信しています。 – Taylor
コンパイラスイッチ '-fcheck = all'を使ってみましたか?また、 'matmul(ATA、AT)'を一時変数に代入してから、その変数を 'matmul'の2回目の呼び出しで使用します。 – eriktous