Elaboradar  0.1

◆ 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::algo::Anaprop< double > anaprop
Oggetto per correzione ANAPRO.
Definition: cum_bac.h:129
radarelab::PolarScan< float > dem
dem in coordinate azimut range
Definition: cum_bac.h:132
bool do_class
Convective-stratiform classification.
Definition: cum_bac.h:97
radarelab::Volume< double > & volume
Set to Z undetect value the Zpixels classified as non-meteo echoes.
Definition: cum_bac.h:106
radarelab::algo::DBZ dbz
????
Definition: cum_bac.h:110
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

Referenziato da esegui_tutto().