|
libsim Versione 8.0.0
|
◆ vol7d_get_voldatib()
Crea una vista a dimensione ridotta di un volume di dati di tipo INTEGER(kind=int_b). È 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: INTEGER(kind=int_b), POINTER :: vol2d(:,:)
...
CALL vol7d_get_voldatib(v7d1, (/vol7d_ana_d, vol7d_time_d/), vol2d)
IF (ASSOCIATED(vol2d)) THEN
print*,vol2d
...
ENDIF
return
Definizione alla linea 5674 del file vol7d_class.F90. 5676! Copyright (C) 2010 ARPA-SIM <urpsim@smr.arpa.emr.it>
5677! authors:
5678! Davide Cesari <dcesari@arpa.emr.it>
5679! Paolo Patruno <ppatruno@arpa.emr.it>
5680
5681! This program is free software; you can redistribute it and/or
5682! modify it under the terms of the GNU General Public License as
5683! published by the Free Software Foundation; either version 2 of
5684! the License, or (at your option) any later version.
5685
5686! This program is distributed in the hope that it will be useful,
5687! but WITHOUT ANY WARRANTY; without even the implied warranty of
5688! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
5689! GNU General Public License for more details.
5690
5691! You should have received a copy of the GNU General Public License
5692! along with this program. If not, see <http://www.gnu.org/licenses/>.
5693#include "config.h"
5694
5695!> \defgroup vol7d Libsim package, vol7d library.
5696!! The libsim vol7d library contains classes for managing pointwise
5697!! data, tipically weather observations, and for their import from a
5698!! Db-All.e database or from a WMO BUFR file. In order to compile and
5699!! link programs using this library, you have to insert the required
5700!! \c USE statements in the program units involved, specify the
5701!! location of module files when compiling (tipically \c
5702!! -I/usr/lib/gfortran/modules or \c -I/usr/lib64/gfortran/modules or
5703!! \c -I/usr/include) and indicate the library name \c -lsim_vol7d
5704!! when linking, assuming that the library has been installed in a
5705!! default location.
5706
5707!> Classe per la gestione di un volume completo di dati osservati.
5708!! Questo modulo definisce gli oggetti e i metodi per gestire
5709!! volumi di dati meteorologici sparsi.
5710!! I volumi definiti sono principalmente di 4 categorie:
5711!! - volumi di anagrafica (vol7d::volanar & c.), hanno 3 dimensioni:
5712!! - anagrafica
5713!! - variabile di anagrafica
5714!! - rete
5715!! - volumi di attributi di anagrafica (vol7d::volanaattrr & c.), hanno 4 dimensioni:
5716!! - anagrafica
5717!! - variabile di anagrafica
5718!! - rete
5719!! - variabile di attributi delle variabili di anagrafica
5720!! - volumi di dati (vol7d::voldatir & c.), hanno 6 dimensioni:
5721!! - anagrafica
5722!! - tempo
5723!! - livello verticale
5724!! - intervallo temporale (timerange)
5725!! - variabile di dati
5726!! - rete
5727!! - volumi di attributi di dati (vol7d::voldatiattrr & c.), hanno 7 dimensioni:
5728!! - anagrafica
5729!! - tempo
5730!! - livello verticale
5731!! - intervallo temporale (timerange)
5732!! - variabile di dati
5733!! - rete
5734!! - variabile di attributi delle variabili di dati
5735!!
5736!! Tutte le variabili sono inoltre disponibil1 in 5 tipi diversi:
5737!! - reale (abbreviato r)
5738!! - doppia precisione (abbreviato d)
5739!! - intero (abbreviato i)
5740!! - byte (abbreviato b)
5741!! - carattere (abbreviato c)
5742!!
5743!! Per ognuna delle dimensioni possibili, incluse le variabili e gli
5744!! attributi con i loro diversi tipi,
5745!! è definito un cosiddetto "vettore di descrittori", con un
5746!! numero di elementi pari all'estensione della dimensione stessa,
5747!! che contiene le informazioni necessarie a descrivere
5748!! gli elementi di quella dimensione.
5749!! In realtà l'utente non dovrà generalmente occuparsi di costruire
5750!! un oggetto vol7d con le proprie mani ma utilizzerà nella maggior parte
5751!! dei casi i metodi di importazione preconfezionati che importano dati da
5752!! DB-All.e (vol7d_dballe_class) o dal DB Oracle del SIM (vol7d_oraclesim_class).
5753!!
5754!!
5755!! Il programma esempio_v7d.f90 contiene un esempio elementare di uso
5756!! della classe vol7d:
5757!! \include esempio_v7d.f90
5758!!
5759!! \ingroup vol7d
5767USE io_units
5774IMPLICIT NONE
5775
5776
5777INTEGER, PARAMETER :: vol7d_maxdim_a = 3, vol7d_maxdim_aa = 4, &
5778 vol7d_maxdim_d = 6, vol7d_maxdim_ad = 7
5779
5780INTEGER, PARAMETER :: vol7d_ana_a=1 !< indice della dimensione "anagrafica" nei volumi di anagrafica, da usare nei metodi vol7d_get_volana*
5781INTEGER, PARAMETER :: vol7d_var_a=2 !< indice della dimensione "variabile" nei volumi di anagrafica, da usare nei metodi vol7d_get_volana*
5782INTEGER, PARAMETER :: vol7d_network_a=3 !< indice della dimensione "rete" nei volumi di anagrafica, da usare nei metodi vol7d_get_volana*
5783INTEGER, PARAMETER :: vol7d_attr_a=4 !< indice della dimensione "attributo" nei volumi di anagrafica, da usare nei metodi vol7d_get_volana*
5784INTEGER, PARAMETER :: vol7d_ana_d=1 !< indice della dimensione "anagrafica" nei volumi di dati, da usare nei metodi vol7d_get_voldati*
5785INTEGER, PARAMETER :: vol7d_time_d=2 !< indice della dimensione "tempo" nei volumi di dati, da usare nei metodi vol7d_get_voldati*
5786INTEGER, PARAMETER :: vol7d_level_d=3 !< indice della dimensione "livello verticale" nei volumi di dati, da usare nei metodi vol7d_get_voldati*
5787INTEGER, PARAMETER :: vol7d_timerange_d=4 !< indice della dimensione "intervallo temporale" nei volumi di dati, da usare nei metodi vol7d_get_voldati*
5788INTEGER, PARAMETER :: vol7d_var_d=5 !< indice della dimensione "variabile" nei volumi di dati, da usare nei metodi vol7d_get_voldati*
5789INTEGER, PARAMETER :: vol7d_network_d=6 !< indice della dimensione "rete" nei volumi di dati, da usare nei metodi vol7d_get_voldati*
5790INTEGER, PARAMETER :: vol7d_attr_d=7 !< indice della dimensione "attributo" nei volumi di dati, da usare nei metodi vol7d_get_voldati*
5791INTEGER, PARAMETER :: vol7d_cdatalen=32
5792
5793TYPE vol7d_varmap
5794 INTEGER :: r, d, i, b, c
5795END TYPE vol7d_varmap
5796
5797!> Definisce un oggetto contenente i volumi anagrafica e dati e tutti
5798!! i descrittori delle loro dimensioni.
5800!> vettore descrittore della dimensione anagrafica
5801 TYPE(vol7d_ana),POINTER :: ana(:)
5802!> vettore descrittore della dimensione tempo
5803 TYPE(datetime),POINTER :: time(:)
5804!> vettore descrittore della dimensione livello verticale
5805 TYPE(vol7d_level),POINTER :: level(:)
5806!> vettore descrittore della dimensione intervallo temporale (timerange)
5807 TYPE(vol7d_timerange),POINTER :: timerange(:)
5808!> vettore descrittore della dimensione rete
5809 TYPE(vol7d_network),POINTER :: network(:)
5810!> vettore descrittore della dimensione variabile di anagrafica
5811 TYPE(vol7d_varvect) :: anavar
5812!> vettore descrittore della dimensione attributo delle variabili di anagrafica
5813 TYPE(vol7d_varvect) :: anaattr
5814!> vettore descrittore della dimensione variabile di anagrafica che ha tali attributi
5815 TYPE(vol7d_varvect) :: anavarattr
5816!> vettore descrittore della dimensione variabile di dati
5817 TYPE(vol7d_varvect) :: dativar
5818!> vettore descrittore della dimensione attributo delle variabili di dati
5819 TYPE(vol7d_varvect) :: datiattr
5820!> vettore descrittore della dimensione variabile di dati che ha tali attributi
5821 TYPE(vol7d_varvect) :: dativarattr
5822
5823!> volume di anagrafica a valori reali
5824 REAL,POINTER :: volanar(:,:,:)
5825!> volume di anagrafica a valori a doppia precisione
5826 DOUBLE PRECISION,POINTER :: volanad(:,:,:)
5827!> volume di anagrafica a valori interi
5828 INTEGER,POINTER :: volanai(:,:,:)
5829!> volume di anagrafica a valori byte
5830 INTEGER(kind=int_b),POINTER :: volanab(:,:,:)
5831!> volume di anagrafica a valori carattere
5832 CHARACTER(len=vol7d_cdatalen),POINTER :: volanac(:,:,:)
5833
5834!> volume di attributi di anagrafica a valori reali
5835 REAL,POINTER :: volanaattrr(:,:,:,:)
5836!> volume di attributi di anagrafica a valori a doppia precisione
5837 DOUBLE PRECISION,POINTER :: volanaattrd(:,:,:,:)
5838!> volume di attributi di anagrafica a valori interi
5839 INTEGER,POINTER :: volanaattri(:,:,:,:)
5840!> volume di attributi di anagrafica a valori byte
5841 INTEGER(kind=int_b),POINTER :: volanaattrb(:,:,:,:)
5842!> volume di attributi di anagrafica a valori carattere
5843 CHARACTER(len=vol7d_cdatalen),POINTER :: volanaattrc(:,:,:,:)
5844
5845!> volume di dati a valori reali
5846 REAL,POINTER :: voldatir(:,:,:,:,:,:) ! sono i dati
5847!> volume di dati a valori a doppia precisione
5848 DOUBLE PRECISION,POINTER :: voldatid(:,:,:,:,:,:)
5849!> volume di dati a valori interi
5850 INTEGER,POINTER :: voldatii(:,:,:,:,:,:)
5851!> volume di dati a valori byte
5852 INTEGER(kind=int_b),POINTER :: voldatib(:,:,:,:,:,:)
5853!> volume di dati a valori carattere
5854 CHARACTER(len=vol7d_cdatalen),POINTER :: voldatic(:,:,:,:,:,:)
5855
5856!> volume di attributi di dati a valori reali
5857 REAL,POINTER :: voldatiattrr(:,:,:,:,:,:,:)
5858!> volume di attributi di dati a valori a doppia precisione
5859 DOUBLE PRECISION,POINTER :: voldatiattrd(:,:,:,:,:,:,:)
5860!> volume di attributi di dati a valori interi
5861 INTEGER,POINTER :: voldatiattri(:,:,:,:,:,:,:)
5862!> volume di attributi di dati a valori byte
5863 INTEGER(kind=int_b),POINTER :: voldatiattrb(:,:,:,:,:,:,:)
5864!> volume di attributi di dati a valori carattere
5865 CHARACTER(len=vol7d_cdatalen),POINTER :: voldatiattrc(:,:,:,:,:,:,:)
5866
5867!> time definition; 0=time is reference time, 1=time is validity time
5868 integer :: time_definition
5869
5871
5872!> Costruttore per la classe vol7d.
5873!! Deve essere richiamato
5874!! per tutti gli oggetti di questo tipo definiti in un programma.
5876 MODULE PROCEDURE vol7d_init
5877END INTERFACE
5878
5879!> Distruttore per la classe vol7d.
5881 MODULE PROCEDURE vol7d_delete
5882END INTERFACE
5883
5884!> Scrittura su file.
5886 MODULE PROCEDURE vol7d_write_on_file
5887END INTERFACE
5888
5889!> Lettura da file.
5890INTERFACE import
5891 MODULE PROCEDURE vol7d_read_from_file
5892END INTERFACE
5893
5894!>Print object
5896 MODULE PROCEDURE vol7d_display, dat_display, dat_vect_display
5897END INTERFACE
5898
5899!>Represent data in a pretty string
5901 MODULE PROCEDURE to_char_dat
5902END INTERFACE
5903
5904!>doubleprecision data conversion
5906 MODULE PROCEDURE doubledatd,doubledatr,doubledati,doubledatb,doubledatc
5907END INTERFACE
5908
5909!>real data conversion
5911 MODULE PROCEDURE realdatd,realdatr,realdati,realdatb,realdatc
5912END INTERFACE
5913
5914!>integer data conversion
5916 MODULE PROCEDURE integerdatd,integerdatr,integerdati,integerdatb,integerdatc
5917END INTERFACE
5918
5919!>copy object
5921 MODULE PROCEDURE vol7d_copy
5922END INTERFACE
5923
5924!> Test for a missing volume
5926 MODULE PROCEDURE vol7d_c_e
5927END INTERFACE
5928
5929!> Check for problems
5930!! return 0 if all check passed
5931!! print diagnostics with log4f
5933 MODULE PROCEDURE vol7d_check
5934END INTERFACE
5935
5936!> Reduce some dimensions (level and timerage) for semplification (rounding).
5937!! You can use this for simplify and use variables in computation like alchimia
5938!! where fields have to be on the same coordinate
5939!! It return real or character data only: if input is charcter data only it return character otherwise il return
5940!! all the data converted to real.
5941!! examples:
5942!! means in time for short periods and istantaneous values
5943!! 2 meter and surface levels
5944!! If there are data on more then one almost equal levels or timeranges, the first var present (at least one point)
5945!! will be taken (order is by icreasing var index).
5946!! You can use predefined values for classic semplification
5947!! almost_equal_levels and almost_equal_timeranges
5948!! The level or timerange in output will be defined by the first element of level and timerange list
5950 MODULE PROCEDURE v7d_rounding
5951END INTERFACE
5952
5953!!$INTERFACE get_volana
5954!!$ MODULE PROCEDURE vol7d_get_volanar, vol7d_get_volanad, vol7d_get_volanai, &
5955!!$ vol7d_get_volanab, vol7d_get_volanac
5956!!$END INTERFACE
5957!!$
5958!!$INTERFACE get_voldati
5959!!$ MODULE PROCEDURE vol7d_get_voldatir, vol7d_get_voldatid, vol7d_get_voldatii, &
5960!!$ vol7d_get_voldatib, vol7d_get_voldatic
5961!!$END INTERFACE
5962!!$
5963!!$INTERFACE get_volanaattr
5964!!$ MODULE PROCEDURE vol7d_get_volanaattrr, vol7d_get_volanaattrd, &
5965!!$ vol7d_get_volanaattri, vol7d_get_volanaattrb, vol7d_get_volanaattrc
5966!!$END INTERFACE
5967!!$
5968!!$INTERFACE get_voldatiattr
5969!!$ MODULE PROCEDURE vol7d_get_voldatiattrr, vol7d_get_voldatiattrd, &
5970!!$ vol7d_get_voldatiattri, vol7d_get_voldatiattrb, vol7d_get_voldatiattrc
5971!!$END INTERFACE
5972
5973PRIVATE vol7d_get_volr, vol7d_get_vold, vol7d_get_voli, vol7d_get_volb, &
5974 vol7d_get_volc, &
5975 volptr1dr, volptr2dr, volptr3dr, volptr4dr, volptr5dr, volptr6dr, volptr7dr, &
5976 volptr1dd, volptr2dd, volptr3dd, volptr4dd, volptr5dd, volptr6dd, volptr7dd, &
5977 volptr1di, volptr2di, volptr3di, volptr4di, volptr5di, volptr6di, volptr7di, &
5978 volptr1db, volptr2db, volptr3db, volptr4db, volptr5db, volptr6db, volptr7db, &
5979 volptr1dc, volptr2dc, volptr3dc, volptr4dc, volptr5dc, volptr6dc, volptr7dc, &
5980 vol7d_nullifyr, vol7d_nullifyd, vol7d_nullifyi, vol7d_nullifyb, vol7d_nullifyc, &
5981 vol7d_init, vol7d_delete, vol7d_write_on_file, vol7d_read_from_file, &
5982 vol7d_check_alloc_ana, vol7d_force_alloc_ana, &
5983 vol7d_check_alloc_dati, vol7d_force_alloc_dati, vol7d_force_alloc, &
5984 vol7d_display, dat_display, dat_vect_display, &
5985 to_char_dat, vol7d_check
5986
5987PRIVATE doubledatd,doubledatr,doubledati,doubledatb,doubledatc
5988
5989PRIVATE vol7d_c_e
5990
5991CONTAINS
5992
5993
5994!> Inizializza un oggetto di tipo vol7d.
5995!! Non riceve alcun parametro tranne l'oggetto stesso. Attenzione, è necessario
5996!! comunque chiamare sempre il costruttore per evitare di avere dei puntatori in
5997!! uno stato indefinito.
5998SUBROUTINE vol7d_init(this,time_definition)
5999TYPE(vol7d),intent(out) :: this !< oggetto da inizializzare
6000INTEGER,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)
6001
6008
6009NULLIFY(this%ana, this%time, this%level, this%timerange, this%network)
6010
6011NULLIFY(this%volanar, this%volanaattrr, this%voldatir, this%voldatiattrr)
6012NULLIFY(this%volanad, this%volanaattrd, this%voldatid, this%voldatiattrd)
6013NULLIFY(this%volanai, this%volanaattri, this%voldatii, this%voldatiattri)
6014NULLIFY(this%volanab, this%volanaattrb, this%voldatib, this%voldatiattrb)
6015NULLIFY(this%volanac, this%volanaattrc, this%voldatic, this%voldatiattrc)
6016
6017if(present(time_definition)) then
6018 this%time_definition=time_definition
6019else
6020 this%time_definition=1 !default to validity time
6021end if
6022
6023END SUBROUTINE vol7d_init
6024
6025
6026!> Distrugge l'oggetto in maniera pulita, liberando l'eventuale memoria
6027!! dinamicamente allocata. Permette di distruggere la sola parte di dati
6028!! mantenendo l'anagrafica.
6029ELEMENTAL SUBROUTINE vol7d_delete(this, dataonly)
6030TYPE(vol7d),intent(inout) :: this !< oggetto da distruggere
6031LOGICAL, INTENT(in), OPTIONAL :: dataonly !< dealloca solo i dati, tenendo l'anagrafica, (default \c .FALSE.)
6032
6033
6034IF (.NOT. optio_log(dataonly)) THEN
6035 IF (ASSOCIATED(this%volanar)) DEALLOCATE(this%volanar)
6036 IF (ASSOCIATED(this%volanad)) DEALLOCATE(this%volanad)
6037 IF (ASSOCIATED(this%volanai)) DEALLOCATE(this%volanai)
6038 IF (ASSOCIATED(this%volanab)) DEALLOCATE(this%volanab)
6039 IF (ASSOCIATED(this%volanac)) DEALLOCATE(this%volanac)
6040 IF (ASSOCIATED(this%volanaattrr)) DEALLOCATE(this%volanaattrr)
6041 IF (ASSOCIATED(this%volanaattrd)) DEALLOCATE(this%volanaattrd)
6042 IF (ASSOCIATED(this%volanaattri)) DEALLOCATE(this%volanaattri)
6043 IF (ASSOCIATED(this%volanaattrb)) DEALLOCATE(this%volanaattrb)
6044 IF (ASSOCIATED(this%volanaattrc)) DEALLOCATE(this%volanaattrc)
6045ENDIF
6046IF (ASSOCIATED(this%voldatir)) DEALLOCATE(this%voldatir)
6047IF (ASSOCIATED(this%voldatid)) DEALLOCATE(this%voldatid)
6048IF (ASSOCIATED(this%voldatii)) DEALLOCATE(this%voldatii)
6049IF (ASSOCIATED(this%voldatib)) DEALLOCATE(this%voldatib)
6050IF (ASSOCIATED(this%voldatic)) DEALLOCATE(this%voldatic)
6051IF (ASSOCIATED(this%voldatiattrr)) DEALLOCATE(this%voldatiattrr)
6052IF (ASSOCIATED(this%voldatiattrd)) DEALLOCATE(this%voldatiattrd)
6053IF (ASSOCIATED(this%voldatiattri)) DEALLOCATE(this%voldatiattri)
6054IF (ASSOCIATED(this%voldatiattrb)) DEALLOCATE(this%voldatiattrb)
6055IF (ASSOCIATED(this%voldatiattrc)) DEALLOCATE(this%voldatiattrc)
6056
6057IF (.NOT. optio_log(dataonly)) THEN
6058 IF (ASSOCIATED(this%ana)) DEALLOCATE(this%ana)
6059 IF (ASSOCIATED(this%network)) DEALLOCATE(this%network)
6060ENDIF
6061IF (ASSOCIATED(this%time)) DEALLOCATE(this%time)
6062IF (ASSOCIATED(this%level)) DEALLOCATE(this%level)
6063IF (ASSOCIATED(this%timerange)) DEALLOCATE(this%timerange)
6064
6065IF (.NOT. optio_log(dataonly)) THEN
6069ENDIF
6073
6074END SUBROUTINE vol7d_delete
6075
6076
6077
6078integer function vol7d_check(this)
6079TYPE(vol7d),intent(in) :: this !< object to check
6080integer :: i,j,k,l,m,n
6081
6082vol7d_check=0
6083
6084if (associated(this%voldatii)) then
6085do i = 1,size(this%voldatii,1)
6086 do j = 1,size(this%voldatii,2)
6087 do k = 1,size(this%voldatii,3)
6088 do l = 1,size(this%voldatii,4)
6089 do m = 1,size(this%voldatii,5)
6090 do n = 1,size(this%voldatii,6)
6091 if (this%voldatii(i,j,k,l,m,n) /= this%voldatii(i,j,k,l,m,n) ) then
6092 CALL l4f_log(l4f_warn,"check: abnormal value at voldatii("&
6094 vol7d_check=1
6095 end if
6096 end do
6097 end do
6098 end do
6099 end do
6100 end do
6101end do
6102end if
6103
6104
6105if (associated(this%voldatir)) then
6106do i = 1,size(this%voldatir,1)
6107 do j = 1,size(this%voldatir,2)
6108 do k = 1,size(this%voldatir,3)
6109 do l = 1,size(this%voldatir,4)
6110 do m = 1,size(this%voldatir,5)
6111 do n = 1,size(this%voldatir,6)
6112 if (this%voldatir(i,j,k,l,m,n) /= this%voldatir(i,j,k,l,m,n) ) then
6113 CALL l4f_log(l4f_warn,"check: abnormal value at voldatir("&
6115 vol7d_check=2
6116 end if
6117 end do
6118 end do
6119 end do
6120 end do
6121 end do
6122end do
6123end if
6124
6125if (associated(this%voldatid)) then
6126do i = 1,size(this%voldatid,1)
6127 do j = 1,size(this%voldatid,2)
6128 do k = 1,size(this%voldatid,3)
6129 do l = 1,size(this%voldatid,4)
6130 do m = 1,size(this%voldatid,5)
6131 do n = 1,size(this%voldatid,6)
6132 if (this%voldatid(i,j,k,l,m,n) /= this%voldatid(i,j,k,l,m,n) ) then
6133 CALL l4f_log(l4f_warn,"check: abnormal value at voldatid("&
6135 vol7d_check=3
6136 end if
6137 end do
6138 end do
6139 end do
6140 end do
6141 end do
6142end do
6143end if
6144
6145if (associated(this%voldatib)) then
6146do i = 1,size(this%voldatib,1)
6147 do j = 1,size(this%voldatib,2)
6148 do k = 1,size(this%voldatib,3)
6149 do l = 1,size(this%voldatib,4)
6150 do m = 1,size(this%voldatib,5)
6151 do n = 1,size(this%voldatib,6)
6152 if (this%voldatib(i,j,k,l,m,n) /= this%voldatib(i,j,k,l,m,n) ) then
6153 CALL l4f_log(l4f_warn,"check: abnormal value at voldatib("&
6155 vol7d_check=4
6156 end if
6157 end do
6158 end do
6159 end do
6160 end do
6161 end do
6162end do
6163end if
6164
6165end function vol7d_check
6166
6167
6168
6169!TODO da completare ! aborta se i volumi sono allocati a dimensione 0
6170!> stampa a video una sintesi del contenuto
6171SUBROUTINE vol7d_display(this)
6172TYPE(vol7d),intent(in) :: this !< oggetto da visualizzare
6173integer :: i
6174
6175REAL :: rdat
6176DOUBLE PRECISION :: ddat
6177INTEGER :: idat
6178INTEGER(kind=int_b) :: bdat
6179CHARACTER(len=vol7d_cdatalen) :: cdat
6180
6181
6182print*,"<<<<<<<<<<<<<<<<<<< vol7d object >>>>>>>>>>>>>>>>>>>>"
6183if (this%time_definition == 0) then
6184 print*,"TIME DEFINITION: time is reference time"
6185else if (this%time_definition == 1) then
6186 print*,"TIME DEFINITION: time is validity time"
6187else if (this%time_definition == 2) then
6188 print*,"TIME DEFINITION: time is validity time, forecast range forced to 0"
6189else
6190 print*,"Time definition has a wrong walue:", this%time_definition
6191end if
6192
6193IF (ASSOCIATED(this%network))then
6194 print*,"---- network vector ----"
6195 print*,"elements=",size(this%network)
6196 do i=1, size(this%network)
6198 end do
6199end IF
6200
6201IF (ASSOCIATED(this%ana))then
6202 print*,"---- ana vector ----"
6203 print*,"elements=",size(this%ana)
6204 do i=1, size(this%ana)
6206 end do
6207end IF
6208
6209IF (ASSOCIATED(this%time))then
6210 print*,"---- time vector ----"
6211 print*,"elements=",size(this%time)
6212 do i=1, size(this%time)
6214 end do
6215end if
6216
6217IF (ASSOCIATED(this%level)) then
6218 print*,"---- level vector ----"
6219 print*,"elements=",size(this%level)
6220 do i =1,size(this%level)
6222 end do
6223end if
6224
6225IF (ASSOCIATED(this%timerange))then
6226 print*,"---- timerange vector ----"
6227 print*,"elements=",size(this%timerange)
6228 do i =1,size(this%timerange)
6230 end do
6231end if
6232
6233
6234print*,"---- ana vector ----"
6235print*,""
6236print*,"->>>>>>>>> anavar -"
6238print*,""
6239print*,"->>>>>>>>> anaattr -"
6241print*,""
6242print*,"->>>>>>>>> anavarattr -"
6244
6245print*,"-- ana data section (first point) --"
6246
6247idat=imiss
6248rdat=rmiss
6249ddat=dmiss
6250bdat=ibmiss
6251cdat=cmiss
6252
6253!ntime = MIN(SIZE(this%time),nprint)
6254!ntimerange = MIN(SIZE(this%timerange),nprint)
6255!nlevel = MIN(SIZE(this%level),nprint)
6256!nnetwork = MIN(SIZE(this%network),nprint)
6257!nana = MIN(SIZE(this%ana),nprint)
6258
6259IF (SIZE(this%ana) > 0 .AND. SIZE(this%network) > 0) THEN
6260if (associated(this%volanai)) then
6261 do i=1,size(this%anavar%i)
6262 idat=this%volanai(1,i,1)
6264 end do
6265end if
6266idat=imiss
6267
6268if (associated(this%volanar)) then
6269 do i=1,size(this%anavar%r)
6270 rdat=this%volanar(1,i,1)
6272 end do
6273end if
6274rdat=rmiss
6275
6276if (associated(this%volanad)) then
6277 do i=1,size(this%anavar%d)
6278 ddat=this%volanad(1,i,1)
6280 end do
6281end if
6282ddat=dmiss
6283
6284if (associated(this%volanab)) then
6285 do i=1,size(this%anavar%b)
6286 bdat=this%volanab(1,i,1)
6288 end do
6289end if
6290bdat=ibmiss
6291
6292if (associated(this%volanac)) then
6293 do i=1,size(this%anavar%c)
6294 cdat=this%volanac(1,i,1)
6296 end do
6297end if
6298cdat=cmiss
6299ENDIF
6300
6301print*,"---- data vector ----"
6302print*,""
6303print*,"->>>>>>>>> dativar -"
6305print*,""
6306print*,"->>>>>>>>> datiattr -"
6308print*,""
6309print*,"->>>>>>>>> dativarattr -"
6311
6312print*,"-- data data section (first point) --"
6313
6314idat=imiss
6315rdat=rmiss
6316ddat=dmiss
6317bdat=ibmiss
6318cdat=cmiss
6319
6320IF (SIZE(this%ana) > 0 .AND. SIZE(this%network) > 0 .AND. size(this%time) > 0 &
6321 .AND. size(this%level) > 0 .AND. size(this%timerange) > 0) THEN
6322if (associated(this%voldatii)) then
6323 do i=1,size(this%dativar%i)
6324 idat=this%voldatii(1,1,1,1,i,1)
6326 end do
6327end if
6328idat=imiss
6329
6330if (associated(this%voldatir)) then
6331 do i=1,size(this%dativar%r)
6332 rdat=this%voldatir(1,1,1,1,i,1)
6334 end do
6335end if
6336rdat=rmiss
6337
6338if (associated(this%voldatid)) then
6339 do i=1,size(this%dativar%d)
6340 ddat=this%voldatid(1,1,1,1,i,1)
6342 end do
6343end if
6344ddat=dmiss
6345
6346if (associated(this%voldatib)) then
6347 do i=1,size(this%dativar%b)
6348 bdat=this%voldatib(1,1,1,1,i,1)
6350 end do
6351end if
6352bdat=ibmiss
6353
6354if (associated(this%voldatic)) then
6355 do i=1,size(this%dativar%c)
6356 cdat=this%voldatic(1,1,1,1,i,1)
6358 end do
6359end if
6360cdat=cmiss
6361ENDIF
6362
6363print*,"<<<<<<<<<<<<<<<<<<< END vol7d object >>>>>>>>>>>>>>>>>>>>"
6364
6365END SUBROUTINE vol7d_display
6366
6367
6368!> stampa a video una sintesi del contenuto
6369SUBROUTINE dat_display(this,idat,rdat,ddat,bdat,cdat)
6370TYPE(vol7d_var),intent(in) :: this !< oggetto da visualizzare
6371!> real
6372REAL :: rdat
6373!> double precision
6374DOUBLE PRECISION :: ddat
6375!> integer
6376INTEGER :: idat
6377!> byte
6378INTEGER(kind=int_b) :: bdat
6379!> character
6380CHARACTER(len=*) :: cdat
6381
6382print *, to_char_dat(this,idat,rdat,ddat,bdat,cdat)
6383
6384end SUBROUTINE dat_display
6385
6386!> stampa a video una sintesi del contenuto
6387SUBROUTINE dat_vect_display(this,idat,rdat,ddat,bdat,cdat)
6388
6389TYPE(vol7d_var),intent(in) :: this(:) !< oggetto da visualizzare
6390!> real
6391REAL :: rdat(:)
6392!> double precision
6393DOUBLE PRECISION :: ddat(:)
6394!> integer
6395INTEGER :: idat(:)
6396!> byte
6397INTEGER(kind=int_b) :: bdat(:)
6398!> character
6399CHARACTER(len=*):: cdat(:)
6400
6401integer :: i
6402
6403do i =1,size(this)
6405end do
6406
6407end SUBROUTINE dat_vect_display
6408
6409
6410FUNCTION to_char_dat(this,idat,rdat,ddat,bdat,cdat)
6411#ifdef HAVE_DBALLE
6412USE dballef
6413#endif
6414TYPE(vol7d_var),INTENT(in) :: this
6415!> real
6416REAL :: rdat
6417!> double precision
6418DOUBLE PRECISION :: ddat
6419!> integer
6420INTEGER :: idat
6421!> byte
6422INTEGER(kind=int_b) :: bdat
6423!> character
6424CHARACTER(len=*) :: cdat
6425CHARACTER(len=80) :: to_char_dat
6426
6427CHARACTER(len=LEN(to_char_dat)) :: to_char_tmp
6428
6429
6430#ifdef HAVE_DBALLE
6431INTEGER :: handle, ier
6432
6433handle = 0
6434to_char_dat="VALUE: "
6435
6440
6442 ier = idba_messaggi(handle,"/dev/null", "w", "BUFR")
6443 ier = idba_spiegab(handle,this%btable,cdat,to_char_tmp)
6444 ier = idba_fatto(handle)
6445 to_char_dat=trim(to_char_dat)//" ;char> "//trim(to_char_tmp)
6446endif
6447
6448#else
6449
6450to_char_dat="VALUE: "
6456
6457#endif
6458
6459END FUNCTION to_char_dat
6460
6461
6462!> Tests whether anything has ever been assigned to a vol7d object
6463!! (.TRUE.) or it is as clean as after an init (.FALSE.).
6464FUNCTION vol7d_c_e(this) RESULT(c_e)
6465TYPE(vol7d), INTENT(in) :: this
6466
6467LOGICAL :: c_e
6468
6470 ASSOCIATED(this%level) .OR. ASSOCIATED(this%timerange) .OR. &
6471 ASSOCIATED(this%network) .OR. &
6472 ASSOCIATED(this%anavar%r) .OR. ASSOCIATED(this%anavar%d) .OR. &
6473 ASSOCIATED(this%anavar%i) .OR. ASSOCIATED(this%anavar%b) .OR. &
6474 ASSOCIATED(this%anavar%c) .OR. &
6475 ASSOCIATED(this%anaattr%r) .OR. ASSOCIATED(this%anaattr%d) .OR. &
6476 ASSOCIATED(this%anaattr%i) .OR. ASSOCIATED(this%anaattr%b) .OR. &
6477 ASSOCIATED(this%anaattr%c) .OR. &
6478 ASSOCIATED(this%dativar%r) .OR. ASSOCIATED(this%dativar%d) .OR. &
6479 ASSOCIATED(this%dativar%i) .OR. ASSOCIATED(this%dativar%b) .OR. &
6480 ASSOCIATED(this%dativar%c) .OR. &
6481 ASSOCIATED(this%datiattr%r) .OR. ASSOCIATED(this%datiattr%d) .OR. &
6482 ASSOCIATED(this%datiattr%i) .OR. ASSOCIATED(this%datiattr%b) .OR. &
6483 ASSOCIATED(this%datiattr%c)
6484
6485END FUNCTION vol7d_c_e
6486
6487
6488!> Metodo per allocare i descrittori delle 7 dimensioni.
6489!! Riceve un grande numero di parametri opzionali che
6490!! indicano quali descrittori allocare e con quale estensione;
6491!! i descrittori non specificati non vengono toccati.
6492!! Può essere quindi chiamato più volte allocando via via
6493!! descrittori relativi a dimensioni diverse.
6494!! Se un descrittore richiesto è già allocato, viene deallocato
6495!! (perdendone l'eventuale contenuto) e riallocato con l'estensione
6496!! richiesta.
6497!! Per i descrittori relativi a dimensioni che non siano variabili o attributi,
6498!! è possibile specificare l'estensione di una dimensione a 0,
6499!! in tal caso il descrittore viene comunque allocato con lunghezza nulla,
6500!! che è diverso da non allocarlo. Per i descrittori di variabili e attributi
6501!! passare un'estensione 0 equivale a non fornire il parametro.
6502!! Avere uno o più descrittori dimensionati con estensione nulla fa sì
6503!! che anche il volume dati successivamente allocato abbia estensione nulla;
6504!! sebbene ciò appaia inutile, un volume del genere può in realtà servire,
6505!! in associazione ai metodi ::vol7d_merge o ::vol7d_append per estendere
6506!! un volume esistente aggiungendo elementi in alcune dimensioni (quelle
6507!! a estensione non nulla, ovviamente) e mantenendo invariato tutto il resto.
6508!! Per quanto riguarda i descrittori delle dimensioni relative alle
6509!! variabili, la relativa estensione è specificata con la nomenclatura
6510!! \a n<x><y><z> dove <x> può valere:
6511!! - \a ana per variabili relative a voumi di anagrafica
6512!! - \a dati per variabili relative a voumi di dati
6513!!
6514!! <y> può valere:
6515!! - \a var per variabili
6516!! - \a attr per attributi
6517!! - \a varattr variabili aventi attributi nei volumi di attributi
6518!!
6519!! <z> può valere:
6520!! - \a r per variabili o attributi a valori reali
6521!! - \a d per variabili o attributi a valori a doppia precisione
6522!! - \a i per variabili o attributi a valori interi
6523!! - \a b per variabili o attributi a valori byte
6524!! - \a c per variabili o attributi a valori carattere
6525!!
6526SUBROUTINE vol7d_alloc(this, nana, ntime, nlevel, ntimerange, nnetwork, &
6527 nanavarr, nanavard, nanavari, nanavarb, nanavarc, &
6528 nanaattrr, nanaattrd, nanaattri, nanaattrb, nanaattrc, &
6529 nanavarattrr, nanavarattrd, nanavarattri, nanavarattrb, nanavarattrc, &
6530 ndativarr, ndativard, ndativari, ndativarb, ndativarc, &
6531 ndatiattrr, ndatiattrd, ndatiattri, ndatiattrb, ndatiattrc, &
6532 ndativarattrr, ndativarattrd, ndativarattri, ndativarattrb, ndativarattrc, &
6533 ini)
6534TYPE(vol7d),INTENT(inout) :: this !< oggetto di cui allocare i descrittori
6535INTEGER,INTENT(in),OPTIONAL :: nana !< estensione della dimensione anagrafica
6536INTEGER,INTENT(in),OPTIONAL :: ntime !< estensione della dimensione tempo
6537INTEGER,INTENT(in),OPTIONAL :: nlevel !< estensione della dimensione livello varticale
6538INTEGER,INTENT(in),OPTIONAL :: ntimerange !< estensione della dimensione intervallo temporale (timerange)
6539INTEGER,INTENT(in),OPTIONAL :: nnetwork !< estensione della dimensione rete
6540!> estensione delle possibili dimensioni variabile
6541INTEGER,INTENT(in),OPTIONAL :: &
6542 nanavarr, nanavard, nanavari, nanavarb, nanavarc, &
6543 nanaattrr, nanaattrd, nanaattri, nanaattrb, nanaattrc, &
6544 nanavarattrr, nanavarattrd, nanavarattri, nanavarattrb, nanavarattrc, &
6545 ndativarr, ndativard, ndativari, ndativarb, ndativarc, &
6546 ndatiattrr, ndatiattrd, ndatiattri, ndatiattrb, ndatiattrc, &
6547 ndativarattrr, ndativarattrd, ndativarattri, ndativarattrb, ndativarattrc
6548LOGICAL,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
6549
6550INTEGER :: i
6551LOGICAL :: linit
6552
6553IF (PRESENT(ini)) THEN
6554 linit = ini
6555ELSE
6556 linit = .false.
6557ENDIF
6558
6559! Dimensioni principali
6560IF (PRESENT(nana)) THEN
6561 IF (nana >= 0) THEN
6562 IF (ASSOCIATED(this%ana)) DEALLOCATE(this%ana)
6563 ALLOCATE(this%ana(nana))
6564 IF (linit) THEN
6565 DO i = 1, nana
6567 ENDDO
6568 ENDIF
6569 ENDIF
6570ENDIF
6571IF (PRESENT(ntime)) THEN
6572 IF (ntime >= 0) THEN
6573 IF (ASSOCIATED(this%time)) DEALLOCATE(this%time)
6574 ALLOCATE(this%time(ntime))
6575 IF (linit) THEN
6576 DO i = 1, ntime
6578 ENDDO
6579 ENDIF
6580 ENDIF
6581ENDIF
6582IF (PRESENT(nlevel)) THEN
6583 IF (nlevel >= 0) THEN
6584 IF (ASSOCIATED(this%level)) DEALLOCATE(this%level)
6585 ALLOCATE(this%level(nlevel))
6586 IF (linit) THEN
6587 DO i = 1, nlevel
6589 ENDDO
6590 ENDIF
6591 ENDIF
6592ENDIF
6593IF (PRESENT(ntimerange)) THEN
6594 IF (ntimerange >= 0) THEN
6595 IF (ASSOCIATED(this%timerange)) DEALLOCATE(this%timerange)
6596 ALLOCATE(this%timerange(ntimerange))
6597 IF (linit) THEN
6598 DO i = 1, ntimerange
6600 ENDDO
6601 ENDIF
6602 ENDIF
6603ENDIF
6604IF (PRESENT(nnetwork)) THEN
6605 IF (nnetwork >= 0) THEN
6606 IF (ASSOCIATED(this%network)) DEALLOCATE(this%network)
6607 ALLOCATE(this%network(nnetwork))
6608 IF (linit) THEN
6609 DO i = 1, nnetwork
6611 ENDDO
6612 ENDIF
6613 ENDIF
6614ENDIF
6615! Dimensioni dei tipi delle variabili
6616CALL vol7d_varvect_alloc(this%anavar, nanavarr, nanavard, &
6617 nanavari, nanavarb, nanavarc, ini)
6618CALL vol7d_varvect_alloc(this%anaattr, nanaattrr, nanaattrd, &
6619 nanaattri, nanaattrb, nanaattrc, ini)
6620CALL vol7d_varvect_alloc(this%anavarattr, nanavarattrr, nanavarattrd, &
6621 nanavarattri, nanavarattrb, nanavarattrc, ini)
6622CALL vol7d_varvect_alloc(this%dativar, ndativarr, ndativard, &
6623 ndativari, ndativarb, ndativarc, ini)
6624CALL vol7d_varvect_alloc(this%datiattr, ndatiattrr, ndatiattrd, &
6625 ndatiattri, ndatiattrb, ndatiattrc, ini)
6626CALL vol7d_varvect_alloc(this%dativarattr, ndativarattrr, ndativarattrd, &
6627 ndativarattri, ndativarattrb, ndativarattrc, ini)
6628
6629END SUBROUTINE vol7d_alloc
6630
6631
6632FUNCTION vol7d_check_alloc_ana(this)
6633TYPE(vol7d),INTENT(in) :: this
6634LOGICAL :: vol7d_check_alloc_ana
6635
6636vol7d_check_alloc_ana = ASSOCIATED(this%ana) .AND. ASSOCIATED(this%network)
6637
6638END FUNCTION vol7d_check_alloc_ana
6639
6640SUBROUTINE vol7d_force_alloc_ana(this, ini)
6641TYPE(vol7d),INTENT(inout) :: this
6642LOGICAL,INTENT(in),OPTIONAL :: ini
6643
6644! Alloco i descrittori minimi per avere un volume di anagrafica
6645IF (.NOT. ASSOCIATED(this%ana)) CALL vol7d_alloc(this, nana=1, ini=ini)
6646IF (.NOT. ASSOCIATED(this%network)) CALL vol7d_alloc(this, nnetwork=1, ini=ini)
6647
6648END SUBROUTINE vol7d_force_alloc_ana
6649
6650
6651FUNCTION vol7d_check_alloc_dati(this)
6652TYPE(vol7d),INTENT(in) :: this
6653LOGICAL :: vol7d_check_alloc_dati
6654
6655vol7d_check_alloc_dati = vol7d_check_alloc_ana(this) .AND. &
6656 ASSOCIATED(this%time) .AND. ASSOCIATED(this%level) .AND. &
6657 ASSOCIATED(this%timerange)
6658
6659END FUNCTION vol7d_check_alloc_dati
6660
6661SUBROUTINE vol7d_force_alloc_dati(this, ini)
6662TYPE(vol7d),INTENT(inout) :: this
6663LOGICAL,INTENT(in),OPTIONAL :: ini
6664
6665! Alloco i descrittori minimi per avere un volume di dati
6666CALL vol7d_force_alloc_ana(this, ini)
6667IF (.NOT. ASSOCIATED(this%time)) CALL vol7d_alloc(this, ntime=1, ini=ini)
6668IF (.NOT. ASSOCIATED(this%level)) CALL vol7d_alloc(this, nlevel=1, ini=ini)
6669IF (.NOT. ASSOCIATED(this%timerange)) CALL vol7d_alloc(this, ntimerange=1, ini=ini)
6670
6671END SUBROUTINE vol7d_force_alloc_dati
6672
6673
6674SUBROUTINE vol7d_force_alloc(this)
6675TYPE(vol7d),INTENT(inout) :: this
6676
6677! If anything really not allocated yet, allocate with size 0
6678IF (.NOT. ASSOCIATED(this%ana)) CALL vol7d_alloc(this, nana=0)
6679IF (.NOT. ASSOCIATED(this%network)) CALL vol7d_alloc(this, nnetwork=0)
6680IF (.NOT. ASSOCIATED(this%time)) CALL vol7d_alloc(this, ntime=0)
6681IF (.NOT. ASSOCIATED(this%level)) CALL vol7d_alloc(this, nlevel=0)
6682IF (.NOT. ASSOCIATED(this%timerange)) CALL vol7d_alloc(this, ntimerange=0)
6683
6684END SUBROUTINE vol7d_force_alloc
6685
6686
6687FUNCTION vol7d_check_vol(this)
6688TYPE(vol7d),INTENT(in) :: this !< oggetto da controllare
6689LOGICAL :: vol7d_check_vol
6690
6691vol7d_check_vol = c_e(this)
6692
6693! Anagrafica
6694IF (ASSOCIATED(this%anavar%r) .AND. .NOT.ASSOCIATED(this%volanar)) THEN
6695 vol7d_check_vol = .false.
6696ENDIF
6697
6698IF (ASSOCIATED(this%anavar%d) .AND. .NOT.ASSOCIATED(this%volanad)) THEN
6699 vol7d_check_vol = .false.
6700ENDIF
6701
6702IF (ASSOCIATED(this%anavar%i) .AND. .NOT.ASSOCIATED(this%volanai)) THEN
6703 vol7d_check_vol = .false.
6704ENDIF
6705
6706IF (ASSOCIATED(this%anavar%b) .AND. .NOT.ASSOCIATED(this%volanab)) THEN
6707 vol7d_check_vol = .false.
6708ENDIF
6709
6710IF (ASSOCIATED(this%anavar%c) .AND. .NOT.ASSOCIATED(this%volanac)) THEN
6711 vol7d_check_vol = .false.
6712ENDIF
6713IF (ASSOCIATED(this%anavar%r) .OR. ASSOCIATED(this%anavar%d) .OR. &
6714 ASSOCIATED(this%anavar%i) .OR. ASSOCIATED(this%anavar%b) .OR. &
6715 ASSOCIATED(this%anavar%c)) THEN
6716 vol7d_check_vol = vol7d_check_vol .AND. vol7d_check_alloc_ana(this)
6717ENDIF
6718
6719! Attributi dell'anagrafica
6720IF (ASSOCIATED(this%anaattr%r) .AND. ASSOCIATED(this%anavarattr%r) .AND. &
6721 .NOT.ASSOCIATED(this%volanaattrr)) THEN
6722 vol7d_check_vol = .false.
6723ENDIF
6724
6725IF (ASSOCIATED(this%anaattr%d) .AND. ASSOCIATED(this%anavarattr%d) .AND. &
6726 .NOT.ASSOCIATED(this%volanaattrd)) THEN
6727 vol7d_check_vol = .false.
6728ENDIF
6729
6730IF (ASSOCIATED(this%anaattr%i) .AND. ASSOCIATED(this%anavarattr%i) .AND. &
6731 .NOT.ASSOCIATED(this%volanaattri)) THEN
6732 vol7d_check_vol = .false.
6733ENDIF
6734
6735IF (ASSOCIATED(this%anaattr%b) .AND. ASSOCIATED(this%anavarattr%b) .AND. &
6736 .NOT.ASSOCIATED(this%volanaattrb)) THEN
6737 vol7d_check_vol = .false.
6738ENDIF
6739
6740IF (ASSOCIATED(this%anaattr%c) .AND. ASSOCIATED(this%anavarattr%c) .AND. &
6741 .NOT.ASSOCIATED(this%volanaattrc)) THEN
6742 vol7d_check_vol = .false.
6743ENDIF
6744
6745! Dati
6746IF (ASSOCIATED(this%dativar%r) .AND. .NOT.ASSOCIATED(this%voldatir)) THEN
6747 vol7d_check_vol = .false.
6748ENDIF
6749
6750IF (ASSOCIATED(this%dativar%d) .AND. .NOT.ASSOCIATED(this%voldatid)) THEN
6751 vol7d_check_vol = .false.
6752ENDIF
6753
6754IF (ASSOCIATED(this%dativar%i) .AND. .NOT.ASSOCIATED(this%voldatii)) THEN
6755 vol7d_check_vol = .false.
6756ENDIF
6757
6758IF (ASSOCIATED(this%dativar%b) .AND. .NOT.ASSOCIATED(this%voldatib)) THEN
6759 vol7d_check_vol = .false.
6760ENDIF
6761
6762IF (ASSOCIATED(this%dativar%c) .AND. .NOT.ASSOCIATED(this%voldatic)) THEN
6763 vol7d_check_vol = .false.
6764ENDIF
6765
6766! Attributi dei dati
6767IF (ASSOCIATED(this%datiattr%r) .AND. ASSOCIATED(this%dativarattr%r) .AND. &
6768 .NOT.ASSOCIATED(this%voldatiattrr)) THEN
6769 vol7d_check_vol = .false.
6770ENDIF
6771
6772IF (ASSOCIATED(this%datiattr%d) .AND. ASSOCIATED(this%dativarattr%d) .AND. &
6773 .NOT.ASSOCIATED(this%voldatiattrd)) THEN
6774 vol7d_check_vol = .false.
6775ENDIF
6776
6777IF (ASSOCIATED(this%datiattr%i) .AND. ASSOCIATED(this%dativarattr%i) .AND. &
6778 .NOT.ASSOCIATED(this%voldatiattri)) THEN
6779 vol7d_check_vol = .false.
6780ENDIF
6781
6782IF (ASSOCIATED(this%datiattr%b) .AND. ASSOCIATED(this%dativarattr%b) .AND. &
6783 .NOT.ASSOCIATED(this%voldatiattrb)) THEN
6784 vol7d_check_vol = .false.
6785ENDIF
6786
6787IF (ASSOCIATED(this%datiattr%c) .AND. ASSOCIATED(this%dativarattr%c) .AND. &
6788 .NOT.ASSOCIATED(this%voldatiattrc)) THEN
6789 vol7d_check_vol = .false.
6790ENDIF
6791IF (ASSOCIATED(this%dativar%r) .OR. ASSOCIATED(this%dativar%d) .OR. &
6792 ASSOCIATED(this%dativar%i) .OR. ASSOCIATED(this%dativar%b) .OR. &
6793 ASSOCIATED(this%dativar%c)) THEN
6794 vol7d_check_vol = vol7d_check_vol .AND. vol7d_check_alloc_dati(this)
6795ENDIF
6796
6797END FUNCTION vol7d_check_vol
6798
6799
6800!> Metodo per allocare i volumi richiesti di variabili e attributi per
6801!! anagrafica e dati.
6802!! Se alcuni dei descrittori relativi alle dimensioni anagrafica,
6803!! livello verticale, tempo, intervallo temporale (timerange), rete non sono
6804!! stati richiesti preventivamente con la ::vol7d_alloc, essi vengono allocati
6805!! automaticamente da questo metodo
6806!! con estensione di default pari a 1 (non 0!), questo significa, ad esempio,
6807!! che se prevedo di avere soli dati superficiali, cioè ad un solo livello
6808!! verticale, o una sola rete di stazioni, non devo preoccuparmi di
6809!! specificare questa informazione.
6810!! Tra i 20 possibili volumi allocabili
6811!! ((variabili,attributi)*(anagrafica,dati)*(r,d,i,b,c)=20)
6812!! saranno allocati solo quelli per cui è stato precedentemente richiesto il
6813!! corrispondente descrittore variabili/attributi con la ::vol7d_alloc.
6814SUBROUTINE vol7d_alloc_vol(this, ini, inivol)
6815TYPE(vol7d),INTENT(inout) :: this !< oggetto di cui allocare i volumi
6816LOGICAL,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
6817LOGICAL,INTENT(in),OPTIONAL :: inivol !< se fornito e vale \c .TRUE., i volumi allocati saranno inizializzati a valore mancante
6818
6819LOGICAL :: linivol
6820
6821IF (PRESENT(inivol)) THEN
6822 linivol = inivol
6823ELSE
6824 linivol = .true.
6825ENDIF
6826
6827! Anagrafica
6828IF (ASSOCIATED(this%anavar%r) .AND. .NOT.ASSOCIATED(this%volanar)) THEN
6829 CALL vol7d_force_alloc_ana(this, ini)
6830 ALLOCATE(this%volanar(SIZE(this%ana), SIZE(this%anavar%r), SIZE(this%network)))
6831 IF (linivol) this%volanar(:,:,:) = rmiss
6832ENDIF
6833
6834IF (ASSOCIATED(this%anavar%d) .AND. .NOT.ASSOCIATED(this%volanad)) THEN
6835 CALL vol7d_force_alloc_ana(this, ini)
6836 ALLOCATE(this%volanad(SIZE(this%ana), SIZE(this%anavar%d), SIZE(this%network)))
6837 IF (linivol) this%volanad(:,:,:) = rdmiss
6838ENDIF
6839
6840IF (ASSOCIATED(this%anavar%i) .AND. .NOT.ASSOCIATED(this%volanai)) THEN
6841 CALL vol7d_force_alloc_ana(this, ini)
6842 ALLOCATE(this%volanai(SIZE(this%ana), SIZE(this%anavar%i), SIZE(this%network)))
6843 IF (linivol) this%volanai(:,:,:) = imiss
6844ENDIF
6845
6846IF (ASSOCIATED(this%anavar%b) .AND. .NOT.ASSOCIATED(this%volanab)) THEN
6847 CALL vol7d_force_alloc_ana(this, ini)
6848 ALLOCATE(this%volanab(SIZE(this%ana), SIZE(this%anavar%b), SIZE(this%network)))
6849 IF (linivol) this%volanab(:,:,:) = ibmiss
6850ENDIF
6851
6852IF (ASSOCIATED(this%anavar%c) .AND. .NOT.ASSOCIATED(this%volanac)) THEN
6853 CALL vol7d_force_alloc_ana(this, ini)
6854 ALLOCATE(this%volanac(SIZE(this%ana), SIZE(this%anavar%c), SIZE(this%network)))
6855 IF (linivol) this%volanac(:,:,:) = cmiss
6856ENDIF
6857
6858! Attributi dell'anagrafica
6859IF (ASSOCIATED(this%anaattr%r) .AND. ASSOCIATED(this%anavarattr%r) .AND. &
6860 .NOT.ASSOCIATED(this%volanaattrr)) THEN
6861 CALL vol7d_force_alloc_ana(this, ini)
6862 ALLOCATE(this%volanaattrr(SIZE(this%ana), SIZE(this%anavarattr%r), &
6863 SIZE(this%network), SIZE(this%anaattr%r)))
6864 IF (linivol) this%volanaattrr(:,:,:,:) = rmiss
6865ENDIF
6866
6867IF (ASSOCIATED(this%anaattr%d) .AND. ASSOCIATED(this%anavarattr%d) .AND. &
6868 .NOT.ASSOCIATED(this%volanaattrd)) THEN
6869 CALL vol7d_force_alloc_ana(this, ini)
6870 ALLOCATE(this%volanaattrd(SIZE(this%ana), SIZE(this%anavarattr%d), &
6871 SIZE(this%network), SIZE(this%anaattr%d)))
6872 IF (linivol) this%volanaattrd(:,:,:,:) = rdmiss
6873ENDIF
6874
6875IF (ASSOCIATED(this%anaattr%i) .AND. ASSOCIATED(this%anavarattr%i) .AND. &
6876 .NOT.ASSOCIATED(this%volanaattri)) THEN
6877 CALL vol7d_force_alloc_ana(this, ini)
6878 ALLOCATE(this%volanaattri(SIZE(this%ana), SIZE(this%anavarattr%i), &
6879 SIZE(this%network), SIZE(this%anaattr%i)))
6880 IF (linivol) this%volanaattri(:,:,:,:) = imiss
6881ENDIF
6882
6883IF (ASSOCIATED(this%anaattr%b) .AND. ASSOCIATED(this%anavarattr%b) .AND. &
6884 .NOT.ASSOCIATED(this%volanaattrb)) THEN
6885 CALL vol7d_force_alloc_ana(this, ini)
6886 ALLOCATE(this%volanaattrb(SIZE(this%ana), SIZE(this%anavarattr%b), &
6887 SIZE(this%network), SIZE(this%anaattr%b)))
6888 IF (linivol) this%volanaattrb(:,:,:,:) = ibmiss
6889ENDIF
6890
6891IF (ASSOCIATED(this%anaattr%c) .AND. ASSOCIATED(this%anavarattr%c) .AND. &
6892 .NOT.ASSOCIATED(this%volanaattrc)) THEN
6893 CALL vol7d_force_alloc_ana(this, ini)
6894 ALLOCATE(this%volanaattrc(SIZE(this%ana), SIZE(this%anavarattr%c), &
6895 SIZE(this%network), SIZE(this%anaattr%c)))
6896 IF (linivol) this%volanaattrc(:,:,:,:) = cmiss
6897ENDIF
6898
6899! Dati
6900IF (ASSOCIATED(this%dativar%r) .AND. .NOT.ASSOCIATED(this%voldatir)) THEN
6901 CALL vol7d_force_alloc_dati(this, ini)
6902 ALLOCATE(this%voldatir(SIZE(this%ana), SIZE(this%time), SIZE(this%level), &
6903 SIZE(this%timerange), SIZE(this%dativar%r), SIZE(this%network)))
6904 IF (linivol) this%voldatir(:,:,:,:,:,:) = rmiss
6905ENDIF
6906
6907IF (ASSOCIATED(this%dativar%d) .AND. .NOT.ASSOCIATED(this%voldatid)) THEN
6908 CALL vol7d_force_alloc_dati(this, ini)
6909 ALLOCATE(this%voldatid(SIZE(this%ana), SIZE(this%time), SIZE(this%level), &
6910 SIZE(this%timerange), SIZE(this%dativar%d), SIZE(this%network)))
6911 IF (linivol) this%voldatid(:,:,:,:,:,:) = rdmiss
6912ENDIF
6913
6914IF (ASSOCIATED(this%dativar%i) .AND. .NOT.ASSOCIATED(this%voldatii)) THEN
6915 CALL vol7d_force_alloc_dati(this, ini)
6916 ALLOCATE(this%voldatii(SIZE(this%ana), SIZE(this%time), SIZE(this%level), &
6917 SIZE(this%timerange), SIZE(this%dativar%i), SIZE(this%network)))
6918 IF (linivol) this%voldatii(:,:,:,:,:,:) = imiss
6919ENDIF
6920
6921IF (ASSOCIATED(this%dativar%b) .AND. .NOT.ASSOCIATED(this%voldatib)) THEN
6922 CALL vol7d_force_alloc_dati(this, ini)
6923 ALLOCATE(this%voldatib(SIZE(this%ana), SIZE(this%time), SIZE(this%level), &
6924 SIZE(this%timerange), SIZE(this%dativar%b), SIZE(this%network)))
6925 IF (linivol) this%voldatib(:,:,:,:,:,:) = ibmiss
6926ENDIF
6927
6928IF (ASSOCIATED(this%dativar%c) .AND. .NOT.ASSOCIATED(this%voldatic)) THEN
6929 CALL vol7d_force_alloc_dati(this, ini)
6930 ALLOCATE(this%voldatic(SIZE(this%ana), SIZE(this%time), SIZE(this%level), &
6931 SIZE(this%timerange), SIZE(this%dativar%c), SIZE(this%network)))
6932 IF (linivol) this%voldatic(:,:,:,:,:,:) = cmiss
6933ENDIF
6934
6935! Attributi dei dati
6936IF (ASSOCIATED(this%datiattr%r) .AND. ASSOCIATED(this%dativarattr%r) .AND. &
6937 .NOT.ASSOCIATED(this%voldatiattrr)) THEN
6938 CALL vol7d_force_alloc_dati(this, ini)
6939 ALLOCATE(this%voldatiattrr(SIZE(this%ana), SIZE(this%time), SIZE(this%level), &
6940 SIZE(this%timerange), SIZE(this%dativarattr%r), SIZE(this%network), &
6941 SIZE(this%datiattr%r)))
6942 IF (linivol) this%voldatiattrr(:,:,:,:,:,:,:) = rmiss
6943ENDIF
6944
6945IF (ASSOCIATED(this%datiattr%d) .AND. ASSOCIATED(this%dativarattr%d) .AND. &
6946 .NOT.ASSOCIATED(this%voldatiattrd)) THEN
6947 CALL vol7d_force_alloc_dati(this, ini)
6948 ALLOCATE(this%voldatiattrd(SIZE(this%ana), SIZE(this%time), SIZE(this%level), &
6949 SIZE(this%timerange), SIZE(this%dativarattr%d), SIZE(this%network), &
6950 SIZE(this%datiattr%d)))
6951 IF (linivol) this%voldatiattrd(:,:,:,:,:,:,:) = rdmiss
6952ENDIF
6953
6954IF (ASSOCIATED(this%datiattr%i) .AND. ASSOCIATED(this%dativarattr%i) .AND. &
6955 .NOT.ASSOCIATED(this%voldatiattri)) THEN
6956 CALL vol7d_force_alloc_dati(this, ini)
6957 ALLOCATE(this%voldatiattri(SIZE(this%ana), SIZE(this%time), SIZE(this%level), &
6958 SIZE(this%timerange), SIZE(this%dativarattr%i), SIZE(this%network), &
6959 SIZE(this%datiattr%i)))
6960 IF (linivol) this%voldatiattri(:,:,:,:,:,:,:) = imiss
6961ENDIF
6962
6963IF (ASSOCIATED(this%datiattr%b) .AND. ASSOCIATED(this%dativarattr%b) .AND. &
6964 .NOT.ASSOCIATED(this%voldatiattrb)) THEN
6965 CALL vol7d_force_alloc_dati(this, ini)
6966 ALLOCATE(this%voldatiattrb(SIZE(this%ana), SIZE(this%time), SIZE(this%level), &
6967 SIZE(this%timerange), SIZE(this%dativarattr%b), SIZE(this%network), &
6968 SIZE(this%datiattr%b)))
6969 IF (linivol) this%voldatiattrb(:,:,:,:,:,:,:) = ibmiss
6970ENDIF
6971
6972IF (ASSOCIATED(this%datiattr%c) .AND. ASSOCIATED(this%dativarattr%c) .AND. &
6973 .NOT.ASSOCIATED(this%voldatiattrc)) THEN
6974 CALL vol7d_force_alloc_dati(this, ini)
6975 ALLOCATE(this%voldatiattrc(SIZE(this%ana), SIZE(this%time), SIZE(this%level), &
6976 SIZE(this%timerange), SIZE(this%dativarattr%c), SIZE(this%network), &
6977 SIZE(this%datiattr%c)))
6978 IF (linivol) this%voldatiattrc(:,:,:,:,:,:,:) = cmiss
6979ENDIF
6980
6981! Catch-all method
6982CALL vol7d_force_alloc(this)
6983
6984! Creo gli indici var-attr
6985
6986#ifdef DEBUG
6987CALL l4f_log(l4f_debug,"calling: vol7d_set_attr_ind")
6988#endif
6989
6990CALL vol7d_set_attr_ind(this)
6991
6992
6993
6994END SUBROUTINE vol7d_alloc_vol
6995
6996
6997!> Metodo per creare gli indici che associano le variabili aventi attributo
6998!! alle variabili nei relativi descrittori.
6999!! Ha senso chiamare questo metodo solo dopo che i descrittori delle variabili
7000!! e degli attributi desiderati sono stati allocati ed è stato assegnato un
7001!! valore ai relativi membri btable (vedi vol7d_var_class::vol7d_var), se
7002!! i descrittori non sono stati allocati o assegnati, il metodo non fa niente.
7003SUBROUTINE vol7d_set_attr_ind(this)
7004TYPE(vol7d),INTENT(inout) :: this !< oggetto in cui creare gli indici
7005
7006INTEGER :: i
7007
7008! real
7009IF (ASSOCIATED(this%dativar%r)) THEN
7010 IF (ASSOCIATED(this%dativarattr%r)) THEN
7011 DO i = 1, SIZE(this%dativar%r)
7012 this%dativar%r(i)%r = &
7013 firsttrue(this%dativar%r(i)%btable == this%dativarattr%r(:)%btable)
7014 ENDDO
7015 ENDIF
7016
7017 IF (ASSOCIATED(this%dativarattr%d)) THEN
7018 DO i = 1, SIZE(this%dativar%r)
7019 this%dativar%r(i)%d = &
7020 firsttrue(this%dativar%r(i)%btable == this%dativarattr%d(:)%btable)
7021 ENDDO
7022 ENDIF
7023
7024 IF (ASSOCIATED(this%dativarattr%i)) THEN
7025 DO i = 1, SIZE(this%dativar%r)
7026 this%dativar%r(i)%i = &
7027 firsttrue(this%dativar%r(i)%btable == this%dativarattr%i(:)%btable)
7028 ENDDO
7029 ENDIF
7030
7031 IF (ASSOCIATED(this%dativarattr%b)) THEN
7032 DO i = 1, SIZE(this%dativar%r)
7033 this%dativar%r(i)%b = &
7034 firsttrue(this%dativar%r(i)%btable == this%dativarattr%b(:)%btable)
7035 ENDDO
7036 ENDIF
7037
7038 IF (ASSOCIATED(this%dativarattr%c)) THEN
7039 DO i = 1, SIZE(this%dativar%r)
7040 this%dativar%r(i)%c = &
7041 firsttrue(this%dativar%r(i)%btable == this%dativarattr%c(:)%btable)
7042 ENDDO
7043 ENDIF
7044ENDIF
7045! double
7046IF (ASSOCIATED(this%dativar%d)) THEN
7047 IF (ASSOCIATED(this%dativarattr%r)) THEN
7048 DO i = 1, SIZE(this%dativar%d)
7049 this%dativar%d(i)%r = &
7050 firsttrue(this%dativar%d(i)%btable == this%dativarattr%r(:)%btable)
7051 ENDDO
7052 ENDIF
7053
7054 IF (ASSOCIATED(this%dativarattr%d)) THEN
7055 DO i = 1, SIZE(this%dativar%d)
7056 this%dativar%d(i)%d = &
7057 firsttrue(this%dativar%d(i)%btable == this%dativarattr%d(:)%btable)
7058 ENDDO
7059 ENDIF
7060
7061 IF (ASSOCIATED(this%dativarattr%i)) THEN
7062 DO i = 1, SIZE(this%dativar%d)
7063 this%dativar%d(i)%i = &
7064 firsttrue(this%dativar%d(i)%btable == this%dativarattr%i(:)%btable)
7065 ENDDO
7066 ENDIF
7067
7068 IF (ASSOCIATED(this%dativarattr%b)) THEN
7069 DO i = 1, SIZE(this%dativar%d)
7070 this%dativar%d(i)%b = &
7071 firsttrue(this%dativar%d(i)%btable == this%dativarattr%b(:)%btable)
7072 ENDDO
7073 ENDIF
7074
7075 IF (ASSOCIATED(this%dativarattr%c)) THEN
7076 DO i = 1, SIZE(this%dativar%d)
7077 this%dativar%d(i)%c = &
7078 firsttrue(this%dativar%d(i)%btable == this%dativarattr%c(:)%btable)
7079 ENDDO
7080 ENDIF
7081ENDIF
7082! integer
7083IF (ASSOCIATED(this%dativar%i)) THEN
7084 IF (ASSOCIATED(this%dativarattr%r)) THEN
7085 DO i = 1, SIZE(this%dativar%i)
7086 this%dativar%i(i)%r = &
7087 firsttrue(this%dativar%i(i)%btable == this%dativarattr%r(:)%btable)
7088 ENDDO
7089 ENDIF
7090
7091 IF (ASSOCIATED(this%dativarattr%d)) THEN
7092 DO i = 1, SIZE(this%dativar%i)
7093 this%dativar%i(i)%d = &
7094 firsttrue(this%dativar%i(i)%btable == this%dativarattr%d(:)%btable)
7095 ENDDO
7096 ENDIF
7097
7098 IF (ASSOCIATED(this%dativarattr%i)) THEN
7099 DO i = 1, SIZE(this%dativar%i)
7100 this%dativar%i(i)%i = &
7101 firsttrue(this%dativar%i(i)%btable == this%dativarattr%i(:)%btable)
7102 ENDDO
7103 ENDIF
7104
7105 IF (ASSOCIATED(this%dativarattr%b)) THEN
7106 DO i = 1, SIZE(this%dativar%i)
7107 this%dativar%i(i)%b = &
7108 firsttrue(this%dativar%i(i)%btable == this%dativarattr%b(:)%btable)
7109 ENDDO
7110 ENDIF
7111
7112 IF (ASSOCIATED(this%dativarattr%c)) THEN
7113 DO i = 1, SIZE(this%dativar%i)
7114 this%dativar%i(i)%c = &
7115 firsttrue(this%dativar%i(i)%btable == this%dativarattr%c(:)%btable)
7116 ENDDO
7117 ENDIF
7118ENDIF
7119! byte
7120IF (ASSOCIATED(this%dativar%b)) THEN
7121 IF (ASSOCIATED(this%dativarattr%r)) THEN
7122 DO i = 1, SIZE(this%dativar%b)
7123 this%dativar%b(i)%r = &
7124 firsttrue(this%dativar%b(i)%btable == this%dativarattr%r(:)%btable)
7125 ENDDO
7126 ENDIF
7127
7128 IF (ASSOCIATED(this%dativarattr%d)) THEN
7129 DO i = 1, SIZE(this%dativar%b)
7130 this%dativar%b(i)%d = &
7131 firsttrue(this%dativar%b(i)%btable == this%dativarattr%d(:)%btable)
7132 ENDDO
7133 ENDIF
7134
7135 IF (ASSOCIATED(this%dativarattr%i)) THEN
7136 DO i = 1, SIZE(this%dativar%b)
7137 this%dativar%b(i)%i = &
7138 firsttrue(this%dativar%b(i)%btable == this%dativarattr%i(:)%btable)
7139 ENDDO
7140 ENDIF
7141
7142 IF (ASSOCIATED(this%dativarattr%b)) THEN
7143 DO i = 1, SIZE(this%dativar%b)
7144 this%dativar%b(i)%b = &
7145 firsttrue(this%dativar%b(i)%btable == this%dativarattr%b(:)%btable)
7146 ENDDO
7147 ENDIF
7148
7149 IF (ASSOCIATED(this%dativarattr%c)) THEN
7150 DO i = 1, SIZE(this%dativar%b)
7151 this%dativar%b(i)%c = &
7152 firsttrue(this%dativar%b(i)%btable == this%dativarattr%c(:)%btable)
7153 ENDDO
7154 ENDIF
7155ENDIF
7156! character
7157IF (ASSOCIATED(this%dativar%c)) THEN
7158 IF (ASSOCIATED(this%dativarattr%r)) THEN
7159 DO i = 1, SIZE(this%dativar%c)
7160 this%dativar%c(i)%r = &
7161 firsttrue(this%dativar%c(i)%btable == this%dativarattr%r(:)%btable)
7162 ENDDO
7163 ENDIF
7164
7165 IF (ASSOCIATED(this%dativarattr%d)) THEN
7166 DO i = 1, SIZE(this%dativar%c)
7167 this%dativar%c(i)%d = &
7168 firsttrue(this%dativar%c(i)%btable == this%dativarattr%d(:)%btable)
7169 ENDDO
7170 ENDIF
7171
7172 IF (ASSOCIATED(this%dativarattr%i)) THEN
7173 DO i = 1, SIZE(this%dativar%c)
7174 this%dativar%c(i)%i = &
7175 firsttrue(this%dativar%c(i)%btable == this%dativarattr%i(:)%btable)
7176 ENDDO
7177 ENDIF
7178
7179 IF (ASSOCIATED(this%dativarattr%b)) THEN
7180 DO i = 1, SIZE(this%dativar%c)
7181 this%dativar%c(i)%b = &
7182 firsttrue(this%dativar%c(i)%btable == this%dativarattr%b(:)%btable)
7183 ENDDO
7184 ENDIF
7185
7186 IF (ASSOCIATED(this%dativarattr%c)) THEN
7187 DO i = 1, SIZE(this%dativar%c)
7188 this%dativar%c(i)%c = &
7189 firsttrue(this%dativar%c(i)%btable == this%dativarattr%c(:)%btable)
7190 ENDDO
7191 ENDIF
7192ENDIF
7193
7194END SUBROUTINE vol7d_set_attr_ind
7195
7196
7197!> Metodo per fondere 2 oggetti vol7d.
7198!! Il secondo volume viene accodato al primo e poi distrutto, si veda
7199!! quindi la descrizione di ::vol7d_append. Se uno degli oggetti \a
7200!! this o \a that sono vuoti non perde tempo inutile,
7201SUBROUTINE vol7d_merge(this, that, sort, bestdata, &
7202 ltimesimple, ltimerangesimple, llevelsimple, lanasimple)
7203TYPE(vol7d),INTENT(INOUT) :: this !< primo oggetto in ingresso, alla fine conterrà il risultato della fusione
7204TYPE(vol7d),INTENT(INOUT) :: that !< secondo oggetto in ingresso, alla fine sarà distrutto
7205LOGICAL,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
7206LOGICAL,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
7207LOGICAL,INTENT(IN),OPTIONAL :: ltimesimple, ltimerangesimple, llevelsimple, lanasimple ! experimental, please do not use outside the library now
7208
7209TYPE(vol7d) :: v7d_clean
7210
7211
7213 this = that
7215 that = v7d_clean ! destroy that without deallocating
7216ELSE ! Append that to this and destroy that
7218 ltimesimple, ltimerangesimple, llevelsimple, lanasimple)
7220ENDIF
7221
7222END SUBROUTINE vol7d_merge
7223
7224
7225!> Metodo per accodare un oggetto vol7d ad un altro.
7226!! Si tratta di un metodo molto potente e versatile;
7227!! i descrittori delle dimensioni del volume finale conterranno i valori
7228!! dei corrispondenti descrittori del primo e del secondo volume
7229!! e i volumi di anagrafica e dati conterranno i valori dei due volumi
7230!! ai posti giusti, e valori mancanti per le nuove combinazioni che
7231!! eventualmente si verranno a creare.
7232!! Se i volumi multidimensionali di anagrafica e/o dati dei 2 oggetti
7233!! hanno un'intersezione non nulla, negli elementi comuni il volume finale
7234!! conterrà il corrispondente elemento del \b secondo volume.
7235!! Attenzione che, durante l'esecuzione del metodo, la memoria richiesta è
7236!! pari alla memoria complessiva occupata dai 2 volumi iniziali più
7237!! la memoria complessiva del volume finale, per cui, nel caso di volumi grandi,
7238!! ci potrebbero essere problemi di esaurimento della memoria centrale.
7239!! Se l'oggetto \a that è vuoto non perde tempo inutile,
7240!!
7241!! \todo nel caso di elementi comuni inserire la possibiità (opzionale per
7242!! non penalizzare le prestazioni quando ciò non serve) di effettuare una scelta
7243!! più ragionata dell'elemento da tenere, almeno controllando i dati mancanti
7244!! se non le flag di qualità
7245!!
7246!! \todo "rateizzare" l'allocazione dei volumi per ridurre l'occupazione di
7247!! memoria nel caso siano allocati contemporaneamente volumi di variabili e
7248!! di attributi o più volumi di tipi diversi
7249!!
7250!! \todo il parametro \a that è dichiarato \a INOUT perché la vol7d_alloc_vol
7251!! può modificarlo, bisognerebbe implementare una vol7d_check_vol che restituisca
7252!! errore anziché usare la vol7d_alloc_vol.
7253SUBROUTINE vol7d_append(this, that, sort, bestdata, &
7254 ltimesimple, ltimerangesimple, llevelsimple, lanasimple, lnetworksimple)
7255TYPE(vol7d),INTENT(INOUT) :: this !< primo oggetto in ingresso, a cui sarà accodato il secondo
7256TYPE(vol7d),INTENT(IN) :: that !< secondo oggetto in ingresso, non viene modificato dal metodo
7257LOGICAL,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
7258! experimental, please do not use outside the library now, they force the use
7259! of a simplified mapping algorithm which is valid only whene the dimension
7260! content is the same in both volumes , or when one of them is empty
7261LOGICAL,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
7262LOGICAL,INTENT(IN),OPTIONAL :: ltimesimple, ltimerangesimple, llevelsimple, lanasimple, lnetworksimple
7263
7264
7265TYPE(vol7d) :: v7dtmp
7266LOGICAL :: lsort, lbestdata
7267INTEGER,POINTER :: remapt1(:), remapt2(:), remaptr1(:), remaptr2(:), &
7268 remapl1(:), remapl2(:), remapa1(:), remapa2(:), remapn1(:), remapn2(:)
7269
7271IF (.NOT.vol7d_check_vol(that)) RETURN ! be safe
7274 RETURN
7275ENDIF
7276
7277IF (this%time_definition /= that%time_definition) THEN
7278 CALL l4f_log(l4f_fatal, &
7279 'in vol7d_append, cannot append volumes with different &
7280 &time definition')
7281 CALL raise_fatal_error()
7282ENDIF
7283
7284! Completo l'allocazione per avere volumi a norma
7285CALL vol7d_alloc_vol(this)
7286
7290
7291! Calcolo le mappature tra volumi vecchi e volume nuovo
7292! I puntatori remap* vengono tutti o allocati o nullificati
7293IF (optio_log(ltimesimple)) THEN
7294 CALL vol7d_remap2simple_datetime(this%time, that%time, v7dtmp%time, &
7295 lsort, remapt1, remapt2)
7296ELSE
7297 CALL vol7d_remap2_datetime(this%time, that%time, v7dtmp%time, &
7298 lsort, remapt1, remapt2)
7299ENDIF
7300IF (optio_log(ltimerangesimple)) THEN
7301 CALL vol7d_remap2simple_vol7d_timerange(this%timerange, that%timerange, &
7302 v7dtmp%timerange, lsort, remaptr1, remaptr2)
7303ELSE
7304 CALL vol7d_remap2_vol7d_timerange(this%timerange, that%timerange, &
7305 v7dtmp%timerange, lsort, remaptr1, remaptr2)
7306ENDIF
7307IF (optio_log(llevelsimple)) THEN
7308 CALL vol7d_remap2simple_vol7d_level(this%level, that%level, v7dtmp%level, &
7309 lsort, remapl1, remapl2)
7310ELSE
7311 CALL vol7d_remap2_vol7d_level(this%level, that%level, v7dtmp%level, &
7312 lsort, remapl1, remapl2)
7313ENDIF
7314IF (optio_log(lanasimple)) THEN
7315 CALL vol7d_remap2simple_vol7d_ana(this%ana, that%ana, v7dtmp%ana, &
7316 .false., remapa1, remapa2)
7317ELSE
7318 CALL vol7d_remap2_vol7d_ana(this%ana, that%ana, v7dtmp%ana, &
7319 .false., remapa1, remapa2)
7320ENDIF
7321IF (optio_log(lnetworksimple)) THEN
7322 CALL vol7d_remap2simple_vol7d_network(this%network, that%network, v7dtmp%network, &
7323 .false., remapn1, remapn2)
7324ELSE
7325 CALL vol7d_remap2_vol7d_network(this%network, that%network, v7dtmp%network, &
7326 .false., remapn1, remapn2)
7327ENDIF
7328
7329! Faccio la fusione fisica dei volumi
7330CALL vol7d_merge_finalr(this, that, v7dtmp, &
7331 remapa1, remapa2, remapt1, remapt2, remapl1, remapl2, &
7332 remaptr1, remaptr2, remapn1, remapn2, lbestdata)
7333CALL vol7d_merge_finald(this, that, v7dtmp, &
7334 remapa1, remapa2, remapt1, remapt2, remapl1, remapl2, &
7335 remaptr1, remaptr2, remapn1, remapn2, lbestdata)
7336CALL vol7d_merge_finali(this, that, v7dtmp, &
7337 remapa1, remapa2, remapt1, remapt2, remapl1, remapl2, &
7338 remaptr1, remaptr2, remapn1, remapn2, lbestdata)
7339CALL vol7d_merge_finalb(this, that, v7dtmp, &
7340 remapa1, remapa2, remapt1, remapt2, remapl1, remapl2, &
7341 remaptr1, remaptr2, remapn1, remapn2, lbestdata)
7342CALL vol7d_merge_finalc(this, that, v7dtmp, &
7343 remapa1, remapa2, remapt1, remapt2, remapl1, remapl2, &
7344 remaptr1, remaptr2, remapn1, remapn2, lbestdata)
7345
7346! Dealloco i vettori di rimappatura
7347IF (ASSOCIATED(remapt1)) DEALLOCATE(remapt1)
7348IF (ASSOCIATED(remapt2)) DEALLOCATE(remapt2)
7349IF (ASSOCIATED(remaptr1)) DEALLOCATE(remaptr1)
7350IF (ASSOCIATED(remaptr2)) DEALLOCATE(remaptr2)
7351IF (ASSOCIATED(remapl1)) DEALLOCATE(remapl1)
7352IF (ASSOCIATED(remapl2)) DEALLOCATE(remapl2)
7353IF (ASSOCIATED(remapa1)) DEALLOCATE(remapa1)
7354IF (ASSOCIATED(remapa2)) DEALLOCATE(remapa2)
7355IF (ASSOCIATED(remapn1)) DEALLOCATE(remapn1)
7356IF (ASSOCIATED(remapn2)) DEALLOCATE(remapn2)
7357
7358! Distruggo il vecchio volume e assegno il nuovo a this
7360this = v7dtmp
7361! Ricreo gli indici var-attr
7362CALL vol7d_set_attr_ind(this)
7363
7364END SUBROUTINE vol7d_append
7365
7366
7367!> Metodo per creare una copia completa e indipendente di un oggetto vol7d.
7368!! Questo metodo crea un duplicato di tutti i membri di un oggetto vol7d,
7369!! con la possibilità di rielaborarlo durante la copia. Se l'oggetto da copiare
7370!! è vuoto non perde tempo inutile.
7371!! Attenzione, il codice:
7372!! \code
7373!! USE vol7d_class
7374!! TYPE(vol7d) :: vol1, vol2
7375!! CALL init(vol1)
7376!! CALL init(vol2)
7377!! ... ! riempio vol1
7378!! vol2 = vol1
7379!! \endcode
7380!! fa una cosa diversa rispetto a:
7381!! \code
7382!! USE vol7d_class
7383!! TYPE(vol7d) :: vol1, vol2
7384!! CALL init(vol1)
7385!! CALL init(vol2)
7386!! ... ! riempio vol1
7387!! CALL vol7d_copy(vol1, vol2)
7388!! \endcode
7389!! nel primo caso, infatti, l'operatore di assegnazione copia solo i componenti
7390!! statici di \a vol1 nei corrispondenti elementi di \a vol2, mentre i componenti che
7391!! sono allocati dinamicamente (cioè quelli che in ::vol7d hanno l'attributo
7392!! \c POINTER, in pratica quasi tutti) non vengono duplicati, ma per essi vol2
7393!! conterrà un puntatore al corrispondente elemento a cui già punta vol1, e quindi
7394!! eventuali cambiamenti al contenuto di uno dei due oggetti influenzerà il
7395!! contenuto dell'altro; nel secondo caso, invece, vol1 e vol2 sono, dopo la
7396!! vol7d_copy, 2 istanze
7397!! completamente indipendenti, ma uguali tra loro per contenuto, della classe
7398!! vol7d, e quindi hanno vita indipendente.
7399SUBROUTINE vol7d_copy(this, that, sort, unique, miss, &
7400 lsort_time, lsort_timerange, lsort_level, &
7401 ltime, ltimerange, llevel, lana, lnetwork, &
7402 lanavarr, lanavard, lanavari, lanavarb, lanavarc, &
7403 lanaattrr, lanaattrd, lanaattri, lanaattrb, lanaattrc, &
7404 lanavarattrr, lanavarattrd, lanavarattri, lanavarattrb, lanavarattrc, &
7405 ldativarr, ldativard, ldativari, ldativarb, ldativarc, &
7406 ldatiattrr, ldatiattrd, ldatiattri, ldatiattrb, ldatiattrc, &
7407 ldativarattrr, ldativarattrd, ldativarattri, ldativarattrb, ldativarattrc)
7408TYPE(vol7d),INTENT(IN) :: this !< oggetto origine
7409TYPE(vol7d),INTENT(INOUT) :: that !< oggetto destinazione
7410LOGICAL,INTENT(IN),OPTIONAL :: sort !< if present and \a .TRUE., sort all the sortable dimensions
7411LOGICAL,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)
7412LOGICAL,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
7413LOGICAL,INTENT(IN),OPTIONAL :: lsort_time !< if present and \a .TRUE., sort only time dimension (alternative to \a sort )
7414LOGICAL,INTENT(IN),OPTIONAL :: lsort_timerange !< if present and \a .TRUE., sort only timerange dimension (alternative to \a sort )
7415LOGICAL,INTENT(IN),OPTIONAL :: lsort_level !< if present and \a .TRUE., sort only level dimension (alternative to \a sort )
7416!> se fornito, deve essere un vettore logico della stessa lunghezza di
7417!! this%time indicante quali elementi della dimensione \a time
7418!! mantenere (valori \c .TRUE.) e quali scartare (valori \c .FALSE.)
7419!! nel volume copiato; in alternativa può essere un vettore di
7420!! lunghezza 1, in tal caso, se \c .FALSE. , equivale a scartare tutti
7421!! gli elementi (utile principalmente per le variabili); è compatibile
7422!! col parametro \a miss
7423LOGICAL,INTENT(IN),OPTIONAL :: ltime(:)
7424!> come il precedente per la dimensione \a timerange
7425LOGICAL,INTENT(IN),OPTIONAL :: ltimerange(:)
7426!> come il precedente per la dimensione \a level
7427LOGICAL,INTENT(IN),OPTIONAL :: llevel(:)
7428!> come il precedente per la dimensione \a ana
7429LOGICAL,INTENT(IN),OPTIONAL :: lana(:)
7430!> come il precedente per la dimensione \a network
7431LOGICAL,INTENT(IN),OPTIONAL :: lnetwork(:)
7432!> come il precedente per tutte le possibili dimensioni variabile
7433LOGICAL,INTENT(in),OPTIONAL :: &
7434 lanavarr(:), lanavard(:), lanavari(:), lanavarb(:), lanavarc(:), &
7435 lanaattrr(:), lanaattrd(:), lanaattri(:), lanaattrb(:), lanaattrc(:), &
7436 lanavarattrr(:), lanavarattrd(:), lanavarattri(:), lanavarattrb(:), lanavarattrc(:), &
7437 ldativarr(:), ldativard(:), ldativari(:), ldativarb(:), ldativarc(:), &
7438 ldatiattrr(:), ldatiattrd(:), ldatiattri(:), ldatiattrb(:), ldatiattrc(:), &
7439 ldativarattrr(:), ldativarattrd(:), ldativarattri(:), ldativarattrb(:), ldativarattrc(:)
7440
7441LOGICAL :: lsort, lunique, lmiss
7442INTEGER,POINTER :: remapt(:), remaptr(:), remapl(:), remapa(:), remapn(:)
7443
7446IF (.NOT.vol7d_check_vol(this)) RETURN ! be safe
7447
7451
7452! Calcolo le mappature tra volume vecchio e volume nuovo
7453! I puntatori remap* vengono tutti o allocati o nullificati
7454CALL vol7d_remap1_datetime(this%time, that%time, &
7455 lsort.OR.optio_log(lsort_time), lunique, lmiss, remapt, ltime)
7456CALL vol7d_remap1_vol7d_timerange(this%timerange, that%timerange, &
7457 lsort.OR.optio_log(lsort_timerange), lunique, lmiss, remaptr, ltimerange)
7458CALL vol7d_remap1_vol7d_level(this%level, that%level, &
7459 lsort.OR.optio_log(lsort_level), lunique, lmiss, remapl, llevel)
7460CALL vol7d_remap1_vol7d_ana(this%ana, that%ana, &
7461 lsort, lunique, lmiss, remapa, lana)
7462CALL vol7d_remap1_vol7d_network(this%network, that%network, &
7463 lsort, lunique, lmiss, remapn, lnetwork)
7464
7465! lanavari, lanavarb, lanavarc, &
7466! lanaattri, lanaattrb, lanaattrc, &
7467! lanavarattri, lanavarattrb, lanavarattrc, &
7468! ldativari, ldativarb, ldativarc, &
7469! ldatiattri, ldatiattrb, ldatiattrc, &
7470! ldativarattri, ldativarattrb, ldativarattrc
7471! Faccio la riforma fisica dei volumi
7472CALL vol7d_reform_finalr(this, that, &
7473 remapa, remapt, remapl, remaptr, remapn, lsort, lunique, lmiss, &
7474 lanavarr, lanaattrr, lanavarattrr, ldativarr, ldatiattrr, ldativarattrr)
7475CALL vol7d_reform_finald(this, that, &
7476 remapa, remapt, remapl, remaptr, remapn, lsort, lunique, lmiss, &
7477 lanavard, lanaattrd, lanavarattrd, ldativard, ldatiattrd, ldativarattrd)
7478CALL vol7d_reform_finali(this, that, &
7479 remapa, remapt, remapl, remaptr, remapn, lsort, lunique, lmiss, &
7480 lanavari, lanaattri, lanavarattri, ldativari, ldatiattri, ldativarattri)
7481CALL vol7d_reform_finalb(this, that, &
7482 remapa, remapt, remapl, remaptr, remapn, lsort, lunique, lmiss, &
7483 lanavarb, lanaattrb, lanavarattrb, ldativarb, ldatiattrb, ldativarattrb)
7484CALL vol7d_reform_finalc(this, that, &
7485 remapa, remapt, remapl, remaptr, remapn, lsort, lunique, lmiss, &
7486 lanavarc, lanaattrc, lanavarattrc, ldativarc, ldatiattrc, ldativarattrc)
7487
7488! Dealloco i vettori di rimappatura
7489IF (ASSOCIATED(remapt)) DEALLOCATE(remapt)
7490IF (ASSOCIATED(remaptr)) DEALLOCATE(remaptr)
7491IF (ASSOCIATED(remapl)) DEALLOCATE(remapl)
7492IF (ASSOCIATED(remapa)) DEALLOCATE(remapa)
7493IF (ASSOCIATED(remapn)) DEALLOCATE(remapn)
7494
7495! Ricreo gli indici var-attr
7496CALL vol7d_set_attr_ind(that)
7497that%time_definition = this%time_definition
7498
7499END SUBROUTINE vol7d_copy
7500
7501
7502!> Metodo per riformare in varie maniere un oggetto vol7d.
7503!! Equivale ad una copia (vedi ::vol7d_copy)
7504!! seguita dalla distruzione del volume iniziale e alla
7505!! sua riassegnazione al volume copiato. Ha senso se almeno uno dei parametri
7506!! \a sort, \a uniq o \a miss è fornito uguale a \c .TRUE., altrimenti
7507!! è solo una perdita di tempo.
7508!! Può essere utile, ad esempio, per eliminare stazioni
7509!! o istanti temporali indesiderati, basta assegnare il loro corrispondente
7510!! elemento del descrittore a valore mancante e chiamare vol7d_reform
7511!! con miss=.TRUE. .
7512SUBROUTINE vol7d_reform(this, sort, unique, miss, &
7513 lsort_time, lsort_timerange, lsort_level, &
7514 ltime, ltimerange, llevel, lana, lnetwork, &
7515 lanavarr, lanavard, lanavari, lanavarb, lanavarc, &
7516 lanaattrr, lanaattrd, lanaattri, lanaattrb, lanaattrc, &
7517 lanavarattrr, lanavarattrd, lanavarattri, lanavarattrb, lanavarattrc, &
7518 ldativarr, ldativard, ldativari, ldativarb, ldativarc, &
7519 ldatiattrr, ldatiattrd, ldatiattri, ldatiattrb, ldatiattrc, &
7520 ldativarattrr, ldativarattrd, ldativarattri, ldativarattrb, ldativarattrc&
7521 ,purgeana)
7522TYPE(vol7d),INTENT(INOUT) :: this !< oggetto da riformare
7523LOGICAL,INTENT(IN),OPTIONAL :: sort !< if present and \a .TRUE., sort all the sortable dimensions
7524LOGICAL,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)
7525LOGICAL,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
7526LOGICAL,INTENT(IN),OPTIONAL :: lsort_time !< if present and \a .TRUE., sort only time dimension (alternative to \a sort )
7527LOGICAL,INTENT(IN),OPTIONAL :: lsort_timerange !< if present and \a .TRUE., sort only timerange dimension (alternative to \a sort )
7528LOGICAL,INTENT(IN),OPTIONAL :: lsort_level !< if present and \a .TRUE., sort only level dimension (alternative to \a sort )
7529!> se fornito, deve essere un vettore logico della stessa lunghezza di
7530!! this%time indicante quali elementi della dimensione \a time
7531!! mantenere (valori \c .TRUE.) e quali scartare (valori \c .FALSE.)
7532!! nel volume copiato; in alternativa può essere un vettore di
7533!! lunghezza 1, in tal caso, se \c .FALSE. , equivale a scartare tutti
7534!! gli elementi (utile principalmente per le variabili); è compatibile
7535!! col parametro \a miss
7536LOGICAL,INTENT(IN),OPTIONAL :: ltime(:)
7537LOGICAL,INTENT(IN),OPTIONAL :: ltimerange(:) !< come il precedente per la dimensione \a timerange
7538LOGICAL,INTENT(IN),OPTIONAL :: llevel(:) !< come il precedente per la dimensione \a level
7539LOGICAL,INTENT(IN),OPTIONAL :: lana(:) !< come il precedente per la dimensione \a ana
7540LOGICAL,INTENT(IN),OPTIONAL :: lnetwork(:) !< come il precedente per la dimensione \a network
7541!> come il precedente per tutte le possibili dimensioni variabile
7542LOGICAL,INTENT(in),OPTIONAL :: &
7543 lanavarr(:), lanavard(:), lanavari(:), lanavarb(:), lanavarc(:), &
7544 lanaattrr(:), lanaattrd(:), lanaattri(:), lanaattrb(:), lanaattrc(:), &
7545 lanavarattrr(:), lanavarattrd(:), lanavarattri(:), lanavarattrb(:), lanavarattrc(:), &
7546 ldativarr(:), ldativard(:), ldativari(:), ldativarb(:), ldativarc(:), &
7547 ldatiattrr(:), ldatiattrd(:), ldatiattri(:), ldatiattrb(:), ldatiattrc(:), &
7548 ldativarattrr(:), ldativarattrd(:), ldativarattri(:), ldativarattrb(:), ldativarattrc(:)
7549LOGICAL,INTENT(IN),OPTIONAL :: purgeana !< if true remove ana with all data missing
7550
7551TYPE(vol7d) :: v7dtmp
7552logical,allocatable :: llana(:)
7553integer :: i
7554
7556 lsort_time, lsort_timerange, lsort_level, &
7557 ltime, ltimerange, llevel, lana, lnetwork, &
7558 lanavarr, lanavard, lanavari, lanavarb, lanavarc, &
7559 lanaattrr, lanaattrd, lanaattri, lanaattrb, lanaattrc, &
7560 lanavarattrr, lanavarattrd, lanavarattri, lanavarattrb, lanavarattrc, &
7561 ldativarr, ldativard, ldativari, ldativarb, ldativarc, &
7562 ldatiattrr, ldatiattrd, ldatiattri, ldatiattrb, ldatiattrc, &
7563 ldativarattrr, ldativarattrd, ldativarattri, ldativarattrb, ldativarattrc)
7564
7565! destroy old volume
7567
7568if (optio_log(purgeana)) then
7569 allocate(llana(size(v7dtmp%ana)))
7570 llana =.false.
7571 do i =1,size(v7dtmp%ana)
7572 if (associated(v7dtmp%voldatii)) llana(i)= llana(i) .or. any(c_e(v7dtmp%voldatii(i,:,:,:,:,:)))
7573 if (associated(v7dtmp%voldatir)) llana(i)= llana(i) .or. any(c_e(v7dtmp%voldatir(i,:,:,:,:,:)))
7574 if (associated(v7dtmp%voldatid)) llana(i)= llana(i) .or. any(c_e(v7dtmp%voldatid(i,:,:,:,:,:)))
7575 if (associated(v7dtmp%voldatib)) llana(i)= llana(i) .or. any(c_e(v7dtmp%voldatib(i,:,:,:,:,:)))
7576 if (associated(v7dtmp%voldatic)) llana(i)= llana(i) .or. any(c_e(v7dtmp%voldatic(i,:,:,:,:,:)))
7577 end do
7578 CALL vol7d_copy(v7dtmp, this,lana=llana)
7580 deallocate(llana)
7581else
7582 this=v7dtmp
7583end if
7584
7585END SUBROUTINE vol7d_reform
7586
7587
7588!> Sorts the sortable dimensions in the volume \a this only when necessary.
7589!! Most of the times, the time, timerange and level dimensions in a
7590!! vol7d object are correctly sorted; on the other side many methods
7591!! strictly rely on this fact in order to work correctly. This method
7592!! performs a quick check and sorts the required dimensions only if
7593!! they are not sorted in ascending order yet, improving safety
7594!! without impairing much performance.
7595SUBROUTINE vol7d_smart_sort(this, lsort_time, lsort_timerange, lsort_level)
7596TYPE(vol7d),INTENT(INOUT) :: this !< object to be sorted
7597LOGICAL,OPTIONAL,INTENT(in) :: lsort_time !< if present and \a .TRUE., sort time dimension if it is not sorted in ascending order
7598LOGICAL,OPTIONAL,INTENT(in) :: lsort_timerange !< if present and \a .TRUE., sort timerange dimension if it is not sorted in ascending order
7599LOGICAL,OPTIONAL,INTENT(in) :: lsort_level !< if present and \a .TRUE., sort vertical level dimension if it is not sorted in ascending order
7600
7601INTEGER :: i
7602LOGICAL :: to_be_sorted
7603
7604to_be_sorted = .false.
7605CALL vol7d_alloc_vol(this) ! usual safety check
7606
7607IF (optio_log(lsort_time)) THEN
7608 DO i = 2, SIZE(this%time)
7609 IF (this%time(i) < this%time(i-1)) THEN
7610 to_be_sorted = .true.
7611 EXIT
7612 ENDIF
7613 ENDDO
7614ENDIF
7615IF (optio_log(lsort_timerange)) THEN
7616 DO i = 2, SIZE(this%timerange)
7617 IF (this%timerange(i) < this%timerange(i-1)) THEN
7618 to_be_sorted = .true.
7619 EXIT
7620 ENDIF
7621 ENDDO
7622ENDIF
7623IF (optio_log(lsort_level)) THEN
7624 DO i = 2, SIZE(this%level)
7625 IF (this%level(i) < this%level(i-1)) THEN
7626 to_be_sorted = .true.
7627 EXIT
7628 ENDIF
7629 ENDDO
7630ENDIF
7631
7632IF (to_be_sorted) CALL vol7d_reform(this, &
7633 lsort_time=lsort_time, lsort_timerange=lsort_timerange, lsort_level=lsort_level )
7634
7635END SUBROUTINE vol7d_smart_sort
7636
7637!> Filter the contents of a volume keeping only desired data.
7638!! This subroutine filters a vol7d object by keeping only a subset of
7639!! the data contained. It can keep only times within a specified
7640!! interval, only station networks contained in a list and only
7641!! specified station or data variables. If a filter parameter is not
7642!! provided, no filtering will take place according to that criterion.
7643!! The volume is reallocated keeping only the desired data.
7644SUBROUTINE vol7d_filter(this, avl, vl, nl, s_d, e_d)
7645TYPE(vol7d),INTENT(inout) :: this !< volume to be filtered
7646CHARACTER(len=*),INTENT(in),OPTIONAL :: avl(:) !< list of station variables to be kept, if not provided or of zero length, all variables are kept
7647CHARACTER(len=*),INTENT(in),OPTIONAL :: vl(:) !< list of data variables to be kept, if not provided or of zero length, all variables are kept
7648TYPE(vol7d_network),OPTIONAL :: nl(:) !< list of station networks to be kept, if not provided or of zero length, all networks are kept
7649TYPE(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
7650TYPE(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
7651
7652INTEGER :: i
7653
7654IF (PRESENT(avl)) THEN
7655 IF (SIZE(avl) > 0) THEN
7656
7657 IF (ASSOCIATED(this%anavar%r)) THEN
7658 DO i = 1, SIZE(this%anavar%r)
7659 IF (all(this%anavar%r(i)%btable /= avl)) this%anavar%r(i) = vol7d_var_miss
7660 ENDDO
7661 ENDIF
7662
7663 IF (ASSOCIATED(this%anavar%i)) THEN
7664 DO i = 1, SIZE(this%anavar%i)
7665 IF (all(this%anavar%i(i)%btable /= avl)) this%anavar%i(i) = vol7d_var_miss
7666 ENDDO
7667 ENDIF
7668
7669 IF (ASSOCIATED(this%anavar%b)) THEN
7670 DO i = 1, SIZE(this%anavar%b)
7671 IF (all(this%anavar%b(i)%btable /= avl)) this%anavar%b(i) = vol7d_var_miss
7672 ENDDO
7673 ENDIF
7674
7675 IF (ASSOCIATED(this%anavar%d)) THEN
7676 DO i = 1, SIZE(this%anavar%d)
7677 IF (all(this%anavar%d(i)%btable /= avl)) this%anavar%d(i) = vol7d_var_miss
7678 ENDDO
7679 ENDIF
7680
7681 IF (ASSOCIATED(this%anavar%c)) THEN
7682 DO i = 1, SIZE(this%anavar%c)
7683 IF (all(this%anavar%c(i)%btable /= avl)) this%anavar%c(i) = vol7d_var_miss
7684 ENDDO
7685 ENDIF
7686
7687 ENDIF
7688ENDIF
7689
7690
7691IF (PRESENT(vl)) THEN
7692 IF (size(vl) > 0) THEN
7693 IF (ASSOCIATED(this%dativar%r)) THEN
7694 DO i = 1, SIZE(this%dativar%r)
7695 IF (all(this%dativar%r(i)%btable /= vl)) this%dativar%r(i) = vol7d_var_miss
7696 ENDDO
7697 ENDIF
7698
7699 IF (ASSOCIATED(this%dativar%i)) THEN
7700 DO i = 1, SIZE(this%dativar%i)
7701 IF (all(this%dativar%i(i)%btable /= vl)) this%dativar%i(i) = vol7d_var_miss
7702 ENDDO
7703 ENDIF
7704
7705 IF (ASSOCIATED(this%dativar%b)) THEN
7706 DO i = 1, SIZE(this%dativar%b)
7707 IF (all(this%dativar%b(i)%btable /= vl)) this%dativar%b(i) = vol7d_var_miss
7708 ENDDO
7709 ENDIF
7710
7711 IF (ASSOCIATED(this%dativar%d)) THEN
7712 DO i = 1, SIZE(this%dativar%d)
7713 IF (all(this%dativar%d(i)%btable /= vl)) this%dativar%d(i) = vol7d_var_miss
7714 ENDDO
7715 ENDIF
7716
7717 IF (ASSOCIATED(this%dativar%c)) THEN
7718 DO i = 1, SIZE(this%dativar%c)
7719 IF (all(this%dativar%c(i)%btable /= vl)) this%dativar%c(i) = vol7d_var_miss
7720 ENDDO
7721 ENDIF
7722
7723 IF (ASSOCIATED(this%dativar%c)) THEN
7724 DO i = 1, SIZE(this%dativar%c)
7725 IF (all(this%dativar%c(i)%btable /= vl)) this%dativar%c(i) = vol7d_var_miss
7726 ENDDO
7727 ENDIF
7728
7729 ENDIF
7730ENDIF
7731
7732IF (PRESENT(nl)) THEN
7733 IF (SIZE(nl) > 0) THEN
7734 DO i = 1, SIZE(this%network)
7735 IF (all(this%network(i) /= nl)) this%network(i) = vol7d_network_miss
7736 ENDDO
7737 ENDIF
7738ENDIF
7739
7740IF (PRESENT(s_d)) THEN
7742 WHERE (this%time < s_d)
7743 this%time = datetime_miss
7744 END WHERE
7745 ENDIF
7746ENDIF
7747
7748IF (PRESENT(e_d)) THEN
7750 WHERE (this%time > e_d)
7751 this%time = datetime_miss
7752 END WHERE
7753 ENDIF
7754ENDIF
7755
7756CALL vol7d_reform(this, miss=.true.)
7757
7758END SUBROUTINE vol7d_filter
7759
7760
7761!> Metodo per convertire i volumi di dati di un oggetto vol7d in dati
7762!! reali dove possibile. L'oggetto convertito è una copia completa
7763!! dell'originale che può essere quindi distrutto dopo la chiamata.
7764!! Per i dati di anagrafica, al momento sono convertiti solo
7765!! i dati CHARACTER se è passato \a anaconv=.TRUE.
7766!! Gli attributi non sono toccati.
7767SUBROUTINE vol7d_convr(this, that, anaconv)
7768TYPE(vol7d),INTENT(IN) :: this !< oggetto origine
7769TYPE(vol7d),INTENT(INOUT) :: that !< oggetto convertito
7770LOGICAL,OPTIONAL,INTENT(in) :: anaconv !< converti anche anagrafica
7771INTEGER :: i
7772LOGICAL :: fv(1)=(/.false./), tv(1)=(/.true./), acp(1), acn(1)
7773TYPE(vol7d) :: v7d_tmp
7774
7775IF (optio_log(anaconv)) THEN
7776 acp=fv
7777 acn=tv
7778ELSE
7779 acp=tv
7780 acn=fv
7781ENDIF
7782
7783! Volume con solo i dati reali e tutti gli attributi
7784! l'anagrafica e` copiata interamente se necessario
7785CALL vol7d_copy(this, that, &
7786 lanavarr=tv, lanavard=acp, lanavari=acp, lanavarb=acp, lanavarc=acp, &
7787 ldativarr=tv, ldativard=fv, ldativari=fv, ldativarb=fv, ldativarc=fv)
7788
7789! Volume solo di dati double
7790CALL vol7d_copy(this, v7d_tmp, &
7791 lanavarr=fv, lanavard=acn, lanavari=fv, lanavarb=fv, lanavarc=fv, &
7792 lanaattrr=fv, lanaattrd=fv, lanaattri=fv, lanaattrb=fv, lanaattrc=fv, &
7793 lanavarattrr=fv, lanavarattrd=fv, lanavarattri=fv, lanavarattrb=fv, lanavarattrc=fv, &
7794 ldativarr=fv, ldativard=tv, ldativari=fv, ldativarb=fv, ldativarc=fv, &
7795 ldatiattrr=fv, ldatiattrd=fv, ldatiattri=fv, ldatiattrb=fv, ldatiattrc=fv, &
7796 ldativarattrr=fv, ldativarattrd=fv, ldativarattri=fv, ldativarattrb=fv, ldativarattrc=fv)
7797
7798! converto a dati reali
7799IF (ASSOCIATED(v7d_tmp%anavar%d) .OR. ASSOCIATED(v7d_tmp%dativar%d)) THEN
7800
7801 IF (ASSOCIATED(v7d_tmp%anavar%d)) THEN
7802! alloco i dati reali e vi trasferisco i double
7803 ALLOCATE(v7d_tmp%volanar(SIZE(v7d_tmp%volanad, 1), SIZE(v7d_tmp%volanad, 2), &
7804 SIZE(v7d_tmp%volanad, 3)))
7805 DO i = 1, SIZE(v7d_tmp%anavar%d)
7806 v7d_tmp%volanar(:,i,:) = &
7807 realdat(v7d_tmp%volanad(:,i,:), v7d_tmp%anavar%d(i))
7808 ENDDO
7809 DEALLOCATE(v7d_tmp%volanad)
7810! trasferisco le variabili
7811 v7d_tmp%anavar%r => v7d_tmp%anavar%d
7812 NULLIFY(v7d_tmp%anavar%d)
7813 ENDIF
7814
7815 IF (ASSOCIATED(v7d_tmp%dativar%d)) THEN
7816! alloco i dati reali e vi trasferisco i double
7817 ALLOCATE(v7d_tmp%voldatir(SIZE(v7d_tmp%voldatid, 1), SIZE(v7d_tmp%voldatid, 2), &
7818 SIZE(v7d_tmp%voldatid, 3), SIZE(v7d_tmp%voldatid, 4), SIZE(v7d_tmp%voldatid, 5), &
7819 SIZE(v7d_tmp%voldatid, 6)))
7820 DO i = 1, SIZE(v7d_tmp%dativar%d)
7821 v7d_tmp%voldatir(:,:,:,:,i,:) = &
7822 realdat(v7d_tmp%voldatid(:,:,:,:,i,:), v7d_tmp%dativar%d(i))
7823 ENDDO
7824 DEALLOCATE(v7d_tmp%voldatid)
7825! trasferisco le variabili
7826 v7d_tmp%dativar%r => v7d_tmp%dativar%d
7827 NULLIFY(v7d_tmp%dativar%d)
7828 ENDIF
7829
7830! fondo con il volume definitivo
7831 CALL vol7d_merge(that, v7d_tmp)
7832ELSE
7834ENDIF
7835
7836
7837! Volume solo di dati interi
7838CALL vol7d_copy(this, v7d_tmp, &
7839 lanavarr=fv, lanavard=fv, lanavari=acn, lanavarb=fv, lanavarc=fv, &
7840 lanaattrr=fv, lanaattrd=fv, lanaattri=fv, lanaattrb=fv, lanaattrc=fv, &
7841 lanavarattrr=fv, lanavarattrd=fv, lanavarattri=fv, lanavarattrb=fv, lanavarattrc=fv, &
7842 ldativarr=fv, ldativard=fv, ldativari=tv, ldativarb=fv, ldativarc=fv, &
7843 ldatiattrr=fv, ldatiattrd=fv, ldatiattri=fv, ldatiattrb=fv, ldatiattrc=fv, &
7844 ldativarattrr=fv, ldativarattrd=fv, ldativarattri=fv, ldativarattrb=fv, ldativarattrc=fv)
7845
7846! converto a dati reali
7847IF (ASSOCIATED(v7d_tmp%anavar%i) .OR. ASSOCIATED(v7d_tmp%dativar%i)) THEN
7848
7849 IF (ASSOCIATED(v7d_tmp%anavar%i)) THEN
7850! alloco i dati reali e vi trasferisco gli interi
7851 ALLOCATE(v7d_tmp%volanar(SIZE(v7d_tmp%volanai, 1), SIZE(v7d_tmp%volanai, 2), &
7852 SIZE(v7d_tmp%volanai, 3)))
7853 DO i = 1, SIZE(v7d_tmp%anavar%i)
7854 v7d_tmp%volanar(:,i,:) = &
7855 realdat(v7d_tmp%volanai(:,i,:), v7d_tmp%anavar%i(i))
7856 ENDDO
7857 DEALLOCATE(v7d_tmp%volanai)
7858! trasferisco le variabili
7859 v7d_tmp%anavar%r => v7d_tmp%anavar%i
7860 NULLIFY(v7d_tmp%anavar%i)
7861 ENDIF
7862
7863 IF (ASSOCIATED(v7d_tmp%dativar%i)) THEN
7864! alloco i dati reali e vi trasferisco gli interi
7865 ALLOCATE(v7d_tmp%voldatir(SIZE(v7d_tmp%voldatii, 1), SIZE(v7d_tmp%voldatii, 2), &
7866 SIZE(v7d_tmp%voldatii, 3), SIZE(v7d_tmp%voldatii, 4), SIZE(v7d_tmp%voldatii, 5), &
7867 SIZE(v7d_tmp%voldatii, 6)))
7868 DO i = 1, SIZE(v7d_tmp%dativar%i)
7869 v7d_tmp%voldatir(:,:,:,:,i,:) = &
7870 realdat(v7d_tmp%voldatii(:,:,:,:,i,:), v7d_tmp%dativar%i(i))
7871 ENDDO
7872 DEALLOCATE(v7d_tmp%voldatii)
7873! trasferisco le variabili
7874 v7d_tmp%dativar%r => v7d_tmp%dativar%i
7875 NULLIFY(v7d_tmp%dativar%i)
7876 ENDIF
7877
7878! fondo con il volume definitivo
7879 CALL vol7d_merge(that, v7d_tmp)
7880ELSE
7882ENDIF
7883
7884
7885! Volume solo di dati byte
7886CALL vol7d_copy(this, v7d_tmp, &
7887 lanavarr=fv, lanavard=fv, lanavari=fv, lanavarb=acn, lanavarc=fv, &
7888 lanaattrr=fv, lanaattrd=fv, lanaattri=fv, lanaattrb=fv, lanaattrc=fv, &
7889 lanavarattrr=fv, lanavarattrd=fv, lanavarattri=fv, lanavarattrb=fv, lanavarattrc=fv, &
7890 ldativarr=fv, ldativard=fv, ldativari=fv, ldativarb=tv, ldativarc=fv, &
7891 ldatiattrr=fv, ldatiattrd=fv, ldatiattri=fv, ldatiattrb=fv, ldatiattrc=fv, &
7892 ldativarattrr=fv, ldativarattrd=fv, ldativarattri=fv, ldativarattrb=fv, ldativarattrc=fv)
7893
7894! converto a dati reali
7895IF (ASSOCIATED(v7d_tmp%anavar%b) .OR. ASSOCIATED(v7d_tmp%dativar%b)) THEN
7896
7897 IF (ASSOCIATED(v7d_tmp%anavar%b)) THEN
7898! alloco i dati reali e vi trasferisco i byte
7899 ALLOCATE(v7d_tmp%volanar(SIZE(v7d_tmp%volanab, 1), SIZE(v7d_tmp%volanab, 2), &
7900 SIZE(v7d_tmp%volanab, 3)))
7901 DO i = 1, SIZE(v7d_tmp%anavar%b)
7902 v7d_tmp%volanar(:,i,:) = &
7903 realdat(v7d_tmp%volanab(:,i,:), v7d_tmp%anavar%b(i))
7904 ENDDO
7905 DEALLOCATE(v7d_tmp%volanab)
7906! trasferisco le variabili
7907 v7d_tmp%anavar%r => v7d_tmp%anavar%b
7908 NULLIFY(v7d_tmp%anavar%b)
7909 ENDIF
7910
7911 IF (ASSOCIATED(v7d_tmp%dativar%b)) THEN
7912! alloco i dati reali e vi trasferisco i byte
7913 ALLOCATE(v7d_tmp%voldatir(SIZE(v7d_tmp%voldatib, 1), SIZE(v7d_tmp%voldatib, 2), &
7914 SIZE(v7d_tmp%voldatib, 3), SIZE(v7d_tmp%voldatib, 4), SIZE(v7d_tmp%voldatib, 5), &
7915 SIZE(v7d_tmp%voldatib, 6)))
7916 DO i = 1, SIZE(v7d_tmp%dativar%b)
7917 v7d_tmp%voldatir(:,:,:,:,i,:) = &
7918 realdat(v7d_tmp%voldatib(:,:,:,:,i,:), v7d_tmp%dativar%b(i))
7919 ENDDO
7920 DEALLOCATE(v7d_tmp%voldatib)
7921! trasferisco le variabili
7922 v7d_tmp%dativar%r => v7d_tmp%dativar%b
7923 NULLIFY(v7d_tmp%dativar%b)
7924 ENDIF
7925
7926! fondo con il volume definitivo
7927 CALL vol7d_merge(that, v7d_tmp)
7928ELSE
7930ENDIF
7931
7932
7933! Volume solo di dati character
7934CALL vol7d_copy(this, v7d_tmp, &
7935 lanavarr=fv, lanavard=fv, lanavari=fv, lanavarb=fv, lanavarc=acn, &
7936 lanaattrr=fv, lanaattrd=fv, lanaattri=fv, lanaattrb=fv, lanaattrc=fv, &
7937 lanavarattrr=fv, lanavarattrd=fv, lanavarattri=fv, lanavarattrb=fv, lanavarattrc=fv, &
7938 ldativarr=fv, ldativard=fv, ldativari=fv, ldativarb=fv, ldativarc=tv, &
7939 ldatiattrr=fv, ldatiattrd=fv, ldatiattri=fv, ldatiattrb=fv, ldatiattrc=fv, &
7940 ldativarattrr=fv, ldativarattrd=fv, ldativarattri=fv, ldativarattrb=fv, ldativarattrc=fv)
7941
7942! converto a dati reali
7943IF (ASSOCIATED(v7d_tmp%anavar%c) .OR. ASSOCIATED(v7d_tmp%dativar%c)) THEN
7944
7945 IF (ASSOCIATED(v7d_tmp%anavar%c)) THEN
7946! alloco i dati reali e vi trasferisco i character
7947 ALLOCATE(v7d_tmp%volanar(SIZE(v7d_tmp%volanac, 1), SIZE(v7d_tmp%volanac, 2), &
7948 SIZE(v7d_tmp%volanac, 3)))
7949 DO i = 1, SIZE(v7d_tmp%anavar%c)
7950 v7d_tmp%volanar(:,i,:) = &
7951 realdat(v7d_tmp%volanac(:,i,:), v7d_tmp%anavar%c(i))
7952 ENDDO
7953 DEALLOCATE(v7d_tmp%volanac)
7954! trasferisco le variabili
7955 v7d_tmp%anavar%r => v7d_tmp%anavar%c
7956 NULLIFY(v7d_tmp%anavar%c)
7957 ENDIF
7958
7959 IF (ASSOCIATED(v7d_tmp%dativar%c)) THEN
7960! alloco i dati reali e vi trasferisco i character
7961 ALLOCATE(v7d_tmp%voldatir(SIZE(v7d_tmp%voldatic, 1), SIZE(v7d_tmp%voldatic, 2), &
7962 SIZE(v7d_tmp%voldatic, 3), SIZE(v7d_tmp%voldatic, 4), SIZE(v7d_tmp%voldatic, 5), &
7963 SIZE(v7d_tmp%voldatic, 6)))
7964 DO i = 1, SIZE(v7d_tmp%dativar%c)
7965 v7d_tmp%voldatir(:,:,:,:,i,:) = &
7966 realdat(v7d_tmp%voldatic(:,:,:,:,i,:), v7d_tmp%dativar%c(i))
7967 ENDDO
7968 DEALLOCATE(v7d_tmp%voldatic)
7969! trasferisco le variabili
7970 v7d_tmp%dativar%r => v7d_tmp%dativar%c
7971 NULLIFY(v7d_tmp%dativar%c)
7972 ENDIF
7973
7974! fondo con il volume definitivo
7975 CALL vol7d_merge(that, v7d_tmp)
7976ELSE
7978ENDIF
7979
7980END SUBROUTINE vol7d_convr
7981
7982
7983!> Metodo per ottenere solo le differenze tra due oggetti vol7d.
7984!! Il primo volume viene confrontato col secondo; nel secondo volume ovunque
7985!! i dati confrontati siano coincidenti viene impostato valore mancante.
7986SUBROUTINE vol7d_diff_only (this, that, data_only,ana)
7987TYPE(vol7d),INTENT(IN) :: this !< primo volume da confrontare
7988TYPE(vol7d),INTENT(OUT) :: that !< secondo volume da confrontare in cui eliminare i dati coincidenti
7989logical , optional, intent(in) :: data_only !< attiva l'elaborazione dei soli dati e non dell'anagrafica (default: .false.)
7990logical , optional, intent(in) :: ana !< attiva l'elaborazione dell'anagrafica (coordinate e ident) (default: .false.)
7991logical :: ldata_only,lana
7992
7993IF (PRESENT(data_only)) THEN
7994 ldata_only = data_only
7995ELSE
7996 ldata_only = .false.
7997ENDIF
7998
7999IF (PRESENT(ana)) THEN
8000 lana = ana
8001ELSE
8002 lana = .false.
8003ENDIF
8004
8005
8006#undef VOL7D_POLY_ARRAY
8007#define VOL7D_POLY_ARRAY voldati
8008#include "vol7d_class_diff.F90"
8009#undef VOL7D_POLY_ARRAY
8010#define VOL7D_POLY_ARRAY voldatiattr
8011#include "vol7d_class_diff.F90"
8012#undef VOL7D_POLY_ARRAY
8013
8014if ( .not. ldata_only) then
8015
8016#define VOL7D_POLY_ARRAY volana
8017#include "vol7d_class_diff.F90"
8018#undef VOL7D_POLY_ARRAY
8019#define VOL7D_POLY_ARRAY volanaattr
8020#include "vol7d_class_diff.F90"
8021#undef VOL7D_POLY_ARRAY
8022
8023 if(lana)then
8024 where ( this%ana == that%ana )
8025 that%ana = vol7d_ana_miss
8026 end where
8027 end if
8028
8029end if
8030
8031
8032
8033END SUBROUTINE vol7d_diff_only
8034
8035
8036
8037! Creo le routine da ripetere per i vari tipi di dati di v7d
8038! tramite un template e il preprocessore
8039#undef VOL7D_POLY_TYPE
8040#undef VOL7D_POLY_TYPES
8041#define VOL7D_POLY_TYPE REAL
8042#define VOL7D_POLY_TYPES r
8043#include "vol7d_class_type_templ.F90"
8044#undef VOL7D_POLY_TYPE
8045#undef VOL7D_POLY_TYPES
8046#define VOL7D_POLY_TYPE DOUBLE PRECISION
8047#define VOL7D_POLY_TYPES d
8048#include "vol7d_class_type_templ.F90"
8049#undef VOL7D_POLY_TYPE
8050#undef VOL7D_POLY_TYPES
8051#define VOL7D_POLY_TYPE INTEGER
8052#define VOL7D_POLY_TYPES i
8053#include "vol7d_class_type_templ.F90"
8054#undef VOL7D_POLY_TYPE
8055#undef VOL7D_POLY_TYPES
8056#define VOL7D_POLY_TYPE INTEGER(kind=int_b)
8057#define VOL7D_POLY_TYPES b
8058#include "vol7d_class_type_templ.F90"
8059#undef VOL7D_POLY_TYPE
8060#undef VOL7D_POLY_TYPES
8061#define VOL7D_POLY_TYPE CHARACTER(len=vol7d_cdatalen)
8062#define VOL7D_POLY_TYPES c
8063#include "vol7d_class_type_templ.F90"
8064
8065! Creo le routine da ripetere per i vari descrittori di dimensioni di v7d
8066! tramite un template e il preprocessore
8067#define VOL7D_SORT
8068#undef VOL7D_NO_ZERO_ALLOC
8069#undef VOL7D_POLY_TYPE
8070#define VOL7D_POLY_TYPE datetime
8071#include "vol7d_class_desc_templ.F90"
8072#undef VOL7D_POLY_TYPE
8073#define VOL7D_POLY_TYPE vol7d_timerange
8074#include "vol7d_class_desc_templ.F90"
8075#undef VOL7D_POLY_TYPE
8076#define VOL7D_POLY_TYPE vol7d_level
8077#include "vol7d_class_desc_templ.F90"
8078#undef VOL7D_SORT
8079#undef VOL7D_POLY_TYPE
8080#define VOL7D_POLY_TYPE vol7d_network
8081#include "vol7d_class_desc_templ.F90"
8082#undef VOL7D_POLY_TYPE
8083#define VOL7D_POLY_TYPE vol7d_ana
8084#include "vol7d_class_desc_templ.F90"
8085#define VOL7D_NO_ZERO_ALLOC
8086#undef VOL7D_POLY_TYPE
8087#define VOL7D_POLY_TYPE vol7d_var
8088#include "vol7d_class_desc_templ.F90"
8089
8090!>\brief Scrittura su file di un volume Vol7d.
8091!! Scrittura su file unformatted di un intero volume Vol7d.
8092!! Il volume viene serializzato e scritto su file.
8093!! Il file puo' essere aperto opzionalmente dall'utente. Si possono passare
8094!! opzionalmente unità e nome del file altrimenti assegnati internamente a dei default; se assegnati internamente
8095!! tali parametri saranno in output.
8096!! Se non viene fornito il nome file viene utilizzato un file di default con nome pari al nome del programma in
8097!! esecuzione con postfisso ".v7d".
8098!! Come parametro opzionale c'è la description che insieme alla data corrente viene inserita nell'header del file.
8099subroutine vol7d_write_on_file (this,unit,description,filename,filename_auto)
8100
8101TYPE(vol7d),INTENT(IN) :: this !< volume vol7d da scrivere
8102integer,optional,intent(inout) :: unit !< unità su cui scrivere; se passata =0 ritorna il valore rielaborato (default =rielaborato internamente con getlun )
8103character(len=*),intent(in),optional :: filename !< nome del file su cui scrivere
8104character(len=*),intent(out),optional :: filename_auto !< nome del file generato se "filename" è omesso
8105character(len=*),INTENT(IN),optional :: description !< descrizione del volume
8106
8107integer :: lunit
8108character(len=254) :: ldescription,arg,lfilename
8109integer :: nana, ntime, ntimerange, nlevel, nnetwork, &
8110 ndativarr, ndativari, ndativarb, ndativard, ndativarc,&
8111 ndatiattrr, ndatiattri, ndatiattrb, ndatiattrd, ndatiattrc,&
8112 ndativarattrr, ndativarattri, ndativarattrb, ndativarattrd, ndativarattrc,&
8113 nanavarr, nanavari, nanavarb, nanavard, nanavarc,&
8114 nanaattrr, nanaattri, nanaattrb, nanaattrd, nanaattrc,&
8115 nanavarattrr, nanavarattri, nanavarattrb, nanavarattrd, nanavarattrc
8116!integer :: im,id,iy
8117integer :: tarray(8)
8118logical :: opened,exist
8119
8120 nana=0
8121 ntime=0
8122 ntimerange=0
8123 nlevel=0
8124 nnetwork=0
8125 ndativarr=0
8126 ndativari=0
8127 ndativarb=0
8128 ndativard=0
8129 ndativarc=0
8130 ndatiattrr=0
8131 ndatiattri=0
8132 ndatiattrb=0
8133 ndatiattrd=0
8134 ndatiattrc=0
8135 ndativarattrr=0
8136 ndativarattri=0
8137 ndativarattrb=0
8138 ndativarattrd=0
8139 ndativarattrc=0
8140 nanavarr=0
8141 nanavari=0
8142 nanavarb=0
8143 nanavard=0
8144 nanavarc=0
8145 nanaattrr=0
8146 nanaattri=0
8147 nanaattrb=0
8148 nanaattrd=0
8149 nanaattrc=0
8150 nanavarattrr=0
8151 nanavarattri=0
8152 nanavarattrb=0
8153 nanavarattrd=0
8154 nanavarattrc=0
8155
8156
8157!call idate(im,id,iy)
8158call date_and_time(values=tarray)
8159call getarg(0,arg)
8160
8161if (present(description))then
8162 ldescription=description
8163else
8164 ldescription="Vol7d generated by: "//trim(arg)
8165end if
8166
8167if (.not. present(unit))then
8168 lunit=getunit()
8169else
8170 if (unit==0)then
8171 lunit=getunit()
8172 unit=lunit
8173 else
8174 lunit=unit
8175 end if
8176end if
8177
8178lfilename=trim(arg)//".v7d"
8180
8181if (present(filename))then
8182 if (filename /= "")then
8183 lfilename=filename
8184 end if
8185end if
8186
8187if (present(filename_auto))filename_auto=lfilename
8188
8189
8190inquire(unit=lunit,opened=opened)
8191if (.not. opened) then
8192! inquire(file=lfilename, EXIST=exist)
8193! IF (exist) THEN
8194! CALL l4f_log(L4F_FATAL, &
8195! 'in vol7d_write_on_file, file exists, cannot open file '//TRIM(lfilename))
8196! CALL raise_fatal_error()
8197! ENDIF
8198 OPEN(unit=lunit, file=lfilename, form='UNFORMATTED', access='STREAM')
8199 CALL l4f_log(l4f_info, 'opened: '//trim(lfilename))
8200end if
8201
8202if (associated(this%ana)) nana=size(this%ana)
8203if (associated(this%time)) ntime=size(this%time)
8204if (associated(this%timerange)) ntimerange=size(this%timerange)
8205if (associated(this%level)) nlevel=size(this%level)
8206if (associated(this%network)) nnetwork=size(this%network)
8207
8208if (associated(this%dativar%r)) ndativarr=size(this%dativar%r)
8209if (associated(this%dativar%i)) ndativari=size(this%dativar%i)
8210if (associated(this%dativar%b)) ndativarb=size(this%dativar%b)
8211if (associated(this%dativar%d)) ndativard=size(this%dativar%d)
8212if (associated(this%dativar%c)) ndativarc=size(this%dativar%c)
8213
8214if (associated(this%datiattr%r)) ndatiattrr=size(this%datiattr%r)
8215if (associated(this%datiattr%i)) ndatiattri=size(this%datiattr%i)
8216if (associated(this%datiattr%b)) ndatiattrb=size(this%datiattr%b)
8217if (associated(this%datiattr%d)) ndatiattrd=size(this%datiattr%d)
8218if (associated(this%datiattr%c)) ndatiattrc=size(this%datiattr%c)
8219
8220if (associated(this%dativarattr%r)) ndativarattrr=size(this%dativarattr%r)
8221if (associated(this%dativarattr%i)) ndativarattri=size(this%dativarattr%i)
8222if (associated(this%dativarattr%b)) ndativarattrb=size(this%dativarattr%b)
8223if (associated(this%dativarattr%d)) ndativarattrd=size(this%dativarattr%d)
8224if (associated(this%dativarattr%c)) ndativarattrc=size(this%dativarattr%c)
8225
8226if (associated(this%anavar%r)) nanavarr=size(this%anavar%r)
8227if (associated(this%anavar%i)) nanavari=size(this%anavar%i)
8228if (associated(this%anavar%b)) nanavarb=size(this%anavar%b)
8229if (associated(this%anavar%d)) nanavard=size(this%anavar%d)
8230if (associated(this%anavar%c)) nanavarc=size(this%anavar%c)
8231
8232if (associated(this%anaattr%r)) nanaattrr=size(this%anaattr%r)
8233if (associated(this%anaattr%i)) nanaattri=size(this%anaattr%i)
8234if (associated(this%anaattr%b)) nanaattrb=size(this%anaattr%b)
8235if (associated(this%anaattr%d)) nanaattrd=size(this%anaattr%d)
8236if (associated(this%anaattr%c)) nanaattrc=size(this%anaattr%c)
8237
8238if (associated(this%anavarattr%r)) nanavarattrr=size(this%anavarattr%r)
8239if (associated(this%anavarattr%i)) nanavarattri=size(this%anavarattr%i)
8240if (associated(this%anavarattr%b)) nanavarattrb=size(this%anavarattr%b)
8241if (associated(this%anavarattr%d)) nanavarattrd=size(this%anavarattr%d)
8242if (associated(this%anavarattr%c)) nanavarattrc=size(this%anavarattr%c)
8243
8244write(unit=lunit)ldescription
8245write(unit=lunit)tarray
8246
8247write(unit=lunit)&
8248 nana, ntime, ntimerange, nlevel, nnetwork, &
8249 ndativarr, ndativari, ndativarb, ndativard, ndativarc,&
8250 ndatiattrr, ndatiattri, ndatiattrb, ndatiattrd, ndatiattrc,&
8251 ndativarattrr, ndativarattri, ndativarattrb, ndativarattrd, ndativarattrc,&
8252 nanavarr, nanavari, nanavarb, nanavard, nanavarc,&
8253 nanaattrr, nanaattri, nanaattrb, nanaattrd, nanaattrc,&
8254 nanavarattrr, nanavarattri, nanavarattrb, nanavarattrd, nanavarattrc, &
8255 this%time_definition
8256
8257
8258!write(unit=lunit)this
8259
8260
8261!! prime 5 dimensioni
8264if (associated(this%level)) write(unit=lunit)this%level
8265if (associated(this%timerange)) write(unit=lunit)this%timerange
8266if (associated(this%network)) write(unit=lunit)this%network
8267
8268 !! 6a dimensione: variabile dell'anagrafica e dei dati
8269 !! con relativi attributi e in 5 tipi diversi
8270
8271if (associated(this%anavar%r)) write(unit=lunit)this%anavar%r
8272if (associated(this%anavar%i)) write(unit=lunit)this%anavar%i
8273if (associated(this%anavar%b)) write(unit=lunit)this%anavar%b
8274if (associated(this%anavar%d)) write(unit=lunit)this%anavar%d
8275if (associated(this%anavar%c)) write(unit=lunit)this%anavar%c
8276
8277if (associated(this%anaattr%r)) write(unit=lunit)this%anaattr%r
8278if (associated(this%anaattr%i)) write(unit=lunit)this%anaattr%i
8279if (associated(this%anaattr%b)) write(unit=lunit)this%anaattr%b
8280if (associated(this%anaattr%d)) write(unit=lunit)this%anaattr%d
8281if (associated(this%anaattr%c)) write(unit=lunit)this%anaattr%c
8282
8283if (associated(this%anavarattr%r)) write(unit=lunit)this%anavarattr%r
8284if (associated(this%anavarattr%i)) write(unit=lunit)this%anavarattr%i
8285if (associated(this%anavarattr%b)) write(unit=lunit)this%anavarattr%b
8286if (associated(this%anavarattr%d)) write(unit=lunit)this%anavarattr%d
8287if (associated(this%anavarattr%c)) write(unit=lunit)this%anavarattr%c
8288
8289if (associated(this%dativar%r)) write(unit=lunit)this%dativar%r
8290if (associated(this%dativar%i)) write(unit=lunit)this%dativar%i
8291if (associated(this%dativar%b)) write(unit=lunit)this%dativar%b
8292if (associated(this%dativar%d)) write(unit=lunit)this%dativar%d
8293if (associated(this%dativar%c)) write(unit=lunit)this%dativar%c
8294
8295if (associated(this%datiattr%r)) write(unit=lunit)this%datiattr%r
8296if (associated(this%datiattr%i)) write(unit=lunit)this%datiattr%i
8297if (associated(this%datiattr%b)) write(unit=lunit)this%datiattr%b
8298if (associated(this%datiattr%d)) write(unit=lunit)this%datiattr%d
8299if (associated(this%datiattr%c)) write(unit=lunit)this%datiattr%c
8300
8301if (associated(this%dativarattr%r)) write(unit=lunit)this%dativarattr%r
8302if (associated(this%dativarattr%i)) write(unit=lunit)this%dativarattr%i
8303if (associated(this%dativarattr%b)) write(unit=lunit)this%dativarattr%b
8304if (associated(this%dativarattr%d)) write(unit=lunit)this%dativarattr%d
8305if (associated(this%dativarattr%c)) write(unit=lunit)this%dativarattr%c
8306
8307!! Volumi di valori e attributi per anagrafica e dati
8308
8309if (associated(this%volanar)) write(unit=lunit)this%volanar
8310if (associated(this%volanaattrr)) write(unit=lunit)this%volanaattrr
8311if (associated(this%voldatir)) write(unit=lunit)this%voldatir
8312if (associated(this%voldatiattrr)) write(unit=lunit)this%voldatiattrr
8313
8314if (associated(this%volanai)) write(unit=lunit)this%volanai
8315if (associated(this%volanaattri)) write(unit=lunit)this%volanaattri
8316if (associated(this%voldatii)) write(unit=lunit)this%voldatii
8317if (associated(this%voldatiattri)) write(unit=lunit)this%voldatiattri
8318
8319if (associated(this%volanab)) write(unit=lunit)this%volanab
8320if (associated(this%volanaattrb)) write(unit=lunit)this%volanaattrb
8321if (associated(this%voldatib)) write(unit=lunit)this%voldatib
8322if (associated(this%voldatiattrb)) write(unit=lunit)this%voldatiattrb
8323
8324if (associated(this%volanad)) write(unit=lunit)this%volanad
8325if (associated(this%volanaattrd)) write(unit=lunit)this%volanaattrd
8326if (associated(this%voldatid)) write(unit=lunit)this%voldatid
8327if (associated(this%voldatiattrd)) write(unit=lunit)this%voldatiattrd
8328
8329if (associated(this%volanac)) write(unit=lunit)this%volanac
8330if (associated(this%volanaattrc)) write(unit=lunit)this%volanaattrc
8331if (associated(this%voldatic)) write(unit=lunit)this%voldatic
8332if (associated(this%voldatiattrc)) write(unit=lunit)this%voldatiattrc
8333
8334if (.not. present(unit)) close(unit=lunit)
8335
8336end subroutine vol7d_write_on_file
8337
8338
8339!>\brief Lettura da file di un volume Vol7d.
8340!! Lettura da file unformatted di un intero volume Vol7d.
8341!! Questa subroutine comprende vol7d_alloc e vol7d_alloc_vol.
8342!! Il file puo' essere aperto opzionalmente dall'utente. Si possono passare
8343!! opzionalmente unità e nome del file altrimenti assegnati internamente a dei default; se assegnati internamente
8344!! tali parametri saranno in output.
8345
8346
8347subroutine vol7d_read_from_file (this,unit,filename,description,tarray,filename_auto)
8348
8349TYPE(vol7d),INTENT(OUT) :: this !< Volume vol7d da leggere
8350integer,intent(inout),optional :: unit !< unità su cui è stato aperto un file; se =0 rielaborato internamente (default = elaborato internamente con getunit)
8351character(len=*),INTENT(in),optional :: filename !< nome del file eventualmente da aprire (default = (nome dell'eseguibile)//.v7d )
8352character(len=*),intent(out),optional :: filename_auto !< nome del file generato se "filename" è omesso
8353character(len=*),INTENT(out),optional :: description !< descrizione del volume letto
8354integer,intent(out),optional :: tarray(8) !< vettore come definito da "date_and_time" della data di scrittura del volume
8355
8356
8357integer :: nana, ntime, ntimerange, nlevel, nnetwork, &
8358 ndativarr, ndativari, ndativarb, ndativard, ndativarc,&
8359 ndatiattrr, ndatiattri, ndatiattrb, ndatiattrd, ndatiattrc,&
8360 ndativarattrr, ndativarattri, ndativarattrb, ndativarattrd, ndativarattrc,&
8361 nanavarr, nanavari, nanavarb, nanavard, nanavarc,&
8362 nanaattrr, nanaattri, nanaattrb, nanaattrd, nanaattrc,&
8363 nanavarattrr, nanavarattri, nanavarattrb, nanavarattrd, nanavarattrc
8364
8365character(len=254) :: ldescription,lfilename,arg
8366integer :: ltarray(8),lunit,ios
8367logical :: opened,exist
8368
8369
8370call getarg(0,arg)
8371
8372if (.not. present(unit))then
8373 lunit=getunit()
8374else
8375 if (unit==0)then
8376 lunit=getunit()
8377 unit=lunit
8378 else
8379 lunit=unit
8380 end if
8381end if
8382
8383lfilename=trim(arg)//".v7d"
8385
8386if (present(filename))then
8387 if (filename /= "")then
8388 lfilename=filename
8389 end if
8390end if
8391
8392if (present(filename_auto))filename_auto=lfilename
8393
8394
8395inquire(unit=lunit,opened=opened)
8396IF (.NOT. opened) THEN
8397 inquire(file=lfilename,exist=exist)
8398 IF (.NOT.exist) THEN
8399 CALL l4f_log(l4f_fatal, &
8400 'in vol7d_read_from_file, file does not exists, cannot open')
8401 CALL raise_fatal_error()
8402 ENDIF
8403 OPEN(unit=lunit, file=lfilename, form='UNFORMATTED', access='STREAM', &
8404 status='OLD', action='READ')
8405 CALL l4f_log(l4f_info, 'opened: '//trim(lfilename))
8406end if
8407
8408
8410read(unit=lunit,iostat=ios)ldescription
8411
8412if (ios < 0) then ! A negative value indicates that the End of File or End of Record
8413 call vol7d_alloc (this)
8414 call vol7d_alloc_vol (this)
8415 if (present(description))description=ldescription
8416 if (present(tarray))tarray=ltarray
8417 if (.not. present(unit)) close(unit=lunit)
8418end if
8419
8420read(unit=lunit)ltarray
8421
8422CALL l4f_log(l4f_info, 'Reading vol7d from file')
8423CALL l4f_log(l4f_info, 'description: '//trim(ldescription))
8426
8427if (present(description))description=ldescription
8428if (present(tarray))tarray=ltarray
8429
8430read(unit=lunit)&
8431 nana, ntime, ntimerange, nlevel, nnetwork, &
8432 ndativarr, ndativari, ndativarb, ndativard, ndativarc,&
8433 ndatiattrr, ndatiattri, ndatiattrb, ndatiattrd, ndatiattrc,&
8434 ndativarattrr, ndativarattri, ndativarattrb, ndativarattrd, ndativarattrc,&
8435 nanavarr, nanavari, nanavarb, nanavard, nanavarc,&
8436 nanaattrr, nanaattri, nanaattrb, nanaattrd, nanaattrc,&
8437 nanavarattrr, nanavarattri, nanavarattrb, nanavarattrd, nanavarattrc, &
8438 this%time_definition
8439
8440call vol7d_alloc (this, &
8441 nana=nana, ntime=ntime, ntimerange=ntimerange, nlevel=nlevel, nnetwork=nnetwork,&
8442 ndativarr=ndativarr, ndativari=ndativari, ndativarb=ndativarb,&
8443 ndativard=ndativard, ndativarc=ndativarc,&
8444 ndatiattrr=ndatiattrr, ndatiattri=ndatiattri, ndatiattrb=ndatiattrb,&
8445 ndatiattrd=ndatiattrd, ndatiattrc=ndatiattrc,&
8446 ndativarattrr=ndativarattrr, ndativarattri=ndativarattri, ndativarattrb=ndativarattrb, &
8447 ndativarattrd=ndativarattrd, ndativarattrc=ndativarattrc,&
8448 nanavarr=nanavarr, nanavari=nanavari, nanavarb=nanavarb, &
8449 nanavard=nanavard, nanavarc=nanavarc,&
8450 nanaattrr=nanaattrr, nanaattri=nanaattri, nanaattrb=nanaattrb,&
8451 nanaattrd=nanaattrd, nanaattrc=nanaattrc,&
8452 nanavarattrr=nanavarattrr, nanavarattri=nanavarattri, nanavarattrb=nanavarattrb, &
8453 nanavarattrd=nanavarattrd, nanavarattrc=nanavarattrc)
8454
8455
8458if (associated(this%level)) read(unit=lunit)this%level
8459if (associated(this%timerange)) read(unit=lunit)this%timerange
8460if (associated(this%network)) read(unit=lunit)this%network
8461
8462if (associated(this%anavar%r)) read(unit=lunit)this%anavar%r
8463if (associated(this%anavar%i)) read(unit=lunit)this%anavar%i
8464if (associated(this%anavar%b)) read(unit=lunit)this%anavar%b
8465if (associated(this%anavar%d)) read(unit=lunit)this%anavar%d
8466if (associated(this%anavar%c)) read(unit=lunit)this%anavar%c
8467
8468if (associated(this%anaattr%r)) read(unit=lunit)this%anaattr%r
8469if (associated(this%anaattr%i)) read(unit=lunit)this%anaattr%i
8470if (associated(this%anaattr%b)) read(unit=lunit)this%anaattr%b
8471if (associated(this%anaattr%d)) read(unit=lunit)this%anaattr%d
8472if (associated(this%anaattr%c)) read(unit=lunit)this%anaattr%c
8473
8474if (associated(this%anavarattr%r)) read(unit=lunit)this%anavarattr%r
8475if (associated(this%anavarattr%i)) read(unit=lunit)this%anavarattr%i
8476if (associated(this%anavarattr%b)) read(unit=lunit)this%anavarattr%b
8477if (associated(this%anavarattr%d)) read(unit=lunit)this%anavarattr%d
8478if (associated(this%anavarattr%c)) read(unit=lunit)this%anavarattr%c
8479
8480if (associated(this%dativar%r)) read(unit=lunit)this%dativar%r
8481if (associated(this%dativar%i)) read(unit=lunit)this%dativar%i
8482if (associated(this%dativar%b)) read(unit=lunit)this%dativar%b
8483if (associated(this%dativar%d)) read(unit=lunit)this%dativar%d
8484if (associated(this%dativar%c)) read(unit=lunit)this%dativar%c
8485
8486if (associated(this%datiattr%r)) read(unit=lunit)this%datiattr%r
8487if (associated(this%datiattr%i)) read(unit=lunit)this%datiattr%i
8488if (associated(this%datiattr%b)) read(unit=lunit)this%datiattr%b
8489if (associated(this%datiattr%d)) read(unit=lunit)this%datiattr%d
8490if (associated(this%datiattr%c)) read(unit=lunit)this%datiattr%c
8491
8492if (associated(this%dativarattr%r)) read(unit=lunit)this%dativarattr%r
8493if (associated(this%dativarattr%i)) read(unit=lunit)this%dativarattr%i
8494if (associated(this%dativarattr%b)) read(unit=lunit)this%dativarattr%b
8495if (associated(this%dativarattr%d)) read(unit=lunit)this%dativarattr%d
8496if (associated(this%dativarattr%c)) read(unit=lunit)this%dativarattr%c
8497
8498call vol7d_alloc_vol (this)
8499
8500!! Volumi di valori e attributi per anagrafica e dati
8501
8502if (associated(this%volanar)) read(unit=lunit)this%volanar
8503if (associated(this%volanaattrr)) read(unit=lunit)this%volanaattrr
8504if (associated(this%voldatir)) read(unit=lunit)this%voldatir
8505if (associated(this%voldatiattrr)) read(unit=lunit)this%voldatiattrr
8506
8507if (associated(this%volanai)) read(unit=lunit)this%volanai
8508if (associated(this%volanaattri)) read(unit=lunit)this%volanaattri
8509if (associated(this%voldatii)) read(unit=lunit)this%voldatii
8510if (associated(this%voldatiattri)) read(unit=lunit)this%voldatiattri
8511
8512if (associated(this%volanab)) read(unit=lunit)this%volanab
8513if (associated(this%volanaattrb)) read(unit=lunit)this%volanaattrb
8514if (associated(this%voldatib)) read(unit=lunit)this%voldatib
8515if (associated(this%voldatiattrb)) read(unit=lunit)this%voldatiattrb
8516
8517if (associated(this%volanad)) read(unit=lunit)this%volanad
8518if (associated(this%volanaattrd)) read(unit=lunit)this%volanaattrd
8519if (associated(this%voldatid)) read(unit=lunit)this%voldatid
8520if (associated(this%voldatiattrd)) read(unit=lunit)this%voldatiattrd
8521
8522if (associated(this%volanac)) read(unit=lunit)this%volanac
8523if (associated(this%volanaattrc)) read(unit=lunit)this%volanaattrc
8524if (associated(this%voldatic)) read(unit=lunit)this%voldatic
8525if (associated(this%voldatiattrc)) read(unit=lunit)this%voldatiattrc
8526
8527if (.not. present(unit)) close(unit=lunit)
8528
8529end subroutine vol7d_read_from_file
8530
8531
8532! to double precision
8533elemental doubleprecision function doubledatd(voldat,var)
8534doubleprecision,intent(in) :: voldat
8535type(vol7d_var),intent(in) :: var
8536
8537doubledatd=voldat
8538
8539end function doubledatd
8540
8541
8542elemental doubleprecision function doubledatr(voldat,var)
8543real,intent(in) :: voldat
8544type(vol7d_var),intent(in) :: var
8545
8547 doubledatr=dble(voldat)
8548else
8549 doubledatr=dmiss
8550end if
8551
8552end function doubledatr
8553
8554
8555elemental doubleprecision function doubledati(voldat,var)
8556integer,intent(in) :: voldat
8557type(vol7d_var),intent(in) :: var
8558
8561 doubledati=dble(voldat)/10.d0**var%scalefactor
8562 else
8563 doubledati=dble(voldat)
8564 endif
8565else
8566 doubledati=dmiss
8567end if
8568
8569end function doubledati
8570
8571
8572elemental doubleprecision function doubledatb(voldat,var)
8573integer(kind=int_b),intent(in) :: voldat
8574type(vol7d_var),intent(in) :: var
8575
8578 doubledatb=dble(voldat)/10.d0**var%scalefactor
8579 else
8580 doubledatb=dble(voldat)
8581 endif
8582else
8583 doubledatb=dmiss
8584end if
8585
8586end function doubledatb
8587
8588
8589elemental doubleprecision function doubledatc(voldat,var)
8590CHARACTER(len=vol7d_cdatalen),intent(in) :: voldat
8591type(vol7d_var),intent(in) :: var
8592
8593doubledatc = c2d(voldat)
8595 doubledatc=doubledatc/10.d0**var%scalefactor
8596end if
8597
8598end function doubledatc
8599
8600
8601! to integer
8602elemental integer function integerdatd(voldat,var)
8603doubleprecision,intent(in) :: voldat
8604type(vol7d_var),intent(in) :: var
8605
8608 integerdatd=nint(voldat*10d0**var%scalefactor)
8609 else
8610 integerdatd=nint(voldat)
8611 endif
8612else
8613 integerdatd=imiss
8614end if
8615
8616end function integerdatd
8617
8618
8619elemental integer function integerdatr(voldat,var)
8620real,intent(in) :: voldat
8621type(vol7d_var),intent(in) :: var
8622
8625 integerdatr=nint(voldat*10d0**var%scalefactor)
8626 else
8627 integerdatr=nint(voldat)
8628 endif
8629else
8630 integerdatr=imiss
8631end if
8632
8633end function integerdatr
8634
8635
8636elemental integer function integerdati(voldat,var)
8637integer,intent(in) :: voldat
8638type(vol7d_var),intent(in) :: var
8639
8640integerdati=voldat
8641
8642end function integerdati
8643
8644
8645elemental integer function integerdatb(voldat,var)
8646integer(kind=int_b),intent(in) :: voldat
8647type(vol7d_var),intent(in) :: var
8648
8650 integerdatb=voldat
8651else
8652 integerdatb=imiss
8653end if
8654
8655end function integerdatb
8656
8657
8658elemental integer function integerdatc(voldat,var)
8659CHARACTER(len=vol7d_cdatalen),intent(in) :: voldat
8660type(vol7d_var),intent(in) :: var
8661
8662integerdatc=c2i(voldat)
8663
8664end function integerdatc
8665
8666
8667! to real
8668elemental real function realdatd(voldat,var)
8669doubleprecision,intent(in) :: voldat
8670type(vol7d_var),intent(in) :: var
8671
8673 realdatd=real(voldat)
8674else
8675 realdatd=rmiss
8676end if
8677
8678end function realdatd
8679
8680
8681elemental real function realdatr(voldat,var)
8682real,intent(in) :: voldat
8683type(vol7d_var),intent(in) :: var
8684
8685realdatr=voldat
8686
8687end function realdatr
8688
8689
8690elemental real function realdati(voldat,var)
8691integer,intent(in) :: voldat
8692type(vol7d_var),intent(in) :: var
8693
8696 realdati=float(voldat)/10.**var%scalefactor
8697 else
8698 realdati=float(voldat)
8699 endif
8700else
8701 realdati=rmiss
8702end if
8703
8704end function realdati
8705
8706
8707elemental real function realdatb(voldat,var)
8708integer(kind=int_b),intent(in) :: voldat
8709type(vol7d_var),intent(in) :: var
8710
8713 realdatb=float(voldat)/10**var%scalefactor
8714 else
8715 realdatb=float(voldat)
8716 endif
8717else
8718 realdatb=rmiss
8719end if
8720
8721end function realdatb
8722
8723
8724elemental real function realdatc(voldat,var)
8725CHARACTER(len=vol7d_cdatalen),intent(in) :: voldat
8726type(vol7d_var),intent(in) :: var
8727
8728realdatc=c2r(voldat)
8730 realdatc=realdatc/10.**var%scalefactor
8731end if
8732
8733end function realdatc
8734
8735
8736!> Return an ana volume of a requested variable as real data.
8737!! It returns a 2-d array of the proper shape (ana x network) for the
8738!! ana variable requested, converted to real type. If the conversion
8739!! fails or if the variable is not contained in the ana volume,
8740!! missing data are returned.
8741FUNCTION realanavol(this, var) RESULT(vol)
8742TYPE(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
8743TYPE(vol7d_var),INTENT(in) :: var !< the ana variable to be returned
8744REAL :: vol(SIZE(this%ana),size(this%network))
8745
8746CHARACTER(len=1) :: dtype
8747INTEGER :: indvar
8748
8749dtype = cmiss
8750indvar = index(this%anavar, var, type=dtype)
8751
8752IF (indvar > 0) THEN
8753 SELECT CASE (dtype)
8754 CASE("d")
8755 vol = realdat(this%volanad(:,indvar,:), var)
8756 CASE("r")
8757 vol = this%volanar(:,indvar,:)
8758 CASE("i")
8759 vol = realdat(this%volanai(:,indvar,:), var)
8760 CASE("b")
8761 vol = realdat(this%volanab(:,indvar,:), var)
8762 CASE("c")
8763 vol = realdat(this%volanac(:,indvar,:), var)
8764 CASE default
8765 vol = rmiss
8766 END SELECT
8767ELSE
8768 vol = rmiss
8769ENDIF
8770
8771END FUNCTION realanavol
8772
8773
8774!> Return an ana volume of a requested variable as integer data.
8775!! It returns a 2-d array of the proper shape (ana x network) for the
8776!! ana variable requested, converted to integer type. If the conversion
8777!! fails or if the variable is not contained in the ana volume,
8778!! missing data are returned.
8779FUNCTION integeranavol(this, var) RESULT(vol)
8780TYPE(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
8781TYPE(vol7d_var),INTENT(in) :: var !< the ana variable to be returned
8782INTEGER :: vol(SIZE(this%ana),size(this%network))
8783
8784CHARACTER(len=1) :: dtype
8785INTEGER :: indvar
8786
8787dtype = cmiss
8788indvar = index(this%anavar, var, type=dtype)
8789
8790IF (indvar > 0) THEN
8791 SELECT CASE (dtype)
8792 CASE("d")
8793 vol = integerdat(this%volanad(:,indvar,:), var)
8794 CASE("r")
8795 vol = integerdat(this%volanar(:,indvar,:), var)
8796 CASE("i")
8797 vol = this%volanai(:,indvar,:)
8798 CASE("b")
8799 vol = integerdat(this%volanab(:,indvar,:), var)
8800 CASE("c")
8801 vol = integerdat(this%volanac(:,indvar,:), var)
8802 CASE default
8803 vol = imiss
8804 END SELECT
8805ELSE
8806 vol = imiss
8807ENDIF
8808
8809END FUNCTION integeranavol
8810
8811
8812!> Move data for all variables from one coordinate in the character volume to other.
8813!! Only not missing data will be copyed and all attributes will be moved together.
8814!! Usefull to colapse data spread in more indices (level or time or ....).
8815!! After the move is possible to set to missing some descriptor and make a copy with miss=.true.
8816!! to obtain a new vol7d with less data shape.
8817subroutine move_datac (v7d,&
8818 indana,indtime,indlevel,indtimerange,indnetwork,&
8819 indananew,indtimenew,indlevelnew,indtimerangenew,indnetworknew)
8820
8821TYPE(vol7d),intent(inout) :: v7d !< data in form of character in this object will be moved
8822
8823integer,intent(in) :: indana,indtime,indlevel,indtimerange,indnetwork !< source coordinate of the data
8824integer,intent(in) :: indananew,indtimenew,indlevelnew,indtimerangenew,indnetworknew !< destination coordinate of data
8825integer :: inddativar,inddativarattr
8826
8827
8828do inddativar=1,size(v7d%dativar%c)
8829
8831 .not. c_e(v7d%voldatic(indananew,indtimenew,indlevelnew,indtimerangenew,inddativar,indnetworknew))&
8832 ) then
8833
8834 ! dati
8835 v7d%voldatic &
8836 (indananew,indtimenew,indlevelnew,indtimerangenew,inddativar,indnetworknew) = &
8837 v7d%voldatic &
8838 (indana,indtime,indlevel,indtimerange,inddativar,indnetwork)
8839
8840
8841 ! attributi
8842 if (associated (v7d%dativarattr%i)) then
8843 inddativarattr = index(v7d%dativarattr%i,v7d%dativar%c(inddativar))
8844 if (inddativarattr > 0 ) then
8845 v7d%voldatiattri &
8846 (indananew,indtimenew,indlevelnew,indtimerangenew,inddativarattr,indnetworknew,:) = &
8847 v7d%voldatiattri &
8848 (indana,indtime,indlevel,indtimerange,inddativarattr,indnetwork,:)
8849 end if
8850 end if
8851
8852 if (associated (v7d%dativarattr%r)) then
8853 inddativarattr = index(v7d%dativarattr%r,v7d%dativar%c(inddativar))
8854 if (inddativarattr > 0 ) then
8855 v7d%voldatiattrr &
8856 (indananew,indtimenew,indlevelnew,indtimerangenew,inddativarattr,indnetworknew,:) = &
8857 v7d%voldatiattrr &
8858 (indana,indtime,indlevel,indtimerange,inddativarattr,indnetwork,:)
8859 end if
8860 end if
8861
8862 if (associated (v7d%dativarattr%d)) then
8863 inddativarattr = index(v7d%dativarattr%d,v7d%dativar%c(inddativar))
8864 if (inddativarattr > 0 ) then
8865 v7d%voldatiattrd &
8866 (indananew,indtimenew,indlevelnew,indtimerangenew,inddativarattr,indnetworknew,:) = &
8867 v7d%voldatiattrd &
8868 (indana,indtime,indlevel,indtimerange,inddativarattr,indnetwork,:)
8869 end if
8870 end if
8871
8872 if (associated (v7d%dativarattr%b)) then
8873 inddativarattr = index(v7d%dativarattr%b,v7d%dativar%c(inddativar))
8874 if (inddativarattr > 0 ) then
8875 v7d%voldatiattrb &
8876 (indananew,indtimenew,indlevelnew,indtimerangenew,inddativarattr,indnetworknew,:) = &
8877 v7d%voldatiattrb &
8878 (indana,indtime,indlevel,indtimerange,inddativarattr,indnetwork,:)
8879 end if
8880 end if
8881
8882 if (associated (v7d%dativarattr%c)) then
8883 inddativarattr = index(v7d%dativarattr%c,v7d%dativar%c(inddativar))
8884 if (inddativarattr > 0 ) then
8885 v7d%voldatiattrc &
8886 (indananew,indtimenew,indlevelnew,indtimerangenew,inddativarattr,indnetworknew,:) = &
8887 v7d%voldatiattrc &
8888 (indana,indtime,indlevel,indtimerange,inddativarattr,indnetwork,:)
8889 end if
8890 end if
8891
8892 end if
8893
8894end do
8895
8896end subroutine move_datac
8897
8898!> Move data for all variables from one coordinate in the real volume to other.
8899!! Only not missing data will be copyed and all attributes will be moved together.
8900!! Usefull to colapse data spread in more indices (level or time or ....).
8901!! After the move is possible to set to missing some descriptor and make a copy with miss=.true.
8902!! to obtain a new vol7d with less data shape.
8903subroutine move_datar (v7d,&
8904 indana,indtime,indlevel,indtimerange,indnetwork,&
8905 indananew,indtimenew,indlevelnew,indtimerangenew,indnetworknew)
8906
8907TYPE(vol7d),intent(inout) :: v7d !< data in form of character in this object will be moved
8908
8909integer,intent(in) :: indana,indtime,indlevel,indtimerange,indnetwork !< source coordinate of the data
8910integer,intent(in) :: indananew,indtimenew,indlevelnew,indtimerangenew,indnetworknew !< destination coordinate of data
8911integer :: inddativar,inddativarattr
8912
8913
8914do inddativar=1,size(v7d%dativar%r)
8915
8917 .not. c_e(v7d%voldatir(indananew,indtimenew,indlevelnew,indtimerangenew,inddativar,indnetworknew))&
8918 ) then
8919
8920 ! dati
8921 v7d%voldatir &
8922 (indananew,indtimenew,indlevelnew,indtimerangenew,inddativar,indnetworknew) = &
8923 v7d%voldatir &
8924 (indana,indtime,indlevel,indtimerange,inddativar,indnetwork)
8925
8926
8927 ! attributi
8928 if (associated (v7d%dativarattr%i)) then
8929 inddativarattr = index(v7d%dativarattr%i,v7d%dativar%r(inddativar))
8930 if (inddativarattr > 0 ) then
8931 v7d%voldatiattri &
8932 (indananew,indtimenew,indlevelnew,indtimerangenew,inddativarattr,indnetworknew,:) = &
8933 v7d%voldatiattri &
8934 (indana,indtime,indlevel,indtimerange,inddativarattr,indnetwork,:)
8935 end if
8936 end if
8937
8938 if (associated (v7d%dativarattr%r)) then
8939 inddativarattr = index(v7d%dativarattr%r,v7d%dativar%r(inddativar))
8940 if (inddativarattr > 0 ) then
8941 v7d%voldatiattrr &
8942 (indananew,indtimenew,indlevelnew,indtimerangenew,inddativarattr,indnetworknew,:) = &
8943 v7d%voldatiattrr &
8944 (indana,indtime,indlevel,indtimerange,inddativarattr,indnetwork,:)
8945 end if
8946 end if
8947
8948 if (associated (v7d%dativarattr%d)) then
8949 inddativarattr = index(v7d%dativarattr%d,v7d%dativar%r(inddativar))
8950 if (inddativarattr > 0 ) then
8951 v7d%voldatiattrd &
8952 (indananew,indtimenew,indlevelnew,indtimerangenew,inddativarattr,indnetworknew,:) = &
8953 v7d%voldatiattrd &
8954 (indana,indtime,indlevel,indtimerange,inddativarattr,indnetwork,:)
8955 end if
8956 end if
8957
8958 if (associated (v7d%dativarattr%b)) then
8959 inddativarattr = index(v7d%dativarattr%b,v7d%dativar%r(inddativar))
8960 if (inddativarattr > 0 ) then
8961 v7d%voldatiattrb &
8962 (indananew,indtimenew,indlevelnew,indtimerangenew,inddativarattr,indnetworknew,:) = &
8963 v7d%voldatiattrb &
8964 (indana,indtime,indlevel,indtimerange,inddativarattr,indnetwork,:)
8965 end if
8966 end if
8967
8968 if (associated (v7d%dativarattr%c)) then
8969 inddativarattr = index(v7d%dativarattr%c,v7d%dativar%r(inddativar))
8970 if (inddativarattr > 0 ) then
8971 v7d%voldatiattrc &
8972 (indananew,indtimenew,indlevelnew,indtimerangenew,inddativarattr,indnetworknew,:) = &
8973 v7d%voldatiattrc &
8974 (indana,indtime,indlevel,indtimerange,inddativarattr,indnetwork,:)
8975 end if
8976 end if
8977
8978 end if
8979
8980end do
8981
8982end subroutine move_datar
8983
8984
8985!> Reduce some dimensions (level and timerage) for semplification (rounding).
8986!! You can use this for simplify and use variables in computation like alchimia
8987!! where fields have to be on the same coordinate
8988!! It return real or character data only: if input is charcter data only it return character otherwise il return
8989!! all the data converted to real.
8990!! examples:
8991!! means in time for short periods and istantaneous values
8992!! 2 meter and surface levels
8993!! If there are data on more then one almost equal levels or timeranges, the first var present (at least one point)
8994!! will be taken (order is by icreasing var index).
8995!! You can use predefined values for classic semplification
8996!! almost_equal_levels and almost_equal_timeranges
8997!! The level or timerange in output will be defined by the first element of level and timerange list
8998subroutine v7d_rounding(v7din,v7dout,level,timerange,nostatproc)
8999type(vol7d),intent(inout) :: v7din !< input volume
9000type(vol7d),intent(out) :: v7dout !> output volume
9001type(vol7d_level),intent(in),optional :: level(:) !< almost equal level list
9002type(vol7d_timerange),intent(in),optional :: timerange(:) !< almost equal timerange list
9003!logical,intent(in),optional :: merge !< if there are data on more then one almost equal levels or timeranges
9004!! will be merged POINT BY POINT with priority for the fird data found ordered by icreasing var index
9005logical,intent(in),optional :: nostatproc !< do not take in account statistical processing code in timerange and P2
9006
9007integer :: nana,nlevel,ntime,ntimerange,nnetwork,nbin
9008integer :: iana,ilevel,itimerange,indl,indt,itime,inetwork
9009type(vol7d_level) :: roundlevel(size(v7din%level))
9010type(vol7d_timerange) :: roundtimerange(size(v7din%timerange))
9011type(vol7d) :: v7d_tmp
9012
9013
9014nbin=0
9015
9016if (associated(v7din%dativar%r)) nbin = nbin + size(v7din%dativar%r)
9017if (associated(v7din%dativar%i)) nbin = nbin + size(v7din%dativar%i)
9018if (associated(v7din%dativar%d)) nbin = nbin + size(v7din%dativar%d)
9019if (associated(v7din%dativar%b)) nbin = nbin + size(v7din%dativar%b)
9020
9022
9023roundlevel=v7din%level
9024
9025if (present(level))then
9026 do ilevel = 1, size(v7din%level)
9027 if ((any(v7din%level(ilevel) .almosteq. level))) then
9028 roundlevel(ilevel)=level(1)
9029 end if
9030 end do
9031end if
9032
9033roundtimerange=v7din%timerange
9034
9035if (present(timerange))then
9036 do itimerange = 1, size(v7din%timerange)
9037 if ((any(v7din%timerange(itimerange) .almosteq. timerange))) then
9038 roundtimerange(itimerange)=timerange(1)
9039 end if
9040 end do
9041end if
9042
9043!set istantaneous values everywere
9044!preserve p1 for forecast time
9045if (optio_log(nostatproc)) then
9046 roundtimerange(:)%timerange=254
9047 roundtimerange(:)%p2=0
9048end if
9049
9050
9051nana=size(v7din%ana)
9052nlevel=count_distinct(roundlevel,back=.true.)
9053ntime=size(v7din%time)
9054ntimerange=count_distinct(roundtimerange,back=.true.)
9055nnetwork=size(v7din%network)
9056
9058
9059if (nbin == 0) then
9061else
9062 call vol7d_convr(v7din,v7d_tmp)
9063end if
9064
9065v7d_tmp%level=roundlevel
9066v7d_tmp%timerange=roundtimerange
9067
9068do ilevel=1, size(v7d_tmp%level)
9069 indl=index(v7d_tmp%level,roundlevel(ilevel))
9070 do itimerange=1,size(v7d_tmp%timerange)
9071 indt=index(v7d_tmp%timerange,roundtimerange(itimerange))
9072
9073 if (indl /= ilevel .or. indt /= itimerange) then
9074
9075 do iana=1, nana
9076 do itime=1,ntime
9077 do inetwork=1,nnetwork
9078
9079 if (nbin > 0) then
9080 call move_datar (v7d_tmp,&
9081 iana,itime,ilevel,itimerange,inetwork,&
9082 iana,itime,indl,indt,inetwork)
9083 else
9084 call move_datac (v7d_tmp,&
9085 iana,itime,ilevel,itimerange,inetwork,&
9086 iana,itime,indl,indt,inetwork)
9087 end if
9088
9089 end do
9090 end do
9091 end do
9092
9093 end if
9094
9095 end do
9096end do
9097
9098! set to missing level and time > nlevel
9099do ilevel=nlevel+1,size(v7d_tmp%level)
9101end do
9102
9103do itimerange=ntimerange+1,size(v7d_tmp%timerange)
9105end do
9106
9107!copy with remove
9110
9111!call display(v7dout)
9112
9113end subroutine v7d_rounding
9114
9115
9117
9118!>\example esempio_qc_convert.f90
9119!!\brief Programma esempio semplice per la scrittura su file di un volume vol7d
9120!!
9121!!Programma che scrive su file un volume vol7d letto da una serie di file ASCII.
9122!!Questo programma scrive i dati del clima che poi verranno letti da modqccli
9123
9124
9125!>\example esempio_v7ddballe_move_and_collapse.f90
9126!!\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 |