source: LMDZ6/trunk/libf/phylmd/plevel.f90 @ 5300

Last change on this file since 5300 was 5268, checked in by abarral, 6 weeks ago

.f90 <-> .F90 depending on cpp key use

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