如何解决有没有办法显示我的代码的最后一部分?最后一行代码的输出没有出现
我正在尝试使用 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,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,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,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,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)'),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,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
对于测试收敛的部分,没关系,但我没有得到想要显示的执行时间。我觉得最后一部分没有执行。 (可能是因为用于测试收敛的“停止”)。
对于执行,我得到:
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
我向您展示了执行的一小部分(有很多值,因此无需全部展示)。
我的问题是我无法显示已经实施的执行时间。我是这个网站的新手,所以希望你能帮助我。
解决方法
你的结构基本上是
do
!do something
if (convergence) STOP
end do
这意味着在收敛时程序完全停止并且你永远不会越过循环。
为了能够在循环后继续执行,您只想退出循环。
do
!do something
if (convergence) EXIT
end do
!further statements
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。