7 SUBROUTINE leapfrog_p(ucov,vcov,teta,ps,masse,phis,q,clesphy0,
57 #include "dimensions.h"
60 #include "comdissnew.h"
66 #include "description.h"
74 REAL clesphy0( longcles )
98 REAL,
SAVE :: massem1(
ip1jmp1,llm)
103 REAL,
DIMENSION(:,:,:),
ALLOCATABLE,
SAVE :: dq
107 REAL,
SAVE :: dtetadis(
ip1jmp1,llm)
111 REAL,
SAVE :: dtetafi(
ip1jmp1,llm)
113 REAL,
DIMENSION(:,:,:),
ALLOCATABLE,
SAVE :: dqfi
118 REAL tppn(
iim),tpps(
iim),tpn,tps
120 INTEGER itau,itaufinp1,iav
133 real time_step, t_wrt, t_ops
137 REAL :: jd_cur, jh_cur
138 INTEGER :: an, mois, jour
142 LOGICAL first,callinigrads
144 data callinigrads/.true./
145 character*10 string10
155 REAL,
SAVE :: dtetaecdt(
ip1jmp1,llm)
158 REAL d_h_vcol, d_qt, d_qw, d_ql, d_ec
165 character*80 dynhist_file, dynhistave_file
166 character(len=*),
parameter :: modname=
"leapfrog"
167 character*80 abort_message
170 logical,
PARAMETER :: dissip_conservative=.true.
175 logical ,
parameter :: flag_verif = .
false.
179 LOGICAL :: firstcaldyn
180 LOGICAL :: firstphysic
181 INTEGER :: ijb,ije,
j,
i
183 type(request) :: request_dissip
184 type(request) :: request_physic
185 REAL,
SAVE :: dvfi_tmp(iip1,llm),dufi_tmp(iip1,llm)
186 REAL,
SAVE :: dtetafi_tmp(iip1,llm)
187 REAL,
DIMENSION(:,:,:),
ALLOCATABLE,
SAVE :: dqfi_tmp
188 REAL,
SAVE :: dpfi_tmp(iip1)
192 INTEGER :: adjustcount
194 LOGICAL :: ok_start_timer=.
false.
195 LOGICAL,
SAVE :: firstcall=.true.
224 ALLOCATE(dq(
ip1jmp1,llm,nqtot))
225 ALLOCATE(dqfi(
ip1jmp1,llm,nqtot))
226 ALLOCATE(dqfi_tmp(iip1,llm,nqtot))
238 if (pressure_exner)
then
254 & mod(itau,day_step)/float(day_step)
255 if (jh_cur > 1.0 )
then
282 if (firstcaldyn)
then
301 psm1(ijb:ije) = ps(ijb:ije)
307 ucovm1(ijb:ije,
l) = ucov(ijb:ije,
l)
308 tetam1(ijb:ije,
l) =
teta(ijb:ije,
l)
309 massem1(ijb:ije,
l) = masse(ijb:ije,
l)
312 if (pole_sud) ije=ij_end-iip1
313 vcovm1(ijb:ije,
l) = vcov(ijb:ije,
l)
341 if (mod(itcount,1)==1)
then
366 IF( mod(itau,dissip_period ).EQ.0.AND..NOT.
forward )
368 IF( mod(itau,iphysiq ).EQ.0.AND..NOT.
forward
369 s .and. physic )
apphys = .true.
372 IF( mod(itau ,iconser) .EQ. 0 )
conser = .true.
373 IF( mod(itau+1,dissip_period).EQ.0 .AND. .NOT.
forward )
375 IF( mod(itau+1,iphysiq).EQ.0.AND.physic)
apphys=.true.
389 if (firstcaldyn)
then
402 IF (ok_start_timer)
THEN
404 ok_start_timer=.
false.
410 adjustcount=adjustcount+1
412 & .and. itau/iphysiq>2 .and. adjustcount>30)
then
418 print *,
'*********************************'
419 print *,
'****** TIMER CALDYN ******'
421 print *,
'proc',
i,
' : Nb Bandes :',jj_nb_caldyn(
i),
422 &
' : temps moyen :',
423 & timer_average(jj_nb_caldyn(
i),timer_caldyn,
i),
424 &
'+-',timer_delta(jj_nb_caldyn(
i),timer_caldyn,
i)
427 print *,
'*********************************'
428 print *,
'****** TIMER VANLEER ******'
430 print *,
'proc',
i,
' : Nb Bandes :',jj_nb_vanleer(
i),
431 &
' : temps moyen :',
432 & timer_average(jj_nb_vanleer(
i),timer_vanleer,
i),
433 &
'+-',timer_delta(jj_nb_vanleer(
i),timer_vanleer,
i)
436 print *,
'*********************************'
437 print *,
'****** TIMER DISSIP ******'
439 print *,
'proc',
i,
' : Nb Bandes :',jj_nb_dissip(
i),
440 &
' : temps moyen :',
441 & timer_average(jj_nb_dissip(
i),timer_dissip,
i),
442 &
'+-',timer_delta(jj_nb_dissip(
i),timer_dissip,
i)
453 & jj_nb_caldyn,0,0,testrequest)
455 & jj_nb_caldyn,0,0,testrequest)
457 & jj_nb_caldyn,0,0,testrequest)
459 & jj_nb_caldyn,0,0,testrequest)
461 & jj_nb_caldyn,0,0,testrequest)
463 & jj_nb_caldyn,0,0,testrequest)
465 & jj_nb_caldyn,0,0,testrequest)
467 & jj_nb_caldyn,0,0,testrequest)
469 & jj_nb_caldyn,0,0,testrequest)
471 & jj_nb_caldyn,0,0,testrequest)
473 & jj_nb_caldyn,0,0,testrequest)
475 & jj_nb_caldyn,0,0,testrequest)
477 & jj_nb_caldyn,0,0,testrequest)
479 & jj_nb_caldyn,0,0,testrequest)
481 & jj_nb_caldyn,0,0,testrequest)
487 & jj_nb_caldyn,0,0,testrequest)
538 call
writefield_p(
'vcov',reshape(vcov,(/iip1,jjm,llm/)))
548 . reshape(
q(:,:,
j),(/iip1,
jmp1,llm/)))
555 true_itau=true_itau+1
559 WRITE(
lunout,*)
"leapfrog_p: Iteration No",true_itau
575 time = jd_cur + jh_cur
577 $ ( itau,ucov,vcov,
teta,ps,masse,pk,pkf,
phis ,
578 $ phi,
conser,du,dv,dteta,dp,w, pbaru,pbarv,
time )
608 * p, masse, dq,
teta,
612 IF (offline .AND. .NOT. adjust)
THEN
639 CALL
integrd_p( 2,vcovm1,ucovm1,tetam1,psm1,massem1 ,
640 $ dv,du,dteta,dq,dp,vcov,ucov,
teta,
q,ps,masse,
phis )
678 IF( itau+1. eq.
itaufin ) lafin = .true.
697 &
'leapfrog_p: Entree dans la physique : Iteration No ',true_itau
704 if (pressure_exner)
then
713 IF (planet_type .eq.
"generic")
THEN
715 jd_cur = int(
day_ini + itau/day_step)
719 & mod(itau,day_step)/float(day_step)
721 if (jh_cur > 1.0 )
then
736 IF (ip_ebil_dyn.ge.1 )
THEN
739 IF (planet_type.eq.
"earth")
THEN
742 & , ucov , vcov , ps, p ,pk ,
teta ,
q(:,:,1),
q(:,:,2))
752 call
settag(request_physic,800)
755 * jj_nb_physic,2,2,request_physic)
758 * jj_nb_physic,2,2,request_physic)
761 * jj_nb_physic,2,2,request_physic)
764 * jj_nb_physic,1,2,request_physic)
767 * jj_nb_physic,2,2,request_physic)
770 * jj_nb_physic,2,2,request_physic)
773 * jj_nb_physic,2,2,request_physic)
776 * jj_nb_physic,2,2,request_physic)
779 * jj_nb_physic,2,2,request_physic)
785 * jj_nb_physic,2,2,request_physic)
789 * jj_nb_physic,2,2,request_physic)
813 CALL
calfis_p(lafin ,jd_cur, jh_cur,
814 $ ucov,vcov,
teta,
q,masse,ps,p,pk,
phis,phi ,
817 $ clesphy0, dufi,dvfi,dtetafi,dqfi,dpfi )
821 if ( .not. pole_nord)
then
824 dufi_tmp(1:iip1,
l) = dufi(ijb:ijb+
iim,
l)
825 dvfi_tmp(1:iip1,
l) = dvfi(ijb:ijb+
iim,
l)
826 dtetafi_tmp(1:iip1,
l)= dtetafi(ijb:ijb+
iim,
l)
827 dqfi_tmp(1:iip1,
l,:) = dqfi(ijb:ijb+
iim,
l,:)
832 dpfi_tmp(1:iip1) = dpfi(ijb:ijb+
iim)
845 * 1,0,0,1,request_physic)
848 * 1,0,0,1,request_physic)
851 * 1,0,0,1,request_physic)
854 * 1,0,0,1,request_physic)
858 * 1,0,0,1,request_physic)
873 if (.not. pole_nord)
then
877 dufi(ijb:ijb+
iim,
l) = dufi(ijb:ijb+
iim,
l)+dufi_tmp(1:iip1,
l)
878 dvfi(ijb:ijb+
iim,
l) = dvfi(ijb:ijb+
iim,
l)+dvfi_tmp(1:iip1,
l)
879 dtetafi(ijb:ijb+
iim,
l) = dtetafi(ijb:ijb+
iim,
l)
880 & +dtetafi_tmp(1:iip1,
l)
881 dqfi(ijb:ijb+
iim,
l,:) = dqfi(ijb:ijb+
iim,
l,:)
882 & + dqfi_tmp(1:iip1,
l,:)
887 dpfi(ijb:ijb+
iim) = dpfi(ijb:ijb+
iim)+ dpfi_tmp(1:iip1)
911 $ ucov, vcov,
teta ,
q ,ps ,
912 $ dufi, dvfi, dtetafi , dqfi ,dpfi )
921 call
settag(request_physic,800)
923 * jj_nb_caldyn,request_physic)
926 * jj_nb_caldyn,request_physic)
929 * jj_nb_caldyn,request_physic)
932 * jj_nb_caldyn,request_physic)
935 * jj_nb_caldyn,request_physic)
938 * jj_nb_caldyn,request_physic)
941 * jj_nb_caldyn,request_physic)
944 * jj_nb_caldyn,request_physic)
947 * jj_nb_caldyn,request_physic)
952 * jj_nb_caldyn,request_physic)
968 IF (ip_ebil_dyn.ge.1 )
THEN
971 e , ucov , vcov , ps, p ,pk ,
teta ,
q(:,:,1),
q(:,:,2))
986 if (firstphysic)
then
987 ok_start_timer=.true.
1007 if (planet_type.eq.
"giant")
then
1010 & +
dtvr *
aire(ijb:ije) * ihf /
cpp / masse(ijb:ije,1)
1032 dtetafi(ijb:ije,
l)=0
1033 dqfi(ijb:ije,
l,1:nqtot)=0
1041 if (pole_sud) ije=ije-iip1
1050 $ ucov, vcov,
teta ,
q ,ps ,
1051 $ dufi, dvfi, dtetafi , dqfi ,dpfi )
1059 if (pressure_exner)
then
1088 * jj_nb_dissip,1,1,request_dissip)
1091 * jj_nb_dissip,1,1,request_dissip)
1094 * jj_nb_dissip,request_dissip)
1097 * jj_nb_dissip,request_dissip)
1100 * jj_nb_dissip,request_dissip)
1110 call
vtb(vtdissipation)
1115 call
covcont_p(llm,ucov,vcov,ucont,vcont)
1116 call
enercin_p(vcov,ucov,vcont,ucont,ecin0)
1128 ucov(ijb:ije,
l)=ucov(ijb:ije,
l)+dudis(ijb:ije,
l)
1131 if (pole_sud) ije=ije-iip1
1134 vcov(ijb:ije,
l)=vcov(ijb:ije,
l)+dvdis(ijb:ije,
l)
1142 if (dissip_conservative)
then
1160 call
covcont_p(llm,ucov,vcov,ucont,vcont)
1161 call
enercin_p(vcov,ucov,vcont,ucont,ecin)
1169 dtetadis(
ij,
l)=dtetadis(
ij,
l)+dtetaecdt(
ij,
l)
1259 call
vte(vtdissipation)
1266 * jj_nb_caldyn,request_dissip)
1269 * jj_nb_caldyn,request_dissip)
1272 * jj_nb_caldyn,request_dissip)
1275 * jj_nb_caldyn,request_dissip)
1278 * jj_nb_caldyn,request_dissip)
1314 IF (itau==itaumax)
then
1318 if (mpi_rank==0)
then
1320 print *,
'*********************************'
1321 print *,
'****** TIMER CALDYN ******'
1323 print *,
'proc',
i,
' : Nb Bandes :',jj_nb_caldyn(
i),
1324 &
' : temps moyen :',
1325 & timer_average(jj_nb_caldyn(
i),timer_caldyn,
i)
1328 print *,
'*********************************'
1329 print *,
'****** TIMER VANLEER ******'
1331 print *,
'proc',
i,
' : Nb Bandes :',jj_nb_vanleer(
i),
1332 &
' : temps moyen :',
1333 & timer_average(jj_nb_vanleer(
i),timer_vanleer,
i)
1336 print *,
'*********************************'
1337 print *,
'****** TIMER DISSIP ******'
1339 print *,
'proc',
i,
' : Nb Bandes :',jj_nb_dissip(
i),
1340 &
' : temps moyen :',
1341 & timer_average(jj_nb_dissip(
i),timer_dissip,
i)
1344 print *,
'*********************************'
1345 print *,
'****** TIMER PHYSIC ******'
1347 print *,
'proc',
i,
' : Nb Bandes :',jj_nb_physic(
i),
1348 &
' : temps moyen :',
1349 & timer_average(jj_nb_physic(
i),timer_physic,
i)
1354 print *,
'Taille du Buffer MPI (REAL*8)',maxbuffersize
1355 print *,
'Taille du Buffer MPI utilise (REAL*8)',maxbuffersize_used
1356 print *,
'Temps total ecoule sur la parallelisation :',
difftime()
1357 print *,
'Temps CPU ecoule sur la parallelisation :',
diffcputime()
1382 IF( itau. eq. itaufinp1 )
then
1384 if (flag_verif)
then
1385 write(79,*)
'ucov',ucov
1386 write(80,*)
'vcov',vcov
1387 write(81,*)
'teta',
teta
1390 WRITE(85,*)
'q1 = ',
q(:,:,1)
1391 WRITE(86,*)
'q3 = ',
q(:,:,3)
1399 abort_message =
'Simulation finished'
1407 IF(mod(itau,iperiod).EQ.0 .OR. itau.EQ.
itaufin)
THEN
1427 , ps,masse,pk,pbaru,pbarv,
teta,phi,ucov,vcov,
q)
1431 IF (ok_dyn_ave)
THEN
1446 if (mpi_rank==0)
then
1459 IF( mod(itau,iecri).EQ.0)
THEN
1478 unat(ij_end-iip1+1:ij_end,:)=0.
1482 unat(ijb:ije,
l)=ucov(ijb:ije,
l)/
cu(ijb:ije)
1487 if (pole_sud) ije=ij_end-iip1
1490 vnat(ijb:ije,
l)=vcov(ijb:ije,
l)/
cv(ijb:ije)
1494 if (ok_dyn_ins)
then
1506 if (mpi_rank==0)
then
1519 if (output_grads_dyn)
then
1528 if (mpi_rank==0)
then
1529 #include "write_grads_dyn.h"
1544 & vcov,ucov,
teta,
q,masse,ps)
1555 IF( mod(itau,iperiod).EQ.0 )
THEN
1557 ELSE IF ( mod(itau-1,iperiod). eq. 0 )
THEN
1601 IF( itau. eq. itaufinp1 )
then
1606 abort_message =
'Simulation finished'
1614 IF(mod(itau,iperiod).EQ.0 .OR. itau.EQ.
itaufin)
THEN
1632 , ps,masse,pk,pbaru,pbarv,
teta,phi,ucov,vcov,
q)
1636 IF (ok_dyn_ave)
THEN
1651 if (mpi_rank==0)
then
1662 IF(mod(itau,iecri ).EQ.0)
THEN
1679 unat(ij_end-iip1+1:ij_end,:)=0.
1683 unat(ijb:ije,
l)=ucov(ijb:ije,
l)/
cu(ijb:ije)
1688 if (pole_sud) ije=ij_end-iip1
1691 vnat(ijb:ije,
l)=vcov(ijb:ije,
l)/
cv(ijb:ije)
1695 if (ok_dyn_ins)
then
1707 if (mpi_rank==0)
then
1715 if (output_grads_dyn)
then
1724 if (mpi_rank==0)
then
1725 #include "write_grads_dyn.h"
1736 . vcov,ucov,
teta,
q,masse,ps)