Ejemplo n.º 1
0
void TPZArtDiff::Divergent(TPZFMatrix<STATE> &dsol,
						   TPZFMatrix<REAL> & phi,
						   TPZFMatrix<REAL> & dphi,
						   TPZVec<TPZDiffMatrix<T> > & Ai,
						   TPZVec<STATE> & Div,
						   TPZDiffMatrix<STATE> * dDiv)
{
	int nstate = Ai[0].Cols();
	int dim = nstate - 2;
	int nshape = dphi.Cols();
	Div.Resize(nstate);
	Div = (STATE(0.));
	
	int i, j, k;
	
	// computing the divergent:
	// A.du/dx + B.du/dy + C.du/dz
	for(k=0;k<dim;k++)
		for(i=0;i<nstate; i++)
			for(j=0;j<nstate;j++)
			{
				Div[i] += Ai[k](i,j).val() * dsol(k,j);
			}
	
	if(!dDiv)return;
	
	// computing an approximation to the divergent derivative:
	
	// dDiv/dUj ~= A.d2U/dUidx + B.d2U/dUidy + C.d2U/dUidz
	
	dDiv->Redim(nstate, nstate * nshape);
	int l;
	REAL buff;
	for(l=0;l<nshape;l++)
		for(j=0;j<nstate;j++)
			for(i=0;i<nstate; i++)
			{
				buff =0.;
				for(k=0;k<dim;k++)
				{
					buff+=Ai[k](i,j).val()*dphi(k,l);
				}
				dDiv->operator()(i,j+l*nstate)=buff;
			}
	
	TPZVec<T> ADiv(nstate);
	T temp;
	for( k = 0; k < dim; k++)
	{
		//Ai[k].Multiply(Div, ADiv);
		for(i = 0; i < nstate; i++)
		{
			temp = T(0.);
			for(j = 0; j < nstate; j++)
				temp += Ai[k](i,j) * (T)dsol(k,j);//[j];
			ADiv[i] = temp;
		}
		for(l=0;l<nshape;l++)
			for(j=0;j<nstate;j++)
				for(i=0;i<nstate; i++)
					dDiv->operator()(i,j+l*nstate) +=
					ADiv[i]./*fastAccessDx*/dx(j) * phi(l,0);
	}
}
Ejemplo n.º 2
0
static AValue TestC_ADiv(AThread *t, AValue *frame)
{
    return ADiv(t, frame[0], frame[1]);
}