source: LMDZ6/branches/Amaury_dev/libf/phylmd/plevel.F90 @ 5116

Last change on this file since 5116 was 5105, checked in by abarral, 4 months ago

Replace 1DUTILS.h by module lmdz_1dutils.f90
Replace 1DConv.h by module lmdz_old_1dconv.f90 (it's only used by old_* files)
Convert *.F to *.f90
Fix gradsdef.h formatting
Remove unnecessary "RETURN" at the end of functions/subroutines

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