SURFEX v8.1
General documentation of Surfex
pack_grid_gauss.F90
Go to the documentation of this file.
1 !SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier
2 !SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence
3 !SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
4 !SFX_LIC for details. version 1.
5 !##############################################################
6 SUBROUTINE pack_grid_gauss(KMASK_SIZE,KMASK,KGRID_PAR1,PGRID_PAR1,KGRID_PAR2,OPACK,PGRID_PAR2)
7 !##############################################################
8 !
9 !!**** *PACK_GRID_GAUSS* packs the grid definition vector
10 !!
11 !! PURPOSE
12 !! -------
13 !!
14 !! METHOD
15 !! ------
16 !!
17 !! REFERENCE
18 !! ---------
19 !!
20 !! AUTHOR
21 !! ------
22 !!
23 !! V. Masson Meteo-France
24 !!
25 !! MODIFICATION
26 !! ------------
27 !!
28 !! Original 03/2004
29 !! (B. Decharme) 2008 pack mesh area
30 !----------------------------------------------------------------------------
31 !
32 !* 0. DECLARATION
33 ! -----------
34 !
37 !
38 !
39 USE yomhook ,ONLY : lhook, dr_hook
40 USE parkind1 ,ONLY : jprb
41 !
42 IMPLICIT NONE
43 !
44 !* 0.1 Declaration of arguments
45 ! ------------------------
46 !
47 INTEGER, INTENT(IN) :: KMASK_SIZE ! size of mask
48 INTEGER, DIMENSION(KMASK_SIZE), INTENT(IN) :: KMASK ! mask used
49 INTEGER, INTENT(IN) :: KGRID_PAR1 ! size of input grid vector
50 REAL, DIMENSION(KGRID_PAR1), INTENT(IN) :: PGRID_PAR1 ! parameters of input grid
51 INTEGER, INTENT(INOUT) :: KGRID_PAR2 ! size of output grid vector
52 LOGICAL, INTENT(IN) :: OPACK ! flag to pack the grid vector
53 REAL, DIMENSION(KGRID_PAR2), INTENT(OUT) :: PGRID_PAR2 ! parameters of output grid
54 !
55 !* 0.2 Declaration of other local variables
56 ! ------------------------------------
57 !
58 INTEGER :: INLATI ! number of pseudo-latitudes
59 REAL :: ZLAPO ! latitude of the rotated pole (deg)
60 REAL :: ZLOPO ! longitude of the rotated pole (deg)
61 REAL :: ZCODIL ! stretching factor (must be greater than or equal to 1)
62 INTEGER, DIMENSION(:), ALLOCATABLE :: INLOPA ! number of pseudo-longitudes on each
63  ! pseudo-latitude circle
64 !
65 REAL, DIMENSION(:), ALLOCATABLE :: ZLAT1 ! latitude of all grid points
66 REAL, DIMENSION(:), ALLOCATABLE :: ZLON1 ! longitude of all grid points
67 REAL, DIMENSION(:), ALLOCATABLE :: ZLAT2 ! latitude of subset of grid points
68 REAL, DIMENSION(:), ALLOCATABLE :: ZLON2 ! longitude of subset of grid points
69 REAL, DIMENSION(:), ALLOCATABLE :: ZLAT_XY1 ! pseudo-latitude of all grid points
70 REAL, DIMENSION(:), ALLOCATABLE :: ZLON_XY1 ! pseudo-longitude of all grid points
71 REAL, DIMENSION(:), ALLOCATABLE :: ZLAT_XY2 ! pseudo-latitude of subset of grid points
72 REAL, DIMENSION(:), ALLOCATABLE :: ZLON_XY2 ! pseudo-longitude of subset of grid points
73 REAL, DIMENSION(:), ALLOCATABLE :: ZMESH_SIZE1!
74 REAL, DIMENSION(:), ALLOCATABLE :: ZMESH_SIZE2!
75 ! _____ Sup
76 REAL, DIMENSION(:), ALLOCATABLE :: ZLATSUP1 ! Grid corner Latitude | |
77 REAL, DIMENSION(:), ALLOCATABLE :: ZLONSUP1 ! Grid corner Longitude | |
78 REAL, DIMENSION(:), ALLOCATABLE :: ZLATINF1 ! Grid corner Latitude |_____|
79 REAL, DIMENSION(:), ALLOCATABLE :: ZLONINF1 ! Grid corner Longitude Inf
80 ! _____ Sup
81 REAL, DIMENSION(:), ALLOCATABLE :: ZLATSUP2 ! Grid corner Latitude | |
82 REAL, DIMENSION(:), ALLOCATABLE :: ZLONSUP2 ! Grid corner Longitude | |
83 REAL, DIMENSION(:), ALLOCATABLE :: ZLATINF2 ! Grid corner Latitude |_____|
84 REAL, DIMENSION(:), ALLOCATABLE :: ZLONINF2 ! Grid corner Longitude Inf
85 !
86 INTEGER :: IL ! total number of points
87 
88 REAL, DIMENSION(:), POINTER :: ZGRID_PAR2 ! parameters of output grid
89 REAL(KIND=JPRB) :: ZHOOK_HANDLE
90 !----------------------------------------------------------------------------
91 !
92 IF (lhook) CALL dr_hook('PACK_GRID_GAUSS',0,zhook_handle)
93 !
94 !* 1. Computes grid parameters
95 ! ------------------------
96 !
97  CALL get_gridtype_gauss(pgrid_par1,inlati,kl=il)
98 !
99 ALLOCATE(inlopa(inlati))
100 ALLOCATE(zlat_xy1(il))
101 ALLOCATE(zlon_xy1(il))
102 ALLOCATE(zlat1(il))
103 ALLOCATE(zlon1(il))
104 ALLOCATE(zmesh_size1(il))
105 ALLOCATE(zloninf1(il))
106 ALLOCATE(zlatinf1(il))
107 ALLOCATE(zlonsup1(il))
108 ALLOCATE(zlatsup1(il))
109 !
110  CALL get_gridtype_gauss(pgrid_par1,inlati,zlapo,zlopo,zcodil,inlopa(:), &
111  il,zlat1,zlon1,zlat_xy1,zlon_xy1,zmesh_size1 , &
112  zloninf1,zlatinf1,zlonsup1,zlatsup1 )
113 !
114 !----------------------------------------------------------------------------
115 !
116 !* 2. Packs latitude and longitude arrays
117 ! -----------------------------------
118 !
119 !
120 ALLOCATE(zlat_xy2(kmask_size))
121 ALLOCATE(zlon_xy2(kmask_size))
122 ALLOCATE(zlat2(kmask_size))
123 ALLOCATE(zlon2(kmask_size))
124 ALLOCATE(zmesh_size2(kmask_size))
125 ALLOCATE(zloninf2(kmask_size))
126 ALLOCATE(zlatinf2(kmask_size))
127 ALLOCATE(zlonsup2(kmask_size))
128 ALLOCATE(zlatsup2(kmask_size))
129 !
130  CALL pack_same_rank(kmask,zlat_xy1,zlat_xy2)
131  CALL pack_same_rank(kmask,zlon_xy1,zlon_xy2)
132  CALL pack_same_rank(kmask,zlat1,zlat2)
133  CALL pack_same_rank(kmask,zlon1,zlon2)
134  CALL pack_same_rank(kmask,zmesh_size1,zmesh_size2)
135  CALL pack_same_rank(kmask,zloninf1,zloninf2)
136  CALL pack_same_rank(kmask,zlatinf1,zlatinf2)
137  CALL pack_same_rank(kmask,zlonsup1,zlonsup2)
138  CALL pack_same_rank(kmask,zlatsup1,zlatsup2)
139 !
140 DEALLOCATE(zlat_xy1 )
141 DEALLOCATE(zlon_xy1 )
142 DEALLOCATE(zlat1 )
143 DEALLOCATE(zlon1 )
144 DEALLOCATE(zmesh_size1)
145 DEALLOCATE(zloninf1 )
146 DEALLOCATE(zlatinf1 )
147 DEALLOCATE(zlonsup1 )
148 DEALLOCATE(zlatsup1 )
149 !
150 !----------------------------------------------------------------------------
151 !
152 !* 3. Stores data in new grid vector
153 ! ------------------------------
154 !
155  CALL put_gridtype_gauss(zgrid_par2,inlati,zlapo,zlopo,zcodil,inlopa(:), &
156  kmask_size,zlat2,zlon2,zlat_xy2,zlon_xy2, &
157  zmesh_size2,zloninf2,zlatinf2,zlonsup2,zlatsup2 )
158 !
159 DEALLOCATE(zlat_xy2 )
160 DEALLOCATE(zlon_xy2 )
161 DEALLOCATE(zlat2 )
162 DEALLOCATE(zlon2 )
163 DEALLOCATE(zmesh_size2)
164 DEALLOCATE(zloninf2 )
165 DEALLOCATE(zlatinf2 )
166 DEALLOCATE(zlonsup2 )
167 DEALLOCATE(zlatsup2 )
168 
169 !----------------------------------------------------------------------------
170 !
171 IF (opack) THEN
172  pgrid_par2(:) = zgrid_par2(:)
173 ELSE
174  kgrid_par2 = SIZE(zgrid_par2(:))
175 END IF
176 !
177 DEALLOCATE(zgrid_par2)
178 DEALLOCATE(inlopa)
179 IF (lhook) CALL dr_hook('PACK_GRID_GAUSS',1,zhook_handle)
180 !-------------------------------------------------------------------------------
181 !
182 END SUBROUTINE pack_grid_gauss
integer, parameter jprb
Definition: parkind1.F90:32
logical lhook
Definition: yomhook.F90:15
subroutine get_gridtype_gauss(PGRID_PAR, KNLATI, PLAPO, PLOPO, PCODIL, KNLOPA, KL, PLAT, PLON, PLAT_XY, PLON_XY, PMESH_SIZE, PLONINF, PLATINF, PLONSUP, PLATSUP)
subroutine put_gridtype_gauss(PGRID_PAR, KNLATI, PLAPO, PLOPO, PCODIL, KNLOPA, KL, PLAT, PLON, PLAT_XY, PLON_XY, PMESH_SIZE, PLONINF, PLATINF, PLONSUP, PLATSUP)
subroutine pack_grid_gauss(KMASK_SIZE, KMASK, KGRID_PAR1, PGRID_PAR1, KGRID_PAR2, OPACK, PGRID_PAR2)