7 |
SUBROUTINE physiq(lafin, rdayvrai, time, dtphys, paprs, play, pphi, pphis, & |
SUBROUTINE physiq(lafin, rdayvrai, time, dtphys, paprs, play, pphi, pphis, & |
8 |
u, v, t, qx, omega, d_u, d_v, d_t, d_qx, d_ps, dudyn, PVteta) |
u, v, t, qx, omega, d_u, d_v, d_t, d_qx, d_ps, dudyn, PVteta) |
9 |
|
|
10 |
! From phylmd/physiq.F, version 1.22 2006/02/20 09:38:28 (SVN revision 678) |
! From phylmd/physiq.F, version 1.22 2006/02/20 09:38:28 |
11 |
|
! (subversion revision 678) |
12 |
|
|
13 |
! Author: Z.X. Li (LMD/CNRS) 1993 |
! Author: Z.X. Li (LMD/CNRS) 1993 |
14 |
|
|
15 |
! This is the main procedure for the "physics" part of the program. |
! This is the main procedure for the "physics" part of the program. |
25 |
USE clesphys2, ONLY: cycle_diurne, iflag_con, nbapp_rad, new_oliq, & |
USE clesphys2, ONLY: cycle_diurne, iflag_con, nbapp_rad, new_oliq, & |
26 |
ok_orodr, ok_orolf, soil_model |
ok_orodr, ok_orolf, soil_model |
27 |
USE clmain_m, ONLY: clmain |
USE clmain_m, ONLY: clmain |
28 |
|
use clouds_gno_m, only: clouds_gno |
29 |
USE comgeomphy, ONLY: airephy, cuphy, cvphy |
USE comgeomphy, ONLY: airephy, cuphy, cvphy |
30 |
USE concvl_m, ONLY: concvl |
USE concvl_m, ONLY: concvl |
31 |
USE conf_gcm_m, ONLY: offline, raz_date |
USE conf_gcm_m, ONLY: offline, raz_date |
206 |
PARAMETER(kmaxm1 = kmax-1, lmaxm1 = lmax-1) |
PARAMETER(kmaxm1 = kmax-1, lmaxm1 = lmax-1) |
207 |
|
|
208 |
REAL zx_tau(kmaxm1), zx_pc(lmaxm1) |
REAL zx_tau(kmaxm1), zx_pc(lmaxm1) |
209 |
DATA zx_tau/0.0, 0.3, 1.3, 3.6, 9.4, 23., 60./ |
DATA zx_tau/0., 0.3, 1.3, 3.6, 9.4, 23., 60./ |
210 |
DATA zx_pc/50., 180., 310., 440., 560., 680., 800./ |
DATA zx_pc/50., 180., 310., 440., 560., 680., 800./ |
211 |
|
|
212 |
! cldtopres pression au sommet des nuages |
! cldtopres pression au sommet des nuages |
315 |
SAVE Ma |
SAVE Ma |
316 |
REAL qcondc(klon, llm) ! in-cld water content from convect |
REAL qcondc(klon, llm) ! in-cld water content from convect |
317 |
SAVE qcondc |
SAVE qcondc |
318 |
REAL ema_work1(klon, llm), ema_work2(klon, llm) |
REAL, save:: sig1(klon, llm), w01(klon, llm) |
|
SAVE ema_work1, ema_work2 |
|
319 |
REAL, save:: wd(klon) |
REAL, save:: wd(klon) |
320 |
|
|
321 |
! Variables locales pour la couche limite (al1): |
! Variables locales pour la couche limite (al1): |
390 |
|
|
391 |
! Variables locales |
! Variables locales |
392 |
|
|
393 |
real clwcon(klon, llm), rnebcon(klon, llm) |
real, save:: clwcon(klon, llm), rnebcon(klon, llm) |
394 |
real clwcon0(klon, llm), rnebcon0(klon, llm) |
real, save:: clwcon0(klon, llm), rnebcon0(klon, llm) |
|
|
|
|
save rnebcon, clwcon |
|
395 |
|
|
396 |
REAL rhcl(klon, llm) ! humiditi relative ciel clair |
REAL rhcl(klon, llm) ! humiditi relative ciel clair |
397 |
REAL dialiq(klon, llm) ! eau liquide nuageuse |
REAL dialiq(klon, llm) ! eau liquide nuageuse |
417 |
REAL heat0(klon, llm) ! chauffage solaire ciel clair |
REAL heat0(klon, llm) ! chauffage solaire ciel clair |
418 |
REAL, save:: cool(klon, llm) ! refroidissement infrarouge |
REAL, save:: cool(klon, llm) ! refroidissement infrarouge |
419 |
REAL cool0(klon, llm) ! refroidissement infrarouge ciel clair |
REAL cool0(klon, llm) ! refroidissement infrarouge ciel clair |
420 |
REAL, save:: topsw(klon), toplw(klon), solsw(klon), sollw(klon) |
REAL, save:: topsw(klon), toplw(klon), solsw(klon) |
421 |
real sollwdown(klon) ! downward LW flux at surface |
REAL, save:: sollw(klon) ! rayonnement infrarouge montant à la surface |
422 |
|
real, save:: sollwdown(klon) ! downward LW flux at surface |
423 |
REAL, save:: topsw0(klon), toplw0(klon), solsw0(klon), sollw0(klon) |
REAL, save:: topsw0(klon), toplw0(klon), solsw0(klon), sollw0(klon) |
424 |
REAL albpla(klon) |
REAL albpla(klon) |
425 |
REAL fsollw(klon, nbsrf) ! bilan flux IR pour chaque sous surface |
REAL fsollw(klon, nbsrf) ! bilan flux IR pour chaque sous surface |
426 |
REAL fsolsw(klon, nbsrf) ! flux solaire absorb. pour chaque sous surface |
REAL fsolsw(klon, nbsrf) ! flux solaire absorb. pour chaque sous surface |
427 |
SAVE albpla, sollwdown |
SAVE albpla |
428 |
SAVE heat0, cool0 |
SAVE heat0, cool0 |
429 |
|
|
430 |
INTEGER itaprad |
INTEGER itaprad |
629 |
SAVE solswad |
SAVE solswad |
630 |
SAVE d_u_con |
SAVE d_u_con |
631 |
SAVE d_v_con |
SAVE d_v_con |
|
SAVE rnebcon0 |
|
|
SAVE clwcon0 |
|
632 |
|
|
633 |
real zmasse(klon, llm) |
real zmasse(klon, llm) |
634 |
! (column-density of mass of air in a cell, in kg m-2) |
! (column-density of mass of air in a cell, in kg m-2) |
665 |
solswai(:) = 0. |
solswai(:) = 0. |
666 |
solswad(:) = 0. |
solswad(:) = 0. |
667 |
|
|
668 |
d_u_con = 0.0 |
d_u_con = 0. |
669 |
d_v_con = 0.0 |
d_v_con = 0. |
670 |
rnebcon0 = 0.0 |
rnebcon0 = 0. |
671 |
clwcon0 = 0.0 |
clwcon0 = 0. |
672 |
rnebcon = 0.0 |
rnebcon = 0. |
673 |
clwcon = 0.0 |
clwcon = 0. |
674 |
|
|
675 |
pblh =0. ! Hauteur de couche limite |
pblh =0. ! Hauteur de couche limite |
676 |
plcl =0. ! Niveau de condensation de la CLA |
plcl =0. ! Niveau de condensation de la CLA |
700 |
itaprad = 0 |
itaprad = 0 |
701 |
CALL phyetat0("startphy.nc", pctsrf, ftsol, ftsoil, ocean, tslab, & |
CALL phyetat0("startphy.nc", pctsrf, ftsol, ftsoil, ocean, tslab, & |
702 |
seaice, fqsurf, qsol, fsnow, falbe, falblw, fevap, rain_fall, & |
seaice, fqsurf, qsol, fsnow, falbe, falblw, fevap, rain_fall, & |
703 |
snow_fall, solsw, sollwdown, dlw, radsol, frugs, agesno, zmea, & |
snow_fall, solsw, sollw, dlw, radsol, frugs, agesno, zmea, & |
704 |
zstd, zsig, zgam, zthe, zpic, zval, t_ancien, q_ancien, & |
zstd, zsig, zgam, zthe, zpic, zval, t_ancien, q_ancien, & |
705 |
ancien_ok, rnebcon, ratqs, clwcon, run_off_lic_0) |
ancien_ok, rnebcon, ratqs, clwcon, run_off_lic_0, sig1, w01) |
706 |
|
|
707 |
! ATTENTION : il faudra a terme relire q2 dans l'etat initial |
! ATTENTION : il faudra a terme relire q2 dans l'etat initial |
708 |
q2 = 1e-8 |
q2 = 1e-8 |
828 |
ELSE |
ELSE |
829 |
DO k = 1, llm |
DO k = 1, llm |
830 |
DO i = 1, klon |
DO i = 1, klon |
831 |
d_t_dyn(i, k) = 0.0 |
d_t_dyn(i, k) = 0. |
832 |
d_q_dyn(i, k) = 0.0 |
d_q_dyn(i, k) = 0. |
833 |
ENDDO |
ENDDO |
834 |
ENDDO |
ENDDO |
835 |
ancien_ok = .TRUE. |
ancien_ok = .TRUE. |
882 |
! Appeler la diffusion verticale (programme de couche limite) |
! Appeler la diffusion verticale (programme de couche limite) |
883 |
|
|
884 |
DO i = 1, klon |
DO i = 1, klon |
885 |
zxrugs(i) = 0.0 |
zxrugs(i) = 0. |
886 |
ENDDO |
ENDDO |
887 |
DO nsrf = 1, nbsrf |
DO nsrf = 1, nbsrf |
888 |
DO i = 1, klon |
DO i = 1, klon |
915 |
ENDDO |
ENDDO |
916 |
ENDDO |
ENDDO |
917 |
|
|
918 |
! Repartition sous maille des flux LW et SW |
! Répartition sous maille des flux longwave et shortwave |
919 |
! Repartition du longwave par sous-surface linearisee |
! Répartition du longwave par sous-surface linéarisée |
920 |
|
|
921 |
DO nsrf = 1, nbsrf |
DO nsrf = 1, nbsrf |
922 |
DO i = 1, klon |
DO i = 1, klon |
930 |
|
|
931 |
! Couche limite: |
! Couche limite: |
932 |
|
|
933 |
CALL clmain(dtphys, itap, date0, pctsrf, pctsrf_new, t_seri, q_seri, & |
CALL clmain(dtphys, itap, pctsrf, pctsrf_new, t_seri, q_seri, & |
934 |
u_seri, v_seri, julien, rmu0, co2_ppm, ok_veget, ocean, npas, nexca, & |
u_seri, v_seri, julien, rmu0, co2_ppm, ok_veget, ocean, & |
935 |
ftsol, soil_model, cdmmax, cdhmax, ksta, ksta_ter, ok_kzmin, ftsoil, & |
ftsol, soil_model, cdmmax, cdhmax, ksta, ksta_ter, ok_kzmin, ftsoil, & |
936 |
qsol, paprs, play, fsnow, fqsurf, fevap, falbe, falblw, fluxlat, & |
qsol, paprs, play, fsnow, fqsurf, fevap, falbe, falblw, fluxlat, & |
937 |
rain_fall, snow_fall, fsolsw, fsollw, sollwdown, fder, rlon, rlat, & |
rain_fall, snow_fall, fsolsw, fsollw, fder, rlon, rlat, & |
938 |
cuphy, cvphy, frugs, firstcal, lafin, agesno, rugoro, d_t_vdf, & |
frugs, firstcal, agesno, rugoro, d_t_vdf, & |
939 |
d_q_vdf, d_u_vdf, d_v_vdf, d_ts, fluxt, fluxq, fluxu, fluxv, cdragh, & |
d_q_vdf, d_u_vdf, d_v_vdf, d_ts, fluxt, fluxq, fluxu, fluxv, cdragh, & |
940 |
cdragm, q2, dsens, devap, ycoefh, yu1, yv1, t2m, q2m, u10m, v10m, & |
cdragm, q2, dsens, devap, ycoefh, yu1, yv1, t2m, q2m, u10m, v10m, & |
941 |
pblh, capCL, oliqCL, cteiCL, pblT, therm, trmb1, trmb2, trmb3, plcl, & |
pblh, capCL, oliqCL, cteiCL, pblT, therm, trmb1, trmb2, trmb3, plcl, & |
985 |
! Update surface temperature: |
! Update surface temperature: |
986 |
|
|
987 |
DO i = 1, klon |
DO i = 1, klon |
988 |
zxtsol(i) = 0.0 |
zxtsol(i) = 0. |
989 |
zxfluxlat(i) = 0.0 |
zxfluxlat(i) = 0. |
990 |
|
|
991 |
zt2m(i) = 0.0 |
zt2m(i) = 0. |
992 |
zq2m(i) = 0.0 |
zq2m(i) = 0. |
993 |
zu10m(i) = 0.0 |
zu10m(i) = 0. |
994 |
zv10m(i) = 0.0 |
zv10m(i) = 0. |
995 |
zxffonte(i) = 0.0 |
zxffonte(i) = 0. |
996 |
zxfqcalving(i) = 0.0 |
zxfqcalving(i) = 0. |
997 |
|
|
998 |
s_pblh(i) = 0.0 |
s_pblh(i) = 0. |
999 |
s_lcl(i) = 0.0 |
s_lcl(i) = 0. |
1000 |
s_capCL(i) = 0.0 |
s_capCL(i) = 0. |
1001 |
s_oliqCL(i) = 0.0 |
s_oliqCL(i) = 0. |
1002 |
s_cteiCL(i) = 0.0 |
s_cteiCL(i) = 0. |
1003 |
s_pblT(i) = 0.0 |
s_pblT(i) = 0. |
1004 |
s_therm(i) = 0.0 |
s_therm(i) = 0. |
1005 |
s_trmb1(i) = 0.0 |
s_trmb1(i) = 0. |
1006 |
s_trmb2(i) = 0.0 |
s_trmb2(i) = 0. |
1007 |
s_trmb3(i) = 0.0 |
s_trmb3(i) = 0. |
1008 |
|
|
1009 |
IF (abs(pctsrf(i, is_ter) + pctsrf(i, is_lic) + pctsrf(i, is_oce) & |
IF (abs(pctsrf(i, is_ter) + pctsrf(i, is_lic) + pctsrf(i, is_oce) & |
1010 |
+ pctsrf(i, is_sic) - 1.) > EPSFRA) print *, & |
+ pctsrf(i, is_sic) - 1.) > EPSFRA) print *, & |
1095 |
itop_con = llm + 1 - kctop |
itop_con = llm + 1 - kctop |
1096 |
else |
else |
1097 |
! iflag_con >= 3 |
! iflag_con >= 3 |
1098 |
|
|
1099 |
CALL concvl(dtphys, paprs, play, t_seri, q_seri, u_seri, & |
CALL concvl(dtphys, paprs, play, t_seri, q_seri, u_seri, & |
1100 |
v_seri, tr_seri, ema_work1, ema_work2, d_t_con, d_q_con, & |
v_seri, tr_seri, sig1, w01, d_t_con, d_q_con, & |
1101 |
d_u_con, d_v_con, d_tr, rain_con, snow_con, ibas_con, & |
d_u_con, d_v_con, d_tr, rain_con, snow_con, ibas_con, & |
1102 |
itop_con, upwd, dnwd, dnwd0, Ma, cape, tvp, iflagctrl, & |
itop_con, upwd, dnwd, dnwd0, Ma, cape, tvp, iflagctrl, & |
1103 |
pbase, bbase, dtvpdt1, dtvpdq1, dplcldt, dplcldr, qcondc, & |
pbase, bbase, dtvpdt1, dtvpdq1, dplcldt, dplcldr, qcondc, & |
1137 |
clwcon0 = fact_cldcon * clwcon0 |
clwcon0 = fact_cldcon * clwcon0 |
1138 |
call clouds_gno(klon, llm, q_seri, zqsat, clwcon0, ptconv, ratqsc, & |
call clouds_gno(klon, llm, q_seri, zqsat, clwcon0, ptconv, ratqsc, & |
1139 |
rnebcon0) |
rnebcon0) |
1140 |
|
|
1141 |
|
mfd = 0. |
1142 |
|
pen_u = 0. |
1143 |
|
pen_d = 0. |
1144 |
|
pde_d = 0. |
1145 |
|
pde_u = 0. |
1146 |
END if |
END if |
1147 |
|
|
1148 |
DO k = 1, llm |
DO k = 1, llm |
1167 |
IF (check) THEN |
IF (check) THEN |
1168 |
za = qcheck(klon, llm, paprs, q_seri, ql_seri, airephy) |
za = qcheck(klon, llm, paprs, q_seri, ql_seri, airephy) |
1169 |
print *, "aprescon = ", za |
print *, "aprescon = ", za |
1170 |
zx_t = 0.0 |
zx_t = 0. |
1171 |
za = 0.0 |
za = 0. |
1172 |
DO i = 1, klon |
DO i = 1, klon |
1173 |
za = za + airephy(i)/REAL(klon) |
za = za + airephy(i)/REAL(klon) |
1174 |
zx_t = zx_t + (rain_con(i)+ & |
zx_t = zx_t + (rain_con(i)+ & |
1255 |
ratqs = ratqss |
ratqs = ratqss |
1256 |
endif |
endif |
1257 |
|
|
|
! Processus de condensation à grande echelle et processus de |
|
|
! précipitation : |
|
1258 |
CALL fisrtilp(dtphys, paprs, play, t_seri, q_seri, ptconv, ratqs, & |
CALL fisrtilp(dtphys, paprs, play, t_seri, q_seri, ptconv, ratqs, & |
1259 |
d_t_lsc, d_q_lsc, d_ql_lsc, rneb, cldliq, rain_lsc, snow_lsc, & |
d_t_lsc, d_q_lsc, d_ql_lsc, rneb, cldliq, rain_lsc, snow_lsc, & |
1260 |
pfrac_impa, pfrac_nucl, pfrac_1nucl, frac_impa, frac_nucl, prfl, & |
pfrac_impa, pfrac_nucl, pfrac_1nucl, frac_impa, frac_nucl, prfl, & |
1274 |
IF (check) THEN |
IF (check) THEN |
1275 |
za = qcheck(klon, llm, paprs, q_seri, ql_seri, airephy) |
za = qcheck(klon, llm, paprs, q_seri, ql_seri, airephy) |
1276 |
print *, "apresilp = ", za |
print *, "apresilp = ", za |
1277 |
zx_t = 0.0 |
zx_t = 0. |
1278 |
za = 0.0 |
za = 0. |
1279 |
DO i = 1, klon |
DO i = 1, klon |
1280 |
za = za + airephy(i)/REAL(klon) |
za = za + airephy(i)/REAL(klon) |
1281 |
zx_t = zx_t + (rain_lsc(i) & |
zx_t = zx_t + (rain_lsc(i) & |
1328 |
ENDDO |
ENDDO |
1329 |
ENDDO |
ENDDO |
1330 |
ELSE IF (iflag_cldcon == 3) THEN |
ELSE IF (iflag_cldcon == 3) THEN |
1331 |
! On prend pour les nuages convectifs le max du calcul de la |
! On prend pour les nuages convectifs le maximum du calcul de |
1332 |
! convection et du calcul du pas de temps précédent diminué d'un facteur |
! la convection et du calcul du pas de temps précédent diminué |
1333 |
! facttemps |
! d'un facteur facttemps. |
1334 |
facteur = dtphys *facttemps |
facteur = dtphys * facttemps |
1335 |
do k = 1, llm |
do k = 1, llm |
1336 |
do i = 1, klon |
do i = 1, klon |
1337 |
rnebcon(i, k) = rnebcon(i, k) * facteur |
rnebcon(i, k) = rnebcon(i, k) * facteur |
1338 |
if (rnebcon0(i, k)*clwcon0(i, k) > rnebcon(i, k)*clwcon(i, k)) & |
if (rnebcon0(i, k) * clwcon0(i, k) & |
1339 |
then |
> rnebcon(i, k) * clwcon(i, k)) then |
1340 |
rnebcon(i, k) = rnebcon0(i, k) |
rnebcon(i, k) = rnebcon0(i, k) |
1341 |
clwcon(i, k) = clwcon0(i, k) |
clwcon(i, k) = clwcon0(i, k) |
1342 |
endif |
endif |
1462 |
|
|
1463 |
! Calculer l'hydrologie de la surface |
! Calculer l'hydrologie de la surface |
1464 |
DO i = 1, klon |
DO i = 1, klon |
1465 |
zxqsurf(i) = 0.0 |
zxqsurf(i) = 0. |
1466 |
zxsnow(i) = 0.0 |
zxsnow(i) = 0. |
1467 |
ENDDO |
ENDDO |
1468 |
DO nsrf = 1, nbsrf |
DO nsrf = 1, nbsrf |
1469 |
DO i = 1, klon |
DO i = 1, klon |
1485 |
igwd = 0 |
igwd = 0 |
1486 |
DO i = 1, klon |
DO i = 1, klon |
1487 |
itest(i) = 0 |
itest(i) = 0 |
1488 |
IF (((zpic(i)-zmea(i)) > 100.).AND.(zstd(i) > 10.0)) THEN |
IF (((zpic(i)-zmea(i)) > 100.).AND.(zstd(i) > 10.)) THEN |
1489 |
itest(i) = 1 |
itest(i) = 1 |
1490 |
igwd = igwd + 1 |
igwd = igwd + 1 |
1491 |
idx(igwd) = i |
idx(igwd) = i |
1656 |
itau_phy = itau_phy + itap |
itau_phy = itau_phy + itap |
1657 |
CALL phyredem("restartphy.nc", rlat, rlon, pctsrf, ftsol, ftsoil, & |
CALL phyredem("restartphy.nc", rlat, rlon, pctsrf, ftsol, ftsoil, & |
1658 |
tslab, seaice, fqsurf, qsol, fsnow, falbe, falblw, fevap, & |
tslab, seaice, fqsurf, qsol, fsnow, falbe, falblw, fevap, & |
1659 |
rain_fall, snow_fall, solsw, sollwdown, dlw, radsol, frugs, & |
rain_fall, snow_fall, solsw, sollw, dlw, radsol, frugs, & |
1660 |
agesno, zmea, zstd, zsig, zgam, zthe, zpic, zval, t_ancien, & |
agesno, zmea, zstd, zsig, zgam, zthe, zpic, zval, t_ancien, & |
1661 |
q_ancien, rnebcon, ratqs, clwcon, run_off_lic_0) |
q_ancien, rnebcon, ratqs, clwcon, run_off_lic_0, sig1, w01) |
1662 |
ENDIF |
ENDIF |
1663 |
|
|
1664 |
firstcal = .FALSE. |
firstcal = .FALSE. |