SURFEX  V8_0
Surfex V8_0 release
 All Classes Files Functions Variables
grid_modif_cartesian.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 grid_modif_cartesian(KLUOUT,KLUNAM,KGRID_PAR,KL,PGRID_PAR, &
7  kgrid_par2,kl2,omodif,pgrid_par2 )
8 ! ################################################################
9 !
10 !!**** *GRID_MODIF_CARTESIAN* - routine to read in namelist the horizontal grid
11 !!
12 !! PURPOSE
13 !! -------
14 !!
15 !!** METHOD
16 !! ------
17 !!
18 !! EXTERNAL
19 !! --------
20 !!
21 !!
22 !! IMPLICIT ARGUMENTS
23 !! ------------------
24 !!
25 !! REFERENCE
26 !! ---------
27 !!
28 !!
29 !! AUTHOR
30 !! ------
31 !! V. Masson *Meteo France*
32 !!
33 !! MODIFICATIONS
34 !! -------------
35 !! Original 01/2004
36 !-------------------------------------------------------------------------------
37 !
38 !* 0. DECLARATIONS
39 ! ------------
40 !
41 USE modd_surf_par, ONLY : nundef
42 
43 USE mode_pos_surf
45 !
46 !
47 USE yomhook ,ONLY : lhook, dr_hook
48 USE parkind1 ,ONLY : jprb
49 !
50 USE modi_regular_grid_spawn
51 !
52 IMPLICIT NONE
53 !
54 !* 0.1 Declarations of arguments
55 ! -------------------------
56 !
57 INTEGER, INTENT(IN) :: kluout ! output listing logical unit
58 INTEGER, INTENT(IN) :: klunam ! namelist file logical unit
59 INTEGER, INTENT(IN) :: kl ! number of points
60 INTEGER, INTENT(IN) :: kgrid_par ! size of PGRID_PAR
61 REAL, DIMENSION(KGRID_PAR), INTENT(IN) :: pgrid_par ! parameters defining the grid
62 INTEGER, INTENT(INOUT) :: kl2 ! number of points in modified grid
63 INTEGER, INTENT(INOUT) :: kgrid_par2 ! size of PGRID_PAR2
64 LOGICAL, INTENT(IN) :: omodif ! flag to modify the grid
65 REAL, DIMENSION(KGRID_PAR2), INTENT(OUT) :: pgrid_par2 ! parameters defining the modified grid
66 !
67 !* 0.2 Declarations of local variables
68 ! -------------------------------
69 !
70 !* initial grid
71 REAL :: zlat0 ! reference latitude
72 REAL :: zlon0 ! reference longitude
73 INTEGER :: iimax1 ! number of points in I direction
74 INTEGER :: ijmax1 ! number of points in J direction
75 REAL, DIMENSION(:), ALLOCATABLE :: zx1 ! X conformal coordinate of grid mesh
76 REAL, DIMENSION(:), ALLOCATABLE :: zy1 ! Y conformal coordinate of grid mesh
77 REAL, DIMENSION(:), ALLOCATABLE :: zdx1 ! X grid mesh size
78 REAL, DIMENSION(:), ALLOCATABLE :: zdy1 ! Y grid mesh size
79 !
80 !* new grid
81 INTEGER :: iimax2 ! number of points in I direction
82 INTEGER :: ijmax2 ! number of points in J direction
83 REAL, DIMENSION(:), ALLOCATABLE :: zx2 ! X conformal coordinate of grid mesh
84 REAL, DIMENSION(:), ALLOCATABLE :: zy2 ! Y conformal coordinate of grid mesh
85 REAL, DIMENSION(:), ALLOCATABLE :: zdx2 ! X grid mesh size
86 REAL, DIMENSION(:), ALLOCATABLE :: zdy2 ! Y grid mesh size
87 !
88 !* other variables
89 LOGICAL :: gfound
90 REAL, DIMENSION(:), POINTER :: zgrid_par
91 !
92 !
93 !* 0.3 Declarations of namelist
94 ! ------------------------
95 !
96 INTEGER :: ixor = 1 ! position of modified bottom left point
97 INTEGER :: iyor = 1 ! according to initial grid
98 INTEGER :: ixsize = -999 ! number of grid meshes in initial grid to be
99 INTEGER :: iysize = -999 ! covered by the modified grid
100 INTEGER :: idxratio = 1 ! resolution ratio between modified grid
101 INTEGER :: idyratio = 1 ! and initial grid
102 REAL(KIND=JPRB) :: zhook_handle
103 !
104 !
105 namelist/nam_inifile_cartesian/ixor,iyor,ixsize,iysize,idxratio,idyratio
106 !
107 !------------------------------------------------------------------------------
108 !
109 !* 1. Reading of projection parameters
110 ! --------------------------------
111 !
112 IF (lhook) CALL dr_hook('GRID_MODIF_CARTESIAN',0,zhook_handle)
113  CALL posnam(klunam,'NAM_INIFILE_CARTESIAN',gfound,kluout)
114 IF (gfound) READ(unit=klunam,nml=nam_inifile_cartesian)
115 !
116 !---------------------------------------------------------------------------
117 !
118 !* 2. All this information stored into pointer PGRID_PAR
119 ! --------------------------------------------------
120 !
121 ALLOCATE(zx1(kl))
122 ALLOCATE(zy1(kl))
123 ALLOCATE(zdx1(kl))
124 ALLOCATE(zdy1(kl))
125 !
126  CALL get_gridtype_cartesian(pgrid_par,zlat0,zlon0, &
127  iimax1,ijmax1, &
128  zx1,zy1,zdx1,zdy1 )
129 !
130 !---------------------------------------------------------------------------
131 !
132 !* 3. Default : no modification
133 ! -------------------------
134 !
135 IF (ixsize==-999) ixsize=iimax1
136 IF (iysize==-999) iysize=ijmax1
137 !
138 !---------------------------------------------------------------------------
139 !
140 !* 4. Modification of the grid
141 ! ------------------------
142 !
143 !* number of points
144 !
145 iimax2=ixsize*idxratio
146 ijmax2=iysize*idyratio
147 !
148 kl2 = iimax2 * ijmax2
149 !
150 ALLOCATE(zx2(iimax2*ijmax2))
151 ALLOCATE(zy2(iimax2*ijmax2))
152 ALLOCATE(zdx2(iimax2*ijmax2))
153 ALLOCATE(zdy2(iimax2*ijmax2))
154 !
155  CALL regular_grid_spawn(kluout, &
156  kl, iimax1,ijmax1,zx1,zy1,zdx1,zdy1, &
157  ixor, iyor, idxratio, idyratio, &
158  ixsize, iysize, &
159  kl2, iimax2,ijmax2,zx2,zy2,zdx2,zdy2 )
160 DEALLOCATE(zx1)
161 DEALLOCATE(zy1)
162 DEALLOCATE(zdx1)
163 DEALLOCATE(zdy1)
164 !---------------------------------------------------------------------------
165 !
166 !* 5. All this information stored into pointer PGRID_PAR
167 ! --------------------------------------------------
168 !
169  CALL put_gridtype_cartesian(zgrid_par,zlat0,zlon0, &
170  iimax2,ijmax2, &
171  zx2,zy2,zdx2,zdy2 )
172 !
173 !---------------------------------------------------------------------------
174 DEALLOCATE(zx2)
175 DEALLOCATE(zy2)
176 DEALLOCATE(zdx2)
177 DEALLOCATE(zdy2)
178 !---------------------------------------------------------------------------
179 !
180 !* 1st call : initializes dimension
181 !
182 IF (kgrid_par2==0) THEN
183  kgrid_par2 = SIZE(zgrid_par)
184 !
185 ELSE
186 !
187 !* 2nd call : initializes grid array
188 !
189  pgrid_par2(:) = 0.
190  pgrid_par2(:) = zgrid_par
191 END IF
192 !
193 DEALLOCATE(zgrid_par)
194 IF (lhook) CALL dr_hook('GRID_MODIF_CARTESIAN',1,zhook_handle)
195 !
196 !---------------------------------------------------------------------------
197 !
198 END SUBROUTINE grid_modif_cartesian
subroutine regular_grid_spawn(KLUOUT, KL1, KIMAX1, KJMAX1, PX1, PY1, PDX1, PDY1, KXOR, KYOR, KDXRATIO, KDYRATIO, KXSIZE, KYSIZE, KL2, KIMAX2, KJMAX2, PX2, PY2, PDX2, PDY2)
subroutine put_gridtype_cartesian(PGRID_PAR, PLAT0, PLON0, KIMAX, KJMAX, PX, PY, PDX, PDY)
subroutine grid_modif_cartesian(KLUOUT, KLUNAM, KGRID_PAR, KL, PGRID_PAR, KGRID_PAR2, KL2, OMODIF, PGRID_PAR2)
subroutine posnam(KULNAM, HDNAML, OFOUND, KLUOUT)
subroutine get_gridtype_cartesian(PGRID_PAR, PLAT0, PLON0, KIMAX, KJMAX, PX, PY, PDX, PDY, KL)