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); } }
static AValue TestC_ADiv(AThread *t, AValue *frame) { return ADiv(t, frame[0], frame[1]); }