Fortran如何编写非零元素

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Fortran如何编写非零元素相关的知识,希望对你有一定的参考价值。

我试图通过将大量变量写入文本文件来调试一个不是我编写的大型程序。有些是数组,有些是单值。

由于代码不完整而且人们不想使用分配方法,因此声明的数组具有巨大的初始大小,因为没有人知道将多少东西添加到代码中。因此,如果我直接打印出整个变量,它还会打印出我不需要的数百万个零,并使文件比必要的大得多。

我搜索了一种写出非零元素的方法,另一篇文章的答案指向了pack()函数。

但是,pack()似乎有一个大小限制,因为visual studio甚至不会进入实际调用pack的行 - visual studio在进入写入变量的子例程时输入chkstk.asm并在执行任何执行之前返回堆栈溢出错误子例程中的行(子例程中的前几行只是打开文件并写入非数组变量)。

那么,我还能做些什么来写出这些巨大数组中的所有非零元素?

子程序的开头如下所示:

      subroutine write_everything(fileIDa,fileNamea,fileIDb,fileNameb)
          use flags
          use const
          use mphase_props_v
          use sample_props_v
          use grain_props_v
          use mphase_state_v
          use grain_state_v
          use mphase_rate_v
          use grain_rate_v
          use sample_state_v
          use sample_rate_v
          use twinning_v
          use hard_law1_v
          use back_stress_v
          use phase_transf_v
          use bc_v
          use diffract_v
          use output_v
          use YS_v
          use epsc_var

        integer, intent(in) :: fileIDa,fileIDb
        character(len=40), intent(in) :: fileNamea,fileNameb

 1      format(1h,78('*'))

        open(unit=fileIDa,file=fileNamea,status='unknown')

        write(fileIDa,'(''flags'')')
        write(fileIDa,1)
        write(fileIDa,*) ishape,irot,ipileup,kSM,iPoleFigFlag,i_diff_dir
     #    ,iDiag,kCL,iSingleCry,iTwinLaw,i_prev_proc,iDetwOpt,iDtwMfp
     #    ,ilatBS,iBackStress,iPhTr,itwinning,iOutput,itexskip,nCoatedPh
     #    ,nCoatingPh,ivarBC,inonSch

        write(fileIDa,'(''mphase_props_v'')')
        write(fileIDa,1)
        write(fileIDa,*) pack(nsm,nsm.ne.0),pack(itw,itw.ne.0)
     #    ,pack(nmodes,nmodes.ne.0),pack(nsys,nsys.ne.0)
     #    ,pack(nslmod,nslmod.ne.0),pack(nslsys,nslsys.ne.0)
     #    ,pack(ntwmod,ntwmod.ne.0),pack(ntwsys,ntwsys.ne.0)
     #    ,pack(nphngr,nphngr.ne.0),pack(icrysym,icrysym.ne.0)
     #    ,pack(ISECTW,ISECTW.ne.0),pack(ngrnph,ngrnph.ne.0)

一些阵列的大小为10,但其他一些大小为10000甚至50乘10000。

请注意,在我使用pack之前,程序写的变量很好,除了文件太大(780 MB),微软word和notepad ++都不会打开它们,我需要这些程序的比较函数,所以我不能打开它们常规记事本。我没有将它们分成两个文件,并决定尝试删除所有零。

答案

根据评论的建议,我将堆数组设置为0,尽管visual studio仍然进入chkstk.asm,它不再返回错误,pack()写出非零元素就好了。

以上是关于Fortran如何编写非零元素的主要内容,如果未能解决你的问题,请参考以下文章

如何创建接口以将 c 字符数组转换为 fortran

Qt图形界面程序如何调用fortran编写的控制台程序?

如何在由 MPI 并行化的 fortran 中调用子例程?

在MATLAB中,如何找出矩阵的非零元素。并且输出它所在的行和列。只要非零就为真。输出1。。

Matlab如何提取非零元素

将 Fortran 转换为 C 或 C++