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

Last change on this file since 5134 was 5084, checked in by Laurent Fairhead, 5 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.