void CWaterRetentionCapacity::CalculateWaterRetention(float **pData, int iNumHorizons, float fC, CSG_Table_Record *pRecord){ int i; int iField; float *pCCC = new float[iNumHorizons]; float *pCIL = new float[iNumHorizons]; float *pK = new float[iNumHorizons]; int *pPerm = new int[iNumHorizons]; float *pHe = new float[iNumHorizons]; float *pCRA = new float[iNumHorizons]; float fTotalDepth = 0; float fWaterRetention = 0; float fPerm = 0; float fHe = 0; float fK = 0; float fCCC = 0; float fCIL = 0; pK[0] = 0; for (i = 0; i < iNumHorizons; i++){ pCCC[i] = CalculateCCC(pData[i]); pCIL[i] = CalculateCIL(pData[i]); pPerm[i] = CalculatePermeability(pCCC[i], pCIL[i]); pHe[i] = CalculateHe(pData[i]); if (i){ pK[i] = CalculateK(pPerm[i-1], pPerm[i], fC); }//if pCRA[i] = (float)((12.5 * pHe[i] + 12.5 * (50. - pHe[i]) * pK[i] / 2.) * pData[i][1] / 100.); fTotalDepth += pData[i][0]; }//for for (i = 0; i < iNumHorizons; i++){ fWaterRetention += pData[i][0] / fTotalDepth * pCRA[i]; fCCC += pData[i][0] / fTotalDepth * pCCC[i]; fCIL += pData[i][0] / fTotalDepth * pCIL[i]; fPerm += pData[i][0] / fTotalDepth * pPerm[i]; fHe += pData[i][0] / fTotalDepth * pHe[i]; fK += pData[i][0] / fTotalDepth * pK[i]; }//for iField = pRecord->Get_Table()->Get_Field_Count() - 1; pRecord->Set_Value(iField - 4, fCCC); pRecord->Set_Value(iField - 3, fCIL); pRecord->Set_Value(iField - 2, fPerm); pRecord->Set_Value(iField - 1, fHe); pRecord->Set_Value(iField, fWaterRetention); delete[]pCRA; }//method
void Stoch::Update(bool is_new_bar) { if (is_new_bar) { m_k.insert(m_k.begin(), 0); if ((int)(m_k.size()) > m_max_size) m_k.pop_back(); } if ((int)((*m_close_data).size()) < m_k_period + m_slowing) return; CalculateK(1); m_d.Update(is_new_bar); }
void Stoch::Init(int symbol, vector<double>* high_data, vector<double>* low_data, vector<double>* close_data, int k_period, int d_period, int slowing, int ma_method, int max_size) { m_high_data = high_data; m_low_data = low_data; m_close_data = close_data; m_ma_method = ma_method; m_k_period = k_period; m_d_period = d_period; m_slowing = slowing; m_symbol = symbol; m_max_size = max_size; int data_size = (int)((*m_close_data).size()); m_k.insert(m_k.begin(), max_size, 0); if (data_size >= k_period) CalculateK(data_size - k_period); m_d.Init(symbol, &m_k, MODE_EMA, d_period, max_size); }
bool KalmanCalc::UpdateKalman(t_calcvar* pTheta, t_calcvar* pP, const t_calcvar* pC, t_calcvar y, t_calcvar R0, int dimensions) { t_calcvar k_kal_vector[MAX_DIM]; t_calcvar invterm; /* Kq = Pq*Cq'*inv(Cq*Pq*Cq' + R_Q_0) */ invterm = CalculateK(k_kal_vector, pP, pC, R0, dimensions); if (invterm > 0.0f) { /* zq = zq + Kq*(mQKal - Cq*zq) */ CalculateTheta(pTheta, k_kal_vector, pC, y, dimensions); /* Pq = Pq - Kq*Cq*Pq */ CalculateP(pP, k_kal_vector, pC, invterm, dimensions); #if defined(KALMAN_PRINT) if (dimensions == 4) { printf("UpdateKalman():\n"); printf("theta = [%f, %f, %f, %f];\n",pTheta[0],pTheta[1],pTheta[2],pTheta[3]); printf("P = [%f, %f, %f, %f; ...\n" ,pP[0], pP[1], pP[2], pP[3]); printf(" %f, %f, %f, %f; ...\n" ,pP[4], pP[5], pP[6], pP[7]); printf(" %f, %f, %f, %f; ...\n" ,pP[8], pP[9], pP[10],pP[11]); printf(" %f, %f, %f, %f];\n" ,pP[12],pP[13],pP[14],pP[15]); } #endif return true; } else { return false; } }