source: LMDZ6/trunk/libf/phylmd/plevel_new.f90 @ 5452

Last change on this file since 5452 was 5310, checked in by abarral, 2 months ago

unify abort_gcm
rename wxios -> wxios_mod

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