Elaboradar 0.1
Caricamento in corso...
Ricerca in corso...
Nessun risultato

◆ corr_vpr()

int elaboradar::CalcoloVPR::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,

  • trovo la quota del centro del pixel
  • correggo se: hbin>hliq , valore maggiore di soglia correzione (0 dBZ)
  • se sefinita CLASS e pixel convettivo non correggo
    Restituisce
    0 se ok 1 se fallisce

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
1002 LOG_INFO("altezza bright band %i",hvprmax);
1003 LOG_INFO("CORREGGO VPR");
1004
1005 //correzione vpr
1006 for (unsigned i=0; i<NUM_AZ_X_PPI; i++){
1007 for (unsigned k=0; k<cum_bac.volume[0].beam_size; k++){
1008 corr=0.;
1009 /* trovo elevazione reale e quota bin*/
1010 //elevaz=(float)(volume_at_elev_preci(i, k).teta_true)*CONV_RAD;
1011 hbin=(float)cum_bac.anaprop.quota(i, k);
1012
1013 /* se dall'analisi risulta che nevica assegno neve ovunque*/
1014 if (snow) neve(i, k)=1;
1015 strat=1;
1016 if (cum_bac.do_class)
1017 {
1018 if (conv(i,k) >= CONV_VAL){
1019 strat=0;
1020 }
1021 }
1022 //--- impongo una soglia per la correzione pari a 0 dBZ
1023 if (cum_bac.volume[0].get(i, k) > THR_CORR && hbin > hliq && strat){
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;
1032 if (ilay2< floor(livmin/TCK_VPR)) ilay2=floor(livmin/TCK_VPR);
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
1045 if (cum_bac.dem(i, k)> hvprmax+HALF_BB-TCK_VPR || snow){ /*classifico neve*/
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
1054 if(neve(i, k)){
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
1065 corr=cum_bac.dbz.RtoDBZ(vpr.val[ilref])-cum_bac.dbz.RtoDBZ(vpr_hray);
1066
1067 cum_bac.volume[0].set(i, k, cum_bac.dbz.DBZ_snow(cum_bac.volume[0].get(i, k)));
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
1078 double corrected = cum_bac.volume[0].get(i, k) + corr;
1079 if (corrected > MAXVAL_DB) // se dato corretto va fuori scala assegno valore massimo
1080 cum_bac.volume[0].set(i, k, MAXVAL_DB);
1081 else if ( corrected < MINVAL_DB) // se dato corretto va a fodoscala assegno valore di fondo scala
1082 cum_bac.volume[0].set(i, k, MINVAL_DB);
1083 else
1084 cum_bac.volume[0].set(i, k, corrected); // correggo
1085
1086 corr_polar(i, k)=(unsigned char)(corr)+128;
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::PolarScan< unsigned char > neve
matrice az-range che memorizza punti di neve
Definition cum_bac.h:247
int ier_max
flag d'errore su calcolo quota max
Definition cum_bac.h:248
int livmin
quota livello minimo calcolato
Definition cum_bac.h:243
radarelab::algo::VPR vpr
Informa se il pixel è convettivo.
Definition cum_bac.h:236
int analyse_VPR(float *vpr_liq, int *snow, float *hliq)
funzione che analizza il profilo
Definition cum_bac.cpp:1180
int hvprmax
quota picco vpr
Definition cum_bac.h:237
int trovo_hvprmax(int *hmax)
trova il massimo del profilo
Definition cum_bac.cpp:1100
CUM_BAC & cum_bac
oggeto CUM_BAC di riferimento
Definition cum_bac.h:230
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

Referenzia analyse_VPR(), corr_polar, cum_bac, hvprmax, ier_max, livmin, neve, trovo_hvprmax(), e vpr.

Referenziato da esegui_tutto().