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 }