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