我参加了原子模拟课程,语言是Fortran。 我正在编写一个模拟盒子中原子运动的程序。 我有一个主要和众多的子程序。主程序代码如下:
program Spheres
implicit none
integer :: nspheres
double precision :: rvolume
integer :: ncollisions
double precision :: sigma
double precision, allocatable :: pos(:,:)
integer :: k,j
write(*,*) '1st subroutine read_input:'
call read_input(nspheres,rvolume,ncollisions)
write(*,*) ' '
allocate(pos(1:3,1:nspheres))
write(*,*) '2nd subroutine validate_input:'
call validate_input(nspheres,rvolume)
write(*,*) ' '
write(*,*) '3rd subroutine compute_diameter:'
call compute_diameter(nspheres,rvolume,sigma)
write(*,*) ' '
do k = 1, 3
do j = 1, nspheres
pos(k,j) = k
end do
end do
write(*,*) '4th subroutine assign_positions:'
call assign_positions(pos)
write(*,*) ' '
end program Spheres
我已经创建了一个二维数组,我根据用户输入的整数(整数命名为nspheres)进行分配。 从另一个子程序接收到nspheres后,我为数组分配。
然后,数组被发送到另一个子程序,该子程序决定给定原子量的位置(子程序的名称为assign_positions
)。
" assign_positions'子程序代码如下,与代码的相关部分:
subroutine assign_positions(pos)
double precision, dimension(:,:), intent(inout), allocatable :: pos
integer :: nspheres
...
write(*,*), size(pos,2)
nspheres = size(pos,2)
...
do k = 1, 3
do j = 1, nspheres
write(*,*), pos(k,j)
end do
end do
end subroutine assign_positions
事情是我的讲师想要子程序" assign-positions"从发送数组的大小计算nspheres,而不是发送数组和nspheres整数。
在子程序中,我创建了另一个数组,以便接收发送的数组和另一个名为nspheres的整数(以及其他变量..)。
在该子例程之外(即在它之前)size(pos,2)
返回nspheres
,因为该数组是为nspheres创建的,但是在该子例程中,size(pos,2)
给出了一个巨大的数字, 1862125071。
我正在使用gfortran编译器在虚拟ubuntu环境中工作。
为了测试我的代码,我已经在main中的数组中输入了一些值,然后将它们打印在main中,然后在子suboutine中。 程序已编译,并在转到该子程序时出现下一个错误:
Program received signal SIGBUS: Access to an undefined portion of a memory object.
Backtrace for this error:
#0 0x7FEF314C0E08
#1 0x7FEF314BFF90
#2 0x7FEF30E074AF
#3 0x7FEF3159863F
#4 0x7FEF3159B154
#5 0x7FEF3159BD3E
#6 0x400EC5 in assign_positions_
#7 0x40192D in MAIN__ at Spheres.f90:?
Bus error (core dumped)