--- trunk/dyn3d/leapfrog.f 2014/03/12 21:16:36 90 +++ trunk/dyn3d/leapfrog.f 2014/09/19 17:36:20 115 @@ -15,11 +15,12 @@ use caladvtrac_m, only: caladvtrac use caldyn_m, only: caldyn USE calfis_m, ONLY: calfis - USE comconst, ONLY: daysec, dtphys, dtvr + USE comconst, ONLY: daysec, dtvr USE comgeom, ONLY: aire_2d, apoln, apols USE disvert_m, ONLY: ap, bp USE conf_gcm_m, ONLY: day_step, iconser, iperiod, iphysiq, nday, offline, & - iflag_phys, ok_guide, iecri + iflag_phys, iecri + USE conf_guide_m, ONLY: ok_guide USE dimens_m, ONLY: iim, jjm, llm, nqmx use dissip_m, only: dissip USE dynetat0_m, ONLY: day_ini @@ -53,7 +54,7 @@ REAL, intent(in):: time_0 - ! Variables local to the procedure: + ! Local: ! Variables dynamiques: @@ -61,11 +62,11 @@ REAL pk(iim + 1, jjm + 1, llm) ! exner au milieu des couches REAL pkf(iim + 1, jjm + 1, llm) ! exner filtr\'e au milieu des couches REAL phi(iim + 1, jjm + 1, llm) ! geopotential - REAL w((iim + 1) * (jjm + 1), llm) ! vitesse verticale + REAL w(iim + 1, jjm + 1, llm) ! vitesse verticale ! Variables dynamiques intermediaire pour le transport ! Flux de masse : - REAL pbaru((iim + 1) * (jjm + 1), llm), pbarv((iim + 1) * jjm, llm) + REAL pbaru(iim + 1, jjm + 1, llm), pbarv(iim + 1, jjm, llm) ! Variables dynamiques au pas - 1 REAL vcovm1(iim + 1, jjm, llm), ucovm1(iim + 1, jjm + 1, llm) @@ -82,9 +83,8 @@ REAL dtetadis(iim + 1, jjm + 1, llm) ! 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)) + 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) ! Variables pour le fichier histoire @@ -100,7 +100,7 @@ REAL vcont((iim + 1) * jjm, llm), ucont((iim + 1) * (jjm + 1), llm) logical leapf - real dt + real dt ! time step, in s !--------------------------------------------------- @@ -121,15 +121,14 @@ else ! Matsuno dt = dtvr - if (ok_guide .and. (itaufin - itau - 1) * dtvr > 21600.) & - call guide(itau, ucov, vcov, teta, q, masse, ps) + if (ok_guide) call guide(itau, ucov, vcov, teta, q(:, :, :, 1), ps) vcovm1 = vcov ucovm1 = ucov tetam1 = teta massem1 = masse psm1 = ps finvmaold = masse - CALL filtreg(finvmaold, jjm + 1, llm, - 2, 2, .TRUE.) + CALL filtreg(finvmaold, direct = .false., intensive = .false.) end if ! Calcul des tendances dynamiques: @@ -149,11 +148,11 @@ dp, vcov, ucov, teta, q(:, :, :, :2), ps, masse, finvmaold, dt, & leapf) + forall (l = 1: llm + 1) p3d(:, :, l) = ap(l) + bp(l) * ps + CALL exner_hyb(ps, p3d, pks, pk, pkf) + if (.not. leapf) then ! Matsuno backward - forall (l = 1: llm + 1) p3d(:, :, l) = ap(l) + bp(l) * ps - CALL exner_hyb(ps, p3d, pks, pk, pkf) - ! Calcul des tendances dynamiques: CALL geopot(teta, pk, pks, phis, phi) CALL caldyn(itau + 1, ucov, vcov, teta, ps, masse, pk, pkf, phis, & @@ -164,29 +163,26 @@ CALL integrd(vcovm1, ucovm1, tetam1, psm1, massem1, dv, dudyn, & dteta, dp, vcov, ucov, teta, q(:, :, :, :2), ps, masse, & finvmaold, dtvr, leapf=.false.) + + forall (l = 1: llm + 1) p3d(:, :, l) = ap(l) + bp(l) * ps + CALL exner_hyb(ps, p3d, pks, pk, pkf) end if IF (MOD(itau + 1, iphysiq) == 0 .AND. iflag_phys /= 0) THEN ! Calcul des tendances physiques: - forall (l = 1: llm + 1) p3d(:, :, l) = ap(l) + bp(l) * ps - CALL exner_hyb(ps, p3d, pks, pk, pkf) - rdaym_ini = itau * dtvr / daysec rdayvrai = rdaym_ini + day_ini time = REAL(mod(itau, day_step)) / day_step + time_0 IF (time > 1.) time = time - 1. - CALL calfis(rdayvrai, time, ucov, vcov, teta, q, ps, pk, phis, phi, & - w, dufi, dvfi, dtetafi, dqfi, dpfi, lafin = itau + 1 == itaufin) + CALL calfis(rdayvrai, time, ucov, vcov, teta, q, pk, phis, phi, w, & + dufi, dvfi, dtetafi, dqfi, lafin = itau + 1 == itaufin) ! Ajout des tendances physiques: - CALL addfi(ucov, vcov, teta, q, ps, dufi, dvfi, dtetafi, dqfi, dpfi) + CALL addfi(ucov, vcov, teta, q, dufi, dvfi, dtetafi, dqfi) ENDIF - forall (l = 1: llm + 1) p3d(:, :, l) = ap(l) + bp(l) * ps - CALL exner_hyb(ps, p3d, pks, pk, pkf) - IF (MOD(itau + 1, idissip) == 0) THEN ! Dissipation horizontale et verticale des petites \'echelles