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
Esempio n. 2
0
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);
}
Esempio n. 3
0
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);
}
Esempio n. 4
0
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;
	}

}