|
libsim Versione 8.0.0
|
◆ vol7d_dballe_export_old()
Exporta un volume dati a un DSN DB-all.e. Riscrive i dati nel DSN di DB-All.e con la possibilità di attivare una serie di filtri.
Definizione alla linea 2642 del file vol7d_dballe_class.F03. 2644! Copyright (C) 2010 ARPA-SIM <urpsim@smr.arpa.emr.it>
2645! authors:
2646! Davide Cesari <dcesari@arpa.emr.it>
2647! Paolo Patruno <ppatruno@arpa.emr.it>
2648
2649! This program is free software; you can redistribute it and/or
2650! modify it under the terms of the GNU General Public License as
2651! published by the Free Software Foundation; either version 2 of
2652! the License, or (at your option) any later version.
2653
2654! This program is distributed in the hope that it will be useful,
2655! but WITHOUT ANY WARRANTY; without even the implied warranty of
2656! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2657! GNU General Public License for more details.
2658
2659! You should have received a copy of the GNU General Public License
2660! along with this program. If not, see <http://www.gnu.org/licenses/>.
2661
2662#include "config.h"
2663
2664!> \brief classe per import ed export di volumi da e in DB-All.e
2665!!
2666!!Questo modulo definisce gli oggetti e i metodi per gestire
2667!!l'importazione e l'esportazione di volumi dal database per dati sparsi
2668!!DB-All.e
2669!!
2670!!Il tutto funziona intorno all'oggetto vol7d_dballe che aggiunge ad un
2671!!oggetto vol7d ulteriori informazioni.
2672!!
2673!!Con la chiamata init vengono definiti i parametri di accesso alla DSN
2674!!(database) di DB-All.e. oppure da file bufr/crex
2675!!
2676!!Con import è possibile acquisire nel prorio programma i dati presenti
2677!!nel DSN o su file; l'allocazione di memoria è automatica. Import è in grado di
2678!!importare dati senza nessuna ulteriore specificazione: vengono
2679!!acquisite tutte le stazioni senza limiti di tempo o di spazio, per
2680!!tutti i dati, compresi quelli di anagrafica; solo gli attributi
2681!!vengono tralasciati se non specificati. Se non specificato i dati sono
2682!!in forma character che permette di essere conservativi su tutti i tipi
2683!!di dato archiviabile in DB-all.e. Aumentando i parametri
2684!!all'intefaccia import è possibile specificare sottoinsiemi temporali e
2685!!spaziali, elenchi di variabili e attributi. E' possibile anche
2686!!specificare il tipo per ogni variabile o attributo richiesto. E'
2687!!fornito un set di routine per avere la possibilità di estrarre un
2688!!vettore di variabili e un vettore di reti. E' possibile anche specificare
2689!!una singola stazione. vol7d_dballe%%data_id
2690!!contiene un vettore di servizio con gli id interni del database che
2691!!indirizzano direttamente i dati. Una particolare opzione permette di
2692!!attivare l'opzione query di tipo best in DB-All.e per avere in una
2693!!unica rete i dati migliori presenti nel DB.
2694!!
2695!!Con export si riscrivono i dati nel DSN di DB-All.e potendo attivare
2696!!una serie di filtri.
2697!!
2698!!Con delete si elimina definitvamente l'oggetto vol7d_dballe.
2699!!
2700!!Mantenendo lo stesso oggetto nella sequenza init, import, export,
2701!!delete si sovrascrive lo stesso DSN di DB-All.e. Il vettore
2702!!vol7d_dballe%%data_id in export permette di sovrascrivere solo gli
2703!!attributi; eventualmente possono essere sovrascritti i soli attributi
2704!!relativi agli elementi data_id non mancanti.
2705!!
2706!! E' da notare che se si attiva l'opzione "anaonly" solo ma tutte le stazioni e
2707!! i dati di anagrafica vengono importati secondo i parametri di query selezionati.
2708!! Se l'opzione "anaonly" è disattivata solo le stazioni con i dati richiesti presenti
2709!! saranno caricati nella sezione anagrafica
2710!!
2711!!Utilizzando due differenti oggetti uno per import e uno per export è
2712!!possibile tramite l'associazione del puntatore in essi contenuto
2713!!relativo al volume vol7d ricopiare contenuti in altri DSN senza
2714!!sprechi di memoria.
2715!!
2716!!Programma esempio
2717!!\include esempio_v7ddballe.f90
2718!!
2719!!\ingroup vol7d
2720
2722
2729!use list_mix
2732use vol7d_serialize_dballe_class
2733
2734IMPLICIT NONE
2735
2736character (len=255),parameter:: subcategory="vol7d_dballe_class"
2737
2738 !>\brief Oggetto per import ed export da DB-All.e
2739!!
2740!!L'oggetto è costituito da un oggetto vol7d attorniato dalle
2741!!informazioni necessarie per l'accesso al DSN di DB-All.e
2742!! e da una matrice necessaria per l'ottimizzazione della scrittura dei
2743!!degli attributi dei dati in export
2744
2746
2747 TYPE(vol7d) :: vol7d !< volume vol7d
2748 type(dbaconnection) :: idbhandle !< handle della connessioni al DSN DB-All.e
2749 type(dbasession) :: handle !< handle della sessione connessa al DSN DB-All.e
2750 !> memorizza gli id interni al database DB-All.e per
2751 !!ottimizzare le riscritture degli attributi ai dati
2752 integer ,pointer :: data_id(:,:,:,:,:)
2753 integer :: time_definition
2754 type(l4f_handle) :: category !< log4fortran
2755 logical :: file !<
2756
2758
2759INTEGER, PARAMETER, PRIVATE :: nftype = 2
2760CHARACTER(len=16), PARAMETER, PRIVATE :: &
2761 pathlist(2,nftype) = reshape((/ &
2762 '/usr/share ', '/usr/local/share', &
2763 '/etc ', '/usr/local/etc ' /), &
2764 (/2,nftype/))
2765
2766
2767type(vol7d_var),allocatable,private :: blocal(:) ! cache of dballe.txt
2768
2769CHARACTER(len=20),PRIVATE :: dballe_name='wreport', dballe_name_env='DBA_TABLES'
2770
2771
2772 !>\brief inizializza
2774 MODULE PROCEDURE vol7d_dballe_init
2776
2777 !>\brief cancella
2779 MODULE PROCEDURE vol7d_dballe_delete
2781
2782
2783 !>\brief importa
2784INTERFACE import
2785 MODULE PROCEDURE vol7d_dballe_importvvnv,vol7d_dballe_import, vol7d_dballe_import_old, dba2v7d
2786END INTERFACE import
2787
2788 !>\brief exporta
2790 MODULE PROCEDURE vol7d_dballe_export_old,vol7d_dballe_export, v7d2dba
2792
2793
2794PRIVATE
2795PUBLIC vol7d_dballe, init, delete, import, export, vol7d_dballe_import_dballevar, vol7d_dballe_set_var_du
2796
2797CONTAINS
2798
2799
2800 !>\brief inizializza l'oggetto
2801SUBROUTINE vol7d_dballe_init(this,dsn,user,password,write,wipe,repinfo,&
2802 filename,format,file,categoryappend,time_definition,idbhandle,template)
2803
2804
2805TYPE(vol7d_dballe),INTENT(out) :: this !< l'oggetto da inizializzare
2806character(len=*), INTENT(in),OPTIONAL :: dsn !< per l'accesso al DSN ( default="test" )
2807character(len=*), INTENT(in),OPTIONAL :: user !< per l'accesso al DSN ( default="test" )
2808character(len=*), INTENT(in),OPTIONAL :: password !< per l'accesso al DSN ( default="" )
2809logical,INTENT(in),OPTIONAL :: write !< abilita la scrittura sul DSN/file ( default=.false. )
2810logical,INTENT(in),OPTIONAL :: wipe !< svuota il DSN/file e/o lo prepara per una scrittura ( default=.false. )
2811character(len=*), INTENT(in),OPTIONAL :: repinfo !< eventuale file repinfo.csv usato con wipe ( default="" )
2812character(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
2813character(len=*),intent(in),optional :: format !< the file format when file is true. It can be "BUFR", "CREX" or "JSON" (default="BUFR")
2814logical,INTENT(in),OPTIONAL :: file !< switch to use file or data base ( default=.false )
2815character(len=*),INTENT(in),OPTIONAL :: categoryappend !< appennde questo suffisso al namespace category di log4fortran
2816integer,INTENT(in),OPTIONAL :: time_definition !< 0=time is reference time ; 1=time is validity time (default=1)
2817integer,INTENT(in),OPTIONAL :: idbhandle !< dsn connection; if present it will be used
2818!> specificando category.subcategory.localcategory oppure un alias ("synop", "metar","temp","generic") forza l'exportazione ad uno specifico template BUFR/CREX"
2819!! 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
2820character(len=*),intent(in),optional :: template !< default template to use exporting to file; can be overwritten by export
2821
2822logical :: quiwrite,loadfile
2823character(len=512) :: a_name
2824character(len=254) :: arg,lfilename,lformat
2825
2826quiwrite=.false.
2827if (present(write))then
2828 quiwrite=write
2829endif
2830
2831if (present(categoryappend))then
2832 call l4f_launcher(a_name,a_name_append=trim(subcategory)//"."//trim(categoryappend))
2833else
2834 call l4f_launcher(a_name,a_name_append=trim(subcategory))
2835endif
2836this%category=l4f_category_get_handle(a_name)
2837
2838#ifdef DEBUG
2840#endif
2841
2842nullify(this%data_id)
2843
2844if (optio_log(file)) then
2845
2846 this%file=.true.
2847
2848 lformat="BUFR"
2849 if (present(format))then
2850 lformat=format
2851 end if
2852
2853 CALL getarg(0,arg)
2854
2855 lfilename=trim(arg)//"."//trim(lformat)
2857
2858 if (present(filename))then
2860 lfilename=filename
2861 end if
2862 end if
2863
2864 if(quiwrite)then
2865 ! this for write in memdb and write file on export
2866 loadfile=.false.
2867 else
2868 loadfile=.true.
2869 end if
2870
2871 this%handle=dbasession(wipe=wipe,write=quiwrite,repinfo=repinfo, &
2872 filename=lfilename,format=lformat,template=template, &
2873 memdb=.true.,loadfile=loadfile)
2874
2875else
2876
2877 this%file=.false.
2878 this%idbhandle=dbaconnection(dsn,user,password,idbhandle=idbhandle)
2879 this%handle=dbasession(this%idbhandle,wipe=wipe,write=quiwrite,repinfo=repinfo)
2880
2881endif
2882
2883! this init has been added here for cleaningness, this%vol7d gets
2884! reinitialised afterwards in dba2v7d and this%vol7d%time_definition is
2885! overwritten by this%time_definition, this duplication is required in
2886! order to pass time_definition down to dba2v7d
2888this%time_definition = optio_i(time_definition)
2889
2890#ifdef DEBUG
2892#endif
2893
2894END SUBROUTINE vol7d_dballe_init
2895
2896
2897
2898 !>\brief Identica a vol7d_dballe_importvsns con var e network vettore.
2899!!
2900!!import da DB-all.e
2901
2902SUBROUTINE vol7d_dballe_importvvnv(this, var, network, coordmin,coordmax, timei, timef, level,timerange,set_network,&
2903 attr,anavar,anaattr, varkind,attrkind,anavarkind,anaattrkind,anaonly,dataonly,ana)
2904TYPE(vol7d_dballe),INTENT(inout) :: this !< oggetto vol7d_dballe
2905CHARACTER(len=*),INTENT(in) :: var(:)
2906TYPE(geo_coord),INTENT(inout),optional :: coordmin,coordmax
2907TYPE(vol7d_ana),INTENT(inout),optional :: ana
2908TYPE(datetime),INTENT(in),optional :: timei, timef
2909TYPE(vol7d_network),INTENT(in) :: network(:)
2910TYPE(vol7d_network),INTENT(in),OPTIONAL :: set_network
2911TYPE(vol7d_level),INTENT(in),optional :: level
2912TYPE(vol7d_timerange),INTENT(in),optional :: timerange
2913CHARACTER(len=*),INTENT(in),OPTIONAL :: attr(:),anavar(:),anaattr(:)
2914CHARACTER(len=*),INTENT(in),OPTIONAL :: varkind(:),attrkind(:),anavarkind(:),anaattrkind(:)
2915logical,intent(in),optional :: anaonly
2916LOGICAL,INTENT(in),OPTIONAL :: dataonly
2917TYPE(vol7d_dballe) :: v7ddbatmp
2918
2919INTEGER :: i
2920
2921IF (SIZE(network) == 0 )THEN
2923 timef=timef, level=level, timerange=timerange, set_network=set_network, &
2924 attr=attr, anavar=anavar, anaattr=anaattr, varkind=varkind, attrkind=attrkind, &
2925 anavarkind=anavarkind, anaattrkind=anaattrkind, anaonly=anaonly, &
2926 dataonly=dataonly, ana=ana)
2927ELSE
2929 v7ddbatmp = this ! shallow copy
2930 DO i = 1, SIZE(network)
2932 level,timerange, set_network, attr,anavar,anaattr, varkind, attrkind, &
2933 anavarkind, anaattrkind, anaonly, dataonly, ana)
2935 ENDDO
2936ENDIF
2937
2938END SUBROUTINE vol7d_dballe_importvvnv
2939
2940!>import da DB-all.e
2941SUBROUTINE vol7d_dballe_import_old(this, var, network, coordmin, coordmax, timei, timef,level,timerange, set_network,&
2942 attr,anavar,anaattr, varkind,attrkind,anavarkind,anaattrkind,anaonly,dataonly,ana)
2943
2944TYPE(vol7d_dballe),INTENT(inout) :: this !< oggetto vol7d_dballe
2945CHARACTER(len=*),INTENT(in),OPTIONAL :: var(:)
2946TYPE(geo_coord),INTENT(inout),optional :: coordmin,coordmax
2947TYPE(vol7d_ana),INTENT(inout),optional :: ana
2948TYPE(datetime),INTENT(in),OPTIONAL :: timei, timef
2949TYPE(vol7d_network),INTENT(in),OPTIONAL :: network,set_network
2950TYPE(vol7d_level),INTENT(in),optional :: level
2951TYPE(vol7d_timerange),INTENT(in),optional :: timerange
2952CHARACTER(len=*),INTENT(in),OPTIONAL :: attr(:),anavar(:),anaattr(:)
2953CHARACTER(len=*),INTENT(in),OPTIONAL :: varkind(:),attrkind(:),anavarkind(:),anaattrkind(:)
2954logical,intent(in),optional :: anaonly
2955logical,intent(in),optional :: dataonly
2956
2957
2958INTEGER,PARAMETER :: maxvarlist=100
2959 !TYPE(vol7d) :: v7d
2960 ! da non fare (con gfortran?)!!!!!
2961 !CHARACTER(len=SIZE(var)*7) :: varlist
2962 !CHARACTER(len=SIZE(attr)*8) :: starvarlist
2963
2964LOGICAL :: ldegnet
2965
2966INTEGER :: i
2967integer :: nvar
2968integer :: nanavar
2969
2970 !CHARACTER(len=10),allocatable :: lvar(:), lanavar(:)
2971type(dbadcv) :: vars,starvars,anavars,anastarvars
2972type(dbafilter) :: filter
2973type(dbacoord) :: mydbacoordmin, mydbacoordmax
2974type(dbaana) :: mydbaana
2975type(dbadatetime) :: mydatetimemin, mydatetimemax
2976type(dbatimerange) :: mydbatimerange
2977type(dbalevel) :: mydbalevel
2978type(dbanetwork) :: mydbanetwork
2979
2980integer :: nanaattr,nattr
2981
2982character(len=40) :: query
2983
2984#ifdef DEBUG
2986#endif
2987
2988
2989IF (PRESENT(set_network)) THEN
2991 ldegnet = .true.
2992 else
2993 ldegnet = .false.
2994 end if
2995ELSE
2996 ldegnet = .false.
2997ENDIF
2998
2999if(ldegnet) then
3000 query = "best"
3001else
3002 query=cmiss
3003end if
3004
3005
3006 ! uncommenti this if you want compatibility API with old import
3007
3008!!$ if (allocated(starvars%dcv)) then
3009!!$ ldataonly=.false.
3010!!$ else
3011!!$ ldataonly=.true.
3012!!$ end if
3013
3014
3015!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
3016 ! ------------- prepare filter options
3017
3018!!
3019!! translate import option for dballe2003 api
3020!!
3021
3022if (present(var)) then
3023 nvar=count(c_e(var))
3024 if (nvar > 0) then
3025 allocate (vars%dcv(nvar))
3026 do i=1,size(var)
3028 if (present(varkind))then
3029 select case (varkind(i))
3030 case("r")
3032 case("i")
3034 case("b")
3036 case("d")
3038 case("c")
3040 case default
3042 CALL raise_fatal_error()
3043 end select
3044 else
3046 end if
3047 end if
3048 end do
3049 end if
3050end if
3051
3052if (present(anavar)) then
3053 nanavar=count(c_e(anavar))
3054 if (nanavar > 0) then
3055 allocate (anavars%dcv(nanavar))
3056 do i=1,size(anavar)
3058 if (present(anavarkind))then
3059 select case (anavarkind(i))
3060 case("r")
3062 case("i")
3064 case("b")
3066 case("d")
3068 case("c")
3070 case default
3072 CALL raise_fatal_error()
3073 end select
3074 else
3076 end if
3077 end if
3078 end do
3079 end if
3080end if
3081
3082if (present(attr)) then
3083 nattr=size(attr)
3084 if (nattr == 0) then
3085 allocate (starvars%dcv(nattr))
3086 else
3087 nattr=count(c_e(attr))
3088 if (nattr > 0) then
3089 allocate (starvars%dcv(nattr))
3090 do i=1,size(attr)
3092 if (present(attrkind))then
3093 select case (attrkind(i))
3094 case("r")
3096 case("i")
3098 case("b")
3100 case("d")
3102 case("c")
3104 case default
3106 CALL raise_fatal_error()
3107 end select
3108 else
3110 end if
3111 end if
3112 end do
3113 end if
3114 endif
3115end if
3116
3117if (present(anaattr)) then
3118 nanaattr=size(anaattr)
3119 if (nanaattr == 0) then
3120 allocate (anastarvars%dcv(nanaattr))
3121 else
3122 nanaattr=count(c_e(anaattr))
3123 if (nanaattr > 0) then
3124 allocate (anastarvars%dcv(nanaattr))
3125 do i=1,size(anaattr)
3127 if (present(anaattrkind))then
3128 select case (anaattrkind(i))
3129 case("r")
3131 case("i")
3133 case("b")
3135 case("d")
3137 case("c")
3139 case default
3141 CALL raise_fatal_error()
3142 end select
3143 else
3145 end if
3146 end if
3147 end do
3148 end if
3149 end if
3150end if
3151
3152
3153 ! like a cast
3154mydbacoordmin=dbacoord()
3155if (present(coordmin)) mydbacoordmin%geo_coord=coordmin
3156mydbacoordmax=dbacoord()
3157if (present(coordmax)) mydbacoordmax%geo_coord=coordmax
3158mydbaana=dbaana()
3159if (present(ana)) mydbaana%vol7d_ana=ana
3160mydatetimemin=dbadatetime()
3161if (present(timei)) mydatetimemin%datetime=timei
3162mydatetimemax=dbadatetime()
3163if (present(timef)) mydatetimemax%datetime=timef
3164mydbatimerange=dbatimerange()
3165if (present(timerange)) mydbatimerange%vol7d_timerange=timerange
3166mydbalevel=dbalevel()
3167if (present(level)) mydbalevel%vol7d_level=level
3168mydbanetwork=dbanetwork()
3169if (present(network)) mydbanetwork%vol7d_network=network
3170
3171!!
3172!! here we have options ready for filter
3173!!
3174filter=dbafilter(coordmin=mydbacoordmin,coordmax=mydbacoordmax,ana=mydbaana, &
3175 datetimemin=mydatetimemin,datetimemax=mydatetimemax, &
3176 timerange=mydbatimerange,level=mydbalevel,network=mydbanetwork,query=query,&
3177 vars=vars,starvars=starvars,anavars=anavars,anastarvars=anastarvars,&
3178 dataonly=dataonly,anaonly=anaonly)
3179!!$ print *, "filter:"
3180!!$ call filter%display()
3181
3183
3184
3185END SUBROUTINE vol7d_dballe_import_old
3186
3187
3188
3189!>import da DB-all.e
3190subroutine vol7d_dballe_import(this,filter,set_network)
3191
3192TYPE(vol7d_dballe),INTENT(inout) :: this !< oggetto vol7d_dballe
3193type(dbafilter),INTENT(in) :: filter
3194TYPE(vol7d_network),INTENT(in),OPTIONAL :: set_network
3195
3196TYPE(vol7d) :: vol7dtmp
3197type(dbametaanddata),allocatable :: metaanddatav(:)
3198type(dbafilter) :: myfilter
3199
3201
3202if ( .not. filter%dataonly) then
3203 ! ----------------> constant station data
3204 myfilter=dbafilter(filter=filter,contextana=.true.,query=cmiss)
3205! ! set filter
3206! call this%handle%set(filter=myfilter)
3207 ! estrude the data
3208 CALL l4f_category_log(this%category,l4f_debug,'start import vol7d_dballe ingest for constant station data')
3209! call this%handle%ingest(filter=myfilter)
3210 call this%handle%ingest(metaanddatav,filter=myfilter)
3213 call dba2v7d(this%vol7d, metaanddatav,this%time_definition,set_network)
3215
3216 deallocate (metaanddatav)
3217
3218else
3219 ! empty volume
3221 call vol7d_alloc(this%vol7d)
3222 call vol7d_alloc_vol(this%vol7d)
3223end if
3224 ! ----------------> constant station data end
3225
3226if ( .not. filter%anaonly) then
3227 ! ----------------> working on data
3228 myfilter=dbafilter(filter=filter,contextana=.false.)
3229! ! set filter
3230! call this%handle%set(filter=myfilter)
3231 ! estrude the data
3232
3233 CALL l4f_category_log(this%category,l4f_debug,'start import vol7d_dballe ingest for station data')
3234! call this%handle%ingest(filter=myfilter)
3235 call this%handle%ingest(metaanddatav,filter=myfilter)
3238 call dba2v7d(vol7dtmp,metaanddatav,this%time_definition,set_network)
3240
3241 deallocate (metaanddatav)
3242
3244!!$else
3245!!$ ! should we sort separately in case no merge is done?
3246!!$ CALL vol7d_smart_sort(this%vol7d, lsort_time=.TRUE., lsort_timerange=.TRUE., lsort_level=.TRUE.)
3247end if
3248
3249call vol7d_dballe_set_var_du(this%vol7d)
3250
3251
3252#ifdef NONE
3253
3254!!$if (lattr) then
3255!!$
3256!!$ allocate (this%data_id( nana, ntime, nlevel, ntimerange, nnetwork),stat=istat)
3257!!$ if (istat/= 0) THEN
3258!!$ CALL l4f_category_log(this%category,L4F_ERROR,'cannot allocate ' &
3259!!$ //TRIM(to_char(nana*ntime*nlevel*ntimerange*nnetwork))//' data_id elements')
3260!!$ CALL raise_fatal_error()
3261!!$
3262!!$ ENDIF
3263!!$
3264!!$ this%data_id=DBA_MVI
3265!!$
3266!!$else
3267
3268nullify(this%data_id)
3269
3270!!$end if
3271
3272
3273 !memorizzo data_id
3274#ifdef DEBUG
3275 !CALL l4f_category_log(this%category,L4F_DEBUG,"data_id: "//trim(to_char(buffer(i)%data_id)))
3276#endif
3277
3278this%data_id(indana,indtime,indlevel,indtimerange,indnetwork)=buffer(i)%data_id
3279
3280
3281ier=idba_set(this%handle,"*context_id",buffer(i)%data_id)
3282ier=idba_set(this%handle,"*var_related",buffer(i)%btable)
3283 !per ogni dato ora lavoro sugli attributi
3284ier=idba_set(this%handle, "*varlist",starvarlist )
3285ier=idba_voglioancora(this%handle,nn)
3286 !print*,buffer(i)%btable," numero attributi",nn
3287
3288#endif
3289
3291
3292end subroutine vol7d_dballe_import
3293
3294
3295
3296 !>\brief Cancella l'oggetto
3297
3298SUBROUTINE vol7d_dballe_delete(this, preserveidbhandle)
3299TYPE(vol7d_dballe) :: this !< oggetto da cancellare
3300logical,intent(in), optional :: preserveidbhandle !< do not close connection to dsn
3301
3302# ifndef F2003_FULL_FEATURES
3303call this%handle%delete()
3304
3305if (.not. optio_log(preserveidbhandle)) call this%idbhandle%delete()
3306# endif
3307
3308!!$if (associated(this%data_id)) then
3309!!$ deallocate (this%data_id)
3310!!$ nullify(this%data_id)
3311!!$end if
3312
3314
3315 !chiudo il logger
3316call l4f_category_delete(this%category)
3317 !ier=l4f_fini()
3318
3319END SUBROUTINE vol7d_dballe_delete
3320
3321
3322
3323 !>\brief import dba objects in vol7d
3324!subroutine dba2v7d(this,metaanddatav,vars,starvars,anavars,anastarvars,time_definition, set_network)
3325subroutine dba2v7d(this,metaanddatav,time_definition, set_network)
3326
3327type(dbametaanddata),intent(inout) :: metaanddatav(:) ! change value in datetime reguard timedefinition
3328TYPE(vol7d),INTENT(inout) :: this
3329integer,INTENT(in),OPTIONAL :: time_definition !< 0=time is reference time ; 1=time is validity time (default=1)
3330TYPE(vol7d_network),INTENT(in),OPTIONAL :: set_network
3331type(dbadcv) :: vars
3332type(dbadcv) :: starvars
3333type(dbadcv) :: anavars
3334type(dbadcv) :: anastarvars
3335
3336
3337LOGICAL :: ldegnet
3338integer :: indana,indtime,indlevel,indtimerange,inddativar,indnetwork,indattrvar
3339
3340integer :: nana,ntime,ntimerange,nlevel,nnetwork
3341
3342INTEGER :: i, j, k, n
3343integer :: inddativarattr
3344integer :: nanavar, indanavar,indanavarattr,nanavarattr
3345
3346integer :: ndativarr, ndativari, ndativarb, ndativard, ndativarc
3347integer :: ndatiattrr, ndatiattri, ndatiattrb, ndatiattrd, ndatiattrc
3348integer :: ndativarattrr, ndativarattri, ndativarattrb, ndativarattrd, ndativarattrc
3349
3350integer :: nanavarr, nanavari, nanavarb, nanavard, nanavarc
3351integer :: nanaattrr, nanaattri, nanaattrb, nanaattrd, nanaattrc
3352integer :: nanavarattrr, nanavarattri, nanavarattrb, nanavarattrd, nanavarattrc
3353
3354integer :: ndativar,ndativarattr
3355
3356type(characterlist) :: dativarl,dativarattrl,anavarl,anavarattrl
3357
3358character(len=listcharmaxlen),allocatable :: dativara(:),dativarattra(:),anavara(:),anavarattra(:)
3359logical :: status
3360integer :: ltime_definition
3361
3362type(datetime),allocatable :: tmptime(:)
3363type(vol7d_network),allocatable :: tmpnetwork(:)
3364type(vol7d_level),allocatable :: tmplevel(:)
3365type(vol7d_timerange),allocatable :: tmptimerange(:)
3366type(vol7d_ana),allocatable :: tmpana(:)
3367
3368
3369ltime_definition=optio_i(time_definition)
3371
3372 ! take in account time_definition
3373if (ltime_definition == 0) then
3374 do i =1,size(metaanddatav)
3375 metaanddatav(i)%metadata%datetime%datetime = &
3376 metaanddatav(i)%metadata%datetime%datetime - &
3377 timedelta_new(sec=metaanddatav(i)%metadata%timerange%vol7d_timerange%p1)
3378 end do
3379end if
3380
3381if (ltime_definition == 2) then
3382 do i =1,size(metaanddatav)
3383 metaanddatav(i)%metadata%timerange%vol7d_timerange%p1 = 0
3384 end do
3385end if
3386
3387
3388IF (PRESENT(set_network)) THEN
3390 ldegnet = .true.
3391 else
3392 ldegnet = .false.
3393 end if
3394ELSE
3395 ldegnet = .false.
3396ENDIF
3397
3398
3399
3400!!--------------------------------------------------------------------------
3401!! find vars, starvars, anavars, anastarvars
3402!!
3403
3404! create lists of all
3405 ! data
3406do i =1, size(metaanddatav)
3407 do j=1, size(metaanddatav(i)%dataattrv%dataattr)
3409 !print *,"dativarl: ", metaanddatav(i)%dataattrv%dataattr(j)%dat%btable
3410 call dativarl%append(metaanddatav(i)%dataattrv%dataattr(j)%dat%btable)
3411 else
3412 !print *,"anavarl: ", metaanddatav(i)%dataattrv%dataattr(j)%dat%btable
3413 call anavarl%append(metaanddatav(i)%dataattrv%dataattr(j)%dat%btable)
3414 end if
3415 end do
3416end do
3417
3418!count and put in vector of unuique key
3419ndativar = count_distinct(toarray_charl(dativarl) , back=.true.)
3420allocate(dativara(ndativar))
3421call pack_distinct_c (toarray_charl(dativarl) , dativara , back=.true.)
3422status = dativarl%delete()
3423allocate (vars%dcv(ndativar))
3424
3425nanavar = count_distinct(toarray_charl(anavarl) , back=.true.)
3426allocate(anavara(nanavar))
3427call pack_distinct_c (toarray_charl(anavarl) , anavara , back=.true.)
3428status = anavarl%delete()
3429allocate (anavars%dcv(nanavar))
3430
3431
3432an: do n=1,ndativar
3433 do i =1, size(metaanddatav)
3434 do j=1, size(metaanddatav(i)%dataattrv%dataattr)
3436 if (metaanddatav(i)%dataattrv%dataattr(j)%dat%btable == dativara(n)) then
3437 allocate(vars%dcv(n)%dat,source=metaanddatav(i)%dataattrv%dataattr(j)%dat)
3438 cycle an
3439 end if
3440 end if
3441 end do
3442 end do
3443end do an
3444
3445bn: do n=1,nanavar
3446 do i =1, size(metaanddatav)
3447 do j=1, size(metaanddatav(i)%dataattrv%dataattr)
3449 if (metaanddatav(i)%dataattrv%dataattr(j)%dat%btable == anavara(n)) then
3450 allocate(anavars%dcv(n)%dat,source=metaanddatav(i)%dataattrv%dataattr(j)%dat)
3451 cycle bn
3452 end if
3453 end if
3454 end do
3455 end do
3456end do bn
3457
3458 ! attributes
3459do i =1, size(metaanddatav)
3460 do j=1, size(metaanddatav(i)%dataattrv%dataattr)
3461 do k=1, size(metaanddatav(i)%dataattrv%dataattr(j)%attrv%dcv)
3463 !print *,"dativarattrl: ", metaanddatav(i)%dataattrv%dataattr(j)%attrv%dcv(k)%dat%btable
3464 call dativarattrl%append(metaanddatav(i)%dataattrv%dataattr(j)%attrv%dcv(k)%dat%btable)
3465 else
3466 !print *,"anavarattrl: ", metaanddatav(i)%dataattrv%dataattr(j)%attrv%dcv(k)%dat%btable
3467 call anavarattrl%append(metaanddatav(i)%dataattrv%dataattr(j)%attrv%dcv(k)%dat%btable)
3468 end if
3469 end do
3470 end do
3471end do
3472
3473
3474ndativarattr = count_distinct(toarray_charl(dativarattrl), back=.true.)
3475allocate(dativarattra(ndativarattr))
3476call pack_distinct_c (toarray_charl(dativarattrl), dativarattra, back=.true.)
3477status = dativarattrl%delete()
3478allocate(starvars%dcv(ndativarattr))
3479
3480nanavarattr = count_distinct(toarray_charl(anavarattrl) , back=.true.)
3481allocate(anavarattra(nanavarattr))
3482call pack_distinct_c (toarray_charl(anavarattrl) , anavarattra , back=.true.)
3483status = anavarattrl%delete()
3484allocate(anastarvars%dcv(nanavarattr))
3485
3486
3487cn: do n=1,ndativarattr
3488 do i =1, size(metaanddatav)
3489 do j=1, size(metaanddatav(i)%dataattrv%dataattr)
3490 do k=1, size(metaanddatav(i)%dataattrv%dataattr(j)%attrv%dcv)
3492 if (metaanddatav(i)%dataattrv%dataattr(j)%attrv%dcv(k)%dat%btable == dativarattra(n))then
3493 allocate(starvars%dcv(n)%dat,source=metaanddatav(i)%dataattrv%dataattr(j)%attrv%dcv(k)%dat)
3494 cycle cn
3495 end if
3496 end if
3497 end do
3498 end do
3499 end do
3500end do cn
3501
3502
3503dn: do n=1,nanavarattr
3504 do i =1, size(metaanddatav)
3505 do j=1, size(metaanddatav(i)%dataattrv%dataattr)
3506 do k=1, size(metaanddatav(i)%dataattrv%dataattr(j)%attrv%dcv)
3508 if (metaanddatav(i)%dataattrv%dataattr(j)%attrv%dcv(k)%dat%btable == anavarattra(n))then
3509 allocate(anastarvars%dcv(n)%dat,source=metaanddatav(i)%dataattrv%dataattr(j)%attrv%dcv(k)%dat)
3510 cycle dn
3511 end if
3512 end if
3513 end do
3514 end do
3515 end do
3516end do dn
3517
3518
3519!!--------------------------------------------------------------------------
3520
3521
3522!!
3523!! count all unique metadata
3524!!
3525
3526if(ldegnet) then
3527 nnetwork=1
3528else
3529 !nnetwork = count_distinct(metaanddatav(:)%metadata%network%vol7d_network, back=.TRUE.)
3530 allocate (tmpnetwork(size(metaanddatav(:))),&
3531 source=metaanddatav(:)%metadata%network%vol7d_network)
3533 nnetwork = count_distinct_sorted(tmpnetwork)
3534end if
3535
3536!ntime = count_distinct(metaanddatav(:)%metadata%datetime%datetime, &
3537! mask=c_e(metaanddatav(:)%metadata%datetime%datetime),back=.TRUE.)
3538allocate (tmptime(size(metaanddatav(:))),&
3539 source=metaanddatav(:)%metadata%datetime%datetime)
3541ntime = count_distinct_sorted(tmptime,mask=c_e(tmptime))
3542
3543!ntimerange = count_distinct(metaanddatav(:)%metadata%timerange%vol7d_timerange, &
3544! mask=c_e(metaanddatav(:)%metadata%timerange%vol7d_timerange), back=.TRUE.)
3545allocate (tmptimerange(size(metaanddatav(:))),&
3546 source=metaanddatav(:)%metadata%timerange%vol7d_timerange)
3548ntimerange = count_distinct_sorted(tmptimerange,mask=c_e(tmptimerange))
3549
3550!nlevel = count_distinct(metaanddatav(:)%metadata%level%vol7d_level, &
3551! mask=c_e(metaanddatav(:)%metadata%level%vol7d_level),back=.TRUE.)
3552allocate (tmplevel(size(metaanddatav(:))),&
3553 source=metaanddatav(:)%metadata%level%vol7d_level)
3555nlevel = count_distinct_sorted(tmplevel,mask=c_e(tmplevel))
3556
3557!nana = count_distinct(metaanddatav(:)%metadata%ana%vol7d_ana, back=.TRUE.)
3558allocate (tmpana(size(metaanddatav(:))),&
3559 source=metaanddatav(:)%metadata%ana%vol7d_ana)
3561nana = count_distinct_sorted(tmpana)
3562
3563!!$if(ldegnet) then
3564!!$ nnetwork=1
3565!!$else
3566!!$ nnetwork = size(metaanddatav(:)%metadata%network%vol7d_network)
3567!!$end if
3568!!$ntime = size(metaanddatav(:)%metadata%datetime%datetime)
3569!!$ntimerange = size(metaanddatav(:)%metadata%timerange%vol7d_timerange)
3570!!$nlevel = size(metaanddatav(:)%metadata%level%vol7d_level)
3571!!$nana = size(metaanddatav(:)%metadata%ana%vol7d_ana)
3572
3573 ! var
3574
3575ndativarr = 0
3576ndativari = 0
3577ndativarb = 0
3578ndativard = 0
3579ndativarc = 0
3580
3581do i =1 ,size(vars%dcv)
3582 associate(dato => vars%dcv(i)%dat)
3583 select type (dato)
3585 ndativarr = ndativarr + 1
3587 ndativari = ndativari + 1
3589 ndativarb = ndativarb + 1
3591 ndativard = ndativard + 1
3593 ndativarc = ndativarc + 1
3594 end select
3595 end associate
3596end do
3597
3598
3599 !attr
3600
3601ndatiattrr = 0
3602ndatiattri = 0
3603ndatiattrb = 0
3604ndatiattrd = 0
3605ndatiattrc = 0
3606
3607do i =1 ,size(starvars%dcv)
3608 associate(dato => starvars%dcv(i)%dat)
3609 select type (dato)
3611 ndatiattrr = ndatiattrr + 1
3613 ndatiattri = ndatiattri + 1
3615 ndatiattrb = ndatiattrb + 1
3617 ndatiattrd = ndatiattrd + 1
3619 ndatiattrc = ndatiattrc + 1
3620 end select
3621 end associate
3622end do
3623
3624
3625 ! ana var
3626
3627nanavarr = 0
3628nanavari = 0
3629nanavarb = 0
3630nanavard = 0
3631nanavarc = 0
3632
3633do i =1 ,size(anavars%dcv)
3634 associate(dato => anavars%dcv(i)%dat)
3635 select type (dato)
3636 type is (dbadatar)
3637 nanavarr = nanavarr + 1
3638 type is (dbadatai)
3639 nanavari = nanavari + 1
3640 type is (dbadatab)
3641 nanavarb = nanavarb + 1
3642 type is (dbadatad)
3643 nanavard = nanavard + 1
3644 type is (dbadatac)
3645 nanavarc = nanavarc + 1
3646 end select
3647 end associate
3648end do
3649
3650
3651 ! ana attr
3652
3653nanaattrr = 0
3654nanaattri = 0
3655nanaattrb = 0
3656nanaattrd = 0
3657nanaattrc = 0
3658
3659do i =1 ,size(anastarvars%dcv)
3660 associate(dato => anastarvars%dcv(i)%dat)
3661 select type (dato)
3662 type is (dbadatar)
3663 nanaattrr = nanaattrr + 1
3664 type is (dbadatai)
3665 nanaattri = nanaattri + 1
3666 type is (dbadatab)
3667 nanaattrb = nanaattrb + 1
3668 type is (dbadatad)
3669 nanaattrd = nanaattrd + 1
3670 type is (dbadatac)
3671 nanaattrc = nanaattrc + 1
3672 end select
3673 end associate
3674end do
3675
3676
3677 !refine
3678
3679ndativarattrr=0
3680ndativarattri=0
3681ndativarattrb=0
3682ndativarattrd=0
3683ndativarattrc=0
3684
3685if (ndatiattrr > 0 ) ndativarattrr=ndativarr+ndativari+ndativarb+ndativard+ndativarc
3686if (ndatiattri > 0 ) ndativarattri=ndativarr+ndativari+ndativarb+ndativard+ndativarc
3687if (ndatiattrb > 0 ) ndativarattrb=ndativarr+ndativari+ndativarb+ndativard+ndativarc
3688if (ndatiattrd > 0 ) ndativarattrd=ndativarr+ndativari+ndativarb+ndativard+ndativarc
3689if (ndatiattrc > 0 ) ndativarattrc=ndativarr+ndativari+ndativarb+ndativard+ndativarc
3690
3691
3692nanavarattrr=0
3693nanavarattri=0
3694nanavarattrb=0
3695nanavarattrd=0
3696nanavarattrc=0
3697
3698if (nanaattrr > 0 ) nanavarattrr=nanavarr+nanavari+nanavarb+nanavard+nanavarc
3699if (nanaattri > 0 ) nanavarattri=nanavarr+nanavari+nanavarb+nanavard+nanavarc
3700if (nanaattrb > 0 ) nanavarattrb=nanavarr+nanavari+nanavarb+nanavard+nanavarc
3701if (nanaattrd > 0 ) nanavarattrd=nanavarr+nanavari+nanavarb+nanavard+nanavarc
3702if (nanaattrc > 0 ) nanavarattrc=nanavarr+nanavari+nanavarb+nanavard+nanavarc
3703
3704
3706
3707!!$print *, "nana=",nana, "ntime=",ntime, "ntimerange=",ntimerange, &
3708!!$ "nlevel=",nlevel, "nnetwork=",nnetwork, &
3709!!$ "ndativarr=",ndativarr, "ndativari=",ndativari, &
3710!!$ "ndativarb=",ndativarb, "ndativard=",ndativard, "ndativarc=",ndativarc,&
3711!!$ "ndatiattrr=",ndatiattrr, "ndatiattri=",ndatiattri, "ndatiattrb=",ndatiattrb,&
3712!!$ "ndatiattrd=",ndatiattrd, "ndatiattrc=",ndatiattrc,&
3713!!$ "ndativarattrr=",ndativarattrr, "ndativarattri=",ndativarattri, "ndativarattrb=",ndativarattrb,&
3714!!$ "ndativarattrd=",ndativarattrd, "ndativarattrc=",ndativarattrc
3715!!$
3716!!$print *,"nanaattrr,nanaattri,nanaattrb,nanaattrd,nanaattrc"
3717!!$print *,nanaattrr,nanaattri,nanaattrb,nanaattrd,nanaattrc
3718
3719
3720call vol7d_alloc (this, &
3721nana=nana, ntime=ntime, ntimerange=ntimerange, &
3722nlevel=nlevel, nnetwork=nnetwork, &
3723ndativarr=ndativarr, ndativari=ndativari, ndativarb=ndativarb, ndativard=ndativard, ndativarc=ndativarc,&
3724ndatiattrr=ndatiattrr, ndatiattri=ndatiattri, ndatiattrb=ndatiattrb, ndatiattrd=ndatiattrd, ndatiattrc=ndatiattrc,&
3725ndativarattrr=ndativarattrr, &
3726ndativarattri=ndativarattri, &
3727ndativarattrb=ndativarattrb, &
3728ndativarattrd=ndativarattrd, &
3729ndativarattrc=ndativarattrc,&
3730nanavarr=nanavarr, nanavari=nanavari, nanavarb=nanavarb, nanavard=nanavard, nanavarc=nanavarc,&
3731nanaattrr=nanaattrr, nanaattri=nanaattri, nanaattrb=nanaattrb, nanaattrd=nanaattrd, nanaattrc=nanaattrc,&
3732nanavarattrr=nanavarattrr, &
3733nanavarattri=nanavarattri, &
3734nanavarattrb=nanavarattrb, &
3735nanavarattrd=nanavarattrd, &
3736nanavarattrc=nanavarattrc)
3737
3738
3739! fill metadata removing contextana metadata
3740
3741!nana=count_and_pack_distinct(metaanddatav(:)%metadata%ana%vol7d_ana,this%ana, back=.TRUE.)
3742!this%ana=pack_distinct(metaanddatav(:)%metadata%ana%vol7d_ana, nana, back=.TRUE.)
3743this%ana=pack_distinct_sorted(tmpana, nana)
3744deallocate(tmpana)
3745!call sort(this%ana)
3746
3747!ntime=count_and_pack_distinct(metaanddatav(:)%metadata%datetime%datetime,this%time, &
3748! mask=c_e(metaanddatav(:)%metadata%datetime%datetime), back=.TRUE.)
3749!this%time=pack_distinct(metaanddatav(:)%metadata%datetime%datetime, ntime, &
3750! mask=c_e(metaanddatav(:)%metadata%datetime%datetime),back=.TRUE.)
3751this%time=pack_distinct_sorted(tmptime, ntime,mask=c_e(tmptime))
3752deallocate(tmptime)
3753!call sort(this%time)
3754
3755!ntimerange=count_and_pack_distinct(metaanddatav(:)%metadata%timerange%vol7d_timerange,this%timerange, &
3756! mask=c_e(metaanddatav(:)%metadata%timerange%vol7d_timerange), back=.TRUE.)
3757!this%timerange=pack_distinct(metaanddatav(:)%metadata%timerange%vol7d_timerange, ntimerange, &
3758! mask=c_e(metaanddatav(:)%metadata%timerange%vol7d_timerange), back=.TRUE.)
3759this%timerange=pack_distinct_sorted(tmptimerange, ntimerange,mask=c_e(tmptimerange))
3760deallocate(tmptimerange)
3761!call sort(this%timerange)
3762
3763!nlevel=count_and_pack_distinct(metaanddatav(:)%metadata%level%vol7d_level,this%level, &
3764! mask=c_e(metaanddatav(:)%metadata%level%vol7d_level), back=.TRUE.)
3765!this%level=pack_distinct(metaanddatav(:)%metadata%level%vol7d_level, nlevel, &
3766! mask=c_e(metaanddatav(:)%metadata%level%vol7d_level), back=.TRUE.)
3767this%level=pack_distinct_sorted(tmplevel, nlevel,mask=c_e(tmplevel))
3768deallocate(tmplevel)
3769!call sort(this%level)
3770
3771if(ldegnet)then
3772 nnetwork=1
3773 ALLOCATE(this%network(1))
3774 this%network(1)=set_network
3775else
3776 !nnetwork=count_and_pack_distinct(metaanddatav(:)%metadata%network%vol7d_network,this%network, back=.TRUE.)
3777 !this%network=pack_distinct(metaanddatav(:)%metadata%network%vol7d_network, nnetwork, back=.TRUE.)
3778 this%network=pack_distinct_sorted(tmpnetwork, nnetwork)
3779 deallocate(tmpnetwork)
3780end if
3781!call sort(this%network)
3782
3783 ! var
3784
3785ndativarr = 0
3786ndativari = 0
3787ndativarb = 0
3788ndativard = 0
3789ndativarc = 0
3790
3791do i =1 ,size(vars%dcv)
3792 associate(dato => vars%dcv(i)%dat)
3793 select type (dato)
3794 type is (dbadatar)
3795 ndativarr = ndativarr + 1
3797 type is (dbadatai)
3798 ndativari = ndativari + 1
3800 type is (dbadatab)
3801 ndativarb = ndativarb + 1
3803 type is (dbadatad)
3804 ndativard = ndativard + 1
3806 type is (dbadatac)
3807 ndativarc = ndativarc + 1
3809 end select
3810 end associate
3811end do
3812
3813
3814 !attr
3815
3816ndatiattrr = 0
3817ndatiattri = 0
3818ndatiattrb = 0
3819ndatiattrd = 0
3820ndatiattrc = 0
3821
3822do i =1 ,size(starvars%dcv)
3823 associate(dato => starvars%dcv(i)%dat)
3824 select type (dato)
3825 type is (dbadatar)
3826 ndatiattrr = ndatiattrr + 1
3828 type is (dbadatai)
3829 ndatiattri = ndatiattri + 1
3831 type is (dbadatab)
3832 ndatiattrb = ndatiattrb + 1
3834 type is (dbadatad)
3835 ndatiattrd = ndatiattrd + 1
3837 type is (dbadatac)
3838 ndatiattrc = ndatiattrc + 1
3840 end select
3841 end associate
3842end do
3843
3844
3845 ! ana var
3846
3847nanavarr = 0
3848nanavari = 0
3849nanavarb = 0
3850nanavard = 0
3851nanavarc = 0
3852
3853do i =1 ,size(anavars%dcv)
3854 associate(dato => anavars%dcv(i)%dat)
3855 select type (dato)
3856 type is (dbadatar)
3857 nanavarr = nanavarr + 1
3859 type is (dbadatai)
3860 nanavari = nanavari + 1
3862 type is (dbadatab)
3863 nanavarb = nanavarb + 1
3865 type is (dbadatad)
3866 nanavard = nanavard + 1
3868 type is (dbadatac)
3869 nanavarc = nanavarc + 1
3871 end select
3872 end associate
3873end do
3874
3875
3876 ! ana attr
3877
3878nanaattrr = 0
3879nanaattri = 0
3880nanaattrb = 0
3881nanaattrd = 0
3882nanaattrc = 0
3883
3884do i =1 ,size(anastarvars%dcv)
3885 associate(dato => anastarvars%dcv(i)%dat)
3886 select type (dato)
3887 type is (dbadatar)
3888 nanaattrr = nanaattrr + 1
3890 type is (dbadatai)
3891 nanaattri = nanaattri + 1
3893 type is (dbadatab)
3894 nanaattrb = nanaattrb + 1
3896 type is (dbadatad)
3897 nanaattrd = nanaattrd + 1
3899 type is (dbadatac)
3900 nanaattrc = nanaattrc + 1
3902 end select
3903 end associate
3904end do
3905
3906
3907 ! here we colcolate the link from attributes and vars
3908do i =1, size(vars%dcv)
3909 associate(dato => vars%dcv(i)%dat)
3915 end associate
3916end do
3917
3918do i =1, size(anavars%dcv)
3919 associate(dato => anavars%dcv(i)%dat)
3925 end associate
3926end do
3927
3928 ! set index in dativaratt*
3929call vol7d_set_attr_ind(this)
3930
3931call vol7d_alloc_vol (this)
3932
3933 ! Ora qui bisogna metterci dentro idati
3934indana = 0
3935indtime = 0
3936indnetwork = 0
3937indtime = 0
3938indtimerange = 0
3939indlevel = 0
3940do i =1, size(metaanddatav)
3941
3942 indana = index_sorted(this%ana, metaanddatav(i)%metadata%ana%vol7d_ana)
3943
3944 if (ldegnet)then
3945 indnetwork=1
3946 else
3947 indnetwork = index_sorted(this%network, metaanddatav(i)%metadata%network%vol7d_network)
3948 endif
3949
3950 if (c_e(metaanddatav(i)%metadata%datetime%datetime) .and. &
3951 c_e(metaanddatav(i)%metadata%timerange%vol7d_timerange) .and. &
3952 c_e(metaanddatav(i)%metadata%level%vol7d_level) ) then ! dati
3953
3954 indtime = index_sorted(this%time, metaanddatav(i)%metadata%datetime%datetime)
3955 indtimerange = index_sorted(this%timerange, metaanddatav(i)%metadata%timerange%vol7d_timerange)
3956 indlevel = index_sorted(this%level, metaanddatav(i)%metadata%level%vol7d_level)
3957
3958 do j=1, size(metaanddatav(i)%dataattrv%dataattr)
3959
3960 associate(dato => metaanddatav(i)%dataattrv%dataattr(j)%dat)
3961 select type (dato)
3962 type is (dbadatai)
3963 inddativar = firsttrue(dato%btable == this%dativar%i%btable)
3964 this%voldatii( &
3965 indana,indtime,indlevel,indtimerange,inddativar,indnetwork &
3966 ) = dato%value
3967
3968 type is (dbadatar)
3969 inddativar = firsttrue(dato%btable == this%dativar%r%btable)
3970 this%voldatir( &
3971 indana,indtime,indlevel,indtimerange,inddativar,indnetwork &
3972 ) = dato%value
3973
3974 type is (dbadatad)
3975 inddativar = firsttrue(dato%btable == this%dativar%d%btable)
3976 this%voldatid( &
3977 indana,indtime,indlevel,indtimerange,inddativar,indnetwork &
3978 ) = dato%value
3979
3980 type is (dbadatab)
3981 inddativar = firsttrue(dato%btable == this%dativar%b%btable)
3982 this%voldatib( &
3983 indana,indtime,indlevel,indtimerange,inddativar,indnetwork &
3984 ) = dato%value
3985
3986 type is (dbadatac)
3987 inddativar = firsttrue(dato%btable == this%dativar%c%btable)
3988 this%voldatic( &
3989 indana,indtime,indlevel,indtimerange,inddativar,indnetwork &
3990 ) = dato%value
3991
3992 end select
3993
3994
3995 ! dati attributes
3996 do k=1, size(metaanddatav(i)%dataattrv%dataattr(j)%attrv%dcv)
3997 associate(attr => metaanddatav(i)%dataattrv%dataattr(j)%attrv%dcv(k)%dat)
3998 select type (attr)
3999
4000 type is (dbadatai)
4001 inddativarattr = firsttrue(dato%btable == this%dativarattr%i%btable)
4002 indattrvar = firsttrue(attr%btable == this%datiattr%i%btable)
4003 this%voldatiattri( &
4004 indana,indtime,indlevel,indtimerange,inddativarattr,indnetwork,indattrvar &
4005 ) = attr%value
4006 type is (dbadatar)
4007 inddativarattr = firsttrue(dato%btable == this%dativarattr%r%btable)
4008 indattrvar = firsttrue(attr%btable == this%datiattr%r%btable)
4009 this%voldatiattrr( &
4010 indana,indtime,indlevel,indtimerange,inddativarattr,indnetwork,indattrvar &
4011 ) = attr%value
4012 type is (dbadatad)
4013 inddativarattr = firsttrue(dato%btable == this%dativarattr%d%btable)
4014 indattrvar = firsttrue(attr%btable == this%datiattr%d%btable)
4015 this%voldatiattrd( &
4016 indana,indtime,indlevel,indtimerange,inddativarattr,indnetwork,indattrvar &
4017 ) = attr%value
4018 type is (dbadatab)
4019 inddativarattr = firsttrue(dato%btable == this%dativarattr%b%btable)
4020 indattrvar = firsttrue(attr%btable == this%datiattr%b%btable)
4021 this%voldatiattrb( &
4022 indana,indtime,indlevel,indtimerange,inddativarattr,indnetwork,indattrvar &
4023 ) = attr%value
4024 type is (dbadatac)
4025 inddativarattr = firsttrue(dato%btable == this%dativarattr%c%btable)
4026 indattrvar = firsttrue(attr%btable == this%datiattr%c%btable)
4027 this%voldatiattrc( &
4028 indana,indtime,indlevel,indtimerange,inddativarattr,indnetwork,indattrvar &
4029 ) = attr%value
4030
4031 end select
4032 end associate
4033 end do
4034 end associate
4035 end do
4036
4037 else
4038 ! ana
4039 do j=1, size(metaanddatav(i)%dataattrv%dataattr)
4040
4041 associate(dato => metaanddatav(i)%dataattrv%dataattr(j)%dat)
4042 select type (dato)
4043 type is (dbadatai)
4044 indanavar = firsttrue(dato%btable == this%anavar%i%btable)
4045 this%volanai( &
4046 indana,indanavar,indnetwork &
4047 ) = dato%value
4048
4049 type is (dbadatar)
4050 indanavar = firsttrue(dato%btable == this%anavar%r%btable)
4051 this%volanar( &
4052 indana,indanavar,indnetwork &
4053 ) = dato%value
4054
4055 type is (dbadatad)
4056 indanavar = firsttrue(dato%btable == this%anavar%d%btable)
4057 this%volanad( &
4058 indana,indanavar,indnetwork &
4059 ) = dato%value
4060
4061 type is (dbadatab)
4062 indanavar = firsttrue(dato%btable == this%anavar%b%btable)
4063 this%volanab( &
4064 indana,indanavar,indnetwork &
4065 ) = dato%value
4066
4067 type is (dbadatac)
4068 indanavar = firsttrue(dato%btable == this%anavar%c%btable)
4069 this%volanac( &
4070 indana,indanavar,indnetwork &
4071 ) = dato%value
4072
4073 end select
4074
4075
4076 ! ana attributes
4077 do k=1, size(metaanddatav(i)%dataattrv%dataattr(j)%attrv%dcv)
4078 associate(attr => metaanddatav(i)%dataattrv%dataattr(j)%attrv%dcv(k)%dat)
4079 select type (attr)
4080
4081 type is (dbadatai)
4082 indanavarattr = firsttrue(dato%btable == this%anavarattr%i%btable)
4083 indattrvar = firsttrue(attr%btable == this%anaattr%i%btable)
4084 this%volanaattri( &
4085 indana,indanavarattr,indnetwork,indattrvar &
4086 ) = attr%value
4087 type is (dbadatar)
4088 indanavarattr = firsttrue(dato%btable == this%anavarattr%r%btable)
4089 indattrvar = firsttrue(attr%btable == this%anaattr%r%btable)
4090 this%volanaattrr( &
4091 indana,indanavarattr,indnetwork,indattrvar &
4092 ) = attr%value
4093 type is (dbadatad)
4094 indanavarattr = firsttrue(dato%btable == this%anavarattr%d%btable)
4095 indattrvar = firsttrue(attr%btable == this%anaattr%d%btable)
4096 this%volanaattrd( &
4097 indana,indanavarattr,indnetwork,indattrvar &
4098 ) = attr%value
4099 type is (dbadatab)
4100 indanavarattr = firsttrue(dato%btable == this%anavarattr%b%btable)
4101 indattrvar = firsttrue(attr%btable == this%anaattr%b%btable)
4102 this%volanaattrb( &
4103 indana,indanavarattr,indnetwork,indattrvar &
4104 ) = attr%value
4105 type is (dbadatac)
4106 indanavarattr = firsttrue(dato%btable == this%anavarattr%c%btable)
4107 indattrvar = firsttrue(attr%btable == this%anaattr%c%btable)
4108 this%volanaattrc( &
4109 indana,indanavarattr,indnetwork,indattrvar &
4110 ) = attr%value
4111
4112 end select
4113 end associate
4114 end do
4115 end associate
4116 end do
4117 end if
4118end do
4119
4120contains
4121
4122!!$!> /brief Return an dbadcv from a mixlist with dbadata* type
4123!!$function todcv_dbadat(this)
4124!!$type(dbadcv) :: todcv_dbadat !< array
4125!!$type(mixlist) :: this
4126!!$
4127!!$integer :: i
4128!!$
4129!!$allocate (todcv_dbadat%dcv(this%countelements()))
4130!!$
4131!!$call this%rewind()
4132!!$i=0
4133!!$do while(this%element())
4134!!$ i=i+1
4135!!$
4136!!$ associate (dato => this%current())
4137!!$ select type (dato)
4138!!$ type is (dbadatar)
4139!!$ allocate(todcv_dbadat%dcv(i)%dat,source=dato)
4140!!$ type is (dbadatai)
4141!!$ allocate(todcv_dbadat%dcv(i)%dat,source=dato)
4142!!$ type is (dbadatab)
4143!!$ allocate(todcv_dbadat%dcv(i)%dat,source=dato)
4144!!$ type is (dbadatad)
4145!!$ allocate(todcv_dbadat%dcv(i)%dat,source=dato)
4146!!$ type is (dbadatac)
4147!!$ allocate(todcv_dbadat%dcv(i)%dat,source=dato)
4148!!$ end select
4149!!$ end associate
4150!!$
4151!!$ call this%next()
4152!!$end do
4153!!$end function todcv_dbadat
4154
4155!!$! Definisce le funzioni count_distinct e pack_distinct
4156!!$#define VOL7D_POLY_TYPE TYPE(dbadata)
4157!!$#define VOL7D_POLY_TYPES _dbadata
4158!!$#undef ENABLE_SORT
4159!!$#include "array_utilities_inc.F90"
4160!!$#undef VOL7D_POLY_TYPE
4161!!$#undef VOL7D_POLY_TYPES
4162
4163
4164end subroutine dba2v7d
4165
4166
4167subroutine vol7d_dballe_import_dballevar(this)
4168
4169type(vol7d_var),pointer :: this(:)
4170INTEGER :: i,un,n
4171
4172IF (associated(this)) return
4173IF (allocated(blocal)) then
4174 ALLOCATE(this(size(blocal)))
4175 this=blocal
4176 return
4177end if
4178
4179un = open_dballe_file('dballe.txt', filetype_data)
4180IF (un < 0) then
4181
4182 call l4f_log(l4f_error,"error open_dballe_file: dballe.txt")
4183 CALL raise_error("error open_dballe_file: dballe.txt")
4184 return
4185end if
4186
4187n = 0
4188DO WHILE(.true.)
4189 READ(un,*,END=100)
4190 n = n + 1
4191ENDDO
4192100 CONTINUE
4193
4194IF (n > 0) THEN
4195 ALLOCATE(this(n))
4196 ALLOCATE(blocal(n))
4197 rewind(un)
4198 readline: do i = 1 ,n
4199 READ(un,'(1x,A6,1x,a65,a24,i4)')blocal(i)%btable,blocal(i)%description,blocal(i)%unit,&
4200 blocal(i)%scalefactor
4201 blocal(i)%btable(:1)="B"
4202 !print*,"B=",blocal(i)%btable
4203 !print*," D=",blocal(i)%description
4204 !PRINT*," U=",blocal(i)%unit
4205 !PRINT*," D=",blocal(i)%scalefactor
4206 ENDDO readline
4207
4208 CALL l4f_log(l4f_info,'Found '//trim(to_char(i-1))//' variables in dballe master table')
4209
4210 this=blocal
4211
4212ENDIF
4213CLOSE(un)
4214
4215END SUBROUTINE vol7d_dballe_import_dballevar
4216
4217
4218
4219!> \brief Integra il vettore delle variabili in vol7d con le descrizioni e le unità di misura
4220!!eventualmente mancanti.
4221
4222subroutine vol7d_dballe_set_var_du(this)
4223
4224TYPE(vol7d) :: this !< oggetto vol7d con le variabili da completare
4225integer :: i,j
4226type(vol7d_var),pointer :: dballevar(:)
4227
4228nullify(dballevar)
4229call vol7d_dballe_import_dballevar(dballevar)
4230
4231#undef VOL7D_POLY_NAME
4232#define VOL7D_POLY_NAME dativar
4233
4234
4235#undef VOL7D_POLY_TYPES_V
4236#define VOL7D_POLY_TYPES_V r
4237#include "vol7d_dballe_class_var_du.F90"
4238#undef VOL7D_POLY_TYPES_V
4239#define VOL7D_POLY_TYPES_V i
4240#include "vol7d_dballe_class_var_du.F90"
4241#undef VOL7D_POLY_TYPES_V
4242#define VOL7D_POLY_TYPES_V b
4243#include "vol7d_dballe_class_var_du.F90"
4244#undef VOL7D_POLY_TYPES_V
4245#define VOL7D_POLY_TYPES_V d
4246#include "vol7d_dballe_class_var_du.F90"
4247#undef VOL7D_POLY_TYPES_V
4248#define VOL7D_POLY_TYPES_V c
4249#include "vol7d_dballe_class_var_du.F90"
4250#undef VOL7D_POLY_TYPES_V
4251
4252#undef VOL7D_POLY_NAME
4253#define VOL7D_POLY_NAME anavar
4254
4255
4256#undef VOL7D_POLY_TYPES_V
4257#define VOL7D_POLY_TYPES_V r
4258#include "vol7d_dballe_class_var_du.F90"
4259#undef VOL7D_POLY_TYPES_V
4260#define VOL7D_POLY_TYPES_V i
4261#include "vol7d_dballe_class_var_du.F90"
4262#undef VOL7D_POLY_TYPES_V
4263#define VOL7D_POLY_TYPES_V b
4264#include "vol7d_dballe_class_var_du.F90"
4265#undef VOL7D_POLY_TYPES_V
4266#define VOL7D_POLY_TYPES_V d
4267#include "vol7d_dballe_class_var_du.F90"
4268#undef VOL7D_POLY_TYPES_V
4269#define VOL7D_POLY_TYPES_V c
4270#include "vol7d_dballe_class_var_du.F90"
4271#undef VOL7D_POLY_TYPES_V
4272
4273
4274#undef VOL7D_POLY_NAME
4275#define VOL7D_POLY_NAME datiattr
4276
4277
4278#undef VOL7D_POLY_TYPES_V
4279#define VOL7D_POLY_TYPES_V r
4280#include "vol7d_dballe_class_var_du.F90"
4281#undef VOL7D_POLY_TYPES_V
4282#define VOL7D_POLY_TYPES_V i
4283#include "vol7d_dballe_class_var_du.F90"
4284#undef VOL7D_POLY_TYPES_V
4285#define VOL7D_POLY_TYPES_V b
4286#include "vol7d_dballe_class_var_du.F90"
4287#undef VOL7D_POLY_TYPES_V
4288#define VOL7D_POLY_TYPES_V d
4289#include "vol7d_dballe_class_var_du.F90"
4290#undef VOL7D_POLY_TYPES_V
4291#define VOL7D_POLY_TYPES_V c
4292#include "vol7d_dballe_class_var_du.F90"
4293#undef VOL7D_POLY_TYPES_V
4294
4295
4296#undef VOL7D_POLY_NAME
4297#define VOL7D_POLY_NAME anaattr
4298
4299
4300#undef VOL7D_POLY_TYPES_V
4301#define VOL7D_POLY_TYPES_V r
4302#include "vol7d_dballe_class_var_du.F90"
4303#undef VOL7D_POLY_TYPES_V
4304#define VOL7D_POLY_TYPES_V i
4305#include "vol7d_dballe_class_var_du.F90"
4306#undef VOL7D_POLY_TYPES_V
4307#define VOL7D_POLY_TYPES_V b
4308#include "vol7d_dballe_class_var_du.F90"
4309#undef VOL7D_POLY_TYPES_V
4310#define VOL7D_POLY_TYPES_V d
4311#include "vol7d_dballe_class_var_du.F90"
4312#undef VOL7D_POLY_TYPES_V
4313#define VOL7D_POLY_TYPES_V c
4314#include "vol7d_dballe_class_var_du.F90"
4315#undef VOL7D_POLY_TYPES_V
4316
4317
4318deallocate(dballevar)
4319
4320return
4321
4322end subroutine vol7d_dballe_set_var_du
4323
4324
4325
4326FUNCTION get_dballe_filepath(filename, filetype) RESULT(path)
4327CHARACTER(len=*), INTENT(in) :: filename
4328INTEGER, INTENT(in) :: filetype
4329
4330INTEGER :: j
4331CHARACTER(len=512) :: path
4332LOGICAL :: exist
4333
4334IF (dballe_name == ' ') THEN
4335 CALL getarg(0, dballe_name)
4336 ! dballe_name_env
4337ENDIF
4338
4339IF (filetype < 1 .OR. filetype > nftype) THEN
4340 path = ""
4341 CALL l4f_log(l4f_error, 'dballe file type '//trim(to_char(filetype))// &
4342 ' not valid')
4343 CALL raise_error()
4344 RETURN
4345ENDIF
4346
4347! try with environment variable
4348CALL getenv(trim(dballe_name_env), path)
4349IF (path /= ' ') THEN
4350
4351 path=trim(path)//'/'//filename
4352 INQUIRE(file=path, exist=exist)
4353 IF (exist) THEN
4354 CALL l4f_log(l4f_info, 'dballe file '//trim(path)//' found')
4355 RETURN
4356 ENDIF
4357ENDIF
4358! try with pathlist
4359DO j = 1, SIZE(pathlist,1)
4360 IF (pathlist(j,filetype) == ' ') EXIT
4361 path=trim(pathlist(j,filetype))//'/'//trim(dballe_name)//'/'//filename
4362 INQUIRE(file=path, exist=exist)
4363 IF (exist) THEN
4364 CALL l4f_log(l4f_info, 'dballe file '//trim(path)//' found')
4365 RETURN
4366 ENDIF
4367ENDDO
4368CALL l4f_log(l4f_error, 'dballe file '//trim(filename)//' not found')
4369CALL raise_error()
4370path = ""
4371
4372END FUNCTION get_dballe_filepath
4373
4374
4375FUNCTION open_dballe_file(filename, filetype) RESULT(unit)
4376CHARACTER(len=*), INTENT(in) :: filename
4377INTEGER, INTENT(in) :: filetype
4378INTEGER :: unit,i
4379
4380CHARACTER(len=512) :: path
4381
4382unit = -1
4383path=get_dballe_filepath(filename, filetype)
4384IF (path == '') RETURN
4385
4386unit = getunit()
4387IF (unit == -1) RETURN
4388
4389OPEN(unit, file=path, status='old', iostat = i)
4390IF (i == 0) THEN
4391 CALL l4f_log(l4f_info, 'dballe file '//trim(path)//' opened')
4392 RETURN
4393ENDIF
4394
4395CALL l4f_log(l4f_error, 'dballe file '//trim(filename)//' not found')
4396CALL raise_error()
4397unit = -1
4398
4399END FUNCTION open_dballe_file
4400
4401
4402!> \brief Exporta un volume dati a un DSN DB-all.e
4403!!
4404!! Riscrive i dati nel DSN di DB-All.e con la possibilità di attivare
4405!! una serie di filtri.
4406
4407
4408!!! TODO manage attr_only
4409!!! attention template migrated in init
4410!SUBROUTINE vol7d_dballe_export(this, network, coordmin, coordmax,&
4411! timei, timef,level,timerange,var,attr,anavar,anaattr,attr_only,ana,dataonly)
4412
4413SUBROUTINE vol7d_dballe_export_old(this, network, coordmin, coordmax,&
4414 timei, timef,level,timerange,var,attr,anavar,anaattr,ana,dataonly,anaonly,template,attr_only)
4415
4416TYPE(vol7d_dballe),INTENT(inout) :: this !< oggetto contenente il volume e altre info per l'accesso al DSN
4417character(len=network_name_len),INTENT(in),optional :: network !< network da exportare
4418!> coordinate minime e massime che definiscono il
4419!! rettangolo di estrazione per l'esportazione
4420TYPE(geo_coord),INTENT(in),optional :: coordmin,coordmax
4421!>estremi temporali dei dati da esportare
4422TYPE(datetime),INTENT(in),optional :: timei, timef
4423TYPE(vol7d_level),INTENT(in),optional :: level !< livello selezionato per l'esportazione
4424TYPE(vol7d_timerange),INTENT(in),optional :: timerange !< timerange selezionato per l'esportazione
4425!> variabili da exportare secondo la tabella B locale o alias relative a dati, attributi,
4426!! anagrafica e attributi dell'anagrafica
4427CHARACTER(len=*),INTENT(in),OPTIONAL :: var(:),attr(:),anavar(:),anaattr(:)
4428!!$!> permette di riscrivere su un DSN letto precedentemente, modificando solo gli attributi ai dati,
4429!!$!! ottimizzando enormente le prestazioni: gli attributi riscritti saranno quelli con this%data_id definito
4430!!$!! (solitamente ricopiato dall'oggetto letto)
4431!!$logical,intent(in),optional :: attr_only
4432TYPE(vol7d_ana),INTENT(inout),optional :: ana !< identificativo della stazione da exportare
4433logical, intent(in),optional :: dataonly !< set to .true. to export data only
4434logical, intent(in),optional :: anaonly !< set to .true. to export ana only
4435!> specificando category.subcategory.localcategory oppure un alias ("synop", "metar","temp","generic") forza l'exportazione ad uno specifico template BUFR/CREX"
4436!! 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
4437character(len=*),intent(in),optional :: template
4438logical, intent(in),optional :: attr_only !< set to .true. to export attr only (no data)
4439
4440
4441type(dbadcv) :: vars,starvars,anavars,anastarvars
4442type(dbafilter) :: filter
4443type(dbacoord) :: mydbacoordmin, mydbacoordmax
4444type(dbaana) :: mydbaana
4445type(dbadatetime) :: mydatetimemin, mydatetimemax
4446type(dbatimerange) :: mydbatimerange
4447type(dbalevel) :: mydbalevel
4448type(dbanetwork) :: mydbanetwork
4449
4450integer :: i
4451LOGICAL :: lattr, lanaattr
4452integer :: nanaattr,nattr,nanavar,nvar
4453
4454
4455 ! ------------- prepare filter options
4456
4457!!
4458!! translate export option for dballe2003 api
4459!!
4460
4461if (present(var)) then
4462 nvar=count(c_e(var))
4463 if (nvar > 0) then
4464 allocate (vars%dcv(nvar))
4465 do i=1,size(var)
4466 if (c_e(var(i)))then
4467 allocate (vars%dcv(i)%dat,source=dbadatac(var(i))) !char is default
4468 end if
4469 end do
4470 end if
4471end if
4472
4473if (present(anavar)) then
4474 nanavar=count(c_e(anavar))
4475 if (nanavar > 0) then
4476 allocate (anavars%dcv(nanavar))
4477 do i=1,size(anavar)
4478 if (c_e(anavar(i)))then
4479 allocate (anavars%dcv(i)%dat,source=dbadatac(anavar(i))) !char is default
4480 end if
4481 end do
4482 end if
4483end if
4484
4485lattr = .false.
4486if (present(attr)) then
4487 nattr=count(c_e(attr))
4488 if (nattr > 0) then
4489 lattr = .true.
4490 allocate (starvars%dcv(nattr))
4491 do i=1,size(attr)
4492 if (c_e(attr(i)))then
4493 allocate (starvars%dcv(i)%dat,source=dbadatac(attr(i))) !char is default
4494 end if
4495 end do
4496 end if
4497end if
4498
4499lanaattr = .false.
4500if (present(anaattr)) then
4501 nanaattr=count(c_e(anaattr))
4502 if (nanaattr > 0) then
4503 lanaattr = .true.
4504 allocate (anastarvars%dcv(nanaattr))
4505 do i=1,size(anaattr)
4506 if (c_e(anaattr(i)))then
4507 allocate (anastarvars%dcv(i)%dat,source=dbadatac(anaattr(i))) !char is default
4508 end if
4509 end do
4510 end if
4511end if
4512
4513
4514 ! like a cast
4515mydbacoordmin=dbacoord()
4516if (present(coordmin)) mydbacoordmin%geo_coord=coordmin
4517mydbacoordmax=dbacoord()
4518if (present(coordmax)) mydbacoordmax%geo_coord=coordmax
4519mydbaana=dbaana()
4520if (present(ana)) mydbaana%vol7d_ana=ana
4521mydatetimemin=dbadatetime()
4522if (present(timei)) mydatetimemin%datetime=timei
4523mydatetimemax=dbadatetime()
4524if (present(timef)) mydatetimemax%datetime=timef
4525mydbatimerange=dbatimerange()
4526if (present(timerange)) mydbatimerange%vol7d_timerange=timerange
4527mydbalevel=dbalevel()
4528if (present(level)) mydbalevel%vol7d_level=level
4529mydbanetwork=dbanetwork()
4531
4532!!
4533!! here we have options ready for filter
4534!!
4535filter=dbafilter(coordmin=mydbacoordmin,coordmax=mydbacoordmax,ana=mydbaana, &
4536 datetimemin=mydatetimemin,datetimemax=mydatetimemax, &
4537 timerange=mydbatimerange,level=mydbalevel,network=mydbanetwork,&
4538 vars=vars,starvars=starvars,anavars=anavars,anastarvars=anastarvars,&
4539 dataonly=dataonly,anaonly=anaonly)
4540
4541!!$ print *, "filter:"
4542!!$ call filter%display()
4543
4545
4546end SUBROUTINE vol7d_dballe_export_old
4547
4548
4549subroutine vol7d_dballe_export (this, filter, template, attr_only)
4550
4551TYPE(vol7d_dballe),INTENT(inout) :: this !< oggetto contenente il volume e altre info per l'accesso al DSN
4552type(dbafilter),intent(in) :: filter !< filter o use
4553!> specificando category.subcategory.localcategory oppure un alias ("synop", "metar","temp","generic") forza l'exportazione ad uno specifico template BUFR/CREX"
4554!! 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
4555character(len=*),intent(in),optional :: template
4556logical, intent(in),optional :: attr_only !< set to .true. to export attr only (no data)
4557
4558character(len=40) :: ltemplate
4559
4560type(dbametaanddatalist) :: metaanddatal
4561logical :: stat
4562
4563metaanddatal=dbametaanddatalist()
4564
4565call v7d2dba(this%vol7d,metaanddatal)
4566!call metaanddatal%display()
4567
4568!clean memdb
4569if (this%file) call this%handle%remove_all()
4570
4571! using filter here can limit memory use for memdb
4572call metaanddatal%extrude(session=this%handle,filter=filter,attronly=attr_only,template=template)
4573
4574if (this%file) then
4575 !!!!! this if we have written in memdb and now we have to write the file
4576
4577 !filter is already in extrude
4578 !this%handle%set(filter=filter)
4579
4580 ! export to file
4581 !! TODO : revert template from init to export !!!!!!!!!!!!!!!!!!!!!
4582 !!call this%handle%messages_write_next(template)
4583
4584 ! note that you can use unsetall hera because the filter was used in extrude
4585 call filter%dbaset(this%handle)
4586
4587 ltemplate=this%handle%template
4588 if (present(template))then
4589 ltemplate=template
4590 end if
4591
4592 call this%handle%messages_write_next(ltemplate)
4593
4594 !clean memdb
4595 call this%handle%remove_all()
4596
4597end if
4598
4599stat = metaanddatal%delete()
4600
4601end subroutine vol7d_dballe_export
4602
4603
4604subroutine v7d2dba(v7d,metaanddatal)
4605TYPE(vol7d),INTENT(in) :: v7d !!!!!! dovrebbe essere intent(in)
4606type(dbametaanddatalist),intent(inout) :: metaanddatal
4607
4608TYPE(vol7d_serialize_dballe) :: serialize
4609
4610serialize = vol7d_serialize_dballe_new()
4611serialize%anaonly=.true.
4612call serialize%vol7d_serialize_setup(v7d)
4613call serialize%vol7d_serialize_export(metaanddatal)
4614
4615serialize = vol7d_serialize_dballe_new()
4616serialize%dataonly=.true.
4617call serialize%vol7d_serialize_setup(v7d)
4618call serialize%vol7d_serialize_export(metaanddatal)
4619
4620end subroutine v7d2dba
4621
4622
4624
4625!>\example esempio_v7ddballe.f90
4626!!/brief Programma esempio semplice per l'uso di vol7d con DB-All.e
4627!!
4628
4629!>\example esempio_v7ddballe_multi.f90
4630!!/brief Programma esempio per l'uso di vol7d con DB-All.e
4631!!
4632!!Vengono estratte più reti
4633
4634!>\example esempio_v7ddballe_import_export.f90
4635!!\brief Esempio di utilizzo della classe vol7d_dballe_class
4636!!
4637!! Vengono estratti i dati e riscritti in un nuovo DSN
Emit log message for a category with specific priority. Definition log4fortran.F90:461 This module defines usefull general purpose function and subroutine. Definition array_utilities.F90:212 Classes for handling georeferenced sparse points in geographical corodinates. Definition geo_coord_class.F90:216 class to use character lists in fortran 2003 WARNING ! Definition list_character.F03:58 Classe per la gestione di un volume completo di dati osservati. Definition vol7d_class.F90:273 classe per import ed export di volumi da e in DB-All.e Definition vol7d_dballe_class.F03:266 Oggetto per import ed export da DB-All.e. Definition vol7d_dballe_class.F03:290 |