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