libsim Versione 7.2.6
|
◆ vol7d_append()
Metodo per accodare un oggetto vol7d ad un altro. Si tratta di un metodo molto potente e versatile; i descrittori delle dimensioni del volume finale conterranno i valori dei corrispondenti descrittori del primo e del secondo volume e i volumi di anagrafica e dati conterranno i valori dei due volumi ai posti giusti, e valori mancanti per le nuove combinazioni che eventualmente si verranno a creare. Se i volumi multidimensionali di anagrafica e/o dati dei 2 oggetti hanno un'intersezione non nulla, negli elementi comuni il volume finale conterrà il corrispondente elemento del secondo volume. Attenzione che, durante l'esecuzione del metodo, la memoria richiesta è pari alla memoria complessiva occupata dai 2 volumi iniziali più la memoria complessiva del volume finale, per cui, nel caso di volumi grandi, ci potrebbero essere problemi di esaurimento della memoria centrale. Se l'oggetto that è vuoto non perde tempo inutile,
Definizione alla linea 1756 del file vol7d_class.F90. 1758 lanavarr(:), lanavard(:), lanavari(:), lanavarb(:), lanavarc(:), &
1759 lanaattrr(:), lanaattrd(:), lanaattri(:), lanaattrb(:), lanaattrc(:), &
1760 lanavarattrr(:), lanavarattrd(:), lanavarattri(:), lanavarattrb(:), lanavarattrc(:), &
1761 ldativarr(:), ldativard(:), ldativari(:), ldativarb(:), ldativarc(:), &
1762 ldatiattrr(:), ldatiattrd(:), ldatiattri(:), ldatiattrb(:), ldatiattrc(:), &
1763 ldativarattrr(:), ldativarattrd(:), ldativarattri(:), ldativarattrb(:), ldativarattrc(:)
1764
1765LOGICAL :: lsort, lunique, lmiss
1766INTEGER,POINTER :: remapt(:), remaptr(:), remapl(:), remapa(:), remapn(:)
1767
1768CALL init(that)
1769IF (.NOT.c_e(this)) RETURN ! speedup, nothing to do
1770IF (.NOT.vol7d_check_vol(this)) RETURN ! be safe
1771
1772CALL optio(sort, lsort)
1773CALL optio(unique, lunique)
1774CALL optio(miss, lmiss)
1775
1776! Calcolo le mappature tra volume vecchio e volume nuovo
1777! I puntatori remap* vengono tutti o allocati o nullificati
1778CALL vol7d_remap1_datetime(this%time, that%time, &
1779 lsort.OR.optio_log(lsort_time), lunique, lmiss, remapt, ltime)
1780CALL vol7d_remap1_vol7d_timerange(this%timerange, that%timerange, &
1781 lsort.OR.optio_log(lsort_timerange), lunique, lmiss, remaptr, ltimerange)
1782CALL vol7d_remap1_vol7d_level(this%level, that%level, &
1783 lsort.OR.optio_log(lsort_level), lunique, lmiss, remapl, llevel)
1784CALL vol7d_remap1_vol7d_ana(this%ana, that%ana, &
1785 lsort, lunique, lmiss, remapa, lana)
1786CALL vol7d_remap1_vol7d_network(this%network, that%network, &
1787 lsort, lunique, lmiss, remapn, lnetwork)
1788
1789! lanavari, lanavarb, lanavarc, &
1790! lanaattri, lanaattrb, lanaattrc, &
1791! lanavarattri, lanavarattrb, lanavarattrc, &
1792! ldativari, ldativarb, ldativarc, &
1793! ldatiattri, ldatiattrb, ldatiattrc, &
1794! ldativarattri, ldativarattrb, ldativarattrc
1795! Faccio la riforma fisica dei volumi
1796CALL vol7d_reform_finalr(this, that, &
1797 remapa, remapt, remapl, remaptr, remapn, lsort, lunique, lmiss, &
1798 lanavarr, lanaattrr, lanavarattrr, ldativarr, ldatiattrr, ldativarattrr)
1799CALL vol7d_reform_finald(this, that, &
1800 remapa, remapt, remapl, remaptr, remapn, lsort, lunique, lmiss, &
1801 lanavard, lanaattrd, lanavarattrd, ldativard, ldatiattrd, ldativarattrd)
1802CALL vol7d_reform_finali(this, that, &
1803 remapa, remapt, remapl, remaptr, remapn, lsort, lunique, lmiss, &
1804 lanavari, lanaattri, lanavarattri, ldativari, ldatiattri, ldativarattri)
1805CALL vol7d_reform_finalb(this, that, &
1806 remapa, remapt, remapl, remaptr, remapn, lsort, lunique, lmiss, &
1807 lanavarb, lanaattrb, lanavarattrb, ldativarb, ldatiattrb, ldativarattrb)
1808CALL vol7d_reform_finalc(this, that, &
1809 remapa, remapt, remapl, remaptr, remapn, lsort, lunique, lmiss, &
1810 lanavarc, lanaattrc, lanavarattrc, ldativarc, ldatiattrc, ldativarattrc)
1811
1812! Dealloco i vettori di rimappatura
1813IF (ASSOCIATED(remapt)) DEALLOCATE(remapt)
1814IF (ASSOCIATED(remaptr)) DEALLOCATE(remaptr)
1815IF (ASSOCIATED(remapl)) DEALLOCATE(remapl)
1816IF (ASSOCIATED(remapa)) DEALLOCATE(remapa)
1817IF (ASSOCIATED(remapn)) DEALLOCATE(remapn)
1818
1819! Ricreo gli indici var-attr
1820CALL vol7d_set_attr_ind(that)
1821that%time_definition = this%time_definition
1822
1823END SUBROUTINE vol7d_copy
1824
1825
1826!> Metodo per riformare in varie maniere un oggetto vol7d.
1827!! Equivale ad una copia (vedi ::vol7d_copy)
1828!! seguita dalla distruzione del volume iniziale e alla
1829!! sua riassegnazione al volume copiato. Ha senso se almeno uno dei parametri
1830!! \a sort, \a uniq o \a miss è fornito uguale a \c .TRUE., altrimenti
1831!! è solo una perdita di tempo.
1832!! Può essere utile, ad esempio, per eliminare stazioni
1833!! o istanti temporali indesiderati, basta assegnare il loro corrispondente
1834!! elemento del descrittore a valore mancante e chiamare vol7d_reform
1835!! con miss=.TRUE. .
1836SUBROUTINE vol7d_reform(this, sort, unique, miss, &
1837 lsort_time, lsort_timerange, lsort_level, &
1838 ltime, ltimerange, llevel, lana, lnetwork, &
1839 lanavarr, lanavard, lanavari, lanavarb, lanavarc, &
1840 lanaattrr, lanaattrd, lanaattri, lanaattrb, lanaattrc, &
1841 lanavarattrr, lanavarattrd, lanavarattri, lanavarattrb, lanavarattrc, &
1842 ldativarr, ldativard, ldativari, ldativarb, ldativarc, &
1843 ldatiattrr, ldatiattrd, ldatiattri, ldatiattrb, ldatiattrc, &
1844 ldativarattrr, ldativarattrd, ldativarattri, ldativarattrb, ldativarattrc&
1845 ,purgeana)
1846TYPE(vol7d),INTENT(INOUT) :: this !< oggetto da riformare
1847LOGICAL,INTENT(IN),OPTIONAL :: sort !< if present and \a .TRUE., sort all the sortable dimensions
1848LOGICAL,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)
1849LOGICAL,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
1850LOGICAL,INTENT(IN),OPTIONAL :: lsort_time !< if present and \a .TRUE., sort only time dimension (alternative to \a sort )
1851LOGICAL,INTENT(IN),OPTIONAL :: lsort_timerange !< if present and \a .TRUE., sort only timerange dimension (alternative to \a sort )
1852LOGICAL,INTENT(IN),OPTIONAL :: lsort_level !< if present and \a .TRUE., sort only level dimension (alternative to \a sort )
1853!> se fornito, deve essere un vettore logico della stessa lunghezza di
1854!! this%time indicante quali elementi della dimensione \a time
1855!! mantenere (valori \c .TRUE.) e quali scartare (valori \c .FALSE.)
1856!! nel volume copiato; in alternativa può essere un vettore di
1857!! lunghezza 1, in tal caso, se \c .FALSE. , equivale a scartare tutti
1858!! gli elementi (utile principalmente per le variabili); è compatibile
1859!! col parametro \a miss
1860LOGICAL,INTENT(IN),OPTIONAL :: ltime(:)
1861LOGICAL,INTENT(IN),OPTIONAL :: ltimerange(:) !< come il precedente per la dimensione \a timerange
1862LOGICAL,INTENT(IN),OPTIONAL :: llevel(:) !< come il precedente per la dimensione \a level
1863LOGICAL,INTENT(IN),OPTIONAL :: lana(:) !< come il precedente per la dimensione \a ana
1864LOGICAL,INTENT(IN),OPTIONAL :: lnetwork(:) !< come il precedente per la dimensione \a network
1865!> come il precedente per tutte le possibili dimensioni variabile
1866LOGICAL,INTENT(in),OPTIONAL :: &
|