Elaboradar 0.1
|
◆ corr_vpr()
correzione vpr funzione che corregge per il profilo verticale ciclando su tutti i bins della cartesiana polare scelta per la stima della pioggia,
Definizione alla linea 975 del file cum_bac.cpp. 980{
981 LOG_CATEGORY("radar.vpr");
982
983 int ilray,ilref,ilay2,ier_ana,snow,strat;
984 float corr,vpr_liq,vpr_hray,hbin,hliq;
985
986 /*inizializzazione variabili */
987 snow=0;
988 //vpr al livello liquido liv liquido e liv max
989 vpr_liq=NODATAVPR;
990 hliq=NODATAVPR;
991 hvprmax=INODATA;
992
993 // analisi vpr
994
996 ier_ana=analyse_VPR(&vpr_liq,&snow,&hliq);
997 LOG_INFO("ier_analisi %i",ier_ana) ;
998
999 /* se analisi dice che non è il caso di correggere non correggo (NB in questo caso non riempio la matrice di neve)*/
1000 if (ier_ana) return 1;
1001
1003 LOG_INFO("CORREGGO VPR");
1004
1005 //correzione vpr
1006 for (unsigned i=0; i<NUM_AZ_X_PPI; i++){
1008 corr=0.;
1009 /* trovo elevazione reale e quota bin*/
1010 //elevaz=(float)(volume_at_elev_preci(i, k).teta_true)*CONV_RAD;
1012
1013 /* se dall'analisi risulta che nevica assegno neve ovunque*/
1015 strat=1;
1017 {
1018 if (conv(i,k) >= CONV_VAL){
1019 strat=0;
1020 }
1021 }
1022 //--- impongo una soglia per la correzione pari a 0 dBZ
1024
1025 //---trovo lo strato del pixel, se maggiore o uguale a NMAXLAYER lo retrocedo di 2, se minore di livmn lo pongo uguale a livmin
1026 ilray=(hbin>=livmin)?(floor(hbin/TCK_VPR)):(floor(livmin/TCK_VPR));//discutibile :livello del fascio se minore di livmin posto=livmin
1027 if (ilray>= NMAXLAYER ) ilray=NMAXLAYER-2;//livello del fascio se >= NMAXLAYER posto =NMAXLAYER-2
1028
1029 //---trovo ilay2 strato con cui mediare per calcolare il vpr a una quota intermedia tra 2 livelli, se l'altezza del bin è sopra metà strato prendo quello sopra altrimenti quello sotto
1030 if ((int)hbin%TCK_VPR > TCK_VPR/2) ilay2=ilray+1;
1031 else ilay2=ilray-1;
1033
1034 //trovo ilref: livello di riferimento per ricostruire il valore vpr al suolo nel caso di neve.
1035 // in caso di profilo di pioggia mi riporto sempre al valore del livello liquido e questo può essere un punto critico.. vedere come modificarlo.
1036
1037 ilref=(cum_bac.dem(i, k)>livmin)?(floor(cum_bac.dem(i, k)/TCK_VPR)):(floor(livmin/TCK_VPR));//livello di riferimento; se livello dem>livmin = livello dem altrimenti livmin
1038
1039
1040 if (vpr.val[ilref] > 0 && vpr.val[ilray] > 0 ){ /*devo avere dati validi nel VPR alle quote considerate!*/
1041 //-- calcolo il valore del profilo alla quota di interesse
1042 vpr_hray=vpr.val[ilray]+((vpr.val[ilray]-vpr.val[ilay2])/(ilray*TCK_VPR-TCK_VPR/2-ilay2*TCK_VPR))*(hbin-ilray*TCK_VPR-TCK_VPR/2); /*per rendere la correzione continua non a gradini */
1043 //--identifico le aree dove nevica stando alla quota teorica dello zero termico
1044
1046 neve(i, k)=1;
1047
1048 }
1049
1050 //--se nevica la correzione consiste solo nel riportare il valore del vpr al suolo: PROPOSTA: qui si potrebbe generare una mappa di intensità di neve ma deve essere rivisto tutto
1051
1052
1053 //if(snow) //A rimosso, faccio una cosa diversa
1055
1056 //faccio la regressione lineare dei punti del profilo sopra il punto del dem
1057 //calcolo il valore al livello del dem e lo sostituisco a vpr.val[ilref] nella correzione
1058 // faccio linearizzazione in maniera becera:
1059 //vpr.val[ilref]=(vpr.val[ilref+7]-vpr.val[ilref+2])/(5)*(ilref-(ilref+2))+vpr.val[ilref+2];
1060
1061 //passaggio=BYTEtoR(volume.vol_pol,aMP_SNOW,bMP_SNOW)
1062
1063 //volpol[0][i][k]=RtoBYTE(passaggio)
1064
1066
1068 }
1069 else{
1070 // -- altrimenti correggo comunque a livello liquido :
1071 corr = cum_bac.dbz.RtoDBZ_class(vpr_liq) - cum_bac.dbz.RtoDBZ_class(vpr_hray);/*riporto comunque al valore liquido anche se sono sopra la bright band*/
1072 }
1073 // -- controllo qualità su valore correzione
1074 if (corr>MAX_CORR) corr=MAX_CORR; /*soglia sulla massima correzione*/
1075 if (hbin<hvprmax && corr>0.) corr=0; /*evito effetti incrementi non giustificati*/
1076
1077 //controllo qualità su valore corretto e correzione
1079 if (corrected > MAXVAL_DB) // se dato corretto va fuori scala assegno valore massimo
1081 else if ( corrected < MINVAL_DB) // se dato corretto va a fodoscala assegno valore di fondo scala
1083 else
1085
1087
1088 //inserisco un ponghino per rifare la neve con aMP e bMP modificati // DA SCOMMENTARE SE DECIDO DI FARLO
1089
1090 //if (neve[i][k]) volume.scan(0).get_raw(i, k)=DBtoBYTE(RtoDBZ( BYTE_to_mp_func(volume.scan(0).get_raw(i, k),aMP_SNOW,bMP_SNOW),aMP_class,bMP_class )) ;
1091
1092
1093 }
1094 }
1095 }
1096 }
1097 return(0);
1098}
radarelab::Volume< double > & volume Set to Z undetect value the Zpixels classified as non-meteo echoes. Definition cum_bac.h:106 radarelab::PolarScan< unsigned char > neve matrice az-range che memorizza punti di neve Definition cum_bac.h:247 int analyse_VPR(float *vpr_liq, int *snow, float *hliq) funzione che analizza il profilo Definition cum_bac.cpp:1180 radarelab::PolarScan< unsigned char > corr_polar correzione vpr in byte 0-128 negativa 128-256 positiva, in coord az-ra Definition cum_bac.h:246 Referenziato da esegui_tutto(). |