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

Last change on this file was 5160, checked in by abarral, 3 months 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
RevLine 
[5160]1MODULE lmdz_plevel_new
2  IMPLICIT NONE; PRIVATE
3  PUBLIC plevel_new
4CONTAINS
[1090]5
[5160]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
[1090]10
[5160]11    IMPLICIT NONE
[2271]12
[5160]13    ! ================================================================
[1090]14
[5160]15    ! Interpoler des champs 3-D u, v et g du modele a un niveau de
16    ! pression donnee (pres)
[1090]17
[5160]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
[1090]25
[5160]26    ! ================================================================
[1090]27
[5160]28    ! arguments :
29    ! -----------
[1090]30
[5160]31    INTEGER ilon, ilev, klevstd
32    LOGICAL lnew
[1279]33
[5160]34    REAL pgcm(ilon, ilev)
35    REAL qgcm(ilon, ilev)
36    REAL pres(klevstd)
37    REAL qpres(ilon, klevstd)
[1090]38
[5160]39    ! local :
40    ! -------
[1090]41
[5160]42    ! ym      INTEGER lt(klon), lb(klon)
43    ! ym      REAL ptop, pbot, aist(klon), aisb(klon)
[1090]44
[5160]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
[1090]55
[5160]56    REAL :: missing_val
[1992]57
[5160]58    IF (using_xios) THEN
59      missing_val = missing_val_xios
60    ELSE
61      missing_val = missing_val_nf90
62    ENDIF
[1992]63
[5160]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
[1992]69
70    ! =====================================================================
[5160]71    IF (lnew) THEN
72      ! on reinitialise les reindicages et les poids
73      ! =====================================================================
[1992]74
75
[5160]76      ! Chercher les 2 couches les plus proches du niveau a obtenir
[1992]77
[5160]78      ! Eventuellement, faire l'extrapolation a partir des deux couches
79      ! les plus basses ou les deux couches les plus hautes:
[1992]80
[5160]81      DO nlev = 1, klevstd
[1992]82        DO i = 1, klon
[5160]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
[1992]89          END IF
90        END DO
[5160]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
[1992]101
[5160]102        ! Interpolation lineaire:
103        DO i = 1, klon
104          ! interpolation en logarithme de pression:
[1992]105
[5160]106          ! ...   Modif . P. Le Van    ( 20/01/98) ....
107          ! Modif Frederic Hourdin (3/01/02)
[1992]108
[5160]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
[1992]114      END DO
115
[5160]116    END IF ! lnew
[1992]117
[5160]118    ! ======================================================================
119    ! inteprollation
120    ! ET je mets les vents a zero quand je rencontre une montagne
121    ! ======================================================================
[1992]122
[5160]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
[1992]132    END DO
133
[5160]134  END SUBROUTINE plevel_new
135END MODULE lmdz_plevel_new
Note: See TracBrowser for help on using the repository browser.