--- trunk/libf/phylmd/physiq.f90 2010/04/06 17:52:58 32 +++ trunk/libf/phylmd/physiq.f90 2011/02/22 13:49:36 40 @@ -9,11 +9,11 @@ contains - SUBROUTINE physiq(nq, firstcal, lafin, rdayvrai, gmtime, pdtphys, paprs, & + SUBROUTINE physiq(lafin, rdayvrai, gmtime, pdtphys, paprs, & pplay, pphi, pphis, u, v, t, qx, omega, d_u, d_v, & d_t, d_qx, d_ps, dudyn, PVteta) - ! From phylmd/physiq.F, v 1.22 2006/02/20 09:38:28 + ! From phylmd/physiq.F, version 1.22 2006/02/20 09:38:28 ! Author : Z.X. Li (LMD/CNRS), date: 1993/08/18 @@ -31,11 +31,12 @@ ok_kzmin use clesphys2, only: iflag_con, ok_orolf, ok_orodr, nbapp_rad, & cycle_diurne, new_oliq, soil_model + use clmain_m, only: clmain use comgeomphy use conf_gcm_m, only: raz_date, offline use conf_phys_m, only: conf_phys use ctherm - use dimens_m, only: jjm, iim, llm + use dimens_m, only: jjm, iim, llm, nqmx use dimphy, only: klon, nbtr use dimsoil, only: nsoilmx use hgardfou_m, only: hgardfou @@ -43,7 +44,9 @@ USE histwrite_m, only: histwrite use indicesol, only: nbsrf, is_ter, is_lic, is_sic, is_oce, & clnsurf, epsfra - use ini_hist, only: ini_histhf, ini_histday, ini_histins + use ini_histhf_m, only: ini_histhf + use ini_histday_m, only: ini_histday + use ini_histins_m, only: ini_histins use iniprint, only: prt_level use oasis_m use orbite_m, only: orbite, zenang @@ -56,22 +59,19 @@ use radepsi use radopt use temps, only: itau_phy, day_ref, annee_ref - use yoethf - use YOMCST, only: rcpd, rtt, rlvtt, rg, ra, rsigma, retv, romega + 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 ! Variables argument: - INTEGER, intent(in):: nq ! nombre de traceurs (y compris vapeur d'eau) - REAL, intent(in):: rdayvrai ! (elapsed time since January 1st 0h of the starting year, in days) REAL, intent(in):: gmtime ! heure de la journée en fraction de jour REAL, intent(in):: pdtphys ! pas d'integration pour la physique (seconde) - LOGICAL, intent(in):: firstcal ! first call to "calfis" logical, intent(in):: lafin ! dernier passage REAL, intent(in):: paprs(klon, llm+1) @@ -86,19 +86,21 @@ REAL pphis(klon) ! input geopotentiel du sol REAL u(klon, llm) ! input vitesse dans la direction X (de O a E) en m/s - REAL v(klon, llm) ! input vitesse Y (de S a N) en m/s + REAL, intent(in):: v(klon, llm) ! vitesse Y (de S a N) en m/s REAL t(klon, llm) ! input temperature (K) - REAL, intent(in):: qx(klon, llm, nq) - ! (humidite specifique (kg/kg) et fractions massiques des autres traceurs) + REAL, intent(in):: qx(klon, llm, nqmx) + ! (humidité spécifique et fractions massiques des autres traceurs) REAL omega(klon, llm) ! input vitesse verticale en Pa/s REAL d_u(klon, llm) ! output tendance physique de "u" (m/s/s) REAL d_v(klon, llm) ! output tendance physique de "v" (m/s/s) REAL d_t(klon, llm) ! output tendance physique de "t" (K/s) - REAL d_qx(klon, llm, nq) ! output tendance physique de "qx" (kg/kg/s) + REAL d_qx(klon, llm, nqmx) ! output tendance physique de "qx" (kg/kg/s) REAL d_ps(klon) ! output tendance physique de la pression au sol + LOGICAL:: firstcal = .true. + INTEGER nbteta PARAMETER(nbteta=3) @@ -403,7 +405,6 @@ EXTERNAL alboc ! calculer l'albedo sur ocean EXTERNAL ajsec ! ajustement sec - EXTERNAL clmain ! couche limite !KE43 EXTERNAL conema3 ! convect4.3 EXTERNAL fisrtilp ! schema de condensation a grande echelle (pluie) @@ -701,7 +702,7 @@ END DO END IF ok_sync=.TRUE. - IF (nq < 2) THEN + IF (nqmx < 2) THEN abort_message = 'eaux vapeur et liquide sont indispensables' CALL abort_gcm(modname, abort_message, 1) ENDIF @@ -835,7 +836,7 @@ ! Initialisation des sorties call ini_histhf(pdtphys, nid_hf, nid_hf3d) - call ini_histday(pdtphys, ok_journe, nid_day, nq) + call ini_histday(pdtphys, ok_journe, nid_day, nqmx) call ini_histins(pdtphys, ok_instan, nid_ins) CALL ymds2ju(annee_ref, 1, int(day_ref), 0., date0) !XXXPB Positionner date0 pour initialisation de ORCHIDEE @@ -854,7 +855,7 @@ d_v(i, k) = 0.0 ENDDO ENDDO - DO iq = 1, nq + DO iq = 1, nqmx DO k = 1, llm DO i = 1, klon d_qx(i, k, iq) = 0.0 @@ -877,8 +878,8 @@ qs_seri(i, k) = 0. ENDDO ENDDO - IF (nq >= 3) THEN - tr_seri(:, :, :nq-2) = qx(:, :, 3:nq) + IF (nqmx >= 3) THEN + tr_seri(:, :, :nqmx-2) = qx(:, :, 3:nqmx) ELSE tr_seri(:, :, 1) = 0. ENDIF @@ -950,7 +951,7 @@ ! Mettre en action les conditions aux limites (albedo, sst, etc.). ! Prescrire l'ozone et calculer l'albedo sur l'ocean. - if (nq >= 5) then + if (nqmx >= 5) then wo = qx(:, :, 5) * zmasse / dobson_u / 1e3 else IF (MOD(itap - 1, lmt_pas) == 0) THEN wo = ozonecm(REAL(julien), paprs) @@ -1034,27 +1035,20 @@ fder = dlw - CALL clmain(pdtphys, itap, date0, pctsrf, pctsrf_new, & - t_seri, q_seri, u_seri, v_seri, & - julien, rmu0, co2_ppm, & - ok_veget, ocean, npas, nexca, ftsol, & - soil_model, cdmmax, cdhmax, & - ksta, ksta_ter, ok_kzmin, ftsoil, qsol, & - paprs, pplay, fsnow, fqsurf, fevap, falbe, falblw, & - fluxlat, rain_fall, snow_fall, & - fsolsw, fsollw, sollwdown, fder, & - rlon, rlat, cuphy, cvphy, frugs, & - firstcal, lafin, agesno, rugoro, & - d_t_vdf, d_q_vdf, d_u_vdf, d_v_vdf, d_ts, & - fluxt, fluxq, fluxu, fluxv, cdragh, cdragm, & - q2, dsens, devap, & - ycoefh, yu1, yv1, t2m, q2m, u10m, v10m, & - pblh, capCL, oliqCL, cteiCL, pblT, & - therm, trmb1, trmb2, trmb3, plcl, & - fqcalving, ffonte, run_off_lic_0, & - fluxo, fluxg, tslab, seaice) + ! Couche limite: - !XXX Incrementation des flux + CALL clmain(pdtphys, itap, date0, pctsrf, pctsrf_new, t_seri, q_seri, & + u_seri, v_seri, julien, rmu0, co2_ppm, ok_veget, ocean, npas, nexca, & + ftsol, soil_model, cdmmax, cdhmax, ksta, ksta_ter, ok_kzmin, ftsoil, & + qsol, paprs, pplay, fsnow, fqsurf, fevap, falbe, falblw, fluxlat, & + rain_fall, snow_fall, fsolsw, fsollw, sollwdown, fder, rlon, rlat, & + cuphy, cvphy, frugs, firstcal, lafin, agesno, rugoro, d_t_vdf, & + d_q_vdf, d_u_vdf, d_v_vdf, d_ts, fluxt, fluxq, fluxu, fluxv, cdragh, & + cdragm, q2, dsens, devap, ycoefh, yu1, yv1, t2m, q2m, u10m, v10m, & + pblh, capCL, oliqCL, cteiCL, pblT, therm, trmb1, trmb2, trmb3, plcl, & + fqcalving, ffonte, run_off_lic_0, fluxo, fluxg, tslab, seaice) + + ! Incrémentation des flux zxfluxt=0. zxfluxq=0. @@ -1801,12 +1795,12 @@ END IF ! Calcul des tendances traceurs - call phytrac(rnpb, itap, lmt_pas, julien, gmtime, firstcal, lafin, nq-2, & - pdtphys, u, v, t, paprs, pplay, pmfu, pmfd, pen_u, pde_u, pen_d, & - pde_d, ycoefh, fm_therm, entr_therm, yu1, yv1, ftsol, pctsrf, & - frac_impa, frac_nucl, pphis, pphi, albsol, rhcl, cldfra, & - rneb, diafra, cldliq, itop_con, ibas_con, pmflxr, pmflxs, prfl, & - psfl, da, phi, mp, upwd, dnwd, tr_seri, zmasse) + call phytrac(rnpb, itap, lmt_pas, julien, gmtime, firstcal, lafin, & + nqmx-2, pdtphys, u, t, paprs, pplay, pmfu, pmfd, pen_u, pde_u, & + pen_d, pde_d, ycoefh, fm_therm, entr_therm, yu1, yv1, ftsol, pctsrf, & + frac_impa, frac_nucl, pphis, pphi, albsol, rhcl, cldfra, rneb, & + diafra, cldliq, pmflxr, pmflxs, prfl, psfl, da, phi, mp, upwd, dnwd, & + tr_seri, zmasse) IF (offline) THEN call phystokenc(pdtphys, rlon, rlat, t, pmfu, pmfd, pen_u, pde_u, & @@ -1878,8 +1872,8 @@ ENDDO ENDDO - IF (nq >= 3) THEN - DO iq = 3, nq + IF (nqmx >= 3) THEN + DO iq = 3, nqmx DO k = 1, llm DO i = 1, klon d_qx(i, k, iq) = (tr_seri(i, k, iq-2) - qx(i, k, iq)) / pdtphys @@ -1913,6 +1907,8 @@ t_ancien, q_ancien, rnebcon, ratqs, clwcon, run_off_lic_0) ENDIF + firstcal = .FALSE. + contains subroutine write_histday @@ -1924,7 +1920,7 @@ if (ok_journe) THEN itau_w = itau_phy + itap - if (nq <= 4) then + if (nqmx <= 4) then call histwrite(nid_day, "Sigma_O3_Royer", itau_w, & gr_phy_write_3d(wo) * 1e3) ! (convert "wo" from kDU to DU)