source: LMDZ6/trunk/libf/phylmd/plevel.F90 @ 5133

Last change on this file since 5133 was 5084, checked in by Laurent Fairhead, 17 months ago

Reverting to r4065. Updating fortran standard broke too much stuff. Will do it by smaller chunks
AB, LF

  • Property copyright set to
    Name of program: LMDZ
    Creation date: 1984
    Version: LMDZ5
    License: CeCILL version 2
    Holder: Laboratoire de m\'et\'eorologie dynamique, CNRS, UMR 8539
    See the license file in the root directory
  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 3.5 KB
RevLine 
[1992]1
[524]2! $Header$
3
[1992]4! ================================================================
5! ================================================================
6SUBROUTINE plevel(ilon, ilev, lnew, pgcm, pres, qgcm, qpres)
7  ! ================================================================
8  ! ================================================================
[5084]9  USE netcdf
[1992]10  USE dimphy
[2271]11#ifdef CPP_IOIPSL
12  USE phys_state_var_mod, ONLY: missing_val_nf90
13#endif
[4619]14  USE wxios, ONLY: missing_val_xios => missing_val, using_xios
[1992]15  IMPLICIT NONE
[524]16
[1992]17  ! ================================================================
[524]18
[1992]19  ! Interpoler des champs 3-D u, v et g du modele a un niveau de
20  ! pression donnee (pres)
[524]21
[1992]22  ! INPUT:  ilon ----- nombre de points
23  ! ilev ----- nombre de couches
24  ! lnew ----- true si on doit reinitialiser les poids
25  ! pgcm ----- pressions modeles
26  ! pres ----- pression vers laquelle on interpolle
27  ! Qgcm ----- champ GCM
28  ! Qpres ---- champ interpolle au niveau pres
[524]29
[1992]30  ! ================================================================
[524]31
[1992]32  ! arguments :
33  ! -----------
[524]34
[1992]35  INTEGER ilon, ilev
36  LOGICAL lnew
[524]37
[1992]38  REAL pgcm(ilon, ilev)
39  REAL qgcm(ilon, ilev)
40  REAL pres
41  REAL qpres(ilon)
42
43  ! local :
44  ! -------
45
46  ! ym      INTEGER lt(klon), lb(klon)
47  ! ym      REAL ptop, pbot, aist(klon), aisb(klon)
48
49  ! ym      save lt,lb,ptop,pbot,aist,aisb
50  INTEGER, ALLOCATABLE, SAVE, DIMENSION (:) :: lt, lb
51  REAL, ALLOCATABLE, SAVE, DIMENSION (:) :: aist, aisb
52  !$OMP THREADPRIVATE(lt,lb,aist,aisb)
53  REAL, SAVE :: ptop, pbot
54  !$OMP THREADPRIVATE(ptop, pbot)
55  LOGICAL, SAVE :: first = .TRUE.
56  !$OMP THREADPRIVATE(first)
57  INTEGER i, k
58
[2271]59! REAL missing_val
60  REAL :: missing_val
[1992]61
[2271]62! missing_val = nf90_fill_real
[4619]63  IF (using_xios) THEN
64    missing_val = missing_val_xios
65  ELSE
66    missing_val=missing_val_nf90
67  ENDIF
[1992]68
69  IF (first) THEN
70    ALLOCATE (lt(klon), lb(klon), aist(klon), aisb(klon))
71    first = .FALSE.
72  END IF
73
74  ! =====================================================================
75  IF (lnew) THEN
76    ! on r�nitialise les r�ndicages et les poids
77    ! =====================================================================
78
79
80    ! Chercher les 2 couches les plus proches du niveau a obtenir
81
82    ! Eventuellement, faire l'extrapolation a partir des deux couches
83    ! les plus basses ou les deux couches les plus hautes:
84    DO i = 1, klon
85      IF (abs(pres-pgcm(i,ilev))<abs(pres-pgcm(i,1))) THEN
86        lt(i) = ilev ! 2
87        lb(i) = ilev - 1 ! 1
88      ELSE
89        lt(i) = 2
90        lb(i) = 1
91      END IF
92    END DO
93    DO k = 1, ilev - 1
[524]94      DO i = 1, klon
[1992]95        pbot = pgcm(i, k)
96        ptop = pgcm(i, k+1)
97        IF (ptop<=pres .AND. pbot>=pres) THEN
98          lt(i) = k + 1
99          lb(i) = k
100        END IF
101      END DO
102    END DO
[524]103
[1992]104    ! Interpolation lineaire:
[524]105
[1992]106    DO i = 1, klon
107      ! interpolation en logarithme de pression:
[524]108
[1992]109      ! ...   Modif . P. Le Van    ( 20/01/98) ....
110      ! Modif Fr��ic Hourdin (3/01/02)
[524]111
[1992]112      aist(i) = log(pgcm(i,lb(i))/pres)/log(pgcm(i,lb(i))/pgcm(i,lt(i)))
113      aisb(i) = log(pres/pgcm(i,lt(i)))/log(pgcm(i,lb(i))/pgcm(i,lt(i)))
114    END DO
[524]115
116
[1992]117  END IF ! lnew
118
119  ! ======================================================================
120  ! inteprollation
121  ! ======================================================================
122
123  DO i = 1, klon
124    qpres(i) = qgcm(i, lb(i))*aisb(i) + qgcm(i, lt(i))*aist(i)
125  END DO
126
127  ! Je mets les vents a zero quand je rencontre une montagne
128  DO i = 1, klon
129    IF (pgcm(i,1)<pres) THEN
130      qpres(i) = missing_val
131    END IF
132  END DO
133
134
135  RETURN
136END SUBROUTINE plevel
Note: See TracBrowser for help on using the repository browser.