libsim Versione 8.0.0

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

Generated with Doxygen.