程序收到信号 SIGSEGV:分段错误 - 大尺寸数组中的内存引用无效

2023-12-01

我在运行此代码时遇到错误。当我使用 L=16 或 L=32 等小 L 运行代码时,我没有得到任何错误,但在 7000-8000 步后,在 L = 128 或 L=96 中,我得到以下错误:

Program received signal SIGSEGV: Segmentation fault - invalid memory reference.

Backtrace for this error:
#0  0x7FBA5CAC3E08
#1  0x7FBA5CAC2F90
#2  0x7FBA5C1E84AF
#3  0x402769 in MAIN__ at newhys.f90:?
Segmentation fault (core dumped)

这是完整的代码:

    SUBROUTINE init_random_seed()

        implicit none
        INTEGER :: i, n, clock
        INTEGER, DIMENSION(:), ALLOCATABLE :: seed
        CALL RANDOM_SEED(size = n)
        ALLOCATE(seed(n))
        CALL SYSTEM_CLOCK(COUNT=clock)
        seed = clock + 37 * (/ (i - 1, i = 1, n) /)
        CALL RANDOM_SEED(PUT = seed)
        DEALLOCATE(seed)

    END SUBROUTINE

!end module

Program Activ_mater
    USE OMP_LIB
    Implicit none
     Integer,parameter :: time=1000000000, L=128,  N = L**2*2
     Integer,parameter:: n_thread = 8
     Real(8),parameter :: pi = 3.14159265359
     Real(8),parameter :: v0 = 0.50, alpha = 1.0/36.0
     real(8)START,END_1 ,eta
    type block_p
        Integer :: partical_N
        Integer :: particle_ad(10*L)
    end type

    Type(block_p) ,pointer,dimension(:,:)    :: C

     Real(8),allocatable :: x(:), y(:) , phi,angle_new(:),angle(:)
     Real(8) :: sum_a, sum_b,x_in, y_in, x_out, y_out, avrage_t, r,ra,eta1(5)
     Integer :: i,j,t,n_p,I_b,J_b,b_l,neighbor_i(9),neighbor_j(9),A,n_p_b,ne = 1,stateta=0,ot=0,op=175
    character(len=10)::name1
    call omp_set_num_threads(n_thread)
    call init_random_seed()


    eta1=(/2.100,2.116,2.120,2.126,2.128/)           ! The value of ETA
    allocate(x(2*n), y(2*n) , phi,angle_new(2*N),angle(2*N))
    allocate(C(2*L,2*L))
    C(:,:)%partical_N=0

    do i =1,N
        call random_number(ra)
        x(i)=ra*L
        I_b = int(x(i))+1
        call random_number(ra)
        y(i)=ra*L
        J_b = int(y(i))+1
         call random_number(ra)
         angle(i)=ra*2.0*pi
         C(I_b,J_b)%partical_N = C(I_b,J_b)%partical_N + 1      !Number of particle in block C(I_b,J_b)
         C(I_b,J_b)%particle_ad( C(I_b,J_b)%partical_N ) = i    ! The particle number in block C(I_b,J_b)
    end do
                 ! loop for eta
     eta= 0.0
     write(name1,'(f5.3)')eta
      open(unit=10, file='Hysteresis,'//trim(name1)//'.dat')
!=====================explanation of system====================================
print*,'==========================================================================='
print*, 'eta = ', etA ,'         ',' alpha = ',alpha
print*,'L=',L ,'         ', 'Particle Number=', N,'         ','Density=', N/L**2
print*,'==========================================================================='
!==============================================================================
START = omp_get_wtime()
    do t =1,time
        if (ot == 300000 )then
            stateta = 0
            ot = 0
            op = op + 1
        end if
    if (stateta == 0 )then
     eta = eta + ((1.0/3.0) * (10E-6))
     endif
     if (int(eta * 100) == op) then
        stateta = 1
     end if
     angle_new(:)=0
    !$OMP PARALLEL DEFAULT(PRIVATE) SHARED(x,y,angle,angle_new,c) firstprivate(eta)
     !$OMP DO schedule(runtime)
        do i =1, N
        sum_a=0; sum_b=0;n_p=0
         I_b = int(x(i))+1;  J_b = int(y(i))+1           ! The block of particle i
         ! Now I should find nine neighbor of particle i-----------------------------------------------
         neighbor_i=(/I_b+1, I_b,   I_b-1, I_b,   I_b+1, I_b-1, I_b-1, I_b+1, I_b/)
         neighbor_j=(/J_b,   J_b+1, J_b,   J_b-1, J_b+1, J_b+1, J_b-1, J_b-1, J_b/)
         do b_l = 1, 9
            I_b = neighbor_i(b_l) ; J_b=neighbor_j(b_l)
            if (I_b >L )I_b=1
            if (I_b <1 )I_b=L
            if (J_b >L )J_b=1
            if (J_b <1 )J_b=L
            !neighbor_i(b_l)=I_b; neighbor_j(b_l)=J_b
             A = C( I_b, J_b )%partical_N ! number of particle in block C( neighbor_i(b_l), neighbor_j(b_l) )
         !=============================================================================================
            do n_p_b =1, A

              j =  C( I_b, J_b)%particle_ad(n_p_b) !particle j in the block C

                if (i /= j )then
                    X_in = abs(max(x(i),x(j)) - min(x(i),x(j)));
                    Y_in = abs(max(y(i),y(j)) - min(y(i),y(j)));
                    X_out =L-X_in
                    Y_out =L-Y_in
                    r = sqrt(min(X_in,X_out)**2 + min(Y_in,Y_out)**2)
                else
                    r=0.0
                end if

                      if ( r < 1 )then
                if ( j <= i )then
                    sum_A = sum_A + sin(angle(j));
                    sum_B = sum_B + cos(angle(j));
                else
                    sum_A = sum_A + alpha*sin(angle(j));
                    sum_B = sum_B + alpha*cos(angle(j));
                endif
                n_p   = n_p + 1;
              endif
            enddo
            enddo
            sum_A = sum_A/n_p; sum_B = sum_B/n_p
    !if (int(sum_A*1e10) ==0 .and. int(sum_B*1e10) ==0 )print*,'zerrooo'
            avrage_t=atan2(sum_A,sum_B);
            if (avrage_t<0.0) then
                avrage_t=avrage_t+2.0*pi;
            endif

             call random_number(ra)
            angle_new(i)=avrage_t+eta*(ra-0.50)

            if( angle_new(i)>=2*pi) angle_new(i)= angle_new(i)-2*pi
            if( angle_new(i)<0) angle_new(i)= 2*pi+angle_new(i)

        end do
         !$OMP END DO
           !$OMP END PARALLEL
        angle = angle_new
          C(:,:)%partical_N=0
         ! phi=0.0
            do i=1, N

                x(i) = x(i) + v0*sin(angle(i));
                if (x(i)<1) x(i)=L+x(i)
                if (x(i)>L)   x(i)=x(i)-L
                I_b = int(x(i))+1

                y(i) = y(i)+ v0*cos(angle(i));
                if (y(i)<1) y(i)=L+y(i)
                if (y(i)>L)   y(i)=y(i)-L
                J_b = int(y(i))+1
                C(I_b,J_b)%partical_N = C(I_b,J_b)%partical_N + 1
                C(I_b,J_b)%particle_ad( C(I_b,J_b)%partical_N ) = i
            end do
            if (stateta == 1 )then
                 phi=  sqrt((sum(sin(angle))**2+sum(cos(angle))**2))/N;
                 ot = ot + 1
            end if





        write(10,*)phi
            if (mod(t,10)==0)then
              !  ave4_phi=sum(phi**4)/t;
               ! ave2_phi =sum(phi**2)/t;
            !print* ,ave4_phi,ave2_phi
                print*,'Time=',t,' ==== Eta : ',eta,"Ot : " , ot
            end if

    end do
    END_1 = omp_get_wtime()
    print*,'Run Time = ',end_1-start
End Program

P.S.(1):我使用 omp lib 并行运行我的程序

P.S.(2):我使用gfortran来编译代码

P.S.(3):编译的代码-g -fcheck=all并给我这个错误:

At line 155 of file z.f90 Fortran runtime error: Index '1281' of dimension 1 of array 'c%particle_ad' above upper bound of 1280

谢谢大家


Your particle_ad数组只有空间10*L粒子,但你似乎试图存储最多N=2*L**2其中的粒子(取决于随机数如何下降)。平均而言,每个粒子都有足够的空间,但是如果太多粒子落入单个块中,您的代码将会失败,并且(如果我没记错概率)发生这种情况的可能性会增加L增加。

您可以通过替换来解决这个问题Integer :: particle_ad(10*L) with Integer :: particle_ad(N),但这会浪费大量空间。

更好的解决方案是重新调整大小particle_ad动态数组,每次填满时都会使它们变大。为了方便起见,您可以将此行为包装在block_p class.

例如,

type block_p
  Integer :: partical_N
  Integer, allocatable :: particle_ad(:)
contains
  subroutine add_particle(this, index)
    class(block_p), intent(inout) :: this
    integer, intent(in) :: index
    
    integer, allocatable :: temp
    
    ! Update partical_N.
    this%partical_N = this%partical_N + 1
    
    ! Resize particle_ad if it is full.
    if (size(this%particle_ad)<this%partical_N) then
      temp = this%particle_ad
      deallocate(this%particle_ad)
      allocate(this%particle_ad(2*this%partical_N))
      this%particle_ad(:size(temp)) = temp
    endif
    
    ! Add the new index to particle_ad.
    this%particle_ad(this%partical_N) = index
  end subroutine
end type

然后你可以更换线路

C(I_b,J_b)%partical_N = C(I_b,J_b)%partical_N + 1
C(I_b,J_b)%particle_ad( C(I_b,J_b)%partical_N ) = i

with

call C(I_b,J_b)%add_particle(i)

请注意,由于每个particle_ad数组现在是allocatable,您需要先初始化每个数组,然后才能调用add_particle.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

程序收到信号 SIGSEGV:分段错误 - 大尺寸数组中的内存引用无效 的相关文章

  • 从 Fortran 字符串中提取单个字符

    我需要一个程序将基数 a 转换为基数 b 其中基数 a 和 b 可以是从 2 到 36 我的想法是使用字符串作为数字 作为中介转换为基数 10 然后从基数 10 转换为基数 b 由于我是 Fortran 新手 我不太理解函数和子字符串 现在
  • FORTRAN 写()

    在开始之前 我必须先声明一下 我是 FORTRAN 的新手 我正在维护 1978 年的一段遗留代码 它的目的是从文件中读取一些数据值 处理这些值 然后将处理后的值输出到另一个文本文件 给出以下 FORTRAN 代码 INTEGER NM S
  • 最佳 Fortran IDE [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 stackoverflow上有人用Fortran吗 您使用什么 IDE 您认为哪一个是最好的 似乎我周围的很多人都对 Intel Visu
  • 指定 gfortran 应该在其中查找模块的目录

    我目前基于模块来编译程序 例如主程序foo这取决于模块bar 如下 gfortran c bar f90 gfortran o foo exe foo f90 bar o 当foo f90 and bar f90位于同一目录中 如何指定 g
  • 将数组从 .npy 文件读入 Fortran 90

    我使用 Python 以二维数组 例如 X 的形式生成一些初始数据 然后使用 Fortran 对它们进行一些计算 最初 当数组大小约为 10 000 x 10 000 时 np savetxt 在速度方面表现良好 但是一旦我开始增加数组的维
  • 如何格式化整数以仅具有所需的大小?

    我一直在尝试以下代码 program hello write i9 10 end program hello 并改变格式字符串 尝试使写入输出的字符串大小恰好满足表示整数所需的大小 但到目前为止我无法管理它 如何在 Fortran 中编写
  • Fortran 中的共享库,最小示例不起作用

    我试图了解如何在 Linux 下的 Fortran 中动态创建和链接共享库 我有两个文件 第一个 liblol f90 看起来像这样 subroutine func print lol end subroutine func 我用它编译gf
  • GO TO 语句 - Fortran 到 Matlab

    我一直在努力将此网格搜索代码从 Fortran 转换为 Matlab 但是我无法正确合并 GO TO 语句 我正在尝试使用 while 循环 但我认为我需要其他东西来结束搜索 任何帮助将不胜感激 vmax 1 0E 15 amax G 1
  • 指针的 Fortran 副本

    我有一个包含指针 p 的 var 类型 我需要将 var 复制到与 var 类型相同的另一个变量 var1 上 通过执行 var1 var 在引号中 因为我不知道这是否是正确的方法 请参见下文 在我的实现中 var 和 var1 被传递给一
  • Fortran 内部计时例程,哪个更好? cpu_time 或 system_clock

    当对 FORTRAN 程序进行计时时 我通常只使用命令call cpu time t 然后我偶然发现call system clock count count rate count max 这似乎做了同样的事情 然而 在更加困难的庄园里 我
  • 这些双精度值如何精确到小数点后 20 位?

    当精度是一个问题时 我正在测试一些非常简单的等价错误 并希望以扩展双精度执行操作 这样我就知道答案在 19位数字中 然后以双精度执行相同的操作 其中第 16 位会有舍入误差 但不知何故 我的双精度算术保持了 19 位精度 当我在扩展双精度中
  • MPI_Gather 在最基本的代码中给出了 seg 错误

    我正在开发一个更大的程序 但我在 MPI Gather 上遇到了困难 我编写了一个最小的示例代码 请参见下文 program test use MPI integer ierr rank size double precision allo
  • 在 VSCode Fortran 调试中检查从另一个模块导入的变量

    我正在调试一些包含许多 Fortran 模块的代码 其中一些模块彼此共享变量 不幸的是 带有 VScode 的 gdb 在调试时似乎无法检查导入的变量 目前 当我需要检查导入的变量时 唯一的方法是停止调试 并手动更改代码以包含等于导入变量的
  • 使用 Cygwin64 的 Fortran MPI

    我正在使用 Codeblock IDE 编写和编译我的 Fortran 程序 现在我想将 MPI 包含到我的 GNU Fortran 编译器中 在遵循 GNU GCC 编译器的一些指南之后 我突然想到我需要为 MPICH2 设置以下内容 有
  • Fortran 读取语句中的“end”是什么意思?

    什么是end 这段代码片段的意思是什么 read portNum 100 end 900 readline 附 我已经尝试用谷歌找到这个 但没有运气 用户3600286 直接引用自this pdf http www tomzap com n
  • 当输入字符而不是数字时,防止 FORTRAN 关闭

    我有一个读取语句需要一个数字 非常简单的示例代码 program test integer var read var end 问题是我通常输入一串字符 即 yes 因为分心 如何防止我的代码完全停止并显示以下类型的错误消息您输入了错误的值
  • 如何在fortran中调用和使用另一个子程序中的子程序?

    我正在编写一个程序 其中主程序包含许多子例程和函数 为了构造主程序的这些子程序之一 假设是子程序 A 我需要使用另一个子程序 假设是 B 我的问题是 如何调用子程序A并使用子程序B 我是初学者 我已经搜索了很多 但没有找到我清楚理解的东西
  • 如何在 Fortran 中实现数组结构而不是结构数组?

    我正在使用 Fortran 编写有关 CFD 主题的代码 在与一些计算机科学领域的朋友讨论后 他们告诉我 如果在他 她的代码中实现数组结构 SoA 而不是结构数组 AoS 可以加快计算时间 我见过很多关于这个主题的实现的例子 但大多数都是用
  • 错误:(1) 处的分配中的等级 0 和 1 不兼容

    我正在不规则网格上使用有限差分方法 这是代码的重要部分 IMPLICIT DOUBLE PRECISION A Z REAL 16 IPSI ICORR POT 20000 VA 20000 delta1 20000 delta2 2000
  • & 位于第 5 列和行尾

    我今天遇到一些代码 如下所示 subroutine sub hello world this routine takes a crazy large number of arguments so many that it gets spli

随机推荐

  • 一页上有多个倒计时器

    目前正在开发一个需要在一页上有两个计时器的项目 定时器需要有一个启动按钮 并且两者都有不同的计时 即定时器 1 持续 10 秒 定时器 2 持续 20 秒 这是我正在使用的脚本 但我不知道如何复制计时器并让每个计时器独立工作 有没有人可以轻
  • php、文件下载

    我正在使用简单的文件下载脚本 if file exists file header Content Description File Transfer header Content Type application octet stream
  • R Shiny 保存反应性 ggplots

    我试图弄清楚如何在我的 R Shiny 项目中保存反应性 ggplots 我已经关注了this指南以及 R Shiny 网站上的指南 但是 我认为我可能遇到问题 因为我使用的是反应图 这是我到目前为止的代码 ui lt fluidPage
  • 如何将对象中数组的索引值添加到键

    我在变量中有一个对象info as 0 ProId Space Name cake Quantity 1 1 ProId new Name walk Quantity 1 我正在尝试将数量值更改为index 1对于每个索引 我尝试将静态值设
  • 如何使用 CASE 更新 MySQL 中的条目以获得新值?

    谁能告诉我如何解决这个查询 update ae44 set Price Case when ID AT259793380 then 500 when ID AT271729590 then 600 when ID AT275981020 t
  • 将数据变量传递给 R 公式

    假设我想写anscombe gt lm tidy x1 y1 其实我想写anscombe gt lm tidy x1 y1 where x1 and y1是数据框的一部分 因此 由于以下功能似乎有效 plot gg lt function
  • 如何将文本添加到按钮上方的 Inno Setup 斜线?

    如何将文本添加到按钮上方的 Inno Setup 斜线 来自 Inno Setup 帮助 特殊用途的 BeveledLabel 消息可用于指定一条线 向导窗口左下角显示的文本 和卸载程序窗口 下面是一个例子 Messages Beveled
  • 如何在 Swift 中使用命名空间?

    文档只提到了嵌套类型 但不清楚它们是否可以用作命名空间 我没有发现任何明确提及名称空间的内容 我认为 Swift 的命名空间是令人向往的 它的大量广告与实际情况不符 例如 WWDC 视频指出 如果您导入的框架有一个 MyClass 类 并且
  • Python Max/Min 函数中的 iter 和 key 如何工作? [复制]

    这个问题在这里已经有答案了 我对 Python 比较陌生 我一直在阅读各种内置函数的文档 当涉及到最大 最小函数时 max arg1 arg2 args key or max iterable key 我知道 arg1 arg2 等或 it
  • Jquery - 我不应该重复选择器(存储在变量中)吗?

    有时我发现自己多次重复选择器 我是否应该以某种方式将 jquery 对象存储到变量中 然后只使用该变量 举个简单的例子 以下内容怎么样 a contactus css padding 10px a contactus css margin
  • 我可以使用 lambda 重写 JDK8 中功能接口的 toString 方法吗?

    这个问题在这里已经有答案了 我可以重写功能接口的 toString 方法吗 或者改写一下 是否有优雅的方法来更改实现函数式接口并使用 lambda 重写 toString 方法的匿名内部类 当我在JDK8中创建lamba表达式时 我可以覆盖
  • python 对象到本机 c++ 指针

    我正在考虑使用 python 作为我正在从事的项目的嵌入式脚本语言 并且已经完成了大部分工作 但是我似乎无法将 python 扩展对象转换回本机 c 指针 这是我的课 class CGEGameModeBase public virtual
  • 寻找衍生脚本

    我正在拼命寻找可以计算函数一阶导数的 JavaScript 该函数始终仅包含一个变量 x e g f x x f 3 2x 因此 脚本应提供结果 6 因为2 3 6 我希望你明白我的意思 function slope f x dx dx d
  • .NET 在服务器上创建计划任务失败并显示 E_ACCESSDENIED

    我有一个 ASP NET 网站 C 语言 它接收用户数据 然后尝试创建 Windows 计划任务 当然 这在 DEV 机器上运行得很好 但在服务器上运行失败 我试图弄清楚 ASPNET 用户 或匿名 Web 用户 需要什么权限才能创建任务
  • 在 C++ 上解析 JSON 文件并获取主键的所有子文件[关闭]

    Closed 这个问题需要多问focused 目前不接受答案 我使用 boost 库 需要在 C 上解析一些 json 文件 对于前 json 部分 media Test1 https storage tst Test2 https sto
  • 在多列中查找字符串?

    我有一个包含 3 列 tel1 tel2 tel3 的数据框 我想保留一列或多列中包含特定值的行 例如 我想保留列 tel1 和 tel2 或 tel3 以 06 开头的行 我怎样才能做到这一点 谢谢 让我们用这个df作为示例数据框 In
  • 在量角器测试中修改 http 响应

    我正在尝试为应用程序的登录过程编写一些端到端测试 但我无法理解设置用户需要更改密码的场景的最佳方法 当我们的服务器响应成功登录时 会返回一个用户对象 其中包含changePassword场地 然后客户端检查响应并相应地重定向 我的问题是设置
  • 应用程序小部件未显示在 ICS 应用程序抽屉中

    有没有人经历过他们的应用程序小部件未列在 ICS 应用程序抽屉中 最初我为 FroYo 及以下版本启动了这个应用程序 它很好地支持应用程序小部件 随后出现了 Gingerbread 和 Honeycomb 它们也很有效 如果我打开 小部件预
  • 如何使用 readXML 读取 xml 属性? dataset.readxml如何转换为表格?

    我只是想知道 readXML 生成的表是什么样子的 假设 xml 文件看起来像这样
  • 程序收到信号 SIGSEGV:分段错误 - 大尺寸数组中的内存引用无效

    我在运行此代码时遇到错误 当我使用 L 16 或 L 32 等小 L 运行代码时 我没有得到任何错误 但在 7000 8000 步后 在 L 128 或 L 96 中 我得到以下错误 Program received signal SIGS