libsim  Versione8.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 
77 
78 MODULE vol7d_dballe_class
79 
80 USE dballe_class
82 USE vol7d_class
84 use log4fortran
86 !use list_mix
88 use list_linkchar
89 use vol7d_serialize_dballe_class
90 
91 IMPLICIT NONE
92 
93 character (len=255),parameter:: subcategory="vol7d_dballe_class"
94 
101 
102 TYPE vol7d_dballe
103 
104  TYPE(vol7d) :: vol7d
105  type(dbaconnection) :: idbhandle
106  type(dbasession) :: handle
109  integer ,pointer :: data_id(:,:,:,:,:)
110  integer :: time_definition
111  type(l4f_handle) :: category
112  logical :: file
113 
114 END TYPE vol7d_dballe
115 
116 INTEGER, PARAMETER, PRIVATE :: nftype = 2
117 CHARACTER(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 
124 type(vol7d_var),allocatable,private :: blocal(:) ! cache of dballe.txt
125 
126 CHARACTER(len=20),PRIVATE :: dballe_name='wreport', dballe_name_env='DBA_TABLES'
127 
128 
130 INTERFACE init
131  MODULE PROCEDURE vol7d_dballe_init
132 END INTERFACE init
133 
135 INTERFACE delete
136  MODULE PROCEDURE vol7d_dballe_delete
137 END INTERFACE delete
138 
139 
141 INTERFACE import
142  MODULE PROCEDURE vol7d_dballe_importvvnv,vol7d_dballe_import, vol7d_dballe_import_old, dba2v7d
143 END INTERFACE import
144 
146 INTERFACE export
147  MODULE PROCEDURE vol7d_dballe_export_old,vol7d_dballe_export, v7d2dba
148 END INTERFACE export
149 
150 
151 PRIVATE
152 PUBLIC vol7d_dballe, init, delete, import, export, vol7d_dballe_import_dballevar, vol7d_dballe_set_var_du
153 
154 CONTAINS
155 
156 
158 SUBROUTINE vol7d_dballe_init(this,dsn,user,password,write,wipe,repinfo,&
159  filename,format,file,categoryappend,time_definition,idbhandle,template)
160 
161 
162 TYPE(vol7d_dballe),INTENT(out) :: this
163 character(len=*), INTENT(in),OPTIONAL :: dsn
164 character(len=*), INTENT(in),OPTIONAL :: user
165 character(len=*), INTENT(in),OPTIONAL :: password
166 logical,INTENT(in),OPTIONAL :: write
167 logical,INTENT(in),OPTIONAL :: wipe
168 character(len=*), INTENT(in),OPTIONAL :: repinfo
169 character(len=*),intent(inout),optional :: filename
170 character(len=*),intent(in),optional :: format
171 logical,INTENT(in),OPTIONAL :: file
172 character(len=*),INTENT(in),OPTIONAL :: categoryappend
173 integer,INTENT(in),OPTIONAL :: time_definition
174 integer,INTENT(in),OPTIONAL :: idbhandle
177 character(len=*),intent(in),optional :: template
178 
179 logical :: quiwrite,loadfile
180 character(len=512) :: a_name
181 character(len=254) :: arg,lfilename,lformat
182 
183 quiwrite=.false.
184 if (present(write))then
185  quiwrite=write
186 endif
187 
188 if (present(categoryappend))then
189  call l4f_launcher(a_name,a_name_append=trim(subcategory)//"."//trim(categoryappend))
190 else
191  call l4f_launcher(a_name,a_name_append=trim(subcategory))
192 endif
193 this%category=l4f_category_get_handle(a_name)
194 
195 #ifdef DEBUG
196 CALL l4f_category_log(this%category,l4f_debug,'vol7d_dballe_init start')
197 #endif
198 
199 nullify(this%data_id)
200 
201 if (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 
232 else
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 
238 endif
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
244 CALL init(this%vol7d, time_definition)
245 this%time_definition = optio_i(time_definition)
246 
247 #ifdef DEBUG
248 CALL l4f_category_log(this%category,l4f_debug,'vol7d_dballe_init end')
249 #endif
250 
251 END SUBROUTINE vol7d_dballe_init
252 
253 
254 
258 
259 SUBROUTINE 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)
261 TYPE(vol7d_dballe),INTENT(inout) :: this
262 CHARACTER(len=*),INTENT(in) :: var(:)
263 TYPE(geo_coord),INTENT(inout),optional :: coordmin,coordmax
264 TYPE(vol7d_ana),INTENT(inout),optional :: ana
265 TYPE(datetime),INTENT(in),optional :: timei, timef
266 TYPE(vol7d_network),INTENT(in) :: network(:)
267 TYPE(vol7d_network),INTENT(in),OPTIONAL :: set_network
268 TYPE(vol7d_level),INTENT(in),optional :: level
269 TYPE(vol7d_timerange),INTENT(in),optional :: timerange
270 CHARACTER(len=*),INTENT(in),OPTIONAL :: attr(:),anavar(:),anaattr(:)
271 CHARACTER(len=*),INTENT(in),OPTIONAL :: varkind(:),attrkind(:),anavarkind(:),anaattrkind(:)
272 logical,intent(in),optional :: anaonly
273 LOGICAL,INTENT(in),OPTIONAL :: dataonly
274 TYPE(vol7d_dballe) :: v7ddbatmp
275 
276 INTEGER :: i
277 
278 IF (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)
284 ELSE
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
293 ENDIF
294 
295 END SUBROUTINE vol7d_dballe_importvvnv
296 
298 SUBROUTINE 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)
301 TYPE(vol7d_dballe),INTENT(inout) :: this
302 CHARACTER(len=*),INTENT(in),OPTIONAL :: var(:)
303 TYPE(geo_coord),INTENT(inout),optional :: coordmin,coordmax
304 TYPE(vol7d_ana),INTENT(inout),optional :: ana
305 TYPE(datetime),INTENT(in),OPTIONAL :: timei, timef
306 TYPE(vol7d_network),INTENT(in),OPTIONAL :: network,set_network
307 TYPE(vol7d_level),INTENT(in),optional :: level
308 TYPE(vol7d_timerange),INTENT(in),optional :: timerange
309 CHARACTER(len=*),INTENT(in),OPTIONAL :: attr(:),anavar(:),anaattr(:)
310 CHARACTER(len=*),INTENT(in),OPTIONAL :: varkind(:),attrkind(:),anavarkind(:),anaattrkind(:)
311 logical,intent(in),optional :: anaonly
312 logical,intent(in),optional :: dataonly
313 
314 
315 INTEGER,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 
321 LOGICAL :: ldegnet
322 
323 INTEGER :: i
324 integer :: nvar
325 integer :: nanavar
326 
327  !CHARACTER(len=10),allocatable :: lvar(:), lanavar(:)
328 type(dbadcv) :: vars,starvars,anavars,anastarvars
329 type(dbafilter) :: filter
330 type(dbacoord) :: mydbacoordmin, mydbacoordmax
331 type(dbaana) :: mydbaana
332 type(dbadatetime) :: mydatetimemin, mydatetimemax
333 type(dbatimerange) :: mydbatimerange
334 type(dbalevel) :: mydbalevel
335 type(dbanetwork) :: mydbanetwork
336 
337 integer :: nanaattr,nattr
338 
339 character(len=40) :: query
340 
341 #ifdef DEBUG
342 CALL l4f_category_log(this%category,l4f_debug,'inizio')
343 #endif
345 
346 IF (PRESENT(set_network)) THEN
347  if (c_e(set_network)) then
348  ldegnet = .true.
349  else
350  ldegnet = .false.
351  end if
352 ELSE
353  ldegnet = .false.
354 ENDIF
355 
356 if(ldegnet) then
357  query = "best"
358 else
359  query=cmiss
360 end 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 
379 if (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
407 end if
408 
409 if (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
437 end if
438 
439 if (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
472 end if
473 
474 if (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
507 end if
508 
509 
510  ! like a cast
511 mydbacoordmin=dbacoord()
512 if (present(coordmin)) mydbacoordmin%geo_coord=coordmin
513 mydbacoordmax=dbacoord()
514 if (present(coordmax)) mydbacoordmax%geo_coord=coordmax
515 mydbaana=dbaana()
516 if (present(ana)) mydbaana%vol7d_ana=ana
517 mydatetimemin=dbadatetime()
518 if (present(timei)) mydatetimemin%datetime=timei
519 mydatetimemax=dbadatetime()
520 if (present(timef)) mydatetimemax%datetime=timef
521 mydbatimerange=dbatimerange()
522 if (present(timerange)) mydbatimerange%vol7d_timerange=timerange
523 mydbalevel=dbalevel()
524 if (present(level)) mydbalevel%vol7d_level=level
525 mydbanetwork=dbanetwork()
526 if (present(network)) mydbanetwork%vol7d_network=network
527 
528 !!
529 !! here we have options ready for filter
530 !!
531 filter=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 
539 call import(this,filter,set_network)
540 
541 
542 END SUBROUTINE vol7d_dballe_import_old
543 
544 
545 
547 subroutine vol7d_dballe_import(this,filter,set_network)
548 
549 TYPE(vol7d_dballe),INTENT(inout) :: this
550 type(dbafilter),INTENT(in) :: filter
551 TYPE(vol7d_network),INTENT(in),OPTIONAL :: set_network
552 
553 TYPE(vol7d) :: vol7dtmp
554 type(dbametaanddata),allocatable :: metaanddatav(:)
555 type(dbafilter) :: myfilter
556 
557 CALL l4f_category_log(this%category,l4f_debug,'start import vol7d_dballe')
558 
559 if ( .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 
575 else
576  ! empty volume
577  call init(this%vol7d)
578  call vol7d_alloc(this%vol7d)
579  call vol7d_alloc_vol(this%vol7d)
580 end if
581  ! ----------------> constant station data end
582 
583 if ( .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.)
604 end if
605 
606 call 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 
625 nullify(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 
635 this%data_id(indana,indtime,indlevel,indtimerange,indnetwork)=buffer(i)%data_id
636 
637 
638 ier=idba_set(this%handle,"*context_id",buffer(i)%data_id)
639 ier=idba_set(this%handle,"*var_related",buffer(i)%btable)
640  !per ogni dato ora lavoro sugli attributi
641 ier=idba_set(this%handle, "*varlist",starvarlist )
642 ier=idba_voglioancora(this%handle,nn)
643  !print*,buffer(i)%btable," numero attributi",nn
644 
645 #endif
646 
647 CALL l4f_category_log(this%category,l4f_debug,'end import vol7d_dballe')
648 
649 end subroutine vol7d_dballe_import
650 
651 
652 
654 
655 SUBROUTINE vol7d_dballe_delete(this, preserveidbhandle)
656 TYPE(vol7d_dballe) :: this
657 logical,intent(in), optional :: preserveidbhandle
658 
659 # ifndef F2003_FULL_FEATURES
660 call this%handle%delete()
661 
662 if (.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 
670 CALL delete(this%vol7d)
671 
672  !chiudo il logger
673 call l4f_category_delete(this%category)
674  !ier=l4f_fini()
675 
676 END SUBROUTINE vol7d_dballe_delete
677 
678 
679 
681 !subroutine dba2v7d(this,metaanddatav,vars,starvars,anavars,anastarvars,time_definition, set_network)
682 subroutine dba2v7d(this,metaanddatav,time_definition, set_network)
683 
684 type(dbametaanddata),intent(inout) :: metaanddatav(:) ! change value in datetime reguard timedefinition
685 TYPE(vol7d),INTENT(inout) :: this
686 integer,INTENT(in),OPTIONAL :: time_definition
687 TYPE(vol7d_network),INTENT(in),OPTIONAL :: set_network
688 type(dbadcv) :: vars
689 type(dbadcv) :: starvars
690 type(dbadcv) :: anavars
691 type(dbadcv) :: anastarvars
692 
693 
694 LOGICAL :: ldegnet
695 integer :: indana,indtime,indlevel,indtimerange,inddativar,indnetwork,indattrvar
696 
697 integer :: nana,ntime,ntimerange,nlevel,nnetwork
698 
699 INTEGER :: i, j, k, n
700 integer :: inddativarattr
701 integer :: nanavar, indanavar,indanavarattr,nanavarattr
702 
703 integer :: ndativarr, ndativari, ndativarb, ndativard, ndativarc
704 integer :: ndatiattrr, ndatiattri, ndatiattrb, ndatiattrd, ndatiattrc
705 integer :: ndativarattrr, ndativarattri, ndativarattrb, ndativarattrd, ndativarattrc
706 
707 integer :: nanavarr, nanavari, nanavarb, nanavard, nanavarc
708 integer :: nanaattrr, nanaattri, nanaattrb, nanaattrd, nanaattrc
709 integer :: nanavarattrr, nanavarattri, nanavarattrb, nanavarattrd, nanavarattrc
710 
711 integer :: ndativar,ndativarattr
712 
713 type(characterlist) :: dativarl,dativarattrl,anavarl,anavarattrl
714 
715 character(len=listcharmaxlen),allocatable :: dativara(:),dativarattra(:),anavara(:),anavarattra(:)
716 logical :: status
717 integer :: ltime_definition
718 
719 type(datetime),allocatable :: tmptime(:)
720 type(vol7d_network),allocatable :: tmpnetwork(:)
721 type(vol7d_level),allocatable :: tmplevel(:)
722 type(vol7d_timerange),allocatable :: tmptimerange(:)
723 type(vol7d_ana),allocatable :: tmpana(:)
724 
725 
726 ltime_definition=optio_i(time_definition)
727 if (.not. c_e(ltime_definition)) ltime_definition = 1
728 
729  ! take in account time_definition
730 if (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
736 end if
737 
738 if (ltime_definition == 2) then
739  do i =1,size(metaanddatav)
740  metaanddatav(i)%metadata%timerange%vol7d_timerange%p1 = 0
741  end do
742 end if
743 
744 
745 IF (PRESENT(set_network)) THEN
746  if (c_e(set_network)) then
747  ldegnet = .true.
748  else
749  ldegnet = .false.
750  end if
751 ELSE
752  ldegnet = .false.
753 ENDIF
754 
755 
756 
757 !!--------------------------------------------------------------------------
758 !! find vars, starvars, anavars, anastarvars
759 !!
760 
761 ! create lists of all
762  ! data
763 do 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
773 end do
774 
775 !count and put in vector of unuique key
776 ndativar = count_distinct(toarray_charl(dativarl) , back=.true.)
777 allocate(dativara(ndativar))
778 call pack_distinct_c (toarray_charl(dativarl) , dativara , back=.true.)
779 status = dativarl%delete()
780 allocate (vars%dcv(ndativar))
781 
782 nanavar = count_distinct(toarray_charl(anavarl) , back=.true.)
783 allocate(anavara(nanavar))
784 call pack_distinct_c (toarray_charl(anavarl) , anavara , back=.true.)
785 status = anavarl%delete()
786 allocate (anavars%dcv(nanavar))
787 
788 
789 an: 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
800 end do an
801 
802 bn: 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
813 end do bn
814 
815  ! attributes
816 do 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
828 end do
829 
830 
831 ndativarattr = count_distinct(toarray_charl(dativarattrl), back=.true.)
832 allocate(dativarattra(ndativarattr))
833 call pack_distinct_c (toarray_charl(dativarattrl), dativarattra, back=.true.)
834 status = dativarattrl%delete()
835 allocate(starvars%dcv(ndativarattr))
836 
837 nanavarattr = count_distinct(toarray_charl(anavarattrl) , back=.true.)
838 allocate(anavarattra(nanavarattr))
839 call pack_distinct_c (toarray_charl(anavarattrl) , anavarattra , back=.true.)
840 status = anavarattrl%delete()
841 allocate(anastarvars%dcv(nanavarattr))
842 
843 
844 cn: 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
857 end do cn
858 
859 
860 dn: 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
873 end do dn
874 
875 
876 !!--------------------------------------------------------------------------
877 
878 
879 !!
880 !! count all unique metadata
881 !!
882 
883 if(ldegnet) then
884  nnetwork=1
885 else
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)
891 end if
892 
893 !ntime = count_distinct(metaanddatav(:)%metadata%datetime%datetime, &
894 ! mask=c_e(metaanddatav(:)%metadata%datetime%datetime),back=.TRUE.)
895 allocate (tmptime(size(metaanddatav(:))),&
896  source=metaanddatav(:)%metadata%datetime%datetime)
897 call sort(tmptime)
898 ntime = 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.)
902 allocate (tmptimerange(size(metaanddatav(:))),&
903  source=metaanddatav(:)%metadata%timerange%vol7d_timerange)
904 call sort(tmptimerange)
905 ntimerange = 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.)
909 allocate (tmplevel(size(metaanddatav(:))),&
910  source=metaanddatav(:)%metadata%level%vol7d_level)
911 call sort(tmplevel)
912 nlevel = count_distinct_sorted(tmplevel,mask=c_e(tmplevel))
913 
914 !nana = count_distinct(metaanddatav(:)%metadata%ana%vol7d_ana, back=.TRUE.)
915 allocate (tmpana(size(metaanddatav(:))),&
916  source=metaanddatav(:)%metadata%ana%vol7d_ana)
917 call sort(tmpana)
918 nana = 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 
932 ndativarr = 0
933 ndativari = 0
934 ndativarb = 0
935 ndativard = 0
936 ndativarc = 0
937 
938 do 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
953 end do
954 
955 
956  !attr
957 
958 ndatiattrr = 0
959 ndatiattri = 0
960 ndatiattrb = 0
961 ndatiattrd = 0
962 ndatiattrc = 0
963 
964 do 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
979 end do
980 
981 
982  ! ana var
983 
984 nanavarr = 0
985 nanavari = 0
986 nanavarb = 0
987 nanavard = 0
988 nanavarc = 0
989 
990 do 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
1005 end do
1006 
1007 
1008  ! ana attr
1009 
1010 nanaattrr = 0
1011 nanaattri = 0
1012 nanaattrb = 0
1013 nanaattrd = 0
1014 nanaattrc = 0
1015 
1016 do 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
1031 end do
1032 
1033 
1034  !refine
1035 
1036 ndativarattrr=0
1037 ndativarattri=0
1038 ndativarattrb=0
1039 ndativarattrd=0
1040 ndativarattrc=0
1041 
1042 if (ndatiattrr > 0 ) ndativarattrr=ndativarr+ndativari+ndativarb+ndativard+ndativarc
1043 if (ndatiattri > 0 ) ndativarattri=ndativarr+ndativari+ndativarb+ndativard+ndativarc
1044 if (ndatiattrb > 0 ) ndativarattrb=ndativarr+ndativari+ndativarb+ndativard+ndativarc
1045 if (ndatiattrd > 0 ) ndativarattrd=ndativarr+ndativari+ndativarb+ndativard+ndativarc
1046 if (ndatiattrc > 0 ) ndativarattrc=ndativarr+ndativari+ndativarb+ndativard+ndativarc
1047 
1048 
1049 nanavarattrr=0
1050 nanavarattri=0
1051 nanavarattrb=0
1052 nanavarattrd=0
1053 nanavarattrc=0
1054 
1055 if (nanaattrr > 0 ) nanavarattrr=nanavarr+nanavari+nanavarb+nanavard+nanavarc
1056 if (nanaattri > 0 ) nanavarattri=nanavarr+nanavari+nanavarb+nanavard+nanavarc
1057 if (nanaattrb > 0 ) nanavarattrb=nanavarr+nanavari+nanavarb+nanavard+nanavarc
1058 if (nanaattrd > 0 ) nanavarattrd=nanavarr+nanavari+nanavarb+nanavard+nanavarc
1059 if (nanaattrc > 0 ) nanavarattrc=nanavarr+nanavari+nanavarb+nanavard+nanavarc
1060 
1061 
1062 CALL 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 
1077 call vol7d_alloc (this, &
1078 nana=nana, ntime=ntime, ntimerange=ntimerange, &
1079 nlevel=nlevel, nnetwork=nnetwork, &
1080 ndativarr=ndativarr, ndativari=ndativari, ndativarb=ndativarb, ndativard=ndativard, ndativarc=ndativarc,&
1081 ndatiattrr=ndatiattrr, ndatiattri=ndatiattri, ndatiattrb=ndatiattrb, ndatiattrd=ndatiattrd, ndatiattrc=ndatiattrc,&
1082 ndativarattrr=ndativarattrr, &
1083 ndativarattri=ndativarattri, &
1084 ndativarattrb=ndativarattrb, &
1085 ndativarattrd=ndativarattrd, &
1086 ndativarattrc=ndativarattrc,&
1087 nanavarr=nanavarr, nanavari=nanavari, nanavarb=nanavarb, nanavard=nanavard, nanavarc=nanavarc,&
1088 nanaattrr=nanaattrr, nanaattri=nanaattri, nanaattrb=nanaattrb, nanaattrd=nanaattrd, nanaattrc=nanaattrc,&
1089 nanavarattrr=nanavarattrr, &
1090 nanavarattri=nanavarattri, &
1091 nanavarattrb=nanavarattrb, &
1092 nanavarattrd=nanavarattrd, &
1093 nanavarattrc=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.)
1100 this%ana=pack_distinct_sorted(tmpana, nana)
1101 deallocate(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.)
1108 this%time=pack_distinct_sorted(tmptime, ntime,mask=c_e(tmptime))
1109 deallocate(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.)
1116 this%timerange=pack_distinct_sorted(tmptimerange, ntimerange,mask=c_e(tmptimerange))
1117 deallocate(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.)
1124 this%level=pack_distinct_sorted(tmplevel, nlevel,mask=c_e(tmplevel))
1125 deallocate(tmplevel)
1126 !call sort(this%level)
1127 
1128 if(ldegnet)then
1129  nnetwork=1
1130  ALLOCATE(this%network(1))
1131  this%network(1)=set_network
1132 else
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)
1137 end if
1138 !call sort(this%network)
1139 
1140  ! var
1141 
1142 ndativarr = 0
1143 ndativari = 0
1144 ndativarb = 0
1145 ndativard = 0
1146 ndativarc = 0
1147 
1148 do 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
1168 end do
1169 
1170 
1171  !attr
1172 
1173 ndatiattrr = 0
1174 ndatiattri = 0
1175 ndatiattrb = 0
1176 ndatiattrd = 0
1177 ndatiattrc = 0
1178 
1179 do 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
1199 end do
1200 
1201 
1202  ! ana var
1203 
1204 nanavarr = 0
1205 nanavari = 0
1206 nanavarb = 0
1207 nanavard = 0
1208 nanavarc = 0
1209 
1210 do 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
1230 end do
1231 
1232 
1233  ! ana attr
1234 
1235 nanaattrr = 0
1236 nanaattri = 0
1237 nanaattrb = 0
1238 nanaattrd = 0
1239 nanaattrc = 0
1240 
1241 do 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
1261 end do
1262 
1263 
1264  ! here we colcolate the link from attributes and vars
1265 do 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
1273 end do
1274 
1275 do 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
1283 end do
1284 
1285  ! set index in dativaratt*
1286 call vol7d_set_attr_ind(this)
1287 
1288 call vol7d_alloc_vol (this)
1289 
1290  ! Ora qui bisogna metterci dentro idati
1291 indana = 0
1292 indtime = 0
1293 indnetwork = 0
1294 indtime = 0
1295 indtimerange = 0
1296 indlevel = 0
1297 do 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
1475 end do
1476 
1477 contains
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 
1521 end subroutine dba2v7d
1522 
1523 
1524 subroutine vol7d_dballe_import_dballevar(this)
1525 
1526 type(vol7d_var),pointer :: this(:)
1527 INTEGER :: i,un,n
1528 
1529 IF (associated(this)) return
1530 IF (allocated(blocal)) then
1531  ALLOCATE(this(size(blocal)))
1532  this=blocal
1533  return
1534 end if
1535 
1536 un = open_dballe_file('dballe.txt', filetype_data)
1537 IF (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
1542 end if
1543 
1544 n = 0
1545 DO WHILE(.true.)
1546  READ(un,*,end=100)
1547  n = n + 1
1548 ENDDO
1549 100 CONTINUE
1550 
1551 IF (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 
1569 ENDIF
1570 CLOSE(un)
1571 
1572 END SUBROUTINE vol7d_dballe_import_dballevar
1573 
1574 
1575 
1578 
1579 subroutine vol7d_dballe_set_var_du(this)
1580 
1581 TYPE(vol7d) :: this
1582 integer :: i,j
1583 type(vol7d_var),pointer :: dballevar(:)
1584 
1585 nullify(dballevar)
1586 call 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 
1675 deallocate(dballevar)
1676 
1677 return
1678 
1679 end subroutine vol7d_dballe_set_var_du
1680 
1681 
1682 
1683 FUNCTION get_dballe_filepath(filename, filetype) RESULT(path)
1684 CHARACTER(len=*), INTENT(in) :: filename
1685 INTEGER, INTENT(in) :: filetype
1686 
1687 INTEGER :: j
1688 CHARACTER(len=512) :: path
1689 LOGICAL :: exist
1690 
1691 IF (dballe_name == ' ') THEN
1692  CALL getarg(0, dballe_name)
1693  ! dballe_name_env
1694 ENDIF
1695 
1696 IF (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
1702 ENDIF
1703 
1704 ! try with environment variable
1705 CALL getenv(trim(dballe_name_env), path)
1706 IF (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
1714 ENDIF
1715 ! try with pathlist
1716 DO 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
1724 ENDDO
1725 CALL l4f_log(l4f_error, 'dballe file '//trim(filename)//' not found')
1726 CALL raise_error()
1727 path = ""
1728 
1729 END FUNCTION get_dballe_filepath
1730 
1731 
1732 FUNCTION open_dballe_file(filename, filetype) RESULT(unit)
1733 CHARACTER(len=*), INTENT(in) :: filename
1734 INTEGER, INTENT(in) :: filetype
1735 INTEGER :: unit,i
1736 
1737 CHARACTER(len=512) :: path
1738 
1739 unit = -1
1740 path=get_dballe_filepath(filename, filetype)
1741 IF (path == '') RETURN
1743 unit = getunit()
1744 IF (unit == -1) RETURN
1745 
1746 OPEN(unit, file=path, status='old', iostat = i)
1747 IF (i == 0) THEN
1748  CALL l4f_log(l4f_info, 'dballe file '//trim(path)//' opened')
1749  RETURN
1750 ENDIF
1751 
1752 CALL l4f_log(l4f_error, 'dballe file '//trim(filename)//' not found')
1753 CALL raise_error()
1754 unit = -1
1755 
1756 END FUNCTION open_dballe_file
1757 
1758 
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 
1770 SUBROUTINE vol7d_dballe_export_old(this, network, coordmin, coordmax,&
1771  timei, timef,level,timerange,var,attr,anavar,anaattr,ana,dataonly,anaonly,template,attr_only)
1772 
1773 TYPE(vol7d_dballe),INTENT(inout) :: this
1774 character(len=network_name_len),INTENT(in),optional :: network
1777 TYPE(geo_coord),INTENT(in),optional :: coordmin,coordmax
1779 TYPE(datetime),INTENT(in),optional :: timei, timef
1780 TYPE(vol7d_level),INTENT(in),optional :: level
1781 TYPE(vol7d_timerange),INTENT(in),optional :: timerange
1784 CHARACTER(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
1789 TYPE(vol7d_ana),INTENT(inout),optional :: ana
1790 logical, intent(in),optional :: dataonly
1791 logical, intent(in),optional :: anaonly
1794 character(len=*),intent(in),optional :: template
1795 logical, intent(in),optional :: attr_only
1796 
1797 
1798 type(dbadcv) :: vars,starvars,anavars,anastarvars
1799 type(dbafilter) :: filter
1800 type(dbacoord) :: mydbacoordmin, mydbacoordmax
1801 type(dbaana) :: mydbaana
1802 type(dbadatetime) :: mydatetimemin, mydatetimemax
1803 type(dbatimerange) :: mydbatimerange
1804 type(dbalevel) :: mydbalevel
1805 type(dbanetwork) :: mydbanetwork
1806 
1807 integer :: i
1808 LOGICAL :: lattr, lanaattr
1809 integer :: nanaattr,nattr,nanavar,nvar
1810 
1811 
1812  ! ------------- prepare filter options
1813 
1814 !!
1815 !! translate export option for dballe2003 api
1816 !!
1817 
1818 if (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
1828 end if
1829 
1830 if (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
1840 end if
1841 
1842 lattr = .false.
1843 if (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
1854 end if
1855 
1856 lanaattr = .false.
1857 if (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
1868 end if
1869 
1870 
1871  ! like a cast
1872 mydbacoordmin=dbacoord()
1873 if (present(coordmin)) mydbacoordmin%geo_coord=coordmin
1874 mydbacoordmax=dbacoord()
1875 if (present(coordmax)) mydbacoordmax%geo_coord=coordmax
1876 mydbaana=dbaana()
1877 if (present(ana)) mydbaana%vol7d_ana=ana
1878 mydatetimemin=dbadatetime()
1879 if (present(timei)) mydatetimemin%datetime=timei
1880 mydatetimemax=dbadatetime()
1881 if (present(timef)) mydatetimemax%datetime=timef
1882 mydbatimerange=dbatimerange()
1883 if (present(timerange)) mydbatimerange%vol7d_timerange=timerange
1884 mydbalevel=dbalevel()
1885 if (present(level)) mydbalevel%vol7d_level=level
1886 mydbanetwork=dbanetwork()
1887 if (present(network)) call init(mydbanetwork%vol7d_network,name=network)
1888 
1889 !!
1890 !! here we have options ready for filter
1891 !!
1892 filter=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 
1901 call export (this, filter,template,attr_only)
1902 
1903 end SUBROUTINE vol7d_dballe_export_old
1904 
1905 
1906 subroutine vol7d_dballe_export (this, filter, template, attr_only)
1907 
1908 TYPE(vol7d_dballe),INTENT(inout) :: this
1909 type(dbafilter),intent(in) :: filter
1912 character(len=*),intent(in),optional :: template
1913 logical, intent(in),optional :: attr_only
1914 
1915 character(len=40) :: ltemplate
1916 
1917 type(dbametaanddatalist) :: metaanddatal
1918 logical :: stat
1919 
1920 metaanddatal=dbametaanddatalist()
1921 
1922 call v7d2dba(this%vol7d,metaanddatal)
1923 !call metaanddatal%display()
1924 
1925 !clean memdb
1926 if (this%file) call this%handle%remove_all()
1927 
1928 ! using filter here can limit memory use for memdb
1929 call metaanddatal%extrude(session=this%handle,filter=filter,attronly=attr_only,template=template)
1930 
1931 if (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 
1954 end if
1955 
1956 stat = metaanddatal%delete()
1957 
1958 end subroutine vol7d_dballe_export
1959 
1960 
1961 subroutine v7d2dba(v7d,metaanddatal)
1962 TYPE(vol7d),INTENT(in) :: v7d !!!!!! dovrebbe essere intent(in)
1963 type(dbametaanddatalist),intent(inout) :: metaanddatal
1964 
1965 TYPE(vol7d_serialize_dballe) :: serialize
1966 
1967 serialize = vol7d_serialize_dballe_new()
1968 serialize%anaonly=.true.
1969 call serialize%vol7d_serialize_setup(v7d)
1970 call serialize%vol7d_serialize_export(metaanddatal)
1971 
1972 serialize = vol7d_serialize_dballe_new()
1973 serialize%dataonly=.true.
1974 call serialize%vol7d_serialize_setup(v7d)
1975 call serialize%vol7d_serialize_export(metaanddatal)
1976 
1977 end subroutine v7d2dba
1978 
1979 
1980 end MODULE vol7d_dballe_class
1981 
1985 
1990 
datetime metadata
byte version for dbadata
Oggetto per import ed export da DB-All.e.
classe per import ed export di volumi da e in DB-All.e
manage session handle
character version for dbadata
doubleprecision version for dbadata
class to manage links for lists in fortran 2003.
Test for a missing volume.
Index method.
Classes for handling georeferenced sparse points in geographical corodinates.
filter to apply before ingest data
manage connection handle to a DSN
Classe per la gestione di un volume completo di dati osservati.
This module defines usefull general purpose function and subroutine.
class to use character lists in fortran 2003 WARNING !!!! CHAR LEN IS FIXED TO listcharmaxlen.
integer version for dbadata
class for import and export data from e to DB-All.e.
classe per la gestione del logging
Derived type defining an isolated georeferenced point on Earth in polar geographical coordinates...
Utilities for CHARACTER variables.
Emit log message for a category with specific priority.
fortran 2003 interface to geo_coord
timerange metadata
real version for dbadata

Generated with Doxygen.