Ignore:
Timestamp:
08/04/11 15:42:43 (13 years ago)
Author:
Takeshi Nakazato
Message:

New Development: No

JIRA Issue: No

Ready for Test: No

Interface Changes: No

What Interface Changed: Please list interface changes

Test Programs: List test programs

Put in Release Notes: Yes/No?

Module(s): Module Names change impacts.

Description: Describe your changes here...

Tuning NROFiller.
Filler is about 6 times faster than before (~660sec->~110sec).

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/parallel/src/FillerBase.cpp

    r2247 r2263  
    2424{
    2525    row_ = TableRow(table_->table());
     26
     27    mEntry_.resize( 0 ) ;
     28    mIdx_.resize( 0 ) ;
     29    fEntry_.resize( 0 ) ;
     30    fIdx_.resize( 0 ) ;
     31    wEntry_.resize( 0 ) ;
     32    wIdx_.resize( 0 ) ;
    2633}
    2734
     
    7885{
    7986  /// @todo this has to change when nchan isn't global anymore
    80   uInt id= table_->frequencies().addEntry(refpix, refval, incr);
     87  uInt nEntry = fEntry_.size() ;
     88  Int idx = -1 ;
     89  Vector<Double> entry( 3 ) ;
     90  entry[0] = refpix ;
     91  entry[1] = refval ;
     92  entry[2] = incr ;
     93  for ( uInt i = 0 ; i < nEntry ; i++ ) {
     94    if ( allEQ( entry, fEntry_[i] ) ) {
     95      idx = i ;
     96      break ;
     97    }
     98  }
     99  uInt id ;
     100  if ( idx != -1 )
     101    id = fIdx_[idx] ;
     102  else {
     103    id= table_->frequencies().addEntry(refpix, refval, incr);
     104    RecordFieldPtr<uInt> mfreqidCol(row_.record(), "FREQ_ID");
     105    fEntry_.push_back( entry ) ;
     106    fIdx_.push_back( id ) ;
     107  }
    81108  RecordFieldPtr<uInt> mfreqidCol(row_.record(), "FREQ_ID");
    82109  *mfreqidCol = id;
     
    87114void FillerBase::setMolecule(const Vector<Double>& restfreq)
    88115{
    89   Vector<String> tmp;
    90   uInt id = table_->molecules().addEntry(restfreq, tmp, tmp);
     116  uInt nEntry = mEntry_.size() ;
     117  Int idx = -1 ;
     118  for ( uInt i = 0 ; i < nEntry ; i++ ) {
     119    if ( restfreq.conform( mEntry_[i] ) ) {
     120      if ( allEQ( restfreq, mEntry_[i] ) ) {
     121        idx = i ;
     122        break ;
     123      }
     124    }
     125  }
     126  uInt id ;
     127  if ( idx != -1 )
     128    id = mIdx_[idx] ;
     129  else {
     130    Vector<String> tmp ;
     131    id = table_->molecules().addEntry(restfreq,tmp,tmp) ;
     132    mEntry_.push_back( restfreq ) ;
     133    mIdx_.push_back( id ) ;
     134  }
    91135  RecordFieldPtr<uInt> molidCol(row_.record(), "MOLECULE_ID");
    92136  *molidCol = id;
     
    125169                        Float windspeed, Float windaz)
    126170{
    127     uInt id = table_->weather().addEntry(temperature, pressure,
    128                                          humidity, windspeed, windaz);
    129     RecordFieldPtr<uInt> mweatheridCol(row_.record(), "WEATHER_ID");
    130     *mweatheridCol = id;
     171  uInt nEntry = wEntry_.size() ;
     172  Int idx = -1 ;
     173  Vector<Float> entry( 5 ) ;
     174  entry[0] = temperature ;
     175  entry[1] = pressure ;
     176  entry[2] = humidity ;
     177  entry[3] = windspeed ;
     178  entry[4] = windaz ;
     179  for ( uInt i = 0 ; i < nEntry ; i++ ) {
     180    if ( allEQ( entry, wEntry_[i] ) ) {
     181      idx = i ;
     182      break ;
     183    }
     184  }
     185  uInt id ;
     186  if ( idx != -1 )
     187    id = wIdx_[idx] ;
     188  else {
     189    id = table_->weather().addEntry(temperature, pressure,
     190                                    humidity, windspeed, windaz);
     191    wEntry_.push_back( entry ) ;
     192    wIdx_.push_back( id ) ;
     193  }
     194  RecordFieldPtr<uInt> mweatheridCol(row_.record(), "WEATHER_ID");
     195  *mweatheridCol = id;
    131196}
    132197
     
    183248                             Float windaz)
    184249{
     250  uInt nEntry = wEntry_.size() ;
     251  Int idx = -1 ;
     252  Vector<Float> entry( 5 ) ;
     253  entry[0] = temperature ;
     254  entry[1] = pressure ;
     255  entry[2] = humidity ;
     256  entry[3] = windspeed ;
     257  entry[4] = windaz ;
     258  for ( uInt i = 0 ; i < nEntry ; i++ ) {
     259    if ( allEQ( entry, wEntry_[i] ) ) {
     260      idx = i ;
     261      break ;
     262    }
     263  }
    185264  uInt id ;
    186   Table tab = table_->weather().table() ;
    187   Table subt = tab( tab.col("TEMPERATURE") == temperature \
    188                     && tab.col("PRESSURE") == pressure \
    189                     && tab.col("HUMIDITY") == humidity \
    190                     && tab.col("WINDSPEED") == windspeed \
    191                     && tab.col("WINDAZ") == windaz, 1 ) ;
    192   Int nrow = tab.nrow() ;
    193   Int nrowSel = subt.nrow() ;
    194   if ( nrowSel == 0 ) {
    195     tab.addRow( 1, True ) ;
    196     TableRow row( tab ) ;
    197     TableRecord &rec = row.record() ;
    198     RecordFieldPtr<casa::uInt> rfpi ;
    199     rfpi.attachToRecord( rec, "ID" ) ;
    200     *rfpi = (uInt)nrow ;
    201     RecordFieldPtr<casa::Float> rfp ;
    202     rfp.attachToRecord( rec, "TEMPERATURE" ) ;
    203     *rfp = temperature ;
    204     rfp.attachToRecord( rec, "PRESSURE" ) ;
    205     *rfp = pressure ;
    206     rfp.attachToRecord( rec, "HUMIDITY" ) ;
    207     *rfp = humidity ;
    208     rfp.attachToRecord( rec, "WINDSPEED" ) ;
    209     *rfp = windspeed ;
    210     rfp.attachToRecord( rec, "WINDAZ" ) ;
    211     *rfp = windaz ;
    212     row.put( nrow, rec ) ;
    213     id = (uInt)nrow ;
    214   }
    215   else {
    216     ROTableColumn tc( subt, "ID" ) ;
    217     id = tc.asuInt( 0 ) ;
     265  if ( idx != -1 )
     266    id = wIdx_[idx] ;
     267  else {
     268    Table tab = table_->weather().table() ;
     269    Table subt = tab( tab.col("TEMPERATURE") == temperature     \
     270                      && tab.col("PRESSURE") == pressure        \
     271                      && tab.col("HUMIDITY") == humidity        \
     272                      && tab.col("WINDSPEED") == windspeed      \
     273                      && tab.col("WINDAZ") == windaz, 1 ) ;
     274    Int nrow = tab.nrow() ;
     275    Int nrowSel = subt.nrow() ;
     276    if ( nrowSel == 0 ) {
     277      tab.addRow( 1, True ) ;
     278      TableRow row( tab ) ;
     279      TableRecord &rec = row.record() ;
     280      RecordFieldPtr<casa::uInt> rfpi ;
     281      rfpi.attachToRecord( rec, "ID" ) ;
     282      *rfpi = (uInt)nrow ;
     283      RecordFieldPtr<casa::Float> rfp ;
     284      rfp.attachToRecord( rec, "TEMPERATURE" ) ;
     285      *rfp = temperature ;
     286      rfp.attachToRecord( rec, "PRESSURE" ) ;
     287      *rfp = pressure ;
     288      rfp.attachToRecord( rec, "HUMIDITY" ) ;
     289      *rfp = humidity ;
     290      rfp.attachToRecord( rec, "WINDSPEED" ) ;
     291      *rfp = windspeed ;
     292      rfp.attachToRecord( rec, "WINDAZ" ) ;
     293      *rfp = windaz ;
     294      row.put( nrow, rec ) ;
     295      id = (uInt)nrow ;
     296    }
     297    else {
     298      ROTableColumn tc( subt, "ID" ) ;
     299      id = tc.asuInt( 0 ) ;
     300    }
     301    wEntry_.push_back( entry ) ;
     302    wIdx_.push_back( id ) ;
    218303  }
    219304  RecordFieldPtr<uInt> mweatheridCol(row_.record(), "WEATHER_ID");
Note: See TracChangeset for help on using the changeset viewer.