10 |
contains |
contains |
11 |
|
|
12 |
SUBROUTINE physiq(nq, firstcal, lafin, rdayvrai, gmtime, pdtphys, paprs, & |
SUBROUTINE physiq(nq, firstcal, lafin, rdayvrai, gmtime, pdtphys, paprs, & |
13 |
pplay, pphi, pphis, presnivs, clesphy0, u, v, t, qx, omega, d_u, d_v, & |
pplay, pphi, pphis, presnivs, u, v, t, qx, omega, d_u, d_v, & |
14 |
d_t, d_qx, d_ps, dudyn, PVteta) |
d_t, d_qx, d_ps, dudyn, PVteta) |
15 |
|
|
16 |
! From phylmd/physiq.F, v 1.22 2006/02/20 09:38:28 |
! From phylmd/physiq.F, v 1.22 2006/02/20 09:38:28 |
319 |
|
|
320 |
INTEGER longcles |
INTEGER longcles |
321 |
PARAMETER ( longcles = 20 ) |
PARAMETER ( longcles = 20 ) |
|
REAL, intent(in):: clesphy0( longcles ) |
|
322 |
|
|
323 |
! Variables propres a la physique |
! Variables propres a la physique |
324 |
|
|
356 |
REAL falblw(klon, nbsrf) |
REAL falblw(klon, nbsrf) |
357 |
SAVE falblw ! albedo par type de surface |
SAVE falblw ! albedo par type de surface |
358 |
|
|
359 |
! Parametres de l'Orographie a l'Echelle Sous-Maille (OESM): |
! Paramètres de l'orographie à l'échelle sous-maille (OESM) : |
360 |
|
REAL, save:: zmea(klon) ! orographie moyenne |
361 |
REAL zmea(klon) |
REAL, save:: zstd(klon) ! deviation standard de l'OESM |
362 |
SAVE zmea ! orographie moyenne |
REAL, save:: zsig(klon) ! pente de l'OESM |
363 |
|
REAL, save:: zgam(klon) ! anisotropie de l'OESM |
364 |
REAL zstd(klon) |
REAL, save:: zthe(klon) ! orientation de l'OESM |
365 |
SAVE zstd ! deviation standard de l'OESM |
REAL, save:: zpic(klon) ! Maximum de l'OESM |
366 |
|
REAL, save:: zval(klon) ! Minimum de l'OESM |
367 |
REAL zsig(klon) |
REAL, save:: rugoro(klon) ! longueur de rugosite de l'OESM |
|
SAVE zsig ! pente de l'OESM |
|
|
|
|
|
REAL zgam(klon) |
|
|
save zgam ! anisotropie de l'OESM |
|
|
|
|
|
REAL zthe(klon) |
|
|
SAVE zthe ! orientation de l'OESM |
|
|
|
|
|
REAL zpic(klon) |
|
|
SAVE zpic ! Maximum de l'OESM |
|
|
|
|
|
REAL zval(klon) |
|
|
SAVE zval ! Minimum de l'OESM |
|
|
|
|
|
REAL rugoro(klon) |
|
|
SAVE rugoro ! longueur de rugosite de l'OESM |
|
368 |
|
|
369 |
REAL zulow(klon), zvlow(klon) |
REAL zulow(klon), zvlow(klon) |
370 |
|
|
777 |
ok_sync=.TRUE. |
ok_sync=.TRUE. |
778 |
IF (nq < 2) THEN |
IF (nq < 2) THEN |
779 |
abort_message = 'eaux vapeur et liquide sont indispensables' |
abort_message = 'eaux vapeur et liquide sont indispensables' |
780 |
CALL abort_gcm (modname, abort_message, 1) |
CALL abort_gcm(modname, abort_message, 1) |
781 |
ENDIF |
ENDIF |
782 |
|
|
783 |
test_firstcal: IF (firstcal) THEN |
test_firstcal: IF (firstcal) THEN |
784 |
! initialiser |
! initialiser |
785 |
u10m(:, :)=0. |
u10m=0. |
786 |
v10m(:, :)=0. |
v10m=0. |
787 |
t2m(:, :)=0. |
t2m=0. |
788 |
q2m(:, :)=0. |
q2m=0. |
789 |
ffonte(:, :)=0. |
ffonte=0. |
790 |
fqcalving(:, :)=0. |
fqcalving=0. |
791 |
piz_ae(:, :, :)=0. |
piz_ae(:, :, :)=0. |
792 |
tau_ae(:, :, :)=0. |
tau_ae(:, :, :)=0. |
793 |
cg_ae(:, :, :)=0. |
cg_ae(:, :, :)=0. |
800 |
solswai(:)=0. |
solswai(:)=0. |
801 |
solswad(:)=0. |
solswad(:)=0. |
802 |
|
|
803 |
d_u_con(:, :) = 0.0 |
d_u_con = 0.0 |
804 |
d_v_con(:, :) = 0.0 |
d_v_con = 0.0 |
805 |
rnebcon0(:, :) = 0.0 |
rnebcon0 = 0.0 |
806 |
clwcon0(:, :) = 0.0 |
clwcon0 = 0.0 |
807 |
rnebcon(:, :) = 0.0 |
rnebcon = 0.0 |
808 |
clwcon(:, :) = 0.0 |
clwcon = 0.0 |
809 |
|
|
810 |
pblh(:, :) =0. ! Hauteur de couche limite |
pblh =0. ! Hauteur de couche limite |
811 |
plcl(:, :) =0. ! Niveau de condensation de la CLA |
plcl =0. ! Niveau de condensation de la CLA |
812 |
capCL(:, :) =0. ! CAPE de couche limite |
capCL =0. ! CAPE de couche limite |
813 |
oliqCL(:, :) =0. ! eau_liqu integree de couche limite |
oliqCL =0. ! eau_liqu integree de couche limite |
814 |
cteiCL(:, :) =0. ! cloud top instab. crit. couche limite |
cteiCL =0. ! cloud top instab. crit. couche limite |
815 |
pblt(:, :) =0. ! T a la Hauteur de couche limite |
pblt =0. ! T a la Hauteur de couche limite |
816 |
therm(:, :) =0. |
therm =0. |
817 |
trmb1(:, :) =0. ! deep_cape |
trmb1 =0. ! deep_cape |
818 |
trmb2(:, :) =0. ! inhibition |
trmb2 =0. ! inhibition |
819 |
trmb3(:, :) =0. ! Point Omega |
trmb3 =0. ! Point Omega |
820 |
|
|
821 |
IF (if_ebil >= 1) d_h_vcol_phy=0. |
IF (if_ebil >= 1) d_h_vcol_phy=0. |
822 |
|
|
837 |
CALL phyetat0("startphy.nc", pctsrf, ftsol, ftsoil, ocean, tslab, & |
CALL phyetat0("startphy.nc", pctsrf, ftsol, ftsoil, ocean, tslab, & |
838 |
seaice, fqsurf, qsol, fsnow, & |
seaice, fqsurf, qsol, fsnow, & |
839 |
falbe, falblw, fevap, rain_fall, snow_fall, solsw, sollwdown, & |
falbe, falblw, fevap, rain_fall, snow_fall, solsw, sollwdown, & |
840 |
dlw, radsol, frugs, agesno, clesphy0, & |
dlw, radsol, frugs, agesno, & |
841 |
zmea, zstd, zsig, zgam, zthe, zpic, zval, rugoro, & |
zmea, zstd, zsig, zgam, zthe, zpic, zval, & |
842 |
t_ancien, q_ancien, ancien_ok, rnebcon, ratqs, clwcon, & |
t_ancien, q_ancien, ancien_ok, rnebcon, ratqs, clwcon, & |
843 |
run_off_lic_0) |
run_off_lic_0) |
844 |
|
|
887 |
ENDIF |
ENDIF |
888 |
|
|
889 |
IF (ok_orodr) THEN |
IF (ok_orodr) THEN |
890 |
DO i=1, klon |
rugoro = MAX(1e-5, zstd * zsig / 2) |
|
rugoro(i) = MAX(1.0e-05, zstd(i)*zsig(i)/2.0) |
|
|
ENDDO |
|
891 |
CALL SUGWD(klon, llm, paprs, pplay) |
CALL SUGWD(klon, llm, paprs, pplay) |
892 |
|
else |
893 |
|
rugoro = 0. |
894 |
ENDIF |
ENDIF |
895 |
|
|
896 |
lmt_pas = NINT(86400. / pdtphys) ! tous les jours |
lmt_pas = NINT(86400. / pdtphys) ! tous les jours |
939 |
ENDDO |
ENDDO |
940 |
ENDDO |
ENDDO |
941 |
ENDDO |
ENDDO |
942 |
da(:, :)=0. |
da=0. |
943 |
mp(:, :)=0. |
mp=0. |
944 |
phi(:, :, :)=0. |
phi(:, :, :)=0. |
945 |
|
|
946 |
! Ne pas affecter les valeurs entrees de u, v, h, et q |
! Ne pas affecter les valeurs entrees de u, v, h, et q |
1315 |
! (driver commun aux versions 3 et 4) |
! (driver commun aux versions 3 et 4) |
1316 |
|
|
1317 |
IF (ok_cvl) THEN ! new driver for convectL |
IF (ok_cvl) THEN ! new driver for convectL |
|
|
|
1318 |
CALL concvl (iflag_con, & |
CALL concvl (iflag_con, & |
1319 |
pdtphys, paprs, pplay, t_seri, q_seri, & |
pdtphys, paprs, pplay, t_seri, q_seri, & |
1320 |
u_seri, v_seri, tr_seri, ntra, & |
u_seri, v_seri, tr_seri, ntra, & |
1328 |
da, phi, mp) |
da, phi, mp) |
1329 |
|
|
1330 |
clwcon0=qcondc |
clwcon0=qcondc |
1331 |
pmfu(:, :)=upwd(:, :)+dnwd(:, :) |
pmfu=upwd+dnwd |
|
|
|
1332 |
ELSE ! ok_cvl |
ELSE ! ok_cvl |
1333 |
! MAF conema3 ne contient pas les traceurs |
! MAF conema3 ne contient pas les traceurs |
1334 |
CALL conema3 (pdtphys, & |
CALL conema3 (pdtphys, & |
1342 |
pbase & |
pbase & |
1343 |
, bbase, dtvpdt1, dtvpdq1, dplcldt, dplcldr & |
, bbase, dtvpdt1, dtvpdq1, dplcldt, dplcldr & |
1344 |
, clwcon0) |
, clwcon0) |
|
|
|
1345 |
ENDIF ! ok_cvl |
ENDIF ! ok_cvl |
1346 |
|
|
1347 |
IF (.NOT. ok_gust) THEN |
IF (.NOT. ok_gust) THEN |
1373 |
ENDDO |
ENDDO |
1374 |
|
|
1375 |
! calcul des proprietes des nuages convectifs |
! calcul des proprietes des nuages convectifs |
1376 |
clwcon0(:, :)=fact_cldcon*clwcon0(:, :) |
clwcon0=fact_cldcon*clwcon0 |
1377 |
call clouds_gno & |
call clouds_gno & |
1378 |
(klon, llm, q_seri, zqsat, clwcon0, ptconv, ratqsc, rnebcon0) |
(klon, llm, q_seri, zqsat, clwcon0, ptconv, ratqsc, rnebcon0) |
1379 |
ELSE |
ELSE |
1442 |
|
|
1443 |
! Convection seche (thermiques ou ajustement) |
! Convection seche (thermiques ou ajustement) |
1444 |
|
|
1445 |
d_t_ajs(:, :)=0. |
d_t_ajs=0. |
1446 |
d_u_ajs(:, :)=0. |
d_u_ajs=0. |
1447 |
d_v_ajs(:, :)=0. |
d_v_ajs=0. |
1448 |
d_q_ajs(:, :)=0. |
d_q_ajs=0. |
1449 |
fm_therm(:, :)=0. |
fm_therm=0. |
1450 |
entr_therm(:, :)=0. |
entr_therm=0. |
1451 |
|
|
1452 |
IF(prt_level>9)print *, & |
IF(prt_level>9)print *, & |
1453 |
'AVANT LA CONVECTION SECHE, iflag_thermals=' & |
'AVANT LA CONVECTION SECHE, iflag_thermals=' & |
1459 |
! Ajustement sec |
! Ajustement sec |
1460 |
IF(prt_level>9)print *,'ajsec' |
IF(prt_level>9)print *,'ajsec' |
1461 |
CALL ajsec(paprs, pplay, t_seri, q_seri, d_t_ajs, d_q_ajs) |
CALL ajsec(paprs, pplay, t_seri, q_seri, d_t_ajs, d_q_ajs) |
1462 |
t_seri(:, :) = t_seri(:, :) + d_t_ajs(:, :) |
t_seri = t_seri + d_t_ajs |
1463 |
q_seri(:, :) = q_seri(:, :) + d_q_ajs(:, :) |
q_seri = q_seri + d_q_ajs |
1464 |
else |
else |
1465 |
! Thermiques |
! Thermiques |
1466 |
IF(prt_level>9)print *,'JUSTE AVANT, iflag_thermals=' & |
IF(prt_level>9)print *,'JUSTE AVANT, iflag_thermals=' & |
1511 |
! 1e4 (en gros 3 heures), en dur pour le moment, est le temps de |
! 1e4 (en gros 3 heures), en dur pour le moment, est le temps de |
1512 |
! relaxation des ratqs |
! relaxation des ratqs |
1513 |
facteur=exp(-pdtphys*facttemps) |
facteur=exp(-pdtphys*facttemps) |
1514 |
ratqs(:, :)=max(ratqs(:, :)*facteur, ratqss(:, :)) |
ratqs=max(ratqs*facteur, ratqss) |
1515 |
ratqs(:, :)=max(ratqs(:, :), ratqsc(:, :)) |
ratqs=max(ratqs, ratqsc) |
1516 |
else |
else |
1517 |
! on ne prend que le ratqs stable pour fisrtilp |
! on ne prend que le ratqs stable pour fisrtilp |
1518 |
ratqs(:, :)=ratqss(:, :) |
ratqs=ratqss |
1519 |
endif |
endif |
1520 |
|
|
1521 |
! Appeler le processus de condensation a grande echelle |
! Appeler le processus de condensation a grande echelle |
1615 |
enddo |
enddo |
1616 |
|
|
1617 |
! On prend la somme des fractions nuageuses et des contenus en eau |
! On prend la somme des fractions nuageuses et des contenus en eau |
1618 |
cldfra(:, :)=min(max(cldfra(:, :), rnebcon(:, :)), 1.) |
cldfra=min(max(cldfra, rnebcon), 1.) |
1619 |
cldliq(:, :)=cldliq(:, :)+rnebcon(:, :)*clwcon(:, :) |
cldliq=cldliq+rnebcon*clwcon |
1620 |
|
|
1621 |
ENDIF |
ENDIF |
1622 |
|
|
1782 |
bils(i) = radsol(i) - sens(i) + zxfluxlat(i) |
bils(i) = radsol(i) - sens(i) + zxfluxlat(i) |
1783 |
ENDDO |
ENDDO |
1784 |
|
|
1785 |
!moddeblott(jan95) |
!mod deb lott(jan95) |
1786 |
! Appeler le programme de parametrisation de l'orographie |
! Appeler le programme de parametrisation de l'orographie |
1787 |
! a l'echelle sous-maille: |
! a l'echelle sous-maille: |
1788 |
|
|
1789 |
IF (ok_orodr) THEN |
IF (ok_orodr) THEN |
|
|
|
1790 |
! selection des points pour lesquels le shema est actif: |
! selection des points pour lesquels le shema est actif: |
1791 |
igwd=0 |
igwd=0 |
1792 |
DO i=1, klon |
DO i=1, klon |
1813 |
v_seri(i, k) = v_seri(i, k) + d_v_oro(i, k) |
v_seri(i, k) = v_seri(i, k) + d_v_oro(i, k) |
1814 |
ENDDO |
ENDDO |
1815 |
ENDDO |
ENDDO |
1816 |
|
ENDIF |
|
ENDIF ! fin de test sur ok_orodr |
|
1817 |
|
|
1818 |
IF (ok_orolf) THEN |
IF (ok_orolf) THEN |
1819 |
|
|
1978 |
DO iq = 3, nq |
DO iq = 3, nq |
1979 |
DO k = 1, llm |
DO k = 1, llm |
1980 |
DO i = 1, klon |
DO i = 1, klon |
1981 |
d_qx(i, k, iq) = ( tr_seri(i, k, iq-2) - qx(i, k, iq) ) / pdtphys |
d_qx(i, k, iq) = (tr_seri(i, k, iq-2) - qx(i, k, iq)) / pdtphys |
1982 |
ENDDO |
ENDDO |
1983 |
ENDDO |
ENDDO |
1984 |
ENDDO |
ENDDO |
2003 |
|
|
2004 |
IF (lafin) THEN |
IF (lafin) THEN |
2005 |
itau_phy = itau_phy + itap |
itau_phy = itau_phy + itap |
2006 |
CALL phyredem ("restartphy.nc", radpas, rlat, rlon, pctsrf, ftsol, & |
CALL phyredem("restartphy.nc", rlat, rlon, pctsrf, ftsol, & |
2007 |
ftsoil, tslab, seaice, fqsurf, qsol, & |
ftsoil, tslab, seaice, fqsurf, qsol, & |
2008 |
fsnow, falbe, falblw, fevap, rain_fall, snow_fall, & |
fsnow, falbe, falblw, fevap, rain_fall, snow_fall, & |
2009 |
solsw, sollwdown, dlw, & |
solsw, sollwdown, dlw, & |
2010 |
radsol, frugs, agesno, & |
radsol, frugs, agesno, & |
2011 |
zmea, zstd, zsig, zgam, zthe, zpic, zval, rugoro, & |
zmea, zstd, zsig, zgam, zthe, zpic, zval, & |
2012 |
t_ancien, q_ancien, rnebcon, ratqs, clwcon, run_off_lic_0) |
t_ancien, q_ancien, rnebcon, ratqs, clwcon, run_off_lic_0) |
2013 |
ENDIF |
ENDIF |
2014 |
|
|