Ejemplo n.º 1
0
void CExactMethodForDGP::PickShortestPaths(int num)
{
	if (num >= model.GetNumOfVerts())
		num = model.GetNumOfVerts();
	nTotalCurves = num;
	m_tableOfResultingPaths.clear();
	if (num == 0)
		return;
	if (model.GetNumOfFaces() * num < 4e6)
	{
		if (num >= model.GetNumOfVerts())
		{
			m_tableOfResultingPaths.reserve(model.GetNumOfVerts());
			for (int i = 0; i < model.GetNumOfVerts(); ++i)
			{
				BackTrace(i);
			}
		}
		else
		{
			float step = model.GetNumOfVerts() / float(num);
            step = max(1.0f, step);
			m_tableOfResultingPaths.reserve(int(model.GetNumOfVerts() / step) + 1);
			for (float i = FLT_EPSILON; i < model.GetNumOfVerts(); i += step)
			{
				BackTrace(int(i));
			}
		}
	}	
}
Ejemplo n.º 2
0
void Flow2D::Advect()
{
	float Weights[4];
	int PlaquetteIndex[4];
	int PlaquetteIndexFull[4];
	Int2 Plaquette[2];
	int indexFull;

	Swap(m_Vel.x.aligned, m_TmpVel.x.aligned);
	Swap(m_Vel.y.aligned, m_TmpVel.y.aligned);

	for (int i = 0; i < m_Nscalar; i++) {
		Swap(m_Scalar[i].aligned, m_TmpScalar[i].aligned);
	}

	for (int i = 0; i < m_Nsite; i++) {
//
		indexFull = GetIndexFull(i);

		BackTrace(Plaquette, Weights,i);
		
		PlaquetteIndex[0] = GetIndex(Plaquette[0].x, Plaquette[0].y);
		PlaquetteIndex[1] = GetIndex(Plaquette[1].x, Plaquette[0].y);
		PlaquetteIndex[2] = GetIndex(Plaquette[0].x, Plaquette[1].y);
		PlaquetteIndex[3] = GetIndex(Plaquette[1].x, Plaquette[1].y);

		PlaquetteIndexFull[0] = GetIndexFull(Plaquette[0].x, Plaquette[0].y);
		PlaquetteIndexFull[1] = GetIndexFull(Plaquette[1].x, Plaquette[0].y);
		PlaquetteIndexFull[2] = GetIndexFull(Plaquette[0].x, Plaquette[1].y);
		PlaquetteIndexFull[3] = GetIndexFull(Plaquette[1].x, Plaquette[1].y);

		m_Vel.x.aligned[indexFull] = 0.0f;
		m_Vel.y.aligned[indexFull] = 0.0f;

		for (int j = 0; j < 4; j++) {
			m_Vel.x.aligned[indexFull] += Weights[j] * m_TmpVel.x.aligned[ PlaquetteIndexFull[j] ];
			m_Vel.y.aligned[indexFull] += Weights[j] * m_TmpVel.y.aligned[ PlaquetteIndexFull[j] ];
		}

		for (int k = 0; k < m_Nscalar; k++) { 
			m_Scalar[k].aligned[i] = 0.0f;
			for (int j = 0; j < 4 ; j++) {
				m_Scalar[k].aligned[i] += Weights[j] * m_TmpScalar[k].aligned[ PlaquetteIndex[j] ];
			}
		}	
	}

	SetBoundary(m_Vel.x.aligned);
	SetBoundary(m_Vel.y.aligned);

}