source: LMDZ6/trunk/libf/phylmd/plevel_new.F90 @ 5233

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