|
libsim Versione 8.0.0
|
◆ vol7d_get_voldatiattrc()
Crea una vista a dimensione ridotta di un volume di attributi di dati di tipo CHARACTER(len=vol7d_cdatalen). È necessario fornire uno solo dei parametri opzionali vol*dp corrispondente al numero di dimensioni richieste. L'ordine delle dimensioni nella vista è quello prefissato in vol7d indipendentemente dall'ordine delle dimensioni fornito in dimlist. In caso di fallimento, in particolare se dimlist non contiene tutte le dimensioni non degeneri del volume richiesto oppure se una delle dimensioni è =0, il puntatore vol*dp è restituito in uno stato disassociato, per cui è opportuno controllare sempre in uscita, lo stato del puntatore per evitare che il programma abortisca con un errore di sistema, ad esempio: CHARACTER(len=vol7d_cdatalen), POINTER :: vol2d(:,:)
...
CALL vol7d_get_voldatiattrc(v7d1, (/vol7d_ana_d, vol7d_time_d/), vol2d)
IF (ASSOCIATED(vol2d)) THEN
print*,vol2d
...
ENDIF
return
Definizione alla linea 6406 del file vol7d_class.F90. 6408! Copyright (C) 2010 ARPA-SIM <urpsim@smr.arpa.emr.it>
6409! authors:
6410! Davide Cesari <dcesari@arpa.emr.it>
6411! Paolo Patruno <ppatruno@arpa.emr.it>
6412
6413! This program is free software; you can redistribute it and/or
6414! modify it under the terms of the GNU General Public License as
6415! published by the Free Software Foundation; either version 2 of
6416! the License, or (at your option) any later version.
6417
6418! This program is distributed in the hope that it will be useful,
6419! but WITHOUT ANY WARRANTY; without even the implied warranty of
6420! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
6421! GNU General Public License for more details.
6422
6423! You should have received a copy of the GNU General Public License
6424! along with this program. If not, see <http://www.gnu.org/licenses/>.
6425#include "config.h"
6426
6427!> \defgroup vol7d Libsim package, vol7d library.
6428!! The libsim vol7d library contains classes for managing pointwise
6429!! data, tipically weather observations, and for their import from a
6430!! Db-All.e database or from a WMO BUFR file. In order to compile and
6431!! link programs using this library, you have to insert the required
6432!! \c USE statements in the program units involved, specify the
6433!! location of module files when compiling (tipically \c
6434!! -I/usr/lib/gfortran/modules or \c -I/usr/lib64/gfortran/modules or
6435!! \c -I/usr/include) and indicate the library name \c -lsim_vol7d
6436!! when linking, assuming that the library has been installed in a
6437!! default location.
6438
6439!> Classe per la gestione di un volume completo di dati osservati.
6440!! Questo modulo definisce gli oggetti e i metodi per gestire
6441!! volumi di dati meteorologici sparsi.
6442!! I volumi definiti sono principalmente di 4 categorie:
6443!! - volumi di anagrafica (vol7d::volanar & c.), hanno 3 dimensioni:
6444!! - anagrafica
6445!! - variabile di anagrafica
6446!! - rete
6447!! - volumi di attributi di anagrafica (vol7d::volanaattrr & c.), hanno 4 dimensioni:
6448!! - anagrafica
6449!! - variabile di anagrafica
6450!! - rete
6451!! - variabile di attributi delle variabili di anagrafica
6452!! - volumi di dati (vol7d::voldatir & c.), hanno 6 dimensioni:
6453!! - anagrafica
6454!! - tempo
6455!! - livello verticale
6456!! - intervallo temporale (timerange)
6457!! - variabile di dati
6458!! - rete
6459!! - volumi di attributi di dati (vol7d::voldatiattrr & c.), hanno 7 dimensioni:
6460!! - anagrafica
6461!! - tempo
6462!! - livello verticale
6463!! - intervallo temporale (timerange)
6464!! - variabile di dati
6465!! - rete
6466!! - variabile di attributi delle variabili di dati
6467!!
6468!! Tutte le variabili sono inoltre disponibil1 in 5 tipi diversi:
6469!! - reale (abbreviato r)
6470!! - doppia precisione (abbreviato d)
6471!! - intero (abbreviato i)
6472!! - byte (abbreviato b)
6473!! - carattere (abbreviato c)
6474!!
6475!! Per ognuna delle dimensioni possibili, incluse le variabili e gli
6476!! attributi con i loro diversi tipi,
6477!! è definito un cosiddetto "vettore di descrittori", con un
6478!! numero di elementi pari all'estensione della dimensione stessa,
6479!! che contiene le informazioni necessarie a descrivere
6480!! gli elementi di quella dimensione.
6481!! In realtà l'utente non dovrà generalmente occuparsi di costruire
6482!! un oggetto vol7d con le proprie mani ma utilizzerà nella maggior parte
6483!! dei casi i metodi di importazione preconfezionati che importano dati da
6484!! DB-All.e (vol7d_dballe_class) o dal DB Oracle del SIM (vol7d_oraclesim_class).
6485!!
6486!!
6487!! Il programma esempio_v7d.f90 contiene un esempio elementare di uso
6488!! della classe vol7d:
6489!! \include esempio_v7d.f90
6490!!
6491!! \ingroup vol7d
6499USE io_units
6506IMPLICIT NONE
6507
6508
6509INTEGER, PARAMETER :: vol7d_maxdim_a = 3, vol7d_maxdim_aa = 4, &
6510 vol7d_maxdim_d = 6, vol7d_maxdim_ad = 7
6511
6512INTEGER, PARAMETER :: vol7d_ana_a=1 !< indice della dimensione "anagrafica" nei volumi di anagrafica, da usare nei metodi vol7d_get_volana*
6513INTEGER, PARAMETER :: vol7d_var_a=2 !< indice della dimensione "variabile" nei volumi di anagrafica, da usare nei metodi vol7d_get_volana*
6514INTEGER, PARAMETER :: vol7d_network_a=3 !< indice della dimensione "rete" nei volumi di anagrafica, da usare nei metodi vol7d_get_volana*
6515INTEGER, PARAMETER :: vol7d_attr_a=4 !< indice della dimensione "attributo" nei volumi di anagrafica, da usare nei metodi vol7d_get_volana*
6516INTEGER, PARAMETER :: vol7d_ana_d=1 !< indice della dimensione "anagrafica" nei volumi di dati, da usare nei metodi vol7d_get_voldati*
6517INTEGER, PARAMETER :: vol7d_time_d=2 !< indice della dimensione "tempo" nei volumi di dati, da usare nei metodi vol7d_get_voldati*
6518INTEGER, PARAMETER :: vol7d_level_d=3 !< indice della dimensione "livello verticale" nei volumi di dati, da usare nei metodi vol7d_get_voldati*
6519INTEGER, PARAMETER :: vol7d_timerange_d=4 !< indice della dimensione "intervallo temporale" nei volumi di dati, da usare nei metodi vol7d_get_voldati*
6520INTEGER, PARAMETER :: vol7d_var_d=5 !< indice della dimensione "variabile" nei volumi di dati, da usare nei metodi vol7d_get_voldati*
6521INTEGER, PARAMETER :: vol7d_network_d=6 !< indice della dimensione "rete" nei volumi di dati, da usare nei metodi vol7d_get_voldati*
6522INTEGER, PARAMETER :: vol7d_attr_d=7 !< indice della dimensione "attributo" nei volumi di dati, da usare nei metodi vol7d_get_voldati*
6523INTEGER, PARAMETER :: vol7d_cdatalen=32
6524
6525TYPE vol7d_varmap
6526 INTEGER :: r, d, i, b, c
6527END TYPE vol7d_varmap
6528
6529!> Definisce un oggetto contenente i volumi anagrafica e dati e tutti
6530!! i descrittori delle loro dimensioni.
6532!> vettore descrittore della dimensione anagrafica
6533 TYPE(vol7d_ana),POINTER :: ana(:)
6534!> vettore descrittore della dimensione tempo
6535 TYPE(datetime),POINTER :: time(:)
6536!> vettore descrittore della dimensione livello verticale
6537 TYPE(vol7d_level),POINTER :: level(:)
6538!> vettore descrittore della dimensione intervallo temporale (timerange)
6539 TYPE(vol7d_timerange),POINTER :: timerange(:)
6540!> vettore descrittore della dimensione rete
6541 TYPE(vol7d_network),POINTER :: network(:)
6542!> vettore descrittore della dimensione variabile di anagrafica
6543 TYPE(vol7d_varvect) :: anavar
6544!> vettore descrittore della dimensione attributo delle variabili di anagrafica
6545 TYPE(vol7d_varvect) :: anaattr
6546!> vettore descrittore della dimensione variabile di anagrafica che ha tali attributi
6547 TYPE(vol7d_varvect) :: anavarattr
6548!> vettore descrittore della dimensione variabile di dati
6549 TYPE(vol7d_varvect) :: dativar
6550!> vettore descrittore della dimensione attributo delle variabili di dati
6551 TYPE(vol7d_varvect) :: datiattr
6552!> vettore descrittore della dimensione variabile di dati che ha tali attributi
6553 TYPE(vol7d_varvect) :: dativarattr
6554
6555!> volume di anagrafica a valori reali
6556 REAL,POINTER :: volanar(:,:,:)
6557!> volume di anagrafica a valori a doppia precisione
6558 DOUBLE PRECISION,POINTER :: volanad(:,:,:)
6559!> volume di anagrafica a valori interi
6560 INTEGER,POINTER :: volanai(:,:,:)
6561!> volume di anagrafica a valori byte
6562 INTEGER(kind=int_b),POINTER :: volanab(:,:,:)
6563!> volume di anagrafica a valori carattere
6564 CHARACTER(len=vol7d_cdatalen),POINTER :: volanac(:,:,:)
6565
6566!> volume di attributi di anagrafica a valori reali
6567 REAL,POINTER :: volanaattrr(:,:,:,:)
6568!> volume di attributi di anagrafica a valori a doppia precisione
6569 DOUBLE PRECISION,POINTER :: volanaattrd(:,:,:,:)
6570!> volume di attributi di anagrafica a valori interi
6571 INTEGER,POINTER :: volanaattri(:,:,:,:)
6572!> volume di attributi di anagrafica a valori byte
6573 INTEGER(kind=int_b),POINTER :: volanaattrb(:,:,:,:)
6574!> volume di attributi di anagrafica a valori carattere
6575 CHARACTER(len=vol7d_cdatalen),POINTER :: volanaattrc(:,:,:,:)
6576
6577!> volume di dati a valori reali
6578 REAL,POINTER :: voldatir(:,:,:,:,:,:) ! sono i dati
6579!> volume di dati a valori a doppia precisione
6580 DOUBLE PRECISION,POINTER :: voldatid(:,:,:,:,:,:)
6581!> volume di dati a valori interi
6582 INTEGER,POINTER :: voldatii(:,:,:,:,:,:)
6583!> volume di dati a valori byte
6584 INTEGER(kind=int_b),POINTER :: voldatib(:,:,:,:,:,:)
6585!> volume di dati a valori carattere
6586 CHARACTER(len=vol7d_cdatalen),POINTER :: voldatic(:,:,:,:,:,:)
6587
6588!> volume di attributi di dati a valori reali
6589 REAL,POINTER :: voldatiattrr(:,:,:,:,:,:,:)
6590!> volume di attributi di dati a valori a doppia precisione
6591 DOUBLE PRECISION,POINTER :: voldatiattrd(:,:,:,:,:,:,:)
6592!> volume di attributi di dati a valori interi
6593 INTEGER,POINTER :: voldatiattri(:,:,:,:,:,:,:)
6594!> volume di attributi di dati a valori byte
6595 INTEGER(kind=int_b),POINTER :: voldatiattrb(:,:,:,:,:,:,:)
6596!> volume di attributi di dati a valori carattere
6597 CHARACTER(len=vol7d_cdatalen),POINTER :: voldatiattrc(:,:,:,:,:,:,:)
6598
6599!> time definition; 0=time is reference time, 1=time is validity time
6600 integer :: time_definition
6601
6603
6604!> Costruttore per la classe vol7d.
6605!! Deve essere richiamato
6606!! per tutti gli oggetti di questo tipo definiti in un programma.
6608 MODULE PROCEDURE vol7d_init
6609END INTERFACE
6610
6611!> Distruttore per la classe vol7d.
6613 MODULE PROCEDURE vol7d_delete
6614END INTERFACE
6615
6616!> Scrittura su file.
6618 MODULE PROCEDURE vol7d_write_on_file
6619END INTERFACE
6620
6621!> Lettura da file.
6622INTERFACE import
6623 MODULE PROCEDURE vol7d_read_from_file
6624END INTERFACE
6625
6626!>Print object
6628 MODULE PROCEDURE vol7d_display, dat_display, dat_vect_display
6629END INTERFACE
6630
6631!>Represent data in a pretty string
6633 MODULE PROCEDURE to_char_dat
6634END INTERFACE
6635
6636!>doubleprecision data conversion
6638 MODULE PROCEDURE doubledatd,doubledatr,doubledati,doubledatb,doubledatc
6639END INTERFACE
6640
6641!>real data conversion
6643 MODULE PROCEDURE realdatd,realdatr,realdati,realdatb,realdatc
6644END INTERFACE
6645
6646!>integer data conversion
6648 MODULE PROCEDURE integerdatd,integerdatr,integerdati,integerdatb,integerdatc
6649END INTERFACE
6650
6651!>copy object
6653 MODULE PROCEDURE vol7d_copy
6654END INTERFACE
6655
6656!> Test for a missing volume
6658 MODULE PROCEDURE vol7d_c_e
6659END INTERFACE
6660
6661!> Check for problems
6662!! return 0 if all check passed
6663!! print diagnostics with log4f
6665 MODULE PROCEDURE vol7d_check
6666END INTERFACE
6667
6668!> Reduce some dimensions (level and timerage) for semplification (rounding).
6669!! You can use this for simplify and use variables in computation like alchimia
6670!! where fields have to be on the same coordinate
6671!! It return real or character data only: if input is charcter data only it return character otherwise il return
6672!! all the data converted to real.
6673!! examples:
6674!! means in time for short periods and istantaneous values
6675!! 2 meter and surface levels
6676!! If there are data on more then one almost equal levels or timeranges, the first var present (at least one point)
6677!! will be taken (order is by icreasing var index).
6678!! You can use predefined values for classic semplification
6679!! almost_equal_levels and almost_equal_timeranges
6680!! The level or timerange in output will be defined by the first element of level and timerange list
6682 MODULE PROCEDURE v7d_rounding
6683END INTERFACE
6684
6685!!$INTERFACE get_volana
6686!!$ MODULE PROCEDURE vol7d_get_volanar, vol7d_get_volanad, vol7d_get_volanai, &
6687!!$ vol7d_get_volanab, vol7d_get_volanac
6688!!$END INTERFACE
6689!!$
6690!!$INTERFACE get_voldati
6691!!$ MODULE PROCEDURE vol7d_get_voldatir, vol7d_get_voldatid, vol7d_get_voldatii, &
6692!!$ vol7d_get_voldatib, vol7d_get_voldatic
6693!!$END INTERFACE
6694!!$
6695!!$INTERFACE get_volanaattr
6696!!$ MODULE PROCEDURE vol7d_get_volanaattrr, vol7d_get_volanaattrd, &
6697!!$ vol7d_get_volanaattri, vol7d_get_volanaattrb, vol7d_get_volanaattrc
6698!!$END INTERFACE
6699!!$
6700!!$INTERFACE get_voldatiattr
6701!!$ MODULE PROCEDURE vol7d_get_voldatiattrr, vol7d_get_voldatiattrd, &
6702!!$ vol7d_get_voldatiattri, vol7d_get_voldatiattrb, vol7d_get_voldatiattrc
6703!!$END INTERFACE
6704
6705PRIVATE vol7d_get_volr, vol7d_get_vold, vol7d_get_voli, vol7d_get_volb, &
6706 vol7d_get_volc, &
6707 volptr1dr, volptr2dr, volptr3dr, volptr4dr, volptr5dr, volptr6dr, volptr7dr, &
6708 volptr1dd, volptr2dd, volptr3dd, volptr4dd, volptr5dd, volptr6dd, volptr7dd, &
6709 volptr1di, volptr2di, volptr3di, volptr4di, volptr5di, volptr6di, volptr7di, &
6710 volptr1db, volptr2db, volptr3db, volptr4db, volptr5db, volptr6db, volptr7db, &
6711 volptr1dc, volptr2dc, volptr3dc, volptr4dc, volptr5dc, volptr6dc, volptr7dc, &
6712 vol7d_nullifyr, vol7d_nullifyd, vol7d_nullifyi, vol7d_nullifyb, vol7d_nullifyc, &
6713 vol7d_init, vol7d_delete, vol7d_write_on_file, vol7d_read_from_file, &
6714 vol7d_check_alloc_ana, vol7d_force_alloc_ana, &
6715 vol7d_check_alloc_dati, vol7d_force_alloc_dati, vol7d_force_alloc, &
6716 vol7d_display, dat_display, dat_vect_display, &
6717 to_char_dat, vol7d_check
6718
6719PRIVATE doubledatd,doubledatr,doubledati,doubledatb,doubledatc
6720
6721PRIVATE vol7d_c_e
6722
6723CONTAINS
6724
6725
6726!> Inizializza un oggetto di tipo vol7d.
6727!! Non riceve alcun parametro tranne l'oggetto stesso. Attenzione, è necessario
6728!! comunque chiamare sempre il costruttore per evitare di avere dei puntatori in
6729!! uno stato indefinito.
6730SUBROUTINE vol7d_init(this,time_definition)
6731TYPE(vol7d),intent(out) :: this !< oggetto da inizializzare
6732INTEGER,INTENT(IN),OPTIONAL :: time_definition !< 0=time is reference time; 1=time is validity time; 2=time is validity time, forecast range forced to 0 (default=1)
6733
6740
6741NULLIFY(this%ana, this%time, this%level, this%timerange, this%network)
6742
6743NULLIFY(this%volanar, this%volanaattrr, this%voldatir, this%voldatiattrr)
6744NULLIFY(this%volanad, this%volanaattrd, this%voldatid, this%voldatiattrd)
6745NULLIFY(this%volanai, this%volanaattri, this%voldatii, this%voldatiattri)
6746NULLIFY(this%volanab, this%volanaattrb, this%voldatib, this%voldatiattrb)
6747NULLIFY(this%volanac, this%volanaattrc, this%voldatic, this%voldatiattrc)
6748
6749if(present(time_definition)) then
6750 this%time_definition=time_definition
6751else
6752 this%time_definition=1 !default to validity time
6753end if
6754
6755END SUBROUTINE vol7d_init
6756
6757
6758!> Distrugge l'oggetto in maniera pulita, liberando l'eventuale memoria
6759!! dinamicamente allocata. Permette di distruggere la sola parte di dati
6760!! mantenendo l'anagrafica.
6761ELEMENTAL SUBROUTINE vol7d_delete(this, dataonly)
6762TYPE(vol7d),intent(inout) :: this !< oggetto da distruggere
6763LOGICAL, INTENT(in), OPTIONAL :: dataonly !< dealloca solo i dati, tenendo l'anagrafica, (default \c .FALSE.)
6764
6765
6766IF (.NOT. optio_log(dataonly)) THEN
6767 IF (ASSOCIATED(this%volanar)) DEALLOCATE(this%volanar)
6768 IF (ASSOCIATED(this%volanad)) DEALLOCATE(this%volanad)
6769 IF (ASSOCIATED(this%volanai)) DEALLOCATE(this%volanai)
6770 IF (ASSOCIATED(this%volanab)) DEALLOCATE(this%volanab)
6771 IF (ASSOCIATED(this%volanac)) DEALLOCATE(this%volanac)
6772 IF (ASSOCIATED(this%volanaattrr)) DEALLOCATE(this%volanaattrr)
6773 IF (ASSOCIATED(this%volanaattrd)) DEALLOCATE(this%volanaattrd)
6774 IF (ASSOCIATED(this%volanaattri)) DEALLOCATE(this%volanaattri)
6775 IF (ASSOCIATED(this%volanaattrb)) DEALLOCATE(this%volanaattrb)
6776 IF (ASSOCIATED(this%volanaattrc)) DEALLOCATE(this%volanaattrc)
6777ENDIF
6778IF (ASSOCIATED(this%voldatir)) DEALLOCATE(this%voldatir)
6779IF (ASSOCIATED(this%voldatid)) DEALLOCATE(this%voldatid)
6780IF (ASSOCIATED(this%voldatii)) DEALLOCATE(this%voldatii)
6781IF (ASSOCIATED(this%voldatib)) DEALLOCATE(this%voldatib)
6782IF (ASSOCIATED(this%voldatic)) DEALLOCATE(this%voldatic)
6783IF (ASSOCIATED(this%voldatiattrr)) DEALLOCATE(this%voldatiattrr)
6784IF (ASSOCIATED(this%voldatiattrd)) DEALLOCATE(this%voldatiattrd)
6785IF (ASSOCIATED(this%voldatiattri)) DEALLOCATE(this%voldatiattri)
6786IF (ASSOCIATED(this%voldatiattrb)) DEALLOCATE(this%voldatiattrb)
6787IF (ASSOCIATED(this%voldatiattrc)) DEALLOCATE(this%voldatiattrc)
6788
6789IF (.NOT. optio_log(dataonly)) THEN
6790 IF (ASSOCIATED(this%ana)) DEALLOCATE(this%ana)
6791 IF (ASSOCIATED(this%network)) DEALLOCATE(this%network)
6792ENDIF
6793IF (ASSOCIATED(this%time)) DEALLOCATE(this%time)
6794IF (ASSOCIATED(this%level)) DEALLOCATE(this%level)
6795IF (ASSOCIATED(this%timerange)) DEALLOCATE(this%timerange)
6796
6797IF (.NOT. optio_log(dataonly)) THEN
6801ENDIF
6805
6806END SUBROUTINE vol7d_delete
6807
6808
6809
6810integer function vol7d_check(this)
6811TYPE(vol7d),intent(in) :: this !< object to check
6812integer :: i,j,k,l,m,n
6813
6814vol7d_check=0
6815
6816if (associated(this%voldatii)) then
6817do i = 1,size(this%voldatii,1)
6818 do j = 1,size(this%voldatii,2)
6819 do k = 1,size(this%voldatii,3)
6820 do l = 1,size(this%voldatii,4)
6821 do m = 1,size(this%voldatii,5)
6822 do n = 1,size(this%voldatii,6)
6823 if (this%voldatii(i,j,k,l,m,n) /= this%voldatii(i,j,k,l,m,n) ) then
6824 CALL l4f_log(l4f_warn,"check: abnormal value at voldatii("&
6826 vol7d_check=1
6827 end if
6828 end do
6829 end do
6830 end do
6831 end do
6832 end do
6833end do
6834end if
6835
6836
6837if (associated(this%voldatir)) then
6838do i = 1,size(this%voldatir,1)
6839 do j = 1,size(this%voldatir,2)
6840 do k = 1,size(this%voldatir,3)
6841 do l = 1,size(this%voldatir,4)
6842 do m = 1,size(this%voldatir,5)
6843 do n = 1,size(this%voldatir,6)
6844 if (this%voldatir(i,j,k,l,m,n) /= this%voldatir(i,j,k,l,m,n) ) then
6845 CALL l4f_log(l4f_warn,"check: abnormal value at voldatir("&
6847 vol7d_check=2
6848 end if
6849 end do
6850 end do
6851 end do
6852 end do
6853 end do
6854end do
6855end if
6856
6857if (associated(this%voldatid)) then
6858do i = 1,size(this%voldatid,1)
6859 do j = 1,size(this%voldatid,2)
6860 do k = 1,size(this%voldatid,3)
6861 do l = 1,size(this%voldatid,4)
6862 do m = 1,size(this%voldatid,5)
6863 do n = 1,size(this%voldatid,6)
6864 if (this%voldatid(i,j,k,l,m,n) /= this%voldatid(i,j,k,l,m,n) ) then
6865 CALL l4f_log(l4f_warn,"check: abnormal value at voldatid("&
6867 vol7d_check=3
6868 end if
6869 end do
6870 end do
6871 end do
6872 end do
6873 end do
6874end do
6875end if
6876
6877if (associated(this%voldatib)) then
6878do i = 1,size(this%voldatib,1)
6879 do j = 1,size(this%voldatib,2)
6880 do k = 1,size(this%voldatib,3)
6881 do l = 1,size(this%voldatib,4)
6882 do m = 1,size(this%voldatib,5)
6883 do n = 1,size(this%voldatib,6)
6884 if (this%voldatib(i,j,k,l,m,n) /= this%voldatib(i,j,k,l,m,n) ) then
6885 CALL l4f_log(l4f_warn,"check: abnormal value at voldatib("&
6887 vol7d_check=4
6888 end if
6889 end do
6890 end do
6891 end do
6892 end do
6893 end do
6894end do
6895end if
6896
6897end function vol7d_check
6898
6899
6900
6901!TODO da completare ! aborta se i volumi sono allocati a dimensione 0
6902!> stampa a video una sintesi del contenuto
6903SUBROUTINE vol7d_display(this)
6904TYPE(vol7d),intent(in) :: this !< oggetto da visualizzare
6905integer :: i
6906
6907REAL :: rdat
6908DOUBLE PRECISION :: ddat
6909INTEGER :: idat
6910INTEGER(kind=int_b) :: bdat
6911CHARACTER(len=vol7d_cdatalen) :: cdat
6912
6913
6914print*,"<<<<<<<<<<<<<<<<<<< vol7d object >>>>>>>>>>>>>>>>>>>>"
6915if (this%time_definition == 0) then
6916 print*,"TIME DEFINITION: time is reference time"
6917else if (this%time_definition == 1) then
6918 print*,"TIME DEFINITION: time is validity time"
6919else if (this%time_definition == 2) then
6920 print*,"TIME DEFINITION: time is validity time, forecast range forced to 0"
6921else
6922 print*,"Time definition has a wrong walue:", this%time_definition
6923end if
6924
6925IF (ASSOCIATED(this%network))then
6926 print*,"---- network vector ----"
6927 print*,"elements=",size(this%network)
6928 do i=1, size(this%network)
6930 end do
6931end IF
6932
6933IF (ASSOCIATED(this%ana))then
6934 print*,"---- ana vector ----"
6935 print*,"elements=",size(this%ana)
6936 do i=1, size(this%ana)
6938 end do
6939end IF
6940
6941IF (ASSOCIATED(this%time))then
6942 print*,"---- time vector ----"
6943 print*,"elements=",size(this%time)
6944 do i=1, size(this%time)
6946 end do
6947end if
6948
6949IF (ASSOCIATED(this%level)) then
6950 print*,"---- level vector ----"
6951 print*,"elements=",size(this%level)
6952 do i =1,size(this%level)
6954 end do
6955end if
6956
6957IF (ASSOCIATED(this%timerange))then
6958 print*,"---- timerange vector ----"
6959 print*,"elements=",size(this%timerange)
6960 do i =1,size(this%timerange)
6962 end do
6963end if
6964
6965
6966print*,"---- ana vector ----"
6967print*,""
6968print*,"->>>>>>>>> anavar -"
6970print*,""
6971print*,"->>>>>>>>> anaattr -"
6973print*,""
6974print*,"->>>>>>>>> anavarattr -"
6976
6977print*,"-- ana data section (first point) --"
6978
6979idat=imiss
6980rdat=rmiss
6981ddat=dmiss
6982bdat=ibmiss
6983cdat=cmiss
6984
6985!ntime = MIN(SIZE(this%time),nprint)
6986!ntimerange = MIN(SIZE(this%timerange),nprint)
6987!nlevel = MIN(SIZE(this%level),nprint)
6988!nnetwork = MIN(SIZE(this%network),nprint)
6989!nana = MIN(SIZE(this%ana),nprint)
6990
6991IF (SIZE(this%ana) > 0 .AND. SIZE(this%network) > 0) THEN
6992if (associated(this%volanai)) then
6993 do i=1,size(this%anavar%i)
6994 idat=this%volanai(1,i,1)
6996 end do
6997end if
6998idat=imiss
6999
7000if (associated(this%volanar)) then
7001 do i=1,size(this%anavar%r)
7002 rdat=this%volanar(1,i,1)
7004 end do
7005end if
7006rdat=rmiss
7007
7008if (associated(this%volanad)) then
7009 do i=1,size(this%anavar%d)
7010 ddat=this%volanad(1,i,1)
7012 end do
7013end if
7014ddat=dmiss
7015
7016if (associated(this%volanab)) then
7017 do i=1,size(this%anavar%b)
7018 bdat=this%volanab(1,i,1)
7020 end do
7021end if
7022bdat=ibmiss
7023
7024if (associated(this%volanac)) then
7025 do i=1,size(this%anavar%c)
7026 cdat=this%volanac(1,i,1)
7028 end do
7029end if
7030cdat=cmiss
7031ENDIF
7032
7033print*,"---- data vector ----"
7034print*,""
7035print*,"->>>>>>>>> dativar -"
7037print*,""
7038print*,"->>>>>>>>> datiattr -"
7040print*,""
7041print*,"->>>>>>>>> dativarattr -"
7043
7044print*,"-- data data section (first point) --"
7045
7046idat=imiss
7047rdat=rmiss
7048ddat=dmiss
7049bdat=ibmiss
7050cdat=cmiss
7051
7052IF (SIZE(this%ana) > 0 .AND. SIZE(this%network) > 0 .AND. size(this%time) > 0 &
7053 .AND. size(this%level) > 0 .AND. size(this%timerange) > 0) THEN
7054if (associated(this%voldatii)) then
7055 do i=1,size(this%dativar%i)
7056 idat=this%voldatii(1,1,1,1,i,1)
7058 end do
7059end if
7060idat=imiss
7061
7062if (associated(this%voldatir)) then
7063 do i=1,size(this%dativar%r)
7064 rdat=this%voldatir(1,1,1,1,i,1)
7066 end do
7067end if
7068rdat=rmiss
7069
7070if (associated(this%voldatid)) then
7071 do i=1,size(this%dativar%d)
7072 ddat=this%voldatid(1,1,1,1,i,1)
7074 end do
7075end if
7076ddat=dmiss
7077
7078if (associated(this%voldatib)) then
7079 do i=1,size(this%dativar%b)
7080 bdat=this%voldatib(1,1,1,1,i,1)
7082 end do
7083end if
7084bdat=ibmiss
7085
7086if (associated(this%voldatic)) then
7087 do i=1,size(this%dativar%c)
7088 cdat=this%voldatic(1,1,1,1,i,1)
7090 end do
7091end if
7092cdat=cmiss
7093ENDIF
7094
7095print*,"<<<<<<<<<<<<<<<<<<< END vol7d object >>>>>>>>>>>>>>>>>>>>"
7096
7097END SUBROUTINE vol7d_display
7098
7099
7100!> stampa a video una sintesi del contenuto
7101SUBROUTINE dat_display(this,idat,rdat,ddat,bdat,cdat)
7102TYPE(vol7d_var),intent(in) :: this !< oggetto da visualizzare
7103!> real
7104REAL :: rdat
7105!> double precision
7106DOUBLE PRECISION :: ddat
7107!> integer
7108INTEGER :: idat
7109!> byte
7110INTEGER(kind=int_b) :: bdat
7111!> character
7112CHARACTER(len=*) :: cdat
7113
7114print *, to_char_dat(this,idat,rdat,ddat,bdat,cdat)
7115
7116end SUBROUTINE dat_display
7117
7118!> stampa a video una sintesi del contenuto
7119SUBROUTINE dat_vect_display(this,idat,rdat,ddat,bdat,cdat)
7120
7121TYPE(vol7d_var),intent(in) :: this(:) !< oggetto da visualizzare
7122!> real
7123REAL :: rdat(:)
7124!> double precision
7125DOUBLE PRECISION :: ddat(:)
7126!> integer
7127INTEGER :: idat(:)
7128!> byte
7129INTEGER(kind=int_b) :: bdat(:)
7130!> character
7131CHARACTER(len=*):: cdat(:)
7132
7133integer :: i
7134
7135do i =1,size(this)
7137end do
7138
7139end SUBROUTINE dat_vect_display
7140
7141
7142FUNCTION to_char_dat(this,idat,rdat,ddat,bdat,cdat)
7143#ifdef HAVE_DBALLE
7144USE dballef
7145#endif
7146TYPE(vol7d_var),INTENT(in) :: this
7147!> real
7148REAL :: rdat
7149!> double precision
7150DOUBLE PRECISION :: ddat
7151!> integer
7152INTEGER :: idat
7153!> byte
7154INTEGER(kind=int_b) :: bdat
7155!> character
7156CHARACTER(len=*) :: cdat
7157CHARACTER(len=80) :: to_char_dat
7158
7159CHARACTER(len=LEN(to_char_dat)) :: to_char_tmp
7160
7161
7162#ifdef HAVE_DBALLE
7163INTEGER :: handle, ier
7164
7165handle = 0
7166to_char_dat="VALUE: "
7167
7172
7174 ier = idba_messaggi(handle,"/dev/null", "w", "BUFR")
7175 ier = idba_spiegab(handle,this%btable,cdat,to_char_tmp)
7176 ier = idba_fatto(handle)
7177 to_char_dat=trim(to_char_dat)//" ;char> "//trim(to_char_tmp)
7178endif
7179
7180#else
7181
7182to_char_dat="VALUE: "
7188
7189#endif
7190
7191END FUNCTION to_char_dat
7192
7193
7194!> Tests whether anything has ever been assigned to a vol7d object
7195!! (.TRUE.) or it is as clean as after an init (.FALSE.).
7196FUNCTION vol7d_c_e(this) RESULT(c_e)
7197TYPE(vol7d), INTENT(in) :: this
7198
7199LOGICAL :: c_e
7200
7202 ASSOCIATED(this%level) .OR. ASSOCIATED(this%timerange) .OR. &
7203 ASSOCIATED(this%network) .OR. &
7204 ASSOCIATED(this%anavar%r) .OR. ASSOCIATED(this%anavar%d) .OR. &
7205 ASSOCIATED(this%anavar%i) .OR. ASSOCIATED(this%anavar%b) .OR. &
7206 ASSOCIATED(this%anavar%c) .OR. &
7207 ASSOCIATED(this%anaattr%r) .OR. ASSOCIATED(this%anaattr%d) .OR. &
7208 ASSOCIATED(this%anaattr%i) .OR. ASSOCIATED(this%anaattr%b) .OR. &
7209 ASSOCIATED(this%anaattr%c) .OR. &
7210 ASSOCIATED(this%dativar%r) .OR. ASSOCIATED(this%dativar%d) .OR. &
7211 ASSOCIATED(this%dativar%i) .OR. ASSOCIATED(this%dativar%b) .OR. &
7212 ASSOCIATED(this%dativar%c) .OR. &
7213 ASSOCIATED(this%datiattr%r) .OR. ASSOCIATED(this%datiattr%d) .OR. &
7214 ASSOCIATED(this%datiattr%i) .OR. ASSOCIATED(this%datiattr%b) .OR. &
7215 ASSOCIATED(this%datiattr%c)
7216
7217END FUNCTION vol7d_c_e
7218
7219
7220!> Metodo per allocare i descrittori delle 7 dimensioni.
7221!! Riceve un grande numero di parametri opzionali che
7222!! indicano quali descrittori allocare e con quale estensione;
7223!! i descrittori non specificati non vengono toccati.
7224!! Può essere quindi chiamato più volte allocando via via
7225!! descrittori relativi a dimensioni diverse.
7226!! Se un descrittore richiesto è già allocato, viene deallocato
7227!! (perdendone l'eventuale contenuto) e riallocato con l'estensione
7228!! richiesta.
7229!! Per i descrittori relativi a dimensioni che non siano variabili o attributi,
7230!! è possibile specificare l'estensione di una dimensione a 0,
7231!! in tal caso il descrittore viene comunque allocato con lunghezza nulla,
7232!! che è diverso da non allocarlo. Per i descrittori di variabili e attributi
7233!! passare un'estensione 0 equivale a non fornire il parametro.
7234!! Avere uno o più descrittori dimensionati con estensione nulla fa sì
7235!! che anche il volume dati successivamente allocato abbia estensione nulla;
7236!! sebbene ciò appaia inutile, un volume del genere può in realtà servire,
7237!! in associazione ai metodi ::vol7d_merge o ::vol7d_append per estendere
7238!! un volume esistente aggiungendo elementi in alcune dimensioni (quelle
7239!! a estensione non nulla, ovviamente) e mantenendo invariato tutto il resto.
7240!! Per quanto riguarda i descrittori delle dimensioni relative alle
7241!! variabili, la relativa estensione è specificata con la nomenclatura
7242!! \a n<x><y><z> dove <x> può valere:
7243!! - \a ana per variabili relative a voumi di anagrafica
7244!! - \a dati per variabili relative a voumi di dati
7245!!
7246!! <y> può valere:
7247!! - \a var per variabili
7248!! - \a attr per attributi
7249!! - \a varattr variabili aventi attributi nei volumi di attributi
7250!!
7251!! <z> può valere:
7252!! - \a r per variabili o attributi a valori reali
7253!! - \a d per variabili o attributi a valori a doppia precisione
7254!! - \a i per variabili o attributi a valori interi
7255!! - \a b per variabili o attributi a valori byte
7256!! - \a c per variabili o attributi a valori carattere
7257!!
7258SUBROUTINE vol7d_alloc(this, nana, ntime, nlevel, ntimerange, nnetwork, &
7259 nanavarr, nanavard, nanavari, nanavarb, nanavarc, &
7260 nanaattrr, nanaattrd, nanaattri, nanaattrb, nanaattrc, &
7261 nanavarattrr, nanavarattrd, nanavarattri, nanavarattrb, nanavarattrc, &
7262 ndativarr, ndativard, ndativari, ndativarb, ndativarc, &
7263 ndatiattrr, ndatiattrd, ndatiattri, ndatiattrb, ndatiattrc, &
7264 ndativarattrr, ndativarattrd, ndativarattri, ndativarattrb, ndativarattrc, &
7265 ini)
7266TYPE(vol7d),INTENT(inout) :: this !< oggetto di cui allocare i descrittori
7267INTEGER,INTENT(in),OPTIONAL :: nana !< estensione della dimensione anagrafica
7268INTEGER,INTENT(in),OPTIONAL :: ntime !< estensione della dimensione tempo
7269INTEGER,INTENT(in),OPTIONAL :: nlevel !< estensione della dimensione livello varticale
7270INTEGER,INTENT(in),OPTIONAL :: ntimerange !< estensione della dimensione intervallo temporale (timerange)
7271INTEGER,INTENT(in),OPTIONAL :: nnetwork !< estensione della dimensione rete
7272!> estensione delle possibili dimensioni variabile
7273INTEGER,INTENT(in),OPTIONAL :: &
7274 nanavarr, nanavard, nanavari, nanavarb, nanavarc, &
7275 nanaattrr, nanaattrd, nanaattri, nanaattrb, nanaattrc, &
7276 nanavarattrr, nanavarattrd, nanavarattri, nanavarattrb, nanavarattrc, &
7277 ndativarr, ndativard, ndativari, ndativarb, ndativarc, &
7278 ndatiattrr, ndatiattrd, ndatiattri, ndatiattrb, ndatiattrc, &
7279 ndativarattrr, ndativarattrd, ndativarattri, ndativarattrb, ndativarattrc
7280LOGICAL,INTENT(in),OPTIONAL :: ini !< se fornito e vale \c .TRUE., viene chiamato il costruttore, senza parametri opzionali, per ogni elemento di tutti i descrittori allocati, inizializzandolo quindi a valore mancante
7281
7282INTEGER :: i
7283LOGICAL :: linit
7284
7285IF (PRESENT(ini)) THEN
7286 linit = ini
7287ELSE
7288 linit = .false.
7289ENDIF
7290
7291! Dimensioni principali
7292IF (PRESENT(nana)) THEN
7293 IF (nana >= 0) THEN
7294 IF (ASSOCIATED(this%ana)) DEALLOCATE(this%ana)
7295 ALLOCATE(this%ana(nana))
7296 IF (linit) THEN
7297 DO i = 1, nana
7299 ENDDO
7300 ENDIF
7301 ENDIF
7302ENDIF
7303IF (PRESENT(ntime)) THEN
7304 IF (ntime >= 0) THEN
7305 IF (ASSOCIATED(this%time)) DEALLOCATE(this%time)
7306 ALLOCATE(this%time(ntime))
7307 IF (linit) THEN
7308 DO i = 1, ntime
7310 ENDDO
7311 ENDIF
7312 ENDIF
7313ENDIF
7314IF (PRESENT(nlevel)) THEN
7315 IF (nlevel >= 0) THEN
7316 IF (ASSOCIATED(this%level)) DEALLOCATE(this%level)
7317 ALLOCATE(this%level(nlevel))
7318 IF (linit) THEN
7319 DO i = 1, nlevel
7321 ENDDO
7322 ENDIF
7323 ENDIF
7324ENDIF
7325IF (PRESENT(ntimerange)) THEN
7326 IF (ntimerange >= 0) THEN
7327 IF (ASSOCIATED(this%timerange)) DEALLOCATE(this%timerange)
7328 ALLOCATE(this%timerange(ntimerange))
7329 IF (linit) THEN
7330 DO i = 1, ntimerange
7332 ENDDO
7333 ENDIF
7334 ENDIF
7335ENDIF
7336IF (PRESENT(nnetwork)) THEN
7337 IF (nnetwork >= 0) THEN
7338 IF (ASSOCIATED(this%network)) DEALLOCATE(this%network)
7339 ALLOCATE(this%network(nnetwork))
7340 IF (linit) THEN
7341 DO i = 1, nnetwork
7343 ENDDO
7344 ENDIF
7345 ENDIF
7346ENDIF
7347! Dimensioni dei tipi delle variabili
7348CALL vol7d_varvect_alloc(this%anavar, nanavarr, nanavard, &
7349 nanavari, nanavarb, nanavarc, ini)
7350CALL vol7d_varvect_alloc(this%anaattr, nanaattrr, nanaattrd, &
7351 nanaattri, nanaattrb, nanaattrc, ini)
7352CALL vol7d_varvect_alloc(this%anavarattr, nanavarattrr, nanavarattrd, &
7353 nanavarattri, nanavarattrb, nanavarattrc, ini)
7354CALL vol7d_varvect_alloc(this%dativar, ndativarr, ndativard, &
7355 ndativari, ndativarb, ndativarc, ini)
7356CALL vol7d_varvect_alloc(this%datiattr, ndatiattrr, ndatiattrd, &
7357 ndatiattri, ndatiattrb, ndatiattrc, ini)
7358CALL vol7d_varvect_alloc(this%dativarattr, ndativarattrr, ndativarattrd, &
7359 ndativarattri, ndativarattrb, ndativarattrc, ini)
7360
7361END SUBROUTINE vol7d_alloc
7362
7363
7364FUNCTION vol7d_check_alloc_ana(this)
7365TYPE(vol7d),INTENT(in) :: this
7366LOGICAL :: vol7d_check_alloc_ana
7367
7368vol7d_check_alloc_ana = ASSOCIATED(this%ana) .AND. ASSOCIATED(this%network)
7369
7370END FUNCTION vol7d_check_alloc_ana
7371
7372SUBROUTINE vol7d_force_alloc_ana(this, ini)
7373TYPE(vol7d),INTENT(inout) :: this
7374LOGICAL,INTENT(in),OPTIONAL :: ini
7375
7376! Alloco i descrittori minimi per avere un volume di anagrafica
7377IF (.NOT. ASSOCIATED(this%ana)) CALL vol7d_alloc(this, nana=1, ini=ini)
7378IF (.NOT. ASSOCIATED(this%network)) CALL vol7d_alloc(this, nnetwork=1, ini=ini)
7379
7380END SUBROUTINE vol7d_force_alloc_ana
7381
7382
7383FUNCTION vol7d_check_alloc_dati(this)
7384TYPE(vol7d),INTENT(in) :: this
7385LOGICAL :: vol7d_check_alloc_dati
7386
7387vol7d_check_alloc_dati = vol7d_check_alloc_ana(this) .AND. &
7388 ASSOCIATED(this%time) .AND. ASSOCIATED(this%level) .AND. &
7389 ASSOCIATED(this%timerange)
7390
7391END FUNCTION vol7d_check_alloc_dati
7392
7393SUBROUTINE vol7d_force_alloc_dati(this, ini)
7394TYPE(vol7d),INTENT(inout) :: this
7395LOGICAL,INTENT(in),OPTIONAL :: ini
7396
7397! Alloco i descrittori minimi per avere un volume di dati
7398CALL vol7d_force_alloc_ana(this, ini)
7399IF (.NOT. ASSOCIATED(this%time)) CALL vol7d_alloc(this, ntime=1, ini=ini)
7400IF (.NOT. ASSOCIATED(this%level)) CALL vol7d_alloc(this, nlevel=1, ini=ini)
7401IF (.NOT. ASSOCIATED(this%timerange)) CALL vol7d_alloc(this, ntimerange=1, ini=ini)
7402
7403END SUBROUTINE vol7d_force_alloc_dati
7404
7405
7406SUBROUTINE vol7d_force_alloc(this)
7407TYPE(vol7d),INTENT(inout) :: this
7408
7409! If anything really not allocated yet, allocate with size 0
7410IF (.NOT. ASSOCIATED(this%ana)) CALL vol7d_alloc(this, nana=0)
7411IF (.NOT. ASSOCIATED(this%network)) CALL vol7d_alloc(this, nnetwork=0)
7412IF (.NOT. ASSOCIATED(this%time)) CALL vol7d_alloc(this, ntime=0)
7413IF (.NOT. ASSOCIATED(this%level)) CALL vol7d_alloc(this, nlevel=0)
7414IF (.NOT. ASSOCIATED(this%timerange)) CALL vol7d_alloc(this, ntimerange=0)
7415
7416END SUBROUTINE vol7d_force_alloc
7417
7418
7419FUNCTION vol7d_check_vol(this)
7420TYPE(vol7d),INTENT(in) :: this !< oggetto da controllare
7421LOGICAL :: vol7d_check_vol
7422
7423vol7d_check_vol = c_e(this)
7424
7425! Anagrafica
7426IF (ASSOCIATED(this%anavar%r) .AND. .NOT.ASSOCIATED(this%volanar)) THEN
7427 vol7d_check_vol = .false.
7428ENDIF
7429
7430IF (ASSOCIATED(this%anavar%d) .AND. .NOT.ASSOCIATED(this%volanad)) THEN
7431 vol7d_check_vol = .false.
7432ENDIF
7433
7434IF (ASSOCIATED(this%anavar%i) .AND. .NOT.ASSOCIATED(this%volanai)) THEN
7435 vol7d_check_vol = .false.
7436ENDIF
7437
7438IF (ASSOCIATED(this%anavar%b) .AND. .NOT.ASSOCIATED(this%volanab)) THEN
7439 vol7d_check_vol = .false.
7440ENDIF
7441
7442IF (ASSOCIATED(this%anavar%c) .AND. .NOT.ASSOCIATED(this%volanac)) THEN
7443 vol7d_check_vol = .false.
7444ENDIF
7445IF (ASSOCIATED(this%anavar%r) .OR. ASSOCIATED(this%anavar%d) .OR. &
7446 ASSOCIATED(this%anavar%i) .OR. ASSOCIATED(this%anavar%b) .OR. &
7447 ASSOCIATED(this%anavar%c)) THEN
7448 vol7d_check_vol = vol7d_check_vol .AND. vol7d_check_alloc_ana(this)
7449ENDIF
7450
7451! Attributi dell'anagrafica
7452IF (ASSOCIATED(this%anaattr%r) .AND. ASSOCIATED(this%anavarattr%r) .AND. &
7453 .NOT.ASSOCIATED(this%volanaattrr)) THEN
7454 vol7d_check_vol = .false.
7455ENDIF
7456
7457IF (ASSOCIATED(this%anaattr%d) .AND. ASSOCIATED(this%anavarattr%d) .AND. &
7458 .NOT.ASSOCIATED(this%volanaattrd)) THEN
7459 vol7d_check_vol = .false.
7460ENDIF
7461
7462IF (ASSOCIATED(this%anaattr%i) .AND. ASSOCIATED(this%anavarattr%i) .AND. &
7463 .NOT.ASSOCIATED(this%volanaattri)) THEN
7464 vol7d_check_vol = .false.
7465ENDIF
7466
7467IF (ASSOCIATED(this%anaattr%b) .AND. ASSOCIATED(this%anavarattr%b) .AND. &
7468 .NOT.ASSOCIATED(this%volanaattrb)) THEN
7469 vol7d_check_vol = .false.
7470ENDIF
7471
7472IF (ASSOCIATED(this%anaattr%c) .AND. ASSOCIATED(this%anavarattr%c) .AND. &
7473 .NOT.ASSOCIATED(this%volanaattrc)) THEN
7474 vol7d_check_vol = .false.
7475ENDIF
7476
7477! Dati
7478IF (ASSOCIATED(this%dativar%r) .AND. .NOT.ASSOCIATED(this%voldatir)) THEN
7479 vol7d_check_vol = .false.
7480ENDIF
7481
7482IF (ASSOCIATED(this%dativar%d) .AND. .NOT.ASSOCIATED(this%voldatid)) THEN
7483 vol7d_check_vol = .false.
7484ENDIF
7485
7486IF (ASSOCIATED(this%dativar%i) .AND. .NOT.ASSOCIATED(this%voldatii)) THEN
7487 vol7d_check_vol = .false.
7488ENDIF
7489
7490IF (ASSOCIATED(this%dativar%b) .AND. .NOT.ASSOCIATED(this%voldatib)) THEN
7491 vol7d_check_vol = .false.
7492ENDIF
7493
7494IF (ASSOCIATED(this%dativar%c) .AND. .NOT.ASSOCIATED(this%voldatic)) THEN
7495 vol7d_check_vol = .false.
7496ENDIF
7497
7498! Attributi dei dati
7499IF (ASSOCIATED(this%datiattr%r) .AND. ASSOCIATED(this%dativarattr%r) .AND. &
7500 .NOT.ASSOCIATED(this%voldatiattrr)) THEN
7501 vol7d_check_vol = .false.
7502ENDIF
7503
7504IF (ASSOCIATED(this%datiattr%d) .AND. ASSOCIATED(this%dativarattr%d) .AND. &
7505 .NOT.ASSOCIATED(this%voldatiattrd)) THEN
7506 vol7d_check_vol = .false.
7507ENDIF
7508
7509IF (ASSOCIATED(this%datiattr%i) .AND. ASSOCIATED(this%dativarattr%i) .AND. &
7510 .NOT.ASSOCIATED(this%voldatiattri)) THEN
7511 vol7d_check_vol = .false.
7512ENDIF
7513
7514IF (ASSOCIATED(this%datiattr%b) .AND. ASSOCIATED(this%dativarattr%b) .AND. &
7515 .NOT.ASSOCIATED(this%voldatiattrb)) THEN
7516 vol7d_check_vol = .false.
7517ENDIF
7518
7519IF (ASSOCIATED(this%datiattr%c) .AND. ASSOCIATED(this%dativarattr%c) .AND. &
7520 .NOT.ASSOCIATED(this%voldatiattrc)) THEN
7521 vol7d_check_vol = .false.
7522ENDIF
7523IF (ASSOCIATED(this%dativar%r) .OR. ASSOCIATED(this%dativar%d) .OR. &
7524 ASSOCIATED(this%dativar%i) .OR. ASSOCIATED(this%dativar%b) .OR. &
7525 ASSOCIATED(this%dativar%c)) THEN
7526 vol7d_check_vol = vol7d_check_vol .AND. vol7d_check_alloc_dati(this)
7527ENDIF
7528
7529END FUNCTION vol7d_check_vol
7530
7531
7532!> Metodo per allocare i volumi richiesti di variabili e attributi per
7533!! anagrafica e dati.
7534!! Se alcuni dei descrittori relativi alle dimensioni anagrafica,
7535!! livello verticale, tempo, intervallo temporale (timerange), rete non sono
7536!! stati richiesti preventivamente con la ::vol7d_alloc, essi vengono allocati
7537!! automaticamente da questo metodo
7538!! con estensione di default pari a 1 (non 0!), questo significa, ad esempio,
7539!! che se prevedo di avere soli dati superficiali, cioè ad un solo livello
7540!! verticale, o una sola rete di stazioni, non devo preoccuparmi di
7541!! specificare questa informazione.
7542!! Tra i 20 possibili volumi allocabili
7543!! ((variabili,attributi)*(anagrafica,dati)*(r,d,i,b,c)=20)
7544!! saranno allocati solo quelli per cui è stato precedentemente richiesto il
7545!! corrispondente descrittore variabili/attributi con la ::vol7d_alloc.
7546SUBROUTINE vol7d_alloc_vol(this, ini, inivol)
7547TYPE(vol7d),INTENT(inout) :: this !< oggetto di cui allocare i volumi
7548LOGICAL,INTENT(in),OPTIONAL :: ini !< se fornito e vale \c .TRUE., viene chiamato il costruttore, senza parametri opzionali, per ogni elemento di tutti i descrittori allocati
7549LOGICAL,INTENT(in),OPTIONAL :: inivol !< se fornito e vale \c .TRUE., i volumi allocati saranno inizializzati a valore mancante
7550
7551LOGICAL :: linivol
7552
7553IF (PRESENT(inivol)) THEN
7554 linivol = inivol
7555ELSE
7556 linivol = .true.
7557ENDIF
7558
7559! Anagrafica
7560IF (ASSOCIATED(this%anavar%r) .AND. .NOT.ASSOCIATED(this%volanar)) THEN
7561 CALL vol7d_force_alloc_ana(this, ini)
7562 ALLOCATE(this%volanar(SIZE(this%ana), SIZE(this%anavar%r), SIZE(this%network)))
7563 IF (linivol) this%volanar(:,:,:) = rmiss
7564ENDIF
7565
7566IF (ASSOCIATED(this%anavar%d) .AND. .NOT.ASSOCIATED(this%volanad)) THEN
7567 CALL vol7d_force_alloc_ana(this, ini)
7568 ALLOCATE(this%volanad(SIZE(this%ana), SIZE(this%anavar%d), SIZE(this%network)))
7569 IF (linivol) this%volanad(:,:,:) = rdmiss
7570ENDIF
7571
7572IF (ASSOCIATED(this%anavar%i) .AND. .NOT.ASSOCIATED(this%volanai)) THEN
7573 CALL vol7d_force_alloc_ana(this, ini)
7574 ALLOCATE(this%volanai(SIZE(this%ana), SIZE(this%anavar%i), SIZE(this%network)))
7575 IF (linivol) this%volanai(:,:,:) = imiss
7576ENDIF
7577
7578IF (ASSOCIATED(this%anavar%b) .AND. .NOT.ASSOCIATED(this%volanab)) THEN
7579 CALL vol7d_force_alloc_ana(this, ini)
7580 ALLOCATE(this%volanab(SIZE(this%ana), SIZE(this%anavar%b), SIZE(this%network)))
7581 IF (linivol) this%volanab(:,:,:) = ibmiss
7582ENDIF
7583
7584IF (ASSOCIATED(this%anavar%c) .AND. .NOT.ASSOCIATED(this%volanac)) THEN
7585 CALL vol7d_force_alloc_ana(this, ini)
7586 ALLOCATE(this%volanac(SIZE(this%ana), SIZE(this%anavar%c), SIZE(this%network)))
7587 IF (linivol) this%volanac(:,:,:) = cmiss
7588ENDIF
7589
7590! Attributi dell'anagrafica
7591IF (ASSOCIATED(this%anaattr%r) .AND. ASSOCIATED(this%anavarattr%r) .AND. &
7592 .NOT.ASSOCIATED(this%volanaattrr)) THEN
7593 CALL vol7d_force_alloc_ana(this, ini)
7594 ALLOCATE(this%volanaattrr(SIZE(this%ana), SIZE(this%anavarattr%r), &
7595 SIZE(this%network), SIZE(this%anaattr%r)))
7596 IF (linivol) this%volanaattrr(:,:,:,:) = rmiss
7597ENDIF
7598
7599IF (ASSOCIATED(this%anaattr%d) .AND. ASSOCIATED(this%anavarattr%d) .AND. &
7600 .NOT.ASSOCIATED(this%volanaattrd)) THEN
7601 CALL vol7d_force_alloc_ana(this, ini)
7602 ALLOCATE(this%volanaattrd(SIZE(this%ana), SIZE(this%anavarattr%d), &
7603 SIZE(this%network), SIZE(this%anaattr%d)))
7604 IF (linivol) this%volanaattrd(:,:,:,:) = rdmiss
7605ENDIF
7606
7607IF (ASSOCIATED(this%anaattr%i) .AND. ASSOCIATED(this%anavarattr%i) .AND. &
7608 .NOT.ASSOCIATED(this%volanaattri)) THEN
7609 CALL vol7d_force_alloc_ana(this, ini)
7610 ALLOCATE(this%volanaattri(SIZE(this%ana), SIZE(this%anavarattr%i), &
7611 SIZE(this%network), SIZE(this%anaattr%i)))
7612 IF (linivol) this%volanaattri(:,:,:,:) = imiss
7613ENDIF
7614
7615IF (ASSOCIATED(this%anaattr%b) .AND. ASSOCIATED(this%anavarattr%b) .AND. &
7616 .NOT.ASSOCIATED(this%volanaattrb)) THEN
7617 CALL vol7d_force_alloc_ana(this, ini)
7618 ALLOCATE(this%volanaattrb(SIZE(this%ana), SIZE(this%anavarattr%b), &
7619 SIZE(this%network), SIZE(this%anaattr%b)))
7620 IF (linivol) this%volanaattrb(:,:,:,:) = ibmiss
7621ENDIF
7622
7623IF (ASSOCIATED(this%anaattr%c) .AND. ASSOCIATED(this%anavarattr%c) .AND. &
7624 .NOT.ASSOCIATED(this%volanaattrc)) THEN
7625 CALL vol7d_force_alloc_ana(this, ini)
7626 ALLOCATE(this%volanaattrc(SIZE(this%ana), SIZE(this%anavarattr%c), &
7627 SIZE(this%network), SIZE(this%anaattr%c)))
7628 IF (linivol) this%volanaattrc(:,:,:,:) = cmiss
7629ENDIF
7630
7631! Dati
7632IF (ASSOCIATED(this%dativar%r) .AND. .NOT.ASSOCIATED(this%voldatir)) THEN
7633 CALL vol7d_force_alloc_dati(this, ini)
7634 ALLOCATE(this%voldatir(SIZE(this%ana), SIZE(this%time), SIZE(this%level), &
7635 SIZE(this%timerange), SIZE(this%dativar%r), SIZE(this%network)))
7636 IF (linivol) this%voldatir(:,:,:,:,:,:) = rmiss
7637ENDIF
7638
7639IF (ASSOCIATED(this%dativar%d) .AND. .NOT.ASSOCIATED(this%voldatid)) THEN
7640 CALL vol7d_force_alloc_dati(this, ini)
7641 ALLOCATE(this%voldatid(SIZE(this%ana), SIZE(this%time), SIZE(this%level), &
7642 SIZE(this%timerange), SIZE(this%dativar%d), SIZE(this%network)))
7643 IF (linivol) this%voldatid(:,:,:,:,:,:) = rdmiss
7644ENDIF
7645
7646IF (ASSOCIATED(this%dativar%i) .AND. .NOT.ASSOCIATED(this%voldatii)) THEN
7647 CALL vol7d_force_alloc_dati(this, ini)
7648 ALLOCATE(this%voldatii(SIZE(this%ana), SIZE(this%time), SIZE(this%level), &
7649 SIZE(this%timerange), SIZE(this%dativar%i), SIZE(this%network)))
7650 IF (linivol) this%voldatii(:,:,:,:,:,:) = imiss
7651ENDIF
7652
7653IF (ASSOCIATED(this%dativar%b) .AND. .NOT.ASSOCIATED(this%voldatib)) THEN
7654 CALL vol7d_force_alloc_dati(this, ini)
7655 ALLOCATE(this%voldatib(SIZE(this%ana), SIZE(this%time), SIZE(this%level), &
7656 SIZE(this%timerange), SIZE(this%dativar%b), SIZE(this%network)))
7657 IF (linivol) this%voldatib(:,:,:,:,:,:) = ibmiss
7658ENDIF
7659
7660IF (ASSOCIATED(this%dativar%c) .AND. .NOT.ASSOCIATED(this%voldatic)) THEN
7661 CALL vol7d_force_alloc_dati(this, ini)
7662 ALLOCATE(this%voldatic(SIZE(this%ana), SIZE(this%time), SIZE(this%level), &
7663 SIZE(this%timerange), SIZE(this%dativar%c), SIZE(this%network)))
7664 IF (linivol) this%voldatic(:,:,:,:,:,:) = cmiss
7665ENDIF
7666
7667! Attributi dei dati
7668IF (ASSOCIATED(this%datiattr%r) .AND. ASSOCIATED(this%dativarattr%r) .AND. &
7669 .NOT.ASSOCIATED(this%voldatiattrr)) THEN
7670 CALL vol7d_force_alloc_dati(this, ini)
7671 ALLOCATE(this%voldatiattrr(SIZE(this%ana), SIZE(this%time), SIZE(this%level), &
7672 SIZE(this%timerange), SIZE(this%dativarattr%r), SIZE(this%network), &
7673 SIZE(this%datiattr%r)))
7674 IF (linivol) this%voldatiattrr(:,:,:,:,:,:,:) = rmiss
7675ENDIF
7676
7677IF (ASSOCIATED(this%datiattr%d) .AND. ASSOCIATED(this%dativarattr%d) .AND. &
7678 .NOT.ASSOCIATED(this%voldatiattrd)) THEN
7679 CALL vol7d_force_alloc_dati(this, ini)
7680 ALLOCATE(this%voldatiattrd(SIZE(this%ana), SIZE(this%time), SIZE(this%level), &
7681 SIZE(this%timerange), SIZE(this%dativarattr%d), SIZE(this%network), &
7682 SIZE(this%datiattr%d)))
7683 IF (linivol) this%voldatiattrd(:,:,:,:,:,:,:) = rdmiss
7684ENDIF
7685
7686IF (ASSOCIATED(this%datiattr%i) .AND. ASSOCIATED(this%dativarattr%i) .AND. &
7687 .NOT.ASSOCIATED(this%voldatiattri)) THEN
7688 CALL vol7d_force_alloc_dati(this, ini)
7689 ALLOCATE(this%voldatiattri(SIZE(this%ana), SIZE(this%time), SIZE(this%level), &
7690 SIZE(this%timerange), SIZE(this%dativarattr%i), SIZE(this%network), &
7691 SIZE(this%datiattr%i)))
7692 IF (linivol) this%voldatiattri(:,:,:,:,:,:,:) = imiss
7693ENDIF
7694
7695IF (ASSOCIATED(this%datiattr%b) .AND. ASSOCIATED(this%dativarattr%b) .AND. &
7696 .NOT.ASSOCIATED(this%voldatiattrb)) THEN
7697 CALL vol7d_force_alloc_dati(this, ini)
7698 ALLOCATE(this%voldatiattrb(SIZE(this%ana), SIZE(this%time), SIZE(this%level), &
7699 SIZE(this%timerange), SIZE(this%dativarattr%b), SIZE(this%network), &
7700 SIZE(this%datiattr%b)))
7701 IF (linivol) this%voldatiattrb(:,:,:,:,:,:,:) = ibmiss
7702ENDIF
7703
7704IF (ASSOCIATED(this%datiattr%c) .AND. ASSOCIATED(this%dativarattr%c) .AND. &
7705 .NOT.ASSOCIATED(this%voldatiattrc)) THEN
7706 CALL vol7d_force_alloc_dati(this, ini)
7707 ALLOCATE(this%voldatiattrc(SIZE(this%ana), SIZE(this%time), SIZE(this%level), &
7708 SIZE(this%timerange), SIZE(this%dativarattr%c), SIZE(this%network), &
7709 SIZE(this%datiattr%c)))
7710 IF (linivol) this%voldatiattrc(:,:,:,:,:,:,:) = cmiss
7711ENDIF
7712
7713! Catch-all method
7714CALL vol7d_force_alloc(this)
7715
7716! Creo gli indici var-attr
7717
7718#ifdef DEBUG
7719CALL l4f_log(l4f_debug,"calling: vol7d_set_attr_ind")
7720#endif
7721
7722CALL vol7d_set_attr_ind(this)
7723
7724
7725
7726END SUBROUTINE vol7d_alloc_vol
7727
7728
7729!> Metodo per creare gli indici che associano le variabili aventi attributo
7730!! alle variabili nei relativi descrittori.
7731!! Ha senso chiamare questo metodo solo dopo che i descrittori delle variabili
7732!! e degli attributi desiderati sono stati allocati ed è stato assegnato un
7733!! valore ai relativi membri btable (vedi vol7d_var_class::vol7d_var), se
7734!! i descrittori non sono stati allocati o assegnati, il metodo non fa niente.
7735SUBROUTINE vol7d_set_attr_ind(this)
7736TYPE(vol7d),INTENT(inout) :: this !< oggetto in cui creare gli indici
7737
7738INTEGER :: i
7739
7740! real
7741IF (ASSOCIATED(this%dativar%r)) THEN
7742 IF (ASSOCIATED(this%dativarattr%r)) THEN
7743 DO i = 1, SIZE(this%dativar%r)
7744 this%dativar%r(i)%r = &
7745 firsttrue(this%dativar%r(i)%btable == this%dativarattr%r(:)%btable)
7746 ENDDO
7747 ENDIF
7748
7749 IF (ASSOCIATED(this%dativarattr%d)) THEN
7750 DO i = 1, SIZE(this%dativar%r)
7751 this%dativar%r(i)%d = &
7752 firsttrue(this%dativar%r(i)%btable == this%dativarattr%d(:)%btable)
7753 ENDDO
7754 ENDIF
7755
7756 IF (ASSOCIATED(this%dativarattr%i)) THEN
7757 DO i = 1, SIZE(this%dativar%r)
7758 this%dativar%r(i)%i = &
7759 firsttrue(this%dativar%r(i)%btable == this%dativarattr%i(:)%btable)
7760 ENDDO
7761 ENDIF
7762
7763 IF (ASSOCIATED(this%dativarattr%b)) THEN
7764 DO i = 1, SIZE(this%dativar%r)
7765 this%dativar%r(i)%b = &
7766 firsttrue(this%dativar%r(i)%btable == this%dativarattr%b(:)%btable)
7767 ENDDO
7768 ENDIF
7769
7770 IF (ASSOCIATED(this%dativarattr%c)) THEN
7771 DO i = 1, SIZE(this%dativar%r)
7772 this%dativar%r(i)%c = &
7773 firsttrue(this%dativar%r(i)%btable == this%dativarattr%c(:)%btable)
7774 ENDDO
7775 ENDIF
7776ENDIF
7777! double
7778IF (ASSOCIATED(this%dativar%d)) THEN
7779 IF (ASSOCIATED(this%dativarattr%r)) THEN
7780 DO i = 1, SIZE(this%dativar%d)
7781 this%dativar%d(i)%r = &
7782 firsttrue(this%dativar%d(i)%btable == this%dativarattr%r(:)%btable)
7783 ENDDO
7784 ENDIF
7785
7786 IF (ASSOCIATED(this%dativarattr%d)) THEN
7787 DO i = 1, SIZE(this%dativar%d)
7788 this%dativar%d(i)%d = &
7789 firsttrue(this%dativar%d(i)%btable == this%dativarattr%d(:)%btable)
7790 ENDDO
7791 ENDIF
7792
7793 IF (ASSOCIATED(this%dativarattr%i)) THEN
7794 DO i = 1, SIZE(this%dativar%d)
7795 this%dativar%d(i)%i = &
7796 firsttrue(this%dativar%d(i)%btable == this%dativarattr%i(:)%btable)
7797 ENDDO
7798 ENDIF
7799
7800 IF (ASSOCIATED(this%dativarattr%b)) THEN
7801 DO i = 1, SIZE(this%dativar%d)
7802 this%dativar%d(i)%b = &
7803 firsttrue(this%dativar%d(i)%btable == this%dativarattr%b(:)%btable)
7804 ENDDO
7805 ENDIF
7806
7807 IF (ASSOCIATED(this%dativarattr%c)) THEN
7808 DO i = 1, SIZE(this%dativar%d)
7809 this%dativar%d(i)%c = &
7810 firsttrue(this%dativar%d(i)%btable == this%dativarattr%c(:)%btable)
7811 ENDDO
7812 ENDIF
7813ENDIF
7814! integer
7815IF (ASSOCIATED(this%dativar%i)) THEN
7816 IF (ASSOCIATED(this%dativarattr%r)) THEN
7817 DO i = 1, SIZE(this%dativar%i)
7818 this%dativar%i(i)%r = &
7819 firsttrue(this%dativar%i(i)%btable == this%dativarattr%r(:)%btable)
7820 ENDDO
7821 ENDIF
7822
7823 IF (ASSOCIATED(this%dativarattr%d)) THEN
7824 DO i = 1, SIZE(this%dativar%i)
7825 this%dativar%i(i)%d = &
7826 firsttrue(this%dativar%i(i)%btable == this%dativarattr%d(:)%btable)
7827 ENDDO
7828 ENDIF
7829
7830 IF (ASSOCIATED(this%dativarattr%i)) THEN
7831 DO i = 1, SIZE(this%dativar%i)
7832 this%dativar%i(i)%i = &
7833 firsttrue(this%dativar%i(i)%btable == this%dativarattr%i(:)%btable)
7834 ENDDO
7835 ENDIF
7836
7837 IF (ASSOCIATED(this%dativarattr%b)) THEN
7838 DO i = 1, SIZE(this%dativar%i)
7839 this%dativar%i(i)%b = &
7840 firsttrue(this%dativar%i(i)%btable == this%dativarattr%b(:)%btable)
7841 ENDDO
7842 ENDIF
7843
7844 IF (ASSOCIATED(this%dativarattr%c)) THEN
7845 DO i = 1, SIZE(this%dativar%i)
7846 this%dativar%i(i)%c = &
7847 firsttrue(this%dativar%i(i)%btable == this%dativarattr%c(:)%btable)
7848 ENDDO
7849 ENDIF
7850ENDIF
7851! byte
7852IF (ASSOCIATED(this%dativar%b)) THEN
7853 IF (ASSOCIATED(this%dativarattr%r)) THEN
7854 DO i = 1, SIZE(this%dativar%b)
7855 this%dativar%b(i)%r = &
7856 firsttrue(this%dativar%b(i)%btable == this%dativarattr%r(:)%btable)
7857 ENDDO
7858 ENDIF
7859
7860 IF (ASSOCIATED(this%dativarattr%d)) THEN
7861 DO i = 1, SIZE(this%dativar%b)
7862 this%dativar%b(i)%d = &
7863 firsttrue(this%dativar%b(i)%btable == this%dativarattr%d(:)%btable)
7864 ENDDO
7865 ENDIF
7866
7867 IF (ASSOCIATED(this%dativarattr%i)) THEN
7868 DO i = 1, SIZE(this%dativar%b)
7869 this%dativar%b(i)%i = &
7870 firsttrue(this%dativar%b(i)%btable == this%dativarattr%i(:)%btable)
7871 ENDDO
7872 ENDIF
7873
7874 IF (ASSOCIATED(this%dativarattr%b)) THEN
7875 DO i = 1, SIZE(this%dativar%b)
7876 this%dativar%b(i)%b = &
7877 firsttrue(this%dativar%b(i)%btable == this%dativarattr%b(:)%btable)
7878 ENDDO
7879 ENDIF
7880
7881 IF (ASSOCIATED(this%dativarattr%c)) THEN
7882 DO i = 1, SIZE(this%dativar%b)
7883 this%dativar%b(i)%c = &
7884 firsttrue(this%dativar%b(i)%btable == this%dativarattr%c(:)%btable)
7885 ENDDO
7886 ENDIF
7887ENDIF
7888! character
7889IF (ASSOCIATED(this%dativar%c)) THEN
7890 IF (ASSOCIATED(this%dativarattr%r)) THEN
7891 DO i = 1, SIZE(this%dativar%c)
7892 this%dativar%c(i)%r = &
7893 firsttrue(this%dativar%c(i)%btable == this%dativarattr%r(:)%btable)
7894 ENDDO
7895 ENDIF
7896
7897 IF (ASSOCIATED(this%dativarattr%d)) THEN
7898 DO i = 1, SIZE(this%dativar%c)
7899 this%dativar%c(i)%d = &
7900 firsttrue(this%dativar%c(i)%btable == this%dativarattr%d(:)%btable)
7901 ENDDO
7902 ENDIF
7903
7904 IF (ASSOCIATED(this%dativarattr%i)) THEN
7905 DO i = 1, SIZE(this%dativar%c)
7906 this%dativar%c(i)%i = &
7907 firsttrue(this%dativar%c(i)%btable == this%dativarattr%i(:)%btable)
7908 ENDDO
7909 ENDIF
7910
7911 IF (ASSOCIATED(this%dativarattr%b)) THEN
7912 DO i = 1, SIZE(this%dativar%c)
7913 this%dativar%c(i)%b = &
7914 firsttrue(this%dativar%c(i)%btable == this%dativarattr%b(:)%btable)
7915 ENDDO
7916 ENDIF
7917
7918 IF (ASSOCIATED(this%dativarattr%c)) THEN
7919 DO i = 1, SIZE(this%dativar%c)
7920 this%dativar%c(i)%c = &
7921 firsttrue(this%dativar%c(i)%btable == this%dativarattr%c(:)%btable)
7922 ENDDO
7923 ENDIF
7924ENDIF
7925
7926END SUBROUTINE vol7d_set_attr_ind
7927
7928
7929!> Metodo per fondere 2 oggetti vol7d.
7930!! Il secondo volume viene accodato al primo e poi distrutto, si veda
7931!! quindi la descrizione di ::vol7d_append. Se uno degli oggetti \a
7932!! this o \a that sono vuoti non perde tempo inutile,
7933SUBROUTINE vol7d_merge(this, that, sort, bestdata, &
7934 ltimesimple, ltimerangesimple, llevelsimple, lanasimple)
7935TYPE(vol7d),INTENT(INOUT) :: this !< primo oggetto in ingresso, alla fine conterrà il risultato della fusione
7936TYPE(vol7d),INTENT(INOUT) :: that !< secondo oggetto in ingresso, alla fine sarà distrutto
7937LOGICAL,INTENT(IN),OPTIONAL :: sort !< se fornito e uguale a \c .TRUE., i descrittori che supportano un ordinamento (operatori > e/o <) risulteranno ordinati in ordine crescente nell'oggetto finale
7938LOGICAL,INTENT(in),OPTIONAL :: bestdata !< if provided and \a .TRUE. in case of overlapping volumes keep valid data where available, or data from the second volume if both valid
7939LOGICAL,INTENT(IN),OPTIONAL :: ltimesimple, ltimerangesimple, llevelsimple, lanasimple ! experimental, please do not use outside the library now
7940
7941TYPE(vol7d) :: v7d_clean
7942
7943
7945 this = that
7947 that = v7d_clean ! destroy that without deallocating
7948ELSE ! Append that to this and destroy that
7950 ltimesimple, ltimerangesimple, llevelsimple, lanasimple)
7952ENDIF
7953
7954END SUBROUTINE vol7d_merge
7955
7956
7957!> Metodo per accodare un oggetto vol7d ad un altro.
7958!! Si tratta di un metodo molto potente e versatile;
7959!! i descrittori delle dimensioni del volume finale conterranno i valori
7960!! dei corrispondenti descrittori del primo e del secondo volume
7961!! e i volumi di anagrafica e dati conterranno i valori dei due volumi
7962!! ai posti giusti, e valori mancanti per le nuove combinazioni che
7963!! eventualmente si verranno a creare.
7964!! Se i volumi multidimensionali di anagrafica e/o dati dei 2 oggetti
7965!! hanno un'intersezione non nulla, negli elementi comuni il volume finale
7966!! conterrà il corrispondente elemento del \b secondo volume.
7967!! Attenzione che, durante l'esecuzione del metodo, la memoria richiesta è
7968!! pari alla memoria complessiva occupata dai 2 volumi iniziali più
7969!! la memoria complessiva del volume finale, per cui, nel caso di volumi grandi,
7970!! ci potrebbero essere problemi di esaurimento della memoria centrale.
7971!! Se l'oggetto \a that è vuoto non perde tempo inutile,
7972!!
7973!! \todo nel caso di elementi comuni inserire la possibiità (opzionale per
7974!! non penalizzare le prestazioni quando ciò non serve) di effettuare una scelta
7975!! più ragionata dell'elemento da tenere, almeno controllando i dati mancanti
7976!! se non le flag di qualità
7977!!
7978!! \todo "rateizzare" l'allocazione dei volumi per ridurre l'occupazione di
7979!! memoria nel caso siano allocati contemporaneamente volumi di variabili e
7980!! di attributi o più volumi di tipi diversi
7981!!
7982!! \todo il parametro \a that è dichiarato \a INOUT perché la vol7d_alloc_vol
7983!! può modificarlo, bisognerebbe implementare una vol7d_check_vol che restituisca
7984!! errore anziché usare la vol7d_alloc_vol.
7985SUBROUTINE vol7d_append(this, that, sort, bestdata, &
7986 ltimesimple, ltimerangesimple, llevelsimple, lanasimple, lnetworksimple)
7987TYPE(vol7d),INTENT(INOUT) :: this !< primo oggetto in ingresso, a cui sarà accodato il secondo
7988TYPE(vol7d),INTENT(IN) :: that !< secondo oggetto in ingresso, non viene modificato dal metodo
7989LOGICAL,INTENT(IN),OPTIONAL :: sort !< se fornito e uguale a \c .TRUE., i descrittori che supportano un ordinamento (operatori > e/o <) risulteranno ordinati in ordine crescente nell'oggetto finale
7990! experimental, please do not use outside the library now, they force the use
7991! of a simplified mapping algorithm which is valid only whene the dimension
7992! content is the same in both volumes , or when one of them is empty
7993LOGICAL,INTENT(in),OPTIONAL :: bestdata !< if provided and \a .TRUE. in case of overlapping volumes keep valid data where available, or data from the second volume if both valid
7994LOGICAL,INTENT(IN),OPTIONAL :: ltimesimple, ltimerangesimple, llevelsimple, lanasimple, lnetworksimple
7995
7996
7997TYPE(vol7d) :: v7dtmp
7998LOGICAL :: lsort, lbestdata
7999INTEGER,POINTER :: remapt1(:), remapt2(:), remaptr1(:), remaptr2(:), &
8000 remapl1(:), remapl2(:), remapa1(:), remapa2(:), remapn1(:), remapn2(:)
8001
8003IF (.NOT.vol7d_check_vol(that)) RETURN ! be safe
8006 RETURN
8007ENDIF
8008
8009IF (this%time_definition /= that%time_definition) THEN
8010 CALL l4f_log(l4f_fatal, &
8011 'in vol7d_append, cannot append volumes with different &
8012 &time definition')
8013 CALL raise_fatal_error()
8014ENDIF
8015
8016! Completo l'allocazione per avere volumi a norma
8017CALL vol7d_alloc_vol(this)
8018
8022
8023! Calcolo le mappature tra volumi vecchi e volume nuovo
8024! I puntatori remap* vengono tutti o allocati o nullificati
8025IF (optio_log(ltimesimple)) THEN
8026 CALL vol7d_remap2simple_datetime(this%time, that%time, v7dtmp%time, &
8027 lsort, remapt1, remapt2)
8028ELSE
8029 CALL vol7d_remap2_datetime(this%time, that%time, v7dtmp%time, &
8030 lsort, remapt1, remapt2)
8031ENDIF
8032IF (optio_log(ltimerangesimple)) THEN
8033 CALL vol7d_remap2simple_vol7d_timerange(this%timerange, that%timerange, &
8034 v7dtmp%timerange, lsort, remaptr1, remaptr2)
8035ELSE
8036 CALL vol7d_remap2_vol7d_timerange(this%timerange, that%timerange, &
8037 v7dtmp%timerange, lsort, remaptr1, remaptr2)
8038ENDIF
8039IF (optio_log(llevelsimple)) THEN
8040 CALL vol7d_remap2simple_vol7d_level(this%level, that%level, v7dtmp%level, &
8041 lsort, remapl1, remapl2)
8042ELSE
8043 CALL vol7d_remap2_vol7d_level(this%level, that%level, v7dtmp%level, &
8044 lsort, remapl1, remapl2)
8045ENDIF
8046IF (optio_log(lanasimple)) THEN
8047 CALL vol7d_remap2simple_vol7d_ana(this%ana, that%ana, v7dtmp%ana, &
8048 .false., remapa1, remapa2)
8049ELSE
8050 CALL vol7d_remap2_vol7d_ana(this%ana, that%ana, v7dtmp%ana, &
8051 .false., remapa1, remapa2)
8052ENDIF
8053IF (optio_log(lnetworksimple)) THEN
8054 CALL vol7d_remap2simple_vol7d_network(this%network, that%network, v7dtmp%network, &
8055 .false., remapn1, remapn2)
8056ELSE
8057 CALL vol7d_remap2_vol7d_network(this%network, that%network, v7dtmp%network, &
8058 .false., remapn1, remapn2)
8059ENDIF
8060
8061! Faccio la fusione fisica dei volumi
8062CALL vol7d_merge_finalr(this, that, v7dtmp, &
8063 remapa1, remapa2, remapt1, remapt2, remapl1, remapl2, &
8064 remaptr1, remaptr2, remapn1, remapn2, lbestdata)
8065CALL vol7d_merge_finald(this, that, v7dtmp, &
8066 remapa1, remapa2, remapt1, remapt2, remapl1, remapl2, &
8067 remaptr1, remaptr2, remapn1, remapn2, lbestdata)
8068CALL vol7d_merge_finali(this, that, v7dtmp, &
8069 remapa1, remapa2, remapt1, remapt2, remapl1, remapl2, &
8070 remaptr1, remaptr2, remapn1, remapn2, lbestdata)
8071CALL vol7d_merge_finalb(this, that, v7dtmp, &
8072 remapa1, remapa2, remapt1, remapt2, remapl1, remapl2, &
8073 remaptr1, remaptr2, remapn1, remapn2, lbestdata)
8074CALL vol7d_merge_finalc(this, that, v7dtmp, &
8075 remapa1, remapa2, remapt1, remapt2, remapl1, remapl2, &
8076 remaptr1, remaptr2, remapn1, remapn2, lbestdata)
8077
8078! Dealloco i vettori di rimappatura
8079IF (ASSOCIATED(remapt1)) DEALLOCATE(remapt1)
8080IF (ASSOCIATED(remapt2)) DEALLOCATE(remapt2)
8081IF (ASSOCIATED(remaptr1)) DEALLOCATE(remaptr1)
8082IF (ASSOCIATED(remaptr2)) DEALLOCATE(remaptr2)
8083IF (ASSOCIATED(remapl1)) DEALLOCATE(remapl1)
8084IF (ASSOCIATED(remapl2)) DEALLOCATE(remapl2)
8085IF (ASSOCIATED(remapa1)) DEALLOCATE(remapa1)
8086IF (ASSOCIATED(remapa2)) DEALLOCATE(remapa2)
8087IF (ASSOCIATED(remapn1)) DEALLOCATE(remapn1)
8088IF (ASSOCIATED(remapn2)) DEALLOCATE(remapn2)
8089
8090! Distruggo il vecchio volume e assegno il nuovo a this
8092this = v7dtmp
8093! Ricreo gli indici var-attr
8094CALL vol7d_set_attr_ind(this)
8095
8096END SUBROUTINE vol7d_append
8097
8098
8099!> Metodo per creare una copia completa e indipendente di un oggetto vol7d.
8100!! Questo metodo crea un duplicato di tutti i membri di un oggetto vol7d,
8101!! con la possibilità di rielaborarlo durante la copia. Se l'oggetto da copiare
8102!! è vuoto non perde tempo inutile.
8103!! Attenzione, il codice:
8104!! \code
8105!! USE vol7d_class
8106!! TYPE(vol7d) :: vol1, vol2
8107!! CALL init(vol1)
8108!! CALL init(vol2)
8109!! ... ! riempio vol1
8110!! vol2 = vol1
8111!! \endcode
8112!! fa una cosa diversa rispetto a:
8113!! \code
8114!! USE vol7d_class
8115!! TYPE(vol7d) :: vol1, vol2
8116!! CALL init(vol1)
8117!! CALL init(vol2)
8118!! ... ! riempio vol1
8119!! CALL vol7d_copy(vol1, vol2)
8120!! \endcode
8121!! nel primo caso, infatti, l'operatore di assegnazione copia solo i componenti
8122!! statici di \a vol1 nei corrispondenti elementi di \a vol2, mentre i componenti che
8123!! sono allocati dinamicamente (cioè quelli che in ::vol7d hanno l'attributo
8124!! \c POINTER, in pratica quasi tutti) non vengono duplicati, ma per essi vol2
8125!! conterrà un puntatore al corrispondente elemento a cui già punta vol1, e quindi
8126!! eventuali cambiamenti al contenuto di uno dei due oggetti influenzerà il
8127!! contenuto dell'altro; nel secondo caso, invece, vol1 e vol2 sono, dopo la
8128!! vol7d_copy, 2 istanze
8129!! completamente indipendenti, ma uguali tra loro per contenuto, della classe
8130!! vol7d, e quindi hanno vita indipendente.
8131SUBROUTINE vol7d_copy(this, that, sort, unique, miss, &
8132 lsort_time, lsort_timerange, lsort_level, &
8133 ltime, ltimerange, llevel, lana, lnetwork, &
8134 lanavarr, lanavard, lanavari, lanavarb, lanavarc, &
8135 lanaattrr, lanaattrd, lanaattri, lanaattrb, lanaattrc, &
8136 lanavarattrr, lanavarattrd, lanavarattri, lanavarattrb, lanavarattrc, &
8137 ldativarr, ldativard, ldativari, ldativarb, ldativarc, &
8138 ldatiattrr, ldatiattrd, ldatiattri, ldatiattrb, ldatiattrc, &
8139 ldativarattrr, ldativarattrd, ldativarattri, ldativarattrb, ldativarattrc)
8140TYPE(vol7d),INTENT(IN) :: this !< oggetto origine
8141TYPE(vol7d),INTENT(INOUT) :: that !< oggetto destinazione
8142LOGICAL,INTENT(IN),OPTIONAL :: sort !< if present and \a .TRUE., sort all the sortable dimensions
8143LOGICAL,INTENT(IN),OPTIONAL :: unique !< se fornito e uguale a \c .TRUE., gli eventuali elementi duplicati nei descrittori dell'oggetto iniziale verranno collassati in un unico elemento (con eventuale perdita dei dati relativi agli elementi duplicati)
8144LOGICAL,INTENT(IN),OPTIONAL :: miss !< se fornito e uguale a \c .TRUE., gli eventuali elementi dei descrittori uguali al corrispondente valore mancante verranno eliminati dall'oggetto riformato
8145LOGICAL,INTENT(IN),OPTIONAL :: lsort_time !< if present and \a .TRUE., sort only time dimension (alternative to \a sort )
8146LOGICAL,INTENT(IN),OPTIONAL :: lsort_timerange !< if present and \a .TRUE., sort only timerange dimension (alternative to \a sort )
8147LOGICAL,INTENT(IN),OPTIONAL :: lsort_level !< if present and \a .TRUE., sort only level dimension (alternative to \a sort )
8148!> se fornito, deve essere un vettore logico della stessa lunghezza di
8149!! this%time indicante quali elementi della dimensione \a time
8150!! mantenere (valori \c .TRUE.) e quali scartare (valori \c .FALSE.)
8151!! nel volume copiato; in alternativa può essere un vettore di
8152!! lunghezza 1, in tal caso, se \c .FALSE. , equivale a scartare tutti
8153!! gli elementi (utile principalmente per le variabili); è compatibile
8154!! col parametro \a miss
8155LOGICAL,INTENT(IN),OPTIONAL :: ltime(:)
8156!> come il precedente per la dimensione \a timerange
8157LOGICAL,INTENT(IN),OPTIONAL :: ltimerange(:)
8158!> come il precedente per la dimensione \a level
8159LOGICAL,INTENT(IN),OPTIONAL :: llevel(:)
8160!> come il precedente per la dimensione \a ana
8161LOGICAL,INTENT(IN),OPTIONAL :: lana(:)
8162!> come il precedente per la dimensione \a network
8163LOGICAL,INTENT(IN),OPTIONAL :: lnetwork(:)
8164!> come il precedente per tutte le possibili dimensioni variabile
8165LOGICAL,INTENT(in),OPTIONAL :: &
8166 lanavarr(:), lanavard(:), lanavari(:), lanavarb(:), lanavarc(:), &
8167 lanaattrr(:), lanaattrd(:), lanaattri(:), lanaattrb(:), lanaattrc(:), &
8168 lanavarattrr(:), lanavarattrd(:), lanavarattri(:), lanavarattrb(:), lanavarattrc(:), &
8169 ldativarr(:), ldativard(:), ldativari(:), ldativarb(:), ldativarc(:), &
8170 ldatiattrr(:), ldatiattrd(:), ldatiattri(:), ldatiattrb(:), ldatiattrc(:), &
8171 ldativarattrr(:), ldativarattrd(:), ldativarattri(:), ldativarattrb(:), ldativarattrc(:)
8172
8173LOGICAL :: lsort, lunique, lmiss
8174INTEGER,POINTER :: remapt(:), remaptr(:), remapl(:), remapa(:), remapn(:)
8175
8178IF (.NOT.vol7d_check_vol(this)) RETURN ! be safe
8179
8183
8184! Calcolo le mappature tra volume vecchio e volume nuovo
8185! I puntatori remap* vengono tutti o allocati o nullificati
8186CALL vol7d_remap1_datetime(this%time, that%time, &
8187 lsort.OR.optio_log(lsort_time), lunique, lmiss, remapt, ltime)
8188CALL vol7d_remap1_vol7d_timerange(this%timerange, that%timerange, &
8189 lsort.OR.optio_log(lsort_timerange), lunique, lmiss, remaptr, ltimerange)
8190CALL vol7d_remap1_vol7d_level(this%level, that%level, &
8191 lsort.OR.optio_log(lsort_level), lunique, lmiss, remapl, llevel)
8192CALL vol7d_remap1_vol7d_ana(this%ana, that%ana, &
8193 lsort, lunique, lmiss, remapa, lana)
8194CALL vol7d_remap1_vol7d_network(this%network, that%network, &
8195 lsort, lunique, lmiss, remapn, lnetwork)
8196
8197! lanavari, lanavarb, lanavarc, &
8198! lanaattri, lanaattrb, lanaattrc, &
8199! lanavarattri, lanavarattrb, lanavarattrc, &
8200! ldativari, ldativarb, ldativarc, &
8201! ldatiattri, ldatiattrb, ldatiattrc, &
8202! ldativarattri, ldativarattrb, ldativarattrc
8203! Faccio la riforma fisica dei volumi
8204CALL vol7d_reform_finalr(this, that, &
8205 remapa, remapt, remapl, remaptr, remapn, lsort, lunique, lmiss, &
8206 lanavarr, lanaattrr, lanavarattrr, ldativarr, ldatiattrr, ldativarattrr)
8207CALL vol7d_reform_finald(this, that, &
8208 remapa, remapt, remapl, remaptr, remapn, lsort, lunique, lmiss, &
8209 lanavard, lanaattrd, lanavarattrd, ldativard, ldatiattrd, ldativarattrd)
8210CALL vol7d_reform_finali(this, that, &
8211 remapa, remapt, remapl, remaptr, remapn, lsort, lunique, lmiss, &
8212 lanavari, lanaattri, lanavarattri, ldativari, ldatiattri, ldativarattri)
8213CALL vol7d_reform_finalb(this, that, &
8214 remapa, remapt, remapl, remaptr, remapn, lsort, lunique, lmiss, &
8215 lanavarb, lanaattrb, lanavarattrb, ldativarb, ldatiattrb, ldativarattrb)
8216CALL vol7d_reform_finalc(this, that, &
8217 remapa, remapt, remapl, remaptr, remapn, lsort, lunique, lmiss, &
8218 lanavarc, lanaattrc, lanavarattrc, ldativarc, ldatiattrc, ldativarattrc)
8219
8220! Dealloco i vettori di rimappatura
8221IF (ASSOCIATED(remapt)) DEALLOCATE(remapt)
8222IF (ASSOCIATED(remaptr)) DEALLOCATE(remaptr)
8223IF (ASSOCIATED(remapl)) DEALLOCATE(remapl)
8224IF (ASSOCIATED(remapa)) DEALLOCATE(remapa)
8225IF (ASSOCIATED(remapn)) DEALLOCATE(remapn)
8226
8227! Ricreo gli indici var-attr
8228CALL vol7d_set_attr_ind(that)
8229that%time_definition = this%time_definition
8230
8231END SUBROUTINE vol7d_copy
8232
8233
8234!> Metodo per riformare in varie maniere un oggetto vol7d.
8235!! Equivale ad una copia (vedi ::vol7d_copy)
8236!! seguita dalla distruzione del volume iniziale e alla
8237!! sua riassegnazione al volume copiato. Ha senso se almeno uno dei parametri
8238!! \a sort, \a uniq o \a miss è fornito uguale a \c .TRUE., altrimenti
8239!! è solo una perdita di tempo.
8240!! Può essere utile, ad esempio, per eliminare stazioni
8241!! o istanti temporali indesiderati, basta assegnare il loro corrispondente
8242!! elemento del descrittore a valore mancante e chiamare vol7d_reform
8243!! con miss=.TRUE. .
8244SUBROUTINE vol7d_reform(this, sort, unique, miss, &
8245 lsort_time, lsort_timerange, lsort_level, &
8246 ltime, ltimerange, llevel, lana, lnetwork, &
8247 lanavarr, lanavard, lanavari, lanavarb, lanavarc, &
8248 lanaattrr, lanaattrd, lanaattri, lanaattrb, lanaattrc, &
8249 lanavarattrr, lanavarattrd, lanavarattri, lanavarattrb, lanavarattrc, &
8250 ldativarr, ldativard, ldativari, ldativarb, ldativarc, &
8251 ldatiattrr, ldatiattrd, ldatiattri, ldatiattrb, ldatiattrc, &
8252 ldativarattrr, ldativarattrd, ldativarattri, ldativarattrb, ldativarattrc&
8253 ,purgeana)
8254TYPE(vol7d),INTENT(INOUT) :: this !< oggetto da riformare
8255LOGICAL,INTENT(IN),OPTIONAL :: sort !< if present and \a .TRUE., sort all the sortable dimensions
8256LOGICAL,INTENT(IN),OPTIONAL :: unique !< se fornito e uguale a \c .TRUE., gli eventuali elementi duplicati nei descrittori dell'oggetto iniziale verranno collassati in un unico elemento (con eventuale perdita dei dati relativi agli elementi duplicati)
8257LOGICAL,INTENT(IN),OPTIONAL :: miss !< se fornito e uguale a \c .TRUE., gli eventuali elementi dei descrittori uguali al corrispondente valore mancante verranno eliminati dall'oggetto riformato
8258LOGICAL,INTENT(IN),OPTIONAL :: lsort_time !< if present and \a .TRUE., sort only time dimension (alternative to \a sort )
8259LOGICAL,INTENT(IN),OPTIONAL :: lsort_timerange !< if present and \a .TRUE., sort only timerange dimension (alternative to \a sort )
8260LOGICAL,INTENT(IN),OPTIONAL :: lsort_level !< if present and \a .TRUE., sort only level dimension (alternative to \a sort )
8261!> se fornito, deve essere un vettore logico della stessa lunghezza di
8262!! this%time indicante quali elementi della dimensione \a time
8263!! mantenere (valori \c .TRUE.) e quali scartare (valori \c .FALSE.)
8264!! nel volume copiato; in alternativa può essere un vettore di
8265!! lunghezza 1, in tal caso, se \c .FALSE. , equivale a scartare tutti
8266!! gli elementi (utile principalmente per le variabili); è compatibile
8267!! col parametro \a miss
8268LOGICAL,INTENT(IN),OPTIONAL :: ltime(:)
8269LOGICAL,INTENT(IN),OPTIONAL :: ltimerange(:) !< come il precedente per la dimensione \a timerange
8270LOGICAL,INTENT(IN),OPTIONAL :: llevel(:) !< come il precedente per la dimensione \a level
8271LOGICAL,INTENT(IN),OPTIONAL :: lana(:) !< come il precedente per la dimensione \a ana
8272LOGICAL,INTENT(IN),OPTIONAL :: lnetwork(:) !< come il precedente per la dimensione \a network
8273!> come il precedente per tutte le possibili dimensioni variabile
8274LOGICAL,INTENT(in),OPTIONAL :: &
8275 lanavarr(:), lanavard(:), lanavari(:), lanavarb(:), lanavarc(:), &
8276 lanaattrr(:), lanaattrd(:), lanaattri(:), lanaattrb(:), lanaattrc(:), &
8277 lanavarattrr(:), lanavarattrd(:), lanavarattri(:), lanavarattrb(:), lanavarattrc(:), &
8278 ldativarr(:), ldativard(:), ldativari(:), ldativarb(:), ldativarc(:), &
8279 ldatiattrr(:), ldatiattrd(:), ldatiattri(:), ldatiattrb(:), ldatiattrc(:), &
8280 ldativarattrr(:), ldativarattrd(:), ldativarattri(:), ldativarattrb(:), ldativarattrc(:)
8281LOGICAL,INTENT(IN),OPTIONAL :: purgeana !< if true remove ana with all data missing
8282
8283TYPE(vol7d) :: v7dtmp
8284logical,allocatable :: llana(:)
8285integer :: i
8286
8288 lsort_time, lsort_timerange, lsort_level, &
8289 ltime, ltimerange, llevel, lana, lnetwork, &
8290 lanavarr, lanavard, lanavari, lanavarb, lanavarc, &
8291 lanaattrr, lanaattrd, lanaattri, lanaattrb, lanaattrc, &
8292 lanavarattrr, lanavarattrd, lanavarattri, lanavarattrb, lanavarattrc, &
8293 ldativarr, ldativard, ldativari, ldativarb, ldativarc, &
8294 ldatiattrr, ldatiattrd, ldatiattri, ldatiattrb, ldatiattrc, &
8295 ldativarattrr, ldativarattrd, ldativarattri, ldativarattrb, ldativarattrc)
8296
8297! destroy old volume
8299
8300if (optio_log(purgeana)) then
8301 allocate(llana(size(v7dtmp%ana)))
8302 llana =.false.
8303 do i =1,size(v7dtmp%ana)
8304 if (associated(v7dtmp%voldatii)) llana(i)= llana(i) .or. any(c_e(v7dtmp%voldatii(i,:,:,:,:,:)))
8305 if (associated(v7dtmp%voldatir)) llana(i)= llana(i) .or. any(c_e(v7dtmp%voldatir(i,:,:,:,:,:)))
8306 if (associated(v7dtmp%voldatid)) llana(i)= llana(i) .or. any(c_e(v7dtmp%voldatid(i,:,:,:,:,:)))
8307 if (associated(v7dtmp%voldatib)) llana(i)= llana(i) .or. any(c_e(v7dtmp%voldatib(i,:,:,:,:,:)))
8308 if (associated(v7dtmp%voldatic)) llana(i)= llana(i) .or. any(c_e(v7dtmp%voldatic(i,:,:,:,:,:)))
8309 end do
8310 CALL vol7d_copy(v7dtmp, this,lana=llana)
8312 deallocate(llana)
8313else
8314 this=v7dtmp
8315end if
8316
8317END SUBROUTINE vol7d_reform
8318
8319
8320!> Sorts the sortable dimensions in the volume \a this only when necessary.
8321!! Most of the times, the time, timerange and level dimensions in a
8322!! vol7d object are correctly sorted; on the other side many methods
8323!! strictly rely on this fact in order to work correctly. This method
8324!! performs a quick check and sorts the required dimensions only if
8325!! they are not sorted in ascending order yet, improving safety
8326!! without impairing much performance.
8327SUBROUTINE vol7d_smart_sort(this, lsort_time, lsort_timerange, lsort_level)
8328TYPE(vol7d),INTENT(INOUT) :: this !< object to be sorted
8329LOGICAL,OPTIONAL,INTENT(in) :: lsort_time !< if present and \a .TRUE., sort time dimension if it is not sorted in ascending order
8330LOGICAL,OPTIONAL,INTENT(in) :: lsort_timerange !< if present and \a .TRUE., sort timerange dimension if it is not sorted in ascending order
8331LOGICAL,OPTIONAL,INTENT(in) :: lsort_level !< if present and \a .TRUE., sort vertical level dimension if it is not sorted in ascending order
8332
8333INTEGER :: i
8334LOGICAL :: to_be_sorted
8335
8336to_be_sorted = .false.
8337CALL vol7d_alloc_vol(this) ! usual safety check
8338
8339IF (optio_log(lsort_time)) THEN
8340 DO i = 2, SIZE(this%time)
8341 IF (this%time(i) < this%time(i-1)) THEN
8342 to_be_sorted = .true.
8343 EXIT
8344 ENDIF
8345 ENDDO
8346ENDIF
8347IF (optio_log(lsort_timerange)) THEN
8348 DO i = 2, SIZE(this%timerange)
8349 IF (this%timerange(i) < this%timerange(i-1)) THEN
8350 to_be_sorted = .true.
8351 EXIT
8352 ENDIF
8353 ENDDO
8354ENDIF
8355IF (optio_log(lsort_level)) THEN
8356 DO i = 2, SIZE(this%level)
8357 IF (this%level(i) < this%level(i-1)) THEN
8358 to_be_sorted = .true.
8359 EXIT
8360 ENDIF
8361 ENDDO
8362ENDIF
8363
8364IF (to_be_sorted) CALL vol7d_reform(this, &
8365 lsort_time=lsort_time, lsort_timerange=lsort_timerange, lsort_level=lsort_level )
8366
8367END SUBROUTINE vol7d_smart_sort
8368
8369!> Filter the contents of a volume keeping only desired data.
8370!! This subroutine filters a vol7d object by keeping only a subset of
8371!! the data contained. It can keep only times within a specified
8372!! interval, only station networks contained in a list and only
8373!! specified station or data variables. If a filter parameter is not
8374!! provided, no filtering will take place according to that criterion.
8375!! The volume is reallocated keeping only the desired data.
8376SUBROUTINE vol7d_filter(this, avl, vl, nl, s_d, e_d)
8377TYPE(vol7d),INTENT(inout) :: this !< volume to be filtered
8378CHARACTER(len=*),INTENT(in),OPTIONAL :: avl(:) !< list of station variables to be kept, if not provided or of zero length, all variables are kept
8379CHARACTER(len=*),INTENT(in),OPTIONAL :: vl(:) !< list of data variables to be kept, if not provided or of zero length, all variables are kept
8380TYPE(vol7d_network),OPTIONAL :: nl(:) !< list of station networks to be kept, if not provided or of zero length, all networks are kept
8381TYPE(datetime),INTENT(in),OPTIONAL :: s_d !< initial time interval for time filtering, if not provided or equal to missing data no lower limit is imposed
8382TYPE(datetime),INTENT(in),OPTIONAL :: e_d !< final time interval for time filtering, if not provided or equal to missing data no upper limit is imposed
8383
8384INTEGER :: i
8385
8386IF (PRESENT(avl)) THEN
8387 IF (SIZE(avl) > 0) THEN
8388
8389 IF (ASSOCIATED(this%anavar%r)) THEN
8390 DO i = 1, SIZE(this%anavar%r)
8391 IF (all(this%anavar%r(i)%btable /= avl)) this%anavar%r(i) = vol7d_var_miss
8392 ENDDO
8393 ENDIF
8394
8395 IF (ASSOCIATED(this%anavar%i)) THEN
8396 DO i = 1, SIZE(this%anavar%i)
8397 IF (all(this%anavar%i(i)%btable /= avl)) this%anavar%i(i) = vol7d_var_miss
8398 ENDDO
8399 ENDIF
8400
8401 IF (ASSOCIATED(this%anavar%b)) THEN
8402 DO i = 1, SIZE(this%anavar%b)
8403 IF (all(this%anavar%b(i)%btable /= avl)) this%anavar%b(i) = vol7d_var_miss
8404 ENDDO
8405 ENDIF
8406
8407 IF (ASSOCIATED(this%anavar%d)) THEN
8408 DO i = 1, SIZE(this%anavar%d)
8409 IF (all(this%anavar%d(i)%btable /= avl)) this%anavar%d(i) = vol7d_var_miss
8410 ENDDO
8411 ENDIF
8412
8413 IF (ASSOCIATED(this%anavar%c)) THEN
8414 DO i = 1, SIZE(this%anavar%c)
8415 IF (all(this%anavar%c(i)%btable /= avl)) this%anavar%c(i) = vol7d_var_miss
8416 ENDDO
8417 ENDIF
8418
8419 ENDIF
8420ENDIF
8421
8422
8423IF (PRESENT(vl)) THEN
8424 IF (size(vl) > 0) THEN
8425 IF (ASSOCIATED(this%dativar%r)) THEN
8426 DO i = 1, SIZE(this%dativar%r)
8427 IF (all(this%dativar%r(i)%btable /= vl)) this%dativar%r(i) = vol7d_var_miss
8428 ENDDO
8429 ENDIF
8430
8431 IF (ASSOCIATED(this%dativar%i)) THEN
8432 DO i = 1, SIZE(this%dativar%i)
8433 IF (all(this%dativar%i(i)%btable /= vl)) this%dativar%i(i) = vol7d_var_miss
8434 ENDDO
8435 ENDIF
8436
8437 IF (ASSOCIATED(this%dativar%b)) THEN
8438 DO i = 1, SIZE(this%dativar%b)
8439 IF (all(this%dativar%b(i)%btable /= vl)) this%dativar%b(i) = vol7d_var_miss
8440 ENDDO
8441 ENDIF
8442
8443 IF (ASSOCIATED(this%dativar%d)) THEN
8444 DO i = 1, SIZE(this%dativar%d)
8445 IF (all(this%dativar%d(i)%btable /= vl)) this%dativar%d(i) = vol7d_var_miss
8446 ENDDO
8447 ENDIF
8448
8449 IF (ASSOCIATED(this%dativar%c)) THEN
8450 DO i = 1, SIZE(this%dativar%c)
8451 IF (all(this%dativar%c(i)%btable /= vl)) this%dativar%c(i) = vol7d_var_miss
8452 ENDDO
8453 ENDIF
8454
8455 IF (ASSOCIATED(this%dativar%c)) THEN
8456 DO i = 1, SIZE(this%dativar%c)
8457 IF (all(this%dativar%c(i)%btable /= vl)) this%dativar%c(i) = vol7d_var_miss
8458 ENDDO
8459 ENDIF
8460
8461 ENDIF
8462ENDIF
8463
8464IF (PRESENT(nl)) THEN
8465 IF (SIZE(nl) > 0) THEN
8466 DO i = 1, SIZE(this%network)
8467 IF (all(this%network(i) /= nl)) this%network(i) = vol7d_network_miss
8468 ENDDO
8469 ENDIF
8470ENDIF
8471
8472IF (PRESENT(s_d)) THEN
8474 WHERE (this%time < s_d)
8475 this%time = datetime_miss
8476 END WHERE
8477 ENDIF
8478ENDIF
8479
8480IF (PRESENT(e_d)) THEN
8482 WHERE (this%time > e_d)
8483 this%time = datetime_miss
8484 END WHERE
8485 ENDIF
8486ENDIF
8487
8488CALL vol7d_reform(this, miss=.true.)
8489
8490END SUBROUTINE vol7d_filter
8491
8492
8493!> Metodo per convertire i volumi di dati di un oggetto vol7d in dati
8494!! reali dove possibile. L'oggetto convertito è una copia completa
8495!! dell'originale che può essere quindi distrutto dopo la chiamata.
8496!! Per i dati di anagrafica, al momento sono convertiti solo
8497!! i dati CHARACTER se è passato \a anaconv=.TRUE.
8498!! Gli attributi non sono toccati.
8499SUBROUTINE vol7d_convr(this, that, anaconv)
8500TYPE(vol7d),INTENT(IN) :: this !< oggetto origine
8501TYPE(vol7d),INTENT(INOUT) :: that !< oggetto convertito
8502LOGICAL,OPTIONAL,INTENT(in) :: anaconv !< converti anche anagrafica
8503INTEGER :: i
8504LOGICAL :: fv(1)=(/.false./), tv(1)=(/.true./), acp(1), acn(1)
8505TYPE(vol7d) :: v7d_tmp
8506
8507IF (optio_log(anaconv)) THEN
8508 acp=fv
8509 acn=tv
8510ELSE
8511 acp=tv
8512 acn=fv
8513ENDIF
8514
8515! Volume con solo i dati reali e tutti gli attributi
8516! l'anagrafica e` copiata interamente se necessario
8517CALL vol7d_copy(this, that, &
8518 lanavarr=tv, lanavard=acp, lanavari=acp, lanavarb=acp, lanavarc=acp, &
8519 ldativarr=tv, ldativard=fv, ldativari=fv, ldativarb=fv, ldativarc=fv)
8520
8521! Volume solo di dati double
8522CALL vol7d_copy(this, v7d_tmp, &
8523 lanavarr=fv, lanavard=acn, lanavari=fv, lanavarb=fv, lanavarc=fv, &
8524 lanaattrr=fv, lanaattrd=fv, lanaattri=fv, lanaattrb=fv, lanaattrc=fv, &
8525 lanavarattrr=fv, lanavarattrd=fv, lanavarattri=fv, lanavarattrb=fv, lanavarattrc=fv, &
8526 ldativarr=fv, ldativard=tv, ldativari=fv, ldativarb=fv, ldativarc=fv, &
8527 ldatiattrr=fv, ldatiattrd=fv, ldatiattri=fv, ldatiattrb=fv, ldatiattrc=fv, &
8528 ldativarattrr=fv, ldativarattrd=fv, ldativarattri=fv, ldativarattrb=fv, ldativarattrc=fv)
8529
8530! converto a dati reali
8531IF (ASSOCIATED(v7d_tmp%anavar%d) .OR. ASSOCIATED(v7d_tmp%dativar%d)) THEN
8532
8533 IF (ASSOCIATED(v7d_tmp%anavar%d)) THEN
8534! alloco i dati reali e vi trasferisco i double
8535 ALLOCATE(v7d_tmp%volanar(SIZE(v7d_tmp%volanad, 1), SIZE(v7d_tmp%volanad, 2), &
8536 SIZE(v7d_tmp%volanad, 3)))
8537 DO i = 1, SIZE(v7d_tmp%anavar%d)
8538 v7d_tmp%volanar(:,i,:) = &
8539 realdat(v7d_tmp%volanad(:,i,:), v7d_tmp%anavar%d(i))
8540 ENDDO
8541 DEALLOCATE(v7d_tmp%volanad)
8542! trasferisco le variabili
8543 v7d_tmp%anavar%r => v7d_tmp%anavar%d
8544 NULLIFY(v7d_tmp%anavar%d)
8545 ENDIF
8546
8547 IF (ASSOCIATED(v7d_tmp%dativar%d)) THEN
8548! alloco i dati reali e vi trasferisco i double
8549 ALLOCATE(v7d_tmp%voldatir(SIZE(v7d_tmp%voldatid, 1), SIZE(v7d_tmp%voldatid, 2), &
8550 SIZE(v7d_tmp%voldatid, 3), SIZE(v7d_tmp%voldatid, 4), SIZE(v7d_tmp%voldatid, 5), &
8551 SIZE(v7d_tmp%voldatid, 6)))
8552 DO i = 1, SIZE(v7d_tmp%dativar%d)
8553 v7d_tmp%voldatir(:,:,:,:,i,:) = &
8554 realdat(v7d_tmp%voldatid(:,:,:,:,i,:), v7d_tmp%dativar%d(i))
8555 ENDDO
8556 DEALLOCATE(v7d_tmp%voldatid)
8557! trasferisco le variabili
8558 v7d_tmp%dativar%r => v7d_tmp%dativar%d
8559 NULLIFY(v7d_tmp%dativar%d)
8560 ENDIF
8561
8562! fondo con il volume definitivo
8563 CALL vol7d_merge(that, v7d_tmp)
8564ELSE
8566ENDIF
8567
8568
8569! Volume solo di dati interi
8570CALL vol7d_copy(this, v7d_tmp, &
8571 lanavarr=fv, lanavard=fv, lanavari=acn, lanavarb=fv, lanavarc=fv, &
8572 lanaattrr=fv, lanaattrd=fv, lanaattri=fv, lanaattrb=fv, lanaattrc=fv, &
8573 lanavarattrr=fv, lanavarattrd=fv, lanavarattri=fv, lanavarattrb=fv, lanavarattrc=fv, &
8574 ldativarr=fv, ldativard=fv, ldativari=tv, ldativarb=fv, ldativarc=fv, &
8575 ldatiattrr=fv, ldatiattrd=fv, ldatiattri=fv, ldatiattrb=fv, ldatiattrc=fv, &
8576 ldativarattrr=fv, ldativarattrd=fv, ldativarattri=fv, ldativarattrb=fv, ldativarattrc=fv)
8577
8578! converto a dati reali
8579IF (ASSOCIATED(v7d_tmp%anavar%i) .OR. ASSOCIATED(v7d_tmp%dativar%i)) THEN
8580
8581 IF (ASSOCIATED(v7d_tmp%anavar%i)) THEN
8582! alloco i dati reali e vi trasferisco gli interi
8583 ALLOCATE(v7d_tmp%volanar(SIZE(v7d_tmp%volanai, 1), SIZE(v7d_tmp%volanai, 2), &
8584 SIZE(v7d_tmp%volanai, 3)))
8585 DO i = 1, SIZE(v7d_tmp%anavar%i)
8586 v7d_tmp%volanar(:,i,:) = &
8587 realdat(v7d_tmp%volanai(:,i,:), v7d_tmp%anavar%i(i))
8588 ENDDO
8589 DEALLOCATE(v7d_tmp%volanai)
8590! trasferisco le variabili
8591 v7d_tmp%anavar%r => v7d_tmp%anavar%i
8592 NULLIFY(v7d_tmp%anavar%i)
8593 ENDIF
8594
8595 IF (ASSOCIATED(v7d_tmp%dativar%i)) THEN
8596! alloco i dati reali e vi trasferisco gli interi
8597 ALLOCATE(v7d_tmp%voldatir(SIZE(v7d_tmp%voldatii, 1), SIZE(v7d_tmp%voldatii, 2), &
8598 SIZE(v7d_tmp%voldatii, 3), SIZE(v7d_tmp%voldatii, 4), SIZE(v7d_tmp%voldatii, 5), &
8599 SIZE(v7d_tmp%voldatii, 6)))
8600 DO i = 1, SIZE(v7d_tmp%dativar%i)
8601 v7d_tmp%voldatir(:,:,:,:,i,:) = &
8602 realdat(v7d_tmp%voldatii(:,:,:,:,i,:), v7d_tmp%dativar%i(i))
8603 ENDDO
8604 DEALLOCATE(v7d_tmp%voldatii)
8605! trasferisco le variabili
8606 v7d_tmp%dativar%r => v7d_tmp%dativar%i
8607 NULLIFY(v7d_tmp%dativar%i)
8608 ENDIF
8609
8610! fondo con il volume definitivo
8611 CALL vol7d_merge(that, v7d_tmp)
8612ELSE
8614ENDIF
8615
8616
8617! Volume solo di dati byte
8618CALL vol7d_copy(this, v7d_tmp, &
8619 lanavarr=fv, lanavard=fv, lanavari=fv, lanavarb=acn, lanavarc=fv, &
8620 lanaattrr=fv, lanaattrd=fv, lanaattri=fv, lanaattrb=fv, lanaattrc=fv, &
8621 lanavarattrr=fv, lanavarattrd=fv, lanavarattri=fv, lanavarattrb=fv, lanavarattrc=fv, &
8622 ldativarr=fv, ldativard=fv, ldativari=fv, ldativarb=tv, ldativarc=fv, &
8623 ldatiattrr=fv, ldatiattrd=fv, ldatiattri=fv, ldatiattrb=fv, ldatiattrc=fv, &
8624 ldativarattrr=fv, ldativarattrd=fv, ldativarattri=fv, ldativarattrb=fv, ldativarattrc=fv)
8625
8626! converto a dati reali
8627IF (ASSOCIATED(v7d_tmp%anavar%b) .OR. ASSOCIATED(v7d_tmp%dativar%b)) THEN
8628
8629 IF (ASSOCIATED(v7d_tmp%anavar%b)) THEN
8630! alloco i dati reali e vi trasferisco i byte
8631 ALLOCATE(v7d_tmp%volanar(SIZE(v7d_tmp%volanab, 1), SIZE(v7d_tmp%volanab, 2), &
8632 SIZE(v7d_tmp%volanab, 3)))
8633 DO i = 1, SIZE(v7d_tmp%anavar%b)
8634 v7d_tmp%volanar(:,i,:) = &
8635 realdat(v7d_tmp%volanab(:,i,:), v7d_tmp%anavar%b(i))
8636 ENDDO
8637 DEALLOCATE(v7d_tmp%volanab)
8638! trasferisco le variabili
8639 v7d_tmp%anavar%r => v7d_tmp%anavar%b
8640 NULLIFY(v7d_tmp%anavar%b)
8641 ENDIF
8642
8643 IF (ASSOCIATED(v7d_tmp%dativar%b)) THEN
8644! alloco i dati reali e vi trasferisco i byte
8645 ALLOCATE(v7d_tmp%voldatir(SIZE(v7d_tmp%voldatib, 1), SIZE(v7d_tmp%voldatib, 2), &
8646 SIZE(v7d_tmp%voldatib, 3), SIZE(v7d_tmp%voldatib, 4), SIZE(v7d_tmp%voldatib, 5), &
8647 SIZE(v7d_tmp%voldatib, 6)))
8648 DO i = 1, SIZE(v7d_tmp%dativar%b)
8649 v7d_tmp%voldatir(:,:,:,:,i,:) = &
8650 realdat(v7d_tmp%voldatib(:,:,:,:,i,:), v7d_tmp%dativar%b(i))
8651 ENDDO
8652 DEALLOCATE(v7d_tmp%voldatib)
8653! trasferisco le variabili
8654 v7d_tmp%dativar%r => v7d_tmp%dativar%b
8655 NULLIFY(v7d_tmp%dativar%b)
8656 ENDIF
8657
8658! fondo con il volume definitivo
8659 CALL vol7d_merge(that, v7d_tmp)
8660ELSE
8662ENDIF
8663
8664
8665! Volume solo di dati character
8666CALL vol7d_copy(this, v7d_tmp, &
8667 lanavarr=fv, lanavard=fv, lanavari=fv, lanavarb=fv, lanavarc=acn, &
8668 lanaattrr=fv, lanaattrd=fv, lanaattri=fv, lanaattrb=fv, lanaattrc=fv, &
8669 lanavarattrr=fv, lanavarattrd=fv, lanavarattri=fv, lanavarattrb=fv, lanavarattrc=fv, &
8670 ldativarr=fv, ldativard=fv, ldativari=fv, ldativarb=fv, ldativarc=tv, &
8671 ldatiattrr=fv, ldatiattrd=fv, ldatiattri=fv, ldatiattrb=fv, ldatiattrc=fv, &
8672 ldativarattrr=fv, ldativarattrd=fv, ldativarattri=fv, ldativarattrb=fv, ldativarattrc=fv)
8673
8674! converto a dati reali
8675IF (ASSOCIATED(v7d_tmp%anavar%c) .OR. ASSOCIATED(v7d_tmp%dativar%c)) THEN
8676
8677 IF (ASSOCIATED(v7d_tmp%anavar%c)) THEN
8678! alloco i dati reali e vi trasferisco i character
8679 ALLOCATE(v7d_tmp%volanar(SIZE(v7d_tmp%volanac, 1), SIZE(v7d_tmp%volanac, 2), &
8680 SIZE(v7d_tmp%volanac, 3)))
8681 DO i = 1, SIZE(v7d_tmp%anavar%c)
8682 v7d_tmp%volanar(:,i,:) = &
8683 realdat(v7d_tmp%volanac(:,i,:), v7d_tmp%anavar%c(i))
8684 ENDDO
8685 DEALLOCATE(v7d_tmp%volanac)
8686! trasferisco le variabili
8687 v7d_tmp%anavar%r => v7d_tmp%anavar%c
8688 NULLIFY(v7d_tmp%anavar%c)
8689 ENDIF
8690
8691 IF (ASSOCIATED(v7d_tmp%dativar%c)) THEN
8692! alloco i dati reali e vi trasferisco i character
8693 ALLOCATE(v7d_tmp%voldatir(SIZE(v7d_tmp%voldatic, 1), SIZE(v7d_tmp%voldatic, 2), &
8694 SIZE(v7d_tmp%voldatic, 3), SIZE(v7d_tmp%voldatic, 4), SIZE(v7d_tmp%voldatic, 5), &
8695 SIZE(v7d_tmp%voldatic, 6)))
8696 DO i = 1, SIZE(v7d_tmp%dativar%c)
8697 v7d_tmp%voldatir(:,:,:,:,i,:) = &
8698 realdat(v7d_tmp%voldatic(:,:,:,:,i,:), v7d_tmp%dativar%c(i))
8699 ENDDO
8700 DEALLOCATE(v7d_tmp%voldatic)
8701! trasferisco le variabili
8702 v7d_tmp%dativar%r => v7d_tmp%dativar%c
8703 NULLIFY(v7d_tmp%dativar%c)
8704 ENDIF
8705
8706! fondo con il volume definitivo
8707 CALL vol7d_merge(that, v7d_tmp)
8708ELSE
8710ENDIF
8711
8712END SUBROUTINE vol7d_convr
8713
8714
8715!> Metodo per ottenere solo le differenze tra due oggetti vol7d.
8716!! Il primo volume viene confrontato col secondo; nel secondo volume ovunque
8717!! i dati confrontati siano coincidenti viene impostato valore mancante.
8718SUBROUTINE vol7d_diff_only (this, that, data_only,ana)
8719TYPE(vol7d),INTENT(IN) :: this !< primo volume da confrontare
8720TYPE(vol7d),INTENT(OUT) :: that !< secondo volume da confrontare in cui eliminare i dati coincidenti
8721logical , optional, intent(in) :: data_only !< attiva l'elaborazione dei soli dati e non dell'anagrafica (default: .false.)
8722logical , optional, intent(in) :: ana !< attiva l'elaborazione dell'anagrafica (coordinate e ident) (default: .false.)
8723logical :: ldata_only,lana
8724
8725IF (PRESENT(data_only)) THEN
8726 ldata_only = data_only
8727ELSE
8728 ldata_only = .false.
8729ENDIF
8730
8731IF (PRESENT(ana)) THEN
8732 lana = ana
8733ELSE
8734 lana = .false.
8735ENDIF
8736
8737
8738#undef VOL7D_POLY_ARRAY
8739#define VOL7D_POLY_ARRAY voldati
8740#include "vol7d_class_diff.F90"
8741#undef VOL7D_POLY_ARRAY
8742#define VOL7D_POLY_ARRAY voldatiattr
8743#include "vol7d_class_diff.F90"
8744#undef VOL7D_POLY_ARRAY
8745
8746if ( .not. ldata_only) then
8747
8748#define VOL7D_POLY_ARRAY volana
8749#include "vol7d_class_diff.F90"
8750#undef VOL7D_POLY_ARRAY
8751#define VOL7D_POLY_ARRAY volanaattr
8752#include "vol7d_class_diff.F90"
8753#undef VOL7D_POLY_ARRAY
8754
8755 if(lana)then
8756 where ( this%ana == that%ana )
8757 that%ana = vol7d_ana_miss
8758 end where
8759 end if
8760
8761end if
8762
8763
8764
8765END SUBROUTINE vol7d_diff_only
8766
8767
8768
8769! Creo le routine da ripetere per i vari tipi di dati di v7d
8770! tramite un template e il preprocessore
8771#undef VOL7D_POLY_TYPE
8772#undef VOL7D_POLY_TYPES
8773#define VOL7D_POLY_TYPE REAL
8774#define VOL7D_POLY_TYPES r
8775#include "vol7d_class_type_templ.F90"
8776#undef VOL7D_POLY_TYPE
8777#undef VOL7D_POLY_TYPES
8778#define VOL7D_POLY_TYPE DOUBLE PRECISION
8779#define VOL7D_POLY_TYPES d
8780#include "vol7d_class_type_templ.F90"
8781#undef VOL7D_POLY_TYPE
8782#undef VOL7D_POLY_TYPES
8783#define VOL7D_POLY_TYPE INTEGER
8784#define VOL7D_POLY_TYPES i
8785#include "vol7d_class_type_templ.F90"
8786#undef VOL7D_POLY_TYPE
8787#undef VOL7D_POLY_TYPES
8788#define VOL7D_POLY_TYPE INTEGER(kind=int_b)
8789#define VOL7D_POLY_TYPES b
8790#include "vol7d_class_type_templ.F90"
8791#undef VOL7D_POLY_TYPE
8792#undef VOL7D_POLY_TYPES
8793#define VOL7D_POLY_TYPE CHARACTER(len=vol7d_cdatalen)
8794#define VOL7D_POLY_TYPES c
8795#include "vol7d_class_type_templ.F90"
8796
8797! Creo le routine da ripetere per i vari descrittori di dimensioni di v7d
8798! tramite un template e il preprocessore
8799#define VOL7D_SORT
8800#undef VOL7D_NO_ZERO_ALLOC
8801#undef VOL7D_POLY_TYPE
8802#define VOL7D_POLY_TYPE datetime
8803#include "vol7d_class_desc_templ.F90"
8804#undef VOL7D_POLY_TYPE
8805#define VOL7D_POLY_TYPE vol7d_timerange
8806#include "vol7d_class_desc_templ.F90"
8807#undef VOL7D_POLY_TYPE
8808#define VOL7D_POLY_TYPE vol7d_level
8809#include "vol7d_class_desc_templ.F90"
8810#undef VOL7D_SORT
8811#undef VOL7D_POLY_TYPE
8812#define VOL7D_POLY_TYPE vol7d_network
8813#include "vol7d_class_desc_templ.F90"
8814#undef VOL7D_POLY_TYPE
8815#define VOL7D_POLY_TYPE vol7d_ana
8816#include "vol7d_class_desc_templ.F90"
8817#define VOL7D_NO_ZERO_ALLOC
8818#undef VOL7D_POLY_TYPE
8819#define VOL7D_POLY_TYPE vol7d_var
8820#include "vol7d_class_desc_templ.F90"
8821
8822!>\brief Scrittura su file di un volume Vol7d.
8823!! Scrittura su file unformatted di un intero volume Vol7d.
8824!! Il volume viene serializzato e scritto su file.
8825!! Il file puo' essere aperto opzionalmente dall'utente. Si possono passare
8826!! opzionalmente unità e nome del file altrimenti assegnati internamente a dei default; se assegnati internamente
8827!! tali parametri saranno in output.
8828!! Se non viene fornito il nome file viene utilizzato un file di default con nome pari al nome del programma in
8829!! esecuzione con postfisso ".v7d".
8830!! Come parametro opzionale c'è la description che insieme alla data corrente viene inserita nell'header del file.
8831subroutine vol7d_write_on_file (this,unit,description,filename,filename_auto)
8832
8833TYPE(vol7d),INTENT(IN) :: this !< volume vol7d da scrivere
8834integer,optional,intent(inout) :: unit !< unità su cui scrivere; se passata =0 ritorna il valore rielaborato (default =rielaborato internamente con getlun )
8835character(len=*),intent(in),optional :: filename !< nome del file su cui scrivere
8836character(len=*),intent(out),optional :: filename_auto !< nome del file generato se "filename" è omesso
8837character(len=*),INTENT(IN),optional :: description !< descrizione del volume
8838
8839integer :: lunit
8840character(len=254) :: ldescription,arg,lfilename
8841integer :: nana, ntime, ntimerange, nlevel, nnetwork, &
8842 ndativarr, ndativari, ndativarb, ndativard, ndativarc,&
8843 ndatiattrr, ndatiattri, ndatiattrb, ndatiattrd, ndatiattrc,&
8844 ndativarattrr, ndativarattri, ndativarattrb, ndativarattrd, ndativarattrc,&
8845 nanavarr, nanavari, nanavarb, nanavard, nanavarc,&
8846 nanaattrr, nanaattri, nanaattrb, nanaattrd, nanaattrc,&
8847 nanavarattrr, nanavarattri, nanavarattrb, nanavarattrd, nanavarattrc
8848!integer :: im,id,iy
8849integer :: tarray(8)
8850logical :: opened,exist
8851
8852 nana=0
8853 ntime=0
8854 ntimerange=0
8855 nlevel=0
8856 nnetwork=0
8857 ndativarr=0
8858 ndativari=0
8859 ndativarb=0
8860 ndativard=0
8861 ndativarc=0
8862 ndatiattrr=0
8863 ndatiattri=0
8864 ndatiattrb=0
8865 ndatiattrd=0
8866 ndatiattrc=0
8867 ndativarattrr=0
8868 ndativarattri=0
8869 ndativarattrb=0
8870 ndativarattrd=0
8871 ndativarattrc=0
8872 nanavarr=0
8873 nanavari=0
8874 nanavarb=0
8875 nanavard=0
8876 nanavarc=0
8877 nanaattrr=0
8878 nanaattri=0
8879 nanaattrb=0
8880 nanaattrd=0
8881 nanaattrc=0
8882 nanavarattrr=0
8883 nanavarattri=0
8884 nanavarattrb=0
8885 nanavarattrd=0
8886 nanavarattrc=0
8887
8888
8889!call idate(im,id,iy)
8890call date_and_time(values=tarray)
8891call getarg(0,arg)
8892
8893if (present(description))then
8894 ldescription=description
8895else
8896 ldescription="Vol7d generated by: "//trim(arg)
8897end if
8898
8899if (.not. present(unit))then
8900 lunit=getunit()
8901else
8902 if (unit==0)then
8903 lunit=getunit()
8904 unit=lunit
8905 else
8906 lunit=unit
8907 end if
8908end if
8909
8910lfilename=trim(arg)//".v7d"
8912
8913if (present(filename))then
8914 if (filename /= "")then
8915 lfilename=filename
8916 end if
8917end if
8918
8919if (present(filename_auto))filename_auto=lfilename
8920
8921
8922inquire(unit=lunit,opened=opened)
8923if (.not. opened) then
8924! inquire(file=lfilename, EXIST=exist)
8925! IF (exist) THEN
8926! CALL l4f_log(L4F_FATAL, &
8927! 'in vol7d_write_on_file, file exists, cannot open file '//TRIM(lfilename))
8928! CALL raise_fatal_error()
8929! ENDIF
8930 OPEN(unit=lunit, file=lfilename, form='UNFORMATTED', access='STREAM')
8931 CALL l4f_log(l4f_info, 'opened: '//trim(lfilename))
8932end if
8933
8934if (associated(this%ana)) nana=size(this%ana)
8935if (associated(this%time)) ntime=size(this%time)
8936if (associated(this%timerange)) ntimerange=size(this%timerange)
8937if (associated(this%level)) nlevel=size(this%level)
8938if (associated(this%network)) nnetwork=size(this%network)
8939
8940if (associated(this%dativar%r)) ndativarr=size(this%dativar%r)
8941if (associated(this%dativar%i)) ndativari=size(this%dativar%i)
8942if (associated(this%dativar%b)) ndativarb=size(this%dativar%b)
8943if (associated(this%dativar%d)) ndativard=size(this%dativar%d)
8944if (associated(this%dativar%c)) ndativarc=size(this%dativar%c)
8945
8946if (associated(this%datiattr%r)) ndatiattrr=size(this%datiattr%r)
8947if (associated(this%datiattr%i)) ndatiattri=size(this%datiattr%i)
8948if (associated(this%datiattr%b)) ndatiattrb=size(this%datiattr%b)
8949if (associated(this%datiattr%d)) ndatiattrd=size(this%datiattr%d)
8950if (associated(this%datiattr%c)) ndatiattrc=size(this%datiattr%c)
8951
8952if (associated(this%dativarattr%r)) ndativarattrr=size(this%dativarattr%r)
8953if (associated(this%dativarattr%i)) ndativarattri=size(this%dativarattr%i)
8954if (associated(this%dativarattr%b)) ndativarattrb=size(this%dativarattr%b)
8955if (associated(this%dativarattr%d)) ndativarattrd=size(this%dativarattr%d)
8956if (associated(this%dativarattr%c)) ndativarattrc=size(this%dativarattr%c)
8957
8958if (associated(this%anavar%r)) nanavarr=size(this%anavar%r)
8959if (associated(this%anavar%i)) nanavari=size(this%anavar%i)
8960if (associated(this%anavar%b)) nanavarb=size(this%anavar%b)
8961if (associated(this%anavar%d)) nanavard=size(this%anavar%d)
8962if (associated(this%anavar%c)) nanavarc=size(this%anavar%c)
8963
8964if (associated(this%anaattr%r)) nanaattrr=size(this%anaattr%r)
8965if (associated(this%anaattr%i)) nanaattri=size(this%anaattr%i)
8966if (associated(this%anaattr%b)) nanaattrb=size(this%anaattr%b)
8967if (associated(this%anaattr%d)) nanaattrd=size(this%anaattr%d)
8968if (associated(this%anaattr%c)) nanaattrc=size(this%anaattr%c)
8969
8970if (associated(this%anavarattr%r)) nanavarattrr=size(this%anavarattr%r)
8971if (associated(this%anavarattr%i)) nanavarattri=size(this%anavarattr%i)
8972if (associated(this%anavarattr%b)) nanavarattrb=size(this%anavarattr%b)
8973if (associated(this%anavarattr%d)) nanavarattrd=size(this%anavarattr%d)
8974if (associated(this%anavarattr%c)) nanavarattrc=size(this%anavarattr%c)
8975
8976write(unit=lunit)ldescription
8977write(unit=lunit)tarray
8978
8979write(unit=lunit)&
8980 nana, ntime, ntimerange, nlevel, nnetwork, &
8981 ndativarr, ndativari, ndativarb, ndativard, ndativarc,&
8982 ndatiattrr, ndatiattri, ndatiattrb, ndatiattrd, ndatiattrc,&
8983 ndativarattrr, ndativarattri, ndativarattrb, ndativarattrd, ndativarattrc,&
8984 nanavarr, nanavari, nanavarb, nanavard, nanavarc,&
8985 nanaattrr, nanaattri, nanaattrb, nanaattrd, nanaattrc,&
8986 nanavarattrr, nanavarattri, nanavarattrb, nanavarattrd, nanavarattrc, &
8987 this%time_definition
8988
8989
8990!write(unit=lunit)this
8991
8992
8993!! prime 5 dimensioni
8996if (associated(this%level)) write(unit=lunit)this%level
8997if (associated(this%timerange)) write(unit=lunit)this%timerange
8998if (associated(this%network)) write(unit=lunit)this%network
8999
9000 !! 6a dimensione: variabile dell'anagrafica e dei dati
9001 !! con relativi attributi e in 5 tipi diversi
9002
9003if (associated(this%anavar%r)) write(unit=lunit)this%anavar%r
9004if (associated(this%anavar%i)) write(unit=lunit)this%anavar%i
9005if (associated(this%anavar%b)) write(unit=lunit)this%anavar%b
9006if (associated(this%anavar%d)) write(unit=lunit)this%anavar%d
9007if (associated(this%anavar%c)) write(unit=lunit)this%anavar%c
9008
9009if (associated(this%anaattr%r)) write(unit=lunit)this%anaattr%r
9010if (associated(this%anaattr%i)) write(unit=lunit)this%anaattr%i
9011if (associated(this%anaattr%b)) write(unit=lunit)this%anaattr%b
9012if (associated(this%anaattr%d)) write(unit=lunit)this%anaattr%d
9013if (associated(this%anaattr%c)) write(unit=lunit)this%anaattr%c
9014
9015if (associated(this%anavarattr%r)) write(unit=lunit)this%anavarattr%r
9016if (associated(this%anavarattr%i)) write(unit=lunit)this%anavarattr%i
9017if (associated(this%anavarattr%b)) write(unit=lunit)this%anavarattr%b
9018if (associated(this%anavarattr%d)) write(unit=lunit)this%anavarattr%d
9019if (associated(this%anavarattr%c)) write(unit=lunit)this%anavarattr%c
9020
9021if (associated(this%dativar%r)) write(unit=lunit)this%dativar%r
9022if (associated(this%dativar%i)) write(unit=lunit)this%dativar%i
9023if (associated(this%dativar%b)) write(unit=lunit)this%dativar%b
9024if (associated(this%dativar%d)) write(unit=lunit)this%dativar%d
9025if (associated(this%dativar%c)) write(unit=lunit)this%dativar%c
9026
9027if (associated(this%datiattr%r)) write(unit=lunit)this%datiattr%r
9028if (associated(this%datiattr%i)) write(unit=lunit)this%datiattr%i
9029if (associated(this%datiattr%b)) write(unit=lunit)this%datiattr%b
9030if (associated(this%datiattr%d)) write(unit=lunit)this%datiattr%d
9031if (associated(this%datiattr%c)) write(unit=lunit)this%datiattr%c
9032
9033if (associated(this%dativarattr%r)) write(unit=lunit)this%dativarattr%r
9034if (associated(this%dativarattr%i)) write(unit=lunit)this%dativarattr%i
9035if (associated(this%dativarattr%b)) write(unit=lunit)this%dativarattr%b
9036if (associated(this%dativarattr%d)) write(unit=lunit)this%dativarattr%d
9037if (associated(this%dativarattr%c)) write(unit=lunit)this%dativarattr%c
9038
9039!! Volumi di valori e attributi per anagrafica e dati
9040
9041if (associated(this%volanar)) write(unit=lunit)this%volanar
9042if (associated(this%volanaattrr)) write(unit=lunit)this%volanaattrr
9043if (associated(this%voldatir)) write(unit=lunit)this%voldatir
9044if (associated(this%voldatiattrr)) write(unit=lunit)this%voldatiattrr
9045
9046if (associated(this%volanai)) write(unit=lunit)this%volanai
9047if (associated(this%volanaattri)) write(unit=lunit)this%volanaattri
9048if (associated(this%voldatii)) write(unit=lunit)this%voldatii
9049if (associated(this%voldatiattri)) write(unit=lunit)this%voldatiattri
9050
9051if (associated(this%volanab)) write(unit=lunit)this%volanab
9052if (associated(this%volanaattrb)) write(unit=lunit)this%volanaattrb
9053if (associated(this%voldatib)) write(unit=lunit)this%voldatib
9054if (associated(this%voldatiattrb)) write(unit=lunit)this%voldatiattrb
9055
9056if (associated(this%volanad)) write(unit=lunit)this%volanad
9057if (associated(this%volanaattrd)) write(unit=lunit)this%volanaattrd
9058if (associated(this%voldatid)) write(unit=lunit)this%voldatid
9059if (associated(this%voldatiattrd)) write(unit=lunit)this%voldatiattrd
9060
9061if (associated(this%volanac)) write(unit=lunit)this%volanac
9062if (associated(this%volanaattrc)) write(unit=lunit)this%volanaattrc
9063if (associated(this%voldatic)) write(unit=lunit)this%voldatic
9064if (associated(this%voldatiattrc)) write(unit=lunit)this%voldatiattrc
9065
9066if (.not. present(unit)) close(unit=lunit)
9067
9068end subroutine vol7d_write_on_file
9069
9070
9071!>\brief Lettura da file di un volume Vol7d.
9072!! Lettura da file unformatted di un intero volume Vol7d.
9073!! Questa subroutine comprende vol7d_alloc e vol7d_alloc_vol.
9074!! Il file puo' essere aperto opzionalmente dall'utente. Si possono passare
9075!! opzionalmente unità e nome del file altrimenti assegnati internamente a dei default; se assegnati internamente
9076!! tali parametri saranno in output.
9077
9078
9079subroutine vol7d_read_from_file (this,unit,filename,description,tarray,filename_auto)
9080
9081TYPE(vol7d),INTENT(OUT) :: this !< Volume vol7d da leggere
9082integer,intent(inout),optional :: unit !< unità su cui è stato aperto un file; se =0 rielaborato internamente (default = elaborato internamente con getunit)
9083character(len=*),INTENT(in),optional :: filename !< nome del file eventualmente da aprire (default = (nome dell'eseguibile)//.v7d )
9084character(len=*),intent(out),optional :: filename_auto !< nome del file generato se "filename" è omesso
9085character(len=*),INTENT(out),optional :: description !< descrizione del volume letto
9086integer,intent(out),optional :: tarray(8) !< vettore come definito da "date_and_time" della data di scrittura del volume
9087
9088
9089integer :: nana, ntime, ntimerange, nlevel, nnetwork, &
9090 ndativarr, ndativari, ndativarb, ndativard, ndativarc,&
9091 ndatiattrr, ndatiattri, ndatiattrb, ndatiattrd, ndatiattrc,&
9092 ndativarattrr, ndativarattri, ndativarattrb, ndativarattrd, ndativarattrc,&
9093 nanavarr, nanavari, nanavarb, nanavard, nanavarc,&
9094 nanaattrr, nanaattri, nanaattrb, nanaattrd, nanaattrc,&
9095 nanavarattrr, nanavarattri, nanavarattrb, nanavarattrd, nanavarattrc
9096
9097character(len=254) :: ldescription,lfilename,arg
9098integer :: ltarray(8),lunit,ios
9099logical :: opened,exist
9100
9101
9102call getarg(0,arg)
9103
9104if (.not. present(unit))then
9105 lunit=getunit()
9106else
9107 if (unit==0)then
9108 lunit=getunit()
9109 unit=lunit
9110 else
9111 lunit=unit
9112 end if
9113end if
9114
9115lfilename=trim(arg)//".v7d"
9117
9118if (present(filename))then
9119 if (filename /= "")then
9120 lfilename=filename
9121 end if
9122end if
9123
9124if (present(filename_auto))filename_auto=lfilename
9125
9126
9127inquire(unit=lunit,opened=opened)
9128IF (.NOT. opened) THEN
9129 inquire(file=lfilename,exist=exist)
9130 IF (.NOT.exist) THEN
9131 CALL l4f_log(l4f_fatal, &
9132 'in vol7d_read_from_file, file does not exists, cannot open')
9133 CALL raise_fatal_error()
9134 ENDIF
9135 OPEN(unit=lunit, file=lfilename, form='UNFORMATTED', access='STREAM', &
9136 status='OLD', action='READ')
9137 CALL l4f_log(l4f_info, 'opened: '//trim(lfilename))
9138end if
9139
9140
9142read(unit=lunit,iostat=ios)ldescription
9143
9144if (ios < 0) then ! A negative value indicates that the End of File or End of Record
9145 call vol7d_alloc (this)
9146 call vol7d_alloc_vol (this)
9147 if (present(description))description=ldescription
9148 if (present(tarray))tarray=ltarray
9149 if (.not. present(unit)) close(unit=lunit)
9150end if
9151
9152read(unit=lunit)ltarray
9153
9154CALL l4f_log(l4f_info, 'Reading vol7d from file')
9155CALL l4f_log(l4f_info, 'description: '//trim(ldescription))
9158
9159if (present(description))description=ldescription
9160if (present(tarray))tarray=ltarray
9161
9162read(unit=lunit)&
9163 nana, ntime, ntimerange, nlevel, nnetwork, &
9164 ndativarr, ndativari, ndativarb, ndativard, ndativarc,&
9165 ndatiattrr, ndatiattri, ndatiattrb, ndatiattrd, ndatiattrc,&
9166 ndativarattrr, ndativarattri, ndativarattrb, ndativarattrd, ndativarattrc,&
9167 nanavarr, nanavari, nanavarb, nanavard, nanavarc,&
9168 nanaattrr, nanaattri, nanaattrb, nanaattrd, nanaattrc,&
9169 nanavarattrr, nanavarattri, nanavarattrb, nanavarattrd, nanavarattrc, &
9170 this%time_definition
9171
9172call vol7d_alloc (this, &
9173 nana=nana, ntime=ntime, ntimerange=ntimerange, nlevel=nlevel, nnetwork=nnetwork,&
9174 ndativarr=ndativarr, ndativari=ndativari, ndativarb=ndativarb,&
9175 ndativard=ndativard, ndativarc=ndativarc,&
9176 ndatiattrr=ndatiattrr, ndatiattri=ndatiattri, ndatiattrb=ndatiattrb,&
9177 ndatiattrd=ndatiattrd, ndatiattrc=ndatiattrc,&
9178 ndativarattrr=ndativarattrr, ndativarattri=ndativarattri, ndativarattrb=ndativarattrb, &
9179 ndativarattrd=ndativarattrd, ndativarattrc=ndativarattrc,&
9180 nanavarr=nanavarr, nanavari=nanavari, nanavarb=nanavarb, &
9181 nanavard=nanavard, nanavarc=nanavarc,&
9182 nanaattrr=nanaattrr, nanaattri=nanaattri, nanaattrb=nanaattrb,&
9183 nanaattrd=nanaattrd, nanaattrc=nanaattrc,&
9184 nanavarattrr=nanavarattrr, nanavarattri=nanavarattri, nanavarattrb=nanavarattrb, &
9185 nanavarattrd=nanavarattrd, nanavarattrc=nanavarattrc)
9186
9187
9190if (associated(this%level)) read(unit=lunit)this%level
9191if (associated(this%timerange)) read(unit=lunit)this%timerange
9192if (associated(this%network)) read(unit=lunit)this%network
9193
9194if (associated(this%anavar%r)) read(unit=lunit)this%anavar%r
9195if (associated(this%anavar%i)) read(unit=lunit)this%anavar%i
9196if (associated(this%anavar%b)) read(unit=lunit)this%anavar%b
9197if (associated(this%anavar%d)) read(unit=lunit)this%anavar%d
9198if (associated(this%anavar%c)) read(unit=lunit)this%anavar%c
9199
9200if (associated(this%anaattr%r)) read(unit=lunit)this%anaattr%r
9201if (associated(this%anaattr%i)) read(unit=lunit)this%anaattr%i
9202if (associated(this%anaattr%b)) read(unit=lunit)this%anaattr%b
9203if (associated(this%anaattr%d)) read(unit=lunit)this%anaattr%d
9204if (associated(this%anaattr%c)) read(unit=lunit)this%anaattr%c
9205
9206if (associated(this%anavarattr%r)) read(unit=lunit)this%anavarattr%r
9207if (associated(this%anavarattr%i)) read(unit=lunit)this%anavarattr%i
9208if (associated(this%anavarattr%b)) read(unit=lunit)this%anavarattr%b
9209if (associated(this%anavarattr%d)) read(unit=lunit)this%anavarattr%d
9210if (associated(this%anavarattr%c)) read(unit=lunit)this%anavarattr%c
9211
9212if (associated(this%dativar%r)) read(unit=lunit)this%dativar%r
9213if (associated(this%dativar%i)) read(unit=lunit)this%dativar%i
9214if (associated(this%dativar%b)) read(unit=lunit)this%dativar%b
9215if (associated(this%dativar%d)) read(unit=lunit)this%dativar%d
9216if (associated(this%dativar%c)) read(unit=lunit)this%dativar%c
9217
9218if (associated(this%datiattr%r)) read(unit=lunit)this%datiattr%r
9219if (associated(this%datiattr%i)) read(unit=lunit)this%datiattr%i
9220if (associated(this%datiattr%b)) read(unit=lunit)this%datiattr%b
9221if (associated(this%datiattr%d)) read(unit=lunit)this%datiattr%d
9222if (associated(this%datiattr%c)) read(unit=lunit)this%datiattr%c
9223
9224if (associated(this%dativarattr%r)) read(unit=lunit)this%dativarattr%r
9225if (associated(this%dativarattr%i)) read(unit=lunit)this%dativarattr%i
9226if (associated(this%dativarattr%b)) read(unit=lunit)this%dativarattr%b
9227if (associated(this%dativarattr%d)) read(unit=lunit)this%dativarattr%d
9228if (associated(this%dativarattr%c)) read(unit=lunit)this%dativarattr%c
9229
9230call vol7d_alloc_vol (this)
9231
9232!! Volumi di valori e attributi per anagrafica e dati
9233
9234if (associated(this%volanar)) read(unit=lunit)this%volanar
9235if (associated(this%volanaattrr)) read(unit=lunit)this%volanaattrr
9236if (associated(this%voldatir)) read(unit=lunit)this%voldatir
9237if (associated(this%voldatiattrr)) read(unit=lunit)this%voldatiattrr
9238
9239if (associated(this%volanai)) read(unit=lunit)this%volanai
9240if (associated(this%volanaattri)) read(unit=lunit)this%volanaattri
9241if (associated(this%voldatii)) read(unit=lunit)this%voldatii
9242if (associated(this%voldatiattri)) read(unit=lunit)this%voldatiattri
9243
9244if (associated(this%volanab)) read(unit=lunit)this%volanab
9245if (associated(this%volanaattrb)) read(unit=lunit)this%volanaattrb
9246if (associated(this%voldatib)) read(unit=lunit)this%voldatib
9247if (associated(this%voldatiattrb)) read(unit=lunit)this%voldatiattrb
9248
9249if (associated(this%volanad)) read(unit=lunit)this%volanad
9250if (associated(this%volanaattrd)) read(unit=lunit)this%volanaattrd
9251if (associated(this%voldatid)) read(unit=lunit)this%voldatid
9252if (associated(this%voldatiattrd)) read(unit=lunit)this%voldatiattrd
9253
9254if (associated(this%volanac)) read(unit=lunit)this%volanac
9255if (associated(this%volanaattrc)) read(unit=lunit)this%volanaattrc
9256if (associated(this%voldatic)) read(unit=lunit)this%voldatic
9257if (associated(this%voldatiattrc)) read(unit=lunit)this%voldatiattrc
9258
9259if (.not. present(unit)) close(unit=lunit)
9260
9261end subroutine vol7d_read_from_file
9262
9263
9264! to double precision
9265elemental doubleprecision function doubledatd(voldat,var)
9266doubleprecision,intent(in) :: voldat
9267type(vol7d_var),intent(in) :: var
9268
9269doubledatd=voldat
9270
9271end function doubledatd
9272
9273
9274elemental doubleprecision function doubledatr(voldat,var)
9275real,intent(in) :: voldat
9276type(vol7d_var),intent(in) :: var
9277
9279 doubledatr=dble(voldat)
9280else
9281 doubledatr=dmiss
9282end if
9283
9284end function doubledatr
9285
9286
9287elemental doubleprecision function doubledati(voldat,var)
9288integer,intent(in) :: voldat
9289type(vol7d_var),intent(in) :: var
9290
9293 doubledati=dble(voldat)/10.d0**var%scalefactor
9294 else
9295 doubledati=dble(voldat)
9296 endif
9297else
9298 doubledati=dmiss
9299end if
9300
9301end function doubledati
9302
9303
9304elemental doubleprecision function doubledatb(voldat,var)
9305integer(kind=int_b),intent(in) :: voldat
9306type(vol7d_var),intent(in) :: var
9307
9310 doubledatb=dble(voldat)/10.d0**var%scalefactor
9311 else
9312 doubledatb=dble(voldat)
9313 endif
9314else
9315 doubledatb=dmiss
9316end if
9317
9318end function doubledatb
9319
9320
9321elemental doubleprecision function doubledatc(voldat,var)
9322CHARACTER(len=vol7d_cdatalen),intent(in) :: voldat
9323type(vol7d_var),intent(in) :: var
9324
9325doubledatc = c2d(voldat)
9327 doubledatc=doubledatc/10.d0**var%scalefactor
9328end if
9329
9330end function doubledatc
9331
9332
9333! to integer
9334elemental integer function integerdatd(voldat,var)
9335doubleprecision,intent(in) :: voldat
9336type(vol7d_var),intent(in) :: var
9337
9340 integerdatd=nint(voldat*10d0**var%scalefactor)
9341 else
9342 integerdatd=nint(voldat)
9343 endif
9344else
9345 integerdatd=imiss
9346end if
9347
9348end function integerdatd
9349
9350
9351elemental integer function integerdatr(voldat,var)
9352real,intent(in) :: voldat
9353type(vol7d_var),intent(in) :: var
9354
9357 integerdatr=nint(voldat*10d0**var%scalefactor)
9358 else
9359 integerdatr=nint(voldat)
9360 endif
9361else
9362 integerdatr=imiss
9363end if
9364
9365end function integerdatr
9366
9367
9368elemental integer function integerdati(voldat,var)
9369integer,intent(in) :: voldat
9370type(vol7d_var),intent(in) :: var
9371
9372integerdati=voldat
9373
9374end function integerdati
9375
9376
9377elemental integer function integerdatb(voldat,var)
9378integer(kind=int_b),intent(in) :: voldat
9379type(vol7d_var),intent(in) :: var
9380
9382 integerdatb=voldat
9383else
9384 integerdatb=imiss
9385end if
9386
9387end function integerdatb
9388
9389
9390elemental integer function integerdatc(voldat,var)
9391CHARACTER(len=vol7d_cdatalen),intent(in) :: voldat
9392type(vol7d_var),intent(in) :: var
9393
9394integerdatc=c2i(voldat)
9395
9396end function integerdatc
9397
9398
9399! to real
9400elemental real function realdatd(voldat,var)
9401doubleprecision,intent(in) :: voldat
9402type(vol7d_var),intent(in) :: var
9403
9405 realdatd=real(voldat)
9406else
9407 realdatd=rmiss
9408end if
9409
9410end function realdatd
9411
9412
9413elemental real function realdatr(voldat,var)
9414real,intent(in) :: voldat
9415type(vol7d_var),intent(in) :: var
9416
9417realdatr=voldat
9418
9419end function realdatr
9420
9421
9422elemental real function realdati(voldat,var)
9423integer,intent(in) :: voldat
9424type(vol7d_var),intent(in) :: var
9425
9428 realdati=float(voldat)/10.**var%scalefactor
9429 else
9430 realdati=float(voldat)
9431 endif
9432else
9433 realdati=rmiss
9434end if
9435
9436end function realdati
9437
9438
9439elemental real function realdatb(voldat,var)
9440integer(kind=int_b),intent(in) :: voldat
9441type(vol7d_var),intent(in) :: var
9442
9445 realdatb=float(voldat)/10**var%scalefactor
9446 else
9447 realdatb=float(voldat)
9448 endif
9449else
9450 realdatb=rmiss
9451end if
9452
9453end function realdatb
9454
9455
9456elemental real function realdatc(voldat,var)
9457CHARACTER(len=vol7d_cdatalen),intent(in) :: voldat
9458type(vol7d_var),intent(in) :: var
9459
9460realdatc=c2r(voldat)
9462 realdatc=realdatc/10.**var%scalefactor
9463end if
9464
9465end function realdatc
9466
9467
9468!> Return an ana volume of a requested variable as real data.
9469!! It returns a 2-d array of the proper shape (ana x network) for the
9470!! ana variable requested, converted to real type. If the conversion
9471!! fails or if the variable is not contained in the ana volume,
9472!! missing data are returned.
9473FUNCTION realanavol(this, var) RESULT(vol)
9474TYPE(vol7d),INTENT(in) :: this !< the \a vol7d object to query, the method \a vol7d_alloc_vol must have been called for it otherwise progam may abort
9475TYPE(vol7d_var),INTENT(in) :: var !< the ana variable to be returned
9476REAL :: vol(SIZE(this%ana),size(this%network))
9477
9478CHARACTER(len=1) :: dtype
9479INTEGER :: indvar
9480
9481dtype = cmiss
9482indvar = index(this%anavar, var, type=dtype)
9483
9484IF (indvar > 0) THEN
9485 SELECT CASE (dtype)
9486 CASE("d")
9487 vol = realdat(this%volanad(:,indvar,:), var)
9488 CASE("r")
9489 vol = this%volanar(:,indvar,:)
9490 CASE("i")
9491 vol = realdat(this%volanai(:,indvar,:), var)
9492 CASE("b")
9493 vol = realdat(this%volanab(:,indvar,:), var)
9494 CASE("c")
9495 vol = realdat(this%volanac(:,indvar,:), var)
9496 CASE default
9497 vol = rmiss
9498 END SELECT
9499ELSE
9500 vol = rmiss
9501ENDIF
9502
9503END FUNCTION realanavol
9504
9505
9506!> Return an ana volume of a requested variable as integer data.
9507!! It returns a 2-d array of the proper shape (ana x network) for the
9508!! ana variable requested, converted to integer type. If the conversion
9509!! fails or if the variable is not contained in the ana volume,
9510!! missing data are returned.
9511FUNCTION integeranavol(this, var) RESULT(vol)
9512TYPE(vol7d),INTENT(in) :: this !< the \a vol7d object to query, the method \a vol7d_alloc_vol must have been called for it otherwise progam may abort
9513TYPE(vol7d_var),INTENT(in) :: var !< the ana variable to be returned
9514INTEGER :: vol(SIZE(this%ana),size(this%network))
9515
9516CHARACTER(len=1) :: dtype
9517INTEGER :: indvar
9518
9519dtype = cmiss
9520indvar = index(this%anavar, var, type=dtype)
9521
9522IF (indvar > 0) THEN
9523 SELECT CASE (dtype)
9524 CASE("d")
9525 vol = integerdat(this%volanad(:,indvar,:), var)
9526 CASE("r")
9527 vol = integerdat(this%volanar(:,indvar,:), var)
9528 CASE("i")
9529 vol = this%volanai(:,indvar,:)
9530 CASE("b")
9531 vol = integerdat(this%volanab(:,indvar,:), var)
9532 CASE("c")
9533 vol = integerdat(this%volanac(:,indvar,:), var)
9534 CASE default
9535 vol = imiss
9536 END SELECT
9537ELSE
9538 vol = imiss
9539ENDIF
9540
9541END FUNCTION integeranavol
9542
9543
9544!> Move data for all variables from one coordinate in the character volume to other.
9545!! Only not missing data will be copyed and all attributes will be moved together.
9546!! Usefull to colapse data spread in more indices (level or time or ....).
9547!! After the move is possible to set to missing some descriptor and make a copy with miss=.true.
9548!! to obtain a new vol7d with less data shape.
9549subroutine move_datac (v7d,&
9550 indana,indtime,indlevel,indtimerange,indnetwork,&
9551 indananew,indtimenew,indlevelnew,indtimerangenew,indnetworknew)
9552
9553TYPE(vol7d),intent(inout) :: v7d !< data in form of character in this object will be moved
9554
9555integer,intent(in) :: indana,indtime,indlevel,indtimerange,indnetwork !< source coordinate of the data
9556integer,intent(in) :: indananew,indtimenew,indlevelnew,indtimerangenew,indnetworknew !< destination coordinate of data
9557integer :: inddativar,inddativarattr
9558
9559
9560do inddativar=1,size(v7d%dativar%c)
9561
9563 .not. c_e(v7d%voldatic(indananew,indtimenew,indlevelnew,indtimerangenew,inddativar,indnetworknew))&
9564 ) then
9565
9566 ! dati
9567 v7d%voldatic &
9568 (indananew,indtimenew,indlevelnew,indtimerangenew,inddativar,indnetworknew) = &
9569 v7d%voldatic &
9570 (indana,indtime,indlevel,indtimerange,inddativar,indnetwork)
9571
9572
9573 ! attributi
9574 if (associated (v7d%dativarattr%i)) then
9575 inddativarattr = index(v7d%dativarattr%i,v7d%dativar%c(inddativar))
9576 if (inddativarattr > 0 ) then
9577 v7d%voldatiattri &
9578 (indananew,indtimenew,indlevelnew,indtimerangenew,inddativarattr,indnetworknew,:) = &
9579 v7d%voldatiattri &
9580 (indana,indtime,indlevel,indtimerange,inddativarattr,indnetwork,:)
9581 end if
9582 end if
9583
9584 if (associated (v7d%dativarattr%r)) then
9585 inddativarattr = index(v7d%dativarattr%r,v7d%dativar%c(inddativar))
9586 if (inddativarattr > 0 ) then
9587 v7d%voldatiattrr &
9588 (indananew,indtimenew,indlevelnew,indtimerangenew,inddativarattr,indnetworknew,:) = &
9589 v7d%voldatiattrr &
9590 (indana,indtime,indlevel,indtimerange,inddativarattr,indnetwork,:)
9591 end if
9592 end if
9593
9594 if (associated (v7d%dativarattr%d)) then
9595 inddativarattr = index(v7d%dativarattr%d,v7d%dativar%c(inddativar))
9596 if (inddativarattr > 0 ) then
9597 v7d%voldatiattrd &
9598 (indananew,indtimenew,indlevelnew,indtimerangenew,inddativarattr,indnetworknew,:) = &
9599 v7d%voldatiattrd &
9600 (indana,indtime,indlevel,indtimerange,inddativarattr,indnetwork,:)
9601 end if
9602 end if
9603
9604 if (associated (v7d%dativarattr%b)) then
9605 inddativarattr = index(v7d%dativarattr%b,v7d%dativar%c(inddativar))
9606 if (inddativarattr > 0 ) then
9607 v7d%voldatiattrb &
9608 (indananew,indtimenew,indlevelnew,indtimerangenew,inddativarattr,indnetworknew,:) = &
9609 v7d%voldatiattrb &
9610 (indana,indtime,indlevel,indtimerange,inddativarattr,indnetwork,:)
9611 end if
9612 end if
9613
9614 if (associated (v7d%dativarattr%c)) then
9615 inddativarattr = index(v7d%dativarattr%c,v7d%dativar%c(inddativar))
9616 if (inddativarattr > 0 ) then
9617 v7d%voldatiattrc &
9618 (indananew,indtimenew,indlevelnew,indtimerangenew,inddativarattr,indnetworknew,:) = &
9619 v7d%voldatiattrc &
9620 (indana,indtime,indlevel,indtimerange,inddativarattr,indnetwork,:)
9621 end if
9622 end if
9623
9624 end if
9625
9626end do
9627
9628end subroutine move_datac
9629
9630!> Move data for all variables from one coordinate in the real volume to other.
9631!! Only not missing data will be copyed and all attributes will be moved together.
9632!! Usefull to colapse data spread in more indices (level or time or ....).
9633!! After the move is possible to set to missing some descriptor and make a copy with miss=.true.
9634!! to obtain a new vol7d with less data shape.
9635subroutine move_datar (v7d,&
9636 indana,indtime,indlevel,indtimerange,indnetwork,&
9637 indananew,indtimenew,indlevelnew,indtimerangenew,indnetworknew)
9638
9639TYPE(vol7d),intent(inout) :: v7d !< data in form of character in this object will be moved
9640
9641integer,intent(in) :: indana,indtime,indlevel,indtimerange,indnetwork !< source coordinate of the data
9642integer,intent(in) :: indananew,indtimenew,indlevelnew,indtimerangenew,indnetworknew !< destination coordinate of data
9643integer :: inddativar,inddativarattr
9644
9645
9646do inddativar=1,size(v7d%dativar%r)
9647
9649 .not. c_e(v7d%voldatir(indananew,indtimenew,indlevelnew,indtimerangenew,inddativar,indnetworknew))&
9650 ) then
9651
9652 ! dati
9653 v7d%voldatir &
9654 (indananew,indtimenew,indlevelnew,indtimerangenew,inddativar,indnetworknew) = &
9655 v7d%voldatir &
9656 (indana,indtime,indlevel,indtimerange,inddativar,indnetwork)
9657
9658
9659 ! attributi
9660 if (associated (v7d%dativarattr%i)) then
9661 inddativarattr = index(v7d%dativarattr%i,v7d%dativar%r(inddativar))
9662 if (inddativarattr > 0 ) then
9663 v7d%voldatiattri &
9664 (indananew,indtimenew,indlevelnew,indtimerangenew,inddativarattr,indnetworknew,:) = &
9665 v7d%voldatiattri &
9666 (indana,indtime,indlevel,indtimerange,inddativarattr,indnetwork,:)
9667 end if
9668 end if
9669
9670 if (associated (v7d%dativarattr%r)) then
9671 inddativarattr = index(v7d%dativarattr%r,v7d%dativar%r(inddativar))
9672 if (inddativarattr > 0 ) then
9673 v7d%voldatiattrr &
9674 (indananew,indtimenew,indlevelnew,indtimerangenew,inddativarattr,indnetworknew,:) = &
9675 v7d%voldatiattrr &
9676 (indana,indtime,indlevel,indtimerange,inddativarattr,indnetwork,:)
9677 end if
9678 end if
9679
9680 if (associated (v7d%dativarattr%d)) then
9681 inddativarattr = index(v7d%dativarattr%d,v7d%dativar%r(inddativar))
9682 if (inddativarattr > 0 ) then
9683 v7d%voldatiattrd &
9684 (indananew,indtimenew,indlevelnew,indtimerangenew,inddativarattr,indnetworknew,:) = &
9685 v7d%voldatiattrd &
9686 (indana,indtime,indlevel,indtimerange,inddativarattr,indnetwork,:)
9687 end if
9688 end if
9689
9690 if (associated (v7d%dativarattr%b)) then
9691 inddativarattr = index(v7d%dativarattr%b,v7d%dativar%r(inddativar))
9692 if (inddativarattr > 0 ) then
9693 v7d%voldatiattrb &
9694 (indananew,indtimenew,indlevelnew,indtimerangenew,inddativarattr,indnetworknew,:) = &
9695 v7d%voldatiattrb &
9696 (indana,indtime,indlevel,indtimerange,inddativarattr,indnetwork,:)
9697 end if
9698 end if
9699
9700 if (associated (v7d%dativarattr%c)) then
9701 inddativarattr = index(v7d%dativarattr%c,v7d%dativar%r(inddativar))
9702 if (inddativarattr > 0 ) then
9703 v7d%voldatiattrc &
9704 (indananew,indtimenew,indlevelnew,indtimerangenew,inddativarattr,indnetworknew,:) = &
9705 v7d%voldatiattrc &
9706 (indana,indtime,indlevel,indtimerange,inddativarattr,indnetwork,:)
9707 end if
9708 end if
9709
9710 end if
9711
9712end do
9713
9714end subroutine move_datar
9715
9716
9717!> Reduce some dimensions (level and timerage) for semplification (rounding).
9718!! You can use this for simplify and use variables in computation like alchimia
9719!! where fields have to be on the same coordinate
9720!! It return real or character data only: if input is charcter data only it return character otherwise il return
9721!! all the data converted to real.
9722!! examples:
9723!! means in time for short periods and istantaneous values
9724!! 2 meter and surface levels
9725!! If there are data on more then one almost equal levels or timeranges, the first var present (at least one point)
9726!! will be taken (order is by icreasing var index).
9727!! You can use predefined values for classic semplification
9728!! almost_equal_levels and almost_equal_timeranges
9729!! The level or timerange in output will be defined by the first element of level and timerange list
9730subroutine v7d_rounding(v7din,v7dout,level,timerange,nostatproc)
9731type(vol7d),intent(inout) :: v7din !< input volume
9732type(vol7d),intent(out) :: v7dout !> output volume
9733type(vol7d_level),intent(in),optional :: level(:) !< almost equal level list
9734type(vol7d_timerange),intent(in),optional :: timerange(:) !< almost equal timerange list
9735!logical,intent(in),optional :: merge !< if there are data on more then one almost equal levels or timeranges
9736!! will be merged POINT BY POINT with priority for the fird data found ordered by icreasing var index
9737logical,intent(in),optional :: nostatproc !< do not take in account statistical processing code in timerange and P2
9738
9739integer :: nana,nlevel,ntime,ntimerange,nnetwork,nbin
9740integer :: iana,ilevel,itimerange,indl,indt,itime,inetwork
9741type(vol7d_level) :: roundlevel(size(v7din%level))
9742type(vol7d_timerange) :: roundtimerange(size(v7din%timerange))
9743type(vol7d) :: v7d_tmp
9744
9745
9746nbin=0
9747
9748if (associated(v7din%dativar%r)) nbin = nbin + size(v7din%dativar%r)
9749if (associated(v7din%dativar%i)) nbin = nbin + size(v7din%dativar%i)
9750if (associated(v7din%dativar%d)) nbin = nbin + size(v7din%dativar%d)
9751if (associated(v7din%dativar%b)) nbin = nbin + size(v7din%dativar%b)
9752
9754
9755roundlevel=v7din%level
9756
9757if (present(level))then
9758 do ilevel = 1, size(v7din%level)
9759 if ((any(v7din%level(ilevel) .almosteq. level))) then
9760 roundlevel(ilevel)=level(1)
9761 end if
9762 end do
9763end if
9764
9765roundtimerange=v7din%timerange
9766
9767if (present(timerange))then
9768 do itimerange = 1, size(v7din%timerange)
9769 if ((any(v7din%timerange(itimerange) .almosteq. timerange))) then
9770 roundtimerange(itimerange)=timerange(1)
9771 end if
9772 end do
9773end if
9774
9775!set istantaneous values everywere
9776!preserve p1 for forecast time
9777if (optio_log(nostatproc)) then
9778 roundtimerange(:)%timerange=254
9779 roundtimerange(:)%p2=0
9780end if
9781
9782
9783nana=size(v7din%ana)
9784nlevel=count_distinct(roundlevel,back=.true.)
9785ntime=size(v7din%time)
9786ntimerange=count_distinct(roundtimerange,back=.true.)
9787nnetwork=size(v7din%network)
9788
9790
9791if (nbin == 0) then
9793else
9794 call vol7d_convr(v7din,v7d_tmp)
9795end if
9796
9797v7d_tmp%level=roundlevel
9798v7d_tmp%timerange=roundtimerange
9799
9800do ilevel=1, size(v7d_tmp%level)
9801 indl=index(v7d_tmp%level,roundlevel(ilevel))
9802 do itimerange=1,size(v7d_tmp%timerange)
9803 indt=index(v7d_tmp%timerange,roundtimerange(itimerange))
9804
9805 if (indl /= ilevel .or. indt /= itimerange) then
9806
9807 do iana=1, nana
9808 do itime=1,ntime
9809 do inetwork=1,nnetwork
9810
9811 if (nbin > 0) then
9812 call move_datar (v7d_tmp,&
9813 iana,itime,ilevel,itimerange,inetwork,&
9814 iana,itime,indl,indt,inetwork)
9815 else
9816 call move_datac (v7d_tmp,&
9817 iana,itime,ilevel,itimerange,inetwork,&
9818 iana,itime,indl,indt,inetwork)
9819 end if
9820
9821 end do
9822 end do
9823 end do
9824
9825 end if
9826
9827 end do
9828end do
9829
9830! set to missing level and time > nlevel
9831do ilevel=nlevel+1,size(v7d_tmp%level)
9833end do
9834
9835do itimerange=ntimerange+1,size(v7d_tmp%timerange)
9837end do
9838
9839!copy with remove
9842
9843!call display(v7dout)
9844
9845end subroutine v7d_rounding
9846
9847
9849
9850!>\example esempio_qc_convert.f90
9851!!\brief Programma esempio semplice per la scrittura su file di un volume vol7d
9852!!
9853!!Programma che scrive su file un volume vol7d letto da una serie di file ASCII.
9854!!Questo programma scrive i dati del clima che poi verranno letti da modqccli
9855
9856
9857!>\example esempio_v7ddballe_move_and_collapse.f90
9858!!\brief ! Example program to reduce to one the dimensions of levels and time without loss of data
Set of functions that return a trimmed CHARACTER representation of the input variable. Definition char_utilities.F90:278 Legge un oggetto datetime/timedelta o un vettore di oggetti datetime/timedelta da un file FORMATTED o... Definition datetime_class.F90:478 Scrive un oggetto datetime/timedelta o un vettore di oggetti datetime/timedelta su un file FORMATTED ... Definition datetime_class.F90:485 Generic subroutine for checking OPTIONAL parameters. Definition optional_values.f90:36 Check for problems return 0 if all check passed print diagnostics with log4f. Definition vol7d_class.F90:445 Reduce some dimensions (level and timerage) for semplification (rounding). Definition vol7d_class.F90:462 This module defines usefull general purpose function and subroutine. Definition array_utilities.F90:212 Definition of constants to be used for declaring variables of a desired type. Definition kinds.F90:245 Module for quickly interpreting the OPTIONAL parameters passed to a subprogram. Definition optional_values.f90:28 Classe per la gestione dell'anagrafica di stazioni meteo e affini. Definition vol7d_ana_class.F90:212 Classe per la gestione di un volume completo di dati osservati. Definition vol7d_class.F90:273 Classe per la gestione dei livelli verticali in osservazioni meteo e affini. Definition vol7d_level_class.F90:213 Classe per la gestione delle reti di stazioni per osservazioni meteo e affini. Definition vol7d_network_class.F90:214 Classe per la gestione degli intervalli temporali di osservazioni meteo e affini. Definition vol7d_timerange_class.F90:215 Classe per gestire un vettore di oggetti di tipo vol7d_var_class::vol7d_var. Definition vol7d_varvect_class.f90:22 Definisce un oggetto contenente i volumi anagrafica e dati e tutti i descrittori delle loro dimension... Definition vol7d_class.F90:312 |