SURFEX  V8_0
Surfex V8_0 release
 All Classes Files Functions Variables
pack_pgd.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_pgd (DTCO, U, &
7  hprogram, hsurf, &
8  hgrid, pgrid_par, &
9  ocover, pcover, pzs, &
10  plat, plon, pmesh_size, pdir )
11 ! ##############################################################
12 !
13 !!**** *PACK_PGD* packs ISBA physiographic fields from all surface points to ISBA points
14 !!
15 !! PURPOSE
16 !! -------
17 !!
18 !! METHOD
19 !! ------
20 !!
21 !
22 !! EXTERNAL
23 !! --------
24 !!
25 !! IMPLICIT ARGUMENTS
26 !! ------------------
27 !!
28 !! REFERENCE
29 !! ---------
30 !!
31 !! AUTHOR
32 !! ------
33 !!
34 !! V. Masson Meteo-France
35 !!
36 !! MODIFICATION
37 !! ------------
38 !!
39 !! Original 03/2004
40 !! Escobar J. 08/02/2005 : bug declare ILU local variable
41 !!
42 !----------------------------------------------------------------------------
43 !
44 !* 0. DECLARATION
45 ! -----------
46 !
47 !
48 !
49 !
51 USE modd_surf_atm_n, ONLY : surf_atm_t
52 !
53 USE modd_pgd_grid, ONLY : nl, cgrid, xgrid_par
54 !
55 USE modd_data_cover_par, ONLY : jpcover
56 !
57 USE modi_get_cover_n
58 USE modi_get_lcover_n
59 USE modi_get_zs_n
61 USE modi_pack_grid
62 USE modi_latlon_grid
63 !
64 !
65 USE yomhook ,ONLY : lhook, dr_hook
66 USE parkind1 ,ONLY : jprb
67 !
68 USE modi_get_surf_mask_n
69 !
70 USE modi_get_type_dim_n
71 !
72 USE modi_get_luout
73 IMPLICIT NONE
74 !
75 !* 0.1 Declaration of arguments
76 ! ------------------------
77 !
78 !
79 TYPE(data_cover_t), INTENT(INOUT) :: dtco
80 TYPE(surf_atm_t), INTENT(INOUT) :: u
81 !
82  CHARACTER(LEN=6), INTENT(IN) :: hprogram ! Type of program
83  CHARACTER(LEN=6), INTENT(IN) :: hsurf ! surface type
84 !
85  CHARACTER(LEN=10), INTENT(OUT):: hgrid ! grid used
86 REAL, DIMENSION(:), POINTER :: pgrid_par ! grid definition
87 LOGICAL, DIMENSION(:), INTENT(OUT):: ocover ! list of present cover
88 REAL, DIMENSION(:,:), POINTER :: pcover ! cover fraction
89 REAL, DIMENSION(:), INTENT(OUT):: pzs ! zs
90 REAL, DIMENSION(:), INTENT(OUT):: plat ! latitude
91 REAL, DIMENSION(:), INTENT(OUT):: plon ! longitude
92 REAL, DIMENSION(:), INTENT(OUT):: pmesh_size! mesh size
93 REAL, DIMENSION(:), INTENT(OUT), OPTIONAL :: pdir ! angle of grid axis with N.
94 !
95 !
96 !* 0.2 Declaration of local variables
97 ! ------------------------------
98 !
99 INTEGER :: iluout ! output listing logical unit
100 INTEGER :: il ! number of points
101 INTEGER :: ilu ! expected physical size of full surface array
102 INTEGER :: jcover
103 INTEGER, DIMENSION(:), POINTER :: imask ! mask for packing from complete field to nature field
104 REAL, DIMENSION(SIZE(PLAT)) :: zdir
105 !
106 REAL, DIMENSION(NL) :: zcover ! cover on all surface points
107 LOGICAL, DIMENSION(JPCOVER) :: gcover ! list of existing cover
108 REAL, DIMENSION(NL) :: zzs ! zs on all surface points
109 REAL(KIND=JPRB) :: zhook_handle
110 !-------------------------------------------------------------------------------
111 !
112 IF (lhook) CALL dr_hook('PACK_PGD',0,zhook_handle)
113  CALL get_luout(hprogram,iluout)
114 !
115 !* 1. Number of points and packing
116 ! ----------------------------
117 !
118  CALL get_type_dim_n(dtco, u, &
119  hsurf,il)
120 ALLOCATE(imask(il))
121 ilu=0
122  CALL get_surf_mask_n(dtco, u, &
123  hsurf,il,imask,ilu,iluout)
124 !
125 !-------------------------------------------------------------------------------
126 !
127 !* 2. Packing of grid
128 ! ---------------
129 !
130  CALL pack_grid(imask,cgrid,hgrid,xgrid_par,pgrid_par)
131 !
132 !-------------------------------------------------------------------------------
133 !
134 !* 3. Computes geographical quantities
135 ! --------------------------------
136 !
137  CALL latlon_grid(hgrid,SIZE(pgrid_par),il,iluout,pgrid_par,plat,plon,pmesh_size,zdir)
138 !
139 IF (present(pdir)) pdir = zdir
140 !
141 !-------------------------------------------------------------------------------
142 !
143 !* 4. Packing of fields
144 ! -----------------
145 !
146  CALL get_lcover_n(u, &
147  hprogram,jpcover,gcover)
148 !
149 ALLOCATE(pcover(SIZE(plat),count(gcover)))
150 !
151 DO jcover=1,count(gcover)
152  CALL get_cover_n(u, &
153  hprogram,jcover,zcover)
154  CALL pack_same_rank(imask,zcover(:),pcover(:,jcover))
155 ENDDO
156 
157  CALL get_zs_n(u, &
158  hprogram,nl,zzs)
159 !
160 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
161 !
162 ocover=gcover
163 !
164 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
165 !
166  CALL pack_same_rank(imask,zzs(:),pzs(:))
167 !
168 !-------------------------------------------------------------------------------
169 !
170 DEALLOCATE(imask)
171 IF (lhook) CALL dr_hook('PACK_PGD',1,zhook_handle)
172 !
173 !-------------------------------------------------------------------------------
174 !
175 END SUBROUTINE pack_pgd
subroutine get_type_dim_n(DTCO, U, HTYPE, KDIM)
subroutine pack_pgd(DTCO, U, HPROGRAM, HSURF, HGRID, PGRID_PAR, OCOVER, PCOVER, PZS, PLAT, PLON, PMESH_SIZE, PDIR)
Definition: pack_pgd.F90:6
subroutine latlon_grid(HGRID, KGRID_PAR, KL, KLUOUT, PGRID_PAR, PLAT, PLON, PMESH_SIZE, PDIR)
Definition: latlon_grid.F90:6
subroutine get_surf_mask_n(DTCO, U, HTYPE, KDIM, KMASK, KLU, KLUOUT)
subroutine get_lcover_n(U, HPROGRAM, KCOVER, OCOVER)
Definition: get_lcovern.F90:6
subroutine get_cover_n(U, HPROGRAM, KCOVER, PCOVER)
Definition: get_covern.F90:6
subroutine pack_grid(KMASK, HGRID1, HGRID2, PGRID_PAR1, PGRID_PAR2)
Definition: pack_grid.F90:6
subroutine get_luout(HPROGRAM, KLUOUT)
Definition: get_luout.F90:6
subroutine get_zs_n(U, HPROGRAM, KI, PZS)
Definition: get_zsn.F90:6