| Classes | Job Modules | Data Objects | Services | Algorithms | Tools | Packages | Directories | Tracs |

In This Package:

LutForBdlFunction.cpp

Go to the documentation of this file.
00001 //$ Id: $
00002 #include <iostream>
00003 #include "LutForBdlFunction.h"
00004 
00005 LutForBdlFunction::LutForBdlFunction(int nVar, int* nBinVar, double* minVar, double* maxVar) {
00006 
00007     m_nVar = 0;
00008     m_nPointVar = NULL;
00009     m_minVar    = NULL;
00010     m_maxVar    = NULL;
00011     m_deltaVar  = NULL;
00012     m_table     = NULL;
00013 
00014     m_indexVector    = NULL;
00015     m_variableVector = NULL;
00016 
00017   int i;
00018   int good_input = 1;
00019 
00020   // check arguments 
00021   if(nVar<1 || nVar>100) {
00022     good_input=0;
00023   }
00024   else {
00025     for (i=0; i<nVar; i++) {
00026       if( nBinVar[i] < 1 || (maxVar[i] - minVar[i]) < 1.e-10 ) {
00027         good_input=0;
00028       }
00029     }
00030   }
00031 
00032   if(good_input) {
00033     m_nVar = nVar;
00034     createVectors();
00035     for (i=0; i< m_nVar; i++) {
00036       m_nPointVar[i]  = nBinVar[i]+1;
00037       m_minVar[i]     = minVar[i];
00038       m_maxVar[i]     = maxVar[i];
00039       m_deltaVar[i]   = ( maxVar[i] - minVar[i] ) /  (m_nPointVar[i]-1);  
00040     }
00041     createTable();
00042     // reset internal vectors
00043     for (i=0; i<m_nVar; i++) {
00044       m_indexVector[i] = 0;
00045       m_variableVector[i]   = 0.0;
00046     }
00047   }
00048   else {
00049     std::cout << " PatVTTLutForFunction: incorrect input for lookup table \n";
00050   }
00051 }
00052 
00053 LutForBdlFunction::~LutForBdlFunction() {
00054   deleteVectors();
00055   deleteTable();
00056 }
00057 
00058 void LutForBdlFunction::createVectors() {
00059   m_nPointVar    = new    int[m_nVar];
00060   m_minVar       = new double[m_nVar];
00061   m_maxVar       = new double[m_nVar];
00062   m_deltaVar     = new double[m_nVar];
00063 
00064   m_indexVector       = new    int[m_nVar];
00065   m_variableVector    = new double[m_nVar];
00066 }
00067 
00068 void LutForBdlFunction::deleteVectors() {
00069   if(m_nPointVar   != NULL) delete[] m_nPointVar;
00070   if(m_minVar      != NULL) delete[] m_minVar;
00071   if(m_maxVar      != NULL) delete[] m_maxVar;
00072   if(m_deltaVar    != NULL) delete[] m_deltaVar;
00073 
00074   if(m_indexVector      != NULL) delete[] m_indexVector;
00075   if(m_variableVector   != NULL) delete[] m_variableVector;
00076 }
00077 
00078 void LutForBdlFunction::createTable() {
00079   int i;
00080   int iSize = 1; 
00081   for (i=0; i<m_nVar; i++) {
00082     iSize *= (m_nPointVar[i]);
00083   }
00084 
00085   m_table = new float[iSize];
00086 }
00087 
00088 void LutForBdlFunction::deleteTable() {
00089   if(m_table != NULL) delete[] m_table;
00090 }
00091 
00092 void LutForBdlFunction::resetIndexVector() {
00093   int i;
00094   for (i=0; i<m_nVar; i++) {
00095     m_indexVector[i] = 0;
00096   }  
00097 }
00098 
00099 void LutForBdlFunction::resetVariableVector() {
00100   int i;
00101   for (i=0; i<m_nVar; i++) {
00102     m_variableVector[i] = 0;
00103   }  
00104 }
00105 
00106 int LutForBdlFunction::incrementIndexVector() {
00107   int i;
00108   m_indexVector[0]++;
00109   for (i=0; i<m_nVar-1; i++) {
00110     if(m_indexVector[i] > m_nPointVar[i]-1) {
00111       m_indexVector[i]=0;
00112       m_indexVector[i+1]++;
00113     }
00114     else {
00115         break;
00116     }
00117   }  
00118   if(m_indexVector[m_nVar-1] > m_nPointVar[m_nVar-1]-1) { 
00119     resetIndexVector();
00120     return 1;
00121   }
00122 
00123   return 0;
00124 }
00125 
00126 
00127 void LutForBdlFunction::fillTable(double lutValue) {
00128   m_table[tableLocation()] = (float) lutValue;
00129 }
00130 
00131 double LutForBdlFunction::getVariable(int iv) {
00132   calculateVariableVector();
00133   if(iv<0 || iv> m_nVar-1) return 0.0;
00134   return m_variableVector[iv];
00135 }
00136 
00137 void LutForBdlFunction::getVariableVector(double* var) {
00138   int i;
00139   calculateVariableVector();
00140   for (i=0; i<m_nVar; i++) {
00141     var[i] = m_variableVector[i];
00142   }
00143 }
00144 
00145 double LutForBdlFunction::getValueFromTable(double* var) {
00146   calculateClosestIndexVector(var);
00147   return (double) m_table[tableLocation()];
00148 }
00149 
00150 double LutForBdlFunction::getInterpolatedValueFromTable(double* var) {
00151   int i;
00152   calculateIndexVector(var);
00153   calculateVariableVector();
00154   double tabVal = m_table[tableLocation()];
00155   double addTabVal = 0.0;
00156   for(i=0; i<m_nVar; i++) {
00157     if(var[i]<m_variableVector[i]) continue;
00158     if(m_indexVector[i] > m_nPointVar[i]-2) continue;
00159     if(var[i]<m_minVar[i] || var[i]>m_maxVar[i]) continue;
00160     m_indexVector[i]++;
00161     double dTab_dVar =  (m_table[tableLocation()] - tabVal) / m_deltaVar[i];  
00162     m_indexVector[i]--;
00163     double dVar = (var[i]-m_variableVector[i]);
00164     addTabVal += dTab_dVar*dVar;
00165   }  
00166   tabVal+=addTabVal;
00167   return tabVal;
00168 }
00169 
00170 int LutForBdlFunction::tableLocation() {
00171   int i;
00172   if(1==m_nVar) return m_indexVector[0];
00173   int location;
00174   location = m_indexVector[m_nVar-1];
00175   for (i=m_nVar-2; i>=0; i--) {
00176     location = location*m_nPointVar[i] + m_indexVector[i];
00177   }
00178   return location;
00179 }
00180 
00181 void LutForBdlFunction::calculateVariableVector() {
00182   int i;
00183   for (i=0; i<m_nVar; i++) {
00184     m_variableVector[i]=m_minVar[i]+m_indexVector[i]*m_deltaVar[i];
00185   }
00186 }
00187 
00188 void LutForBdlFunction::calculateIndexVector(double* var) {
00189   int i;
00190   for (i=0; i<m_nVar; i++) {
00191     int idx = (int) ((var[i]-m_minVar[i])/m_deltaVar[i] + 0.000000001);
00192     if(idx<0) idx=0;
00193     if(idx>(m_nPointVar[i]-1)) idx=m_nPointVar[i]-1;
00194     m_indexVector[i]=idx;
00195   }  
00196 }
00197 
00198 void LutForBdlFunction::calculateClosestIndexVector(double* var) {
00199   int i;
00200   for (i=0; i<m_nVar; i++) {
00201     int idx = (int) ((var[i]-m_minVar[i])/m_deltaVar[i] + 0.5);
00202     if(idx<0) idx=0;
00203     if(idx>(m_nPointVar[i]-1)) idx=m_nPointVar[i]-1;
00204     m_indexVector[i]=idx;
00205   }  
00206 }
| Classes | Job Modules | Data Objects | Services | Algorithms | Tools | Packages | Directories | Tracs |

Generated on Mon Apr 11 20:04:54 2011 for Magnet by doxygen 1.4.7