Elaboradar  0.1
 Tutto Classi Namespace File Funzioni Variabili Tipi enumerati (enum) Gruppi
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 894 del file cum_bac.cpp.

Referenziato da esegui_tutto().

899 {
900  LOG_CATEGORY("radar.vpr");
901 
902  int ilray,ilref,ilay2,ier_ana,snow,strat;
903  float corr,vpr_liq,vpr_hray,hbin,hliq;
904 
905  /*inizializzazione variabili */
906  snow=0;
907  //vpr al livello liquido liv liquido e liv max
908  vpr_liq=NODATAVPR;
909  hliq=NODATAVPR;
910  hvprmax=INODATA;
911 
912  // analisi vpr
913 
915  ier_ana=analyse_VPR(&vpr_liq,&snow,&hliq);
916  LOG_INFO("ier_analisi %i",ier_ana) ;
917 
918  /* se analisi dice che non è il caso di correggere non correggo (NB in questo caso non riempio la matrice di neve)*/
919  if (ier_ana) return 1;
920 
921  LOG_INFO("altezza bright band %i",hvprmax);
922  LOG_INFO("CORREGGO VPR");
923 
924  //correzione vpr
925  for (unsigned i=0; i<NUM_AZ_X_PPI; i++){
926  for (unsigned k=0; k<cum_bac.volume[0].beam_size; k++){
927  corr=0.;
928  /* trovo elevazione reale e quota bin*/
929  //elevaz=(float)(volume_at_elev_preci(i, k).teta_true)*CONV_RAD;
930  hbin=(float)cum_bac.anaprop.quota(i, k);
931 
932  /* se dall'analisi risulta che nevica assegno neve ovunque*/
933  if (snow) neve(i, k)=1;
934  strat=1;
935  if (cum_bac.do_class)
936  {
937  if (conv(i,k) >= CONV_VAL){
938  strat=0;
939  }
940  }
941  //--- impongo una soglia per la correzione pari a 0 dBZ
942  if (cum_bac.volume[0].get(i, k) > THR_CORR && hbin > hliq && strat){
943 
944  //---trovo lo strato del pixel, se maggiore o uguale a NMAXLAYER lo retrocedo di 2, se minore di livmn lo pongo uguale a livmin
945  ilray=(hbin>=livmin)?(floor(hbin/TCK_VPR)):(floor(livmin/TCK_VPR));//discutibile :livello del fascio se minore di livmin posto=livmin
946  if (ilray>= NMAXLAYER ) ilray=NMAXLAYER-2;//livello del fascio se >= NMAXLAYER posto =NMAXLAYER-2
947 
948  //---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
949  if ((int)hbin%TCK_VPR > TCK_VPR/2) ilay2=ilray+1;
950  else ilay2=ilray-1;
951  if (ilay2< floor(livmin/TCK_VPR)) ilay2=floor(livmin/TCK_VPR);
952 
953  //trovo ilref: livello di riferimento per ricostruire il valore vpr al suolo nel caso di neve.
954  // in caso di profilo di pioggia mi riporto sempre al valore del livello liquido e questo può essere un punto critico.. vedere come modificarlo.
955 
956  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
957 
958 
959  if (vpr.val[ilref] > 0 && vpr.val[ilray] > 0 ){ /*devo avere dati validi nel VPR alle quote considerate!*/
960  //-- calcolo il valore del profilo alla quota di interesse
961  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 */
962  //--identifico le aree dove nevica stando alla quota teorica dello zero termico
963 
964  if (cum_bac.dem(i, k)> hvprmax+HALF_BB-TCK_VPR || snow){ /*classifico neve*/
965  neve(i, k)=1;
966 
967  }
968 
969  //--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
970 
971 
972  //if(snow) //A rimosso, faccio una cosa diversa
973  if(neve(i, k)){
974 
975  //faccio la regressione lineare dei punti del profilo sopra il punto del dem
976  //calcolo il valore al livello del dem e lo sostituisco a vpr.val[ilref] nella correzione
977  // faccio linearizzazione in maniera becera:
978  //vpr.val[ilref]=(vpr.val[ilref+7]-vpr.val[ilref+2])/(5)*(ilref-(ilref+2))+vpr.val[ilref+2];
979 
980  //passaggio=BYTEtoR(volume.vol_pol,aMP_SNOW,bMP_SNOW)
981 
982  //volpol[0][i][k]=RtoBYTE(passaggio)
983 
984  corr=cum_bac.dbz.RtoDBZ(vpr.val[ilref])-cum_bac.dbz.RtoDBZ(vpr_hray);
985 
986  cum_bac.volume[0].set(i, k, cum_bac.dbz.DBZ_snow(cum_bac.volume[0].get(i, k)));
987  }
988  else{
989  // -- altrimenti correggo comunque a livello liquido :
990  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*/
991  }
992  // -- controllo qualità su valore correzione
993  if (corr>MAX_CORR) corr=MAX_CORR; /*soglia sulla massima correzione*/
994  if (hbin<hvprmax && corr>0.) corr=0; /*evito effetti incrementi non giustificati*/
995 
996  //controllo qualità su valore corretto e correzione
997  double corrected = cum_bac.volume[0].get(i, k) + corr;
998  if (corrected > MAXVAL_DB) // se dato corretto va fuori scala assegno valore massimo
999  cum_bac.volume[0].set(i, k, MAXVAL_DB);
1000  else if ( corrected < MINVAL_DB) // se dato corretto va a fodoscala assegno valore di fondo scala
1001  cum_bac.volume[0].set(i, k, MINVAL_DB);
1002  else
1003  cum_bac.volume[0].set(i, k, corrected); // correggo
1004 
1005  corr_polar(i, k)=(unsigned char)(corr)+128;
1006 
1007  //inserisco un ponghino per rifare la neve con aMP e bMP modificati // DA SCOMMENTARE SE DECIDO DI FARLO
1008 
1009  //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 )) ;
1010 
1011 
1012  }
1013  }
1014  }
1015  }
1016  return(0);
1017 }
radarelab::PolarScan< unsigned char > corr_polar
correzione vpr in byte 0-128 negativa 128-256 positiva, in coord az-ra
Definition: cum_bac.h:243
radarelab::algo::DBZ dbz
????
Definition: cum_bac.h:107
CUM_BAC & cum_bac
oggeto CUM_BAC di riferimento
Definition: cum_bac.h:227
radarelab::PolarScan< unsigned char > neve
matrice az-range che memorizza punti di neve
Definition: cum_bac.h:244
int trovo_hvprmax(int *hmax)
trova il massimo del profilo
Definition: cum_bac.cpp:1019
radarelab::Volume< double > & volume
Polar volume of Reflectivity.
Definition: cum_bac.h:103
int hvprmax
quota picco vpr
Definition: cum_bac.h:234
radarelab::PolarScan< float > dem
dem in coordinate azimut range
Definition: cum_bac.h:129
radarelab::algo::VPR vpr
Informa se il pixel è convettivo.
Definition: cum_bac.h:233
bool do_class
Convective-stratiform classification.
Definition: cum_bac.h:97
int ier_max
flag d&#39;errore su calcolo quota max
Definition: cum_bac.h:245
int livmin
quota livello minimo calcolato
Definition: cum_bac.h:240
int analyse_VPR(float *vpr_liq, int *snow, float *hliq)
funzione che analizza il profilo
Definition: cum_bac.cpp:1099
radarelab::algo::Anaprop< double > anaprop
Oggetto per correzione ANAPRO.
Definition: cum_bac.h:126