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 (SVN revision 678) |
11 |
! Author: Z.X. Li (LMD/CNRS) 1993 |
! Author: Z.X. Li (LMD/CNRS) 1993 |
12 |
|
|
13 |
! Objet : moniteur général de la physique du modèle |
! This is the main procedure for the "physics" part of the program. |
14 |
|
|
15 |
use abort_gcm_m, only: abort_gcm |
use abort_gcm_m, only: abort_gcm |
16 |
USE calendar, only: ymds2ju |
USE calendar, only: ymds2ju |
27 |
use dimens_m, only: jjm, iim, llm, nqmx |
use dimens_m, only: jjm, iim, llm, nqmx |
28 |
use dimphy, only: klon, nbtr |
use dimphy, only: klon, nbtr |
29 |
use dimsoil, only: nsoilmx |
use dimsoil, only: nsoilmx |
30 |
|
use fcttre, only: thermcep, foeew, qsats, qsatl |
31 |
use hgardfou_m, only: hgardfou |
use hgardfou_m, only: hgardfou |
32 |
USE histcom, only: histsync |
USE histcom, only: histsync |
33 |
USE histwrite_m, only: histwrite |
USE histwrite_m, only: histwrite |
46 |
use qcheck_m, only: qcheck |
use qcheck_m, only: qcheck |
47 |
use radepsi |
use radepsi |
48 |
use radopt |
use radopt |
49 |
|
use SUPHEC_M, only: rcpd, rtt, rlvtt, rg, ra, rsigma, retv, romega |
50 |
use temps, only: itau_phy, day_ref, annee_ref |
use temps, only: itau_phy, day_ref, annee_ref |
51 |
use yoethf_m |
use yoethf_m |
|
use SUPHEC_M, only: rcpd, rtt, rlvtt, rg, ra, rsigma, retv, romega |
|
|
|
|
|
! Declaration des constantes et des fonctions thermodynamiques : |
|
|
use fcttre, only: thermcep, foeew, qsats, qsatl |
|
52 |
|
|
53 |
! Variables argument: |
! Variables argument: |
54 |
|
|
82 |
REAL omega(klon, llm) ! input vitesse verticale en Pa/s |
REAL omega(klon, llm) ! input vitesse verticale en Pa/s |
83 |
REAL, intent(out):: d_u(klon, llm) ! tendance physique de "u" (m/s/s) |
REAL, intent(out):: d_u(klon, llm) ! tendance physique de "u" (m/s/s) |
84 |
REAL, intent(out):: d_v(klon, llm) ! tendance physique de "v" (m/s/s) |
REAL, intent(out):: d_v(klon, llm) ! tendance physique de "v" (m/s/s) |
85 |
REAL d_t(klon, llm) ! output tendance physique de "t" (K/s) |
REAL, intent(out):: d_t(klon, llm) ! tendance physique de "t" (K/s) |
86 |
REAL d_qx(klon, llm, nqmx) ! output tendance physique de "qx" (kg/kg/s) |
REAL d_qx(klon, llm, nqmx) ! output tendance physique de "qx" (kg/kg/s) |
87 |
REAL d_ps(klon) ! output tendance physique de la pression au sol |
REAL d_ps(klon) ! output tendance physique de la pression au sol |
88 |
|
|
101 |
|
|
102 |
LOGICAL check ! Verifier la conservation du modele en eau |
LOGICAL check ! Verifier la conservation du modele en eau |
103 |
PARAMETER (check=.FALSE.) |
PARAMETER (check=.FALSE.) |
104 |
LOGICAL ok_stratus ! Ajouter artificiellement les stratus |
|
105 |
PARAMETER (ok_stratus=.FALSE.) |
LOGICAL, PARAMETER:: ok_stratus=.FALSE. |
106 |
|
! Ajouter artificiellement les stratus |
107 |
|
|
108 |
! Parametres lies au coupleur OASIS: |
! Parametres lies au coupleur OASIS: |
109 |
INTEGER, SAVE :: npas, nexca |
INTEGER, SAVE :: npas, nexca |
116 |
logical ok_ocean |
logical ok_ocean |
117 |
SAVE ok_ocean |
SAVE ok_ocean |
118 |
|
|
119 |
!IM "slab" ocean |
! "slab" ocean |
120 |
REAL tslab(klon) !Temperature du slab-ocean |
REAL, save:: tslab(klon) ! temperature of ocean slab |
121 |
SAVE tslab |
REAL, save:: seaice(klon) ! glace de mer (kg/m2) |
122 |
REAL seaice(klon) !glace de mer (kg/m2) |
REAL fluxo(klon) ! flux turbulents ocean-glace de mer |
123 |
SAVE seaice |
REAL fluxg(klon) ! flux turbulents ocean-atmosphere |
|
REAL fluxo(klon) !flux turbulents ocean-glace de mer |
|
|
REAL fluxg(klon) !flux turbulents ocean-atmosphere |
|
124 |
|
|
125 |
! Modele thermique du sol, a activer pour le cycle diurne: |
! Modele thermique du sol, a activer pour le cycle diurne: |
126 |
logical, save:: ok_veget |
logical, save:: ok_veget |
144 |
INTEGER iliq ! indice de traceurs pour eau liquide |
INTEGER iliq ! indice de traceurs pour eau liquide |
145 |
PARAMETER (iliq=2) |
PARAMETER (iliq=2) |
146 |
|
|
147 |
REAL t_ancien(klon, llm), q_ancien(klon, llm) |
REAL, save:: t_ancien(klon, llm), q_ancien(klon, llm) |
148 |
SAVE t_ancien, q_ancien |
LOGICAL, save:: ancien_ok |
|
LOGICAL ancien_ok |
|
|
SAVE ancien_ok |
|
149 |
|
|
150 |
REAL d_t_dyn(klon, llm) ! tendance dynamique pour "t" (K/s) |
REAL d_t_dyn(klon, llm) ! tendance dynamique pour "t" (K/s) |
151 |
REAL d_q_dyn(klon, llm) ! tendance dynamique pour "q" (kg/kg/s) |
REAL d_q_dyn(klon, llm) ! tendance dynamique pour "q" (kg/kg/s) |
257 |
|
|
258 |
INTEGER, SAVE:: itap ! number of calls to "physiq" |
INTEGER, SAVE:: itap ! number of calls to "physiq" |
259 |
|
|
260 |
REAL ftsol(klon, nbsrf) |
REAL, save:: ftsol(klon, nbsrf) ! skin temperature of surface fraction |
|
SAVE ftsol ! temperature du sol |
|
261 |
|
|
262 |
REAL ftsoil(klon, nsoilmx, nbsrf) |
REAL, save:: ftsoil(klon, nsoilmx, nbsrf) |
263 |
SAVE ftsoil ! temperature dans le sol |
! soil temperature of surface fraction |
264 |
|
|
265 |
REAL fevap(klon, nbsrf) |
REAL fevap(klon, nbsrf) |
266 |
SAVE fevap ! evaporation |
SAVE fevap ! evaporation |
270 |
REAL fqsurf(klon, nbsrf) |
REAL fqsurf(klon, nbsrf) |
271 |
SAVE fqsurf ! humidite de l'air au contact de la surface |
SAVE fqsurf ! humidite de l'air au contact de la surface |
272 |
|
|
273 |
REAL qsol(klon) |
REAL, save:: qsol(klon) ! hauteur d'eau dans le sol |
|
SAVE qsol ! hauteur d'eau dans le sol |
|
274 |
|
|
275 |
REAL fsnow(klon, nbsrf) |
REAL fsnow(klon, nbsrf) |
276 |
SAVE fsnow ! epaisseur neigeuse |
SAVE fsnow ! epaisseur neigeuse |
437 |
SAVE itaprad |
SAVE itaprad |
438 |
|
|
439 |
REAL conv_q(klon, llm) ! convergence de l'humidite (kg/kg/s) |
REAL conv_q(klon, llm) ! convergence de l'humidite (kg/kg/s) |
440 |
REAL conv_t(klon, llm) ! convergence de la temperature(K/s) |
REAL conv_t(klon, llm) ! convergence of temperature (K/s) |
441 |
|
|
442 |
REAL cldl(klon), cldm(klon), cldh(klon) !nuages bas, moyen et haut |
REAL cldl(klon), cldm(klon), cldh(klon) !nuages bas, moyen et haut |
443 |
REAL cldt(klon), cldq(klon) !nuage total, eau liquide integree |
REAL cldt(klon), cldq(klon) !nuage total, eau liquide integree |
462 |
|
|
463 |
!IM cf. AM Variables locales pour la CLA (hbtm2) |
!IM cf. AM Variables locales pour la CLA (hbtm2) |
464 |
|
|
465 |
REAL pblh(klon, nbsrf) ! Hauteur de couche limite |
REAL, SAVE:: pblh(klon, nbsrf) ! Hauteur de couche limite |
466 |
REAL plcl(klon, nbsrf) ! Niveau de condensation de la CLA |
REAL, SAVE:: plcl(klon, nbsrf) ! Niveau de condensation de la CLA |
467 |
REAL capCL(klon, nbsrf) ! CAPE de couche limite |
REAL, SAVE:: capCL(klon, nbsrf) ! CAPE de couche limite |
468 |
REAL oliqCL(klon, nbsrf) ! eau_liqu integree de couche limite |
REAL, SAVE:: oliqCL(klon, nbsrf) ! eau_liqu integree de couche limite |
469 |
REAL cteiCL(klon, nbsrf) ! cloud top instab. crit. couche limite |
REAL, SAVE:: cteiCL(klon, nbsrf) ! cloud top instab. crit. couche limite |
470 |
REAL pblt(klon, nbsrf) ! T a la Hauteur de couche limite |
REAL, SAVE:: pblt(klon, nbsrf) ! T a la Hauteur de couche limite |
471 |
REAL therm(klon, nbsrf) |
REAL, SAVE:: therm(klon, nbsrf) |
472 |
REAL trmb1(klon, nbsrf) ! deep_cape |
REAL, SAVE:: trmb1(klon, nbsrf) ! deep_cape |
473 |
REAL trmb2(klon, nbsrf) ! inhibition |
REAL, SAVE:: trmb2(klon, nbsrf) ! inhibition |
474 |
REAL trmb3(klon, nbsrf) ! Point Omega |
REAL, SAVE:: trmb3(klon, nbsrf) ! Point Omega |
475 |
! Grdeurs de sorties |
! Grdeurs de sorties |
476 |
REAL s_pblh(klon), s_lcl(klon), s_capCL(klon) |
REAL s_pblh(klon), s_lcl(klon), s_capCL(klon) |
477 |
REAL s_oliqCL(klon), s_cteiCL(klon), s_pblt(klon) |
REAL s_oliqCL(klon), s_cteiCL(klon), s_pblt(klon) |
551 |
|
|
552 |
logical ptconv(klon, llm) |
logical ptconv(klon, llm) |
553 |
|
|
554 |
! Variables locales pour effectuer les appels en serie |
! Variables locales pour effectuer les appels en série |
555 |
|
|
556 |
REAL t_seri(klon, llm), q_seri(klon, llm) |
REAL t_seri(klon, llm), q_seri(klon, llm) |
557 |
REAL ql_seri(klon, llm), qs_seri(klon, llm) |
REAL ql_seri(klon, llm), qs_seri(klon, llm) |
603 |
REAL ZRCPD |
REAL ZRCPD |
604 |
!-jld ec_conser |
!-jld ec_conser |
605 |
!IM: t2m, q2m, u10m, v10m |
!IM: t2m, q2m, u10m, v10m |
606 |
REAL t2m(klon, nbsrf), q2m(klon, nbsrf) !temperature, humidite a 2m |
REAL t2m(klon, nbsrf), q2m(klon, nbsrf) ! temperature and humidity at 2 m |
607 |
REAL u10m(klon, nbsrf), v10m(klon, nbsrf) !vents a 10m |
REAL u10m(klon, nbsrf), v10m(klon, nbsrf) !vents a 10m |
608 |
REAL zt2m(klon), zq2m(klon) !temp., hum. 2m moyenne s/ 1 maille |
REAL zt2m(klon), zq2m(klon) !temp., hum. 2m moyenne s/ 1 maille |
609 |
REAL zu10m(klon), zv10m(klon) !vents a 10m moyennes s/1 maille |
REAL zu10m(klon), zv10m(klon) !vents a 10m moyennes s/1 maille |
610 |
!jq Aerosol effects (Johannes Quaas, 27/11/2003) |
!jq Aerosol effects (Johannes Quaas, 27/11/2003) |
611 |
REAL sulfate(klon, llm) ! SO4 aerosol concentration [ug/m3] |
REAL sulfate(klon, llm) ! SO4 aerosol concentration [ug/m3] |
612 |
|
|
613 |
REAL sulfate_pi(klon, llm) |
REAL, save:: sulfate_pi(klon, llm) |
614 |
! (SO4 aerosol concentration [ug/m3] (pre-industrial value)) |
! (SO4 aerosol concentration, in ug/m3, pre-industrial value) |
|
SAVE sulfate_pi |
|
615 |
|
|
616 |
REAL cldtaupi(klon, llm) |
REAL cldtaupi(klon, llm) |
617 |
! (Cloud optical thickness for pre-industrial (pi) aerosols) |
! (Cloud optical thickness for pre-industrial (pi) aerosols) |
624 |
REAL cg_ae(klon, llm, 2) |
REAL cg_ae(klon, llm, 2) |
625 |
|
|
626 |
REAL topswad(klon), solswad(klon) ! Aerosol direct effect. |
REAL topswad(klon), solswad(klon) ! Aerosol direct effect. |
627 |
! ok_ade=T -ADE=topswad-topsw |
! ok_ade=True -ADE=topswad-topsw |
628 |
|
|
629 |
REAL topswai(klon), solswai(klon) ! Aerosol indirect effect. |
REAL topswai(klon), solswai(klon) ! Aerosol indirect effect. |
630 |
! ok_aie=T -> |
! ok_aie=True -> |
631 |
! ok_ade=T -AIE=topswai-topswad |
! ok_ade=True -AIE=topswai-topswad |
632 |
! ok_ade=F -AIE=topswai-topsw |
! ok_ade=F -AIE=topswai-topsw |
633 |
|
|
634 |
REAL aerindex(klon) ! POLDER aerosol index |
REAL aerindex(klon) ! POLDER aerosol index |
657 |
SAVE d_v_con |
SAVE d_v_con |
658 |
SAVE rnebcon0 |
SAVE rnebcon0 |
659 |
SAVE clwcon0 |
SAVE clwcon0 |
|
SAVE pblh |
|
|
SAVE plcl |
|
|
SAVE capCL |
|
|
SAVE oliqCL |
|
|
SAVE cteiCL |
|
|
SAVE pblt |
|
|
SAVE therm |
|
|
SAVE trmb1 |
|
|
SAVE trmb2 |
|
|
SAVE trmb3 |
|
660 |
|
|
661 |
real zmasse(klon, llm) |
real zmasse(klon, llm) |
662 |
! (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) |
732 |
itap = 0 |
itap = 0 |
733 |
itaprad = 0 |
itaprad = 0 |
734 |
CALL phyetat0("startphy.nc", pctsrf, ftsol, ftsoil, ocean, tslab, & |
CALL phyetat0("startphy.nc", pctsrf, ftsol, ftsoil, ocean, tslab, & |
735 |
seaice, fqsurf, qsol, fsnow, & |
seaice, fqsurf, qsol, fsnow, falbe, falblw, fevap, rain_fall, & |
736 |
falbe, falblw, fevap, rain_fall, snow_fall, solsw, sollwdown, & |
snow_fall, solsw, sollwdown, dlw, radsol, frugs, agesno, zmea, & |
737 |
dlw, radsol, frugs, agesno, & |
zstd, zsig, zgam, zthe, zpic, zval, t_ancien, q_ancien, & |
738 |
zmea, zstd, zsig, zgam, zthe, zpic, zval, & |
ancien_ok, rnebcon, ratqs, clwcon, run_off_lic_0) |
|
t_ancien, q_ancien, ancien_ok, rnebcon, ratqs, clwcon, & |
|
|
run_off_lic_0) |
|
739 |
|
|
740 |
! ATTENTION : il faudra a terme relire q2 dans l'etat initial |
! ATTENTION : il faudra a terme relire q2 dans l'etat initial |
741 |
q2=1.e-8 |
q2=1.e-8 |
742 |
|
|
743 |
radpas = NINT( 86400. / dtphys / nbapp_rad) |
radpas = NINT(86400. / dtphys / nbapp_rad) |
744 |
|
|
745 |
! on remet le calendrier a zero |
! on remet le calendrier a zero |
746 |
IF (raz_date) itau_phy = 0 |
IF (raz_date) itau_phy = 0 |
816 |
DO i = 1, klon |
DO i = 1, klon |
817 |
d_ps(i) = 0.0 |
d_ps(i) = 0.0 |
818 |
ENDDO |
ENDDO |
|
DO k = 1, llm |
|
|
DO i = 1, klon |
|
|
d_t(i, k) = 0.0 |
|
|
d_u(i, k) = 0.0 |
|
|
d_v(i, k) = 0.0 |
|
|
ENDDO |
|
|
ENDDO |
|
819 |
DO iq = 1, nqmx |
DO iq = 1, nqmx |
820 |
DO k = 1, llm |
DO k = 1, llm |
821 |
DO i = 1, klon |
DO i = 1, klon |
865 |
! Donc la somme de ces 2 variations devrait etre nulle. |
! Donc la somme de ces 2 variations devrait etre nulle. |
866 |
call diagphy(airephy, ztit, ip_ebil, zero_v, zero_v, zero_v, zero_v, & |
call diagphy(airephy, ztit, ip_ebil, zero_v, zero_v, zero_v, zero_v, & |
867 |
zero_v, zero_v, zero_v, zero_v, ztsol, d_h_vcol+d_h_vcol_phy, & |
zero_v, zero_v, zero_v, zero_v, ztsol, d_h_vcol+d_h_vcol_phy, & |
868 |
d_qt, 0., fs_bound, fq_bound ) |
d_qt, 0., fs_bound, fq_bound) |
869 |
END IF |
END IF |
870 |
|
|
871 |
! Diagnostiquer la tendance dynamique |
! Diagnostiquer la tendance dynamique |
|
|
|
872 |
IF (ancien_ok) THEN |
IF (ancien_ok) THEN |
873 |
DO k = 1, llm |
DO k = 1, llm |
874 |
DO i = 1, klon |
DO i = 1, klon |
875 |
d_t_dyn(i, k) = (t_seri(i, k)-t_ancien(i, k))/dtphys |
d_t_dyn(i, k) = (t_seri(i, k) - t_ancien(i, k)) / dtphys |
876 |
d_q_dyn(i, k) = (q_seri(i, k)-q_ancien(i, k))/dtphys |
d_q_dyn(i, k) = (q_seri(i, k) - q_ancien(i, k)) / dtphys |
877 |
ENDDO |
ENDDO |
878 |
ENDDO |
ENDDO |
879 |
ELSE |
ELSE |
887 |
ENDIF |
ENDIF |
888 |
|
|
889 |
! Ajouter le geopotentiel du sol: |
! Ajouter le geopotentiel du sol: |
|
|
|
890 |
DO k = 1, llm |
DO k = 1, llm |
891 |
DO i = 1, klon |
DO i = 1, klon |
892 |
zphi(i, k) = pphi(i, k) + pphis(i) |
zphi(i, k) = pphi(i, k) + pphis(i) |
893 |
ENDDO |
ENDDO |
894 |
ENDDO |
ENDDO |
895 |
|
|
896 |
! Verifier les temperatures |
! Check temperatures: |
|
|
|
897 |
CALL hgardfou(t_seri, ftsol) |
CALL hgardfou(t_seri, ftsol) |
898 |
|
|
899 |
! Incrementer le compteur de la physique |
! Incrementer le compteur de la physique |
|
|
|
900 |
itap = itap + 1 |
itap = itap + 1 |
901 |
julien = MOD(NINT(rdayvrai), 360) |
julien = MOD(NINT(rdayvrai), 360) |
902 |
if (julien == 0) julien = 360 |
if (julien == 0) julien = 360 |
904 |
forall (k = 1: llm) zmasse(:, k) = (paprs(:, k)-paprs(:, k+1)) / rg |
forall (k = 1: llm) zmasse(:, k) = (paprs(:, k)-paprs(:, k+1)) / rg |
905 |
|
|
906 |
! Mettre en action les conditions aux limites (albedo, sst, etc.). |
! Mettre en action les conditions aux limites (albedo, sst, etc.). |
|
! Prescrire l'ozone et calculer l'albedo sur l'ocean. |
|
907 |
|
|
908 |
|
! Prescrire l'ozone et calculer l'albedo sur l'ocean. |
909 |
if (nqmx >= 5) then |
if (nqmx >= 5) then |
910 |
wo = qx(:, :, 5) * zmasse / dobson_u / 1e3 |
wo = qx(:, :, 5) * zmasse / dobson_u / 1e3 |
911 |
else IF (MOD(itap - 1, lmt_pas) == 0) THEN |
else IF (MOD(itap - 1, lmt_pas) == 0) THEN |
935 |
d_ql, d_qs, d_ec) |
d_ql, d_qs, d_ec) |
936 |
call diagphy(airephy, ztit, ip_ebil, zero_v, zero_v, zero_v, zero_v, & |
call diagphy(airephy, ztit, ip_ebil, zero_v, zero_v, zero_v, zero_v, & |
937 |
zero_v, zero_v, zero_v, zero_v, ztsol, d_h_vcol, d_qt, d_ec, & |
zero_v, zero_v, zero_v, zero_v, ztsol, d_h_vcol, d_qt, d_ec, & |
938 |
fs_bound, fq_bound ) |
fs_bound, fq_bound) |
939 |
|
|
940 |
END IF |
END IF |
941 |
|
|
1011 |
DO k = 1, llm |
DO k = 1, llm |
1012 |
DO i = 1, klon |
DO i = 1, klon |
1013 |
zxfluxt(i, k) = zxfluxt(i, k) + & |
zxfluxt(i, k) = zxfluxt(i, k) + & |
1014 |
fluxt(i, k, nsrf) * pctsrf( i, nsrf) |
fluxt(i, k, nsrf) * pctsrf(i, nsrf) |
1015 |
zxfluxq(i, k) = zxfluxq(i, k) + & |
zxfluxq(i, k) = zxfluxq(i, k) + & |
1016 |
fluxq(i, k, nsrf) * pctsrf( i, nsrf) |
fluxq(i, k, nsrf) * pctsrf(i, nsrf) |
1017 |
zxfluxu(i, k) = zxfluxu(i, k) + & |
zxfluxu(i, k) = zxfluxu(i, k) + & |
1018 |
fluxu(i, k, nsrf) * pctsrf( i, nsrf) |
fluxu(i, k, nsrf) * pctsrf(i, nsrf) |
1019 |
zxfluxv(i, k) = zxfluxv(i, k) + & |
zxfluxv(i, k) = zxfluxv(i, k) + & |
1020 |
fluxv(i, k, nsrf) * pctsrf( i, nsrf) |
fluxv(i, k, nsrf) * pctsrf(i, nsrf) |
1021 |
END DO |
END DO |
1022 |
END DO |
END DO |
1023 |
END DO |
END DO |
1043 |
d_ql, d_qs, d_ec) |
d_ql, d_qs, d_ec) |
1044 |
call diagphy(airephy, ztit, ip_ebil, zero_v, zero_v, zero_v, zero_v, & |
call diagphy(airephy, ztit, ip_ebil, zero_v, zero_v, zero_v, zero_v, & |
1045 |
sens, evap, zero_v, zero_v, ztsol, d_h_vcol, d_qt, d_ec, & |
sens, evap, zero_v, zero_v, ztsol, d_h_vcol, d_qt, d_ec, & |
1046 |
fs_bound, fq_bound ) |
fs_bound, fq_bound) |
1047 |
END IF |
END IF |
1048 |
|
|
1049 |
! Incrementer la temperature du sol |
! Update surface temperature: |
1050 |
|
|
1051 |
DO i = 1, klon |
DO i = 1, klon |
1052 |
zxtsol(i) = 0.0 |
zxtsol(i) = 0.0 |
1070 |
s_trmb2(i) = 0.0 |
s_trmb2(i) = 0.0 |
1071 |
s_trmb3(i) = 0.0 |
s_trmb3(i) = 0.0 |
1072 |
|
|
1073 |
IF ( abs( pctsrf(i, is_ter) + pctsrf(i, is_lic) + & |
IF (abs(pctsrf(i, is_ter) + pctsrf(i, is_lic) + & |
1074 |
pctsrf(i, is_oce) + pctsrf(i, is_sic) - 1.) .GT. EPSFRA) & |
pctsrf(i, is_oce) + pctsrf(i, is_sic) - 1.) .GT. EPSFRA) & |
1075 |
THEN |
THEN |
1076 |
WRITE(*, *) 'physiq : pb sous surface au point ', i, & |
WRITE(*, *) 'physiq : pb sous surface au point ', i, & |
1262 |
d_ql, d_qs, d_ec) |
d_ql, d_qs, d_ec) |
1263 |
call diagphy(airephy, ztit, ip_ebil, zero_v, zero_v, zero_v, zero_v, & |
call diagphy(airephy, ztit, ip_ebil, zero_v, zero_v, zero_v, zero_v, & |
1264 |
zero_v, zero_v, rain_con, snow_con, ztsol, d_h_vcol, d_qt, d_ec, & |
zero_v, zero_v, rain_con, snow_con, ztsol, d_h_vcol, d_qt, d_ec, & |
1265 |
fs_bound, fq_bound ) |
fs_bound, fq_bound) |
1266 |
END IF |
END IF |
1267 |
|
|
1268 |
IF (check) THEN |
IF (check) THEN |
1411 |
d_ql, d_qs, d_ec) |
d_ql, d_qs, d_ec) |
1412 |
call diagphy(airephy, ztit, ip_ebil, zero_v, zero_v, zero_v, zero_v, & |
call diagphy(airephy, ztit, ip_ebil, zero_v, zero_v, zero_v, zero_v, & |
1413 |
zero_v, zero_v, rain_lsc, snow_lsc, ztsol, d_h_vcol, d_qt, d_ec, & |
zero_v, zero_v, rain_lsc, snow_lsc, ztsol, d_h_vcol, d_qt, d_ec, & |
1414 |
fs_bound, fq_bound ) |
fs_bound, fq_bound) |
1415 |
END IF |
END IF |
1416 |
|
|
1417 |
! PRESCRIPTION DES NUAGES POUR LE RAYONNEMENT |
! PRESCRIPTION DES NUAGES POUR LE RAYONNEMENT |
1446 |
ENDIF |
ENDIF |
1447 |
ENDDO |
ENDDO |
1448 |
ENDDO |
ENDDO |
|
|
|
1449 |
ELSE IF (iflag_cldcon == 3) THEN |
ELSE IF (iflag_cldcon == 3) THEN |
1450 |
! On prend pour les nuages convectifs le max du calcul de la |
! On prend pour les nuages convectifs le max du calcul de la |
1451 |
! convection et du calcul du pas de temps précédent diminué d'un facteur |
! convection et du calcul du pas de temps précédent diminué d'un facteur |
1465 |
! On prend la somme des fractions nuageuses et des contenus en eau |
! On prend la somme des fractions nuageuses et des contenus en eau |
1466 |
cldfra=min(max(cldfra, rnebcon), 1.) |
cldfra=min(max(cldfra, rnebcon), 1.) |
1467 |
cldliq=cldliq+rnebcon*clwcon |
cldliq=cldliq+rnebcon*clwcon |
|
|
|
1468 |
ENDIF |
ENDIF |
1469 |
|
|
1470 |
! 2. NUAGES STARTIFORMES |
! 2. NUAGES STARTIFORMES |
1596 |
d_ql, d_qs, d_ec) |
d_ql, d_qs, d_ec) |
1597 |
call diagphy(airephy, ztit, ip_ebil, topsw, toplw, solsw, sollw, & |
call diagphy(airephy, ztit, ip_ebil, topsw, toplw, solsw, sollw, & |
1598 |
zero_v, zero_v, zero_v, zero_v, ztsol, d_h_vcol, d_qt, d_ec, & |
zero_v, zero_v, zero_v, zero_v, ztsol, d_h_vcol, d_qt, d_ec, & |
1599 |
fs_bound, fq_bound ) |
fs_bound, fq_bound) |
1600 |
END IF |
END IF |
1601 |
|
|
1602 |
! Calculer l'hydrologie de la surface |
! Calculer l'hydrologie de la surface |
|
|
|
1603 |
DO i = 1, klon |
DO i = 1, klon |
1604 |
zxqsurf(i) = 0.0 |
zxqsurf(i) = 0.0 |
1605 |
zxsnow(i) = 0.0 |
zxsnow(i) = 0.0 |
1651 |
ENDIF |
ENDIF |
1652 |
|
|
1653 |
IF (ok_orolf) THEN |
IF (ok_orolf) THEN |
|
|
|
1654 |
! selection des points pour lesquels le shema est actif: |
! selection des points pour lesquels le shema est actif: |
1655 |
igwd=0 |
igwd=0 |
1656 |
DO i=1, klon |
DO i=1, klon |
1674 |
v_seri(i, k) = v_seri(i, k) + d_v_lif(i, k) |
v_seri(i, k) = v_seri(i, k) + d_v_lif(i, k) |
1675 |
ENDDO |
ENDDO |
1676 |
ENDDO |
ENDDO |
1677 |
|
ENDIF |
|
ENDIF ! fin de test sur ok_orolf |
|
1678 |
|
|
1679 |
! STRESS NECESSAIRES: TOUTE LA PHYSIQUE |
! STRESS NECESSAIRES: TOUTE LA PHYSIQUE |
1680 |
|
|
1749 |
! Donc la somme de ces 2 variations devrait etre nulle. |
! Donc la somme de ces 2 variations devrait etre nulle. |
1750 |
call diagphy(airephy, ztit, ip_ebil, topsw, toplw, solsw, sollw, sens, & |
call diagphy(airephy, ztit, ip_ebil, topsw, toplw, solsw, sollw, sens, & |
1751 |
evap, rain_fall, snow_fall, ztsol, d_h_vcol, d_qt, d_ec, & |
evap, rain_fall, snow_fall, ztsol, d_h_vcol, d_qt, d_ec, & |
1752 |
fs_bound, fq_bound ) |
fs_bound, fq_bound) |
1753 |
|
|
1754 |
d_h_vcol_phy=d_h_vcol |
d_h_vcol_phy=d_h_vcol |
1755 |
|
|
1769 |
|
|
1770 |
DO k = 1, llm |
DO k = 1, llm |
1771 |
DO i = 1, klon |
DO i = 1, klon |
1772 |
d_u(i, k) = ( u_seri(i, k) - u(i, k) ) / dtphys |
d_u(i, k) = (u_seri(i, k) - u(i, k)) / dtphys |
1773 |
d_v(i, k) = ( v_seri(i, k) - v(i, k) ) / dtphys |
d_v(i, k) = (v_seri(i, k) - v(i, k)) / dtphys |
1774 |
d_t(i, k) = ( t_seri(i, k)-t(i, k) ) / dtphys |
d_t(i, k) = (t_seri(i, k) - t(i, k)) / dtphys |
1775 |
d_qx(i, k, ivap) = ( q_seri(i, k) - qx(i, k, ivap) ) / dtphys |
d_qx(i, k, ivap) = (q_seri(i, k) - qx(i, k, ivap)) / dtphys |
1776 |
d_qx(i, k, iliq) = ( ql_seri(i, k) - qx(i, k, iliq) ) / dtphys |
d_qx(i, k, iliq) = (ql_seri(i, k) - qx(i, k, iliq)) / dtphys |
1777 |
ENDDO |
ENDDO |
1778 |
ENDDO |
ENDDO |
1779 |
|
|
1803 |
! Si c'est la fin, il faut conserver l'etat de redemarrage |
! Si c'est la fin, il faut conserver l'etat de redemarrage |
1804 |
IF (lafin) THEN |
IF (lafin) THEN |
1805 |
itau_phy = itau_phy + itap |
itau_phy = itau_phy + itap |
1806 |
CALL phyredem("restartphy.nc", rlat, rlon, pctsrf, ftsol, & |
CALL phyredem("restartphy.nc", rlat, rlon, pctsrf, ftsol, ftsoil, & |
1807 |
ftsoil, tslab, seaice, fqsurf, qsol, & |
tslab, seaice, fqsurf, qsol, fsnow, falbe, falblw, fevap, & |
1808 |
fsnow, falbe, falblw, fevap, rain_fall, snow_fall, & |
rain_fall, snow_fall, solsw, sollwdown, dlw, radsol, frugs, & |
1809 |
solsw, sollwdown, dlw, & |
agesno, zmea, zstd, zsig, zgam, zthe, zpic, zval, t_ancien, & |
1810 |
radsol, frugs, agesno, & |
q_ancien, rnebcon, ratqs, clwcon, run_off_lic_0) |
|
zmea, zstd, zsig, zgam, zthe, zpic, zval, & |
|
|
t_ancien, q_ancien, rnebcon, ratqs, clwcon, run_off_lic_0) |
|
1811 |
ENDIF |
ENDIF |
1812 |
|
|
1813 |
firstcal = .FALSE. |
firstcal = .FALSE. |
1965 |
|
|
1966 |
DO nsrf = 1, nbsrf |
DO nsrf = 1, nbsrf |
1967 |
!XXX |
!XXX |
1968 |
zx_tmp_fi2d(1 : klon) = pctsrf( 1 : klon, nsrf)*100. |
zx_tmp_fi2d(1 : klon) = pctsrf(1 : klon, nsrf)*100. |
1969 |
CALL gr_fi_ecrit(1, klon, iim, (jjm + 1), zx_tmp_fi2d, zx_tmp_2d) |
CALL gr_fi_ecrit(1, klon, iim, (jjm + 1), zx_tmp_fi2d, zx_tmp_2d) |
1970 |
CALL histwrite(nid_ins, "pourc_"//clnsurf(nsrf), itau_w, & |
CALL histwrite(nid_ins, "pourc_"//clnsurf(nsrf), itau_w, & |
1971 |
zx_tmp_2d) |
zx_tmp_2d) |
1972 |
|
|
1973 |
zx_tmp_fi2d(1 : klon) = pctsrf( 1 : klon, nsrf) |
zx_tmp_fi2d(1 : klon) = pctsrf(1 : klon, nsrf) |
1974 |
CALL gr_fi_ecrit(1, klon, iim, (jjm + 1), zx_tmp_fi2d, zx_tmp_2d) |
CALL gr_fi_ecrit(1, klon, iim, (jjm + 1), zx_tmp_fi2d, zx_tmp_2d) |
1975 |
CALL histwrite(nid_ins, "fract_"//clnsurf(nsrf), itau_w, & |
CALL histwrite(nid_ins, "fract_"//clnsurf(nsrf), itau_w, & |
1976 |
zx_tmp_2d) |
zx_tmp_2d) |
1977 |
|
|
1978 |
zx_tmp_fi2d(1 : klon) = fluxt( 1 : klon, 1, nsrf) |
zx_tmp_fi2d(1 : klon) = fluxt(1 : klon, 1, nsrf) |
1979 |
CALL gr_fi_ecrit(1, klon, iim, (jjm + 1), zx_tmp_fi2d, zx_tmp_2d) |
CALL gr_fi_ecrit(1, klon, iim, (jjm + 1), zx_tmp_fi2d, zx_tmp_2d) |
1980 |
CALL histwrite(nid_ins, "sens_"//clnsurf(nsrf), itau_w, & |
CALL histwrite(nid_ins, "sens_"//clnsurf(nsrf), itau_w, & |
1981 |
zx_tmp_2d) |
zx_tmp_2d) |
1982 |
|
|
1983 |
zx_tmp_fi2d(1 : klon) = fluxlat( 1 : klon, nsrf) |
zx_tmp_fi2d(1 : klon) = fluxlat(1 : klon, nsrf) |
1984 |
CALL gr_fi_ecrit(1, klon, iim, (jjm + 1), zx_tmp_fi2d, zx_tmp_2d) |
CALL gr_fi_ecrit(1, klon, iim, (jjm + 1), zx_tmp_fi2d, zx_tmp_2d) |
1985 |
CALL histwrite(nid_ins, "lat_"//clnsurf(nsrf), itau_w, & |
CALL histwrite(nid_ins, "lat_"//clnsurf(nsrf), itau_w, & |
1986 |
zx_tmp_2d) |
zx_tmp_2d) |
1987 |
|
|
1988 |
zx_tmp_fi2d(1 : klon) = ftsol( 1 : klon, nsrf) |
zx_tmp_fi2d(1 : klon) = ftsol(1 : klon, nsrf) |
1989 |
CALL gr_fi_ecrit(1, klon, iim, (jjm + 1), zx_tmp_fi2d, zx_tmp_2d) |
CALL gr_fi_ecrit(1, klon, iim, (jjm + 1), zx_tmp_fi2d, zx_tmp_2d) |
1990 |
CALL histwrite(nid_ins, "tsol_"//clnsurf(nsrf), itau_w, & |
CALL histwrite(nid_ins, "tsol_"//clnsurf(nsrf), itau_w, & |
1991 |
zx_tmp_2d) |
zx_tmp_2d) |
1992 |
|
|
1993 |
zx_tmp_fi2d(1 : klon) = fluxu( 1 : klon, 1, nsrf) |
zx_tmp_fi2d(1 : klon) = fluxu(1 : klon, 1, nsrf) |
1994 |
CALL gr_fi_ecrit(1, klon, iim, (jjm + 1), zx_tmp_fi2d, zx_tmp_2d) |
CALL gr_fi_ecrit(1, klon, iim, (jjm + 1), zx_tmp_fi2d, zx_tmp_2d) |
1995 |
CALL histwrite(nid_ins, "taux_"//clnsurf(nsrf), itau_w, & |
CALL histwrite(nid_ins, "taux_"//clnsurf(nsrf), itau_w, & |
1996 |
zx_tmp_2d) |
zx_tmp_2d) |
1997 |
|
|
1998 |
zx_tmp_fi2d(1 : klon) = fluxv( 1 : klon, 1, nsrf) |
zx_tmp_fi2d(1 : klon) = fluxv(1 : klon, 1, nsrf) |
1999 |
CALL gr_fi_ecrit(1, klon, iim, (jjm + 1), zx_tmp_fi2d, zx_tmp_2d) |
CALL gr_fi_ecrit(1, klon, iim, (jjm + 1), zx_tmp_fi2d, zx_tmp_2d) |
2000 |
CALL histwrite(nid_ins, "tauy_"//clnsurf(nsrf), itau_w, & |
CALL histwrite(nid_ins, "tauy_"//clnsurf(nsrf), itau_w, & |
2001 |
zx_tmp_2d) |
zx_tmp_2d) |
2002 |
|
|
2003 |
zx_tmp_fi2d(1 : klon) = frugs( 1 : klon, nsrf) |
zx_tmp_fi2d(1 : klon) = frugs(1 : klon, nsrf) |
2004 |
CALL gr_fi_ecrit(1, klon, iim, (jjm + 1), zx_tmp_fi2d, zx_tmp_2d) |
CALL gr_fi_ecrit(1, klon, iim, (jjm + 1), zx_tmp_fi2d, zx_tmp_2d) |
2005 |
CALL histwrite(nid_ins, "rugs_"//clnsurf(nsrf), itau_w, & |
CALL histwrite(nid_ins, "rugs_"//clnsurf(nsrf), itau_w, & |
2006 |
zx_tmp_2d) |
zx_tmp_2d) |
2007 |
|
|
2008 |
zx_tmp_fi2d(1 : klon) = falbe( 1 : klon, nsrf) |
zx_tmp_fi2d(1 : klon) = falbe(1 : klon, nsrf) |
2009 |
CALL gr_fi_ecrit(1, klon, iim, (jjm + 1), zx_tmp_fi2d, zx_tmp_2d) |
CALL gr_fi_ecrit(1, klon, iim, (jjm + 1), zx_tmp_fi2d, zx_tmp_2d) |
2010 |
CALL histwrite(nid_ins, "albe_"//clnsurf(nsrf), itau_w, & |
CALL histwrite(nid_ins, "albe_"//clnsurf(nsrf), itau_w, & |
2011 |
zx_tmp_2d) |
zx_tmp_2d) |