32 |
use conflx_m, only: conflx |
use conflx_m, only: conflx |
33 |
USE ctherm, ONLY: iflag_thermals, nsplit_thermals |
USE ctherm, ONLY: iflag_thermals, nsplit_thermals |
34 |
use diagcld2_m, only: diagcld2 |
use diagcld2_m, only: diagcld2 |
|
use diagetpq_m, only: diagetpq |
|
|
use diagphy_m, only: diagphy |
|
35 |
USE dimens_m, ONLY: llm, nqmx |
USE dimens_m, ONLY: llm, nqmx |
36 |
USE dimphy, ONLY: klon |
USE dimphy, ONLY: klon |
37 |
USE dimsoil, ONLY: nsoilmx |
USE dimsoil, ONLY: nsoilmx |
400 |
|
|
401 |
! Variables li\'ees au bilan d'\'energie et d'enthalpie : |
! Variables li\'ees au bilan d'\'energie et d'enthalpie : |
402 |
REAL ztsol(klon) |
REAL ztsol(klon) |
|
REAL d_h_vcol, d_qt, d_ec |
|
|
REAL, SAVE:: d_h_vcol_phy |
|
|
REAL zero_v(klon) |
|
|
CHARACTER(LEN = 20) tit |
|
|
INTEGER:: ip_ebil = 0 ! print level for energy conservation diagnostics |
|
|
INTEGER:: if_ebil = 0 ! verbosity for diagnostics of energy conservation |
|
403 |
|
|
404 |
REAL d_t_ec(klon, llm) |
REAL d_t_ec(klon, llm) |
405 |
! tendance due \`a la conversion Ec en énergie thermique |
! tendance due \`a la conversion Ec en énergie thermique |
458 |
|
|
459 |
integer, save:: ncid_startphy |
integer, save:: ncid_startphy |
460 |
|
|
461 |
namelist /physiq_nml/ fact_cldcon, facttemps, ok_newmicro, & |
namelist /physiq_nml/ fact_cldcon, facttemps, ok_newmicro, iflag_cldcon, & |
462 |
iflag_cldcon, ratqsbas, ratqshaut, if_ebil, ok_ade, ok_aie, bl95_b0, & |
ratqsbas, ratqshaut, ok_ade, ok_aie, bl95_b0, bl95_b1, & |
463 |
bl95_b1, iflag_thermals, nsplit_thermals |
iflag_thermals, nsplit_thermals |
464 |
|
|
465 |
!---------------------------------------------------------------- |
!---------------------------------------------------------------- |
466 |
|
|
|
IF (if_ebil >= 1) zero_v = 0. |
|
467 |
IF (nqmx < 2) CALL abort_gcm('physiq', & |
IF (nqmx < 2) CALL abort_gcm('physiq', & |
468 |
'eaux vapeur et liquide sont indispensables') |
'eaux vapeur et liquide sont indispensables') |
469 |
|
|
503 |
trmb2 =0. ! inhibition |
trmb2 =0. ! inhibition |
504 |
trmb3 =0. ! Point Omega |
trmb3 =0. ! Point Omega |
505 |
|
|
|
IF (if_ebil >= 1) d_h_vcol_phy = 0. |
|
|
|
|
506 |
iflag_thermals = 0 |
iflag_thermals = 0 |
507 |
nsplit_thermals = 1 |
nsplit_thermals = 1 |
508 |
print *, "Enter namelist 'physiq_nml'." |
print *, "Enter namelist 'physiq_nml'." |
561 |
|
|
562 |
ztsol = sum(ftsol * pctsrf, dim = 2) |
ztsol = sum(ftsol * pctsrf, dim = 2) |
563 |
|
|
|
IF (if_ebil >= 1) THEN |
|
|
tit = 'after dynamics' |
|
|
CALL diagetpq(airephy, tit, ip_ebil, 1, 1, dtphys, t_seri, q_seri, & |
|
|
ql_seri, u_seri, v_seri, paprs, d_h_vcol, d_qt, d_ec) |
|
|
! Comme les tendances de la physique sont ajout\'es dans la |
|
|
! dynamique, la variation d'enthalpie par la dynamique devrait |
|
|
! \^etre \'egale \`a la variation de la physique au pas de temps |
|
|
! pr\'ec\'edent. Donc la somme de ces 2 variations devrait \^etre |
|
|
! nulle. |
|
|
call diagphy(airephy, tit, ip_ebil, zero_v, zero_v, zero_v, zero_v, & |
|
|
zero_v, zero_v, zero_v, zero_v, ztsol, d_h_vcol + d_h_vcol_phy, & |
|
|
d_qt, 0.) |
|
|
END IF |
|
|
|
|
564 |
! Diagnostic de la tendance dynamique : |
! Diagnostic de la tendance dynamique : |
565 |
IF (ancien_ok) THEN |
IF (ancien_ok) THEN |
566 |
DO k = 1, llm |
DO k = 1, llm |
609 |
ENDDO |
ENDDO |
610 |
ql_seri = 0. |
ql_seri = 0. |
611 |
|
|
|
IF (if_ebil >= 2) THEN |
|
|
tit = 'after reevap' |
|
|
CALL diagetpq(airephy, tit, ip_ebil, 2, 1, dtphys, t_seri, q_seri, & |
|
|
ql_seri, u_seri, v_seri, paprs, d_h_vcol, d_qt, d_ec) |
|
|
call diagphy(airephy, tit, ip_ebil, zero_v, zero_v, zero_v, zero_v, & |
|
|
zero_v, zero_v, zero_v, zero_v, ztsol, d_h_vcol, d_qt, d_ec) |
|
|
END IF |
|
|
|
|
612 |
frugs = MAX(frugs, 0.000015) |
frugs = MAX(frugs, 0.000015) |
613 |
zxrugs = sum(frugs * pctsrf, dim = 2) |
zxrugs = sum(frugs * pctsrf, dim = 2) |
614 |
|
|
678 |
ENDDO |
ENDDO |
679 |
ENDDO |
ENDDO |
680 |
|
|
|
IF (if_ebil >= 2) THEN |
|
|
tit = 'after clmain' |
|
|
CALL diagetpq(airephy, tit, ip_ebil, 2, 2, dtphys, t_seri, q_seri, & |
|
|
ql_seri, u_seri, v_seri, paprs, d_h_vcol, d_qt, d_ec) |
|
|
call diagphy(airephy, tit, ip_ebil, zero_v, zero_v, zero_v, zero_v, & |
|
|
sens, evap, zero_v, zero_v, ztsol, d_h_vcol, d_qt, d_ec) |
|
|
END IF |
|
|
|
|
681 |
! Update surface temperature: |
! Update surface temperature: |
682 |
|
|
683 |
DO i = 1, klon |
DO i = 1, klon |
818 |
ENDDO |
ENDDO |
819 |
ENDDO |
ENDDO |
820 |
|
|
|
IF (if_ebil >= 2) THEN |
|
|
tit = 'after convect' |
|
|
CALL diagetpq(airephy, tit, ip_ebil, 2, 2, dtphys, t_seri, q_seri, & |
|
|
ql_seri, u_seri, v_seri, paprs, d_h_vcol, d_qt, d_ec) |
|
|
call diagphy(airephy, tit, ip_ebil, zero_v, zero_v, zero_v, zero_v, & |
|
|
zero_v, zero_v, rain_con, snow_con, ztsol, d_h_vcol, d_qt, d_ec) |
|
|
END IF |
|
|
|
|
821 |
IF (check) THEN |
IF (check) THEN |
822 |
za = qcheck(paprs, q_seri, ql_seri) |
za = qcheck(paprs, q_seri, ql_seri) |
823 |
print *, "aprescon = ", za |
print *, "aprescon = ", za |
863 |
q_seri, d_u_ajs, d_v_ajs, d_t_ajs, d_q_ajs, fm_therm, entr_therm) |
q_seri, d_u_ajs, d_v_ajs, d_t_ajs, d_q_ajs, fm_therm, entr_therm) |
864 |
endif |
endif |
865 |
|
|
|
IF (if_ebil >= 2) THEN |
|
|
tit = 'after dry_adjust' |
|
|
CALL diagetpq(airephy, tit, ip_ebil, 2, 2, dtphys, t_seri, q_seri, & |
|
|
ql_seri, u_seri, v_seri, paprs, d_h_vcol, d_qt, d_ec) |
|
|
END IF |
|
|
|
|
866 |
! Caclul des ratqs |
! Caclul des ratqs |
867 |
|
|
868 |
! ratqs convectifs \`a l'ancienne en fonction de (q(z = 0) - q) / q |
! ratqs convectifs \`a l'ancienne en fonction de (q(z = 0) - q) / q |
931 |
print *, "Precip = ", zx_t |
print *, "Precip = ", zx_t |
932 |
ENDIF |
ENDIF |
933 |
|
|
|
IF (if_ebil >= 2) THEN |
|
|
tit = 'after fisrt' |
|
|
CALL diagetpq(airephy, tit, ip_ebil, 2, 2, dtphys, t_seri, q_seri, & |
|
|
ql_seri, u_seri, v_seri, paprs, d_h_vcol, d_qt, d_ec) |
|
|
call diagphy(airephy, tit, ip_ebil, zero_v, zero_v, zero_v, zero_v, & |
|
|
zero_v, zero_v, rain_lsc, snow_lsc, ztsol, d_h_vcol, d_qt, d_ec) |
|
|
END IF |
|
|
|
|
934 |
! PRESCRIPTION DES NUAGES POUR LE RAYONNEMENT |
! PRESCRIPTION DES NUAGES POUR LE RAYONNEMENT |
935 |
|
|
936 |
! 1. NUAGES CONVECTIFS |
! 1. NUAGES CONVECTIFS |
1004 |
snow_fall(i) = snow_con(i) + snow_lsc(i) |
snow_fall(i) = snow_con(i) + snow_lsc(i) |
1005 |
ENDDO |
ENDDO |
1006 |
|
|
|
IF (if_ebil >= 2) CALL diagetpq(airephy, "after diagcld", ip_ebil, 2, 2, & |
|
|
dtphys, t_seri, q_seri, ql_seri, u_seri, v_seri, paprs, d_h_vcol, & |
|
|
d_qt, d_ec) |
|
|
|
|
1007 |
! Humidit\'e relative pour diagnostic : |
! Humidit\'e relative pour diagnostic : |
1008 |
DO k = 1, llm |
DO k = 1, llm |
1009 |
DO i = 1, klon |
DO i = 1, klon |
1065 |
ENDDO |
ENDDO |
1066 |
ENDDO |
ENDDO |
1067 |
|
|
|
IF (if_ebil >= 2) THEN |
|
|
tit = 'after rad' |
|
|
CALL diagetpq(airephy, tit, ip_ebil, 2, 2, dtphys, t_seri, q_seri, & |
|
|
ql_seri, u_seri, v_seri, paprs, d_h_vcol, d_qt, d_ec) |
|
|
call diagphy(airephy, tit, ip_ebil, topsw, toplw, solsw, sollw, & |
|
|
zero_v, zero_v, zero_v, zero_v, ztsol, d_h_vcol, d_qt, d_ec) |
|
|
END IF |
|
|
|
|
1068 |
! Calculer l'hydrologie de la surface |
! Calculer l'hydrologie de la surface |
1069 |
DO i = 1, klon |
DO i = 1, klon |
1070 |
zxqsurf(i) = 0. |
zxqsurf(i) = 0. |
1153 |
CALL aaam_bud(rg, romega, rlat, rlon, pphis, zustrdr, zustrli, zustrph, & |
CALL aaam_bud(rg, romega, rlat, rlon, pphis, zustrdr, zustrli, zustrph, & |
1154 |
zvstrdr, zvstrli, zvstrph, paprs, u, v, aam, torsfc) |
zvstrdr, zvstrli, zvstrph, paprs, u, v, aam, torsfc) |
1155 |
|
|
|
IF (if_ebil >= 2) CALL diagetpq(airephy, 'after orography', ip_ebil, 2, & |
|
|
2, dtphys, t_seri, q_seri, ql_seri, u_seri, v_seri, paprs, d_h_vcol, & |
|
|
d_qt, d_ec) |
|
|
|
|
1156 |
! Calcul des tendances traceurs |
! Calcul des tendances traceurs |
1157 |
call phytrac(julien, time, firstcal, lafin, dtphys, t, paprs, play, mfu, & |
call phytrac(julien, time, firstcal, lafin, dtphys, t, paprs, play, mfu, & |
1158 |
mfd, pde_u, pen_d, ycoefh, fm_therm, entr_therm, yu1, yv1, ftsol, & |
mfd, pde_u, pen_d, ycoefh, fm_therm, entr_therm, yu1, yv1, ftsol, & |
1184 |
END DO |
END DO |
1185 |
END DO |
END DO |
1186 |
|
|
|
IF (if_ebil >= 1) THEN |
|
|
tit = 'after physic' |
|
|
CALL diagetpq(airephy, tit, ip_ebil, 1, 1, dtphys, t_seri, q_seri, & |
|
|
ql_seri, u_seri, v_seri, paprs, d_h_vcol, d_qt, d_ec) |
|
|
! Comme les tendances de la physique sont ajoute dans la dynamique, |
|
|
! on devrait avoir que la variation d'entalpie par la dynamique |
|
|
! est egale a la variation de la physique au pas de temps precedent. |
|
|
! Donc la somme de ces 2 variations devrait etre nulle. |
|
|
call diagphy(airephy, tit, ip_ebil, topsw, toplw, solsw, sollw, sens, & |
|
|
evap, rain_fall, snow_fall, ztsol, d_h_vcol, d_qt, d_ec) |
|
|
d_h_vcol_phy = d_h_vcol |
|
|
END IF |
|
|
|
|
1187 |
! SORTIES |
! SORTIES |
1188 |
|
|
1189 |
! prw = eau precipitable |
! prw = eau precipitable |