|
libsim Versione 8.0.0
|
◆ vol7d_set_attr_ind()
Metodo per creare gli indici che associano le variabili aventi attributo alle variabili nei relativi descrittori. Ha senso chiamare questo metodo solo dopo che i descrittori delle variabili e degli attributi desiderati sono stati allocati ed è stato assegnato un valore ai relativi membri btable (vedi vol7d_var_class::vol7d_var), se i descrittori non sono stati allocati o assegnati, il metodo non fa niente.
Definizione alla linea 1507 del file vol7d_class.F90. 1508 ENDDO
1509 ENDIF
1510
1511 IF (ASSOCIATED(this%dativarattr%c)) THEN
1512 DO i = 1, SIZE(this%dativar%c)
1513 this%dativar%c(i)%c = &
1514 firsttrue(this%dativar%c(i)%btable == this%dativarattr%c(:)%btable)
1515 ENDDO
1516 ENDIF
1517ENDIF
1518
1519END SUBROUTINE vol7d_set_attr_ind
1520
1521
1522!> Metodo per fondere 2 oggetti vol7d.
1523!! Il secondo volume viene accodato al primo e poi distrutto, si veda
1524!! quindi la descrizione di ::vol7d_append. Se uno degli oggetti \a
1525!! this o \a that sono vuoti non perde tempo inutile,
1526SUBROUTINE vol7d_merge(this, that, sort, bestdata, &
1527 ltimesimple, ltimerangesimple, llevelsimple, lanasimple)
1528TYPE(vol7d),INTENT(INOUT) :: this !< primo oggetto in ingresso, alla fine conterrà il risultato della fusione
1529TYPE(vol7d),INTENT(INOUT) :: that !< secondo oggetto in ingresso, alla fine sarà distrutto
1530LOGICAL,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
1531LOGICAL,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
1532LOGICAL,INTENT(IN),OPTIONAL :: ltimesimple, ltimerangesimple, llevelsimple, lanasimple ! experimental, please do not use outside the library now
1533
1534TYPE(vol7d) :: v7d_clean
1535
1536
1537IF (.NOT.c_e(this)) THEN ! speedup
1538 this = that
1539 CALL init(v7d_clean)
1540 that = v7d_clean ! destroy that without deallocating
1541ELSE ! Append that to this and destroy that
1542 CALL vol7d_append(this, that, sort, bestdata, &
1543 ltimesimple, ltimerangesimple, llevelsimple, lanasimple)
1544 CALL delete(that)
1545ENDIF
1546
1547END SUBROUTINE vol7d_merge
1548
1549
1550!> Metodo per accodare un oggetto vol7d ad un altro.
1551!! Si tratta di un metodo molto potente e versatile;
1552!! i descrittori delle dimensioni del volume finale conterranno i valori
1553!! dei corrispondenti descrittori del primo e del secondo volume
1554!! e i volumi di anagrafica e dati conterranno i valori dei due volumi
1555!! ai posti giusti, e valori mancanti per le nuove combinazioni che
1556!! eventualmente si verranno a creare.
1557!! Se i volumi multidimensionali di anagrafica e/o dati dei 2 oggetti
1558!! hanno un'intersezione non nulla, negli elementi comuni il volume finale
1559!! conterrà il corrispondente elemento del \b secondo volume.
1560!! Attenzione che, durante l'esecuzione del metodo, la memoria richiesta è
1561!! pari alla memoria complessiva occupata dai 2 volumi iniziali più
1562!! la memoria complessiva del volume finale, per cui, nel caso di volumi grandi,
1563!! ci potrebbero essere problemi di esaurimento della memoria centrale.
1564!! Se l'oggetto \a that è vuoto non perde tempo inutile,
1565!!
1566!! \todo nel caso di elementi comuni inserire la possibiità (opzionale per
1567!! non penalizzare le prestazioni quando ciò non serve) di effettuare una scelta
1568!! più ragionata dell'elemento da tenere, almeno controllando i dati mancanti
1569!! se non le flag di qualità
1570!!
1571!! \todo "rateizzare" l'allocazione dei volumi per ridurre l'occupazione di
1572!! memoria nel caso siano allocati contemporaneamente volumi di variabili e
1573!! di attributi o più volumi di tipi diversi
1574!!
1575!! \todo il parametro \a that è dichiarato \a INOUT perché la vol7d_alloc_vol
1576!! può modificarlo, bisognerebbe implementare una vol7d_check_vol che restituisca
1577!! errore anziché usare la vol7d_alloc_vol.
1578SUBROUTINE vol7d_append(this, that, sort, bestdata, &
1579 ltimesimple, ltimerangesimple, llevelsimple, lanasimple, lnetworksimple)
1580TYPE(vol7d),INTENT(INOUT) :: this !< primo oggetto in ingresso, a cui sarà accodato il secondo
1581TYPE(vol7d),INTENT(IN) :: that !< secondo oggetto in ingresso, non viene modificato dal metodo
1582LOGICAL,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
1583! experimental, please do not use outside the library now, they force the use
1584! of a simplified mapping algorithm which is valid only whene the dimension
1585! content is the same in both volumes , or when one of them is empty
1586LOGICAL,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
1587LOGICAL,INTENT(IN),OPTIONAL :: ltimesimple, ltimerangesimple, llevelsimple, lanasimple, lnetworksimple
1588
1589
1590TYPE(vol7d) :: v7dtmp
1591LOGICAL :: lsort, lbestdata
1592INTEGER,POINTER :: remapt1(:), remapt2(:), remaptr1(:), remaptr2(:), &
1593 remapl1(:), remapl2(:), remapa1(:), remapa2(:), remapn1(:), remapn2(:)
1594
1595IF (.NOT.c_e(that)) RETURN ! speedup, nothing to do
1596IF (.NOT.vol7d_check_vol(that)) RETURN ! be safe
1597IF (.NOT.c_e(this)) THEN ! this case is like a vol7d_copy, more efficient to copy?
1598 CALL vol7d_copy(that, this, sort=sort)
1599 RETURN
1600ENDIF
1601
1602IF (this%time_definition /= that%time_definition) THEN
1603 CALL l4f_log(l4f_fatal, &
1604 'in vol7d_append, cannot append volumes with different &
1605 &time definition')
1606 CALL raise_fatal_error()
1607ENDIF
1608
1609! Completo l'allocazione per avere volumi a norma
1610CALL vol7d_alloc_vol(this)
1611
1612CALL init(v7dtmp, time_definition=this%time_definition)
1613CALL optio(sort, lsort)
1614CALL optio(bestdata, lbestdata)
1615
1616! Calcolo le mappature tra volumi vecchi e volume nuovo
1617! I puntatori remap* vengono tutti o allocati o nullificati
1618IF (optio_log(ltimesimple)) THEN
1619 CALL vol7d_remap2simple_datetime(this%time, that%time, v7dtmp%time, &
1620 lsort, remapt1, remapt2)
1621ELSE
1622 CALL vol7d_remap2_datetime(this%time, that%time, v7dtmp%time, &
1623 lsort, remapt1, remapt2)
1624ENDIF
1625IF (optio_log(ltimerangesimple)) THEN
1626 CALL vol7d_remap2simple_vol7d_timerange(this%timerange, that%timerange, &
1627 v7dtmp%timerange, lsort, remaptr1, remaptr2)
1628ELSE
1629 CALL vol7d_remap2_vol7d_timerange(this%timerange, that%timerange, &
1630 v7dtmp%timerange, lsort, remaptr1, remaptr2)
1631ENDIF
1632IF (optio_log(llevelsimple)) THEN
1633 CALL vol7d_remap2simple_vol7d_level(this%level, that%level, v7dtmp%level, &
1634 lsort, remapl1, remapl2)
1635ELSE
1636 CALL vol7d_remap2_vol7d_level(this%level, that%level, v7dtmp%level, &
1637 lsort, remapl1, remapl2)
1638ENDIF
1639IF (optio_log(lanasimple)) THEN
1640 CALL vol7d_remap2simple_vol7d_ana(this%ana, that%ana, v7dtmp%ana, &
1641 .false., remapa1, remapa2)
1642ELSE
1643 CALL vol7d_remap2_vol7d_ana(this%ana, that%ana, v7dtmp%ana, &
1644 .false., remapa1, remapa2)
1645ENDIF
1646IF (optio_log(lnetworksimple)) THEN
1647 CALL vol7d_remap2simple_vol7d_network(this%network, that%network, v7dtmp%network, &
1648 .false., remapn1, remapn2)
1649ELSE
1650 CALL vol7d_remap2_vol7d_network(this%network, that%network, v7dtmp%network, &
1651 .false., remapn1, remapn2)
1652ENDIF
1653
1654! Faccio la fusione fisica dei volumi
1655CALL vol7d_merge_finalr(this, that, v7dtmp, &
1656 remapa1, remapa2, remapt1, remapt2, remapl1, remapl2, &
1657 remaptr1, remaptr2, remapn1, remapn2, lbestdata)
1658CALL vol7d_merge_finald(this, that, v7dtmp, &
1659 remapa1, remapa2, remapt1, remapt2, remapl1, remapl2, &
1660 remaptr1, remaptr2, remapn1, remapn2, lbestdata)
1661CALL vol7d_merge_finali(this, that, v7dtmp, &
1662 remapa1, remapa2, remapt1, remapt2, remapl1, remapl2, &
1663 remaptr1, remaptr2, remapn1, remapn2, lbestdata)
1664CALL vol7d_merge_finalb(this, that, v7dtmp, &
1665 remapa1, remapa2, remapt1, remapt2, remapl1, remapl2, &
1666 remaptr1, remaptr2, remapn1, remapn2, lbestdata)
1667CALL vol7d_merge_finalc(this, that, v7dtmp, &
1668 remapa1, remapa2, remapt1, remapt2, remapl1, remapl2, &
1669 remaptr1, remaptr2, remapn1, remapn2, lbestdata)
1670
1671! Dealloco i vettori di rimappatura
1672IF (ASSOCIATED(remapt1)) DEALLOCATE(remapt1)
1673IF (ASSOCIATED(remapt2)) DEALLOCATE(remapt2)
1674IF (ASSOCIATED(remaptr1)) DEALLOCATE(remaptr1)
1675IF (ASSOCIATED(remaptr2)) DEALLOCATE(remaptr2)
1676IF (ASSOCIATED(remapl1)) DEALLOCATE(remapl1)
1677IF (ASSOCIATED(remapl2)) DEALLOCATE(remapl2)
1678IF (ASSOCIATED(remapa1)) DEALLOCATE(remapa1)
1679IF (ASSOCIATED(remapa2)) DEALLOCATE(remapa2)
1680IF (ASSOCIATED(remapn1)) DEALLOCATE(remapn1)
1681IF (ASSOCIATED(remapn2)) DEALLOCATE(remapn2)
1682
1683! Distruggo il vecchio volume e assegno il nuovo a this
1684CALL delete(this)
1685this = v7dtmp
1686! Ricreo gli indici var-attr
1687CALL vol7d_set_attr_ind(this)
1688
1689END SUBROUTINE vol7d_append
1690
1691
1692!> Metodo per creare una copia completa e indipendente di un oggetto vol7d.
1693!! Questo metodo crea un duplicato di tutti i membri di un oggetto vol7d,
1694!! con la possibilità di rielaborarlo durante la copia. Se l'oggetto da copiare
1695!! è vuoto non perde tempo inutile.
1696!! Attenzione, il codice:
1697!! \code
|