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