libsim  Versione8.0.0
example_vg6d_9.f90

Example to create a grib editionNumber = 2 file from data generated in memory using a grib_api template

1 ! Copyright (C) 2010 ARPA-SIM <urpsim@smr.arpa.emr.it>
2 ! authors:
3 ! Davide Cesari <dcesari@arpa.emr.it>
4 ! Paolo Patruno <ppatruno@arpa.emr.it>
5 
6 ! This program is free software; you can redistribute it and/or
7 ! modify it under the terms of the GNU General Public License as
8 ! published by the Free Software Foundation; either version 2 of
9 ! the License, or (at your option) any later version.
10 
11 ! This program is distributed in the hope that it will be useful,
12 ! but WITHOUT ANY WARRANTY; without even the implied warranty of
13 ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 ! GNU General Public License for more details.
15 
16 ! You should have received a copy of the GNU General Public License
17 ! along with this program. If not, see <http://www.gnu.org/licenses/>.
18 
19 !!!!!!!!!!!!!!!!
20 ! Example to create a grib editionNumber = 2 file from data generated in memory using a grib_api template.
21 !!!!!!!!!!!!!!!!
22 
23 PROGRAM demo9
24 USE log4fortran
26 USE grid_class
27 USE grid_id_class
32 IMPLICIT NONE
33 
34 integer :: ier
35 type(l4f_handle) :: category
36 character(len=512):: a_name
37 TYPE(arrayof_gridinfo) :: gridinfo
38 
39 type(griddim_def) :: griddim
40 
41 integer,parameter :: nx=31, ny=16, component_flag=0
42 type(grid_id) :: gaid_template
43 type(vol7d_level) :: level
44 type(vol7d_timerange) :: timerange
45 type(volgrid6d_var) :: var
46 type(datetime) :: date_time
47 doubleprecision :: xmin=0., xmax=30., ymin=35., ymax=50.
48 !doubleprecision :: latitude_south_pole=-32.5,longitude_south_pole=10.,angle_rotation=0.
49 character(len=80) :: type='regular_ll'
50 REAL :: field(nx,ny)
51 INTEGER :: i, j
52 
53 ! get launcher name
54 call l4f_launcher(a_name,a_name_force="demo9")
55 
56 ! log4fortran init
57 ier=l4f_init()
58 
59 ! set a_name
60 category=l4f_category_get_handle(trim(a_name)//".main")
61 
62 call l4f_category_log(category,l4f_info,"start")
63 
64 ! make room for two elements
65 CALL insert(gridinfo, nelem=2)
66 ! define grib1 template
67 gaid_template = grid_id_new(grib_api_template="regular_ll_sfc_grib1")
68 ! here you can change the default template
69 CALL grib_set(grid_id_get_gaid(gaid_template), "centre", 80)
70 CALL grib_set(grid_id_get_gaid(gaid_template), "jScansPositively", 1)
71 
72 ! first element
73 ! define metadata
74 CALL init(griddim, proj_type=type, nx=nx, ny=ny, &
75  xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax, component_flag=component_flag, &
76  categoryappend="generated")
77 CALL init(date_time, year=2019, month=1, day=20, hour=0, minute=0)
78 CALL init(timerange, timerange=254, p1=0, p2=0)
79 CALL init(level, level1=1, l1=0, level2=imiss, l2=imiss)
80 ! define parameter land fraction
81 CALL init(var, centre=80, category=2, number=81, discipline=255)
82 ! fill gridinfo with all metadata
83 CALL init(gridinfo%array(1), gaid_template, griddim, date_time, timerange, level, &
84  var, clone=.true., categoryappend='inventato')
85 
86 ! define data
87 ! create a N-S coastline at the center of the domain
88 field(:nx/2,:) = 1.
89 field(nx/2+1,:) = 0.
90 CALL encode_gridinfo(gridinfo%array(1), field)
91 
92 ! second element
93 ! define parameter geometric height
94 CALL init(var, centre=80, category=2, number=8, discipline=255)
95 ! fill gridinfo with all metadata
96 CALL init(gridinfo%array(2), gaid_template, griddim, date_time, timerange, level, &
97  var, clone=.true., categoryappend='inventato')
98 
99 ! define data
100 ! create an E-W slope W of the coastline, 0 at the E
101 DO i = 1, nx
102  field(i,:) = max(REAL(nx/2-i+1)/REAL(nx/2)*500., 0.)
103 ENDDO
104 CALL encode_gridinfo(gridinfo%array(2), field)
105 
106 CALL display(gridinfo)
107 CALL l4f_category_log(category,l4f_info,"export to GRIB")
108 CALL export(gridinfo, filename='const.grib', categoryappend="gridinfo scritto")
109 
110 CALL delete(gaid_template)
111 CALL delete(gridinfo)
112 
113 ! make room for one element
114 CALL insert(gridinfo, nelem=1)
115 ! define grib2 template
116 gaid_template = grid_id_new(grib_api_template="regular_ll_sfc_grib2")
117 
118 ! redefine some metadata
119 CALL init(timerange, timerange=254, p1=6, p2=0)
120 CALL init(level, level1=103, l1=2000, level2=imiss, l2=imiss)
121 ! define parameter temperature
122 CALL init(var, centre=80, category=0, number=0, discipline=0)
123 ! fill gridinfo with all metadata
124 CALL init(gridinfo%array(1), gaid_template, griddim, date_time, timerange, level, &
125  var, clone=.false., categoryappend='inventato')
126 ! here you can change the template, after cloning but before coding metadata
127 ! different approach than above
128 CALL grib_set(grid_id_get_gaid(gridinfo%array(1)%gaid), "centre", 80)
129 CALL grib_set(grid_id_get_gaid(gridinfo%array(1)%gaid), "jScansPositively", 1)
130 
131 ! define data
132 ! create an unrealistic field with all different values
133 DO j = 1, ny
134  DO i = 1, nx
135  field(i,j) = 200. + (i-1)*0.5 + j*15.
136  ENDDO
137 ENDDO
138 CALL encode_gridinfo(gridinfo%array(1), field)
139 
140 CALL display(gridinfo)
141 CALL l4f_category_log(category,l4f_info,"export to GRIB")
142 CALL export(gridinfo, filename='t2m.grib', categoryappend="gridinfo scritto")
143 
144 CALL l4f_category_log(category,l4f_info,"end")
145 
146 CALL delete(gaid_template)
147 CALL delete(gridinfo)
148 
149 ! close logger
150 CALL l4f_category_delete(category)
151 ier=l4f_fini()
152 
153 END PROGRAM demo9

Generated with Doxygen.