/[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 207 by guez, Thu Sep 1 10:30:53 2016 UTC revision 222 by guez, Tue Apr 25 15:31:48 2017 UTC
# Line 4  module clmain_m Line 4  module clmain_m
4    
5  contains  contains
6    
7    SUBROUTINE clmain(dtime, pctsrf, t, q, u, v, jour, rmu0, ftsol, cdmmax, &    SUBROUTINE clmain(dtime, pctsrf, t, q, u, v, julien, mu0, ftsol, cdmmax, &
8         cdhmax, ksta, ksta_ter, ok_kzmin, ftsoil, qsol, paprs, pplay, snow, &         cdhmax, ksta, ksta_ter, ok_kzmin, ftsoil, qsol, paprs, pplay, fsnow, &
9         qsurf, evap, falbe, fluxlat, rain_fall, snow_f, solsw, sollw, fder, &         qsurf, evap, falbe, fluxlat, rain_fall, snow_f, fsolsw, fsollw, fder, &
10         rlat, rugos, agesno, rugoro, d_t, d_q, d_u, d_v, d_ts, flux_t, flux_q, &         frugs, agesno, rugoro, d_t, d_q, d_u, d_v, d_ts, flux_t, flux_q, &
11         flux_u, flux_v, cdragh, cdragm, q2, dflux_t, dflux_q, ycoefh, zu1, &         flux_u, flux_v, cdragh, cdragm, q2, dflux_t, dflux_q, ycoefh, zu1, &
12         zv1, t2m, q2m, u10m, v10m, pblh, capcl, oliqcl, cteicl, pblt, therm, &         zv1, t2m, q2m, u10m, v10m, pblh, capcl, oliqcl, cteicl, pblt, therm, &
13         trmb1, trmb2, trmb3, plcl, fqcalving, ffonte, run_off_lic_0)         trmb1, trmb2, trmb3, plcl, fqcalving, ffonte, run_off_lic_0)
# Line 52  contains Line 52  contains
52      REAL, INTENT(IN):: t(klon, klev) ! temperature (K)      REAL, INTENT(IN):: t(klon, klev) ! temperature (K)
53      REAL, INTENT(IN):: q(klon, klev) ! vapeur d'eau (kg/kg)      REAL, INTENT(IN):: q(klon, klev) ! vapeur d'eau (kg/kg)
54      REAL, INTENT(IN):: u(klon, klev), v(klon, klev) ! vitesse      REAL, INTENT(IN):: u(klon, klev), v(klon, klev) ! vitesse
55      INTEGER, INTENT(IN):: jour ! jour de l'annee en cours      INTEGER, INTENT(IN):: julien ! jour de l'annee en cours
56      REAL, intent(in):: rmu0(klon) ! cosinus de l'angle solaire zenithal          REAL, intent(in):: mu0(klon) ! cosinus de l'angle solaire zenithal    
57      REAL, INTENT(IN):: ftsol(klon, nbsrf) ! temperature du sol (en Kelvin)      REAL, INTENT(IN):: ftsol(:, :) ! (klon, nbsrf) temp\'erature du sol (en K)
58      REAL, INTENT(IN):: cdmmax, cdhmax ! seuils cdrm, cdrh      REAL, INTENT(IN):: cdmmax, cdhmax ! seuils cdrm, cdrh
59      REAL, INTENT(IN):: ksta, ksta_ter      REAL, INTENT(IN):: ksta, ksta_ter
60      LOGICAL, INTENT(IN):: ok_kzmin      LOGICAL, INTENT(IN):: ok_kzmin
# Line 67  contains Line 67  contains
67    
68      REAL, INTENT(IN):: paprs(klon, klev+1) ! pression a intercouche (Pa)      REAL, INTENT(IN):: paprs(klon, klev+1) ! pression a intercouche (Pa)
69      REAL, INTENT(IN):: pplay(klon, klev) ! pression au milieu de couche (Pa)      REAL, INTENT(IN):: pplay(klon, klev) ! pression au milieu de couche (Pa)
70      REAL, INTENT(inout):: snow(klon, nbsrf)      REAL, INTENT(inout):: fsnow(:, :) ! (klon, nbsrf) \'epaisseur neigeuse
71      REAL qsurf(klon, nbsrf)      REAL qsurf(klon, nbsrf)
72      REAL evap(klon, nbsrf)      REAL evap(klon, nbsrf)
73      REAL, intent(inout):: falbe(klon, nbsrf)      REAL, intent(inout):: falbe(klon, nbsrf)
74        REAL, intent(out):: fluxlat(:, :) ! (klon, nbsrf)
     REAL fluxlat(klon, nbsrf)  
75    
76      REAL, intent(in):: rain_fall(klon)      REAL, intent(in):: rain_fall(klon)
77      ! liquid water mass flux (kg/m2/s), positive down      ! liquid water mass flux (kg/m2/s), positive down
# Line 80  contains Line 79  contains
79      REAL, intent(in):: snow_f(klon)      REAL, intent(in):: snow_f(klon)
80      ! solid water mass flux (kg/m2/s), positive down      ! solid water mass flux (kg/m2/s), positive down
81    
82      REAL, INTENT(IN):: solsw(klon, nbsrf), sollw(klon, nbsrf)      REAL, INTENT(IN):: fsolsw(klon, nbsrf), fsollw(klon, nbsrf)
83      REAL, intent(in):: fder(klon)      REAL, intent(in):: fder(:) ! (klon)
84      REAL, INTENT(IN):: rlat(klon) ! latitude en degr\'es      REAL, intent(inout):: frugs(klon, nbsrf) ! longueur de rugosit\'e (en m)
   
     REAL, intent(inout):: rugos(klon, nbsrf) ! longueur de rugosit\'e (en m)  
   
85      real agesno(klon, nbsrf)      real agesno(klon, nbsrf)
86      REAL, INTENT(IN):: rugoro(klon)      REAL, INTENT(IN):: rugoro(klon)
87    
# Line 96  contains Line 92  contains
92      REAL, intent(out):: d_u(klon, klev), d_v(klon, klev)      REAL, intent(out):: d_u(klon, klev), d_v(klon, klev)
93      ! changement pour "u" et "v"      ! changement pour "u" et "v"
94    
95      REAL, intent(out):: d_ts(klon, nbsrf) ! le changement pour "ftsol"      REAL, intent(out):: d_ts(:, :) ! (klon, nbsrf) variation of ftsol
96    
97      REAL, intent(out):: flux_t(klon, nbsrf)      REAL, intent(out):: flux_t(klon, nbsrf)
98      ! flux de chaleur sensible (Cp T) (W/m2) (orientation positive vers      ! flux de chaleur sensible (Cp T) (W/m2) (orientation positive vers
# Line 119  contains Line 115  contains
115      REAL, intent(out):: ycoefh(klon, klev)      REAL, intent(out):: ycoefh(klon, klev)
116      REAL, intent(out):: zu1(klon)      REAL, intent(out):: zu1(klon)
117      REAL zv1(klon)      REAL zv1(klon)
118      REAL t2m(klon, nbsrf), q2m(klon, nbsrf)      REAL, INTENT(inout):: t2m(klon, nbsrf), q2m(klon, nbsrf)
119      REAL u10m(klon, nbsrf), v10m(klon, nbsrf)      REAL u10m(klon, nbsrf), v10m(klon, nbsrf)
120    
121      ! Ionela Musat cf. Anne Mathieu : planetary boundary layer, hbtm      ! Ionela Musat cf. Anne Mathieu : planetary boundary layer, hbtm
# Line 129  contains Line 125  contains
125      REAL capcl(klon, nbsrf)      REAL capcl(klon, nbsrf)
126      REAL oliqcl(klon, nbsrf)      REAL oliqcl(klon, nbsrf)
127      REAL cteicl(klon, nbsrf)      REAL cteicl(klon, nbsrf)
128      REAL pblt(klon, nbsrf)      REAL, INTENT(inout):: pblt(klon, nbsrf) ! T au nveau HCL
     ! pblT------- T au nveau HCL  
129      REAL therm(klon, nbsrf)      REAL therm(klon, nbsrf)
130      REAL trmb1(klon, nbsrf)      REAL trmb1(klon, nbsrf)
131      ! trmb1-------deep_cape      ! trmb1-------deep_cape
# Line 159  contains Line 154  contains
154      REAL ytsoil(klon, nsoilmx)      REAL ytsoil(klon, nsoilmx)
155      REAL yts(klon), yrugos(klon), ypct(klon), yz0_new(klon)      REAL yts(klon), yrugos(klon), ypct(klon), yz0_new(klon)
156      REAL yalb(klon)      REAL yalb(klon)
157    
158      REAL yu1(klon), yv1(klon)      REAL yu1(klon), yv1(klon)
159      ! on rajoute en output yu1 et yv1 qui sont les vents dans      ! On ajoute en output yu1 et yv1 qui sont les vents dans
160      ! la premiere couche      ! la premi\`ere couche.
161      REAL ysnow(klon), yqsurf(klon), yagesno(klon)      
162        REAL snow(klon), yqsurf(klon), yagesno(klon)
163    
164      real yqsol(klon)      real yqsol(klon)
165      ! column-density of water in soil, in kg m-2      ! column-density of water in soil, in kg m-2
# Line 175  contains Line 172  contains
172    
173      REAL yfder(klon)      REAL yfder(klon)
174      REAL yrugm(klon), yrads(klon), yrugoro(klon)      REAL yrugm(klon), yrads(klon), yrugoro(klon)
   
175      REAL yfluxlat(klon)      REAL yfluxlat(klon)
   
176      REAL y_d_ts(klon)      REAL y_d_ts(klon)
177      REAL y_d_t(klon, klev), y_d_q(klon, klev)      REAL y_d_t(klon, klev), y_d_q(klon, klev)
178      REAL y_d_u(klon, klev), y_d_v(klon, klev)      REAL y_d_u(klon, klev), y_d_v(klon, klev)
# Line 259  contains Line 254  contains
254      zu1 = 0.      zu1 = 0.
255      zv1 = 0.      zv1 = 0.
256      ypct = 0.      ypct = 0.
     yts = 0.  
     ysnow = 0.  
257      yqsurf = 0.      yqsurf = 0.
258      yrain_f = 0.      yrain_f = 0.
259      ysnow_f = 0.      ysnow_f = 0.
     yfder = 0.  
260      yrugos = 0.      yrugos = 0.
261      yu1 = 0.      yu1 = 0.
262      yv1 = 0.      yv1 = 0.
     yrads = 0.  
263      ypaprs = 0.      ypaprs = 0.
264      ypplay = 0.      ypplay = 0.
265      ydelp = 0.      ydelp = 0.
# Line 278  contains Line 269  contains
269      yq = 0.      yq = 0.
270      y_dflux_t = 0.      y_dflux_t = 0.
271      y_dflux_q = 0.      y_dflux_q = 0.
     ytsoil = 999999.  
272      yrugoro = 0.      yrugoro = 0.
273      d_ts = 0.      d_ts = 0.
     yfluxlat = 0.  
274      flux_t = 0.      flux_t = 0.
275      flux_q = 0.      flux_q = 0.
276      flux_u = 0.      flux_u = 0.
277      flux_v = 0.      flux_v = 0.
278        fluxlat = 0.
279      d_t = 0.      d_t = 0.
280      d_q = 0.      d_q = 0.
281      d_u = 0.      d_u = 0.
# Line 303  contains Line 293  contains
293    
294      ! Tester si c'est le moment de lire le fichier:      ! Tester si c'est le moment de lire le fichier:
295      if (mod(itap - 1, lmt_pas) == 0) then      if (mod(itap - 1, lmt_pas) == 0) then
296         CALL interfoce_lim(jour, pctsrf_new_oce, pctsrf_new_sic)         CALL interfoce_lim(julien, pctsrf_new_oce, pctsrf_new_sic)
297      endif      endif
298    
299      ! Boucler sur toutes les sous-fractions du sol:      ! Boucler sur toutes les sous-fractions du sol:
# Line 326  contains Line 316  contains
316               i = ni(j)               i = ni(j)
317               ypct(j) = pctsrf(i, nsrf)               ypct(j) = pctsrf(i, nsrf)
318               yts(j) = ftsol(i, nsrf)               yts(j) = ftsol(i, nsrf)
319               ysnow(j) = snow(i, nsrf)               snow(j) = fsnow(i, nsrf)
320               yqsurf(j) = qsurf(i, nsrf)               yqsurf(j) = qsurf(i, nsrf)
321               yalb(j) = falbe(i, nsrf)               yalb(j) = falbe(i, nsrf)
322               yrain_f(j) = rain_fall(i)               yrain_f(j) = rain_fall(i)
323               ysnow_f(j) = snow_f(i)               ysnow_f(j) = snow_f(i)
324               yagesno(j) = agesno(i, nsrf)               yagesno(j) = agesno(i, nsrf)
325               yfder(j) = fder(i)               yfder(j) = fder(i)
326               yrugos(j) = rugos(i, nsrf)               yrugos(j) = frugs(i, nsrf)
327               yrugoro(j) = rugoro(i)               yrugoro(j) = rugoro(i)
328               yu1(j) = u1lay(i)               yu1(j) = u1lay(i)
329               yv1(j) = v1lay(i)               yv1(j) = v1lay(i)
330               yrads(j) = solsw(i, nsrf) + sollw(i, nsrf)               yrads(j) = fsolsw(i, nsrf) + fsollw(i, nsrf)
331               ypaprs(j, klev+1) = paprs(i, klev+1)               ypaprs(j, klev+1) = paprs(i, klev+1)
332               y_run_off_lic_0(j) = run_off_lic_0(i)               y_run_off_lic_0(j) = run_off_lic_0(i)
333            END DO            END DO
# Line 349  contains Line 339  contains
339               yqsol = 0.               yqsol = 0.
340            END IF            END IF
341    
342            DO k = 1, nsoilmx            ytsoil(:knon, :) = ftsoil(ni(:knon), :, nsrf)
              DO j = 1, knon  
                 i = ni(j)  
                 ytsoil(j, k) = ftsoil(i, k, nsrf)  
              END DO  
           END DO  
343    
344            DO k = 1, klev            DO k = 1, klev
345               DO j = 1, knon               DO j = 1, knon
# Line 370  contains Line 355  contains
355            END DO            END DO
356    
357            ! calculer Cdrag et les coefficients d'echange            ! calculer Cdrag et les coefficients d'echange
358            CALL coefkz(nsrf, knon, ypaprs, ypplay, ksta, ksta_ter, yts, yrugos, &            CALL coefkz(nsrf, ypaprs, ypplay, ksta, ksta_ter, yts(:knon), &
359                 yu, yv, yt, yq, yqsurf, coefm(:knon, :), coefh(:knon, :))                 yrugos, yu, yv, yt, yq, yqsurf(:knon), coefm(:knon, :), &
360                   coefh(:knon, :))
361            IF (iflag_pbl == 1) THEN            IF (iflag_pbl == 1) THEN
362               CALL coefkz2(nsrf, knon, ypaprs, ypplay, yt, ycoefm0, ycoefh0)               CALL coefkz2(nsrf, knon, ypaprs, ypplay, yt, ycoefm0, ycoefh0)
363               coefm(:knon, :) = max(coefm(:knon, :), ycoefm0(:knon, :))               coefm(:knon, :) = max(coefm(:knon, :), ycoefm0(:knon, :))
# Line 446  contains Line 432  contains
432                 ypplay, ydelp, y_d_v, y_flux_v(:knon))                 ypplay, ydelp, y_d_v, y_flux_v(:knon))
433    
434            ! calculer la diffusion de "q" et de "h"            ! calculer la diffusion de "q" et de "h"
435            CALL clqh(dtime, jour, firstcal, rlat, nsrf, ni(:knon), ytsoil, &            CALL clqh(dtime, julien, firstcal, nsrf, ni(:knon), &
436                 yqsol, rmu0, yrugos, yrugoro, yu1, yv1, coefh(:knon, :), yt, &                 ytsoil(:knon, :), yqsol, mu0, yrugos, yrugoro, yu1, yv1, &
437                 yq, yts(:knon), ypaprs, ypplay, ydelp, yrads, yalb(:knon), &                 coefh(:knon, :), yt, yq, yts(:knon), ypaprs, ypplay, ydelp, &
438                 ysnow, yqsurf, yrain_f, ysnow_f, yfder, yfluxlat, &                 yrads(:knon), yalb(:knon), snow(:knon), yqsurf, yrain_f, &
439                 pctsrf_new_sic, yagesno(:knon), y_d_t, y_d_q, y_d_ts(:knon), &                 ysnow_f, yfder(:knon), yfluxlat(:knon), pctsrf_new_sic, &
440                 yz0_new, y_flux_t(:knon), y_flux_q(:knon), y_dflux_t, &                 yagesno(:knon), y_d_t, y_d_q, y_d_ts(:knon), yz0_new, &
441                 y_dflux_q, y_fqcalving, y_ffonte, y_run_off_lic_0)                 y_flux_t(:knon), y_flux_q(:knon), y_dflux_t(:knon), &
442                   y_dflux_q(:knon), y_fqcalving, y_ffonte, y_run_off_lic_0)
443    
444            ! calculer la longueur de rugosite sur ocean            ! calculer la longueur de rugosite sur ocean
445            yrugm = 0.            yrugm = 0.
# Line 482  contains Line 469  contains
469               END DO               END DO
470            END DO            END DO
471    
472            DO j = 1, knon            flux_t(ni(:knon), nsrf) = y_flux_t(:knon)
473               i = ni(j)            flux_q(ni(:knon), nsrf) = y_flux_q(:knon)
474               flux_t(i, nsrf) = y_flux_t(j)            flux_u(ni(:knon), nsrf) = y_flux_u(:knon)
475               flux_q(i, nsrf) = y_flux_q(j)            flux_v(ni(:knon), nsrf) = y_flux_v(:knon)
              flux_u(i, nsrf) = y_flux_u(j)  
              flux_v(i, nsrf) = y_flux_v(j)  
           END DO  
476    
477            evap(:, nsrf) = -flux_q(:, nsrf)            evap(:, nsrf) = -flux_q(:, nsrf)
478    
479            falbe(:, nsrf) = 0.            falbe(:, nsrf) = 0.
480            snow(:, nsrf) = 0.            fsnow(:, nsrf) = 0.
481            qsurf(:, nsrf) = 0.            qsurf(:, nsrf) = 0.
482            rugos(:, nsrf) = 0.            frugs(:, nsrf) = 0.
           fluxlat(:, nsrf) = 0.  
483            DO j = 1, knon            DO j = 1, knon
484               i = ni(j)               i = ni(j)
485               d_ts(i, nsrf) = y_d_ts(j)               d_ts(i, nsrf) = y_d_ts(j)
486               falbe(i, nsrf) = yalb(j)               falbe(i, nsrf) = yalb(j)
487               snow(i, nsrf) = ysnow(j)               fsnow(i, nsrf) = snow(j)
488               qsurf(i, nsrf) = yqsurf(j)               qsurf(i, nsrf) = yqsurf(j)
489               rugos(i, nsrf) = yz0_new(j)               frugs(i, nsrf) = yz0_new(j)
490               fluxlat(i, nsrf) = yfluxlat(j)               fluxlat(i, nsrf) = yfluxlat(j)
491               IF (nsrf == is_oce) THEN               IF (nsrf == is_oce) THEN
492                  rugmer(i) = yrugm(j)                  rugmer(i) = yrugm(j)
493                  rugos(i, nsrf) = yrugm(j)                  frugs(i, nsrf) = yrugm(j)
494               END IF               END IF
495               agesno(i, nsrf) = yagesno(j)               agesno(i, nsrf) = yagesno(j)
496               fqcalving(i, nsrf) = y_fqcalving(j)               fqcalving(i, nsrf) = y_fqcalving(j)
# Line 529  contains Line 512  contains
512            END IF            END IF
513    
514            ftsoil(:, :, nsrf) = 0.            ftsoil(:, :, nsrf) = 0.
515            DO k = 1, nsoilmx            ftsoil(ni(:knon), :, nsrf) = ytsoil(:knon, :)
              DO j = 1, knon  
                 i = ni(j)  
                 ftsoil(i, k, nsrf) = ytsoil(j, k)  
              END DO  
           END DO  
516    
517            DO j = 1, knon            DO j = 1, knon
518               i = ni(j)               i = ni(j)
# Line 560  contains Line 538  contains
538               tairsol(j) = yts(j) + y_d_ts(j)               tairsol(j) = yts(j) + y_d_ts(j)
539               rugo1(j) = yrugos(j)               rugo1(j) = yrugos(j)
540               IF (nsrf == is_oce) THEN               IF (nsrf == is_oce) THEN
541                  rugo1(j) = rugos(i, nsrf)                  rugo1(j) = frugs(i, nsrf)
542               END IF               END IF
543               psfce(j) = ypaprs(j, 1)               psfce(j) = ypaprs(j, 1)
544               patm(j) = ypplay(j, 1)               patm(j) = ypplay(j, 1)
# Line 580  contains Line 558  contains
558               ! u10m, v10m : composantes du vent a 10m sans spirale de Ekman               ! u10m, v10m : composantes du vent a 10m sans spirale de Ekman
559               u10m(i, nsrf) = (yu10m(j)*uzon(j))/sqrt(uzon(j)**2+vmer(j)**2)               u10m(i, nsrf) = (yu10m(j)*uzon(j))/sqrt(uzon(j)**2+vmer(j)**2)
560               v10m(i, nsrf) = (yu10m(j)*vmer(j))/sqrt(uzon(j)**2+vmer(j)**2)               v10m(i, nsrf) = (yu10m(j)*vmer(j))/sqrt(uzon(j)**2+vmer(j)**2)
   
561            END DO            END DO
562    
563            CALL hbtm(ypaprs, ypplay, yt2m, yq2m, yustar, y_flux_t(:knon), &            CALL hbtm(ypaprs, ypplay, yt2m, yq2m, yustar, y_flux_t(:knon), &
# Line 607  contains Line 584  contains
584                  q2(i, k, nsrf) = yq2(j, k)                  q2(i, k, nsrf) = yq2(j, k)
585               END DO               END DO
586            END DO            END DO
587           else
588              fsnow(:, nsrf) = 0.
589         end IF if_knon         end IF if_knon
590      END DO loop_surface      END DO loop_surface
591    
592      ! On utilise les nouvelles surfaces      ! On utilise les nouvelles surfaces
593      rugos(:, is_oce) = rugmer      frugs(:, is_oce) = rugmer
594      pctsrf(:, is_oce) = pctsrf_new_oce      pctsrf(:, is_oce) = pctsrf_new_oce
595      pctsrf(:, is_sic) = pctsrf_new_sic      pctsrf(:, is_sic) = pctsrf_new_sic
596    

Legend:
Removed from v.207  
changed lines
  Added in v.222

  ViewVC Help
Powered by ViewVC 1.1.21