source: LMDZ6/branches/Amaury_dev/libf/phylmd/plevel_new.F90 @ 5157

Last change on this file since 5157 was 5117, checked in by abarral, 2 months ago

rename modules properly lmdz_*
move some unused files to obsolete/
(lint) uppercase fortran keywords

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