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

Last change on this file since 5218 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
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.