SURFEX  V8_0
Surfex V8_0 release
 All Classes Files Functions Variables
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
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 get_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)