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

Last change on this file since 5219 was 5084, checked in by Laurent Fairhead, 12 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
Line 
1
2! $Header$
3
4! ================================================================
5! ================================================================
6SUBROUTINE plevel(ilon, ilev, lnew, pgcm, pres, qgcm, qpres)
7  ! ================================================================
8  ! ================================================================
9  USE netcdf
10  USE dimphy
11#ifdef CPP_IOIPSL
12  USE phys_state_var_mod, ONLY: missing_val_nf90
13#endif
14  USE wxios, ONLY: missing_val_xios => missing_val, using_xios
15  IMPLICIT NONE
16
17  ! ================================================================
18
19  ! Interpoler des champs 3-D u, v et g du modele a un niveau de
20  ! pression donnee (pres)
21
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
29
30  ! ================================================================
31
32  ! arguments :
33  ! -----------
34
35  INTEGER ilon, ilev
36  LOGICAL lnew
37
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
59! REAL missing_val
60  REAL :: missing_val
61
62! missing_val = nf90_fill_real
63  IF (using_xios) THEN
64    missing_val = missing_val_xios
65  ELSE
66    missing_val=missing_val_nf90
67  ENDIF
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
94      DO i = 1, klon
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
103
104    ! Interpolation lineaire:
105
106    DO i = 1, klon
107      ! interpolation en logarithme de pression:
108
109      ! ...   Modif . P. Le Van    ( 20/01/98) ....
110      ! Modif Fr��ic Hourdin (3/01/02)
111
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
115
116
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.