Changeset 2574 for LMDZ5


Ignore:
Timestamp:
Jun 15, 2016, 1:26:59 PM (8 years ago)
Author:
fhourdin
Message:

Bug fixing

Location:
LMDZ5/trunk/libf/phylmd
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • LMDZ5/trunk/libf/phylmd/phys_local_var_mod.F90

    r2561 r2574  
    408408      allocate(t_seri(klon,klev),q_seri(klon,klev),ql_seri(klon,klev),qs_seri(klon,klev))
    409409      allocate(u_seri(klon,klev),v_seri(klon,klev))
    410       allocate(l_mixmin(klon,klev,nbsrf), l_mix(klon,klev,nbtr))
     410      allocate(l_mixmin(klon,klev,nbsrf), l_mix(klon,klev,nbsrf))
     411      l_mix(:,:,:)=0. ; l_mixmin(:,:,:)=0. ! doit etre initialse car pas toujours remplis
    411412
    412413      allocate(tr_seri(klon,klev,nbtr))
  • LMDZ5/trunk/libf/phylmd/yamada4.F90

    r2573 r2574  
    212212! initialize arrays:
    213213
    214   m2(:, :) = 0.0
    215   sm(:, :) = 0.0
    216   rif(:, :) = 0.0
     214  m2(1:ngrid, :) = 0.0
     215  sm(1:ngrid, :) = 0.0
     216  rif(1:ngrid, :) = 0.0
    217217
    218218!------------------------------------------------------------
     
    264264 
    265265    DO k = 2, klev
    266       q2(:, k) = l(:, k)**2*zz(:, k)
     266      q2(1:ngrid, k) = l(1:ngrid, k)**2*zz(1:ngrid, k)
    267267    END DO
    268268
     
    349349
    350350    DO k = 2, klev - 1
    351       km(:, k) = l(:, k)*sqrt(q2(:,k))*sm(:, k)
    352       q2(:, k) = q2(:, k) + dt*km(:, k)*m2(:, k)*(1.-rif(:,k))
    353       q2(:, k) = min(max(q2(:,k),1.E-10), 1.E4)
    354       q2(:, k) = 1./(1./sqrt(q2(:,k))+dt/(2*l(:,k)*b1))
    355       q2(:, k) = q2(:, k)*q2(:, k)
     351      km(1:ngrid, k) = l(1:ngrid, k)*sqrt(q2(1:ngrid,k))*sm(1:ngrid, k)
     352      q2(1:ngrid, k) = q2(1:ngrid, k) + dt*km(1:ngrid, k)*m2(1:ngrid, k)*(1.-rif(1:ngrid,k))
     353      q2(1:ngrid, k) = min(max(q2(1:ngrid,k),1.E-10), 1.E4)
     354      q2(1:ngrid, k) = 1./(1./sqrt(q2(1:ngrid,k))+dt/(2*l(1:ngrid,k)*b1))
     355      q2(1:ngrid, k) = q2(1:ngrid, k)*q2(1:ngrid, k)
    356356    END DO
    357357
     
    392392
    393393  IF (iflag_pbl>=12) THEN
    394     q2(:, 1) = q2(:, 2)
     394    q2(1:ngrid, 1) = q2(1:ngrid, 2)
    395395    CALL vdif_q2(dt, g, rconst, ngrid, plev, temp, kq, q2)
    396396  END IF
     
    803803 famorti(zzzz, zh_oro, zhlim)=(-1.)*ATAN((zzzz-zh_oro)/(zhlim-zh_oro))*2./3.1416+1.   
    804804
    805 
    806  
    807 
     805  IF (ngrid==0) RETURN
    808806
    809807  IF (firstcall) THEN
     
    811809    firstcall = .FALSE.
    812810  END IF
    813 
    814811
    815812
     
    853850    !......................................................................
    854851
    855     l0(:) = 150.
     852    l0(1:ngrid) = 150.
    856853    DO k = 2, klev
    857854      DO ig = 1, ngrid
     
    868865!=================================================================================
    869866
    870    l2(:,:)=0.0
    871    l_mixmin(:,:,nsrf)=0.
    872    l_mix(:,:,nsrf)=0.
     867   l2(1:ngrid,:)=0.0
     868   l_mixmin(1:ngrid,:,nsrf)=0.
     869   l_mix(1:ngrid,:,nsrf)=0.
    873870
    874871   IF (nsrf .EQ. 1) THEN
     
    877874!--------------
    878875
    879   extent=2.                                                         ! On ??tend l'impact du relief jusqu'?? extent*h, extent >1. 
    880   lmax=150.                                                         ! Longueur de m??lange max dans l'absolu
     876     extent=2.                                                         ! On ??tend l'impact du relief jusqu'?? extent*h, extent >1. 
     877     lmax=150.                                                         ! Longueur de m??lange max dans l'absolu
    881878
    882879! calculs
    883880!---------
    884881
    885   DO ig=1,ngrid
     882     DO ig=1,ngrid
    886883
    887884      ! On calcule la hauteur du relief
    888885      !.................................
    889 
    890886      ! On ne peut pas prendre zstd seulement pour caracteriser le relief sous maille
    891887      ! car sur un terrain pentu mais sans relief, zstd est non nul (comme en Antarctique, C. Genthon)
    892888      ! On corrige donc zstd avec l'ecart type de l'altitude dans la maille sans relief
    893889      ! (en gros, une maille de taille xcell avec une pente constante zstdslope)
    894  
    895 
    896890      jg=ni(ig)
    897  
    898891!     IF (zsig(jg) .EQ. 0.) THEN
    899892!          zstdslope(ig)=0.         
     
    907900      h_oro(ig)=zstd(jg)
    908901      hlim(ig)=extent*h_oro(ig)     
    909 
    910      
    911 
    912 
    913    END DO
    914 
    915   l2limit(1:ngrid)=0.
    916 
    917   DO k=2,klev
    918    DO ig=1,ngrid
    919  
    920       winds(ig,k)=sqrt(u(ig,k)**2+v(ig,k)**2)
    921 
    922       IF (zlev(ig,k) .LE. h_oro(ig)) THEN                                     ! Si on est sous l'orographie
    923 
    924 
    925       l2strat= kapb*pbl_lmixmin_alpha*winds(ig,k)/sqrt(max(n2(ig,k),1.E-10))              ! si stratifi??, amplitude d'oscillation * kappab (voir Van de Wiel et al 2008)
    926                                                
    927       l2neutre=kap*zlev(ig,k)*h_oro(ig)/(kap*zlev(ig,k)+h_oro(ig))            ! Dans le cas neutre, formule de blackadar qui tend asymptotiquement vers h
    928       l2neutre=MIN(l2neutre,lmax)                                             ! On majore par lmax
    929       l2limit(ig)=MIN(l2neutre,l2strat)                                       ! Calcule de l2 (minimum de la longueur en cas neutre et celle en situation stratifi??e)
    930      
    931       l2(ig,k)=l2limit(ig)
     902     ENDDO
     903
     904     l2limit(1:ngrid)=0.
     905
     906     DO k=2,klev
     907        DO ig=1,ngrid
     908           winds(ig,k)=sqrt(u(ig,k)**2+v(ig,k)**2)
     909           IF (zlev(ig,k) .LE. h_oro(ig)) THEN  ! sous l'orographie
     910              l2strat= kapb*pbl_lmixmin_alpha*winds(ig,k)/sqrt(max(n2(ig,k),1.E-10))  ! si stratifi??, amplitude d'oscillation * kappab (voir Van de Wiel et al 2008)
     911              l2neutre=kap*zlev(ig,k)*h_oro(ig)/(kap*zlev(ig,k)+h_oro(ig))            ! Dans le cas neutre, formule de blackadar. tend asymptotiquement vers h
     912              l2neutre=MIN(l2neutre,lmax)                                             ! On majore par lmax
     913              l2limit(ig)=MIN(l2neutre,l2strat)                                       ! Calcule de l2 (minimum de la longueur en cas neutre et celle en situation stratifi??e)
     914              l2(ig,k)=l2limit(ig)
    932915                                     
    933       ELSE IF (zlev(ig,k) .LE. hlim(ig)) THEN ! Si on est au dessus des montagnes, mais affect?? encore par elles
     916           ELSE IF (zlev(ig,k) .LE. hlim(ig)) THEN ! Si on est au dessus des montagnes, mais affect?? encore par elles
    934917
    935918      ! Au dessus des montagnes, on prend la l2limit au sommet des montagnes
    936919      ! (la derni??re calcul??e dans la boucle k, vu que k est un indice croissant avec z)
    937920      ! et on multiplie l2limit par une fonction qui d??croit entre h et hlim
    938 
    939          l2(ig,k)=l2limit(ig)*famorti(zlev(ig,k),h_oro(ig), hlim(ig))
    940 
    941      
    942       ELSE                                                                    ! Au dessus de extent*h, on prend l2=l0
    943 
    944       l2(ig,k)=0.
    945 
    946 
    947       END IF
    948        
    949     END DO
    950   END DO
    951 
    952 
    953  END IF                                                                        ! pbl_lmixmin_alpha
     921              l2(ig,k)=l2limit(ig)*famorti(zlev(ig,k),h_oro(ig), hlim(ig))
     922           ELSE                                                                    ! Au dessus de extent*h, on prend l2=l0
     923              l2(ig,k)=0.
     924           END IF
     925        ENDDO
     926     ENDDO
     927   ENDIF                                                                        ! pbl_lmixmin_alpha
    954928
    955929!==================================================================================
     
    961935 DO k=2,klev
    962936    DO ig=1,ngrid
    963 
    964    lmix(ig,k)=MAX(MAX(l1(ig,k), l2(ig,k)),lmixmin)
    965 
    966    END DO
    967  END DO
     937       lmix(ig,k)=MAX(MAX(l1(ig,k), l2(ig,k)),lmixmin)
     938   ENDDO
     939 ENDDO
     940
     941! Diagnostics
    968942
    969943 DO k=2,klev
    970   DO ig=1,ngrid
    971    jg=ni(ig)
    972    l_mix(jg,k,nsrf)=lmix(ig,k)
    973    l_mixmin(jg,k,nsrf)=l2(ig,k)
    974   ENDDO
     944    DO ig=1,ngrid
     945       jg=ni(ig)
     946       l_mix(jg,k,nsrf)=lmix(ig,k)
     947       l_mixmin(jg,k,nsrf)=l2(ig,k)
     948    ENDDO
    975949 ENDDO
    976   DO ig=1,ngrid
    977    jg=ni(ig)
    978       l_mix(jg,1,nsrf)=hlim(ig)
    979   ENDDO
     950 DO ig=1,ngrid
     951    jg=ni(ig)
     952    l_mix(jg,1,nsrf)=hlim(ig)
     953 ENDDO
    980954
    981955
Note: See TracChangeset for help on using the changeset viewer.