libsim Versione 8.0.0
vol7d_dballe_class.F03
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#include "config.h"
20
21!> \brief classe per import ed export di volumi da e in DB-All.e
22!!
23!!Questo modulo definisce gli oggetti e i metodi per gestire
24!!l'importazione e l'esportazione di volumi dal database per dati sparsi
25!!DB-All.e
26!!
27!!Il tutto funziona intorno all'oggetto vol7d_dballe che aggiunge ad un
28!!oggetto vol7d ulteriori informazioni.
29!!
30!!Con la chiamata init vengono definiti i parametri di accesso alla DSN
31!!(database) di DB-All.e. oppure da file bufr/crex
32!!
33!!Con import è possibile acquisire nel prorio programma i dati presenti
34!!nel DSN o su file; l'allocazione di memoria è automatica. Import è in grado di
35!!importare dati senza nessuna ulteriore specificazione: vengono
36!!acquisite tutte le stazioni senza limiti di tempo o di spazio, per
37!!tutti i dati, compresi quelli di anagrafica; solo gli attributi
38!!vengono tralasciati se non specificati. Se non specificato i dati sono
39!!in forma character che permette di essere conservativi su tutti i tipi
40!!di dato archiviabile in DB-all.e. Aumentando i parametri
41!!all'intefaccia import è possibile specificare sottoinsiemi temporali e
42!!spaziali, elenchi di variabili e attributi. E' possibile anche
43!!specificare il tipo per ogni variabile o attributo richiesto. E'
44!!fornito un set di routine per avere la possibilità di estrarre un
45!!vettore di variabili e un vettore di reti. E' possibile anche specificare
46!!una singola stazione. vol7d_dballe%%data_id
47!!contiene un vettore di servizio con gli id interni del database che
48!!indirizzano direttamente i dati. Una particolare opzione permette di
49!!attivare l'opzione query di tipo best in DB-All.e per avere in una
50!!unica rete i dati migliori presenti nel DB.
51!!
52!!Con export si riscrivono i dati nel DSN di DB-All.e potendo attivare
53!!una serie di filtri.
54!!
55!!Con delete si elimina definitvamente l'oggetto vol7d_dballe.
56!!
57!!Mantenendo lo stesso oggetto nella sequenza init, import, export,
58!!delete si sovrascrive lo stesso DSN di DB-All.e. Il vettore
59!!vol7d_dballe%%data_id in export permette di sovrascrivere solo gli
60!!attributi; eventualmente possono essere sovrascritti i soli attributi
61!!relativi agli elementi data_id non mancanti.
62!!
63!! E' da notare che se si attiva l'opzione "anaonly" solo ma tutte le stazioni e
64!! i dati di anagrafica vengono importati secondo i parametri di query selezionati.
65!! Se l'opzione "anaonly" è disattivata solo le stazioni con i dati richiesti presenti
66!! saranno caricati nella sezione anagrafica
67!!
68!!Utilizzando due differenti oggetti uno per import e uno per export è
69!!possibile tramite l'associazione del puntatore in essi contenuto
70!!relativo al volume vol7d ricopiare contenuti in altri DSN senza
71!!sprechi di memoria.
72!!
73!!Programma esempio
74!!\include esempio_v7ddballe.f90
75!!
76!!\ingroup vol7d
77
79
86!use list_mix
89use vol7d_serialize_dballe_class
90
91IMPLICIT NONE
92
93character (len=255),parameter:: subcategory="vol7d_dballe_class"
94
95 !>\brief Oggetto per import ed export da DB-All.e
96!!
97!!L'oggetto è costituito da un oggetto vol7d attorniato dalle
98!!informazioni necessarie per l'accesso al DSN di DB-All.e
99!! e da una matrice necessaria per l'ottimizzazione della scrittura dei
100!!degli attributi dei dati in export
101
102TYPE vol7d_dballe
103
104 TYPE(vol7d) :: vol7d !< volume vol7d
105 type(dbaconnection) :: idbhandle !< handle della connessioni al DSN DB-All.e
106 type(dbasession) :: handle !< handle della sessione connessa al DSN DB-All.e
107 !> memorizza gli id interni al database DB-All.e per
108 !!ottimizzare le riscritture degli attributi ai dati
109 integer ,pointer :: data_id(:,:,:,:,:)
110 integer :: time_definition
111 type(l4f_handle) :: category !< log4fortran
112 logical :: file !<
113
114END TYPE vol7d_dballe
115
116INTEGER, PARAMETER, PRIVATE :: nftype = 2
117CHARACTER(len=16), PARAMETER, PRIVATE :: &
118 pathlist(2,nftype) = reshape((/ &
119 '/usr/share ', '/usr/local/share', &
120 '/etc ', '/usr/local/etc ' /), &
121 (/2,nftype/))
122
123
124type(vol7d_var),allocatable,private :: blocal(:) ! cache of dballe.txt
125
126CHARACTER(len=20),PRIVATE :: dballe_name='wreport', dballe_name_env='DBA_TABLES'
127
128
129 !>\brief inizializza
130INTERFACE init
131 MODULE PROCEDURE vol7d_dballe_init
132END INTERFACE init
133
134 !>\brief cancella
135INTERFACE delete
136 MODULE PROCEDURE vol7d_dballe_delete
137END INTERFACE delete
138
139
140 !>\brief importa
141INTERFACE import
142 MODULE PROCEDURE vol7d_dballe_importvvnv,vol7d_dballe_import, vol7d_dballe_import_old, dba2v7d
143END INTERFACE import
144
145 !>\brief exporta
146INTERFACE export
147 MODULE PROCEDURE vol7d_dballe_export_old,vol7d_dballe_export, v7d2dba
148END INTERFACE export
149
150
151PRIVATE
152PUBLIC vol7d_dballe, init, delete, import, export, vol7d_dballe_import_dballevar, vol7d_dballe_set_var_du
153
154CONTAINS
155
156
157 !>\brief inizializza l'oggetto
158SUBROUTINE vol7d_dballe_init(this,dsn,user,password,write,wipe,repinfo,&
159 filename,format,file,categoryappend,time_definition,idbhandle,template)
160
161
162TYPE(vol7d_dballe),INTENT(out) :: this !< l'oggetto da inizializzare
163character(len=*), INTENT(in),OPTIONAL :: dsn !< per l'accesso al DSN ( default="test" )
164character(len=*), INTENT(in),OPTIONAL :: user !< per l'accesso al DSN ( default="test" )
165character(len=*), INTENT(in),OPTIONAL :: password !< per l'accesso al DSN ( default="" )
166logical,INTENT(in),OPTIONAL :: write !< abilita la scrittura sul DSN/file ( default=.false. )
167logical,INTENT(in),OPTIONAL :: wipe !< svuota il DSN/file e/o lo prepara per una scrittura ( default=.false. )
168character(len=*), INTENT(in),OPTIONAL :: repinfo !< eventuale file repinfo.csv usato con wipe ( default="" )
169character(len=*),intent(inout),optional :: filename !< nome dell'eventuale file da utilizzare in alternativa a dsn when file is true; se passato ="" ritorna un valore di deafult elaborato
170character(len=*),intent(in),optional :: format !< the file format when file is true. It can be "BUFR", "CREX" or "JSON" (default="BUFR")
171logical,INTENT(in),OPTIONAL :: file !< switch to use file or data base ( default=.false )
172character(len=*),INTENT(in),OPTIONAL :: categoryappend !< appennde questo suffisso al namespace category di log4fortran
173integer,INTENT(in),OPTIONAL :: time_definition !< 0=time is reference time ; 1=time is validity time (default=1)
174integer,INTENT(in),OPTIONAL :: idbhandle !< dsn connection; if present it will be used
175!> specificando category.subcategory.localcategory oppure un alias ("synop", "metar","temp","generic") forza l'exportazione ad uno specifico template BUFR/CREX"
176!! the special value "generic-frag is used to generate bufr on file where ana data is reported only once at beginning and data in other bufr after
177character(len=*),intent(in),optional :: template !< default template to use exporting to file; can be overwritten by export
178
179logical :: quiwrite,loadfile
180character(len=512) :: a_name
181character(len=254) :: arg,lfilename,lformat
182
183quiwrite=.false.
184if (present(write))then
185 quiwrite=write
186endif
187
188if (present(categoryappend))then
189 call l4f_launcher(a_name,a_name_append=trim(subcategory)//"."//trim(categoryappend))
190else
191 call l4f_launcher(a_name,a_name_append=trim(subcategory))
192endif
193this%category=l4f_category_get_handle(a_name)
194
195#ifdef DEBUG
196CALL l4f_category_log(this%category,l4f_debug,'vol7d_dballe_init start')
197#endif
198
199nullify(this%data_id)
200
201if (optio_log(file)) then
202
203 this%file=.true.
204
205 lformat="BUFR"
206 if (present(format))then
207 lformat=format
208 end if
209
210 CALL getarg(0,arg)
211
212 lfilename=trim(arg)//"."//trim(lformat)
213 if (index(arg,'/',back=.true.) > 0) lfilename=lfilename(index(arg,'/',back=.true.)+1 : )
214
215 if (present(filename))then
216 if (c_e(filename))then
217 lfilename=filename
218 end if
219 end if
220
221 if(quiwrite)then
222 ! this for write in memdb and write file on export
223 loadfile=.false.
224 else
225 loadfile=.true.
226 end if
227
228 this%handle=dbasession(wipe=wipe,write=quiwrite,repinfo=repinfo, &
229 filename=lfilename,format=lformat,template=template, &
230 memdb=.true.,loadfile=loadfile)
231
232else
233
234 this%file=.false.
235 this%idbhandle=dbaconnection(dsn,user,password,idbhandle=idbhandle)
236 this%handle=dbasession(this%idbhandle,wipe=wipe,write=quiwrite,repinfo=repinfo)
237
238endif
239
240! this init has been added here for cleaningness, this%vol7d gets
241! reinitialised afterwards in dba2v7d and this%vol7d%time_definition is
242! overwritten by this%time_definition, this duplication is required in
243! order to pass time_definition down to dba2v7d
244CALL init(this%vol7d, time_definition)
245this%time_definition = optio_i(time_definition)
246
247#ifdef DEBUG
248CALL l4f_category_log(this%category,l4f_debug,'vol7d_dballe_init end')
249#endif
250
251END SUBROUTINE vol7d_dballe_init
252
253
254
255 !>\brief Identica a vol7d_dballe_importvsns con var e network vettore.
256!!
257!!import da DB-all.e
258
259SUBROUTINE vol7d_dballe_importvvnv(this, var, network, coordmin,coordmax, timei, timef, level,timerange,set_network,&
260 attr,anavar,anaattr, varkind,attrkind,anavarkind,anaattrkind,anaonly,dataonly,ana)
261TYPE(vol7d_dballe),INTENT(inout) :: this !< oggetto vol7d_dballe
262CHARACTER(len=*),INTENT(in) :: var(:)
263TYPE(geo_coord),INTENT(inout),optional :: coordmin,coordmax
264TYPE(vol7d_ana),INTENT(inout),optional :: ana
265TYPE(datetime),INTENT(in),optional :: timei, timef
266TYPE(vol7d_network),INTENT(in) :: network(:)
267TYPE(vol7d_network),INTENT(in),OPTIONAL :: set_network
268TYPE(vol7d_level),INTENT(in),optional :: level
269TYPE(vol7d_timerange),INTENT(in),optional :: timerange
270CHARACTER(len=*),INTENT(in),OPTIONAL :: attr(:),anavar(:),anaattr(:)
271CHARACTER(len=*),INTENT(in),OPTIONAL :: varkind(:),attrkind(:),anavarkind(:),anaattrkind(:)
272logical,intent(in),optional :: anaonly
273LOGICAL,INTENT(in),OPTIONAL :: dataonly
274TYPE(vol7d_dballe) :: v7ddbatmp
275
276INTEGER :: i
277
278IF (SIZE(network) == 0 )THEN
279 CALL import(this, var, coordmin=coordmin, coordmax=coordmax, timei=timei, &
280 timef=timef, level=level, timerange=timerange, set_network=set_network, &
281 attr=attr, anavar=anavar, anaattr=anaattr, varkind=varkind, attrkind=attrkind, &
282 anavarkind=anavarkind, anaattrkind=anaattrkind, anaonly=anaonly, &
283 dataonly=dataonly, ana=ana)
284ELSE
285 CALL init(this%vol7d)
286 v7ddbatmp = this ! shallow copy
287 DO i = 1, SIZE(network)
288 CALL import(v7ddbatmp, var, network(i), coordmin, coordmax, timei, timef, &
289 level,timerange, set_network, attr,anavar,anaattr, varkind, attrkind, &
290 anavarkind, anaattrkind, anaonly, dataonly, ana)
291 CALL vol7d_merge(this%vol7d, v7ddbatmp%vol7d, sort=.true.)
292 ENDDO
293ENDIF
295END SUBROUTINE vol7d_dballe_importvvnv
296
297!>import da DB-all.e
298SUBROUTINE vol7d_dballe_import_old(this, var, network, coordmin, coordmax, timei, timef,level,timerange, set_network,&
299 attr,anavar,anaattr, varkind,attrkind,anavarkind,anaattrkind,anaonly,dataonly,ana)
300
301TYPE(vol7d_dballe),INTENT(inout) :: this !< oggetto vol7d_dballe
302CHARACTER(len=*),INTENT(in),OPTIONAL :: var(:)
303TYPE(geo_coord),INTENT(inout),optional :: coordmin,coordmax
304TYPE(vol7d_ana),INTENT(inout),optional :: ana
305TYPE(datetime),INTENT(in),OPTIONAL :: timei, timef
306TYPE(vol7d_network),INTENT(in),OPTIONAL :: network,set_network
307TYPE(vol7d_level),INTENT(in),optional :: level
308TYPE(vol7d_timerange),INTENT(in),optional :: timerange
309CHARACTER(len=*),INTENT(in),OPTIONAL :: attr(:),anavar(:),anaattr(:)
310CHARACTER(len=*),INTENT(in),OPTIONAL :: varkind(:),attrkind(:),anavarkind(:),anaattrkind(:)
311logical,intent(in),optional :: anaonly
312logical,intent(in),optional :: dataonly
313
314
315INTEGER,PARAMETER :: maxvarlist=100
316 !TYPE(vol7d) :: v7d
317 ! da non fare (con gfortran?)!!!!!
318 !CHARACTER(len=SIZE(var)*7) :: varlist
319 !CHARACTER(len=SIZE(attr)*8) :: starvarlist
320
321LOGICAL :: ldegnet
322
323INTEGER :: i
324integer :: nvar
325integer :: nanavar
326
327 !CHARACTER(len=10),allocatable :: lvar(:), lanavar(:)
328type(dbadcv) :: vars,starvars,anavars,anastarvars
329type(dbafilter) :: filter
330type(dbacoord) :: mydbacoordmin, mydbacoordmax
331type(dbaana) :: mydbaana
332type(dbadatetime) :: mydatetimemin, mydatetimemax
333type(dbatimerange) :: mydbatimerange
334type(dbalevel) :: mydbalevel
335type(dbanetwork) :: mydbanetwork
336
337integer :: nanaattr,nattr
338
339character(len=40) :: query
340
341#ifdef DEBUG
342CALL l4f_category_log(this%category,l4f_debug,'inizio')
343#endif
344
345
346IF (PRESENT(set_network)) THEN
347 if (c_e(set_network)) then
348 ldegnet = .true.
349 else
350 ldegnet = .false.
351 end if
352ELSE
353 ldegnet = .false.
354ENDIF
355
356if(ldegnet) then
357 query = "best"
358else
359 query=cmiss
360end if
361
362
363 ! uncommenti this if you want compatibility API with old import
364
365!!$ if (allocated(starvars%dcv)) then
366!!$ ldataonly=.false.
367!!$ else
368!!$ ldataonly=.true.
369!!$ end if
370
371
372!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
373 ! ------------- prepare filter options
374
375!!
376!! translate import option for dballe2003 api
377!!
378
379if (present(var)) then
380 nvar=count(c_e(var))
381 if (nvar > 0) then
382 allocate (vars%dcv(nvar))
383 do i=1,size(var)
384 if (c_e(var(i)))then
385 if (present(varkind))then
386 select case (varkind(i))
387 case("r")
388 allocate (vars%dcv(i)%dat,source=dbadatar(var(i)))
389 case("i")
390 allocate (vars%dcv(i)%dat,source=dbadatai(var(i)))
391 case("b")
392 allocate (vars%dcv(i)%dat,source=dbadatab(var(i)))
393 case("d")
394 allocate (vars%dcv(i)%dat,source=dbadatad(var(i)))
395 case("c")
396 allocate (vars%dcv(i)%dat,source=dbadatac(var(i)))
397 case default
398 call l4f_category_log(this%category,l4f_error,"var and varkind mismach")
399 CALL raise_fatal_error()
400 end select
401 else
402 allocate (vars%dcv(i)%dat,source=dbadatac(var(i))) !char is default
403 end if
404 end if
405 end do
406 end if
407end if
408
409if (present(anavar)) then
410 nanavar=count(c_e(anavar))
411 if (nanavar > 0) then
412 allocate (anavars%dcv(nanavar))
413 do i=1,size(anavar)
414 if (c_e(anavar(i)))then
415 if (present(anavarkind))then
416 select case (anavarkind(i))
417 case("r")
418 allocate (anavars%dcv(i)%dat,source=dbadatar(anavar(i)))
419 case("i")
420 allocate (anavars%dcv(i)%dat,source=dbadatai(anavar(i)))
421 case("b")
422 allocate (anavars%dcv(i)%dat,source=dbadatab(anavar(i)))
423 case("d")
424 allocate (anavars%dcv(i)%dat,source=dbadatad(anavar(i)))
425 case("c")
426 allocate (anavars%dcv(i)%dat,source=dbadatac(anavar(i)))
427 case default
428 call l4f_category_log(this%category,l4f_error,"anavar and anavarkind mismach")
429 CALL raise_fatal_error()
430 end select
431 else
432 allocate (anavars%dcv(i)%dat,source=dbadatac(anavar(i))) !char is default
433 end if
434 end if
435 end do
436 end if
437end if
438
439if (present(attr)) then
440 nattr=size(attr)
441 if (nattr == 0) then
442 allocate (starvars%dcv(nattr))
443 else
444 nattr=count(c_e(attr))
445 if (nattr > 0) then
446 allocate (starvars%dcv(nattr))
447 do i=1,size(attr)
448 if (c_e(attr(i)))then
449 if (present(attrkind))then
450 select case (attrkind(i))
451 case("r")
452 allocate (starvars%dcv(i)%dat,source=dbadatar(attr(i)))
453 case("i")
454 allocate (starvars%dcv(i)%dat,source=dbadatai(attr(i)))
455 case("b")
456 allocate (starvars%dcv(i)%dat,source=dbadatab(attr(i)))
457 case("d")
458 allocate (starvars%dcv(i)%dat,source=dbadatad(attr(i)))
459 case("c")
460 allocate (starvars%dcv(i)%dat,source=dbadatac(attr(i)))
461 case default
462 call l4f_category_log(this%category,l4f_error,"attr and attrkind mismach")
463 CALL raise_fatal_error()
464 end select
465 else
466 allocate (starvars%dcv(i)%dat,source=dbadatac(attr(i))) !char is default
467 end if
468 end if
469 end do
470 end if
471 endif
472end if
473
474if (present(anaattr)) then
475 nanaattr=size(anaattr)
476 if (nanaattr == 0) then
477 allocate (anastarvars%dcv(nanaattr))
478 else
479 nanaattr=count(c_e(anaattr))
480 if (nanaattr > 0) then
481 allocate (anastarvars%dcv(nanaattr))
482 do i=1,size(anaattr)
483 if (c_e(anaattr(i)))then
484 if (present(anaattrkind))then
485 select case (anaattrkind(i))
486 case("r")
487 allocate (anastarvars%dcv(i)%dat,source=dbadatar(anaattr(i)))
488 case("i")
489 allocate (anastarvars%dcv(i)%dat,source=dbadatai(anaattr(i)))
490 case("b")
491 allocate (anastarvars%dcv(i)%dat,source=dbadatab(anaattr(i)))
492 case("d")
493 allocate (anastarvars%dcv(i)%dat,source=dbadatad(anaattr(i)))
494 case("c")
495 allocate (anastarvars%dcv(i)%dat,source=dbadatac(anaattr(i)))
496 case default
497 call l4f_category_log(this%category,l4f_error,"attr and attrkind mismach")
498 CALL raise_fatal_error()
499 end select
500 else
501 allocate (anastarvars%dcv(i)%dat,source=dbadatac(anaattr(i))) !char is default
502 end if
503 end if
504 end do
505 end if
506 end if
507end if
508
509
510 ! like a cast
511mydbacoordmin=dbacoord()
512if (present(coordmin)) mydbacoordmin%geo_coord=coordmin
513mydbacoordmax=dbacoord()
514if (present(coordmax)) mydbacoordmax%geo_coord=coordmax
515mydbaana=dbaana()
516if (present(ana)) mydbaana%vol7d_ana=ana
517mydatetimemin=dbadatetime()
518if (present(timei)) mydatetimemin%datetime=timei
519mydatetimemax=dbadatetime()
520if (present(timef)) mydatetimemax%datetime=timef
521mydbatimerange=dbatimerange()
522if (present(timerange)) mydbatimerange%vol7d_timerange=timerange
523mydbalevel=dbalevel()
524if (present(level)) mydbalevel%vol7d_level=level
525mydbanetwork=dbanetwork()
526if (present(network)) mydbanetwork%vol7d_network=network
527
528!!
529!! here we have options ready for filter
530!!
531filter=dbafilter(coordmin=mydbacoordmin,coordmax=mydbacoordmax,ana=mydbaana, &
532 datetimemin=mydatetimemin,datetimemax=mydatetimemax, &
533 timerange=mydbatimerange,level=mydbalevel,network=mydbanetwork,query=query,&
534 vars=vars,starvars=starvars,anavars=anavars,anastarvars=anastarvars,&
535 dataonly=dataonly,anaonly=anaonly)
536!!$ print *, "filter:"
537!!$ call filter%display()
538
539call import(this,filter,set_network)
540
541
542END SUBROUTINE vol7d_dballe_import_old
543
544
545
546!>import da DB-all.e
547subroutine vol7d_dballe_import(this,filter,set_network)
548
549TYPE(vol7d_dballe),INTENT(inout) :: this !< oggetto vol7d_dballe
550type(dbafilter),INTENT(in) :: filter
551TYPE(vol7d_network),INTENT(in),OPTIONAL :: set_network
552
553TYPE(vol7d) :: vol7dtmp
554type(dbametaanddata),allocatable :: metaanddatav(:)
555type(dbafilter) :: myfilter
556
557CALL l4f_category_log(this%category,l4f_debug,'start import vol7d_dballe')
558
559if ( .not. filter%dataonly) then
560 ! ----------------> constant station data
561 myfilter=dbafilter(filter=filter,contextana=.true.,query=cmiss)
562! ! set filter
563! call this%handle%set(filter=myfilter)
564 ! estrude the data
565 CALL l4f_category_log(this%category,l4f_debug,'start import vol7d_dballe ingest for constant station data')
566! call this%handle%ingest(filter=myfilter)
567 call this%handle%ingest(metaanddatav,filter=myfilter)
568 CALL l4f_category_log(this%category,l4f_debug,'end import vol7d_dballe ingest')
569 CALL l4f_category_log(this%category,l4f_debug,'start import vol7d_dballe dba2v7d')
570 call dba2v7d(this%vol7d, metaanddatav,this%time_definition,set_network)
571 CALL l4f_category_log(this%category,l4f_debug,'end import vol7d_dballe dba2v7d')
572
573 deallocate (metaanddatav)
574
575else
576 ! empty volume
577 call init(this%vol7d)
578 call vol7d_alloc(this%vol7d)
579 call vol7d_alloc_vol(this%vol7d)
580end if
581 ! ----------------> constant station data end
582
583if ( .not. filter%anaonly) then
584 ! ----------------> working on data
585 myfilter=dbafilter(filter=filter,contextana=.false.)
586! ! set filter
587! call this%handle%set(filter=myfilter)
588 ! estrude the data
589
590 CALL l4f_category_log(this%category,l4f_debug,'start import vol7d_dballe ingest for station data')
591! call this%handle%ingest(filter=myfilter)
592 call this%handle%ingest(metaanddatav,filter=myfilter)
593 CALL l4f_category_log(this%category,l4f_debug,'end import vol7d_dballe ingest')
594 CALL l4f_category_log(this%category,l4f_debug,'start import vol7d_dballe dba2v7d')
595 call dba2v7d(vol7dtmp,metaanddatav,this%time_definition,set_network)
596 CALL l4f_category_log(this%category,l4f_debug,'end import vol7d_dballe dba2v7d')
597
598 deallocate (metaanddatav)
599
600 CALL vol7d_merge(this%vol7d, vol7dtmp, sort=.true.) ! Smart merge
601!!$else
602!!$ ! should we sort separately in case no merge is done?
603!!$ CALL vol7d_smart_sort(this%vol7d, lsort_time=.TRUE., lsort_timerange=.TRUE., lsort_level=.TRUE.)
604end if
605
606call vol7d_dballe_set_var_du(this%vol7d)
607
608
609#ifdef NONE
610
611!!$if (lattr) then
612!!$
613!!$ allocate (this%data_id( nana, ntime, nlevel, ntimerange, nnetwork),stat=istat)
614!!$ if (istat/= 0) THEN
615!!$ CALL l4f_category_log(this%category,L4F_ERROR,'cannot allocate ' &
616!!$ //TRIM(to_char(nana*ntime*nlevel*ntimerange*nnetwork))//' data_id elements')
617!!$ CALL raise_fatal_error()
618!!$
619!!$ ENDIF
620!!$
621!!$ this%data_id=DBA_MVI
622!!$
623!!$else
624
625nullify(this%data_id)
626
627!!$end if
628
629
630 !memorizzo data_id
631#ifdef DEBUG
632 !CALL l4f_category_log(this%category,L4F_DEBUG,"data_id: "//trim(to_char(buffer(i)%data_id)))
633#endif
634
635this%data_id(indana,indtime,indlevel,indtimerange,indnetwork)=buffer(i)%data_id
636
637
638ier=idba_set(this%handle,"*context_id",buffer(i)%data_id)
639ier=idba_set(this%handle,"*var_related",buffer(i)%btable)
640 !per ogni dato ora lavoro sugli attributi
641ier=idba_set(this%handle, "*varlist",starvarlist )
642ier=idba_voglioancora(this%handle,nn)
643 !print*,buffer(i)%btable," numero attributi",nn
644
645#endif
646
647CALL l4f_category_log(this%category,l4f_debug,'end import vol7d_dballe')
648
649end subroutine vol7d_dballe_import
650
651
652
653 !>\brief Cancella l'oggetto
654
655SUBROUTINE vol7d_dballe_delete(this, preserveidbhandle)
656TYPE(vol7d_dballe) :: this !< oggetto da cancellare
657logical,intent(in), optional :: preserveidbhandle !< do not close connection to dsn
658
659# ifndef F2003_FULL_FEATURES
660call this%handle%delete()
661
662if (.not. optio_log(preserveidbhandle)) call this%idbhandle%delete()
663# endif
664
665!!$if (associated(this%data_id)) then
666!!$ deallocate (this%data_id)
667!!$ nullify(this%data_id)
668!!$end if
669
670CALL delete(this%vol7d)
671
672 !chiudo il logger
673call l4f_category_delete(this%category)
674 !ier=l4f_fini()
675
676END SUBROUTINE vol7d_dballe_delete
677
678
679
680 !>\brief import dba objects in vol7d
681!subroutine dba2v7d(this,metaanddatav,vars,starvars,anavars,anastarvars,time_definition, set_network)
682subroutine dba2v7d(this,metaanddatav,time_definition, set_network)
683
684type(dbametaanddata),intent(inout) :: metaanddatav(:) ! change value in datetime reguard timedefinition
685TYPE(vol7d),INTENT(inout) :: this
686integer,INTENT(in),OPTIONAL :: time_definition !< 0=time is reference time ; 1=time is validity time (default=1)
687TYPE(vol7d_network),INTENT(in),OPTIONAL :: set_network
688type(dbadcv) :: vars
689type(dbadcv) :: starvars
690type(dbadcv) :: anavars
691type(dbadcv) :: anastarvars
692
693
694LOGICAL :: ldegnet
695integer :: indana,indtime,indlevel,indtimerange,inddativar,indnetwork,indattrvar
696
697integer :: nana,ntime,ntimerange,nlevel,nnetwork
698
699INTEGER :: i, j, k, n
700integer :: inddativarattr
701integer :: nanavar, indanavar,indanavarattr,nanavarattr
702
703integer :: ndativarr, ndativari, ndativarb, ndativard, ndativarc
704integer :: ndatiattrr, ndatiattri, ndatiattrb, ndatiattrd, ndatiattrc
705integer :: ndativarattrr, ndativarattri, ndativarattrb, ndativarattrd, ndativarattrc
706
707integer :: nanavarr, nanavari, nanavarb, nanavard, nanavarc
708integer :: nanaattrr, nanaattri, nanaattrb, nanaattrd, nanaattrc
709integer :: nanavarattrr, nanavarattri, nanavarattrb, nanavarattrd, nanavarattrc
710
711integer :: ndativar,ndativarattr
712
713type(characterlist) :: dativarl,dativarattrl,anavarl,anavarattrl
714
715character(len=listcharmaxlen),allocatable :: dativara(:),dativarattra(:),anavara(:),anavarattra(:)
716logical :: status
717integer :: ltime_definition
718
719type(datetime),allocatable :: tmptime(:)
720type(vol7d_network),allocatable :: tmpnetwork(:)
721type(vol7d_level),allocatable :: tmplevel(:)
722type(vol7d_timerange),allocatable :: tmptimerange(:)
723type(vol7d_ana),allocatable :: tmpana(:)
724
725
726ltime_definition=optio_i(time_definition)
727if (.not. c_e(ltime_definition)) ltime_definition = 1
728
729 ! take in account time_definition
730if (ltime_definition == 0) then
731 do i =1,size(metaanddatav)
732 metaanddatav(i)%metadata%datetime%datetime = &
733 metaanddatav(i)%metadata%datetime%datetime - &
734 timedelta_new(sec=metaanddatav(i)%metadata%timerange%vol7d_timerange%p1)
735 end do
736end if
737
738if (ltime_definition == 2) then
739 do i =1,size(metaanddatav)
740 metaanddatav(i)%metadata%timerange%vol7d_timerange%p1 = 0
741 end do
742end if
743
744
745IF (PRESENT(set_network)) THEN
746 if (c_e(set_network)) then
747 ldegnet = .true.
748 else
749 ldegnet = .false.
750 end if
751ELSE
752 ldegnet = .false.
753ENDIF
754
755
756
757!!--------------------------------------------------------------------------
758!! find vars, starvars, anavars, anastarvars
759!!
760
761! create lists of all
762 ! data
763do i =1, size(metaanddatav)
764 do j=1, size(metaanddatav(i)%dataattrv%dataattr)
765 if (c_e(metaanddatav(i)%metadata%datetime%datetime)) then
766 !print *,"dativarl: ", metaanddatav(i)%dataattrv%dataattr(j)%dat%btable
767 call dativarl%append(metaanddatav(i)%dataattrv%dataattr(j)%dat%btable)
768 else
769 !print *,"anavarl: ", metaanddatav(i)%dataattrv%dataattr(j)%dat%btable
770 call anavarl%append(metaanddatav(i)%dataattrv%dataattr(j)%dat%btable)
771 end if
772 end do
773end do
774
775!count and put in vector of unuique key
776ndativar = count_distinct(toarray_charl(dativarl) , back=.true.)
777allocate(dativara(ndativar))
778call pack_distinct_c (toarray_charl(dativarl) , dativara , back=.true.)
779status = dativarl%delete()
780allocate (vars%dcv(ndativar))
781
782nanavar = count_distinct(toarray_charl(anavarl) , back=.true.)
783allocate(anavara(nanavar))
784call pack_distinct_c (toarray_charl(anavarl) , anavara , back=.true.)
785status = anavarl%delete()
786allocate (anavars%dcv(nanavar))
787
788
789an: do n=1,ndativar
790 do i =1, size(metaanddatav)
791 do j=1, size(metaanddatav(i)%dataattrv%dataattr)
792 if (c_e(metaanddatav(i)%metadata%datetime%datetime)) then
793 if (metaanddatav(i)%dataattrv%dataattr(j)%dat%btable == dativara(n)) then
794 allocate(vars%dcv(n)%dat,source=metaanddatav(i)%dataattrv%dataattr(j)%dat)
795 cycle an
796 end if
797 end if
798 end do
799 end do
800end do an
801
802bn: do n=1,nanavar
803 do i =1, size(metaanddatav)
804 do j=1, size(metaanddatav(i)%dataattrv%dataattr)
805 if (.not. c_e(metaanddatav(i)%metadata%datetime%datetime)) then
806 if (metaanddatav(i)%dataattrv%dataattr(j)%dat%btable == anavara(n)) then
807 allocate(anavars%dcv(n)%dat,source=metaanddatav(i)%dataattrv%dataattr(j)%dat)
808 cycle bn
809 end if
810 end if
811 end do
812 end do
813end do bn
814
815 ! attributes
816do i =1, size(metaanddatav)
817 do j=1, size(metaanddatav(i)%dataattrv%dataattr)
818 do k=1, size(metaanddatav(i)%dataattrv%dataattr(j)%attrv%dcv)
819 if (c_e(metaanddatav(i)%metadata%datetime%datetime)) then
820 !print *,"dativarattrl: ", metaanddatav(i)%dataattrv%dataattr(j)%attrv%dcv(k)%dat%btable
821 call dativarattrl%append(metaanddatav(i)%dataattrv%dataattr(j)%attrv%dcv(k)%dat%btable)
822 else
823 !print *,"anavarattrl: ", metaanddatav(i)%dataattrv%dataattr(j)%attrv%dcv(k)%dat%btable
824 call anavarattrl%append(metaanddatav(i)%dataattrv%dataattr(j)%attrv%dcv(k)%dat%btable)
825 end if
826 end do
827 end do
828end do
829
830
831ndativarattr = count_distinct(toarray_charl(dativarattrl), back=.true.)
832allocate(dativarattra(ndativarattr))
833call pack_distinct_c (toarray_charl(dativarattrl), dativarattra, back=.true.)
834status = dativarattrl%delete()
835allocate(starvars%dcv(ndativarattr))
836
837nanavarattr = count_distinct(toarray_charl(anavarattrl) , back=.true.)
838allocate(anavarattra(nanavarattr))
839call pack_distinct_c (toarray_charl(anavarattrl) , anavarattra , back=.true.)
840status = anavarattrl%delete()
841allocate(anastarvars%dcv(nanavarattr))
842
843
844cn: do n=1,ndativarattr
845 do i =1, size(metaanddatav)
846 do j=1, size(metaanddatav(i)%dataattrv%dataattr)
847 do k=1, size(metaanddatav(i)%dataattrv%dataattr(j)%attrv%dcv)
848 if (c_e(metaanddatav(i)%metadata%datetime%datetime)) then
849 if (metaanddatav(i)%dataattrv%dataattr(j)%attrv%dcv(k)%dat%btable == dativarattra(n))then
850 allocate(starvars%dcv(n)%dat,source=metaanddatav(i)%dataattrv%dataattr(j)%attrv%dcv(k)%dat)
851 cycle cn
852 end if
853 end if
854 end do
855 end do
856 end do
857end do cn
858
859
860dn: do n=1,nanavarattr
861 do i =1, size(metaanddatav)
862 do j=1, size(metaanddatav(i)%dataattrv%dataattr)
863 do k=1, size(metaanddatav(i)%dataattrv%dataattr(j)%attrv%dcv)
864 if (.not. c_e(metaanddatav(i)%metadata%datetime%datetime)) then
865 if (metaanddatav(i)%dataattrv%dataattr(j)%attrv%dcv(k)%dat%btable == anavarattra(n))then
866 allocate(anastarvars%dcv(n)%dat,source=metaanddatav(i)%dataattrv%dataattr(j)%attrv%dcv(k)%dat)
867 cycle dn
868 end if
869 end if
870 end do
871 end do
872 end do
873end do dn
874
875
876!!--------------------------------------------------------------------------
877
878
879!!
880!! count all unique metadata
881!!
882
883if(ldegnet) then
884 nnetwork=1
885else
886 !nnetwork = count_distinct(metaanddatav(:)%metadata%network%vol7d_network, back=.TRUE.)
887 allocate (tmpnetwork(size(metaanddatav(:))),&
888 source=metaanddatav(:)%metadata%network%vol7d_network)
889 call sort(tmpnetwork)
890 nnetwork = count_distinct_sorted(tmpnetwork)
891end if
892
893!ntime = count_distinct(metaanddatav(:)%metadata%datetime%datetime, &
894! mask=c_e(metaanddatav(:)%metadata%datetime%datetime),back=.TRUE.)
895allocate (tmptime(size(metaanddatav(:))),&
896 source=metaanddatav(:)%metadata%datetime%datetime)
897call sort(tmptime)
898ntime = count_distinct_sorted(tmptime,mask=c_e(tmptime))
899
900!ntimerange = count_distinct(metaanddatav(:)%metadata%timerange%vol7d_timerange, &
901! mask=c_e(metaanddatav(:)%metadata%timerange%vol7d_timerange), back=.TRUE.)
902allocate (tmptimerange(size(metaanddatav(:))),&
903 source=metaanddatav(:)%metadata%timerange%vol7d_timerange)
904call sort(tmptimerange)
905ntimerange = count_distinct_sorted(tmptimerange,mask=c_e(tmptimerange))
906
907!nlevel = count_distinct(metaanddatav(:)%metadata%level%vol7d_level, &
908! mask=c_e(metaanddatav(:)%metadata%level%vol7d_level),back=.TRUE.)
909allocate (tmplevel(size(metaanddatav(:))),&
910 source=metaanddatav(:)%metadata%level%vol7d_level)
911call sort(tmplevel)
912nlevel = count_distinct_sorted(tmplevel,mask=c_e(tmplevel))
913
914!nana = count_distinct(metaanddatav(:)%metadata%ana%vol7d_ana, back=.TRUE.)
915allocate (tmpana(size(metaanddatav(:))),&
916 source=metaanddatav(:)%metadata%ana%vol7d_ana)
917call sort(tmpana)
918nana = count_distinct_sorted(tmpana)
919
920!!$if(ldegnet) then
921!!$ nnetwork=1
922!!$else
923!!$ nnetwork = size(metaanddatav(:)%metadata%network%vol7d_network)
924!!$end if
925!!$ntime = size(metaanddatav(:)%metadata%datetime%datetime)
926!!$ntimerange = size(metaanddatav(:)%metadata%timerange%vol7d_timerange)
927!!$nlevel = size(metaanddatav(:)%metadata%level%vol7d_level)
928!!$nana = size(metaanddatav(:)%metadata%ana%vol7d_ana)
929
930 ! var
931
932ndativarr = 0
933ndativari = 0
934ndativarb = 0
935ndativard = 0
936ndativarc = 0
937
938do i =1 ,size(vars%dcv)
939 associate(dato => vars%dcv(i)%dat)
940 select type (dato)
941 type is (dbadatar)
942 ndativarr = ndativarr + 1
943 type is (dbadatai)
944 ndativari = ndativari + 1
945 type is (dbadatab)
946 ndativarb = ndativarb + 1
947 type is (dbadatad)
948 ndativard = ndativard + 1
949 type is (dbadatac)
950 ndativarc = ndativarc + 1
951 end select
952 end associate
953end do
954
955
956 !attr
957
958ndatiattrr = 0
959ndatiattri = 0
960ndatiattrb = 0
961ndatiattrd = 0
962ndatiattrc = 0
963
964do i =1 ,size(starvars%dcv)
965 associate(dato => starvars%dcv(i)%dat)
966 select type (dato)
967 type is (dbadatar)
968 ndatiattrr = ndatiattrr + 1
969 type is (dbadatai)
970 ndatiattri = ndatiattri + 1
971 type is (dbadatab)
972 ndatiattrb = ndatiattrb + 1
973 type is (dbadatad)
974 ndatiattrd = ndatiattrd + 1
975 type is (dbadatac)
976 ndatiattrc = ndatiattrc + 1
977 end select
978 end associate
979end do
980
981
982 ! ana var
983
984nanavarr = 0
985nanavari = 0
986nanavarb = 0
987nanavard = 0
988nanavarc = 0
989
990do i =1 ,size(anavars%dcv)
991 associate(dato => anavars%dcv(i)%dat)
992 select type (dato)
993 type is (dbadatar)
994 nanavarr = nanavarr + 1
995 type is (dbadatai)
996 nanavari = nanavari + 1
997 type is (dbadatab)
998 nanavarb = nanavarb + 1
999 type is (dbadatad)
1000 nanavard = nanavard + 1
1001 type is (dbadatac)
1002 nanavarc = nanavarc + 1
1003 end select
1004 end associate
1005end do
1006
1007
1008 ! ana attr
1009
1010nanaattrr = 0
1011nanaattri = 0
1012nanaattrb = 0
1013nanaattrd = 0
1014nanaattrc = 0
1015
1016do i =1 ,size(anastarvars%dcv)
1017 associate(dato => anastarvars%dcv(i)%dat)
1018 select type (dato)
1019 type is (dbadatar)
1020 nanaattrr = nanaattrr + 1
1021 type is (dbadatai)
1022 nanaattri = nanaattri + 1
1023 type is (dbadatab)
1024 nanaattrb = nanaattrb + 1
1025 type is (dbadatad)
1026 nanaattrd = nanaattrd + 1
1027 type is (dbadatac)
1028 nanaattrc = nanaattrc + 1
1029 end select
1030 end associate
1031end do
1032
1033
1034 !refine
1035
1036ndativarattrr=0
1037ndativarattri=0
1038ndativarattrb=0
1039ndativarattrd=0
1040ndativarattrc=0
1041
1042if (ndatiattrr > 0 ) ndativarattrr=ndativarr+ndativari+ndativarb+ndativard+ndativarc
1043if (ndatiattri > 0 ) ndativarattri=ndativarr+ndativari+ndativarb+ndativard+ndativarc
1044if (ndatiattrb > 0 ) ndativarattrb=ndativarr+ndativari+ndativarb+ndativard+ndativarc
1045if (ndatiattrd > 0 ) ndativarattrd=ndativarr+ndativari+ndativarb+ndativard+ndativarc
1046if (ndatiattrc > 0 ) ndativarattrc=ndativarr+ndativari+ndativarb+ndativard+ndativarc
1047
1048
1049nanavarattrr=0
1050nanavarattri=0
1051nanavarattrb=0
1052nanavarattrd=0
1053nanavarattrc=0
1054
1055if (nanaattrr > 0 ) nanavarattrr=nanavarr+nanavari+nanavarb+nanavard+nanavarc
1056if (nanaattri > 0 ) nanavarattri=nanavarr+nanavari+nanavarb+nanavard+nanavarc
1057if (nanaattrb > 0 ) nanavarattrb=nanavarr+nanavari+nanavarb+nanavard+nanavarc
1058if (nanaattrd > 0 ) nanavarattrd=nanavarr+nanavari+nanavarb+nanavard+nanavarc
1059if (nanaattrc > 0 ) nanavarattrc=nanavarr+nanavari+nanavarb+nanavard+nanavarc
1060
1061
1062CALL init(this,time_definition=ltime_definition)
1063
1064!!$print *, "nana=",nana, "ntime=",ntime, "ntimerange=",ntimerange, &
1065!!$ "nlevel=",nlevel, "nnetwork=",nnetwork, &
1066!!$ "ndativarr=",ndativarr, "ndativari=",ndativari, &
1067!!$ "ndativarb=",ndativarb, "ndativard=",ndativard, "ndativarc=",ndativarc,&
1068!!$ "ndatiattrr=",ndatiattrr, "ndatiattri=",ndatiattri, "ndatiattrb=",ndatiattrb,&
1069!!$ "ndatiattrd=",ndatiattrd, "ndatiattrc=",ndatiattrc,&
1070!!$ "ndativarattrr=",ndativarattrr, "ndativarattri=",ndativarattri, "ndativarattrb=",ndativarattrb,&
1071!!$ "ndativarattrd=",ndativarattrd, "ndativarattrc=",ndativarattrc
1072!!$
1073!!$print *,"nanaattrr,nanaattri,nanaattrb,nanaattrd,nanaattrc"
1074!!$print *,nanaattrr,nanaattri,nanaattrb,nanaattrd,nanaattrc
1075
1076
1077call vol7d_alloc (this, &
1078nana=nana, ntime=ntime, ntimerange=ntimerange, &
1079nlevel=nlevel, nnetwork=nnetwork, &
1080ndativarr=ndativarr, ndativari=ndativari, ndativarb=ndativarb, ndativard=ndativard, ndativarc=ndativarc,&
1081ndatiattrr=ndatiattrr, ndatiattri=ndatiattri, ndatiattrb=ndatiattrb, ndatiattrd=ndatiattrd, ndatiattrc=ndatiattrc,&
1082ndativarattrr=ndativarattrr, &
1083ndativarattri=ndativarattri, &
1084ndativarattrb=ndativarattrb, &
1085ndativarattrd=ndativarattrd, &
1086ndativarattrc=ndativarattrc,&
1087nanavarr=nanavarr, nanavari=nanavari, nanavarb=nanavarb, nanavard=nanavard, nanavarc=nanavarc,&
1088nanaattrr=nanaattrr, nanaattri=nanaattri, nanaattrb=nanaattrb, nanaattrd=nanaattrd, nanaattrc=nanaattrc,&
1089nanavarattrr=nanavarattrr, &
1090nanavarattri=nanavarattri, &
1091nanavarattrb=nanavarattrb, &
1092nanavarattrd=nanavarattrd, &
1093nanavarattrc=nanavarattrc)
1094
1095
1096! fill metadata removing contextana metadata
1097
1098!nana=count_and_pack_distinct(metaanddatav(:)%metadata%ana%vol7d_ana,this%ana, back=.TRUE.)
1099!this%ana=pack_distinct(metaanddatav(:)%metadata%ana%vol7d_ana, nana, back=.TRUE.)
1100this%ana=pack_distinct_sorted(tmpana, nana)
1101deallocate(tmpana)
1102!call sort(this%ana)
1103
1104!ntime=count_and_pack_distinct(metaanddatav(:)%metadata%datetime%datetime,this%time, &
1105! mask=c_e(metaanddatav(:)%metadata%datetime%datetime), back=.TRUE.)
1106!this%time=pack_distinct(metaanddatav(:)%metadata%datetime%datetime, ntime, &
1107! mask=c_e(metaanddatav(:)%metadata%datetime%datetime),back=.TRUE.)
1108this%time=pack_distinct_sorted(tmptime, ntime,mask=c_e(tmptime))
1109deallocate(tmptime)
1110!call sort(this%time)
1111
1112!ntimerange=count_and_pack_distinct(metaanddatav(:)%metadata%timerange%vol7d_timerange,this%timerange, &
1113! mask=c_e(metaanddatav(:)%metadata%timerange%vol7d_timerange), back=.TRUE.)
1114!this%timerange=pack_distinct(metaanddatav(:)%metadata%timerange%vol7d_timerange, ntimerange, &
1115! mask=c_e(metaanddatav(:)%metadata%timerange%vol7d_timerange), back=.TRUE.)
1116this%timerange=pack_distinct_sorted(tmptimerange, ntimerange,mask=c_e(tmptimerange))
1117deallocate(tmptimerange)
1118!call sort(this%timerange)
1119
1120!nlevel=count_and_pack_distinct(metaanddatav(:)%metadata%level%vol7d_level,this%level, &
1121! mask=c_e(metaanddatav(:)%metadata%level%vol7d_level), back=.TRUE.)
1122!this%level=pack_distinct(metaanddatav(:)%metadata%level%vol7d_level, nlevel, &
1123! mask=c_e(metaanddatav(:)%metadata%level%vol7d_level), back=.TRUE.)
1124this%level=pack_distinct_sorted(tmplevel, nlevel,mask=c_e(tmplevel))
1125deallocate(tmplevel)
1126!call sort(this%level)
1127
1128if(ldegnet)then
1129 nnetwork=1
1130 ALLOCATE(this%network(1))
1131 this%network(1)=set_network
1132else
1133 !nnetwork=count_and_pack_distinct(metaanddatav(:)%metadata%network%vol7d_network,this%network, back=.TRUE.)
1134 !this%network=pack_distinct(metaanddatav(:)%metadata%network%vol7d_network, nnetwork, back=.TRUE.)
1135 this%network=pack_distinct_sorted(tmpnetwork, nnetwork)
1136 deallocate(tmpnetwork)
1137end if
1138!call sort(this%network)
1139
1140 ! var
1141
1142ndativarr = 0
1143ndativari = 0
1144ndativarb = 0
1145ndativard = 0
1146ndativarc = 0
1147
1148do i =1 ,size(vars%dcv)
1149 associate(dato => vars%dcv(i)%dat)
1150 select type (dato)
1151 type is (dbadatar)
1152 ndativarr = ndativarr + 1
1153 call init (this%dativar%r(ndativarr), btable=dato%btable)
1154 type is (dbadatai)
1155 ndativari = ndativari + 1
1156 call init (this%dativar%i(ndativari), btable=dato%btable)
1157 type is (dbadatab)
1158 ndativarb = ndativarb + 1
1159 call init (this%dativar%b(ndativarb), btable=dato%btable)
1160 type is (dbadatad)
1161 ndativard = ndativard + 1
1162 call init (this%dativar%d(ndativard), btable=dato%btable)
1163 type is (dbadatac)
1164 ndativarc = ndativarc + 1
1165 call init (this%dativar%c(ndativarc), btable=dato%btable)
1166 end select
1167 end associate
1168end do
1169
1170
1171 !attr
1172
1173ndatiattrr = 0
1174ndatiattri = 0
1175ndatiattrb = 0
1176ndatiattrd = 0
1177ndatiattrc = 0
1178
1179do i =1 ,size(starvars%dcv)
1180 associate(dato => starvars%dcv(i)%dat)
1181 select type (dato)
1182 type is (dbadatar)
1183 ndatiattrr = ndatiattrr + 1
1184 call init (this%datiattr%r(ndatiattrr), btable=dato%btable)
1185 type is (dbadatai)
1186 ndatiattri = ndatiattri + 1
1187 call init (this%datiattr%i(ndatiattri), btable=dato%btable)
1188 type is (dbadatab)
1189 ndatiattrb = ndatiattrb + 1
1190 call init (this%datiattr%b(ndatiattrb), btable=dato%btable)
1191 type is (dbadatad)
1192 ndatiattrd = ndatiattrd + 1
1193 call init (this%datiattr%d(ndatiattrd), btable=dato%btable)
1194 type is (dbadatac)
1195 ndatiattrc = ndatiattrc + 1
1196 call init (this%datiattr%c(ndatiattrc), btable=dato%btable)
1197 end select
1198 end associate
1199end do
1200
1201
1202 ! ana var
1203
1204nanavarr = 0
1205nanavari = 0
1206nanavarb = 0
1207nanavard = 0
1208nanavarc = 0
1209
1210do i =1 ,size(anavars%dcv)
1211 associate(dato => anavars%dcv(i)%dat)
1212 select type (dato)
1213 type is (dbadatar)
1214 nanavarr = nanavarr + 1
1215 call init (this%anavar%r(nanavarr), btable=dato%btable)
1216 type is (dbadatai)
1217 nanavari = nanavari + 1
1218 call init (this%anavar%i(nanavari), btable=dato%btable)
1219 type is (dbadatab)
1220 nanavarb = nanavarb + 1
1221 call init (this%anavar%b(nanavarb), btable=dato%btable)
1222 type is (dbadatad)
1223 nanavard = nanavard + 1
1224 call init (this%anavar%d(nanavard), btable=dato%btable)
1225 type is (dbadatac)
1226 nanavarc = nanavarc + 1
1227 call init (this%anavar%c(nanavarc), btable=dato%btable)
1228 end select
1229 end associate
1230end do
1231
1232
1233 ! ana attr
1234
1235nanaattrr = 0
1236nanaattri = 0
1237nanaattrb = 0
1238nanaattrd = 0
1239nanaattrc = 0
1240
1241do i =1 ,size(anastarvars%dcv)
1242 associate(dato => anastarvars%dcv(i)%dat)
1243 select type (dato)
1244 type is (dbadatar)
1245 nanaattrr = nanaattrr + 1
1246 call init (this%anaattr%r(nanaattrr), btable=dato%btable)
1247 type is (dbadatai)
1248 nanaattri = nanaattri + 1
1249 call init (this%anaattr%i(nanaattri), btable=dato%btable)
1250 type is (dbadatab)
1251 nanaattrb = nanaattrb + 1
1252 call init (this%anaattr%b(nanaattrb), btable=dato%btable)
1253 type is (dbadatad)
1254 nanaattrd = nanaattrd + 1
1255 call init (this%anaattr%d(nanaattrd), btable=dato%btable)
1256 type is (dbadatac)
1257 nanaattrc = nanaattrc + 1
1258 call init (this%anaattr%c(nanaattrc), btable=dato%btable)
1259 end select
1260 end associate
1261end do
1262
1263
1264 ! here we colcolate the link from attributes and vars
1265do i =1, size(vars%dcv)
1266 associate(dato => vars%dcv(i)%dat)
1267 if ( ndativarattri > 0 ) call init(this%dativarattr%i(i),btable=dato%btable)
1268 if ( ndativarattrr > 0 ) call init(this%dativarattr%r(i),btable=dato%btable)
1269 if ( ndativarattrd > 0 ) call init(this%dativarattr%d(i),btable=dato%btable)
1270 if ( ndativarattrb > 0 ) call init(this%dativarattr%b(i),btable=dato%btable)
1271 if ( ndativarattrc > 0 ) call init(this%dativarattr%c(i),btable=dato%btable)
1272 end associate
1273end do
1274
1275do i =1, size(anavars%dcv)
1276 associate(dato => anavars%dcv(i)%dat)
1277 if ( nanavarattri > 0 ) call init(this%anavarattr%i(i),btable=dato%btable)
1278 if ( nanavarattrr > 0 ) call init(this%anavarattr%r(i),btable=dato%btable)
1279 if ( nanavarattrd > 0 ) call init(this%anavarattr%d(i),btable=dato%btable)
1280 if ( nanavarattrb > 0 ) call init(this%anavarattr%b(i),btable=dato%btable)
1281 if ( nanavarattrc > 0 ) call init(this%anavarattr%c(i),btable=dato%btable)
1282 end associate
1283end do
1284
1285 ! set index in dativaratt*
1286call vol7d_set_attr_ind(this)
1287
1288call vol7d_alloc_vol (this)
1289
1290 ! Ora qui bisogna metterci dentro idati
1291indana = 0
1292indtime = 0
1293indnetwork = 0
1294indtime = 0
1295indtimerange = 0
1296indlevel = 0
1297do i =1, size(metaanddatav)
1298
1299 indana = index_sorted(this%ana, metaanddatav(i)%metadata%ana%vol7d_ana)
1300
1301 if (ldegnet)then
1302 indnetwork=1
1303 else
1304 indnetwork = index_sorted(this%network, metaanddatav(i)%metadata%network%vol7d_network)
1305 endif
1306
1307 if (c_e(metaanddatav(i)%metadata%datetime%datetime) .and. &
1308 c_e(metaanddatav(i)%metadata%timerange%vol7d_timerange) .and. &
1309 c_e(metaanddatav(i)%metadata%level%vol7d_level) ) then ! dati
1310
1311 indtime = index_sorted(this%time, metaanddatav(i)%metadata%datetime%datetime)
1312 indtimerange = index_sorted(this%timerange, metaanddatav(i)%metadata%timerange%vol7d_timerange)
1313 indlevel = index_sorted(this%level, metaanddatav(i)%metadata%level%vol7d_level)
1314
1315 do j=1, size(metaanddatav(i)%dataattrv%dataattr)
1316
1317 associate(dato => metaanddatav(i)%dataattrv%dataattr(j)%dat)
1318 select type (dato)
1319 type is (dbadatai)
1320 inddativar = firsttrue(dato%btable == this%dativar%i%btable)
1321 this%voldatii( &
1322 indana,indtime,indlevel,indtimerange,inddativar,indnetwork &
1323 ) = dato%value
1324
1325 type is (dbadatar)
1326 inddativar = firsttrue(dato%btable == this%dativar%r%btable)
1327 this%voldatir( &
1328 indana,indtime,indlevel,indtimerange,inddativar,indnetwork &
1329 ) = dato%value
1330
1331 type is (dbadatad)
1332 inddativar = firsttrue(dato%btable == this%dativar%d%btable)
1333 this%voldatid( &
1334 indana,indtime,indlevel,indtimerange,inddativar,indnetwork &
1335 ) = dato%value
1336
1337 type is (dbadatab)
1338 inddativar = firsttrue(dato%btable == this%dativar%b%btable)
1339 this%voldatib( &
1340 indana,indtime,indlevel,indtimerange,inddativar,indnetwork &
1341 ) = dato%value
1342
1343 type is (dbadatac)
1344 inddativar = firsttrue(dato%btable == this%dativar%c%btable)
1345 this%voldatic( &
1346 indana,indtime,indlevel,indtimerange,inddativar,indnetwork &
1347 ) = dato%value
1348
1349 end select
1350
1351
1352 ! dati attributes
1353 do k=1, size(metaanddatav(i)%dataattrv%dataattr(j)%attrv%dcv)
1354 associate(attr => metaanddatav(i)%dataattrv%dataattr(j)%attrv%dcv(k)%dat)
1355 select type (attr)
1356
1357 type is (dbadatai)
1358 inddativarattr = firsttrue(dato%btable == this%dativarattr%i%btable)
1359 indattrvar = firsttrue(attr%btable == this%datiattr%i%btable)
1360 this%voldatiattri( &
1361 indana,indtime,indlevel,indtimerange,inddativarattr,indnetwork,indattrvar &
1362 ) = attr%value
1363 type is (dbadatar)
1364 inddativarattr = firsttrue(dato%btable == this%dativarattr%r%btable)
1365 indattrvar = firsttrue(attr%btable == this%datiattr%r%btable)
1366 this%voldatiattrr( &
1367 indana,indtime,indlevel,indtimerange,inddativarattr,indnetwork,indattrvar &
1368 ) = attr%value
1369 type is (dbadatad)
1370 inddativarattr = firsttrue(dato%btable == this%dativarattr%d%btable)
1371 indattrvar = firsttrue(attr%btable == this%datiattr%d%btable)
1372 this%voldatiattrd( &
1373 indana,indtime,indlevel,indtimerange,inddativarattr,indnetwork,indattrvar &
1374 ) = attr%value
1375 type is (dbadatab)
1376 inddativarattr = firsttrue(dato%btable == this%dativarattr%b%btable)
1377 indattrvar = firsttrue(attr%btable == this%datiattr%b%btable)
1378 this%voldatiattrb( &
1379 indana,indtime,indlevel,indtimerange,inddativarattr,indnetwork,indattrvar &
1380 ) = attr%value
1381 type is (dbadatac)
1382 inddativarattr = firsttrue(dato%btable == this%dativarattr%c%btable)
1383 indattrvar = firsttrue(attr%btable == this%datiattr%c%btable)
1384 this%voldatiattrc( &
1385 indana,indtime,indlevel,indtimerange,inddativarattr,indnetwork,indattrvar &
1386 ) = attr%value
1387
1388 end select
1389 end associate
1390 end do
1391 end associate
1392 end do
1393
1394 else
1395 ! ana
1396 do j=1, size(metaanddatav(i)%dataattrv%dataattr)
1397
1398 associate(dato => metaanddatav(i)%dataattrv%dataattr(j)%dat)
1399 select type (dato)
1400 type is (dbadatai)
1401 indanavar = firsttrue(dato%btable == this%anavar%i%btable)
1402 this%volanai( &
1403 indana,indanavar,indnetwork &
1404 ) = dato%value
1405
1406 type is (dbadatar)
1407 indanavar = firsttrue(dato%btable == this%anavar%r%btable)
1408 this%volanar( &
1409 indana,indanavar,indnetwork &
1410 ) = dato%value
1411
1412 type is (dbadatad)
1413 indanavar = firsttrue(dato%btable == this%anavar%d%btable)
1414 this%volanad( &
1415 indana,indanavar,indnetwork &
1416 ) = dato%value
1417
1418 type is (dbadatab)
1419 indanavar = firsttrue(dato%btable == this%anavar%b%btable)
1420 this%volanab( &
1421 indana,indanavar,indnetwork &
1422 ) = dato%value
1423
1424 type is (dbadatac)
1425 indanavar = firsttrue(dato%btable == this%anavar%c%btable)
1426 this%volanac( &
1427 indana,indanavar,indnetwork &
1428 ) = dato%value
1429
1430 end select
1431
1432
1433 ! ana attributes
1434 do k=1, size(metaanddatav(i)%dataattrv%dataattr(j)%attrv%dcv)
1435 associate(attr => metaanddatav(i)%dataattrv%dataattr(j)%attrv%dcv(k)%dat)
1436 select type (attr)
1437
1438 type is (dbadatai)
1439 indanavarattr = firsttrue(dato%btable == this%anavarattr%i%btable)
1440 indattrvar = firsttrue(attr%btable == this%anaattr%i%btable)
1441 this%volanaattri( &
1442 indana,indanavarattr,indnetwork,indattrvar &
1443 ) = attr%value
1444 type is (dbadatar)
1445 indanavarattr = firsttrue(dato%btable == this%anavarattr%r%btable)
1446 indattrvar = firsttrue(attr%btable == this%anaattr%r%btable)
1447 this%volanaattrr( &
1448 indana,indanavarattr,indnetwork,indattrvar &
1449 ) = attr%value
1450 type is (dbadatad)
1451 indanavarattr = firsttrue(dato%btable == this%anavarattr%d%btable)
1452 indattrvar = firsttrue(attr%btable == this%anaattr%d%btable)
1453 this%volanaattrd( &
1454 indana,indanavarattr,indnetwork,indattrvar &
1455 ) = attr%value
1456 type is (dbadatab)
1457 indanavarattr = firsttrue(dato%btable == this%anavarattr%b%btable)
1458 indattrvar = firsttrue(attr%btable == this%anaattr%b%btable)
1459 this%volanaattrb( &
1460 indana,indanavarattr,indnetwork,indattrvar &
1461 ) = attr%value
1462 type is (dbadatac)
1463 indanavarattr = firsttrue(dato%btable == this%anavarattr%c%btable)
1464 indattrvar = firsttrue(attr%btable == this%anaattr%c%btable)
1465 this%volanaattrc( &
1466 indana,indanavarattr,indnetwork,indattrvar &
1467 ) = attr%value
1468
1469 end select
1470 end associate
1471 end do
1472 end associate
1473 end do
1474 end if
1475end do
1476
1477contains
1478
1479!!$!> /brief Return an dbadcv from a mixlist with dbadata* type
1480!!$function todcv_dbadat(this)
1481!!$type(dbadcv) :: todcv_dbadat !< array
1482!!$type(mixlist) :: this
1483!!$
1484!!$integer :: i
1485!!$
1486!!$allocate (todcv_dbadat%dcv(this%countelements()))
1487!!$
1488!!$call this%rewind()
1489!!$i=0
1490!!$do while(this%element())
1491!!$ i=i+1
1492!!$
1493!!$ associate (dato => this%current())
1494!!$ select type (dato)
1495!!$ type is (dbadatar)
1496!!$ allocate(todcv_dbadat%dcv(i)%dat,source=dato)
1497!!$ type is (dbadatai)
1498!!$ allocate(todcv_dbadat%dcv(i)%dat,source=dato)
1499!!$ type is (dbadatab)
1500!!$ allocate(todcv_dbadat%dcv(i)%dat,source=dato)
1501!!$ type is (dbadatad)
1502!!$ allocate(todcv_dbadat%dcv(i)%dat,source=dato)
1503!!$ type is (dbadatac)
1504!!$ allocate(todcv_dbadat%dcv(i)%dat,source=dato)
1505!!$ end select
1506!!$ end associate
1507!!$
1508!!$ call this%next()
1509!!$end do
1510!!$end function todcv_dbadat
1511
1512!!$! Definisce le funzioni count_distinct e pack_distinct
1513!!$#define VOL7D_POLY_TYPE TYPE(dbadata)
1514!!$#define VOL7D_POLY_TYPES _dbadata
1515!!$#undef ENABLE_SORT
1516!!$#include "array_utilities_inc.F90"
1517!!$#undef VOL7D_POLY_TYPE
1518!!$#undef VOL7D_POLY_TYPES
1519
1520
1521end subroutine dba2v7d
1522
1523
1524subroutine vol7d_dballe_import_dballevar(this)
1525
1526type(vol7d_var),pointer :: this(:)
1527INTEGER :: i,un,n
1528
1529IF (associated(this)) return
1530IF (allocated(blocal)) then
1531 ALLOCATE(this(size(blocal)))
1532 this=blocal
1533 return
1534end if
1535
1536un = open_dballe_file('dballe.txt', filetype_data)
1537IF (un < 0) then
1538
1539 call l4f_log(l4f_error,"error open_dballe_file: dballe.txt")
1540 CALL raise_error("error open_dballe_file: dballe.txt")
1541 return
1542end if
1543
1544n = 0
1545DO WHILE(.true.)
1546 READ(un,*,END=100)
1547 n = n + 1
1548ENDDO
1549100 CONTINUE
1550
1551IF (n > 0) THEN
1552 ALLOCATE(this(n))
1553 ALLOCATE(blocal(n))
1554 rewind(un)
1555 readline: do i = 1 ,n
1556 READ(un,'(1x,A6,1x,a65,a24,i4)')blocal(i)%btable,blocal(i)%description,blocal(i)%unit,&
1557 blocal(i)%scalefactor
1558 blocal(i)%btable(:1)="B"
1559 !print*,"B=",blocal(i)%btable
1560 !print*," D=",blocal(i)%description
1561 !PRINT*," U=",blocal(i)%unit
1562 !PRINT*," D=",blocal(i)%scalefactor
1563 ENDDO readline
1564
1565 CALL l4f_log(l4f_info,'Found '//trim(to_char(i-1))//' variables in dballe master table')
1566
1567 this=blocal
1568
1569ENDIF
1570CLOSE(un)
1571
1572END SUBROUTINE vol7d_dballe_import_dballevar
1573
1574
1575
1576!> \brief Integra il vettore delle variabili in vol7d con le descrizioni e le unità di misura
1577!!eventualmente mancanti.
1578
1579subroutine vol7d_dballe_set_var_du(this)
1580
1581TYPE(vol7d) :: this !< oggetto vol7d con le variabili da completare
1582integer :: i,j
1583type(vol7d_var),pointer :: dballevar(:)
1584
1585nullify(dballevar)
1586call vol7d_dballe_import_dballevar(dballevar)
1587
1588#undef VOL7D_POLY_NAME
1589#define VOL7D_POLY_NAME dativar
1590
1591
1592#undef VOL7D_POLY_TYPES_V
1593#define VOL7D_POLY_TYPES_V r
1594#include "vol7d_dballe_class_var_du.F90"
1595#undef VOL7D_POLY_TYPES_V
1596#define VOL7D_POLY_TYPES_V i
1597#include "vol7d_dballe_class_var_du.F90"
1598#undef VOL7D_POLY_TYPES_V
1599#define VOL7D_POLY_TYPES_V b
1600#include "vol7d_dballe_class_var_du.F90"
1601#undef VOL7D_POLY_TYPES_V
1602#define VOL7D_POLY_TYPES_V d
1603#include "vol7d_dballe_class_var_du.F90"
1604#undef VOL7D_POLY_TYPES_V
1605#define VOL7D_POLY_TYPES_V c
1606#include "vol7d_dballe_class_var_du.F90"
1607#undef VOL7D_POLY_TYPES_V
1608
1609#undef VOL7D_POLY_NAME
1610#define VOL7D_POLY_NAME anavar
1611
1612
1613#undef VOL7D_POLY_TYPES_V
1614#define VOL7D_POLY_TYPES_V r
1615#include "vol7d_dballe_class_var_du.F90"
1616#undef VOL7D_POLY_TYPES_V
1617#define VOL7D_POLY_TYPES_V i
1618#include "vol7d_dballe_class_var_du.F90"
1619#undef VOL7D_POLY_TYPES_V
1620#define VOL7D_POLY_TYPES_V b
1621#include "vol7d_dballe_class_var_du.F90"
1622#undef VOL7D_POLY_TYPES_V
1623#define VOL7D_POLY_TYPES_V d
1624#include "vol7d_dballe_class_var_du.F90"
1625#undef VOL7D_POLY_TYPES_V
1626#define VOL7D_POLY_TYPES_V c
1627#include "vol7d_dballe_class_var_du.F90"
1628#undef VOL7D_POLY_TYPES_V
1629
1630
1631#undef VOL7D_POLY_NAME
1632#define VOL7D_POLY_NAME datiattr
1633
1634
1635#undef VOL7D_POLY_TYPES_V
1636#define VOL7D_POLY_TYPES_V r
1637#include "vol7d_dballe_class_var_du.F90"
1638#undef VOL7D_POLY_TYPES_V
1639#define VOL7D_POLY_TYPES_V i
1640#include "vol7d_dballe_class_var_du.F90"
1641#undef VOL7D_POLY_TYPES_V
1642#define VOL7D_POLY_TYPES_V b
1643#include "vol7d_dballe_class_var_du.F90"
1644#undef VOL7D_POLY_TYPES_V
1645#define VOL7D_POLY_TYPES_V d
1646#include "vol7d_dballe_class_var_du.F90"
1647#undef VOL7D_POLY_TYPES_V
1648#define VOL7D_POLY_TYPES_V c
1649#include "vol7d_dballe_class_var_du.F90"
1650#undef VOL7D_POLY_TYPES_V
1651
1652
1653#undef VOL7D_POLY_NAME
1654#define VOL7D_POLY_NAME anaattr
1655
1656
1657#undef VOL7D_POLY_TYPES_V
1658#define VOL7D_POLY_TYPES_V r
1659#include "vol7d_dballe_class_var_du.F90"
1660#undef VOL7D_POLY_TYPES_V
1661#define VOL7D_POLY_TYPES_V i
1662#include "vol7d_dballe_class_var_du.F90"
1663#undef VOL7D_POLY_TYPES_V
1664#define VOL7D_POLY_TYPES_V b
1665#include "vol7d_dballe_class_var_du.F90"
1666#undef VOL7D_POLY_TYPES_V
1667#define VOL7D_POLY_TYPES_V d
1668#include "vol7d_dballe_class_var_du.F90"
1669#undef VOL7D_POLY_TYPES_V
1670#define VOL7D_POLY_TYPES_V c
1671#include "vol7d_dballe_class_var_du.F90"
1672#undef VOL7D_POLY_TYPES_V
1673
1674
1675deallocate(dballevar)
1676
1677return
1678
1679end subroutine vol7d_dballe_set_var_du
1680
1681
1682
1683FUNCTION get_dballe_filepath(filename, filetype) RESULT(path)
1684CHARACTER(len=*), INTENT(in) :: filename
1685INTEGER, INTENT(in) :: filetype
1686
1687INTEGER :: j
1688CHARACTER(len=512) :: path
1689LOGICAL :: exist
1690
1691IF (dballe_name == ' ') THEN
1692 CALL getarg(0, dballe_name)
1693 ! dballe_name_env
1694ENDIF
1695
1696IF (filetype < 1 .OR. filetype > nftype) THEN
1697 path = ""
1698 CALL l4f_log(l4f_error, 'dballe file type '//trim(to_char(filetype))// &
1699 ' not valid')
1700 CALL raise_error()
1701 RETURN
1702ENDIF
1703
1704! try with environment variable
1705CALL getenv(trim(dballe_name_env), path)
1706IF (path /= ' ') THEN
1707
1708 path=trim(path)//'/'//filename
1709 INQUIRE(file=path, exist=exist)
1710 IF (exist) THEN
1711 CALL l4f_log(l4f_info, 'dballe file '//trim(path)//' found')
1712 RETURN
1713 ENDIF
1714ENDIF
1715! try with pathlist
1716DO j = 1, SIZE(pathlist,1)
1717 IF (pathlist(j,filetype) == ' ') EXIT
1718 path=trim(pathlist(j,filetype))//'/'//trim(dballe_name)//'/'//filename
1719 INQUIRE(file=path, exist=exist)
1720 IF (exist) THEN
1721 CALL l4f_log(l4f_info, 'dballe file '//trim(path)//' found')
1722 RETURN
1723 ENDIF
1724ENDDO
1725CALL l4f_log(l4f_error, 'dballe file '//trim(filename)//' not found')
1726CALL raise_error()
1727path = ""
1728
1729END FUNCTION get_dballe_filepath
1730
1732FUNCTION open_dballe_file(filename, filetype) RESULT(unit)
1733CHARACTER(len=*), INTENT(in) :: filename
1734INTEGER, INTENT(in) :: filetype
1735INTEGER :: unit,i
1736
1737CHARACTER(len=512) :: path
1738
1739unit = -1
1740path=get_dballe_filepath(filename, filetype)
1741IF (path == '') RETURN
1742
1743unit = getunit()
1744IF (unit == -1) RETURN
1745
1746OPEN(unit, file=path, status='old', iostat = i)
1747IF (i == 0) THEN
1748 CALL l4f_log(l4f_info, 'dballe file '//trim(path)//' opened')
1749 RETURN
1750ENDIF
1751
1752CALL l4f_log(l4f_error, 'dballe file '//trim(filename)//' not found')
1753CALL raise_error()
1754unit = -1
1755
1756END FUNCTION open_dballe_file
1757
1758
1759!> \brief Exporta un volume dati a un DSN DB-all.e
1760!!
1761!! Riscrive i dati nel DSN di DB-All.e con la possibilità di attivare
1762!! una serie di filtri.
1763
1764
1765!!! TODO manage attr_only
1766!!! attention template migrated in init
1767!SUBROUTINE vol7d_dballe_export(this, network, coordmin, coordmax,&
1768! timei, timef,level,timerange,var,attr,anavar,anaattr,attr_only,ana,dataonly)
1769
1770SUBROUTINE vol7d_dballe_export_old(this, network, coordmin, coordmax,&
1771 timei, timef,level,timerange,var,attr,anavar,anaattr,ana,dataonly,anaonly,template,attr_only)
1772
1773TYPE(vol7d_dballe),INTENT(inout) :: this !< oggetto contenente il volume e altre info per l'accesso al DSN
1774character(len=network_name_len),INTENT(in),optional :: network !< network da exportare
1775!> coordinate minime e massime che definiscono il
1776!! rettangolo di estrazione per l'esportazione
1777TYPE(geo_coord),INTENT(in),optional :: coordmin,coordmax
1778!>estremi temporali dei dati da esportare
1779TYPE(datetime),INTENT(in),optional :: timei, timef
1780TYPE(vol7d_level),INTENT(in),optional :: level !< livello selezionato per l'esportazione
1781TYPE(vol7d_timerange),INTENT(in),optional :: timerange !< timerange selezionato per l'esportazione
1782!> variabili da exportare secondo la tabella B locale o alias relative a dati, attributi,
1783!! anagrafica e attributi dell'anagrafica
1784CHARACTER(len=*),INTENT(in),OPTIONAL :: var(:),attr(:),anavar(:),anaattr(:)
1785!!$!> permette di riscrivere su un DSN letto precedentemente, modificando solo gli attributi ai dati,
1786!!$!! ottimizzando enormente le prestazioni: gli attributi riscritti saranno quelli con this%data_id definito
1787!!$!! (solitamente ricopiato dall'oggetto letto)
1788!!$logical,intent(in),optional :: attr_only
1789TYPE(vol7d_ana),INTENT(inout),optional :: ana !< identificativo della stazione da exportare
1790logical, intent(in),optional :: dataonly !< set to .true. to export data only
1791logical, intent(in),optional :: anaonly !< set to .true. to export ana only
1792!> specificando category.subcategory.localcategory oppure un alias ("synop", "metar","temp","generic") forza l'exportazione ad uno specifico template BUFR/CREX"
1793!! the special value "generic-frag is used to generate bufr on file where ana data is reported only once at beginning and data in other bufr after
1794character(len=*),intent(in),optional :: template
1795logical, intent(in),optional :: attr_only !< set to .true. to export attr only (no data)
1796
1797
1798type(dbadcv) :: vars,starvars,anavars,anastarvars
1799type(dbafilter) :: filter
1800type(dbacoord) :: mydbacoordmin, mydbacoordmax
1801type(dbaana) :: mydbaana
1802type(dbadatetime) :: mydatetimemin, mydatetimemax
1803type(dbatimerange) :: mydbatimerange
1804type(dbalevel) :: mydbalevel
1805type(dbanetwork) :: mydbanetwork
1806
1807integer :: i
1808LOGICAL :: lattr, lanaattr
1809integer :: nanaattr,nattr,nanavar,nvar
1810
1811
1812 ! ------------- prepare filter options
1813
1814!!
1815!! translate export option for dballe2003 api
1816!!
1817
1818if (present(var)) then
1819 nvar=count(c_e(var))
1820 if (nvar > 0) then
1821 allocate (vars%dcv(nvar))
1822 do i=1,size(var)
1823 if (c_e(var(i)))then
1824 allocate (vars%dcv(i)%dat,source=dbadatac(var(i))) !char is default
1825 end if
1826 end do
1827 end if
1828end if
1829
1830if (present(anavar)) then
1831 nanavar=count(c_e(anavar))
1832 if (nanavar > 0) then
1833 allocate (anavars%dcv(nanavar))
1834 do i=1,size(anavar)
1835 if (c_e(anavar(i)))then
1836 allocate (anavars%dcv(i)%dat,source=dbadatac(anavar(i))) !char is default
1837 end if
1838 end do
1839 end if
1840end if
1841
1842lattr = .false.
1843if (present(attr)) then
1844 nattr=count(c_e(attr))
1845 if (nattr > 0) then
1846 lattr = .true.
1847 allocate (starvars%dcv(nattr))
1848 do i=1,size(attr)
1849 if (c_e(attr(i)))then
1850 allocate (starvars%dcv(i)%dat,source=dbadatac(attr(i))) !char is default
1851 end if
1852 end do
1853 end if
1854end if
1855
1856lanaattr = .false.
1857if (present(anaattr)) then
1858 nanaattr=count(c_e(anaattr))
1859 if (nanaattr > 0) then
1860 lanaattr = .true.
1861 allocate (anastarvars%dcv(nanaattr))
1862 do i=1,size(anaattr)
1863 if (c_e(anaattr(i)))then
1864 allocate (anastarvars%dcv(i)%dat,source=dbadatac(anaattr(i))) !char is default
1865 end if
1866 end do
1867 end if
1868end if
1869
1870
1871 ! like a cast
1872mydbacoordmin=dbacoord()
1873if (present(coordmin)) mydbacoordmin%geo_coord=coordmin
1874mydbacoordmax=dbacoord()
1875if (present(coordmax)) mydbacoordmax%geo_coord=coordmax
1876mydbaana=dbaana()
1877if (present(ana)) mydbaana%vol7d_ana=ana
1878mydatetimemin=dbadatetime()
1879if (present(timei)) mydatetimemin%datetime=timei
1880mydatetimemax=dbadatetime()
1881if (present(timef)) mydatetimemax%datetime=timef
1882mydbatimerange=dbatimerange()
1883if (present(timerange)) mydbatimerange%vol7d_timerange=timerange
1884mydbalevel=dbalevel()
1885if (present(level)) mydbalevel%vol7d_level=level
1886mydbanetwork=dbanetwork()
1887if (present(network)) call init(mydbanetwork%vol7d_network,name=network)
1888
1889!!
1890!! here we have options ready for filter
1891!!
1892filter=dbafilter(coordmin=mydbacoordmin,coordmax=mydbacoordmax,ana=mydbaana, &
1893 datetimemin=mydatetimemin,datetimemax=mydatetimemax, &
1894 timerange=mydbatimerange,level=mydbalevel,network=mydbanetwork,&
1895 vars=vars,starvars=starvars,anavars=anavars,anastarvars=anastarvars,&
1896 dataonly=dataonly,anaonly=anaonly)
1897
1898!!$ print *, "filter:"
1899!!$ call filter%display()
1900
1901call export (this, filter,template,attr_only)
1902
1903end SUBROUTINE vol7d_dballe_export_old
1904
1905
1906subroutine vol7d_dballe_export (this, filter, template, attr_only)
1907
1908TYPE(vol7d_dballe),INTENT(inout) :: this !< oggetto contenente il volume e altre info per l'accesso al DSN
1909type(dbafilter),intent(in) :: filter !< filter o use
1910!> specificando category.subcategory.localcategory oppure un alias ("synop", "metar","temp","generic") forza l'exportazione ad uno specifico template BUFR/CREX"
1911!! the special value "generic-frag is used to generate bufr on file where ana data is reported only once at beginning and data in other bufr after
1912character(len=*),intent(in),optional :: template
1913logical, intent(in),optional :: attr_only !< set to .true. to export attr only (no data)
1914
1915character(len=40) :: ltemplate
1916
1917type(dbametaanddatalist) :: metaanddatal
1918logical :: stat
1919
1920metaanddatal=dbametaanddatalist()
1921
1922call v7d2dba(this%vol7d,metaanddatal)
1923!call metaanddatal%display()
1924
1925!clean memdb
1926if (this%file) call this%handle%remove_all()
1927
1928! using filter here can limit memory use for memdb
1929call metaanddatal%extrude(session=this%handle,filter=filter,attronly=attr_only,template=template)
1930
1931if (this%file) then
1932 !!!!! this if we have written in memdb and now we have to write the file
1933
1934 !filter is already in extrude
1935 !this%handle%set(filter=filter)
1936
1937 ! export to file
1938 !! TODO : revert template from init to export !!!!!!!!!!!!!!!!!!!!!
1939 !!call this%handle%messages_write_next(template)
1940
1941 ! note that you can use unsetall hera because the filter was used in extrude
1942 call filter%dbaset(this%handle)
1943
1944 ltemplate=this%handle%template
1945 if (present(template))then
1946 ltemplate=template
1947 end if
1948
1949 call this%handle%messages_write_next(ltemplate)
1950
1951 !clean memdb
1952 call this%handle%remove_all()
1953
1954end if
1955
1956stat = metaanddatal%delete()
1957
1958end subroutine vol7d_dballe_export
1959
1960
1961subroutine v7d2dba(v7d,metaanddatal)
1962TYPE(vol7d),INTENT(in) :: v7d !!!!!! dovrebbe essere intent(in)
1963type(dbametaanddatalist),intent(inout) :: metaanddatal
1964
1965TYPE(vol7d_serialize_dballe) :: serialize
1966
1967serialize = vol7d_serialize_dballe_new()
1968serialize%anaonly=.true.
1969call serialize%vol7d_serialize_setup(v7d)
1970call serialize%vol7d_serialize_export(metaanddatal)
1971
1972serialize = vol7d_serialize_dballe_new()
1973serialize%dataonly=.true.
1974call serialize%vol7d_serialize_setup(v7d)
1975call serialize%vol7d_serialize_export(metaanddatal)
1976
1977end subroutine v7d2dba
1978
1979
1980end MODULE vol7d_dballe_class
1981
1982!>\example esempio_v7ddballe.f90
1983!!/brief Programma esempio semplice per l'uso di vol7d con DB-All.e
1984!!
1985
1986!>\example esempio_v7ddballe_multi.f90
1987!!/brief Programma esempio per l'uso di vol7d con DB-All.e
1988!!
1989!!Vengono estratte più reti
1990
1991!>\example esempio_v7ddballe_import_export.f90
1992!!\brief Esempio di utilizzo della classe vol7d_dballe_class
1993!!
1994!! Vengono estratti i dati e riscritti in un nuovo DSN
Index method.
Emit log message for a category with specific priority.
This module defines usefull general purpose function and subroutine.
Utilities for CHARACTER variables.
class for import and export data from e to DB-All.e.
Classes for handling georeferenced sparse points in geographical corodinates.
class to use character lists in fortran 2003 WARNING !
class to manage links for lists in fortran 2003.
classe per la gestione del logging
Classe per la gestione di un volume completo di dati osservati.
classe per import ed export di volumi da e in DB-All.e
manage connection handle to a DSN
fortran 2003 interface to geo_coord
byte version for dbadata
character version for dbadata
doubleprecision version for dbadata
integer version for dbadata
real version for dbadata
vector of container of dbadata
filter to apply before ingest data
one metadata with more data plus attributes
manage session handle
Derived type defining an isolated georeferenced point on Earth in polar geographical coordinates.
Character specific implementation of doubly-linked list.
Definisce un oggetto contenente i volumi anagrafica e dati e tutti i descrittori delle loro dimension...
Oggetto per import ed export da DB-All.e.

Generated with Doxygen.