首页 > 解决方案 > 每次运行时,我的数据文件都会保存在不同的最终点

问题描述

我通过 Force 2.0 使用 Fortran 90,在 Windows 10 下使用 64 位 pc。每次编译和执行我的代码时,我在 .dat 文件中编写的列之一(左侧的“t”)都会更改,即使我没有不要更改我的代码。

! module
       module force_param
       implicit none
       integer,parameter :: dim=3
       integer,parameter :: dim_l=dim-1
       real*8,parameter :: rapmas=0.5, omega2=100, fsm2=1.E-4, x0_=0.1E0, x2_ =0.01E0
       real*8,parameter :: omeg=10.d0, Aex=0.01E0
       contains
       subroutine force(x,v,f)
       implicit none
       real*8 :: x(dim), v(dim), f(dim_l)
       f(1)=-omega2*(x(1)-x(3)) - omega2*rapmas*(x(1)-x(2))
       f(2)=-omega2*(x(2)-x(1)) - fsm2*(v(1)-v(3))
       end subroutine force
       end module force_param





      ! algorithme de heun

        subroutine heun(x,v,xn,vn,dt)
        use force_param
       IMPLICIT NONE
       real*8::x( dim),v( dim),xn(dim),vn( dim),dt
       real*8::f( dim_l), fn( dim_l)
       call force(x,v,f)
        xn(1: dim_l)=x( 1 : dim_l)+v( 1 : dim_l )*dt
        vn(1:dim_l)=v(1: dim_l)+f( 1 : dim_l )*dt
       call force(xn,vn,fn )
        xn( 1 : dim_l)=x(1:dim_l)+((v(1:dim_l)+vn(1:dim_l))*.5d0*dt)
        vn( 1 : dim_l)=v(1:dim_l)+((f(1:dim_l)+fn(1:dim_l))*.5d0*dt)
        end subroutine heun

谢谢,虽然我不知道如何访问调试选项,但我尝试了显示“调试”的按钮,但它似乎没有做任何事情。我也初始化了所有变量,没有任何改变:

      ! PROGRAM PRINCIPAL
      program vibrations
       use force_param
       implicit none
       integer,parameter :: n=50
       integer :: i
       real*8 :: dt,pi
       real*8:: x(dim),v(dim),xn(dim),vn(dim)
       real*8 :: t,tn
       pi=3.141592
       dt=2*pi/(omeg*n)
       x(1)=x0_
       x(2)=x2_
       x(3)=0
       v(:)=0
       xn(:)=0
       vn(:)=0
       t=0
       tn=0
       do i=0,n*1000
       t=i*dt
       x(3)=0
       v(3)=0
       tn=(i+n)*dt
       xn(3)=0
       vn(3)=0
       call heun(x,v,xn,vn,dt)


       open(11,file='oscill_libI.dat')
       write(11,*)t,xn(1), xn(2)
       x(:)=xn(:)
       v(:)=vn(:)
        enddo

      end program vibrations

这是我的 dat 文件的开头,有时“t”列从 0 到 62,有时从 0 到 79,这就像随机化一样,但右侧的 2 列保持不变:

 0.0000000000000000       9.88551278186548116E-002  1.07106110228664085E-002
  1.25663681030273432E-002  9.54368715187558225E-002  1.28277973235651557E-002
  2.51327362060546865E-002  8.98431692414301264E-002  1.62639044499528901E-002
  3.76991043090820280E-002  8.22344006522621740E-002  2.08756113538187266E-002
  5.02654724121093729E-002  7.28284342737571672E-002  2.64687493992564297E-002
  6.28318405151367110E-002  6.18938950672803800E-002  3.28048473194145346E-002
  7.53982086181640559E-002  4.97418661274231927E-002  3.96091910096331989E-002
  8.79645767211914009E-002  3.67162863528836467E-002  4.65801381808427575E-002
  0.10053094482421875       2.31833471408859799E-002  5.33993871027770503E-002
  0.11309731292724609       9.52022271687244688E-003  5.97428674724096373E-002
  0.12566368103027342      -3.89651034653112948E-003  6.52919008503467374E-002
  0.13823004913330078      -1.67023992139428389E-002  6.97442687804509659E-002
  0.15079641723632811      -2.85562232108175044E-002  7.28248289506616686E-002
  0.16336278533935547      -3.91503348001675106E-002  7.42953335021119959E-002
  0.17592915344238280      -4.82199079113247164E-002  7.39631284187664967E-002
  0.18849552154541016      -5.55508033296286119E-002  7.16884480472895630E-002

这是我的 .dat 文件结尾的两个示例,由相同的代码生成:

62.643344993591306      -2.22234174408908088E-002 -6.79345709753481353E-002
   62.655911361694336       7.81763163624332930E-004 -8.43500285728980836E-002
   62.668477729797360       2.31009413326696972E-002 -9.94182790176534326E-002
   62.681044097900390       4.40812444698733333E-002 -0.11254380214307025     
   62.693610466003413       6.31170757113199837E-002 -0.12318313084617104     
   62.706176834106444       7.96689081015940076E-002 -0.13086315388478151     
   62.718743202209467       9.32799461005491132E-002 -0.13519725211303918     
   62.731309570312497       0.10359012770409017      -0.13589874559045442     
   62.743875938415528       0.11034702522217735      -0.13279121399446445     
   62.756442306518551       0.11341330157177297      -0.12581535178107928     
   62.769008674621581       0.11277048866797904      -0.11503212942774470     
   62.781575042724604       0.10851897164177816      -0.10062214936426861     
   62.794141410827635       0.10087418344945331      -8.28812061224447061E-002
   62.806707778930658       9.01591351206557229E-002 -6.22121809658964242E-002
76.566880851745609      -2.17677700529351897E-002 -1.05802168534466483E-002
   76.579447219848632      -4.88389979588944381E-002  6.79397900452341150E-003
   76.592013587951655      -7.46968241174833236E-002  2.32872848719374026E-002
   76.604579956054678      -9.85925322542900023E-002  3.82250728574096491E-002
   76.617146324157716      -0.11983644140594378       5.09885339005944488E-002
   76.629712692260739      -0.13781930927178770       6.10355204755949760E-002
   76.642279060363762      -0.15203121044591339       6.79188940734381658E-002
   76.654845428466800      -0.16207729220063621       7.13017843304816629E-002
   76.667411796569823      -0.16768990946606288       7.09692653728316025E-002
   76.679978164672846      -0.16873675548102926       6.68360694761913066E-002
   76.692544532775869      -0.16522473162941959       5.89500848494855997E-002
   76.705110900878907      -0.15729943518448128       4.74915192035008926E-002
   76.717677268981930      -0.14524028276312445       3.27677494663660557E-002
   76.730243637084953      -0.12945142581913546       1.52040161357704148E-002
   76.742810005187991      -0.11044874807218197      -4.66974609003714767E-003
   76.755376373291014      -8.88433591287705327E-002 -2.62355258305883438E-002
! algorithme de heun

        subroutine heun(x,v,xn,vn,dt)
        use force_param
       IMPLICIT NONE
       real*8::x( dim),v( dim),xn(dim),vn( dim),dt
       real*8::f( dim_l), fn( dim_l)
       call force(x,v,f)
        xn(1: dim_l)=x( 1 : dim_l)+v( 1 : dim_l )*dt
        vn(1:dim_l)=v(1: dim_l)+f( 1 : dim_l )*dt
       call force(xn,vn,fn )
        xn( 1 : dim_l)=x(1:dim_l)+((v(1:dim_l)+vn(1:dim_l))*.5d0*dt)
        vn( 1 : dim_l)=v(1:dim_l)+((f(1:dim_l)+fn(1:dim_l))*.5d0*dt)
        end subroutine heun

      ! PROGRAM PRINCIPAL
      program vibrations
       use force_param
       implicit none
       integer,parameter :: n=50
       integer :: i
       real*8 :: dt,pi
       real*8:: x(dim),v(dim),xn(dim),vn(dim),f( dim_l),fn( dim_l)
       real*8 :: t,tn
       pi=3.141592
       dt=2*pi/(omeg*n)
       x(1)=x0_
       x(2)=x2_
       x(3)=0
       v(:)=0
       xn(:)=0
       vn(:)=0
       t=0
       tn=0
       f(:) = 0
       fn(:) = 0
       do i=0,n*1000
       t=i*dt
       x(3)=0
       v(3)=0
       tn=(i+n)*dt
       xn(3)=0
       vn(3)=0
       call heun(x,v,xn,vn,dt)


       open(11,file='oscill_lib.dat')
       write(11,'(f15.8,1x,f15.8,1x,f15.8)')t,xn(1), xn(2)
       x(:)=xn(:)
       v(:)=vn(:)
       enddo
       close(11)
      end program vibrations

标签: fortran

解决方案


我误解了你的问题:你必须关闭你的文件。close(11)在终止程序之前使用。这样您就可以确保完全保存您的输出。

而且,正如评论中提到的。您应该只打开一次文件。或者关闭它并在必要时再次打开以进行附加。


推荐阅读