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如何编写非零元素的主要内容,如果未能解决你的问题,请参考以下文章