Hi Everybody,
First of all, Happy New Year!
I ran into "Segmentation fault" for big "n" when trying to overload
operators, the results I got are all correct for "n" not too big.
After several tests I found my problem can be simplified as the the
following simple test program:
for example, if n < 700, the program works fine,
but if n >= 800, I got "Segmentation fault"
the other problem is:
if I comment out the line: print *, 'max_diff=', maxval(A-S)
then the program works for bigger n, for example, n=1000 is fine,
but for even larger n, say n > 1500, there is still
"Segmentation fault"
my other observation is:
if I change A, Q, S into allocatable arrays, with dimension
(n, n), n from user input, then there seems not any problem
(to save your trouble of typing, I also attached the code using
allocatable array at the end)
I am a beginner of Fortran90, so I don't know what essentially
goes wrong with the following program, your assistance will be
highly appreciated.
--
Yunkai Zhou
Computational & Applied Math Dept
Rice University
!=================================================================
Program TEST
Implicit None
Call auto_array_test
Contains
Subroutine auto_array_test()
Integer, Parameter :: n =1000
!! please change n here and recompile
Double Precision, Dimension(n,n) :: A, Q, S
Integer :: i
print *, 'n =', n
do i =1,n
call random_number(A(i,:))
end do
S = A; Q =A
A = dtest(Q,S)
S = S + Q
print *, 'max_diff=', maxval(A-S)
! S = S + Q - A
! print *, 'max_diff=', maxval(S)
End Subroutine auto_array_test
Function dtest(A,B)
Double Precision, Intent(IN) :: A(:,:)
Double Precision, Intent(IN) :: B(:,:)
Double Precision :: dtest(size(A,1),size(B,2))
dtest = A + B
End Function dtest
End Program TEST
!=================================================================
Program TEST2
Implicit None
Call auto_array_test
Contains
Subroutine auto_array_test()
Double Precision, Dimension(:,:), Allocatable :: A, Q, S
Integer :: n, i
print *, 'input n = '
read *, n
Allocate(A(n,n), Q(n,n), S(n,n))
do i =1,n
call random_number(A(i,:))
end do
S = A; Q =A
A = dtest(Q,S)
S = S + Q
print *, 'max_diff=', maxval(A-S)
Deallocate(A,Q,S)
End Subroutine auto_array_test
Function dtest(A,B)
Double Precision, Intent(IN) :: A(:,:)
Double Precision, Intent(IN) :: B(:,:)
Double Precision :: dtest(size(A,1),size(B,2))
dtest = A + B
End Function dtest
End Program TEST2
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|