libsim Versione 8.0.0

◆ vol7d_copy()

subroutine vol7d_copy ( type(vol7d), intent(in) this,
type(vol7d), intent(inout) that,
logical, intent(in), optional sort,
logical, intent(in), optional unique,
logical, intent(in), optional miss,
logical, intent(in), optional lsort_time,
logical, intent(in), optional lsort_timerange,
logical, intent(in), optional lsort_level,
logical, dimension(:), intent(in), optional ltime,
logical, dimension(:), intent(in), optional ltimerange,
logical, dimension(:), intent(in), optional llevel,
logical, dimension(:), intent(in), optional lana,
logical, dimension(:), intent(in), optional lnetwork,
logical, dimension(:), intent(in), optional lanavarr,
logical, dimension(:), intent(in), optional lanavard,
logical, dimension(:), intent(in), optional lanavari,
logical, dimension(:), intent(in), optional lanavarb,
logical, dimension(:), intent(in), optional lanavarc,
logical, dimension(:), intent(in), optional lanaattrr,
logical, dimension(:), intent(in), optional lanaattrd,
logical, dimension(:), intent(in), optional lanaattri,
logical, dimension(:), intent(in), optional lanaattrb,
logical, dimension(:), intent(in), optional lanaattrc,
logical, dimension(:), intent(in), optional lanavarattrr,
logical, dimension(:), intent(in), optional lanavarattrd,
logical, dimension(:), intent(in), optional lanavarattri,
logical, dimension(:), intent(in), optional lanavarattrb,
logical, dimension(:), intent(in), optional lanavarattrc,
logical, dimension(:), intent(in), optional ldativarr,
logical, dimension(:), intent(in), optional ldativard,
logical, dimension(:), intent(in), optional ldativari,
logical, dimension(:), intent(in), optional ldativarb,
logical, dimension(:), intent(in), optional ldativarc,
logical, dimension(:), intent(in), optional ldatiattrr,
logical, dimension(:), intent(in), optional ldatiattrd,
logical, dimension(:), intent(in), optional ldatiattri,
logical, dimension(:), intent(in), optional ldatiattrb,
logical, dimension(:), intent(in), optional ldatiattrc,
logical, dimension(:), intent(in), optional ldativarattrr,
logical, dimension(:), intent(in), optional ldativarattrd,
logical, dimension(:), intent(in), optional ldativarattri,
logical, dimension(:), intent(in), optional ldativarattrb,
logical, dimension(:), intent(in), optional ldativarattrc )

Metodo per creare una copia completa e indipendente di un oggetto vol7d.

Questo metodo crea un duplicato di tutti i membri di un oggetto vol7d, con la possibilità di rielaborarlo durante la copia. Se l'oggetto da copiare è vuoto non perde tempo inutile. Attenzione, il codice:

TYPE(vol7d) :: vol1, vol2
CALL init(vol1)
CALL init(vol2)
... ! riempio vol1
vol2 = vol1
Costruttore per la classe vol7d.
Classe per la gestione di un volume completo di dati osservati.

fa una cosa diversa rispetto a:

TYPE(vol7d) :: vol1, vol2
CALL init(vol1)
CALL init(vol2)
... ! riempio vol1
CALL vol7d_copy(vol1, vol2)

nel primo caso, infatti, l'operatore di assegnazione copia solo i componenti statici di vol1 nei corrispondenti elementi di vol2, mentre i componenti che sono allocati dinamicamente (cioè quelli che in vol7d hanno l'attributo POINTER, in pratica quasi tutti) non vengono duplicati, ma per essi vol2 conterrà un puntatore al corrispondente elemento a cui già punta vol1, e quindi eventuali cambiamenti al contenuto di uno dei due oggetti influenzerà il contenuto dell'altro; nel secondo caso, invece, vol1 e vol2 sono, dopo la vol7d_copy, 2 istanze completamente indipendenti, ma uguali tra loro per contenuto, della classe vol7d, e quindi hanno vita indipendente.

Parametri
[in]thisoggetto origine
[in,out]thatoggetto destinazione
[in]sortif present and .TRUE., sort all the sortable dimensions
[in]uniquese fornito e uguale a .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)
[in]missse fornito e uguale a .TRUE., gli eventuali elementi dei descrittori uguali al corrispondente valore mancante verranno eliminati dall'oggetto riformato
[in]lsort_timeif present and .TRUE., sort only time dimension (alternative to sort )
[in]lsort_timerangeif present and .TRUE., sort only timerange dimension (alternative to sort )
[in]lsort_levelif present and .TRUE., sort only level dimension (alternative to sort )
[in]ltimese fornito, deve essere un vettore logico della stessa lunghezza di thistime indicante quali elementi della dimensione time mantenere (valori .TRUE.) e quali scartare (valori .FALSE.) nel volume copiato; in alternativa può essere un vettore di lunghezza 1, in tal caso, se .FALSE. , equivale a scartare tutti gli elementi (utile principalmente per le variabili); è compatibile col parametro miss
[in]ltimerangecome il precedente per la dimensione timerange
[in]llevelcome il precedente per la dimensione level
[in]lanacome il precedente per la dimensione ana
[in]lnetworkcome il precedente per la dimensione network
[in]lanavarrcome il precedente per tutte le possibili dimensioni variabile
[in]lanavardcome il precedente per tutte le possibili dimensioni variabile
[in]lanavaricome il precedente per tutte le possibili dimensioni variabile
[in]lanavarbcome il precedente per tutte le possibili dimensioni variabile
[in]lanavarccome il precedente per tutte le possibili dimensioni variabile
[in]lanaattrrcome il precedente per tutte le possibili dimensioni variabile
[in]lanaattrdcome il precedente per tutte le possibili dimensioni variabile
[in]lanaattricome il precedente per tutte le possibili dimensioni variabile
[in]lanaattrbcome il precedente per tutte le possibili dimensioni variabile
[in]lanaattrccome il precedente per tutte le possibili dimensioni variabile
[in]lanavarattrrcome il precedente per tutte le possibili dimensioni variabile
[in]lanavarattrdcome il precedente per tutte le possibili dimensioni variabile
[in]lanavarattricome il precedente per tutte le possibili dimensioni variabile
[in]lanavarattrbcome il precedente per tutte le possibili dimensioni variabile
[in]lanavarattrccome il precedente per tutte le possibili dimensioni variabile
[in]ldativarrcome il precedente per tutte le possibili dimensioni variabile
[in]ldativardcome il precedente per tutte le possibili dimensioni variabile
[in]ldativaricome il precedente per tutte le possibili dimensioni variabile
[in]ldativarbcome il precedente per tutte le possibili dimensioni variabile
[in]ldativarccome il precedente per tutte le possibili dimensioni variabile
[in]ldatiattrrcome il precedente per tutte le possibili dimensioni variabile
[in]ldatiattrdcome il precedente per tutte le possibili dimensioni variabile
[in]ldatiattricome il precedente per tutte le possibili dimensioni variabile
[in]ldatiattrbcome il precedente per tutte le possibili dimensioni variabile
[in]ldatiattrccome il precedente per tutte le possibili dimensioni variabile
[in]ldativarattrrcome il precedente per tutte le possibili dimensioni variabile
[in]ldativarattrdcome il precedente per tutte le possibili dimensioni variabile
[in]ldativarattricome il precedente per tutte le possibili dimensioni variabile
[in]ldativarattrbcome il precedente per tutte le possibili dimensioni variabile
[in]ldativarattrccome il precedente per tutte le possibili dimensioni variabile

Definizione alla linea 1903 del file vol7d_class.F90.

1912
1913!> Sorts the sortable dimensions in the volume \a this only when necessary.
1914!! Most of the times, the time, timerange and level dimensions in a
1915!! vol7d object are correctly sorted; on the other side many methods
1916!! strictly rely on this fact in order to work correctly. This method
1917!! performs a quick check and sorts the required dimensions only if
1918!! they are not sorted in ascending order yet, improving safety
1919!! without impairing much performance.
1920SUBROUTINE vol7d_smart_sort(this, lsort_time, lsort_timerange, lsort_level)
1921TYPE(vol7d),INTENT(INOUT) :: this !< object to be sorted
1922LOGICAL,OPTIONAL,INTENT(in) :: lsort_time !< if present and \a .TRUE., sort time dimension if it is not sorted in ascending order
1923LOGICAL,OPTIONAL,INTENT(in) :: lsort_timerange !< if present and \a .TRUE., sort timerange dimension if it is not sorted in ascending order
1924LOGICAL,OPTIONAL,INTENT(in) :: lsort_level !< if present and \a .TRUE., sort vertical level dimension if it is not sorted in ascending order
1925
1926INTEGER :: i
1927LOGICAL :: to_be_sorted
1928
1929to_be_sorted = .false.
1930CALL vol7d_alloc_vol(this) ! usual safety check
1931
1932IF (optio_log(lsort_time)) THEN
1933 DO i = 2, SIZE(this%time)
1934 IF (this%time(i) < this%time(i-1)) THEN
1935 to_be_sorted = .true.
1936 EXIT
1937 ENDIF
1938 ENDDO
1939ENDIF
1940IF (optio_log(lsort_timerange)) THEN
1941 DO i = 2, SIZE(this%timerange)
1942 IF (this%timerange(i) < this%timerange(i-1)) THEN
1943 to_be_sorted = .true.
1944 EXIT
1945 ENDIF
1946 ENDDO
1947ENDIF
1948IF (optio_log(lsort_level)) THEN
1949 DO i = 2, SIZE(this%level)
1950 IF (this%level(i) < this%level(i-1)) THEN
1951 to_be_sorted = .true.
1952 EXIT
1953 ENDIF
1954 ENDDO
1955ENDIF
1956
1957IF (to_be_sorted) CALL vol7d_reform(this, &
1958 lsort_time=lsort_time, lsort_timerange=lsort_timerange, lsort_level=lsort_level )
1959
1960END SUBROUTINE vol7d_smart_sort
1961
1962!> Filter the contents of a volume keeping only desired data.
1963!! This subroutine filters a vol7d object by keeping only a subset of
1964!! the data contained. It can keep only times within a specified
1965!! interval, only station networks contained in a list and only
1966!! specified station or data variables. If a filter parameter is not
1967!! provided, no filtering will take place according to that criterion.
1968!! The volume is reallocated keeping only the desired data.
1969SUBROUTINE vol7d_filter(this, avl, vl, nl, s_d, e_d)
1970TYPE(vol7d),INTENT(inout) :: this !< volume to be filtered
1971CHARACTER(len=*),INTENT(in),OPTIONAL :: avl(:) !< list of station variables to be kept, if not provided or of zero length, all variables are kept
1972CHARACTER(len=*),INTENT(in),OPTIONAL :: vl(:) !< list of data variables to be kept, if not provided or of zero length, all variables are kept
1973TYPE(vol7d_network),OPTIONAL :: nl(:) !< list of station networks to be kept, if not provided or of zero length, all networks are kept
1974TYPE(datetime),INTENT(in),OPTIONAL :: s_d !< initial time interval for time filtering, if not provided or equal to missing data no lower limit is imposed
1975TYPE(datetime),INTENT(in),OPTIONAL :: e_d !< final time interval for time filtering, if not provided or equal to missing data no upper limit is imposed
1976
1977INTEGER :: i
1978
1979IF (PRESENT(avl)) THEN
1980 IF (SIZE(avl) > 0) THEN
1981
1982 IF (ASSOCIATED(this%anavar%r)) THEN
1983 DO i = 1, SIZE(this%anavar%r)
1984 IF (all(this%anavar%r(i)%btable /= avl)) this%anavar%r(i) = vol7d_var_miss
1985 ENDDO
1986 ENDIF
1987
1988 IF (ASSOCIATED(this%anavar%i)) THEN
1989 DO i = 1, SIZE(this%anavar%i)
1990 IF (all(this%anavar%i(i)%btable /= avl)) this%anavar%i(i) = vol7d_var_miss
1991 ENDDO
1992 ENDIF
1993
1994 IF (ASSOCIATED(this%anavar%b)) THEN
1995 DO i = 1, SIZE(this%anavar%b)
1996 IF (all(this%anavar%b(i)%btable /= avl)) this%anavar%b(i) = vol7d_var_miss
1997 ENDDO
1998 ENDIF
1999
2000 IF (ASSOCIATED(this%anavar%d)) THEN
2001 DO i = 1, SIZE(this%anavar%d)
2002 IF (all(this%anavar%d(i)%btable /= avl)) this%anavar%d(i) = vol7d_var_miss

Generated with Doxygen.