libsim Versione 8.0.0

◆ vol7d_dballe_export_old()

subroutine vol7d_dballe_export_old ( type(vol7d_dballe), intent(inout) this,
character(len=network_name_len), intent(in), optional network,
type(geo_coord), intent(in), optional coordmin,
type(geo_coord), intent(in), optional coordmax,
type(datetime), intent(in), optional timei,
type(datetime), intent(in), optional timef,
type(vol7d_level), intent(in), optional level,
type(vol7d_timerange), intent(in), optional timerange,
character(len=*), dimension(:), intent(in), optional var,
character(len=*), dimension(:), intent(in), optional attr,
character(len=*), dimension(:), intent(in), optional anavar,
character(len=*), dimension(:), intent(in), optional anaattr,
type(vol7d_ana), intent(inout), optional ana,
logical, intent(in), optional dataonly,
logical, intent(in), optional anaonly,
character(len=*), intent(in), optional template,
logical, intent(in), optional attr_only )

Exporta un volume dati a un DSN DB-all.e.

Riscrive i dati nel DSN di DB-All.e con la possibilità di attivare una serie di filtri.

Parametri
[in,out]thisoggetto contenente il volume e altre info per l'accesso al DSN
[in]networknetwork da exportare
[in]coordmincoordinate minime e massime che definiscono il rettangolo di estrazione per l'esportazione
[in]coordmaxcoordinate minime e massime che definiscono il rettangolo di estrazione per l'esportazione
[in]timeiestremi temporali dei dati da esportare
[in]timefestremi temporali dei dati da esportare
[in]levellivello selezionato per l'esportazione
[in]timerangetimerange selezionato per l'esportazione
[in]varvariabili da exportare secondo la tabella B locale o alias relative a dati, attributi, anagrafica e attributi dell'anagrafica
[in]attrvariabili da exportare secondo la tabella B locale o alias relative a dati, attributi, anagrafica e attributi dell'anagrafica
[in]anavarvariabili da exportare secondo la tabella B locale o alias relative a dati, attributi, anagrafica e attributi dell'anagrafica
[in]anaattrvariabili da exportare secondo la tabella B locale o alias relative a dati, attributi, anagrafica e attributi dell'anagrafica
[in,out]anaidentificativo della stazione da exportare
[in]dataonlyset to .true. to export data only
[in]anaonlyset to .true. to export ana only
[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 2642 del file vol7d_dballe_class.F03.

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