libsim Versione 8.0.0

◆ vol7d_dballe_export()

subroutine vol7d_dballe_export ( type(vol7d_dballe), intent(inout) this,
type(dbafilter), intent(in) filter,
character(len=*), intent(in), optional template,
logical, intent(in), optional attr_only )
private
Parametri
[in,out]thisoggetto contenente il volume e altre info per l'accesso al DSN
[in]filterfilter o use
[in]templatespecificando category.subcategory.localcategory oppure un alias ("synop", "metar","temp","generic") forza l'exportazione ad uno specifico template BUFR/CREX" 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
[in]attr_onlyset to .true. to export attr only (no data)

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
2856MODULE vol7d_dballe_class
2857
2858USE dballe_class
2860USE vol7d_class
2862use log4fortran
2864!use list_mix
2866use list_linkchar
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
2880TYPE vol7d_dballe
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
2892END TYPE vol7d_dballe
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
2908INTERFACE init
2909 MODULE PROCEDURE vol7d_dballe_init
2910END INTERFACE init
2911
2912 !>\brief cancella
2913INTERFACE delete
2914 MODULE PROCEDURE vol7d_dballe_delete
2915END INTERFACE 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
2924INTERFACE export
2925 MODULE PROCEDURE vol7d_dballe_export_old,vol7d_dballe_export, v7d2dba
2926END INTERFACE export
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
2974CALL l4f_category_log(this%category,l4f_debug,'vol7d_dballe_init start')
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)
2991 if (index(arg,'/',back=.true.) > 0) lfilename=lfilename(index(arg,'/',back=.true.)+1 : )
2992
2993 if (present(filename))then
2994 if (c_e(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
3022CALL init(this%vol7d, time_definition)
3023this%time_definition = optio_i(time_definition)
3024
3025#ifdef DEBUG
3026CALL l4f_category_log(this%category,l4f_debug,'vol7d_dballe_init end')
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
3057 CALL import(this, var, coordmin=coordmin, coordmax=coordmax, timei=timei, &
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
3063 CALL init(this%vol7d)
3064 v7ddbatmp = this ! shallow copy
3065 DO i = 1, SIZE(network)
3066 CALL import(v7ddbatmp, var, network(i), coordmin, coordmax, timei, timef, &
3067 level,timerange, set_network, attr,anavar,anaattr, varkind, attrkind, &
3068 anavarkind, anaattrkind, anaonly, dataonly, ana)
3069 CALL vol7d_merge(this%vol7d, v7ddbatmp%vol7d, sort=.true.)
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
3120CALL l4f_category_log(this%category,l4f_debug,'inizio')
3121#endif
3122
3123
3124IF (PRESENT(set_network)) THEN
3125 if (c_e(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)
3162 if (c_e(var(i)))then
3163 if (present(varkind))then
3164 select case (varkind(i))
3165 case("r")
3166 allocate (vars%dcv(i)%dat,source=dbadatar(var(i)))
3167 case("i")
3168 allocate (vars%dcv(i)%dat,source=dbadatai(var(i)))
3169 case("b")
3170 allocate (vars%dcv(i)%dat,source=dbadatab(var(i)))
3171 case("d")
3172 allocate (vars%dcv(i)%dat,source=dbadatad(var(i)))
3173 case("c")
3174 allocate (vars%dcv(i)%dat,source=dbadatac(var(i)))
3175 case default
3176 call l4f_category_log(this%category,l4f_error,"var and varkind mismach")
3177 CALL raise_fatal_error()
3178 end select
3179 else
3180 allocate (vars%dcv(i)%dat,source=dbadatac(var(i))) !char is default
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)
3192 if (c_e(anavar(i)))then
3193 if (present(anavarkind))then
3194 select case (anavarkind(i))
3195 case("r")
3196 allocate (anavars%dcv(i)%dat,source=dbadatar(anavar(i)))
3197 case("i")
3198 allocate (anavars%dcv(i)%dat,source=dbadatai(anavar(i)))
3199 case("b")
3200 allocate (anavars%dcv(i)%dat,source=dbadatab(anavar(i)))
3201 case("d")
3202 allocate (anavars%dcv(i)%dat,source=dbadatad(anavar(i)))
3203 case("c")
3204 allocate (anavars%dcv(i)%dat,source=dbadatac(anavar(i)))
3205 case default
3206 call l4f_category_log(this%category,l4f_error,"anavar and anavarkind mismach")
3207 CALL raise_fatal_error()
3208 end select
3209 else
3210 allocate (anavars%dcv(i)%dat,source=dbadatac(anavar(i))) !char is default
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)
3226 if (c_e(attr(i)))then
3227 if (present(attrkind))then
3228 select case (attrkind(i))
3229 case("r")
3230 allocate (starvars%dcv(i)%dat,source=dbadatar(attr(i)))
3231 case("i")
3232 allocate (starvars%dcv(i)%dat,source=dbadatai(attr(i)))
3233 case("b")
3234 allocate (starvars%dcv(i)%dat,source=dbadatab(attr(i)))
3235 case("d")
3236 allocate (starvars%dcv(i)%dat,source=dbadatad(attr(i)))
3237 case("c")
3238 allocate (starvars%dcv(i)%dat,source=dbadatac(attr(i)))
3239 case default
3240 call l4f_category_log(this%category,l4f_error,"attr and attrkind mismach")
3241 CALL raise_fatal_error()
3242 end select
3243 else
3244 allocate (starvars%dcv(i)%dat,source=dbadatac(attr(i))) !char is default
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)
3261 if (c_e(anaattr(i)))then
3262 if (present(anaattrkind))then
3263 select case (anaattrkind(i))
3264 case("r")
3265 allocate (anastarvars%dcv(i)%dat,source=dbadatar(anaattr(i)))
3266 case("i")
3267 allocate (anastarvars%dcv(i)%dat,source=dbadatai(anaattr(i)))
3268 case("b")
3269 allocate (anastarvars%dcv(i)%dat,source=dbadatab(anaattr(i)))
3270 case("d")
3271 allocate (anastarvars%dcv(i)%dat,source=dbadatad(anaattr(i)))
3272 case("c")
3273 allocate (anastarvars%dcv(i)%dat,source=dbadatac(anaattr(i)))
3274 case default
3275 call l4f_category_log(this%category,l4f_error,"attr and attrkind mismach")
3276 CALL raise_fatal_error()
3277 end select
3278 else
3279 allocate (anastarvars%dcv(i)%dat,source=dbadatac(anaattr(i))) !char is default
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
3317call import(this,filter,set_network)
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
3335CALL l4f_category_log(this%category,l4f_debug,'start import vol7d_dballe')
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)
3346 CALL l4f_category_log(this%category,l4f_debug,'end import vol7d_dballe ingest')
3347 CALL l4f_category_log(this%category,l4f_debug,'start import vol7d_dballe dba2v7d')
3348 call dba2v7d(this%vol7d, metaanddatav,this%time_definition,set_network)
3349 CALL l4f_category_log(this%category,l4f_debug,'end import vol7d_dballe dba2v7d')
3350
3351 deallocate (metaanddatav)
3352
3353else
3354 ! empty volume
3355 call init(this%vol7d)
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)
3371 CALL l4f_category_log(this%category,l4f_debug,'end import vol7d_dballe ingest')
3372 CALL l4f_category_log(this%category,l4f_debug,'start import vol7d_dballe dba2v7d')
3373 call dba2v7d(vol7dtmp,metaanddatav,this%time_definition,set_network)
3374 CALL l4f_category_log(this%category,l4f_debug,'end import vol7d_dballe dba2v7d')
3375
3376 deallocate (metaanddatav)
3377
3378 CALL vol7d_merge(this%vol7d, vol7dtmp, sort=.true.) ! Smart merge
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
3425CALL l4f_category_log(this%category,l4f_debug,'end import vol7d_dballe')
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
3448CALL delete(this%vol7d)
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)
3505if (.not. c_e(ltime_definition)) ltime_definition = 1
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
3524 if (c_e(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)
3543 if (c_e(metaanddatav(i)%metadata%datetime%datetime)) then
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)
3570 if (c_e(metaanddatav(i)%metadata%datetime%datetime)) then
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)
3583 if (.not. c_e(metaanddatav(i)%metadata%datetime%datetime)) then
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)
3597 if (c_e(metaanddatav(i)%metadata%datetime%datetime)) then
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)
3626 if (c_e(metaanddatav(i)%metadata%datetime%datetime)) then
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)
3642 if (.not. c_e(metaanddatav(i)%metadata%datetime%datetime)) then
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)
3667 call sort(tmpnetwork)
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)
3675call sort(tmptime)
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)
3682call sort(tmptimerange)
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)
3689call sort(tmplevel)
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)
3695call sort(tmpana)
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)
3719 type is (dbadatar)
3720 ndativarr = ndativarr + 1
3721 type is (dbadatai)
3722 ndativari = ndativari + 1
3723 type is (dbadatab)
3724 ndativarb = ndativarb + 1
3725 type is (dbadatad)
3726 ndativard = ndativard + 1
3727 type is (dbadatac)
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)
3745 type is (dbadatar)
3746 ndatiattrr = ndatiattrr + 1
3747 type is (dbadatai)
3748 ndatiattri = ndatiattri + 1
3749 type is (dbadatab)
3750 ndatiattrb = ndatiattrb + 1
3751 type is (dbadatad)
3752 ndatiattrd = ndatiattrd + 1
3753 type is (dbadatac)
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
3840CALL init(this,time_definition=ltime_definition)
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
3931 call init (this%dativar%r(ndativarr), btable=dato%btable)
3932 type is (dbadatai)
3933 ndativari = ndativari + 1
3934 call init (this%dativar%i(ndativari), btable=dato%btable)
3935 type is (dbadatab)
3936 ndativarb = ndativarb + 1
3937 call init (this%dativar%b(ndativarb), btable=dato%btable)
3938 type is (dbadatad)
3939 ndativard = ndativard + 1
3940 call init (this%dativar%d(ndativard), btable=dato%btable)
3941 type is (dbadatac)
3942 ndativarc = ndativarc + 1
3943 call init (this%dativar%c(ndativarc), btable=dato%btable)
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
3962 call init (this%datiattr%r(ndatiattrr), btable=dato%btable)
3963 type is (dbadatai)
3964 ndatiattri = ndatiattri + 1
3965 call init (this%datiattr%i(ndatiattri), btable=dato%btable)
3966 type is (dbadatab)
3967 ndatiattrb = ndatiattrb + 1
3968 call init (this%datiattr%b(ndatiattrb), btable=dato%btable)
3969 type is (dbadatad)
3970 ndatiattrd = ndatiattrd + 1
3971 call init (this%datiattr%d(ndatiattrd), btable=dato%btable)
3972 type is (dbadatac)
3973 ndatiattrc = ndatiattrc + 1
3974 call init (this%datiattr%c(ndatiattrc), btable=dato%btable)
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
3993 call init (this%anavar%r(nanavarr), btable=dato%btable)
3994 type is (dbadatai)
3995 nanavari = nanavari + 1
3996 call init (this%anavar%i(nanavari), btable=dato%btable)
3997 type is (dbadatab)
3998 nanavarb = nanavarb + 1
3999 call init (this%anavar%b(nanavarb), btable=dato%btable)
4000 type is (dbadatad)
4001 nanavard = nanavard + 1
4002 call init (this%anavar%d(nanavard), btable=dato%btable)
4003 type is (dbadatac)
4004 nanavarc = nanavarc + 1
4005 call init (this%anavar%c(nanavarc), btable=dato%btable)
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
4024 call init (this%anaattr%r(nanaattrr), btable=dato%btable)
4025 type is (dbadatai)
4026 nanaattri = nanaattri + 1
4027 call init (this%anaattr%i(nanaattri), btable=dato%btable)
4028 type is (dbadatab)
4029 nanaattrb = nanaattrb + 1
4030 call init (this%anaattr%b(nanaattrb), btable=dato%btable)
4031 type is (dbadatad)
4032 nanaattrd = nanaattrd + 1
4033 call init (this%anaattr%d(nanaattrd), btable=dato%btable)
4034 type is (dbadatac)
4035 nanaattrc = nanaattrc + 1
4036 call init (this%anaattr%c(nanaattrc), btable=dato%btable)
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)
4045 if ( ndativarattri > 0 ) call init(this%dativarattr%i(i),btable=dato%btable)
4046 if ( ndativarattrr > 0 ) call init(this%dativarattr%r(i),btable=dato%btable)
4047 if ( ndativarattrd > 0 ) call init(this%dativarattr%d(i),btable=dato%btable)
4048 if ( ndativarattrb > 0 ) call init(this%dativarattr%b(i),btable=dato%btable)
4049 if ( ndativarattrc > 0 ) call init(this%dativarattr%c(i),btable=dato%btable)
4050 end associate
4051end do
4052
4053do i =1, size(anavars%dcv)
4054 associate(dato => anavars%dcv(i)%dat)
4055 if ( nanavarattri > 0 ) call init(this%anavarattr%i(i),btable=dato%btable)
4056 if ( nanavarattrr > 0 ) call init(this%anavarattr%r(i),btable=dato%btable)
4057 if ( nanavarattrd > 0 ) call init(this%anavarattr%d(i),btable=dato%btable)
4058 if ( nanavarattrb > 0 ) call init(this%anavarattr%b(i),btable=dato%btable)
4059 if ( nanavarattrc > 0 ) call init(this%anavarattr%c(i),btable=dato%btable)
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()
4665if (present(network)) call init(mydbanetwork%vol7d_network,name=network)
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
4679call export (this, filter,template,attr_only)
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
4758end MODULE vol7d_dballe_class
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
Index method.
Emit log message for a category with specific priority.
This module defines usefull general purpose function and subroutine.
Utilities for CHARACTER variables.
class for import and export data from e to DB-All.e.
Classes for handling georeferenced sparse points in geographical corodinates.
class to use character lists in fortran 2003 WARNING !
class to manage links for lists in fortran 2003.
classe per la gestione del logging
Classe per la gestione di un volume completo di dati osservati.
classe per import ed export di volumi da e in DB-All.e
manage connection handle to a DSN
fortran 2003 interface to geo_coord
byte version for dbadata
character version for dbadata
doubleprecision version for dbadata
integer version for dbadata
real version for dbadata
filter to apply before ingest data
manage session handle
Oggetto per import ed export da DB-All.e.

Generated with Doxygen.