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