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