Changeset 1418 for LMDZ4/trunk


Ignore:
Timestamp:
Jul 19, 2010, 5:11:24 PM (14 years ago)
Author:
jghattas
Message:

Following bug corrections are already done at branch LMDZ4_AR5 rev
1417,1416 :

Bug corrections for nudged run (pres2lev.F90, guide_p_mod.F90) :

  • now the results are the same for sequentiel and parallel mode(if adjust=n and compiled with vsafe at mercure).
  • the results are the same as the sequential mode in previous revision.
  • test done only with guide_u=y,guide_v=y
  • copied optimized version of pres2lev.F90 from dyn3dpar to dyn3d


Added condition read_climoz for the variable O3daySTD(calcul_STDlev.h,
undefSTD.F)

Corrected bug in calculation of the diagnostic variable ec550aer
"Extinction at 550nm" (aeropt_5wv.F90) (Maria Raffaella Vuolo, LSCE)

Added stop if use_filtre_fft=y with dyn3d (conf_gcm.F) : this option is
not implemented in dyn3d.

Location:
LMDZ4/trunk/libf
Files:
6 edited
1 moved

Legend:

Unmodified
Added
Removed
  • LMDZ4/trunk/libf/dyn3d/conf_gcm.F

    r1403 r1418  
    5454      LOGICAL  fxyhypbb, ysinuss
    5555      INTEGER i
    56      
     56      LOGICAL use_filtre_fft
    5757c
    5858c  -------------------------------------------------------------------
     
    795795      CALL getin('ok_dyn_ave',ok_dyn_ave)
    796796
     797!Config  Key  = use_filtre_fft
     798!Config  Desc = flag d'activation des FFT pour le filtre
     799!Config  Def  = false
     800!Config  Help = permet d'activer l'utilisation des FFT pour effectuer
     801!Config         le filtrage aux poles.
     802! Le filtre fft n'est pas implemente dans dyn3d
     803      use_filtre_fft=.FALSE.
     804      CALL getin('use_filtre_fft',use_filtre_fft)
     805
     806      IF (use_filtre_fft) THEN
     807        write(lunout,*)'STOP !!!'
     808        write(lunout,*)'use_filtre_fft n est pas implemente dans dyn3d'
     809        STOP
     810      ENDIF
     811     
    797812!Config key = ok_strato
    798813!Config  Desc = activation de la version strato
  • LMDZ4/trunk/libf/dyn3d/pres2lev.F90

    r1417 r1418  
    11! $Id$
    22!
    3 c******************************************************
    4       SUBROUTINE   pres2lev(varo,varn,lmo,lmn,po,pn,
    5      %                      ni,nj,ok_invertp)
    6 c
    7 c interpolation lineaire pour passer
    8 c a une nouvelle discretisation verticale pour
    9 c les variables de GCM
    10 c Francois Forget (01/1995)
    11 c MOdif remy roca 12/97 pour passer de pres2sig
    12 c Modif F.Codron 07/08 po en 3D
    13 c**********************************************************
     3!******************************************************
     4SUBROUTINE pres2lev(varo,varn,lmo,lmn,po,pn,ni,nj,ok_invertp)
     5!
     6! interpolation lineaire pour passer
     7! a une nouvelle discretisation verticale pour
     8! les variables de GCM
     9! Francois Forget (01/1995)
     10! MOdif remy roca 12/97 pour passer de pres2sig
     11! Modif F.Codron 07/08 po en 3D
     12!**********************************************************
    1413
    15       IMPLICIT NONE
     14  IMPLICIT NONE
    1615
    17 c   Declarations:
    18 c ==============
    19 c
    20 c  ARGUMENTS
    21 c  """""""""
    22        LOGICAL, INTENT(IN) :: ok_invertp
    23        INTEGER, INTENT(IN) :: lmo ! dimensions ancienne couches
    24        INTEGER, INTENT(IN) :: lmn ! dimensions nouvelle couches
    25        INTEGER lmomx ! dimensions ancienne couches
    26        INTEGER lmnmx ! dimensions nouvelle couches
     16!   Declarations:
     17! ==============
     18!
     19!  ARGUMENTS
     20!  """""""""
     21  LOGICAL, INTENT(IN) :: ok_invertp
     22  INTEGER, INTENT(IN) :: lmo ! dimensions ancienne couches
     23  INTEGER, INTENT(IN) :: lmn ! dimensions nouvelle couches
     24 
     25  REAL, INTENT(IN) :: po(ni*nj,lmo) ! niveau de pression ancienne grille
     26  REAL, INTENT(IN) :: pn(ni*nj,lmn) ! niveau de pression nouvelle grille
    2727
    28        parameter(lmomx=10000,lmnmx=10000)
     28  INTEGER, INTENT(IN) :: ni,nj ! nombre de point horizontal
    2929
    30         real, INTENT(IN) :: po(ni,nj,lmo) ! niveau de pression ancienne grille
    31         real, INTENT(IN) :: pn(ni,nj,lmn) ! niveau de pression nouvelle grille
     30  REAL, INTENT(IN)  :: varo(ni*nj,lmo) ! var dans l'ancienne grille
     31  REAL, INTENT(OUT) :: varn(ni*nj,lmn) ! var dans la nouvelle grille
    3232
    33        INTEGER, INTENT(IN) :: ni,nj ! nombre de point horizontale
     33  REAL :: zvaro(ni*nj,lmo),zpo(ni*nj,lmo)
    3434
    35        REAL, INTENT(IN)  :: varo(ni,nj,lmo) ! var dans l'ancienne grille
    36        REAL, INTENT(OUT) :: varn(ni,nj,lmn) ! var dans la nouvelle grille
     35! Autres variables
     36! """"""""""""""""
     37  INTEGER ::  ln ,lo, k
     38  REAL    :: coef
    3739
    38        real zvaro(lmomx),zpo(lmomx)
    3940
    40 c Autres variables
    41 c """"""""""""""""
    42        INTEGER n, ln ,lo, i, j, Nhoriz
    43        REAL coef
     41! Inversion de l'ordre des niveaux verticaux
     42  IF (ok_invertp) THEN
     43    DO lo=1,lmo
     44      DO k=1,ni*nj
     45        zpo(k,lo)=po(k,lmo+1-lo)
     46        zvaro(k,lo)=varo(k,lmo+1-lo)
     47      ENDDO
     48    ENDDO
     49  ELSE
     50    DO lo=1,lmo
     51      DO k=1,ni*nj
     52        zpo(k,lo)=po(k,lo)
     53        zvaro(k,lo)=varo(k,lo)
     54      ENDDO
     55    ENDDO
     56  ENDIF
    4457
    45 c run
    46 c ====
    47         do i=1,ni
    48         do j=1,nj
    49 ! Inversion de l'ordre des niveaux verticaux
    50           IF (ok_invertp) THEN
    51            do lo=1,lmo
    52               zpo(lo)=po(i,j,lmo+1-lo)
    53               zvaro(lo)=varo(i,j,lmo+1-lo)
    54            enddo
    55           ELSE
    56            do lo=1,lmo
    57               zpo(lo)=po(i,j,lo)
    58               zvaro(lo)=varo(i,j,lo)
    59            enddo
    60           ENDIF
     58  DO ln=1,lmn
     59    DO lo=1,lmo-1
     60      DO k=1,ni*nj
     61        IF (pn(k,ln) >= zpo(k,1) ) THEN
     62          varn(k,ln) = zvaro(k,1)
     63        ELSE IF (pn(k,ln) <= zpo(k,lmo)) THEN
     64          varn(k,ln) = zvaro(k,lmo)
     65        ELSE IF ( pn(k,ln) <= zpo(k,lo) .AND. pn(k,ln) > zpo(k,lo+1) ) THEN
     66          coef = (pn(k,ln)-zpo(k,lo)) / (zpo(k,lo+1)-zpo(k,lo))
     67          varn(k,ln) = zvaro(k,lo) + coef*(zvaro(k,lo+1)-zvaro(k,lo))
     68        ENDIF
     69         
     70      ENDDO 
     71    ENDDO
     72  ENDDO               
    6173
    62            do ln=1,lmn
    63               if (pn(i,j,ln).ge.zpo(1))then
    64                  varn(i,j,ln) =  zvaro(1)
    65               else if (pn(i,j,ln).le.zpo(lmo)) then
    66                  varn(i,j,ln) =  zvaro(lmo)
    67               else
    68                  do lo=1,lmo-1
    69                     if ( (pn(i,j,ln).le.zpo(lo)).and.
    70      &                 (pn(i,j,ln).gt.zpo(lo+1)) )then
    71                        coef=(pn(i,j,ln)-zpo(lo))
    72      &                 /(zpo(lo+1)-zpo(lo))
    73                        varn(i,j,ln)=zvaro(lo)
    74      &                 +coef*(zvaro(lo+1)-zvaro(lo))
    75 c       print*,'pn(',ln,')=',pn(i,j,ln),varn(i,j,ln)
    76                     end if
    77                  enddo           
    78               endif
    79            enddo
    80 
    81         enddo
    82         enddo
    83       return
    84       end   
     74END SUBROUTINE pres2lev   
  • LMDZ4/trunk/libf/dyn3dpar/guide_p_mod.F90

    r1403 r1418  
    390390              stop
    391391          ELSE
    392               IF (guide_v) vnat1(jjb_v:jje_v,:,:)=vnat2(jjb_v:jje_v,:,:)
    393               IF (guide_u) unat1(jjb_u:jje_u,:,:)=unat2(jjb_u:jje_u,:,:)
    394               IF (guide_T) tnat1(jjb_u:jje_u,:,:)=tnat2(jjb_u:jje_u,:,:)
    395               IF (guide_Q) qnat1(jjb_u:jje_u,:,:)=qnat2(jjb_u:jje_u,:,:)
    396               IF (guide_P.OR.guide_modele) psnat1(jjb_u:jje_u,:)=psnat2(jjb_u:jje_u,:)
     392              IF (guide_v) vnat1(:,jjb_v:jje_v,:)=vnat2(:,jjb_v:jje_v,:)
     393              IF (guide_u) unat1(:,jjb_u:jje_u,:)=unat2(:,jjb_u:jje_u,:)
     394              IF (guide_T) tnat1(:,jjb_u:jje_u,:)=tnat2(:,jjb_u:jje_u,:)
     395              IF (guide_Q) qnat1(:,jjb_u:jje_u,:)=qnat2(:,jjb_u:jje_u,:)
     396              IF (guide_P.OR.guide_modele) psnat1(:,jjb_u:jje_u)=psnat2(:,jjb_u:jje_u)
    397397              step_rea=step_rea+1
    398398              itau_test=itau
  • LMDZ4/trunk/libf/dyn3dpar/pres2lev.F90

    r1345 r1418  
    6060      DO k=1,ni*nj
    6161        IF (pn(k,ln) >= zpo(k,1) ) THEN
    62           varn(k,ln) = varo(k,1)
     62          varn(k,ln) = zvaro(k,1)
    6363        ELSE IF (pn(k,ln) <= zpo(k,lmo)) THEN
    6464          varn(k,ln) = zvaro(k,lmo)
  • LMDZ4/trunk/libf/phylmd/aeropt_5wv.F90

    r1337 r1418  
    850850!  ENDDO
    851851
    852    DO i=1, klon
    853       od550aer(i)=SUM(tausum(i,2,:))
    854       od865aer(i)=SUM(tausum(i,5,:))
    855       DO k=1, KLEV
    856          ec550aer(i,k)=SUM(tau(i,k,2,:))/dh(i,k)
    857       END DO   
    858    END DO
     852  DO i=1, klon
     853     od550aer(i)=0.
     854     DO m=1,naero_spc
     855        od550aer(i)=od550aer(i)+tausum(i,2,m)
     856     END DO
     857  END DO
     858  DO i=1, klon
     859     od865aer(i)=0.
     860     DO m=1,naero_spc
     861        od865aer(i)=od865aer(i)+tausum(i,5,m)
     862     END DO
     863  END DO
     864  DO i=1, klon
     865     DO k=1, KLEV
     866        ec550aer(i,k)=0.
     867        DO m=1,naero_spc
     868           ec550aer(i,k)=ec550aer(i,k)+tau(i,k,2,m)/dh(i,k)
     869        END DO
     870     END DO
     871  END DO
     872 
    859873   od550lt1aer(:)=tausum(:,2,id_ASSO4M)+tausum(:,2,id_ASBCM)+tausum(:,2,id_AIBCM)+ &
    860874        tausum(:,2,id_ASPOMM)+tausum(:,2,id_AIPOMM)+tausum(:,2,id_ASSSM)+ &
  • LMDZ4/trunk/libf/phylmd/calcul_STDlev.h

    r1398 r1418  
    128128cIM on somme les valeurs toutes les freq_calNMC secondes
    129129c
    130        CALL undefSTD(itap,freq_calNMC)
     130       CALL undefSTD(itap,freq_calNMC, read_climoz)
    131131c
    132132cIM on moyenne a la fin du mois ou du jour (toutes les freq_outNMC secondes)
  • LMDZ4/trunk/libf/phylmd/undefSTD.F

    r1403 r1418  
    22! $Id$
    33!
    4       SUBROUTINE undefSTD(itap,freq_calNMC)
     4      SUBROUTINE undefSTD(itap,freq_calNMC, read_climoz)
    55      USE netcdf
    66      USE dimphy
     
    4343      INTEGER i, k, n
    4444      REAL freq_calNMC(nout)
     45      INTEGER read_climoz
    4546c
    4647c variables Output
     
    8586           T2sumSTD(i,k,n)=T2sumSTD(i,k,n)+T2STD(i,k)
    8687           O3sumSTD(i,k,n)=O3sumSTD(i,k,n)+O3STD(i,k)
    87            O3daysumSTD(i,k,n)=O3daysumSTD(i,k,n)+O3daySTD(i,k)
     88           IF (read_climoz==2)
     89     &          O3daysumSTD(i,k,n)=O3daysumSTD(i,k,n)+O3daySTD(i,k)
     90
    8891          ENDIF
    8992         ENDDO !i
Note: See TracChangeset for help on using the changeset viewer.