/[lmdze]/trunk/Sources/phylmd/clmain.f
ViewVC logotype

Diff of /trunk/Sources/phylmd/clmain.f

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 238 by guez, Thu Nov 9 14:11:39 2017 UTC revision 248 by guez, Fri Jan 5 16:40:13 2018 UTC
# Line 8  contains Line 8  contains
8         cdhmax, ksta, ksta_ter, ok_kzmin, ftsoil, qsol, paprs, pplay, fsnow, &         cdhmax, ksta, ksta_ter, ok_kzmin, ftsoil, qsol, paprs, pplay, fsnow, &
9         qsurf, evap, falbe, fluxlat, rain_fall, snow_f, fsolsw, fsollw, frugs, &         qsurf, evap, falbe, fluxlat, rain_fall, snow_f, fsolsw, fsollw, frugs, &
10         agesno, rugoro, d_t, d_q, d_u, d_v, d_ts, flux_t, flux_q, flux_u, &         agesno, rugoro, d_t, d_q, d_u, d_v, d_ts, flux_t, flux_q, flux_u, &
11         flux_v, cdragh, cdragm, q2, dflux_t, dflux_q, ycoefh, t2m, q2m, &         flux_v, cdragh, cdragm, q2, dflux_t, dflux_q, coefh, t2m, q2m, &
12         u10m_srf, v10m_srf, pblh, capcl, oliqcl, cteicl, pblt, therm, trmb1, &         u10m_srf, v10m_srf, pblh, capcl, oliqcl, cteicl, pblt, therm, trmb1, &
13         trmb2, trmb3, plcl, fqcalving, ffonte, run_off_lic_0)         trmb2, trmb3, plcl, fqcalving, ffonte, run_off_lic_0)
14    
# Line 21  contains Line 21  contains
21      ! ne tient pas compte de la diff\'erentiation des sous-fractions      ! ne tient pas compte de la diff\'erentiation des sous-fractions
22      ! de sol.      ! de sol.
23    
24        use clcdrag_m, only: clcdrag
25      use clqh_m, only: clqh      use clqh_m, only: clqh
26      use clvent_m, only: clvent      use clvent_m, only: clvent
27      use coefkz_m, only: coefkz      use coefkz_m, only: coefkz
# Line 106  contains Line 107  contains
107      ! dflux_q derive du flux latent      ! dflux_q derive du flux latent
108      ! IM "slab" ocean      ! IM "slab" ocean
109    
110      REAL, intent(out):: ycoefh(:, :) ! (klon, klev)      REAL, intent(out):: coefh(:, 2:) ! (klon, 2:klev)
111      ! Pour pouvoir extraire les coefficients d'\'echange, le champ      ! Pour pouvoir extraire les coefficients d'\'echange, le champ
112      ! "ycoefh" a \'et\'e cr\'e\'e. Nous avons moyenn\'e les valeurs de      ! "coefh" a \'et\'e cr\'e\'e. Nous avons moyenn\'e les valeurs de
113      ! ce champ sur les quatre sous-surfaces du mod\`ele.      ! ce champ sur les quatre sous-surfaces du mod\`ele.
114    
115      REAL, INTENT(inout):: t2m(klon, nbsrf), q2m(klon, nbsrf)      REAL, INTENT(inout):: t2m(klon, nbsrf), q2m(klon, nbsrf)
# Line 150  contains Line 151  contains
151      real y_run_off_lic_0(klon)      real y_run_off_lic_0(klon)
152      REAL rugmer(klon)      REAL rugmer(klon)
153      REAL ytsoil(klon, nsoilmx)      REAL ytsoil(klon, nsoilmx)
154      REAL yts(klon), yrugos(klon), ypct(klon), yz0_new(klon)      REAL yts(klon), ypct(klon), yz0_new(klon)
155        real yrugos(klon) ! longeur de rugosite (en m)
156      REAL yalb(klon)      REAL yalb(klon)
157      REAL snow(klon), yqsurf(klon), yagesno(klon)      REAL snow(klon), yqsurf(klon), yagesno(klon)
158      real yqsol(klon) ! column-density of water in soil, in kg m-2      real yqsol(klon) ! column-density of water in soil, in kg m-2
# Line 164  contains Line 166  contains
166      REAL y_flux_t(klon), y_flux_q(klon)      REAL y_flux_t(klon), y_flux_q(klon)
167      REAL y_flux_u(klon), y_flux_v(klon)      REAL y_flux_u(klon), y_flux_v(klon)
168      REAL y_dflux_t(klon), y_dflux_q(klon)      REAL y_dflux_t(klon), y_dflux_q(klon)
169      REAL coefh(klon, 2:klev), coefm(klon, 2:klev)      REAL ycoefh(klon, 2:klev), ycoefm(klon, 2:klev)
170      real ycdragh(klon), ycdragm(klon)      real ycdragh(klon), ycdragm(klon)
171      REAL yu(klon, klev), yv(klon, klev)      REAL yu(klon, klev), yv(klon, klev)
172      REAL yt(klon, klev), yq(klon, klev)      REAL yt(klon, klev), yq(klon, klev)
173      REAL ypaprs(klon, klev + 1), ypplay(klon, klev), ydelp(klon, klev)      REAL ypaprs(klon, klev + 1), ypplay(klon, klev), ydelp(klon, klev)
174      REAL ycoefm0(klon, klev), ycoefh0(klon, klev)      REAL ycoefm0(klon, 2:klev), ycoefh0(klon, 2:klev)
175      REAL yzlay(klon, klev), zlev(klon, klev + 1), yteta(klon, klev)      REAL yzlay(klon, klev), zlev(klon, klev + 1), yteta(klon, klev)
     REAL ykmm(klon, klev + 1), ykmn(klon, klev + 1)  
176      REAL yq2(klon, klev + 1)      REAL yq2(klon, klev + 1)
177      REAL delp(klon, klev)      REAL delp(klon, klev)
178      INTEGER i, k, nsrf      INTEGER i, k, nsrf
# Line 201  contains Line 202  contains
202    
203      REAL qairsol(klon), zgeo1(klon)      REAL qairsol(klon), zgeo1(klon)
204      REAL rugo1(klon)      REAL rugo1(klon)
205        REAL zgeop(klon, klev)
206    
207      !------------------------------------------------------------      !------------------------------------------------------------
208    
# Line 243  contains Line 245  contains
245      d_q = 0.      d_q = 0.
246      d_u = 0.      d_u = 0.
247      d_v = 0.      d_v = 0.
248      ycoefh = 0.      coefh = 0.
249    
250      ! Initialisation des "pourcentages potentiels". On consid\`ere ici qu'on      ! Initialisation des "pourcentages potentiels". On consid\`ere ici qu'on
251      ! peut avoir potentiellement de la glace sur tout le domaine oc\'eanique      ! peut avoir potentiellement de la glace sur tout le domaine oc\'eanique
# Line 310  contains Line 312  contains
312               END DO               END DO
313            END DO            END DO
314    
315            ! calculer Cdrag et les coefficients d'echange            ! Calculer les géopotentiels de chaque couche:
316            CALL coefkz(nsrf, ypaprs, ypplay, ksta, ksta_ter, yts(:knon), &  
317                 yrugos, yu, yv, yt, yq, yqsurf(:knon), coefm(:knon, :), &            zgeop(:knon, 1) = RD * yt(:knon, 1) / (0.5 * (ypaprs(:knon, 1) &
318                 coefh(:knon, :), ycdragm(:knon), ycdragh(:knon))                 + ypplay(:knon, 1))) * (ypaprs(:knon, 1) - ypplay(:knon, 1))
319    
320              DO k = 2, klev
321                 zgeop(:knon, k) = zgeop(:knon, k - 1) + RD * 0.5 &
322                      * (yt(:knon, k - 1) + yt(:knon, k)) / ypaprs(:knon, k) &
323                      * (ypplay(:knon, k - 1) - ypplay(:knon, k))
324              ENDDO
325    
326              CALL clcdrag(nsrf, yu(:knon, 1), yv(:knon, 1), yt(:knon, 1), &
327                   yq(:knon, 1), zgeop(:knon, 1), yts(:knon), yqsurf(:knon), &
328                   yrugos(:knon), ycdragm(:knon), ycdragh(:knon))
329    
330              CALL coefkz(nsrf, ypaprs(:knon, :), ypplay(:knon, :), ksta, &
331                   ksta_ter, yts(:knon), yu(:knon, :), yv(:knon, :), yt(:knon, :), &
332                   yq(:knon, :), zgeop(:knon, :), ycoefm(:knon, :), &
333                   ycoefh(:knon, :))
334    
335            IF (iflag_pbl == 1) THEN            IF (iflag_pbl == 1) THEN
336               CALL coefkz2(nsrf, knon, ypaprs, ypplay, yt, ycoefm0(:knon, 2:), &               CALL coefkz2(nsrf, knon, ypaprs, ypplay, yt, ycoefm0(:knon, :), &
337                    ycoefh0(:knon, 2:))                    ycoefh0(:knon, :))
338               ycoefm0(:knon, 1) = 0.               ycoefm(:knon, :) = max(ycoefm(:knon, :), ycoefm0(:knon, :))
339               ycoefh0(:knon, 1) = 0.               ycoefh(:knon, :) = max(ycoefh(:knon, :), ycoefh0(:knon, :))
              coefm(:knon, :) = max(coefm(:knon, :), ycoefm0(:knon, 2:))  
              coefh(:knon, :) = max(coefh(:knon, :), ycoefh0(:knon, 2:))  
340               ycdragm(:knon) = max(ycdragm(:knon), 0.)               ycdragm(:knon) = max(ycdragm(:knon), 0.)
341               ycdragh(:knon) = max(ycdragh(:knon), 0.)               ycdragh(:knon) = max(ycdragh(:knon), 0.)
342            END IF            END IF
# Line 335  contains Line 350  contains
350            IF (ok_kzmin) THEN            IF (ok_kzmin) THEN
351               ! Calcul d'une diffusion minimale pour les conditions tres stables               ! Calcul d'une diffusion minimale pour les conditions tres stables
352               CALL coefkzmin(knon, ypaprs, ypplay, yu, yv, yt, yq, &               CALL coefkzmin(knon, ypaprs, ypplay, yu, yv, yt, yq, &
353                    ycdragm(:knon), ycoefm0(:knon, 2:), ycoefh0(:knon, 2:))                    ycdragm(:knon), ycoefh0(:knon, :))
354               coefm(:knon, :) = max(coefm(:knon, :), ycoefm0(:knon, 2:))               ycoefm0(:knon, :) = ycoefh0(:knon, :)
355               coefh(:knon, :) = max(coefh(:knon, :), ycoefh0(:knon, 2:))               ycoefm(:knon, :) = max(ycoefm(:knon, :), ycoefm0(:knon, :))
356               ycdragm(:knon) = max(ycdragm(:knon), ycoefm0(:knon, 1))               ycoefh(:knon, :) = max(ycoefh(:knon, :), ycoefh0(:knon, :))
              ycdragh(:knon) = max(ycdragh(:knon), ycoefh0(:knon, 1))  
357            END IF            END IF
358    
359            IF (iflag_pbl >= 6) THEN            IF (iflag_pbl >= 6) THEN
# Line 379  contains Line 393  contains
393               ustar(:knon) = ustarhb(yu(:knon, 1), yv(:knon, 1), ycdragm(:knon))               ustar(:knon) = ustarhb(yu(:knon, 1), yv(:knon, 1), ycdragm(:knon))
394               CALL yamada4(dtime, rg, zlev(:knon, :), yzlay(:knon, :), &               CALL yamada4(dtime, rg, zlev(:knon, :), yzlay(:knon, :), &
395                    yu(:knon, :), yv(:knon, :), yteta(:knon, :), yq2(:knon, :), &                    yu(:knon, :), yv(:knon, :), yteta(:knon, :), yq2(:knon, :), &
396                    ykmm(:knon, :), ykmn(:knon, :), ustar(:knon))                    ycoefm(:knon, :), ycoefh(:knon, :), ustar(:knon))
              coefm(:knon, :) = ykmm(:knon, 2:klev)  
              coefh(:knon, :) = ykmn(:knon, 2:klev)  
397            END IF            END IF
398    
399            CALL clvent(dtime, yu(:knon, 1), yv(:knon, 1), coefm(:knon, :), &            CALL clvent(dtime, yu(:knon, 1), yv(:knon, 1), ycoefm(:knon, :), &
400                 ycdragm(:knon), yt(:knon, :), yu(:knon, :), ypaprs(:knon, :), &                 ycdragm(:knon), yt(:knon, :), yu(:knon, :), ypaprs(:knon, :), &
401                 ypplay(:knon, :), ydelp(:knon, :), y_d_u(:knon, :), &                 ypplay(:knon, :), ydelp(:knon, :), y_d_u(:knon, :), &
402                 y_flux_u(:knon))                 y_flux_u(:knon))
403            CALL clvent(dtime, yu(:knon, 1), yv(:knon, 1), coefm(:knon, :), &            CALL clvent(dtime, yu(:knon, 1), yv(:knon, 1), ycoefm(:knon, :), &
404                 ycdragm(:knon), yt(:knon, :), yv(:knon, :), ypaprs(:knon, :), &                 ycdragm(:knon), yt(:knon, :), yv(:knon, :), ypaprs(:knon, :), &
405                 ypplay(:knon, :), ydelp(:knon, :), y_d_v(:knon, :), &                 ypplay(:knon, :), ydelp(:knon, :), y_d_v(:knon, :), &
406                 y_flux_v(:knon))                 y_flux_v(:knon))
# Line 396  contains Line 408  contains
408            ! calculer la diffusion de "q" et de "h"            ! calculer la diffusion de "q" et de "h"
409            CALL clqh(dtime, julien, firstcal, nsrf, ni(:knon), &            CALL clqh(dtime, julien, firstcal, nsrf, ni(:knon), &
410                 ytsoil(:knon, :), yqsol(:knon), mu0, yrugos, yrugoro, &                 ytsoil(:knon, :), yqsol(:knon), mu0, yrugos, yrugoro, &
411                 yu(:knon, 1), yv(:knon, 1), coefh(:knon, :), ycdragh(:knon), &                 yu(:knon, 1), yv(:knon, 1), ycoefh(:knon, :), ycdragh(:knon), &
412                 yt, yq, yts(:knon), ypaprs, ypplay, ydelp, yrads(:knon), &                 yt, yq, yts(:knon), ypaprs, ypplay, ydelp, yrads(:knon), &
413                 yalb(:knon), snow(:knon), yqsurf, yrain_f, ysnow_f, &                 yalb(:knon), snow(:knon), yqsurf, yrain_f, ysnow_f, &
414                 yfluxlat(:knon), pctsrf_new_sic, yagesno(:knon), y_d_t, y_d_q, &                 yfluxlat(:knon), pctsrf_new_sic, yagesno(:knon), y_d_t, y_d_q, &
# Line 419  contains Line 431  contains
431               y_dflux_q(j) = y_dflux_q(j) * ypct(j)               y_dflux_q(j) = y_dflux_q(j) * ypct(j)
432            END DO            END DO
433    
           DO k = 2, klev  
              DO j = 1, knon  
                 i = ni(j)  
                 coefh(j, k) = coefh(j, k) * ypct(j)  
                 coefm(j, k) = coefm(j, k) * ypct(j)  
              END DO  
           END DO  
           DO j = 1, knon  
              i = ni(j)  
              ycdragh(j) = ycdragh(j) * ypct(j)  
              ycdragm(j) = ycdragm(j) * ypct(j)  
           END DO  
434            DO k = 1, klev            DO k = 1, klev
435               DO j = 1, knon               DO j = 1, knon
436                  i = ni(j)                  i = ni(j)
# Line 467  contains Line 467  contains
467               agesno(i, nsrf) = yagesno(j)               agesno(i, nsrf) = yagesno(j)
468               fqcalving(i, nsrf) = y_fqcalving(j)               fqcalving(i, nsrf) = y_fqcalving(j)
469               ffonte(i, nsrf) = y_ffonte(j)               ffonte(i, nsrf) = y_ffonte(j)
470               cdragh(i) = cdragh(i) + ycdragh(j)               cdragh(i) = cdragh(i) + ycdragh(j) * ypct(j)
471               cdragm(i) = cdragm(i) + ycdragm(j)               cdragm(i) = cdragm(i) + ycdragm(j) * ypct(j)
472               dflux_t(i) = dflux_t(i) + y_dflux_t(j)               dflux_t(i) = dflux_t(i) + y_dflux_t(j)
473               dflux_q(i) = dflux_q(i) + y_dflux_q(j)               dflux_q(i) = dflux_q(i) + y_dflux_q(j)
474            END DO            END DO
# Line 493  contains Line 493  contains
493                  d_v(i, k) = d_v(i, k) + y_d_v(j, k)                  d_v(i, k) = d_v(i, k) + y_d_v(j, k)
494               END DO               END DO
495            END DO            END DO
             
           DO j = 1, knon  
              i = ni(j)  
              DO k = 2, klev  
                 ycoefh(i, k) = ycoefh(i, k) + coefh(j, k)  
              END DO  
           END DO  
496    
497            DO j = 1, knon            forall (k = 2:klev) coefh(ni(:knon), k) &
498               i = ni(j)                 = coefh(ni(:knon), k) + ycoefh(:knon, k) * ypct(:knon)
              ycoefh(i, 1) = ycoefh(i, 1) + ycdragh(j)  
           END DO  
499    
500            ! diagnostic t, q a 2m et u, v a 10m            ! diagnostic t, q a 2m et u, v a 10m
501    
# Line 529  contains Line 520  contains
520    
521            CALL stdlevvar(klon, knon, nsrf, u1(:knon), v1(:knon), tair1(:knon), &            CALL stdlevvar(klon, knon, nsrf, u1(:knon), v1(:knon), tair1(:knon), &
522                 qair1, zgeo1, tairsol, qairsol, rugo1, psfce, patm, yt2m, &                 qair1, zgeo1, tairsol, qairsol, rugo1, psfce, patm, yt2m, &
523                 yq2m, yt10m, yq10m, wind10m(:knon), ustar)                 yq2m, yt10m, yq10m, wind10m(:knon), ustar(:knon))
524    
525            DO j = 1, knon            DO j = 1, knon
526               i = ni(j)               i = ni(j)

Legend:
Removed from v.238  
changed lines
  Added in v.248

  ViewVC Help
Powered by ViewVC 1.1.21