--- trunk/libf/phylmd/physiq.f90 2008/08/01 15:24:12 15 +++ 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, & - pplay, pphi, pphis, presnivs, u, v, t, qx, omega, d_u, d_v, & + 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 @@ -23,50 +23,55 @@ !AA - stockage des moyennes des champs necessaires !AA en mode traceur off-line - USE ioipsl, only: ymds2ju, histwrite, histsync - use dimens_m, only: jjm, iim, llm - use indicesol, only: nbsrf, is_ter, is_lic, is_sic, is_oce, & - clnsurf, epsfra - use dimphy, only: klon, nbtr - use conf_gcm_m, only: raz_date, offline, iphysiq - use dimsoil, only: nsoilmx - use temps, only: itau_phy, day_ref, annee_ref, itaufin + use abort_gcm_m, only: abort_gcm + USE calendar, only: ymds2ju use clesphys, only: ecrit_hf, ecrit_ins, ecrit_mth, & cdmmax, cdhmax, & co2_ppm, ecrit_reg, ecrit_tra, ksta, ksta_ter, & ok_kzmin use clesphys2, only: iflag_con, ok_orolf, ok_orodr, nbapp_rad, & cycle_diurne, new_oliq, soil_model - use iniprint, only: prt_level - use abort_gcm_m, only: abort_gcm - use YOMCST, only: rcpd, rtt, rlvtt, rg, ra, rsigma, retv, romega + 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 phytrac_m, only: phytrac + use dimens_m, only: jjm, iim, llm, nqmx + use dimphy, only: klon, nbtr + use dimsoil, only: nsoilmx + use hgardfou_m, only: hgardfou + USE histcom, only: histsync + USE histwrite_m, only: histwrite + use indicesol, only: nbsrf, is_ter, is_lic, is_sic, is_oce, & + clnsurf, epsfra + 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 radepsi - use radopt - use yoethf - use ini_hist, only: ini_histhf, ini_histday, ini_histins use orbite_m, only: orbite, zenang + use ozonecm_m, only: ozonecm use phyetat0_m, only: phyetat0, rlat, rlon - use hgardfou_m, only: hgardfou - use conf_phys_m, only: conf_phys use phyredem_m, only: phyredem + use phystokenc_m, only: phystokenc + use phytrac_m, only: phytrac + use qcheck_m, only: qcheck + use radepsi + use radopt + use temps, only: itau_phy, day_ref, annee_ref + 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 nq ! input 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) @@ -80,23 +85,22 @@ REAL pphis(klon) ! input geopotentiel du sol - REAL presnivs(llm) - ! (input pressions approximat. des milieux couches ( en PA)) - 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) @@ -133,10 +137,8 @@ REAL fluxg(klon) !flux turbulents ocean-atmosphere ! Modele thermique du sol, a activer pour le cycle diurne: - logical ok_veget - save ok_veget - LOGICAL ok_journe ! sortir le fichier journalier - save ok_journe + logical, save:: ok_veget + LOGICAL, save:: ok_journe ! sortir le fichier journalier LOGICAL ok_mensuel ! sortir le fichier mensuel @@ -183,18 +185,10 @@ REAL swup0(klon, klevp1), swup(klon, klevp1) SAVE swdn0, swdn, swup0, swup - REAL SWdn200clr(klon), SWdn200(klon) - REAL SWup200clr(klon), SWup200(klon) - SAVE SWdn200clr, SWdn200, SWup200clr, SWup200 - REAL lwdn0(klon, klevp1), lwdn(klon, klevp1) REAL lwup0(klon, klevp1), lwup(klon, klevp1) SAVE lwdn0, lwdn, lwup0, lwup - REAL LWdn200clr(klon), LWdn200(klon) - REAL LWup200clr(klon), LWup200(klon) - SAVE LWdn200clr, LWdn200, LWup200clr, LWup200 - !IM Amip2 ! variables a une pression donnee @@ -209,57 +203,6 @@ '500 ', '400 ', '300 ', '250 ', '200 ', '150 ', '100 ', & '70 ', '50 ', '30 ', '20 ', '10 '/ - real tlevSTD(klon, nlevSTD), qlevSTD(klon, nlevSTD) - real rhlevSTD(klon, nlevSTD), philevSTD(klon, nlevSTD) - real ulevSTD(klon, nlevSTD), vlevSTD(klon, nlevSTD) - real wlevSTD(klon, nlevSTD) - - ! nout : niveau de output des variables a une pression donnee - INTEGER nout - PARAMETER(nout=3) !nout=1 : day; =2 : mth; =3 : NMC - - REAL tsumSTD(klon, nlevSTD, nout) - REAL usumSTD(klon, nlevSTD, nout), vsumSTD(klon, nlevSTD, nout) - REAL wsumSTD(klon, nlevSTD, nout), phisumSTD(klon, nlevSTD, nout) - REAL qsumSTD(klon, nlevSTD, nout), rhsumSTD(klon, nlevSTD, nout) - - SAVE tsumSTD, usumSTD, vsumSTD, wsumSTD, phisumSTD, & - qsumSTD, rhsumSTD - - logical oknondef(klon, nlevSTD, nout) - real tnondef(klon, nlevSTD, nout) - save tnondef - - ! les produits uvSTD, vqSTD, .., T2STD sont calcules - ! a partir des valeurs instantannees toutes les 6 h - ! qui sont moyennees sur le mois - - real uvSTD(klon, nlevSTD) - real vqSTD(klon, nlevSTD) - real vTSTD(klon, nlevSTD) - real wqSTD(klon, nlevSTD) - - real uvsumSTD(klon, nlevSTD, nout) - real vqsumSTD(klon, nlevSTD, nout) - real vTsumSTD(klon, nlevSTD, nout) - real wqsumSTD(klon, nlevSTD, nout) - - real vphiSTD(klon, nlevSTD) - real wTSTD(klon, nlevSTD) - real u2STD(klon, nlevSTD) - real v2STD(klon, nlevSTD) - real T2STD(klon, nlevSTD) - - real vphisumSTD(klon, nlevSTD, nout) - real wTsumSTD(klon, nlevSTD, nout) - real u2sumSTD(klon, nlevSTD, nout) - real v2sumSTD(klon, nlevSTD, nout) - real T2sumSTD(klon, nlevSTD, nout) - - SAVE uvsumSTD, vqsumSTD, vTsumSTD, wqsumSTD - SAVE vphisumSTD, wTsumSTD, u2sumSTD, v2sumSTD, T2sumSTD - !MI Amip2 - ! prw: precipitable water real prw(klon) @@ -268,7 +211,7 @@ REAL flwp(klon), fiwp(klon) REAL flwc(klon, llm), fiwc(klon, llm) - INTEGER l, kmax, lmax + INTEGER kmax, lmax PARAMETER(kmax=8, lmax=8) INTEGER kmaxm1, lmaxm1 PARAMETER(kmaxm1=kmax-1, lmaxm1=lmax-1) @@ -320,9 +263,6 @@ integer nid_hf, nid_hf3d save nid_hf, nid_hf3d - INTEGER longcles - PARAMETER ( longcles = 20 ) - ! Variables propres a la physique INTEGER, save:: radpas @@ -459,26 +399,19 @@ REAL albsollw(klon) SAVE albsollw ! albedo du sol total - REAL, SAVE:: wo(klon, llm) ! ozone + REAL, SAVE:: wo(klon, llm) ! column density of ozone in a cell, in kDU ! Declaration des procedures appelees 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) EXTERNAL nuage ! calculer les proprietes radiatives - EXTERNAL ozonecm ! prescrire l'ozone EXTERNAL radlwsw ! rayonnements solaire et infrarouge EXTERNAL transp ! transport total de l'eau et de l'energie - EXTERNAL ini_undefSTD !initialise a 0 une variable a 1 niveau de pression - - EXTERNAL undefSTD - ! (somme les valeurs definies d'1 var a 1 niveau de pression) - ! Variables locales real clwcon(klon, llm), rnebcon(klon, llm) @@ -626,11 +559,10 @@ save ratqsbas, ratqshaut, ratqs ! Parametres lies au nouveau schema de nuages (SB, PDF) - real fact_cldcon - real facttemps + real, save:: fact_cldcon + real, save:: facttemps logical ok_newmicro save ok_newmicro - save fact_cldcon, facttemps real facteur integer iflag_cldcon @@ -638,10 +570,6 @@ logical ptconv(klon, llm) - ! Variables liees a l'ecriture de la bande histoire physique - - integer itau_w ! pas de temps ecriture = itap + itau_phy - ! Variables locales pour effectuer les appels en serie REAL t_seri(klon, llm), q_seri(klon, llm) @@ -652,7 +580,6 @@ REAL d_tr(klon, llm, nbtr) REAL zx_rh(klon, llm) - INTEGER ndex2d(iim*(jjm + 1)), ndex3d(iim*(jjm + 1)*llm) REAL zustrdr(klon), zvstrdr(klon) REAL zustrli(klon), zvstrli(klon) @@ -662,8 +589,6 @@ REAL dudyn(iim+1, jjm + 1, llm) REAL zx_tmp_fi2d(klon) ! variable temporaire grille physique - REAL zx_tmp_fi3d(klon, llm) ! variable temporaire pour champs 3D - REAL zx_tmp_2d(iim, jjm + 1), zx_tmp_3d(iim, jjm + 1, llm) INTEGER, SAVE:: nid_day, nid_ins @@ -691,8 +616,7 @@ INTEGER ip_ebil ! PRINT level for energy conserv. diag. SAVE ip_ebil DATA ip_ebil/0/ - INTEGER if_ebil ! level for energy conserv. dignostics - SAVE if_ebil + INTEGER, SAVE:: if_ebil ! level for energy conservation diagnostics !+jld ec_conser REAL d_t_ec(klon, llm) ! tendance du a la conersion Ec -> E thermique REAL ZRCPD @@ -764,6 +688,11 @@ SAVE trmb2 SAVE trmb3 + real zmasse(klon, llm) + ! (column-density of mass of air in a cell, in kg m-2) + + real, parameter:: dobson_u = 2.1415e-05 ! Dobson unit, in kg m-2 + !---------------------------------------------------------------- modname = 'physiq' @@ -773,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 @@ -906,9 +835,9 @@ ! Initialisation des sorties - call ini_histhf(pdtphys, presnivs, nid_hf, nid_hf3d) - call ini_histday(pdtphys, presnivs, ok_journe, nid_day) - call ini_histins(pdtphys, presnivs, ok_instan, nid_ins) + call ini_histhf(pdtphys, nid_hf, nid_hf3d) + 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 WRITE(*, *) 'physiq date0 : ', date0 @@ -926,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 @@ -949,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 @@ -1017,11 +946,15 @@ julien = MOD(NINT(rdayvrai), 360) if (julien == 0) julien = 360 + forall (k = 1: llm) zmasse(:, k) = (paprs(:, k)-paprs(:, k+1)) / rg + ! Mettre en action les conditions aux limites (albedo, sst, etc.). ! Prescrire l'ozone et calculer l'albedo sur l'ocean. - IF (MOD(itap - 1, lmt_pas) == 0) THEN - CALL ozonecm(REAL(julien), rlat, paprs, wo) + 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) ENDIF ! Re-evaporer l'eau liquide nuageuse @@ -1102,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: + + 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) - !XXX Incrementation des flux + ! Incrémentation des flux zxfluxt=0. zxfluxq=0. @@ -1281,7 +1207,7 @@ DO k = 1, llm DO i = 1, klon z_avant(i) = z_avant(i) + (q_seri(i, k)+ql_seri(i, k)) & - *(paprs(i, k)-paprs(i, k+1))/RG + *zmasse(i, k) ENDDO ENDDO ENDIF @@ -1309,8 +1235,7 @@ ! (driver commun aux versions 3 et 4) IF (ok_cvl) THEN ! new driver for convectL - CALL concvl (iflag_con, & - pdtphys, paprs, pplay, t_seri, q_seri, & + CALL concvl(iflag_con, pdtphys, paprs, pplay, t_seri, q_seri, & u_seri, v_seri, tr_seri, ntra, & ema_work1, ema_work2, & d_t_con, d_q_con, d_u_con, d_v_con, d_tr, & @@ -1325,8 +1250,7 @@ pmfu=upwd+dnwd ELSE ! ok_cvl ! MAF conema3 ne contient pas les traceurs - CALL conema3 (pdtphys, & - paprs, pplay, t_seri, q_seri, & + CALL conema3 (pdtphys, paprs, pplay, t_seri, q_seri, & u_seri, v_seri, tr_seri, ntra, & ema_work1, ema_work2, & d_t_con, d_q_con, d_u_con, d_v_con, d_tr, & @@ -1416,7 +1340,7 @@ DO k = 1, llm DO i = 1, klon z_apres(i) = z_apres(i) + (q_seri(i, k)+ql_seri(i, k)) & - *(paprs(i, k)-paprs(i, k+1))/RG + *zmasse(i, k) ENDDO ENDDO DO i = 1, klon @@ -1573,7 +1497,7 @@ do i=1, klon if (d_q_con(i, k) < 0.) then rain_tiedtke(i)=rain_tiedtke(i)-d_q_con(i, k)/pdtphys & - *(paprs(i, k)-paprs(i, k+1))/rg + *zmasse(i, k) endif enddo enddo @@ -1848,16 +1772,14 @@ ENDDO DO k = 1, llm DO i = 1, klon - zustrph(i)=zustrph(i)+(u_seri(i, k)-u(i, k))/pdtphys* & - (paprs(i, k)-paprs(i, k+1))/rg - zvstrph(i)=zvstrph(i)+(v_seri(i, k)-v(i, k))/pdtphys* & - (paprs(i, k)-paprs(i, k+1))/rg + zustrph(i)=zustrph(i)+(u_seri(i, k)-u(i, k))/pdtphys* zmasse(i, k) + zvstrph(i)=zvstrph(i)+(v_seri(i, k)-v(i, k))/pdtphys* zmasse(i, k) ENDDO ENDDO !IM calcul composantes axiales du moment angulaire et couple des montagnes - CALL aaam_bud (27, klon, llm, gmtime, & + CALL aaam_bud(27, klon, llm, gmtime, & ra, rg, romega, & rlat, rlon, pphis, & zustrdr, zustrli, zustrph, & @@ -1872,36 +1794,25 @@ , d_h_vcol, d_qt, d_qw, d_ql, d_qs, d_ec) END IF - !AA Installation de l'interface online-offline pour traceurs - - ! 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, presnivs, pphis, pphi, albsol, rhcl, cldfra, & - rneb, diafra, cldliq, itop_con, ibas_con, pmflxr, pmflxs, prfl, & - psfl, da, phi, mp, upwd, dnwd, tr_seri) + ! Calcul des tendances traceurs + 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 - - print*, 'Attention on met a 0 les thermiques pour phystoke' - call phystokenc(pdtphys, rlon, rlat, & - t, pmfu, pmfd, pen_u, pde_u, pen_d, pde_d, & - fm_therm, entr_therm, & - ycoefh, yu1, yv1, ftsol, pctsrf, & - frac_impa, frac_nucl, & - pphis, airephy, pdtphys, itap) - + call phystokenc(pdtphys, rlon, rlat, t, pmfu, pmfd, pen_u, pde_u, & + pen_d, pde_d, fm_therm, entr_therm, ycoefh, yu1, yv1, ftsol, & + pctsrf, frac_impa, frac_nucl, pphis, airephy, pdtphys, itap) ENDIF ! Calculer le transport de l'eau et de l'energie (diagnostique) + CALL transp(paprs, zxtsol, t_seri, q_seri, u_seri, v_seri, zphi, ve, vq, & + ue, uq) - CALL transp (paprs, zxtsol, & - t_seri, q_seri, u_seri, v_seri, zphi, & - ve, vq, ue, uq) - - !IM diag. bilKP + ! diag. bilKP CALL transp_lay (paprs, zxtsol, & t_seri, q_seri, u_seri, v_seri, zphi, & @@ -1945,8 +1856,7 @@ DO i = 1, klon prw(i) = 0. DO k = 1, llm - prw(i) = prw(i) + & - q_seri(i, k)*(paprs(i, k)-paprs(i, k+1))/RG + prw(i) = prw(i) + q_seri(i, k)*zmasse(i, k) ENDDO ENDDO @@ -1962,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 @@ -1973,7 +1883,6 @@ ENDIF ! Sauvegarder les valeurs de t et q a la fin de la physique: - DO k = 1, llm DO i = 1, klon t_ancien(i, k) = t_seri(i, k) @@ -1982,13 +1891,11 @@ ENDDO ! Ecriture des sorties - call write_histhf call write_histday call write_histins ! Si c'est la fin, il faut conserver l'etat de redemarrage - IF (lafin) THEN itau_phy = itau_phy + itap CALL phyredem("restartphy.nc", rlat, rlon, pctsrf, ftsol, & @@ -2000,20 +1907,24 @@ t_ancien, q_ancien, rnebcon, ratqs, clwcon, run_off_lic_0) ENDIF + firstcal = .FALSE. + contains subroutine write_histday - use grid_change, only: gr_phy_write_3d + use gr_phy_write_3d_m, only: gr_phy_write_3d + integer itau_w ! pas de temps ecriture !------------------------------------------------ if (ok_journe) THEN - ndex2d = 0 - ndex3d = 0 itau_w = itau_phy + itap - call histwrite(nid_day, "Sigma_O3_Royer", itau_w, gr_phy_write_3d(wo)) - + 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) + end if if (ok_sync) then call histsync(nid_day) endif @@ -2027,10 +1938,7 @@ ! From phylmd/write_histhf.h, v 1.5 2005/05/25 13:10:09 - ndex2d = 0 - ndex3d = 0 - - itau_w = itau_phy + itap + !------------------------------------------------ call write_histhf3d @@ -2047,14 +1955,11 @@ ! From phylmd/write_histins.h, v 1.2 2005/05/25 13:10:09 real zout + integer itau_w ! pas de temps ecriture !-------------------------------------------------- IF (ok_instan) THEN - - ndex2d = 0 - ndex3d = 0 - ! Champs 2D: zsto = pdtphys * ecrit_ins @@ -2283,8 +2188,9 @@ ! From phylmd/write_histhf3d.h, v 1.2 2005/05/25 13:10:09 - ndex2d = 0 - ndex3d = 0 + integer itau_w ! pas de temps ecriture + + !------------------------------------------------------- itau_w = itau_phy + itap @@ -2316,39 +2222,4 @@ END SUBROUTINE physiq - !**************************************************** - - FUNCTION qcheck(klon, klev, paprs, q, ql, aire) - - ! From phylmd/physiq.F, v 1.22 2006/02/20 09:38:28 - - use YOMCST - IMPLICIT none - - ! Calculer et imprimer l'eau totale. A utiliser pour verifier - ! la conservation de l'eau - - INTEGER klon, klev - REAL, intent(in):: paprs(klon, klev+1) - real q(klon, klev), ql(klon, klev) - REAL aire(klon) - REAL qtotal, zx, qcheck - INTEGER i, k - - zx = 0.0 - DO i = 1, klon - zx = zx + aire(i) - ENDDO - qtotal = 0.0 - DO k = 1, klev - DO i = 1, klon - qtotal = qtotal + (q(i, k)+ql(i, k)) * aire(i) & - *(paprs(i, k)-paprs(i, k+1))/RG - ENDDO - ENDDO - - qcheck = qtotal/zx - - END FUNCTION qcheck - end module physiq_m