|
libsim Versione 8.0.0
|
◆ vol7d_diff_only()
Metodo per ottenere solo le differenze tra due oggetti vol7d. Il primo volume viene confrontato col secondo; nel secondo volume ovunque i dati confrontati siano coincidenti viene impostato valore mancante.
Definizione alla linea 2490 del file vol7d_class.F90. 2491
2492if (.not. present(unit))then
2493 lunit=getunit()
2494else
2495 if (unit==0)then
2496 lunit=getunit()
2497 unit=lunit
2498 else
2499 lunit=unit
2500 end if
2501end if
2502
2503lfilename=trim(arg)//".v7d"
2505
2506if (present(filename))then
2507 if (filename /= "")then
2508 lfilename=filename
2509 end if
2510end if
2511
2512if (present(filename_auto))filename_auto=lfilename
2513
2514
2515inquire(unit=lunit,opened=opened)
2516if (.not. opened) then
2517! inquire(file=lfilename, EXIST=exist)
2518! IF (exist) THEN
2519! CALL l4f_log(L4F_FATAL, &
2520! 'in vol7d_write_on_file, file exists, cannot open file '//TRIM(lfilename))
2521! CALL raise_fatal_error()
2522! ENDIF
2523 OPEN(unit=lunit, file=lfilename, form='UNFORMATTED', access='STREAM')
2524 CALL l4f_log(l4f_info, 'opened: '//trim(lfilename))
2525end if
2526
2527if (associated(this%ana)) nana=size(this%ana)
2528if (associated(this%time)) ntime=size(this%time)
2529if (associated(this%timerange)) ntimerange=size(this%timerange)
2530if (associated(this%level)) nlevel=size(this%level)
2531if (associated(this%network)) nnetwork=size(this%network)
2532
2533if (associated(this%dativar%r)) ndativarr=size(this%dativar%r)
2534if (associated(this%dativar%i)) ndativari=size(this%dativar%i)
2535if (associated(this%dativar%b)) ndativarb=size(this%dativar%b)
2536if (associated(this%dativar%d)) ndativard=size(this%dativar%d)
2537if (associated(this%dativar%c)) ndativarc=size(this%dativar%c)
2538
2539if (associated(this%datiattr%r)) ndatiattrr=size(this%datiattr%r)
2540if (associated(this%datiattr%i)) ndatiattri=size(this%datiattr%i)
2541if (associated(this%datiattr%b)) ndatiattrb=size(this%datiattr%b)
2542if (associated(this%datiattr%d)) ndatiattrd=size(this%datiattr%d)
2543if (associated(this%datiattr%c)) ndatiattrc=size(this%datiattr%c)
2544
2545if (associated(this%dativarattr%r)) ndativarattrr=size(this%dativarattr%r)
2546if (associated(this%dativarattr%i)) ndativarattri=size(this%dativarattr%i)
2547if (associated(this%dativarattr%b)) ndativarattrb=size(this%dativarattr%b)
2548if (associated(this%dativarattr%d)) ndativarattrd=size(this%dativarattr%d)
2549if (associated(this%dativarattr%c)) ndativarattrc=size(this%dativarattr%c)
2550
2551if (associated(this%anavar%r)) nanavarr=size(this%anavar%r)
2552if (associated(this%anavar%i)) nanavari=size(this%anavar%i)
2553if (associated(this%anavar%b)) nanavarb=size(this%anavar%b)
2554if (associated(this%anavar%d)) nanavard=size(this%anavar%d)
2555if (associated(this%anavar%c)) nanavarc=size(this%anavar%c)
2556
2557if (associated(this%anaattr%r)) nanaattrr=size(this%anaattr%r)
2558if (associated(this%anaattr%i)) nanaattri=size(this%anaattr%i)
2559if (associated(this%anaattr%b)) nanaattrb=size(this%anaattr%b)
2560if (associated(this%anaattr%d)) nanaattrd=size(this%anaattr%d)
2561if (associated(this%anaattr%c)) nanaattrc=size(this%anaattr%c)
2562
2563if (associated(this%anavarattr%r)) nanavarattrr=size(this%anavarattr%r)
2564if (associated(this%anavarattr%i)) nanavarattri=size(this%anavarattr%i)
2565if (associated(this%anavarattr%b)) nanavarattrb=size(this%anavarattr%b)
2566if (associated(this%anavarattr%d)) nanavarattrd=size(this%anavarattr%d)
2567if (associated(this%anavarattr%c)) nanavarattrc=size(this%anavarattr%c)
2568
2569write(unit=lunit)ldescription
2570write(unit=lunit)tarray
2571
2572write(unit=lunit)&
2573 nana, ntime, ntimerange, nlevel, nnetwork, &
2574 ndativarr, ndativari, ndativarb, ndativard, ndativarc,&
2575 ndatiattrr, ndatiattri, ndatiattrb, ndatiattrd, ndatiattrc,&
2576 ndativarattrr, ndativarattri, ndativarattrb, ndativarattrd, ndativarattrc,&
2577 nanavarr, nanavari, nanavarb, nanavard, nanavarc,&
2578 nanaattrr, nanaattri, nanaattrb, nanaattrd, nanaattrc,&
2579 nanavarattrr, nanavarattri, nanavarattrb, nanavarattrd, nanavarattrc, &
2580 this%time_definition
2581
2582
2583!write(unit=lunit)this
2584
2585
2586!! prime 5 dimensioni
2587if (associated(this%ana)) call write_unit(this%ana, lunit)
2588if (associated(this%time)) call write_unit(this%time, lunit)
2589if (associated(this%level)) write(unit=lunit)this%level
2590if (associated(this%timerange)) write(unit=lunit)this%timerange
2591if (associated(this%network)) write(unit=lunit)this%network
2592
2593 !! 6a dimensione: variabile dell'anagrafica e dei dati
2594 !! con relativi attributi e in 5 tipi diversi
2595
2596if (associated(this%anavar%r)) write(unit=lunit)this%anavar%r
2597if (associated(this%anavar%i)) write(unit=lunit)this%anavar%i
2598if (associated(this%anavar%b)) write(unit=lunit)this%anavar%b
2599if (associated(this%anavar%d)) write(unit=lunit)this%anavar%d
2600if (associated(this%anavar%c)) write(unit=lunit)this%anavar%c
2601
2602if (associated(this%anaattr%r)) write(unit=lunit)this%anaattr%r
2603if (associated(this%anaattr%i)) write(unit=lunit)this%anaattr%i
2604if (associated(this%anaattr%b)) write(unit=lunit)this%anaattr%b
2605if (associated(this%anaattr%d)) write(unit=lunit)this%anaattr%d
2606if (associated(this%anaattr%c)) write(unit=lunit)this%anaattr%c
2607
2608if (associated(this%anavarattr%r)) write(unit=lunit)this%anavarattr%r
2609if (associated(this%anavarattr%i)) write(unit=lunit)this%anavarattr%i
2610if (associated(this%anavarattr%b)) write(unit=lunit)this%anavarattr%b
2611if (associated(this%anavarattr%d)) write(unit=lunit)this%anavarattr%d
2612if (associated(this%anavarattr%c)) write(unit=lunit)this%anavarattr%c
2613
2614if (associated(this%dativar%r)) write(unit=lunit)this%dativar%r
2615if (associated(this%dativar%i)) write(unit=lunit)this%dativar%i
2616if (associated(this%dativar%b)) write(unit=lunit)this%dativar%b
2617if (associated(this%dativar%d)) write(unit=lunit)this%dativar%d
2618if (associated(this%dativar%c)) write(unit=lunit)this%dativar%c
2619
2620if (associated(this%datiattr%r)) write(unit=lunit)this%datiattr%r
2621if (associated(this%datiattr%i)) write(unit=lunit)this%datiattr%i
2622if (associated(this%datiattr%b)) write(unit=lunit)this%datiattr%b
2623if (associated(this%datiattr%d)) write(unit=lunit)this%datiattr%d
2624if (associated(this%datiattr%c)) write(unit=lunit)this%datiattr%c
2625
2626if (associated(this%dativarattr%r)) write(unit=lunit)this%dativarattr%r
2627if (associated(this%dativarattr%i)) write(unit=lunit)this%dativarattr%i
2628if (associated(this%dativarattr%b)) write(unit=lunit)this%dativarattr%b
2629if (associated(this%dativarattr%d)) write(unit=lunit)this%dativarattr%d
2630if (associated(this%dativarattr%c)) write(unit=lunit)this%dativarattr%c
2631
2632!! Volumi di valori e attributi per anagrafica e dati
2633
2634if (associated(this%volanar)) write(unit=lunit)this%volanar
2635if (associated(this%volanaattrr)) write(unit=lunit)this%volanaattrr
2636if (associated(this%voldatir)) write(unit=lunit)this%voldatir
2637if (associated(this%voldatiattrr)) write(unit=lunit)this%voldatiattrr
2638
2639if (associated(this%volanai)) write(unit=lunit)this%volanai
2640if (associated(this%volanaattri)) write(unit=lunit)this%volanaattri
2641if (associated(this%voldatii)) write(unit=lunit)this%voldatii
2642if (associated(this%voldatiattri)) write(unit=lunit)this%voldatiattri
2643
2644if (associated(this%volanab)) write(unit=lunit)this%volanab
2645if (associated(this%volanaattrb)) write(unit=lunit)this%volanaattrb
2646if (associated(this%voldatib)) write(unit=lunit)this%voldatib
2647if (associated(this%voldatiattrb)) write(unit=lunit)this%voldatiattrb
2648
2649if (associated(this%volanad)) write(unit=lunit)this%volanad
2650if (associated(this%volanaattrd)) write(unit=lunit)this%volanaattrd
2651if (associated(this%voldatid)) write(unit=lunit)this%voldatid
2652if (associated(this%voldatiattrd)) write(unit=lunit)this%voldatiattrd
2653
2654if (associated(this%volanac)) write(unit=lunit)this%volanac
2655if (associated(this%volanaattrc)) write(unit=lunit)this%volanaattrc
2656if (associated(this%voldatic)) write(unit=lunit)this%voldatic
2657if (associated(this%voldatiattrc)) write(unit=lunit)this%voldatiattrc
2658
2659if (.not. present(unit)) close(unit=lunit)
2660
2661end subroutine vol7d_write_on_file
2662
2663
2664!>\brief Lettura da file di un volume Vol7d.
2665!! Lettura da file unformatted di un intero volume Vol7d.
2666!! Questa subroutine comprende vol7d_alloc e vol7d_alloc_vol.
2667!! Il file puo' essere aperto opzionalmente dall'utente. Si possono passare
2668!! opzionalmente unità e nome del file altrimenti assegnati internamente a dei default; se assegnati internamente
2669!! tali parametri saranno in output.
2670
2671
2672subroutine vol7d_read_from_file (this,unit,filename,description,tarray,filename_auto)
2673
2674TYPE(vol7d),INTENT(OUT) :: this !< Volume vol7d da leggere
2675integer,intent(inout),optional :: unit !< unità su cui è stato aperto un file; se =0 rielaborato internamente (default = elaborato internamente con getunit)
2676character(len=*),INTENT(in),optional :: filename !< nome del file eventualmente da aprire (default = (nome dell'eseguibile)//.v7d )
2677character(len=*),intent(out),optional :: filename_auto !< nome del file generato se "filename" è omesso
2678character(len=*),INTENT(out),optional :: description !< descrizione del volume letto
2679integer,intent(out),optional :: tarray(8) !< vettore come definito da "date_and_time" della data di scrittura del volume
2680
2681
2682integer :: nana, ntime, ntimerange, nlevel, nnetwork, &
2683 ndativarr, ndativari, ndativarb, ndativard, ndativarc,&
2684 ndatiattrr, ndatiattri, ndatiattrb, ndatiattrd, ndatiattrc,&
2685 ndativarattrr, ndativarattri, ndativarattrb, ndativarattrd, ndativarattrc,&
2686 nanavarr, nanavari, nanavarb, nanavard, nanavarc,&
2687 nanaattrr, nanaattri, nanaattrb, nanaattrd, nanaattrc,&
2688 nanavarattrr, nanavarattri, nanavarattrb, nanavarattrd, nanavarattrc
2689
2690character(len=254) :: ldescription,lfilename,arg
2691integer :: ltarray(8),lunit,ios
2692logical :: opened,exist
2693
2694
2695call getarg(0,arg)
2696
2697if (.not. present(unit))then
2698 lunit=getunit()
2699else
2700 if (unit==0)then
2701 lunit=getunit()
2702 unit=lunit
2703 else
2704 lunit=unit
2705 end if
2706end if
2707
2708lfilename=trim(arg)//".v7d"
2710
2711if (present(filename))then
2712 if (filename /= "")then
2713 lfilename=filename
2714 end if
2715end if
2716
2717if (present(filename_auto))filename_auto=lfilename
2718
2719
2720inquire(unit=lunit,opened=opened)
2721IF (.NOT. opened) THEN
2722 inquire(file=lfilename,exist=exist)
2723 IF (.NOT.exist) THEN
2724 CALL l4f_log(l4f_fatal, &
2725 'in vol7d_read_from_file, file does not exists, cannot open')
2726 CALL raise_fatal_error()
2727 ENDIF
2728 OPEN(unit=lunit, file=lfilename, form='UNFORMATTED', access='STREAM', &
2729 status='OLD', action='READ')
2730 CALL l4f_log(l4f_info, 'opened: '//trim(lfilename))
2731end if
2732
2733
2734call init(this)
2735read(unit=lunit,iostat=ios)ldescription
2736
2737if (ios < 0) then ! A negative value indicates that the End of File or End of Record
2738 call vol7d_alloc (this)
2739 call vol7d_alloc_vol (this)
2740 if (present(description))description=ldescription
2741 if (present(tarray))tarray=ltarray
2742 if (.not. present(unit)) close(unit=lunit)
2743end if
2744
2745read(unit=lunit)ltarray
2746
2747CALL l4f_log(l4f_info, 'Reading vol7d from file')
2748CALL l4f_log(l4f_info, 'description: '//trim(ldescription))
2749CALL l4f_log(l4f_info, 'written on '//trim(to_char(ltarray(1)))//' '// &
2750 trim(to_char(ltarray(2)))//' '//trim(to_char(ltarray(3))))
2751
2752if (present(description))description=ldescription
2753if (present(tarray))tarray=ltarray
2754
2755read(unit=lunit)&
2756 nana, ntime, ntimerange, nlevel, nnetwork, &
2757 ndativarr, ndativari, ndativarb, ndativard, ndativarc,&
2758 ndatiattrr, ndatiattri, ndatiattrb, ndatiattrd, ndatiattrc,&
2759 ndativarattrr, ndativarattri, ndativarattrb, ndativarattrd, ndativarattrc,&
2760 nanavarr, nanavari, nanavarb, nanavard, nanavarc,&
2761 nanaattrr, nanaattri, nanaattrb, nanaattrd, nanaattrc,&
2762 nanavarattrr, nanavarattri, nanavarattrb, nanavarattrd, nanavarattrc, &
2763 this%time_definition
2764
2765call vol7d_alloc (this, &
2766 nana=nana, ntime=ntime, ntimerange=ntimerange, nlevel=nlevel, nnetwork=nnetwork,&
2767 ndativarr=ndativarr, ndativari=ndativari, ndativarb=ndativarb,&
2768 ndativard=ndativard, ndativarc=ndativarc,&
2769 ndatiattrr=ndatiattrr, ndatiattri=ndatiattri, ndatiattrb=ndatiattrb,&
2770 ndatiattrd=ndatiattrd, ndatiattrc=ndatiattrc,&
2771 ndativarattrr=ndativarattrr, ndativarattri=ndativarattri, ndativarattrb=ndativarattrb, &
2772 ndativarattrd=ndativarattrd, ndativarattrc=ndativarattrc,&
2773 nanavarr=nanavarr, nanavari=nanavari, nanavarb=nanavarb, &
2774 nanavard=nanavard, nanavarc=nanavarc,&
2775 nanaattrr=nanaattrr, nanaattri=nanaattri, nanaattrb=nanaattrb,&
2776 nanaattrd=nanaattrd, nanaattrc=nanaattrc,&
2777 nanavarattrr=nanavarattrr, nanavarattri=nanavarattri, nanavarattrb=nanavarattrb, &
2778 nanavarattrd=nanavarattrd, nanavarattrc=nanavarattrc)
2779
2780
2781if (associated(this%ana)) call read_unit(this%ana, lunit)
2782if (associated(this%time)) call read_unit(this%time, lunit)
2783if (associated(this%level)) read(unit=lunit)this%level
2784if (associated(this%timerange)) read(unit=lunit)this%timerange
2785if (associated(this%network)) read(unit=lunit)this%network
2786
2787if (associated(this%anavar%r)) read(unit=lunit)this%anavar%r
2788if (associated(this%anavar%i)) read(unit=lunit)this%anavar%i
2789if (associated(this%anavar%b)) read(unit=lunit)this%anavar%b
2790if (associated(this%anavar%d)) read(unit=lunit)this%anavar%d
2791if (associated(this%anavar%c)) read(unit=lunit)this%anavar%c
2792
2793if (associated(this%anaattr%r)) read(unit=lunit)this%anaattr%r
2794if (associated(this%anaattr%i)) read(unit=lunit)this%anaattr%i
2795if (associated(this%anaattr%b)) read(unit=lunit)this%anaattr%b
2796if (associated(this%anaattr%d)) read(unit=lunit)this%anaattr%d
2797if (associated(this%anaattr%c)) read(unit=lunit)this%anaattr%c
2798
2799if (associated(this%anavarattr%r)) read(unit=lunit)this%anavarattr%r
2800if (associated(this%anavarattr%i)) read(unit=lunit)this%anavarattr%i
2801if (associated(this%anavarattr%b)) read(unit=lunit)this%anavarattr%b
2802if (associated(this%anavarattr%d)) read(unit=lunit)this%anavarattr%d
2803if (associated(this%anavarattr%c)) read(unit=lunit)this%anavarattr%c
2804
2805if (associated(this%dativar%r)) read(unit=lunit)this%dativar%r
2806if (associated(this%dativar%i)) read(unit=lunit)this%dativar%i
2807if (associated(this%dativar%b)) read(unit=lunit)this%dativar%b
2808if (associated(this%dativar%d)) read(unit=lunit)this%dativar%d
2809if (associated(this%dativar%c)) read(unit=lunit)this%dativar%c
2810
2811if (associated(this%datiattr%r)) read(unit=lunit)this%datiattr%r
2812if (associated(this%datiattr%i)) read(unit=lunit)this%datiattr%i
2813if (associated(this%datiattr%b)) read(unit=lunit)this%datiattr%b
2814if (associated(this%datiattr%d)) read(unit=lunit)this%datiattr%d
2815if (associated(this%datiattr%c)) read(unit=lunit)this%datiattr%c
2816
2817if (associated(this%dativarattr%r)) read(unit=lunit)this%dativarattr%r
2818if (associated(this%dativarattr%i)) read(unit=lunit)this%dativarattr%i
2819if (associated(this%dativarattr%b)) read(unit=lunit)this%dativarattr%b
2820if (associated(this%dativarattr%d)) read(unit=lunit)this%dativarattr%d
2821if (associated(this%dativarattr%c)) read(unit=lunit)this%dativarattr%c
2822
2823call vol7d_alloc_vol (this)
2824
2825!! Volumi di valori e attributi per anagrafica e dati
2826
2827if (associated(this%volanar)) read(unit=lunit)this%volanar
2828if (associated(this%volanaattrr)) read(unit=lunit)this%volanaattrr
2829if (associated(this%voldatir)) read(unit=lunit)this%voldatir
2830if (associated(this%voldatiattrr)) read(unit=lunit)this%voldatiattrr
2831
2832if (associated(this%volanai)) read(unit=lunit)this%volanai
2833if (associated(this%volanaattri)) read(unit=lunit)this%volanaattri
2834if (associated(this%voldatii)) read(unit=lunit)this%voldatii
2835if (associated(this%voldatiattri)) read(unit=lunit)this%voldatiattri
2836
2837if (associated(this%volanab)) read(unit=lunit)this%volanab
2838if (associated(this%volanaattrb)) read(unit=lunit)this%volanaattrb
2839if (associated(this%voldatib)) read(unit=lunit)this%voldatib
2840if (associated(this%voldatiattrb)) read(unit=lunit)this%voldatiattrb
2841
2842if (associated(this%volanad)) read(unit=lunit)this%volanad
2843if (associated(this%volanaattrd)) read(unit=lunit)this%volanaattrd
2844if (associated(this%voldatid)) read(unit=lunit)this%voldatid
2845if (associated(this%voldatiattrd)) read(unit=lunit)this%voldatiattrd
2846
2847if (associated(this%volanac)) read(unit=lunit)this%volanac
2848if (associated(this%volanaattrc)) read(unit=lunit)this%volanaattrc
2849if (associated(this%voldatic)) read(unit=lunit)this%voldatic
2850if (associated(this%voldatiattrc)) read(unit=lunit)this%voldatiattrc
2851
2852if (.not. present(unit)) close(unit=lunit)
2853
2854end subroutine vol7d_read_from_file
2855
2856
2857! to double precision
2858elemental doubleprecision function doubledatd(voldat,var)
2859doubleprecision,intent(in) :: voldat
2860type(vol7d_var),intent(in) :: var
2861
2862doubledatd=voldat
2863
2864end function doubledatd
2865
2866
2867elemental doubleprecision function doubledatr(voldat,var)
2868real,intent(in) :: voldat
2869type(vol7d_var),intent(in) :: var
2870
2871if (c_e(voldat))then
2872 doubledatr=dble(voldat)
2873else
2874 doubledatr=dmiss
2875end if
2876
2877end function doubledatr
2878
2879
2880elemental doubleprecision function doubledati(voldat,var)
2881integer,intent(in) :: voldat
2882type(vol7d_var),intent(in) :: var
2883
2884if (c_e(voldat)) then
2885 if (c_e(var%scalefactor))then
2886 doubledati=dble(voldat)/10.d0**var%scalefactor
2887 else
2888 doubledati=dble(voldat)
2889 endif
2890else
2891 doubledati=dmiss
2892end if
2893
2894end function doubledati
2895
2896
2897elemental doubleprecision function doubledatb(voldat,var)
2898integer(kind=int_b),intent(in) :: voldat
2899type(vol7d_var),intent(in) :: var
2900
2901if (c_e(voldat)) then
2902 if (c_e(var%scalefactor))then
2903 doubledatb=dble(voldat)/10.d0**var%scalefactor
2904 else
2905 doubledatb=dble(voldat)
2906 endif
2907else
2908 doubledatb=dmiss
2909end if
2910
2911end function doubledatb
2912
2913
2914elemental doubleprecision function doubledatc(voldat,var)
2915CHARACTER(len=vol7d_cdatalen),intent(in) :: voldat
2916type(vol7d_var),intent(in) :: var
2917
2918doubledatc = c2d(voldat)
2919if (c_e(doubledatc) .and. c_e(var%scalefactor))then
2920 doubledatc=doubledatc/10.d0**var%scalefactor
2921end if
2922
2923end function doubledatc
2924
2925
2926! to integer
2927elemental integer function integerdatd(voldat,var)
2928doubleprecision,intent(in) :: voldat
2929type(vol7d_var),intent(in) :: var
2930
2931if (c_e(voldat))then
2932 if (c_e(var%scalefactor)) then
2933 integerdatd=nint(voldat*10d0**var%scalefactor)
2934 else
2935 integerdatd=nint(voldat)
2936 endif
2937else
2938 integerdatd=imiss
2939end if
2940
2941end function integerdatd
2942
2943
2944elemental integer function integerdatr(voldat,var)
2945real,intent(in) :: voldat
2946type(vol7d_var),intent(in) :: var
2947
2948if (c_e(voldat))then
2949 if (c_e(var%scalefactor)) then
2950 integerdatr=nint(voldat*10d0**var%scalefactor)
2951 else
2952 integerdatr=nint(voldat)
2953 endif
2954else
2955 integerdatr=imiss
2956end if
2957
2958end function integerdatr
2959
2960
2961elemental integer function integerdati(voldat,var)
2962integer,intent(in) :: voldat
2963type(vol7d_var),intent(in) :: var
2964
2965integerdati=voldat
2966
2967end function integerdati
2968
2969
2970elemental integer function integerdatb(voldat,var)
2971integer(kind=int_b),intent(in) :: voldat
2972type(vol7d_var),intent(in) :: var
2973
2974if (c_e(voldat))then
2975 integerdatb=voldat
2976else
2977 integerdatb=imiss
2978end if
2979
2980end function integerdatb
2981
2982
2983elemental integer function integerdatc(voldat,var)
2984CHARACTER(len=vol7d_cdatalen),intent(in) :: voldat
2985type(vol7d_var),intent(in) :: var
2986
2987integerdatc=c2i(voldat)
2988
2989end function integerdatc
2990
2991
2992! to real
2993elemental real function realdatd(voldat,var)
2994doubleprecision,intent(in) :: voldat
2995type(vol7d_var),intent(in) :: var
2996
2997if (c_e(voldat))then
2998 realdatd=real(voldat)
2999else
3000 realdatd=rmiss
3001end if
3002
3003end function realdatd
3004
3005
3006elemental real function realdatr(voldat,var)
3007real,intent(in) :: voldat
3008type(vol7d_var),intent(in) :: var
3009
3010realdatr=voldat
3011
3012end function realdatr
3013
3014
3015elemental real function realdati(voldat,var)
3016integer,intent(in) :: voldat
3017type(vol7d_var),intent(in) :: var
3018
3019if (c_e(voldat)) then
3020 if (c_e(var%scalefactor))then
3021 realdati=float(voldat)/10.**var%scalefactor
3022 else
3023 realdati=float(voldat)
3024 endif
3025else
3026 realdati=rmiss
3027end if
3028
3029end function realdati
3030
3031
3032elemental real function realdatb(voldat,var)
3033integer(kind=int_b),intent(in) :: voldat
3034type(vol7d_var),intent(in) :: var
3035
3036if (c_e(voldat)) then
3037 if (c_e(var%scalefactor))then
3038 realdatb=float(voldat)/10**var%scalefactor
3039 else
3040 realdatb=float(voldat)
3041 endif
3042else
3043 realdatb=rmiss
3044end if
3045
3046end function realdatb
3047
3048
3049elemental real function realdatc(voldat,var)
3050CHARACTER(len=vol7d_cdatalen),intent(in) :: voldat
3051type(vol7d_var),intent(in) :: var
3052
3053realdatc=c2r(voldat)
3054if (c_e(realdatc) .and. c_e(var%scalefactor))then
3055 realdatc=realdatc/10.**var%scalefactor
3056end if
3057
3058end function realdatc
3059
3060
3061!> Return an ana volume of a requested variable as real data.
3062!! It returns a 2-d array of the proper shape (ana x network) for the
3063!! ana variable requested, converted to real type. If the conversion
3064!! fails or if the variable is not contained in the ana volume,
3065!! missing data are returned.
3066FUNCTION realanavol(this, var) RESULT(vol)
3067TYPE(vol7d),INTENT(in) :: this !< the \a vol7d object to query, the method \a vol7d_alloc_vol must have been called for it otherwise progam may abort
3068TYPE(vol7d_var),INTENT(in) :: var !< the ana variable to be returned
3069REAL :: vol(SIZE(this%ana),size(this%network))
3070
3071CHARACTER(len=1) :: dtype
3072INTEGER :: indvar
3073
3074dtype = cmiss
3075indvar = index(this%anavar, var, type=dtype)
3076
3077IF (indvar > 0) THEN
3078 SELECT CASE (dtype)
3079 CASE("d")
3080 vol = realdat(this%volanad(:,indvar,:), var)
3081 CASE("r")
3082 vol = this%volanar(:,indvar,:)
3083 CASE("i")
3084 vol = realdat(this%volanai(:,indvar,:), var)
3085 CASE("b")
3086 vol = realdat(this%volanab(:,indvar,:), var)
3087 CASE("c")
3088 vol = realdat(this%volanac(:,indvar,:), var)
3089 CASE default
3090 vol = rmiss
3091 END SELECT
3092ELSE
3093 vol = rmiss
3094ENDIF
3095
3096END FUNCTION realanavol
3097
3098
3099!> Return an ana volume of a requested variable as integer data.
3100!! It returns a 2-d array of the proper shape (ana x network) for the
3101!! ana variable requested, converted to integer type. If the conversion
3102!! fails or if the variable is not contained in the ana volume,
3103!! missing data are returned.
3104FUNCTION integeranavol(this, var) RESULT(vol)
3105TYPE(vol7d),INTENT(in) :: this !< the \a vol7d object to query, the method \a vol7d_alloc_vol must have been called for it otherwise progam may abort
3106TYPE(vol7d_var),INTENT(in) :: var !< the ana variable to be returned
3107INTEGER :: vol(SIZE(this%ana),size(this%network))
3108
3109CHARACTER(len=1) :: dtype
3110INTEGER :: indvar
3111
3112dtype = cmiss
3113indvar = index(this%anavar, var, type=dtype)
3114
3115IF (indvar > 0) THEN
3116 SELECT CASE (dtype)
3117 CASE("d")
3118 vol = integerdat(this%volanad(:,indvar,:), var)
3119 CASE("r")
3120 vol = integerdat(this%volanar(:,indvar,:), var)
3121 CASE("i")
3122 vol = this%volanai(:,indvar,:)
3123 CASE("b")
3124 vol = integerdat(this%volanab(:,indvar,:), var)
3125 CASE("c")
3126 vol = integerdat(this%volanac(:,indvar,:), var)
3127 CASE default
3128 vol = imiss
3129 END SELECT
3130ELSE
3131 vol = imiss
3132ENDIF
3133
3134END FUNCTION integeranavol
3135
3136
3137!> Move data for all variables from one coordinate in the character volume to other.
3138!! Only not missing data will be copyed and all attributes will be moved together.
3139!! Usefull to colapse data spread in more indices (level or time or ....).
3140!! After the move is possible to set to missing some descriptor and make a copy with miss=.true.
3141!! to obtain a new vol7d with less data shape.
3142subroutine move_datac (v7d,&
3143 indana,indtime,indlevel,indtimerange,indnetwork,&
3144 indananew,indtimenew,indlevelnew,indtimerangenew,indnetworknew)
3145
3146TYPE(vol7d),intent(inout) :: v7d !< data in form of character in this object will be moved
3147
3148integer,intent(in) :: indana,indtime,indlevel,indtimerange,indnetwork !< source coordinate of the data
3149integer,intent(in) :: indananew,indtimenew,indlevelnew,indtimerangenew,indnetworknew !< destination coordinate of data
3150integer :: inddativar,inddativarattr
3151
3152
3153do inddativar=1,size(v7d%dativar%c)
3154
3155 if (c_e(v7d%voldatic(indana,indtime,indlevel,indtimerange,inddativar,indnetwork)) .and. &
3156 .not. c_e(v7d%voldatic(indananew,indtimenew,indlevelnew,indtimerangenew,inddativar,indnetworknew))&
3157 ) then
3158
3159 ! dati
3160 v7d%voldatic &
3161 (indananew,indtimenew,indlevelnew,indtimerangenew,inddativar,indnetworknew) = &
3162 v7d%voldatic &
3163 (indana,indtime,indlevel,indtimerange,inddativar,indnetwork)
3164
3165
3166 ! attributi
3167 if (associated (v7d%dativarattr%i)) then
3168 inddativarattr = index(v7d%dativarattr%i,v7d%dativar%c(inddativar))
3169 if (inddativarattr > 0 ) then
3170 v7d%voldatiattri &
3171 (indananew,indtimenew,indlevelnew,indtimerangenew,inddativarattr,indnetworknew,:) = &
3172 v7d%voldatiattri &
3173 (indana,indtime,indlevel,indtimerange,inddativarattr,indnetwork,:)
3174 end if
3175 end if
3176
3177 if (associated (v7d%dativarattr%r)) then
3178 inddativarattr = index(v7d%dativarattr%r,v7d%dativar%c(inddativar))
3179 if (inddativarattr > 0 ) then
3180 v7d%voldatiattrr &
3181 (indananew,indtimenew,indlevelnew,indtimerangenew,inddativarattr,indnetworknew,:) = &
3182 v7d%voldatiattrr &
3183 (indana,indtime,indlevel,indtimerange,inddativarattr,indnetwork,:)
3184 end if
3185 end if
3186
3187 if (associated (v7d%dativarattr%d)) then
3188 inddativarattr = index(v7d%dativarattr%d,v7d%dativar%c(inddativar))
3189 if (inddativarattr > 0 ) then
3190 v7d%voldatiattrd &
3191 (indananew,indtimenew,indlevelnew,indtimerangenew,inddativarattr,indnetworknew,:) = &
3192 v7d%voldatiattrd &
3193 (indana,indtime,indlevel,indtimerange,inddativarattr,indnetwork,:)
3194 end if
3195 end if
3196
3197 if (associated (v7d%dativarattr%b)) then
3198 inddativarattr = index(v7d%dativarattr%b,v7d%dativar%c(inddativar))
3199 if (inddativarattr > 0 ) then
3200 v7d%voldatiattrb &
3201 (indananew,indtimenew,indlevelnew,indtimerangenew,inddativarattr,indnetworknew,:) = &
3202 v7d%voldatiattrb &
3203 (indana,indtime,indlevel,indtimerange,inddativarattr,indnetwork,:)
3204 end if
3205 end if
3206
3207 if (associated (v7d%dativarattr%c)) then
3208 inddativarattr = index(v7d%dativarattr%c,v7d%dativar%c(inddativar))
3209 if (inddativarattr > 0 ) then
3210 v7d%voldatiattrc &
3211 (indananew,indtimenew,indlevelnew,indtimerangenew,inddativarattr,indnetworknew,:) = &
3212 v7d%voldatiattrc &
3213 (indana,indtime,indlevel,indtimerange,inddativarattr,indnetwork,:)
3214 end if
3215 end if
3216
3217 end if
3218
3219end do
3220
3221end subroutine move_datac
3222
3223!> Move data for all variables from one coordinate in the real volume to other.
3224!! Only not missing data will be copyed and all attributes will be moved together.
3225!! Usefull to colapse data spread in more indices (level or time or ....).
3226!! After the move is possible to set to missing some descriptor and make a copy with miss=.true.
3227!! to obtain a new vol7d with less data shape.
3228subroutine move_datar (v7d,&
3229 indana,indtime,indlevel,indtimerange,indnetwork,&
3230 indananew,indtimenew,indlevelnew,indtimerangenew,indnetworknew)
3231
3232TYPE(vol7d),intent(inout) :: v7d !< data in form of character in this object will be moved
3233
3234integer,intent(in) :: indana,indtime,indlevel,indtimerange,indnetwork !< source coordinate of the data
3235integer,intent(in) :: indananew,indtimenew,indlevelnew,indtimerangenew,indnetworknew !< destination coordinate of data
3236integer :: inddativar,inddativarattr
3237
3238
3239do inddativar=1,size(v7d%dativar%r)
3240
3241 if (c_e(v7d%voldatir(indana,indtime,indlevel,indtimerange,inddativar,indnetwork)) .and. &
3242 .not. c_e(v7d%voldatir(indananew,indtimenew,indlevelnew,indtimerangenew,inddativar,indnetworknew))&
3243 ) then
3244
3245 ! dati
3246 v7d%voldatir &
3247 (indananew,indtimenew,indlevelnew,indtimerangenew,inddativar,indnetworknew) = &
3248 v7d%voldatir &
|