4 |
|
|
5 |
contains |
contains |
6 |
|
|
7 |
SUBROUTINE physiq(lafin, dayvrai, time, dtphys, paprs, play, pphi, pphis, & |
SUBROUTINE physiq(lafin, dayvrai, time, paprs, play, pphi, pphis, u, v, t, & |
8 |
u, v, t, qx, omega, d_u, d_v, d_t, d_qx) |
qx, omega, d_u, d_v, d_t, d_qx) |
9 |
|
|
10 |
! From phylmd/physiq.F, version 1.22 2006/02/20 09:38:28 |
! From phylmd/physiq.F, version 1.22 2006/02/20 09:38:28 |
11 |
! (subversion revision 678) |
! (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. |
16 |
|
|
25 |
ok_orodr, ok_orolf |
ok_orodr, ok_orolf |
26 |
USE clmain_m, ONLY: clmain |
USE clmain_m, ONLY: clmain |
27 |
use clouds_gno_m, only: clouds_gno |
use clouds_gno_m, only: clouds_gno |
28 |
|
use comconst, only: dtphys |
29 |
USE comgeomphy, ONLY: airephy |
USE comgeomphy, ONLY: airephy |
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, day_step, iphysiq |
32 |
USE conf_phys_m, ONLY: conf_phys |
USE conf_phys_m, ONLY: conf_phys |
33 |
use conflx_m, only: conflx |
use conflx_m, only: conflx |
34 |
USE ctherm, ONLY: iflag_thermals, nsplit_thermals |
USE ctherm, ONLY: iflag_thermals, nsplit_thermals |
71 |
! current day number, based at value 1 on January 1st of annee_ref |
! current day number, based at value 1 on January 1st of annee_ref |
72 |
|
|
73 |
REAL, intent(in):: time ! heure de la journ\'ee en fraction de jour |
REAL, intent(in):: time ! heure de la journ\'ee en fraction de jour |
|
REAL, intent(in):: dtphys ! pas d'integration pour la physique (seconde) |
|
74 |
|
|
75 |
REAL, intent(in):: paprs(:, :) ! (klon, llm + 1) |
REAL, intent(in):: paprs(:, :) ! (klon, llm + 1) |
76 |
! pression pour chaque inter-couche, en Pa |
! pression pour chaque inter-couche, en Pa |
319 |
REAL dlw(klon) ! derivee infra rouge |
REAL dlw(klon) ! derivee infra rouge |
320 |
SAVE dlw |
SAVE dlw |
321 |
REAL bils(klon) ! bilan de chaleur au sol |
REAL bils(klon) ! bilan de chaleur au sol |
322 |
REAL fder(klon) ! Derive de flux (sensible et latente) |
REAL, save:: fder(klon) ! Derive de flux (sensible et latente) |
|
save fder |
|
323 |
REAL ve(klon) ! integr. verticale du transport meri. de l'energie |
REAL ve(klon) ! integr. verticale du transport meri. de l'energie |
324 |
REAL vq(klon) ! integr. verticale du transport meri. de l'eau |
REAL vq(klon) ! integr. verticale du transport meri. de l'eau |
325 |
REAL ue(klon) ! integr. verticale du transport zonal de l'energie |
REAL ue(klon) ! integr. verticale du transport zonal de l'energie |
369 |
! Le rayonnement n'est pas calcul\'e tous les pas, il faut donc que |
! Le rayonnement n'est pas calcul\'e tous les pas, il faut donc que |
370 |
! les variables soient r\'emanentes. |
! les variables soient r\'emanentes. |
371 |
REAL, save:: heat(klon, llm) ! chauffage solaire |
REAL, save:: heat(klon, llm) ! chauffage solaire |
372 |
REAL heat0(klon, llm) ! chauffage solaire ciel clair |
REAL, save:: heat0(klon, llm) ! chauffage solaire ciel clair |
373 |
REAL, save:: cool(klon, llm) ! refroidissement infrarouge |
REAL, save:: cool(klon, llm) ! refroidissement infrarouge |
374 |
REAL cool0(klon, llm) ! refroidissement infrarouge ciel clair |
REAL, save:: cool0(klon, llm) ! refroidissement infrarouge ciel clair |
375 |
REAL, save:: topsw(klon), toplw(klon), solsw(klon) |
REAL, save:: topsw(klon), toplw(klon), solsw(klon) |
376 |
REAL, save:: sollw(klon) ! rayonnement infrarouge montant \`a la surface |
REAL, save:: sollw(klon) ! rayonnement infrarouge montant \`a la surface |
377 |
real, save:: sollwdown(klon) ! downward LW flux at surface |
real, save:: sollwdown(klon) ! downward LW flux at surface |
378 |
REAL, save:: topsw0(klon), toplw0(klon), solsw0(klon), sollw0(klon) |
REAL, save:: topsw0(klon), toplw0(klon), solsw0(klon), sollw0(klon) |
379 |
REAL albpla(klon) |
REAL, save:: albpla(klon) |
380 |
REAL fsollw(klon, nbsrf) ! bilan flux IR pour chaque sous surface |
REAL fsollw(klon, nbsrf) ! bilan flux IR pour chaque sous surface |
381 |
REAL fsolsw(klon, nbsrf) ! flux solaire absorb. pour chaque sous surface |
REAL fsolsw(klon, nbsrf) ! flux solaire absorb. pour chaque sous surface |
|
SAVE albpla |
|
|
SAVE heat0, cool0 |
|
|
|
|
|
INTEGER itaprad |
|
|
SAVE itaprad |
|
382 |
|
|
383 |
REAL conv_q(klon, llm) ! convergence de l'humidite (kg/kg/s) |
REAL conv_q(klon, llm) ! convergence de l'humidite (kg/kg/s) |
384 |
REAL conv_t(klon, llm) ! convergence of temperature (K/s) |
REAL conv_t(klon, llm) ! convergence of temperature (K/s) |
626 |
|
|
627 |
frugs = 0. |
frugs = 0. |
628 |
itap = 0 |
itap = 0 |
|
itaprad = 0 |
|
629 |
CALL phyetat0(pctsrf, ftsol, ftsoil, tslab, seaice, fqsurf, qsol, & |
CALL phyetat0(pctsrf, ftsol, ftsoil, tslab, seaice, fqsurf, qsol, & |
630 |
fsnow, falbe, falblw, fevap, rain_fall, snow_fall, solsw, sollw, & |
fsnow, falbe, falblw, fevap, rain_fall, snow_fall, solsw, sollw, & |
631 |
dlw, radsol, frugs, agesno, zmea, zstd, zsig, zgam, zthe, zpic, & |
dlw, radsol, frugs, agesno, zmea, zstd, zsig, zgam, zthe, zpic, & |
635 |
! ATTENTION : il faudra a terme relire q2 dans l'etat initial |
! ATTENTION : il faudra a terme relire q2 dans l'etat initial |
636 |
q2 = 1e-8 |
q2 = 1e-8 |
637 |
|
|
638 |
radpas = NINT(86400. / dtphys / nbapp_rad) |
lmt_pas = day_step / iphysiq |
639 |
|
print *, 'Number of time steps of "physics" per day: ', lmt_pas |
640 |
|
|
641 |
|
radpas = lmt_pas / nbapp_rad |
642 |
|
|
643 |
! on remet le calendrier a zero |
! On remet le calendrier a zero |
644 |
IF (raz_date) itau_phy = 0 |
IF (raz_date) itau_phy = 0 |
645 |
|
|
646 |
CALL printflag(radpas, ok_journe, ok_instan, ok_region) |
CALL printflag(radpas, ok_journe, ok_instan, ok_region) |
647 |
|
|
|
IF (dtphys * radpas > 21600. .AND. cycle_diurne) THEN |
|
|
print *, "Au minimum 4 appels par jour si cycle diurne" |
|
|
call abort_gcm('physiq', & |
|
|
"Nombre d'appels au rayonnement insuffisant", 1) |
|
|
ENDIF |
|
|
|
|
648 |
! Initialisation pour le sch\'ema de convection d'Emanuel : |
! Initialisation pour le sch\'ema de convection d'Emanuel : |
649 |
IF (iflag_con >= 3) THEN |
IF (iflag_con >= 3) THEN |
650 |
ibas_con = 1 |
ibas_con = 1 |
658 |
rugoro = 0. |
rugoro = 0. |
659 |
ENDIF |
ENDIF |
660 |
|
|
|
lmt_pas = NINT(86400. / dtphys) ! tous les jours |
|
|
print *, 'Number of time steps of "physics" per day: ', lmt_pas |
|
|
|
|
661 |
ecrit_ins = NINT(ecrit_ins/dtphys) |
ecrit_ins = NINT(ecrit_ins/dtphys) |
662 |
ecrit_hf = NINT(ecrit_hf/dtphys) |
ecrit_hf = NINT(ecrit_hf/dtphys) |
663 |
ecrit_mth = NINT(ecrit_mth/dtphys) |
ecrit_mth = NINT(ecrit_mth/dtphys) |
785 |
! Couche limite: |
! Couche limite: |
786 |
|
|
787 |
CALL clmain(dtphys, itap, pctsrf, pctsrf_new, t_seri, q_seri, u_seri, & |
CALL clmain(dtphys, itap, pctsrf, pctsrf_new, t_seri, q_seri, u_seri, & |
788 |
v_seri, julien, mu0, co2_ppm, ftsol, cdmmax, cdhmax, & |
v_seri, julien, mu0, co2_ppm, ftsol, cdmmax, cdhmax, ksta, ksta_ter, & |
789 |
ksta, ksta_ter, ok_kzmin, ftsoil, qsol, paprs, play, fsnow, fqsurf, & |
ok_kzmin, ftsoil, qsol, paprs, play, fsnow, fqsurf, fevap, falbe, & |
790 |
fevap, falbe, falblw, fluxlat, rain_fall, snow_fall, fsolsw, fsollw, & |
falblw, fluxlat, rain_fall, snow_fall, fsolsw, fsollw, fder, rlat, & |
791 |
fder, rlat, frugs, firstcal, agesno, rugoro, d_t_vdf, d_q_vdf, & |
frugs, firstcal, agesno, rugoro, d_t_vdf, d_q_vdf, d_u_vdf, d_v_vdf, & |
792 |
d_u_vdf, d_v_vdf, d_ts, fluxt, fluxq, fluxu, fluxv, cdragh, cdragm, & |
d_ts, fluxt, fluxq, fluxu, fluxv, cdragh, cdragm, q2, dsens, devap, & |
793 |
q2, dsens, devap, ycoefh, yu1, yv1, t2m, q2m, u10m, v10m, pblh, & |
ycoefh, yu1, yv1, t2m, q2m, u10m, v10m, pblh, capCL, oliqCL, cteiCL, & |
794 |
capCL, oliqCL, cteiCL, pblT, therm, trmb1, trmb2, trmb3, plcl, & |
pblT, therm, trmb1, trmb2, trmb3, plcl, fqcalving, ffonte, & |
795 |
fqcalving, ffonte, run_off_lic_0, fluxo, fluxg, tslab) |
run_off_lic_0, fluxo, fluxg, tslab) |
796 |
|
|
797 |
! Incr\'ementation des flux |
! Incr\'ementation des flux |
798 |
|
|
1238 |
bl95_b1, cldtaupi, re, fl) |
bl95_b1, cldtaupi, re, fl) |
1239 |
endif |
endif |
1240 |
|
|
1241 |
IF (MOD(itaprad, radpas) == 0) THEN |
IF (MOD(itap - 1, radpas) == 0) THEN |
1242 |
! Appeler le rayonnement mais calculer tout d'abord l'albedo du sol. |
! Appeler le rayonnement mais calculer tout d'abord l'albedo du sol. |
1243 |
DO i = 1, klon |
DO i = 1, klon |
1244 |
albsol(i) = falbe(i, is_oce) * pctsrf(i, is_oce) & |
albsol(i) = falbe(i, is_oce) * pctsrf(i, is_oce) & |
1257 |
sollwdown, topsw0, toplw0, solsw0, sollw0, lwdn0, lwdn, lwup0, & |
sollwdown, topsw0, toplw0, solsw0, sollw0, lwdn0, lwdn, lwup0, & |
1258 |
lwup, swdn0, swdn, swup0, swup, ok_ade, ok_aie, tau_ae, piz_ae, & |
lwup, swdn0, swdn, swup0, swup, ok_ade, ok_aie, tau_ae, piz_ae, & |
1259 |
cg_ae, topswad, solswad, cldtaupi, topswai, solswai) |
cg_ae, topswad, solswad, cldtaupi, topswai, solswai) |
|
itaprad = 0 |
|
1260 |
ENDIF |
ENDIF |
1261 |
|
|
|
itaprad = itaprad + 1 |
|
|
|
|
1262 |
! Ajouter la tendance des rayonnements (tous les pas) |
! Ajouter la tendance des rayonnements (tous les pas) |
1263 |
|
|
1264 |
DO k = 1, llm |
DO k = 1, llm |