--- trunk/libf/dyn3d/leapfrog.f90 2011/12/12 13:25:01 55 +++ trunk/libf/dyn3d/leapfrog.f90 2012/11/14 16:59:30 68 @@ -6,7 +6,7 @@ SUBROUTINE leapfrog(ucov, vcov, teta, ps, masse, phis, q, time_0) - ! From dyn3d/leapfrog.F, version 1.6, 2005/04/13 08:58:34 + ! From dyn3d/leapfrog.F, version 1.6, 2005/04/13 08:58:34 revision 616 ! Authors: P. Le Van, L. Fairhead, F. Hourdin ! Matsuno-leapfrog scheme. @@ -15,12 +15,11 @@ use caladvtrac_m, only: caladvtrac use caldyn_m, only: caldyn USE calfis_m, ONLY: calfis - USE com_io_dyn, ONLY: histaveid USE comconst, ONLY: daysec, dtphys, dtvr USE comgeom, ONLY: aire_2d, apoln, apols - USE comvert, ONLY: ap, bp + USE disvert_m, ONLY: ap, bp USE conf_gcm_m, ONLY: day_step, iconser, iperiod, iphysiq, nday, offline, & - periodav + iflag_phys, ok_guide, iecri USE dimens_m, ONLY: iim, jjm, llm, nqmx use dissip_m, only: dissip USE dynetat0_m, ONLY: day_ini @@ -31,10 +30,10 @@ USE guide_m, ONLY: guide use inidissip_m, only: idissip use integrd_m, only: integrd - USE logic, ONLY: iflag_phys, ok_guide use nr_util, only: assert USE pressure_var, ONLY: p3d USE temps, ONLY: itau_dyn + use writedynav_m, only: writedynav ! Variables dynamiques: REAL, intent(inout):: ucov(:, :, :) ! (iim + 1, jjm + 1, llm) vent covariant @@ -44,8 +43,8 @@ ! potential temperature REAL, intent(inout):: ps(:, :) ! (iim + 1, jjm + 1) pression au sol, en Pa - REAL masse((iim + 1) * (jjm + 1), llm) ! masse d'air - REAL phis((iim + 1) * (jjm + 1)) ! geopotentiel au sol + REAL masse(:, :, :) ! (iim + 1, jjm + 1, llm) masse d'air + REAL phis(:, :) ! (iim + 1, jjm + 1) geopotentiel au sol REAL, intent(inout):: q(:, :, :, :) ! (iim + 1, jjm + 1, llm, nqmx) ! mass fractions of advected fields @@ -58,7 +57,7 @@ REAL pks((iim + 1) * (jjm + 1)) ! exner au sol REAL pk(iim + 1, jjm + 1, llm) ! exner au milieu des couches - REAL pkf((iim + 1) * (jjm + 1), llm) ! exner filt.au milieu des couches + REAL pkf(iim + 1, jjm + 1, llm) ! exner filtré au milieu des couches REAL phi(iim + 1, jjm + 1, llm) ! geopotential REAL w((iim + 1) * (jjm + 1), llm) ! vitesse verticale @@ -66,41 +65,37 @@ ! Flux de masse : REAL pbaru((iim + 1) * (jjm + 1), llm), pbarv((iim + 1) * jjm, llm) - ! variables dynamiques au pas - 1 + ! Variables dynamiques au pas - 1 REAL vcovm1(iim + 1, jjm, llm), ucovm1(iim + 1, jjm + 1, llm) REAL tetam1(iim + 1, jjm + 1, llm), psm1(iim + 1, jjm + 1) - REAL massem1((iim + 1) * (jjm + 1), llm) + REAL massem1(iim + 1, jjm + 1, llm) - ! tendances dynamiques + ! Tendances dynamiques REAL dv((iim + 1) * jjm, llm), dudyn((iim + 1) * (jjm + 1), llm) REAL dteta(iim + 1, jjm + 1, llm), dq((iim + 1) * (jjm + 1), llm, nqmx) real dp((iim + 1) * (jjm + 1)) - ! tendances de la dissipation + ! Tendances de la dissipation : REAL dvdis(iim + 1, jjm, llm), dudis(iim + 1, jjm + 1, llm) REAL dtetadis(iim + 1, jjm + 1, llm) - ! tendances physiques + ! Tendances physiques REAL dvfi((iim + 1) * jjm, llm), dufi((iim + 1) * (jjm + 1), llm) REAL dtetafi(iim + 1, jjm + 1, llm), dqfi((iim + 1) * (jjm + 1), llm, nqmx) real dpfi((iim + 1) * (jjm + 1)) - ! variables pour le fichier histoire + ! Variables pour le fichier histoire INTEGER itau ! index of the time step of the dynamics, starts at 0 INTEGER itaufin REAL time ! time of day, as a fraction of day length - real finvmaold((iim + 1) * (jjm + 1), llm) + real finvmaold(iim + 1, jjm + 1, llm) INTEGER l REAL rdayvrai, rdaym_ini ! Variables test conservation energie REAL ecin(iim + 1, jjm + 1, llm), ecin0(iim + 1, jjm + 1, llm) - REAL dtetaecdt(iim + 1, jjm + 1, llm) - ! tendance de la température potentielle due à la transformation - ! d'énergie cinétique en énergie thermique par la dissipation - REAL vcont((iim + 1) * jjm, llm), ucont((iim + 1) * (jjm + 1), llm) logical leapf real dt @@ -111,7 +106,7 @@ call assert(shape(ucov) == (/iim + 1, jjm + 1, llm/), "leapfrog") itaufin = nday * day_step - ! "day_step" is a multiple of "iperiod", therefore "itaufin" is one too + ! "day_step" is a multiple of "iperiod", therefore so is "itaufin". dq = 0. @@ -134,7 +129,7 @@ massem1 = masse psm1 = ps finvmaold = masse - CALL filtreg(finvmaold, jjm + 1, llm, - 2, 2, .TRUE., 1) + CALL filtreg(finvmaold, jjm + 1, llm, - 2, 2, .TRUE.) end if ! Calcul des tendances dynamiques: @@ -185,7 +180,7 @@ CALL calfis(rdayvrai, time, ucov, vcov, teta, q, masse, ps, pk, & phis, phi, dudyn, dv, dq, w, dufi, dvfi, dtetafi, dqfi, dpfi, & - lafin=itau+1==itaufin) + lafin = itau + 1 == itaufin) ! ajout des tendances physiques: CALL addfi(nqmx, dtphys, ucov, vcov, teta, q, ps, dufi, dvfi, & @@ -211,8 +206,7 @@ ! cinétique en énergie thermique par la dissipation call covcont(llm, ucov, vcov, ucont, vcont) call enercin(vcov, ucov, vcont, ucont, ecin) - dtetaecdt= (ecin0 - ecin) / pk - dtetadis = dtetadis + dtetaecdt + dtetadis = dtetadis + (ecin0 - ecin) / pk teta = teta + dtetadis ! Calcul de la valeur moyenne aux pôles : @@ -230,22 +224,27 @@ IF (MOD(itau + 1, iperiod) == 0) THEN ! Écriture du fichier histoire moyenne: - CALL writedynav(histaveid, nqmx, itau + 1, vcov, ucov, teta, pk, & - phi, q, masse, ps, phis) + CALL writedynav(vcov, ucov, teta, pk, phi, q, masse, ps, phis, & + time = itau + 1) call bilan_dyn(ps, masse, pk, pbaru, pbarv, teta, phi, ucov, vcov, & - q(:, :, :, 1), dt_app = dtvr * iperiod, & - dt_cum = dtvr * day_step * periodav) + q(:, :, :, 1)) ENDIF + + IF (MOD(itau + 1, iecri * day_step) == 0) THEN + CALL geopot((iim + 1) * (jjm + 1), teta, pk, pks, phis, phi) + CALL writehist(itau, vcov, ucov, teta, phi, q, masse, ps, phis) + END IF end do time_integration CALL dynredem1("restart.nc", vcov, ucov, teta, q, masse, ps, & - itau=itau_dyn+itaufin) + itau = itau_dyn + itaufin) ! Calcul des tendances dynamiques: CALL geopot((iim + 1) * (jjm + 1), teta, pk, pks, phis, phi) CALL caldyn(itaufin, ucov, vcov, teta, ps, masse, pk, pkf, phis, phi, & dudyn, dv, dteta, dp, w, pbaru, pbarv, time_0, & - conser=MOD(itaufin, iconser)==0) + conser = MOD(itaufin, iconser) == 0) + END SUBROUTINE leapfrog end module leapfrog_m