Программа, подающая сигнал SIGABRT: обрабатывает сигнал сброса в одном коде, а не в другом коде - PullRequest
0 голосов
/ 25 января 2020

Я пытаюсь запустить этот код, но не понимаю, почему я получаю ошибку СЕГМЕНТАЦИИ для кода?

Видимо, когда я устанавливаю значение y, равное 2.718 (равно e), код работает нормально без каких-либо ошибок. Но когда я изменяю значение y, код выдает ошибку сегментации.

Я опробовал опции - fcheck для 'all' и 'bounds' для обоих опций, но мое устройство не вернуло ни одной ошибки. Я очень запутался тогда, почему код дает эту ошибку ?? Пожалуйста, помогите мне

program Trial
implicit none
 integer :: i,j,L,a,b,c,d,niter,time,mm,nn,N,k,g1,g2,w ! n is iteration time
 real :: r,h,E,Ei,Ef,f,E1,E2,S,y
 real :: JE=1.0
 integer, dimension(8) :: values
 integer, dimension(:,:), allocatable :: spin
 integer, dimension(:), allocatable :: seed
 !integer, dimension(0:100) :: G, Hi
 real, dimension(100) :: G,Hi,Hit, root
 !integer, dimension(0:1) :: 
 character(len=30) ::  charac_b
 !seed=44589
 charac_b = 'store_config'
 print *,'Enter the number of lattice points:'
 read *,L
 print *, 'Enter number of iterations:'
 read *,niter

!Initialisation of G & H. G is density of states and H is the Histogram
 do i=1,101
  G(i)=1.0
  Hi(i)=0.0
  Hit(i)=-200+4*(i-1)
 end do

f=2.71828183
do i=1,21
 root(i)=f
 f=f**(0.5)
end do
! Min fn gives minimum of the value
 allocate(spin(L,L))
 E=0.0
 S=0.0
 N=L*L

!Generator of Random Numbers 
 call date_and_time(VALUES=values)
 call random_seed(size=k)
 allocate(seed(k))
 seed(:)=values(:)
 call random_seed(put=seed)

!Initialising Data
 open(12,file="Data_initial.txt")
 do i=1,L
  do j=1,L
   call RANDOM_NUMBER(r)
   if(r<0.5) then
    spin(i,j)=+1
   else
    spin(i,j)=-1
   end if
  write(12,*) float(i),float(j),float(spin(i,j))
 end do
 end do
 close(12) 

!Calculating energies

 do i=1,L
  do j=1,L
   a=i+1;b=i-1;c=j+1;d=j-1
   if(i==L)a=1
   if(i==1)b=L
   if(j==1)d=L
   if(j==L)c=1

   !M=M+spin(i,j)
   E=E-JE*float((spin(i,j))*(spin(a,j)+spin(b,j)+spin(i,c)+spin(i,d)))
  end do
 end do
 E=E*0.5
 print *,'intial energy and per spin=',E,E/float(N)
 !print *,'initial magnetisation and per spin=',M,mag

!Going for a random flipping now
!f=2.71828183
!do kt=1,21
y=root(2)
!y=2.5
do time=1,niter
do mm=1,L
 do nn=1,L
  call RANDOM_NUMBER(r); i=int(r*float(L))+1
  call RANDOM_NUMBER(r); j=int(r*float(L))+1
  a=i+1;b=i-1;c=j+1;d=j-1
    if(i==L)a=1
    if(i==1)b=L
    if(j==1)d=L
    if(j==L)c=1
  Ei=-JE*float((spin(i,j))*(spin(a,j)+spin(b,j)+spin(i,c)+spin(i,d)))
  spin(i,j)=-spin(i,j)
  Ef=-JE*float((spin(i,j))*(spin(a,j)+spin(b,j)+spin(i,c)+spin(i,d)))
  E1=E
  E2=E1+(Ef-Ei)
  g1=int((E1+200.0)/4)+1
  g2=int((E2+200.0)/4)+1
  if(g2<=g1) then
   G(g2)=LOG(G(g2))+LOG(y)
   !G(g2)=G(g2)*f
   Hi(g2)=Hi(g2)+1
  else 
   call RANDOM_NUMBER(h)
   if(h<=G(g1)/G(g2)) then
    G(g2)=LOG(G(g2))+LOG(y)
    !G(g2)=G(g2)*f
    Hi(g2)=Hi(g2)+1
   else
    G(g1)=LOG(G(g1))+LOG(y)
    !G(g2)=G(g2)*f
    Hi(g1)=Hi(g1)+1
    spin(i,j)=-spin(i,j)
   end if
  end if
  E=E2
  end do
 end do
end do
 do i=1,101
   S=S+(Hit(i)*Hi(i))
 end do
 do i=1,101
  if(Hi(i) .lt. 0.95*(real(S/101.0))) then
   print *,"No",i
   exit
  end if
 end do
 do j=1,101
  Hi(j)=0.0
 end do
 !f=f**(0.5)
!end do
 open(13,file="Data_final.txt")
   do w=1,101
    write(13,*) Hit(w), G(w), Hi(w)
   end do
deallocate(spin)
deallocate(seed)
end program Trial

1 Ответ

1 голос
/ 26 января 2020

Что вам действительно нужно сделать, так это скомпилировать вашу программу для проверки ошибок всякий раз, когда вы подозреваете проблему. Я предлагаю делать это каждый раз во время разработки. Затем, когда вы спрашиваете здесь, вы всегда должны сообщать полный вывод программы, особенно полное сообщение об ошибке. Если вы используете опции, которые я предложил в комментарии

> gfortran -g -fbacktrace -Wall -fcheck=all spins.f90 

, и запускаете код, у вас есть много полезной информации

> ./a.out 
 Enter the number of lattice points:
5
 Enter number of iterations:
1
At line 22 of file spins.f90
Fortran runtime error: Index '101' of dimension 1 of array 'g' above upper bound of 100

Error termination. Backtrace:
#0  0x7f4df5a28640 in ???
#1  0x7f4df5a29185 in ???
#2  0x7f4df5a2952a in ???
#3  0x400fee in trial
        at spins.f90:22
#4  0x403f8c in main
        at spins.f90:141

, которая действительно должна быть включена в ваш вопрос.

Указывает на указанную c строку кода. Даже без опции проверки вы все равно получаете обратную трассировку, которая все еще указывает на строку кода.

#3  0x400fee in trial
            at spins.f90:22

Вывод опции проверки более конкретен c.

Index '101' of dimension 1 of array 'g' above upper bound of 100

Таким образом, cra sh происходит в самом начале

 do i=1,101
  G(i)=1.0
  Hi(i)=0.0
  Hit(i)=-200+4*(i-1)
 end do

потому что массивы объявляются только от 0 до 100, а не 101.

Значение y представляется красной сельдью. К сожалению, некоторые моменты в вашем вопросе смутили меня и привели к рассмотрению неправильных частей кода. Возможно, вы неправильно применили опцию -=fcheck=all или применили ее только к другой версии кода. Обязательно используйте его всегда и перезапустите код после его использования.

...