source: LMDZ6/branches/Amaury_dev/libf/phylmd/lmdz_plevel_new.f90 @ 5209

Last change on this file since 5209 was 5160, checked in by abarral, 7 weeks ago

Put .h into modules

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