SURFEX v8.1
General documentation of Surfex
ol_write_proj.F90
Go to the documentation of this file.
1 SUBROUTINE ol_write_proj(HSELECT, KFILE_ID, UG)
2 !
4 !
6 !
7 USE modd_csts, ONLY : xpi
8 !
9 USE modi_def_var_netcdf
10 USE modi_abor1_sfx
11 !
19 !
20 USE yomhook ,ONLY : lhook, dr_hook
21 USE parkind1 ,ONLY : jprb
22 !
23 USE netcdf
24 !
25 IMPLICIT NONE
26 !
27  CHARACTER(LEN=*), DIMENSION(:), INTENT(IN) :: HSELECT
28 INTEGER, INTENT(IN) :: KFILE_ID
29 TYPE(surf_atm_grid_t), INTENT(INOUT) :: UG
30 !
31  CHARACTER(LEN=100), DIMENSION(1) :: YATT_TITLE3
32  CHARACTER(LEN=100), DIMENSION(11) :: YATT_TITLE2
33  CHARACTER(LEN=100), DIMENSION(3) :: YATT_TITLE, YATT
34  CHARACTER(LEN=100) :: YCOMMENT
35 REAL, DIMENSION(11) :: ZATT
36 REAL, DIMENSION(1,2) :: ZATT2D
37 !
38 REAL, DIMENSION(:), ALLOCATABLE :: ZLATP, ZLATP2
39 REAL, DIMENSION(:), ALLOCATABLE :: ZDX, ZDY, ZX, ZY
40 !
41 REAL, DIMENSION(2) :: ZLAT2
42 REAL, DIMENSION(1) :: ZLAT1, ZLON1, ZX1, ZY1, ZX2, ZY2
43 REAL :: ZLAT0, ZLON0, ZX0, ZY0, ZRPK, ZBETA, ZLATOR, ZLONOR, ZSIN, &
44  ZLONCEN, ZLATCEN, ZCODIL, ZRESX, ZRESY, ZLONMIN, ZLONMAX, &
45  ZLATMIN, ZLATMAX, ZDX0, ZDY0
46 !
47 INTEGER, DIMENSION(:), ALLOCATABLE :: INLOPA
48 INTEGER, DIMENSION(1) :: IDIMID1
49 INTEGER, DIMENSION(0) :: IDIMID
50 INTEGER :: ILAMBERT, IL, IRESP, IVAR_ID, IIMAX, IJMAX, JJ, INLATI
51 INTEGER :: IIL, IIH, IJL, IJH, JRET, ICPT, ISIZE
52 !
53 REAL(KIND=JPRB) :: ZHOOK_HANDLE
54 !
55 IF (lhook) CALL dr_hook('OL_WRITE_PROJ',0,zhook_handle)
56 !
57 yatt_title(1) = "grid_mapping_name"
58 !
59 SELECT CASE(ug%G%CGRID)
60 
61  CASE ("CONF PROJ ")
62 
63  CALL get_gridtype_conf_proj(ug%XGRID_FULL_PAR,kl=il,kimax=iimax,kjmax=ijmax)
64  ALLOCATE(zx(il),zy(il))
65  ALLOCATE(zdx(il),zdy(il))
66  CALL get_gridtype_conf_proj(ug%XGRID_FULL_PAR,zlat0,zlon0,zrpk,zbeta,zlator,zlonor,&
67  px=zx,py=zy,pdx=zdx,pdy=zdy)
68 
69  zresx = zdx(1)
70  zresy = zdy(1)
71  DEALLOCATE(zdx,zdy)
72 
73  IF ( abs(zrpk)==1 ) THEN
74  yatt(1) = "polar_stereographic"
75  ELSEIF (zrpk==0) THEN
76  yatt(1) = "mercator"
77  ELSE
78  yatt(1) = "lambert_conformal_conic"
79  ENDIF
80 
81  isize = 0
82 
83  ! geoid
84  isize = isize + 1
85  yatt_title2(isize) = 'earth_radius'
86  zatt(isize) = 6371229.
87 
88  isize = isize + 1
89  IF ( yatt(1)=="polar_stereographic" ) THEN
90  yatt_title2(isize) = "straight_vertical_longitude_from_pole"
91  ELSE
92  yatt_title2(isize) = "longitude_of_central_meridian"
93  ENDIF
94  zatt(isize) = zlon0
95 
96  isize = isize + 1
97  yatt_title2(isize) = "latitude_of_projection_origin"
98  IF (yatt(1)=="mercator") THEN
99  zatt(isize) = 0.
100  ELSE
101  zatt(isize) = zlat0
102  ENDIF
103 
104  zx1(1) = zx(1)
105  zy1(1) = zy(1)
106  DEALLOCATE(zx,zy)
107  zlat1(1) = zlat0
108  zlon1(1) = zlon0
109  CALL xy_conf_proj(zlat0,zlon0,zrpk,0.,zlator,zlonor,zx2,zy2,zlat1,zlon1)
110  isize = isize + 1
111  yatt_title2(isize) = "false_easting"
112  zatt(isize) = nint((zx2(1)-zx1(1))*100.)/100.
113  isize = isize + 1
114  yatt_title2(isize) = "false_northing"
115  zatt(isize) = nint((zy2(1)-zy1(1))*100.)/100.
116 
117  isize = isize + 1
118  yatt_title2(isize) = "rotation"
119  zatt(isize) = zbeta
120 
121  IF (zresx/=0.) THEN
122  isize = isize + 1
123  yatt_title2(isize) = "x_resolution"
124  zatt(isize) = zresx
125  isize = isize + 1
126  yatt_title2(isize) = "y_resolution"
127  zatt(isize) = zresy
128  ENDIF
129 
130  zsin = sin(zlat0*(xpi/180.))
131  IF (abs(zrpk)==1.OR.zrpk==0..OR.nint(zsin*100.)==nint(zrpk*100.)) THEN
132 
133  isize = isize + 1
134  yatt_title2(isize) = 'standard_parallel'
135  zatt(isize) = zlat0
136 
137  CALL def_var_netcdf(hselect,kfile_id,"Projection_Type","",idimid,&
138  yatt_title(1:1),yatt(1:1),ivar_id,nf90_int,hatt_title2=yatt_title2(1:isize),&
139  patt_float=zatt(1:isize))
140 
141  ELSE
142 
143  yatt_title3(1) = "standard_parallel"
144  zatt2d(1,1) = asin(zrpk)*(180./xpi)
145  zatt2d(1,2) = 2*zlat0-asin(zrpk)*(180./xpi)
146 
147  CALL def_var_netcdf(hselect,kfile_id,"Projection_Type","",idimid,&
148  yatt_title(1:1),yatt(1:1),ivar_id,nf90_int,hatt_title2=yatt_title2(1:isize),&
149  patt_float=zatt(1:isize),hatt_title3=yatt_title3(1:1),patt_float2d=zatt2d(1:1,:))
150 
151  ENDIF
152 
153 
154  CASE ("GAUSS ")
155 
156  yatt(1) = "gauss_grid"
157 
158  CALL get_gridtype_gauss(ug%XGRID_FULL_PAR,plapo=zlat0,plopo=zlon0,kl=il,knlati=inlati)
159  ALLOCATE(inlopa(inlati))
160  ALLOCATE(zlatp(il))
161  ALLOCATE(zlatp2(inlati))
162  CALL get_gridtype_gauss(ug%XGRID_FULL_PAR,knlopa=inlopa,pcodil=zcodil,plat_xy=zlatp)
163  zlatp2(1) = zlatp(1)
164  icpt = 1
165  DO jj = 2,il
166  IF ( zlatp(jj)/=zlatp(jj-1) ) THEN
167  icpt = icpt + 1
168  zlatp2(icpt) = zlatp(jj)
169  ENDIF
170  ENDDO
171  DEALLOCATE(zlatp)
172 
173  yatt_title(2) = "latitudes"
174  yatt_title(3) = "lon_number_by_lat"
175  yatt(2) = "var: gauss_latitudes"
176  yatt(3) = "var: lon_number_by_lat"
177 
178  ! geoid
179  yatt_title2(1) = 'earth_radius'
180  zatt(1) = 6371229.
181 
182  yatt_title2(2) = "dilatation_coef"
183  zatt(2) = zcodil
184 
185  yatt_title2(3) = "pole_lon"
186  yatt_title2(4) = "pole_lat"
187  zatt(3) = nint(zlon0*100.)/100.
188  zatt(4) = nint(zlat0*100.)/100.
189 
190  CALL def_var_netcdf(hselect,kfile_id,"Projection_Type","",idimid,&
191  yatt_title(1:3),yatt(1:3),ivar_id,nf90_int,hatt_title2=yatt_title2(1:4),&
192  patt_float=zatt(1:4))
193 
194  yatt_title(:) = ""
195  yatt(:) = ""
196  jret = nf90_inq_dimid(kfile_id,"latitude",idimid1(1))
197  CALL def_var_netcdf(hselect,kfile_id,"gauss_latitudes","",idimid1,&
198  yatt_title(1:1),yatt(1:1),ivar_id,nf90_double)
199  CALL def_var_netcdf(hselect,kfile_id,"lon_number_by_lat","",idimid1,&
200  yatt_title(1:1),yatt(1:1),ivar_id,nf90_int)
201  jret = nf90_enddef(kfile_id)
202  jret = nf90_inq_varid(kfile_id, "gauss_latitudes", ivar_id)
203  jret = nf90_put_var(kfile_id, ivar_id, zlatp2)
204  jret = nf90_inq_varid(kfile_id, "lon_number_by_lat", ivar_id)
205  jret = nf90_put_var(kfile_id, ivar_id, inlopa)
206  jret = nf90_redef(kfile_id)
207 
208  DEALLOCATE(zlatp2,inlopa)
209 
210 
211  CASE ("CARTESIAN ")
212 
213  yatt(1) = "cartesian"
214 
215  CALL get_gridtype_cartesian(ug%XGRID_FULL_PAR,kl=il)
216  ALLOCATE(zdx(il),zdy(il))
217  CALL get_gridtype_cartesian(ug%XGRID_FULL_PAR,pdx=zdx,pdy=zdy)
218  zresx = zdx(1)
219  zresy = zdy(1)
220  DEALLOCATE(zdx,zdy)
221 
222  isize = 0
223  IF (zresx/=0.) THEN
224  isize = isize + 1
225  yatt_title2(isize) = "x_resolution"
226  zatt(isize) = zresx
227  isize = isize + 1
228  yatt_title2(isize) = "y_resolution"
229  zatt(isize) = zresy
230  ENDIF
231 !
232  CALL def_var_netcdf(hselect,kfile_id,"Projection_Type","",idimid,&
233  yatt_title(1:1),yatt(1:1),ivar_id,nf90_int,hatt_title2=yatt_title2(1:isize),&
234  patt_float=zatt(1:isize))
235 
236 
237  CASE ("LONLAT REG")
238 
239  yatt(1) = "latitude_longitude"
240 
241  CALL get_gridtype_lonlat_reg(ug%XGRID_FULL_PAR,kl=il,plonmin=zlonmin,&
242  plonmax=zlonmax,platmin=zlatmin,platmax=zlatmax)
243  ALLOCATE(zx(il),zy(il))
244  CALL get_gridtype_lonlat_reg(ug%XGRID_FULL_PAR,plon=zx,plat=zy)
245 
246  IF (il>1) THEN
247  zresx = abs(zx(1)-zx(2))
248  iimax = nint((zlonmax-zlonmin)/zresx)
249  IF (il>iimax) THEN
250  zresy = abs(zy(1)-zy(iimax+1))
251  ELSE
252  zresy = zlatmax - zlatmin
253  ENDIF
254  ELSE
255  zresx = zlonmax - zlonmin
256  zresy = zlatmax - zlatmin
257  ENDIF
258  DEALLOCATE(zx,zy)
259 
260  ! geoid
261  yatt_title2(1) = 'earth_radius'
262  zatt(1) = 6371229.
263 
264  isize = 1
265  IF (zresx/=0.) THEN
266  isize = isize + 1
267  yatt_title2(isize) = "x_resolution"
268  zatt(isize) = zresx
269  isize = isize + 1
270  yatt_title2(isize) = "y_resolution"
271  zatt(isize) = zresy
272  ENDIF
273 
274  CALL def_var_netcdf(hselect,kfile_id,"Projection_Type","",idimid,&
275  yatt_title(1:1),yatt(1:1),ivar_id,nf90_int,hatt_title2=yatt_title2(1:isize),&
276  patt_float=zatt(1:isize))
277 
278 
279  CASE ("LONLAT ROT")
280 
281  yatt(1) = "rotated_latitude_longitude"
282 
283  CALL get_gridtype_lonlat_rot(ug%XGRID_FULL_PAR,ppolon=zlon0,ppolat=zlat0,&
284  kl=il,klon=iimax,klat=ijmax,pdlon=zdx0,pdlat=zdy0)
285 
286  ! geoid
287  yatt_title2(1) = 'earth_radius'
288  zatt(1) = 6371229.
289 
290  yatt_title2(2) = "grid_north_pole_longitude"
291  yatt_title2(3) = "grid_north_pole_latitude"
292  zatt(2) = zlon0
293  zatt(3) = zlat0
294 
295  zresx = zdx0
296  zresy = zdy0
297 
298  isize = 3
299  IF (zresx/=0.) THEN
300  isize = isize + 1
301  yatt_title2(isize) = "x_resolution"
302  zatt(isize) = zresx
303  isize = isize + 1
304  yatt_title2(isize) = "y_resolution"
305  zatt(isize) = zresy
306  ENDIF
307 
308  CALL def_var_netcdf(hselect,kfile_id,"Projection_Type","",idimid,&
309  yatt_title(1:1),yatt(1:1),ivar_id,nf90_int,&
310  hatt_title2=yatt_title2(1:isize),patt_float=zatt(1:isize))
311 
312 
313  CASE ("LONLATVAL ")
314 
315  yatt(1) = "latitude_longitude"
316 
317  ! geoid
318  yatt_title2(1) = 'earth_radius'
319  zatt(1) = 6371229.
320 
321  CALL def_var_netcdf(hselect,kfile_id,"Projection_Type","",idimid,&
322  yatt_title(1:1),yatt(1:1),ivar_id,nf90_int,&
323  hatt_title2=yatt_title2(1:1),patt_float=zatt(1:1))
324 
325 
326  CASE ("IGN ")
327 
328  CALL get_gridtype_ign(ug%XGRID_FULL_PAR,klambert=ilambert,kl=il,&
329  kdimx=iimax,kdimy=ijmax)
330 
331  IF ( lwrite_coord .AND. iimax*ijmax/=il ) THEN
332 
333  yatt(1) = "latitude_longitude"
334 
335  CALL def_var_netcdf(hselect,kfile_id,"Projection_Type","",idimid,&
336  yatt_title(1:1),yatt(1:1),ivar_id,nf90_int)
337 
338  ELSE
339 
340  ALLOCATE(zdx(il))
341  ALLOCATE(zdy(il))
342  ALLOCATE(zx(iimax),zy(ijmax))
343  CALL get_gridtype_ign(ug%XGRID_FULL_PAR,pxall=zx,pyall=zy,pdx=zdx,pdy=zdy)
344 
345  SELECT CASE(ilambert)
346  CASE(1)
347  zlat0 = 49.5
348  zlat2(1) = 48.592447
349  zlat2(2) = 50.39088033333
350  zlon0 = 2.33722917
351  zx0 = 600000.
352  zy0 = 5657616.674
353 
354  CASE(2)
355  zlat0 = 46.8
356  zlat2(1) = 45.88935133333
357  zlat2(2) = 47.68760866666
358  zlon0 = 2.33722917
359  zx0 = 600000.
360  zy0 = 6199695.768
361 
362  CASE(3)
363  zlat0 = 44.1
364  zlat2(1) = 43.19290816666
365  zlat2(2) = 44.96513966666
366  zlon0 = 2.33722917
367  zx0 = 600000.
368  zy0 = 6791905.085
369 
370  CASE(4)
371  zlat0 = 42.165
372  zlat2(1) = 41.55623266666
373  zlat2(2) = 42.76726466666
374  zlon0 = 2.33722917
375  zx0 = 234.358
376  zy0 = 7239161.542
377 
378  CASE(5)
379  zlat0 = 46.8
380  zlat2(1) = 45.88935133333
381  zlat2(2) = 47.68760866666
382  zlon0 = 2.33722917
383  zx0 = 600000.
384  zy0 = 8199695.768
385 
386  CASE(6)
387  zlat0 = 46.5
388  zlat2(1) = 44.
389  zlat2(2) = 49.
390  zlon0 = 3.
391  zx0 = 700000.
392  zy0 = 12655612.050
393 
394  END SELECT
395 
396  yatt_title(1) = "grid_mapping_name"
397  yatt(1) = "lambert_conformal_conic"
398  yatt_title(2) = "ellipsoid"
399  IF (ilambert==6) THEN
400  yatt(2) = "GRS80"
401  ELSE
402  yatt(2) = "clrk80"
403  ENDIF
404 
405  isize = 0
406 
407  isize = isize + 1
408  yatt_title2(isize) = "longitude_of_central_meridian"
409  zatt(isize) = zlon0
410 
411  isize = isize + 1
412  yatt_title2(isize) = "latitude_of_projection_origin"
413  zatt(isize) = zlat0
414 
415  zlat1(1) = zlat0
416  zlon1(1) = zlon0
417  CALL xy_ign(ilambert,zx2,zy2,zlat1,zlon1)
418  zx1(1) = minval(zx)
419  zy1(1) = minval(zy)
420  isize = isize + 1
421  yatt_title2(isize) = "false_easting"
422  zatt(isize) = zx2(1)-zx1(1)
423  isize = isize + 1
424  yatt_title2(isize) = "false_northing"
425  zatt(isize) = zy2(1)-zy1(1)
426 
427  yatt_title3(1) = "standard_parallel"
428  zatt2d(1,:) = zlat2(:)
429 
430  IF (all(zdx(2:)==zdx(1))) THEN
431  isize = isize + 1
432  yatt_title2(isize) = "x_resolution"
433  zatt(isize) = zdx(1)
434  ENDIF
435  IF (all(zdy(2:)==zdy(1))) THEN
436  isize = isize + 1
437  yatt_title2(isize) = "y_resolution"
438  zatt(isize) = zdy(1)
439  ENDIF
440 
441  CALL def_var_netcdf(hselect,kfile_id,"Projection_Type","",idimid,&
442  yatt_title(1:2),yatt(1:2),ivar_id,nf90_int,hatt_title2=yatt_title2(1:isize),&
443  patt_float=zatt(1:isize),hatt_title3=yatt_title3(1:1),patt_float2d=zatt2d(1:1,:))
444 
445  DEALLOCATE(zx,zy,zdx,zdy)
446 
447  ENDIF
448 
449  CASE DEFAULT
450 
451  CALL abor1_sfx("OL_WRITE_PROJ: PROJECTION "//ug%G%CGRID//" NOT DEFINED")
452 
453 END SELECT
454 !
455 IF (lhook) CALL dr_hook('OL_WRITE_PROJ',1,zhook_handle)
456 !
457 END SUBROUTINE ol_write_proj
subroutine get_gridtype_ign(PGRID_PAR, KLAMBERT, KL, PX, PY, PDX, PDY, KDIMX, KDIMY, PXALL, PYALL)
subroutine xy_ign(KLAMBERT, PX, PY, PLAT, PLON)
subroutine xy_conf_proj(PLAT0, PLON0, PRPK, PBETA, PLATOR, PLONOR, PX, PY, PLAT, PLON)
real, save xpi
Definition: modd_csts.F90:43
subroutine ol_write_proj(HSELECT, KFILE_ID, UG)
subroutine abor1_sfx(YTEXT)
Definition: abor1_sfx.F90:7
integer, parameter jprb
Definition: parkind1.F90:32
subroutine get_gridtype_lonlat_reg(PGRID_PAR, PLONMIN, PLONMAX, PLATMIN, PLATMAX, KLON, KLAT, KL, PLON, PLAT)
subroutine get_gridtype_lonlat_rot(PGRID_PAR,
subroutine def_var_netcdf(HSELECT, KFILE_ID, HNAME, HLONG_NAME, KDIM_ID, H
subroutine get_gridtype_conf_proj(PGRID_PAR, PLAT0, PLON0, PRPK, PBETA
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 get_gridtype_cartesian(PGRID_PAR, PLAT0, PLON0,