void makeResidual(FVMesh2D &m, FVVect<double> &phi, FVVect< FVPoint2D<double> > &u, FVVect<double> &rhs,FVVect<double> &Vd,FVVect<double> &Vn, FVVect<double> &G,Parameter ¶) { FVVect<double> F(m.getNbEdge()); makeFlux(m,phi,u,Vd,Vn,F,para); G=0.; m.beginEdge(); const size_t edges = m.getNbEdge(); const size_t cells = m.getNbCell(); FVCell2D *ptr_c; FVEdge2D *ptr_e; #pragma omp parallel for private(ptr_c,ptr_e) for(size_t i = 0; i < edges; i++) { //ptr_e=m.nextEdge(); ptr_e = m.getEdge(i); ptr_c = ptr_e->leftCell; #pragma omp atomic G[ptr_c->label - 1] += F[ptr_e->label - 1]; if((ptr_c = ptr_e->rightCell)) { #pragma omp atomic G[ptr_c->label - 1] -= F[ptr_e->label - 1]; } } #pragma omp parallel for for(size_t j=0; j < cells; j++) { G[j]/=m.getCell(j)->area; G[j]-=rhs[j]; } }
void makeResidual2(FVMesh2D &m, FVVect<double> &phi, FVVect< FVPoint2D<double> > &u, FVVect<double> &rhs,FVVect<double> &Vd,FVVect<double> &Vn, FVVect<double> &G,Parameter ¶) { FVEdge2D *ptr_e; FVCell2D *ptr_c; FVVect<double> F(m.getNbEdge()); makeFlux(m,phi,u,Vd,Vn,F,para); G=0.; m.beginEdge(); const size_t cells = m.getNbCell(); #pragma omp parallel for for(size_t i = 0; i < cells; i++) { ptr_c = m.getCell(i); ptr_c->beginEdge(); while((ptr_e = ptr_c->nextEdge())) { if(ptr_c == ptr_e->leftCell) { ptr_c = ptr_e->leftCell; G[ptr_c->label - 1] += F[ptr_e->label - 1]; } else { if((ptr_c = ptr_e->rightCell)) { G[ptr_c->label - 1] -= F[ptr_e->label - 1]; } } } G[i] /= ptr_c->area; G[i] -= rhs[i]; } }