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

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