source: LMDZ6/trunk/libf/phylmd/plevel_new.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
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 netcdf
11  USE dimphy
12  USE phys_state_var_mod, ONLY: missing_val_nf90
13  USE wxios, ONLY: missing_val_xios=>missing_val, using_xios
14
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, klevstd
36  LOGICAL lnew
37
38  REAL pgcm(ilon, ilev)
39  REAL qgcm(ilon, ilev)
40  REAL pres(klevstd)
41  REAL qpres(ilon, klevstd)
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  INTEGER :: nlev
57  !$OMP THREADPRIVATE(first)
58  INTEGER i, k
59
60  REAL :: missing_val
61
62  IF (using_xios) THEN
63    missing_val=missing_val_xios
64  ELSE
65    missing_val=missing_val_nf90
66  ENDIF
67
68  IF (first) THEN
69    ALLOCATE (lt(klon,klevstd), lb(klon,klevstd))
70    ALLOCATE (aist(klon,klevstd), aisb(klon,klevstd))
71    first = .FALSE.
72  END IF
73
74  ! =====================================================================
75  IF (lnew) THEN
76    ! on reinitialise les reindicages 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
85
86    DO nlev = 1, klevstd
87      DO i = 1, klon
88        IF (abs(pres(nlev)-pgcm(i,ilev))<abs(pres(nlev)-pgcm(i,1))) THEN
89          lt(i, nlev) = ilev ! 2
90          lb(i, nlev) = ilev - 1 ! 1
91        ELSE
92          lt(i, nlev) = 2
93          lb(i, nlev) = 1
94        END IF
95      END DO
96      DO k = 1, ilev - 1
97        DO i = 1, klon
98          pbot = pgcm(i, k)
99          ptop = pgcm(i, k+1)
100          IF (ptop<=pres(nlev) .AND. pbot>=pres(nlev)) THEN
101            lt(i, nlev) = k + 1
102            lb(i, nlev) = k
103          END IF
104        END DO
105      END DO
106
107      ! Interpolation lineaire:
108      DO i = 1, klon
109        ! interpolation en logarithme de pression:
110
111        ! ...   Modif . P. Le Van    ( 20/01/98) ....
112        ! Modif Frederic Hourdin (3/01/02)
113
114        aist(i, nlev) = log(pgcm(i,lb(i,nlev))/pres(nlev))/log(pgcm(i,lb(i, &
115          nlev))/pgcm(i,lt(i,nlev)))
116        aisb(i, nlev) = log(pres(nlev)/pgcm(i,lt(i,nlev)))/log(pgcm(i,lb(i, &
117          nlev))/pgcm(i,lt(i,nlev)))
118      END DO
119    END DO
120
121  END IF ! lnew
122
123  ! ======================================================================
124  ! inteprollation
125  ! ET je mets les vents a zero quand je rencontre une montagne
126  ! ======================================================================
127
128  DO nlev = 1, klevstd
129    DO i = 1, klon
130      IF (pgcm(i,1)<pres(nlev)) THEN
131        qpres(i, nlev) = missing_val
132      ELSE
133        qpres(i, nlev) = qgcm(i, lb(i,nlev))*aisb(i, nlev) + &
134          qgcm(i, lt(i,nlev))*aist(i, nlev)
135      END IF
136    END DO
137  END DO
138
139
140  RETURN
141END SUBROUTINE plevel_new
Note: See TracBrowser for help on using the repository browser.