libsim Versione 7.2.6

◆ vol7d_append()

subroutine vol7d_append ( type(vol7d), intent(inout) this,
type(vol7d), intent(in) that,
logical, intent(in), optional sort,
logical, intent(in), optional bestdata,
logical, intent(in), optional ltimesimple,
logical, intent(in), optional ltimerangesimple,
logical, intent(in), optional llevelsimple,
logical, intent(in), optional lanasimple,
logical, intent(in), optional lnetworksimple )

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,

Da fare
nel caso di elementi comuni inserire la possibiità (opzionale per non penalizzare le prestazioni quando ciò non serve) di effettuare una scelta più ragionata dell'elemento da tenere, almeno controllando i dati mancanti se non le flag di qualità
Da fare
"rateizzare" l'allocazione dei volumi per ridurre l'occupazione di memoria nel caso siano allocati contemporaneamente volumi di variabili e di attributi o più volumi di tipi diversi
Da fare
il parametro that è dichiarato INOUT perché la vol7d_alloc_vol può modificarlo, bisognerebbe implementare una vol7d_check_vol che restituisca errore anziché usare la vol7d_alloc_vol.
Parametri
[in,out]thisprimo oggetto in ingresso, a cui sarà accodato il secondo
[in]thatsecondo oggetto in ingresso, non viene modificato dal metodo
[in]sortse fornito e uguale a .TRUE., i descrittori che supportano un ordinamento (operatori > e/o <) risulteranno ordinati in ordine crescente nell'oggetto finale
[in]bestdataif provided and .TRUE. in case of overlapping volumes keep valid data where available, or data from the second volume if both valid

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 :: &

Generated with Doxygen.