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

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

[continued & end] replace netcdf by lmdz_netcdf.F90 wrapper
"use netcdf" is now only used in lmdz_netcdf.F90 (except ecrad and obsolete/)
<include "netcdf.inc"> is now likewise only used in lmdz_netcdf.F90.

systematically specify explicitely <USE lmdz_netcdf, ONLY:> (probably left some missing, to correct later on)

Further replacement of nf_put_* by nf90_put_* (same for _get_)

[minor] replace deprecated boolean operators along the way

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