Fortran如何编写非零元素

时间:2018-08-07 21:45:55

标签: fortran stack

我正在尝试通过将变量的大量选择写到文本文件中来调试不是我编写的大型程序。有些是数组,有些是单个值。

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

我正在寻找一种写出非零元素的方法,而这里的另一篇文章的答案指向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。

请注意,在使用压缩包之前,程序会很好地写入变量,只是文件太大(780 MB),以至于Microsoft word和notepad ++都无法打开它们,我需要这些程序中的比较功能,所以我不能只是用常规记事本打开它们。我停止将它们分成两个文件,然后决定尝试删除所有零。

1 个答案:

答案 0 :(得分:0)

根据注释中的建议,我将堆数组设置为0,尽管visual studio仍然进入chkstk.asm,但它不再返回错误并且pack()可以写出非零元素。