|
libsim Versione 8.0.0
|
◆ vol7d_convr()
Metodo per convertire i volumi di dati di un oggetto vol7d in dati reali dove possibile. L'oggetto convertito è una copia completa dell'originale che può essere quindi distrutto dopo la chiamata. Per i dati di anagrafica, al momento sono convertiti solo i dati CHARACTER se è passato anaconv=.TRUE. Gli attributi non sono toccati.
Definizione alla linea 2271 del file vol7d_class.F90. 2272 ALLOCATE(v7d_tmp%volanar(SIZE(v7d_tmp%volanac, 1), SIZE(v7d_tmp%volanac, 2), &
2273 SIZE(v7d_tmp%volanac, 3)))
2274 DO i = 1, SIZE(v7d_tmp%anavar%c)
2275 v7d_tmp%volanar(:,i,:) = &
2276 realdat(v7d_tmp%volanac(:,i,:), v7d_tmp%anavar%c(i))
2277 ENDDO
2278 DEALLOCATE(v7d_tmp%volanac)
2279! trasferisco le variabili
2280 v7d_tmp%anavar%r => v7d_tmp%anavar%c
2281 NULLIFY(v7d_tmp%anavar%c)
2282 ENDIF
2283
2284 IF (ASSOCIATED(v7d_tmp%dativar%c)) THEN
2285! alloco i dati reali e vi trasferisco i character
2286 ALLOCATE(v7d_tmp%voldatir(SIZE(v7d_tmp%voldatic, 1), SIZE(v7d_tmp%voldatic, 2), &
2287 SIZE(v7d_tmp%voldatic, 3), SIZE(v7d_tmp%voldatic, 4), SIZE(v7d_tmp%voldatic, 5), &
2288 SIZE(v7d_tmp%voldatic, 6)))
2289 DO i = 1, SIZE(v7d_tmp%dativar%c)
2290 v7d_tmp%voldatir(:,:,:,:,i,:) = &
2291 realdat(v7d_tmp%voldatic(:,:,:,:,i,:), v7d_tmp%dativar%c(i))
2292 ENDDO
2293 DEALLOCATE(v7d_tmp%voldatic)
2294! trasferisco le variabili
2295 v7d_tmp%dativar%r => v7d_tmp%dativar%c
2296 NULLIFY(v7d_tmp%dativar%c)
2297 ENDIF
2298
2299! fondo con il volume definitivo
2300 CALL vol7d_merge(that, v7d_tmp)
2301ELSE
2302 CALL delete(v7d_tmp)
2303ENDIF
2304
2305END SUBROUTINE vol7d_convr
2306
2307
2308!> Metodo per ottenere solo le differenze tra due oggetti vol7d.
2309!! Il primo volume viene confrontato col secondo; nel secondo volume ovunque
2310!! i dati confrontati siano coincidenti viene impostato valore mancante.
2311SUBROUTINE vol7d_diff_only (this, that, data_only,ana)
2312TYPE(vol7d),INTENT(IN) :: this !< primo volume da confrontare
2313TYPE(vol7d),INTENT(OUT) :: that !< secondo volume da confrontare in cui eliminare i dati coincidenti
2314logical , optional, intent(in) :: data_only !< attiva l'elaborazione dei soli dati e non dell'anagrafica (default: .false.)
2315logical , optional, intent(in) :: ana !< attiva l'elaborazione dell'anagrafica (coordinate e ident) (default: .false.)
2316logical :: ldata_only,lana
2317
2318IF (PRESENT(data_only)) THEN
2319 ldata_only = data_only
2320ELSE
2321 ldata_only = .false.
2322ENDIF
2323
2324IF (PRESENT(ana)) THEN
2325 lana = ana
2326ELSE
2327 lana = .false.
2328ENDIF
2329
2330
2331#undef VOL7D_POLY_ARRAY
2332#define VOL7D_POLY_ARRAY voldati
2333#include "vol7d_class_diff.F90"
2334#undef VOL7D_POLY_ARRAY
2335#define VOL7D_POLY_ARRAY voldatiattr
2336#include "vol7d_class_diff.F90"
2337#undef VOL7D_POLY_ARRAY
2338
2339if ( .not. ldata_only) then
2340
2341#define VOL7D_POLY_ARRAY volana
2342#include "vol7d_class_diff.F90"
2343#undef VOL7D_POLY_ARRAY
2344#define VOL7D_POLY_ARRAY volanaattr
2345#include "vol7d_class_diff.F90"
2346#undef VOL7D_POLY_ARRAY
2347
2348 if(lana)then
2349 where ( this%ana == that%ana )
2350 that%ana = vol7d_ana_miss
2351 end where
2352 end if
2353
2354end if
2355
2356
2357
2358END SUBROUTINE vol7d_diff_only
2359
2360
2361
2362! Creo le routine da ripetere per i vari tipi di dati di v7d
2363! tramite un template e il preprocessore
2364#undef VOL7D_POLY_TYPE
2365#undef VOL7D_POLY_TYPES
2366#define VOL7D_POLY_TYPE REAL
2367#define VOL7D_POLY_TYPES r
2368#include "vol7d_class_type_templ.F90"
2369#undef VOL7D_POLY_TYPE
2370#undef VOL7D_POLY_TYPES
2371#define VOL7D_POLY_TYPE DOUBLE PRECISION
2372#define VOL7D_POLY_TYPES d
2373#include "vol7d_class_type_templ.F90"
2374#undef VOL7D_POLY_TYPE
2375#undef VOL7D_POLY_TYPES
2376#define VOL7D_POLY_TYPE INTEGER
2377#define VOL7D_POLY_TYPES i
2378#include "vol7d_class_type_templ.F90"
2379#undef VOL7D_POLY_TYPE
2380#undef VOL7D_POLY_TYPES
2381#define VOL7D_POLY_TYPE INTEGER(kind=int_b)
2382#define VOL7D_POLY_TYPES b
2383#include "vol7d_class_type_templ.F90"
2384#undef VOL7D_POLY_TYPE
2385#undef VOL7D_POLY_TYPES
2386#define VOL7D_POLY_TYPE CHARACTER(len=vol7d_cdatalen)
2387#define VOL7D_POLY_TYPES c
2388#include "vol7d_class_type_templ.F90"
2389
2390! Creo le routine da ripetere per i vari descrittori di dimensioni di v7d
2391! tramite un template e il preprocessore
2392#define VOL7D_SORT
2393#undef VOL7D_NO_ZERO_ALLOC
2394#undef VOL7D_POLY_TYPE
2395#define VOL7D_POLY_TYPE datetime
2396#include "vol7d_class_desc_templ.F90"
2397#undef VOL7D_POLY_TYPE
2398#define VOL7D_POLY_TYPE vol7d_timerange
2399#include "vol7d_class_desc_templ.F90"
2400#undef VOL7D_POLY_TYPE
2401#define VOL7D_POLY_TYPE vol7d_level
2402#include "vol7d_class_desc_templ.F90"
2403#undef VOL7D_SORT
2404#undef VOL7D_POLY_TYPE
2405#define VOL7D_POLY_TYPE vol7d_network
2406#include "vol7d_class_desc_templ.F90"
2407#undef VOL7D_POLY_TYPE
2408#define VOL7D_POLY_TYPE vol7d_ana
2409#include "vol7d_class_desc_templ.F90"
2410#define VOL7D_NO_ZERO_ALLOC
2411#undef VOL7D_POLY_TYPE
2412#define VOL7D_POLY_TYPE vol7d_var
2413#include "vol7d_class_desc_templ.F90"
2414
2415!>\brief Scrittura su file di un volume Vol7d.
2416!! Scrittura su file unformatted di un intero volume Vol7d.
2417!! Il volume viene serializzato e scritto su file.
2418!! Il file puo' essere aperto opzionalmente dall'utente. Si possono passare
2419!! opzionalmente unità e nome del file altrimenti assegnati internamente a dei default; se assegnati internamente
2420!! tali parametri saranno in output.
2421!! Se non viene fornito il nome file viene utilizzato un file di default con nome pari al nome del programma in
2422!! esecuzione con postfisso ".v7d".
2423!! Come parametro opzionale c'è la description che insieme alla data corrente viene inserita nell'header del file.
2424subroutine vol7d_write_on_file (this,unit,description,filename,filename_auto)
2425
2426TYPE(vol7d),INTENT(IN) :: this !< volume vol7d da scrivere
2427integer,optional,intent(inout) :: unit !< unità su cui scrivere; se passata =0 ritorna il valore rielaborato (default =rielaborato internamente con getlun )
2428character(len=*),intent(in),optional :: filename !< nome del file su cui scrivere
2429character(len=*),intent(out),optional :: filename_auto !< nome del file generato se "filename" è omesso
2430character(len=*),INTENT(IN),optional :: description !< descrizione del volume
2431
2432integer :: lunit
2433character(len=254) :: ldescription,arg,lfilename
2434integer :: nana, ntime, ntimerange, nlevel, nnetwork, &
2435 ndativarr, ndativari, ndativarb, ndativard, ndativarc,&
2436 ndatiattrr, ndatiattri, ndatiattrb, ndatiattrd, ndatiattrc,&
2437 ndativarattrr, ndativarattri, ndativarattrb, ndativarattrd, ndativarattrc,&
2438 nanavarr, nanavari, nanavarb, nanavard, nanavarc,&
2439 nanaattrr, nanaattri, nanaattrb, nanaattrd, nanaattrc,&
2440 nanavarattrr, nanavarattri, nanavarattrb, nanavarattrd, nanavarattrc
2441!integer :: im,id,iy
2442integer :: tarray(8)
2443logical :: opened,exist
2444
2445 nana=0
2446 ntime=0
2447 ntimerange=0
2448 nlevel=0
2449 nnetwork=0
2450 ndativarr=0
2451 ndativari=0
2452 ndativarb=0
2453 ndativard=0
2454 ndativarc=0
2455 ndatiattrr=0
2456 ndatiattri=0
2457 ndatiattrb=0
2458 ndatiattrd=0
2459 ndatiattrc=0
2460 ndativarattrr=0
2461 ndativarattri=0
2462 ndativarattrb=0
2463 ndativarattrd=0
2464 ndativarattrc=0
2465 nanavarr=0
2466 nanavari=0
2467 nanavarb=0
2468 nanavard=0
2469 nanavarc=0
2470 nanaattrr=0
2471 nanaattri=0
2472 nanaattrb=0
2473 nanaattrd=0
2474 nanaattrc=0
2475 nanavarattrr=0
2476 nanavarattri=0
2477 nanavarattrb=0
2478 nanavarattrd=0
2479 nanavarattrc=0
2480
2481
2482!call idate(im,id,iy)
2483call date_and_time(values=tarray)
|