【问题标题】:Is there a way to display the last part of my code ? The output of the last code lines doesn't appear有没有办法显示我的代码的最后一部分?最后代码行的输出没有出现
【发布时间】:2021-05-26 09:15:46
【问题描述】:

我正在尝试使用 gfortran 编译器执行代码。 为了编译,我使用:

gfortran -O3 hecese_seq.f90

为了执行,我使用:

./a.out

代码如下:

  compteur_tempo=0

  do while (.not.fin)
     
     compteur_tempo=compteur_tempo+1

     duree = duree+dt


     do pas=1,2

        tab0(:,:) =tab(:,:)

        !----------- CE/SE

        if(pas.eq.1)then

           do i=1,cpt,2
              flux(i)= tab0(i,3)*grad_x_u(i)
              sm(i)= dt/(dx)*flux(i) + dt**2/(4.0d0*dx)*grad_t_f(i) + dx/4.0*grad_x_u(i)
           enddo

           do i=2,cpt-1,2
              tab(i,2)= 0.5d0*( tab0(i+1,2)+tab0(i-1,2)+sm(i-1)-sm(i+1))    !-------Coord paires
           enddo

        else

           do i=2,cpt,2
              flux(i)= tab0(i,3)*grad_x_u(i)
              sm(i)= dt/(dx)*flux(i) + dt**2/(4.0d0*dx)*grad_t_f(i) + dx/4.0*grad_x_u(i)
           enddo

           do i=3,cpt-1,2
              tab(i,2)= 0.5d0*( tab0(i+1,2)+tab0(i-1,2)+sm(i-1)-sm(i+1))    !-------Coord impaires
           enddo

        endif
        
        !-------------- Traitement des interfaces - continuité du flux par la conductivité thermique

        do j=2,nb_element
           i = p_element(j)
           tab(i,2)=(tab(i-1,7)*tab(i-1,2)+tab(i+1,7)*tab(i+1,2))/(tab(i-1,7)+tab(i+1,7))
        enddo

        !-------------- Conditions cyclique sur la température

        tab(1,2)= 0.5d0*( tab0(2,2)+tab0(cpt-1,2)+sm(cpt-1)-sm(2))!2*dt/dx*(flux(1))-sm(2)-sm(1)+tab(2,2)!tab(2,2)!2000/T_ref!

        tab(cpt,2)=tab(1,2)!(-2*dt/dx)*flux(cpt)+sm(cpt-1)+sm(cpt)+tabi(cpt-1,2)!2000/T_ref!




        goto 113

        !---------------Resolution par Newton raphson - Actuellement inutilisé, je le laisse au cas où

        error=0.0d0
        test1=.true.
        itermax =10
        rhs(:)=tab(:,2)
        iter =0
        eps=1.0d-10
        DeltaT=1.0d-10
        sh(:)=0
        f1(:)=0
        f2(:)=0
        delt(:)=0

        do while((test1).and.(iter.le.itermax))
           iter = iter+1

           Call GRAD
           do j=pas+1,cpt-1,2
              sh(j)=tab(j,7)*tab(j,8)*grad_x_u(j)

              fluxnr(j) = -(tab(j,2)+(dt/2)*sh(j)-rhs(j))

              Delt(j)=fluxnr(j)

              tab(j,2) =tab(j,2)+delt(j)
           enddo
           error=0.0d0
           
           do j=2,cpt-1!,2!1,nb_element!
              error = max(error, abs(delt(j)))
           enddo

           if(iter.eq.itermax)then
              write(6,*)'itermax'
           endif

           test1=abs(error).ge.eps!.or.dabs(error).eq.0.0d0

        enddo


        !---------------Resolution des gradients

113     continue

        CALL GRAD

        do i=pas+1,cpt-1,2

           grad_x_f(i)= tab(i,3)*(tab(i+1,2)-2.0*tab(i,2)+tab(i-1,2))/(dx**2)!(Différence centrée deuxième ordre (dérivée seconde de la Temp)

           grad_t_u(i) = -grad_x_f(i)+tab(i,7)*grad_x_u(i)*tab(i,8)/2!(Terme source ajouté ici seulement - Légère influence sur les interfaces)

           grad_t_f(i) = grad_x_f(i)*tab(i,3)/(cfl*dx)!(Terme en dx/dt remplacé par tab(i,3)/(cfl*dx))

        enddo
        
        !------ Conditions cyclique - Gradients
        
        grad_x_f(cpt)=grad_x_f(cpt-1)
        grad_x_f(1)=grad_x_f(cpt)
        grad_t_u(cpt)=grad_t_u(cpt-1)
        grad_t_u(1)=grad_t_u(cpt)
        grad_t_f(cpt)=grad_t_f(cpt-1)
        grad_t_f(1)=grad_t_f(cpt)
        
        !------ Gradients moyennés sur l'interface (histoire de limiter les discontinuités)
        do j=2,nb_element
           i = p_element(j)
           grad_x_f(i)=(grad_x_f(i+1)+grad_x_f(i-1))/2
           grad_t_u(i)=(grad_t_u(i+1)+grad_t_u(i-1))/2
           grad_t_f(i)=(grad_t_f(i+1)+grad_t_f(i-1))/2
        enddo

     enddo


     !-------------- Test de la fonte de l'electrolite

     test = .false.
     i_ca_el = p_element(num)
     i_el_an = p_element(num+1)
     i=i_ca_el
     do while(((i.lt.i_el_an-1).and.(.not.test)))

        test=tab(i,2).le.(T_fonte)!20000)! Choix entre température d'équilibre ou température de fonte

        i = i+1

     enddo

     if(i.ge.i_el_an-1)convergence =.true.
     if(convergence) then
        write(6,*)'Convergence',i, i_ca_el,i_el_an-1, duree*time_ref
     else
        write(6,'(''Non Convergence'', 3i5,3f18.12)'),i, i_ca_el,i_el_an-1,tab(i,2)*t_ref,duree*time_ref
     endif

     if(.not.stock)then
        if( convergence.and.(duree.lt.duree_totale))then

           open(10,file='test'//char(ww+48)//'.dat', status='unknown')

           do i=1,cpt
              write(10,*)tab(i,1)*l_ref,tab(i,2)*t_ref
           enddo

           close(10)

           stock=.true.
           stop
        endif
     endif

     fin=duree.ge.duree_totale
     pas_stockage = pas_stockage+dt

     if(pas_stockage.ge.intervalle_stockage)then

        do i=1,nb_probe
           write(w_output(i),*)duree*time_ref, tab(probe_indice(i),2)*t_ref
        enddo

        pas_stockage =0.0d0
     endif

  enddo

!execution time 
      CALL CPU_TIME(TIME_END)
      call  system_clock(count=t2, count_rate=ir)
      write(*,*)" duree =  ",duree,duree*time_ref
      write(*,*)"compteur temporel ",compteur_tempo
      write(*,*)"cpt ",cpt
      write(*,*)" temps d’excecution  du  programme",TIME_END-TIME_START
      temps=real(t2 - t1 ,kind =8)/real(ir,kind =8)
      write  (*,*) "temps d’exe  du  programme:",temps
      do i=1,nb_probe
         close(w_output(i))
      enddo

对于测试收敛的部分,没关系,但我没有得到执行时间,因为我想显示它。我觉得最后一部分没有被执行。 (可能是由于用于测试收敛性的“Stop”)。

对于执行,我得到:

Non Convergence  222  184  303  699.993372185986    0.340103428568
Non Convergence  222  184  303  699.993948217854    0.340103999997
Non Convergence  222  184  303  699.994524248306    0.340104571426
Non Convergence  222  184  303  699.995100277341    0.340105142854
Non Convergence  222  184  303  699.995676304960    0.340105714283
Non Convergence  222  184  303  699.996252331162    0.340106285711
Non Convergence  222  184  303  699.996828355948    0.340106857140
Non Convergence  222  184  303  699.997404379318    0.340107428568
Non Convergence  222  184  303  699.997980401271    0.340107999997
Non Convergence  222  184  303  699.998556421807    0.340108571426
Non Convergence  222  184  303  699.999132440928    0.340109142854
Non Convergence  222  184  303  699.999708458632    0.340109714283
Non Convergence  222  184  303  700.000284474919    0.340110285711
Non Convergence  222  184  303  700.000860489791    0.340110857140
Non Convergence  222  184  303  700.001436503245    0.340111428568
Non Convergence  222  184  303  700.002012515283    0.340111999997
Non Convergence  222  184  303  700.002588525905    0.340112571426
Non Convergence  222  184  303  700.003164535111    0.340113142854
Non Convergence  222  184  303  700.003740542900    0.340113714283
Non Convergence  222  184  303  700.004316549273    0.340114285711
Non Convergence  222  184  303  700.004892554230    0.340114857140
Non Convergence  222  184  303  700.005468557770    0.340115428568
Non Convergence  222  184  303  700.006044559894    0.340115999997
Non Convergence  222  184  303  700.006620560601    0.340116571426
Non Convergence  222  184  303  700.007196559892    0.340117142854
 Convergence         303         184         303  0.34011771428275706     
Note: The following floating-point exceptions are signalling: IEEE_UNDERFLOW_FLAG IEEE_DENORMAL

我向您展示了执行的一小部分(有很多值,因此无需全部展示)。

我的问题是我无法显示已经实施的执行时间。我是这个网站的新手,所以希望你能帮助我。

【问题讨论】:

  • edit 代码与您在源文件中的顺序完全一致。确保发布完整的minimal reproducible example。它必须是一段代码,而不是一些孤立的sn-ps。如果您的代码太长,请缩短它!但请确保缩短的版本仍然存在相同的问题。
  • @VladimirF 感谢您的评论!我按照你说的编辑了代码。
  • 请展示整个程序。如果不是太长,请显示整个代码更好——阅读@VladimirF 给你的关于minimal reproducible example 的链接。我可以猜到发生了什么,但没有一个最小的例子我不能肯定地说。
  • “可能是由于用于测试收敛性的“停止”” - STOP 停止程序,如果停止,之后就不会运行任何东西。你检查过STOP 是否被命中了吗?
  • 您必须考虑代码的作用。你必须适当地构造它。如果有帮助,您甚至可以绘制流程图en.wikipedia.org/wiki/Flowchart 您认为EXIT 语句是否不是可以用来代替STOP 的东西。请注意,您可能还必须为主循环使用一些标签。我建议远离GOTO,即使你已经使用了。

标签: fortran gfortran execution execution-time convergence


【解决方案1】:

你的结构基本上是

do

  !do something

  if (convergence) STOP

end do

这意味着程序在收敛时完全停止,你永远不会越过循环。

为了能够在循环后继续执行,您只想退出循环。

do

  !do something

  if (convergence) EXIT

end do

!further statements

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-11
    • 2017-09-18
    • 1970-01-01
    相关资源
    最近更新 更多