libsim  Versione7.2.1
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 :: category,ier
35 character(len=512):: a_name
36 TYPE(arrayof_gridinfo) :: gridinfo
37 
38 type(griddim_def) :: griddim
39 
40 integer,parameter :: nx=31, ny=16, component_flag=0
41 type(grid_id) :: gaid_template
42 type(vol7d_level) :: level
43 type(vol7d_timerange) :: timerange
44 type(volgrid6d_var) :: var
45 type(datetime) :: date_time
46 doubleprecision :: xmin=0., xmax=30., ymin=35., ymax=50.
47 !doubleprecision :: latitude_south_pole=-32.5,longitude_south_pole=10.,angle_rotation=0.
48 character(len=80) :: type='regular_ll'
49 REAL :: field(nx,ny)
50 INTEGER :: i, j
51 
52 ! get launcher name
53 call l4f_launcher(a_name,a_name_force="demo9")
54 
55 ! log4fortran init
56 ier=l4f_init()
57 
58 ! set a_name
59 category=l4f_category_get(trim(a_name)//".main")
60 
61 call l4f_category_log(category,l4f_info,"start")
62 
63 ! make room for two elements
64 CALL insert(gridinfo, nelem=2)
65 ! define grib1 template
66 gaid_template = grid_id_new(grib_api_template="regular_ll_sfc_grib1")
67 ! here you can change the default template
68 CALL grib_set(grid_id_get_gaid(gaid_template), "centre", 80)
69 CALL grib_set(grid_id_get_gaid(gaid_template), "jScansPositively", 1)
70 
71 ! first element
72 ! define metadata
73 CALL init(griddim, proj_type=type, nx=nx, ny=ny, &
74  xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax, component_flag=component_flag, &
75  categoryappend="generated")
76 CALL init(date_time, year=2019, month=1, day=20, hour=0, minute=0)
77 CALL init(timerange, timerange=254, p1=0, p2=0)
78 CALL init(level, level1=1, l1=0, level2=imiss, l2=imiss)
79 ! define parameter land fraction
80 CALL init(var, centre=80, category=2, number=81, discipline=255)
81 ! fill gridinfo with all metadata
82 CALL init(gridinfo%array(1), gaid_template, griddim, date_time, timerange, level, &
83  var, clone=.true., categoryappend='inventato')
84 
85 ! define data
86 ! create a N-S coastline at the center of the domain
87 field(:nx/2,:) = 1.
88 field(nx/2+1,:) = 0.
89 CALL encode_gridinfo(gridinfo%array(1), field)
90 
91 ! second element
92 ! define parameter geometric height
93 CALL init(var, centre=80, category=2, number=8, discipline=255)
94 ! fill gridinfo with all metadata
95 CALL init(gridinfo%array(2), gaid_template, griddim, date_time, timerange, level, &
96  var, clone=.true., categoryappend='inventato')
97 
98 ! define data
99 ! create an E-W slope W of the coastline, 0 at the E
100 DO i = 1, nx
101  field(i,:) = max(REAL(nx/2-i+1)/REAL(nx/2)*500., 0.)
102 ENDDO
103 CALL encode_gridinfo(gridinfo%array(2), field)
104 
105 CALL display(gridinfo)
106 CALL l4f_category_log(category,l4f_info,"export to GRIB")
107 CALL export(gridinfo, filename='const.grib', categoryappend="gridinfo scritto")
108 
109 CALL delete(gaid_template)
110 CALL delete(gridinfo)
111 
112 ! make room for one element
113 CALL insert(gridinfo, nelem=1)
114 ! define grib2 template
115 gaid_template = grid_id_new(grib_api_template="regular_ll_sfc_grib2")
116 
117 ! redefine some metadata
118 CALL init(timerange, timerange=254, p1=6, p2=0)
119 CALL init(level, level1=103, l1=2000, level2=imiss, l2=imiss)
120 ! define parameter temperature
121 CALL init(var, centre=80, category=0, number=0, discipline=0)
122 ! fill gridinfo with all metadata
123 CALL init(gridinfo%array(1), gaid_template, griddim, date_time, timerange, level, &
124  var, clone=.false., categoryappend='inventato')
125 ! here you can change the template, after cloning but before coding metadata
126 ! different approach than above
127 CALL grib_set(grid_id_get_gaid(gridinfo%array(1)%gaid), "centre", 80)
128 CALL grib_set(grid_id_get_gaid(gridinfo%array(1)%gaid), "jScansPositively", 1)
129 
130 ! define data
131 ! create an unrealistic field with all different values
132 DO j = 1, ny
133  DO i = 1, nx
134  field(i,j) = 200. + (i-1)*0.5 + j*15.
135  ENDDO
136 ENDDO
137 CALL encode_gridinfo(gridinfo%array(1), field)
138 
139 CALL display(gridinfo)
140 CALL l4f_category_log(category,l4f_info,"export to GRIB")
141 CALL export(gridinfo, filename='t2m.grib', categoryappend="gridinfo scritto")
142 
143 CALL l4f_category_log(category,l4f_info,"end")
144 
145 CALL delete(gaid_template)
146 CALL delete(gridinfo)
147 
148 ! close logger
149 CALL l4f_category_delete(category)
150 ier=l4f_fini()
151 
152 END PROGRAM demo9

Generated with Doxygen.