|
◆ vol7d_normalize_data()
subroutine, public modqccli::vol7d_normalize_data |
( |
type(qcclitype), intent(inout) |
qccli | ) |
|
Modulo 1: Calcolo dei parametri di normalizzazione dei dati I parametri di normalizzazione sono il 25°, il 50° e il 75° percentile (p25,p50,p75) oppure (p15.87,p50.,p84.13) Tali parametri verranno calcolati per ogni mese, per ogni ora, per ogni area.
Modulo 2: Normalizzazione dati Ciascun dato D verrà normalizzato come segue: DN = (D-p50)*2/(p75-p25) oppure DN = (D-p50)*2/(p16-p84) dove DN è il valore normalizzato. La scelta dei parametri di normalizzazione dipende dal mese, dall'ora, dall'area.
- Parametri
-
[in,out] | qccli | volume providing data to be computed, it is modified by the method |
Definizione alla linea 796 del file modqccli.F90.
796 write(ident, '("#",i2.2,2i3.3)')k,iarea,desc 797 call init(ana,lat=0.d0,lon=0.d0,ident=ident) 798 indcana= index(qccli%extreme%ana,ana) 799 call l4f_log(l4f_debug, "normalize data Index50:"//to_char(k)//to_char(indcana)//& 800 to_char(indctime)//to_char(indclevel)//& 801 to_char(indctimerange)//to_char(indcdativarr)//to_char(indcnetwork)) 802 if (indcana > 0 ) then 803 perc50=qccli%extreme%voldatir(indcana,indctime,indclevel,& 804 indctimerange,indcdativarr,indcnetwork) 808 write(ident, '("#",i2.2,2i3.3)')k,iarea,desc 809 call init(ana,lat=0.d0,lon=0.d0,ident=ident) 810 indcana= index(qccli%extreme%ana,ana) 811 call l4f_log(l4f_debug, "normalize data Index75:"//to_char(k)//to_char(indcana)//& 812 to_char(indctime)//to_char(indclevel)//& 813 to_char(indctimerange)//to_char(indcdativarr)//to_char(indcnetwork)) 814 if (indcana > 0 ) then 815 perc75=qccli%extreme%voldatir(indcana,indctime,indclevel,& 816 indctimerange,indcdativarr,indcnetwork) 819 if ( c_e(perc25) .and. c_e(perc50) .and. c_e(perc75) .and. & 820 abs( perc75 - perc25 ) >= spacing( max(abs(perc75),abs(perc25)))) then 823 call l4f_log(l4f_debug, "normalize data dato in : "//t2c(datoqui)) 824 datoqui = (datoqui - perc50) / (perc75 - perc25) + & 825 base_value(qccli%v7d%dativar%r(inddativarr)%btable) 826 call l4f_log(l4f_debug, "normalize data dato out : "//t2c(datoqui)) 834 qccli%v7d%voldatir (indana ,indtime ,indlevel ,indtimerange ,& 835 inddativarr, indnetwork ) = datoqui 843 read (qccli%v7d%ana(indana)%ident, '(a1,i2.2,2i3.3)') mycanc, clev, iarea, desc 844 if (mycanc == canc) then 847 write (qccli%v7d%ana(indana)%ident, '(a1,i2.2,2i3.3)') canc, clev, iarea, desc 852 end SUBROUTINE vol7d_normalize_data 855 real function base_value(btable) 856 character (len=10) , intent(in):: btable 858 character (len=10) :: btables(1) =(/ "B12101"/) 859 real :: base_values(1) =(/273.15 /) 862 ind = index_c(btables,btable) 865 base_value = base_values(ind) 867 call l4f_log(l4f_warn, "modqccli_base_value: variable "//btable// " do not have base value") 873 end function base_value 882 SUBROUTINE quaconcli (qccli,battrinv,battrout,& 883 anamask,timemask,levelmask,timerangemask,varmask,networkmask) 886 type(qcclitype), intent(in out) :: qccli 887 character (len=10) , intent(in), optional :: battrinv 888 character (len=10) , intent(in), optional :: battrout 889 logical , intent(in), optional :: anamask(:) 890 logical , intent(in), optional :: timemask(:) 891 logical , intent(in), optional :: levelmask(:) 892 logical , intent(in), optional :: timerangemask(:) 893 logical , intent(in), optional :: varmask(:) 894 logical , intent(in), optional :: networkmask(:) 896 CHARACTER(len=vol7d_ana_lenident) :: ident 897 REAL(kind=fp_geo) :: latc,lonc 900 integer :: indbattrinv,indbattrout 901 logical :: anamaskl(size(qccli%v7d%ana)), timemaskl(size(qccli%v7d%time)), levelmaskl(size(qccli%v7d%level)), & 902 timerangemaskl(size(qccli%v7d%timerange)), varmaskl(size(qccli%v7d%dativar%r)), networkmaskl(size(qccli%v7d%network)) 904 integer :: indana , indtime ,indlevel ,indtimerange ,inddativarr, indnetwork 905 integer :: indcana, indctime,indclevel,indctimerange,indcdativarr,indcnetwork 906 real :: datoqui,climaquii,climaquif, extremequii,extremequif,perc25,perc50,perc75 907 integer :: iarea,desc,indn,indvar,k 912 TYPE(vol7d_network) :: network 913 TYPE(vol7d_ana) :: ana 914 TYPE(datetime) :: time, nintime 915 TYPE(vol7d_level):: level 916 type(vol7d_var) :: anavar 917 integer :: iclv(size(qccli%v7d%ana)) 918 character(len=1) :: type 924 if ( associated(qccli%v7d%datiattr%b)) then 925 if ( present(battrinv)) then 926 indbattrinv = index_c(qccli%v7d%datiattr%b(:)%btable, battrinv) 928 indbattrinv = index_c(qccli%v7d%datiattr%b(:)%btable, qcattrvarsbtables(1)) 932 if ( indbattrinv <= 0 ) then 934 call l4f_category_log(qccli%category,l4f_error, "error finding attribute index in/out "//qcattrvarsbtables(1)) 935 call raise_error( "error finding attribute index in/out "//qcattrvarsbtables(1)) 940 if ( present(battrout)) then 941 indbattrout = index_c(qccli%v7d%datiattr%b(:)%btable, battrout) 943 indbattrout = index_c(qccli%v7d%datiattr%b(:)%btable, qcattrvarsbtables(2)) 946 if ( indbattrout <= 0 ) then 948 call l4f_category_log(qccli%category,l4f_error, "error finding attribute index in/out "//qcattrvarsbtables(2)) 949 call raise_error( "error finding attribute index in/out "//qcattrvarsbtables(2)) 953 if( present(anamask)) then 958 if( present(timemask)) then 963 if( present(levelmask)) then 964 levelmaskl = levelmask 968 if( present(timerangemask)) then 969 timerangemaskl = timerangemask 971 timerangemaskl = .true. 973 if( present(varmask)) then 978 if( present(networkmask)) then 979 networkmaskl = networkmask 981 networkmaskl = .true. 984 qccli%v7d%voldatiattrb(:,:,:,:,:,:,indbattrout)=ibmiss 985 call init(anavar, "B07030" ) 987 indvar = index(qccli%v7d%anavar, anavar, type=type) 989 do indana=1, size(qccli%v7d%ana) 994 iarea= qccli%in_macroa(indana) 996 if (.not. c_e(iarea)) cycle 1013 if (qccli%height2level) then 1018 do indn=1, size(qccli%v7d%network) 1020 if( indvar > 0 .and. indn > 0 ) then 1023 height=realdat(qccli%v7d%volanad(indana,indvar,indn),qccli%v7d%anavar%d(indvar)) 1025 height=realdat(qccli%v7d%volanar(indana,indvar,indn),qccli%v7d%anavar%r(indvar)) 1027 height=realdat(qccli%v7d%volanai(indana,indvar,indn),qccli%v7d%anavar%i(indvar)) 1029 height=realdat(qccli%v7d%volanab(indana,indvar,indn),qccli%v7d%anavar%b(indvar)) 1031 height=realdat(qccli%v7d%volanac(indana,indvar,indn),qccli%v7d%anavar%c(indvar)) 1037 if ( c_e(height)) exit 1040 if ( c_e(height)) then 1041 iclv(indana)=firsttrue(cli_level1 <= height .and. height <= cli_level2 ) 1047 CALL l4f_log(l4f_debug, 'quaconcli height has value '//t2c(height, "Missing")) 1048 CALL l4f_log(l4f_debug, 'for k having number '//t2c(k)//& 1049 ' iclv has value '//t2c(iclv(indana))) Function to check whether a value is missing or not.
|