diff --git a/heat/src/wSolver.cpp b/heat/src/wSolver.cpp index 96c7f606d8ac643c99e2403ff2751f8d8c39bd9e..30e65f0e610d52b14f6e32d85d26e997b904fbab 100644 --- a/heat/src/wSolver.cpp +++ b/heat/src/wSolver.cpp @@ -256,47 +256,50 @@ void Solver::start(MshExport *mshWriter) Eigen::Vector2d qM = Eigen::Vector2d::Zero(); for (auto mat : pbl->media) { - tbb::parallel_for_each(mat->tag->elems.begin(), mat->tag->elems.end(), [&](Element *e) - { - if (e->type() != ElType::TRI3) - return; - //std::cout << "processing element #" << e->no << "\n"; + tbb::parallel_for_each( + mat->tag->elems.begin(), mat->tag->elems.end(), + [&](Element *e) + { + if (e->type() != ElType::TRI3) + return; + // std::cout << "processing element #" << e->no << "\n"; - // (flux moyen . volume) sur l'element - Eigen::VectorXd qV = HeatTerm::computeFlux(*e, T1, *mat->k); + // (flux moyen . volume) sur l'element + Eigen::VectorXd qV = HeatTerm::computeFlux(*e, T1, *mat->k); - double V = e->getVol(); + double V = e->getVol(); - if (save) - { - // gradient of T at GP 0 - Eigen::VectorXd grad = e->computeGradient(T1, 0); - int i = e->no - 1; - gradT_x[i] = grad(0); - gradT_y[i] = grad(1); - gradT[i] = Eigen::Vector3d(grad(0), grad(1), 0); - - // mean q over the element - kgradT[i] = Eigen::Vector3d(qV(0) / V, qV(1) / V, 0); - - // mean k over the element - Eigen::MatrixXd kmean = HeatTerm::computeMatrix(*e, T1, *mat->k) / V; - kmoy11[i] = kmean(0, 0); - kmoy22[i] = kmean(1, 1); - kmoy12[i] = kmean(0, 1); - kmoy21[i] = kmean(1, 0); - - // tensor - kmean.conservativeResize(3, 3); - kmean.row(2) = Eigen::RowVector3d::Zero(); - kmean.col(2) = Eigen::Vector3d::Zero(); - kmoy[i] = kmean; - //std::cout << kmean << '\n'; - } + if (save) + { + // gradient of T at GP 0 + Eigen::VectorXd grad = e->computeGradient(T1, 0); + int i = e->no - 1; + gradT_x[i] = grad(0); + gradT_y[i] = grad(1); + gradT[i] = Eigen::Vector3d(grad(0), grad(1), 0); + + // mean q over the element + kgradT[i] = Eigen::Vector3d(qV(0) / V, qV(1) / V, 0); + + // mean k over the element + Eigen::MatrixXd kmean = HeatTerm::computeMatrix(*e, T1, *mat->k) / V; + kmoy11[i] = kmean(0, 0); + kmoy22[i] = kmean(1, 1); + kmoy12[i] = kmean(0, 1); + kmoy21[i] = kmean(1, 0); + + // tensor + kmean.conservativeResize(3, 3); + kmean.row(2) = Eigen::RowVector3d::Zero(); + kmean.col(2) = Eigen::Vector3d::Zero(); + kmoy[i] = kmean; + // std::cout << kmean << '\n'; + } - tbb::spin_mutex::scoped_lock lock(mutex); - Vtot += V; - qM += qV; // qM = qM + qV }); + tbb::spin_mutex::scoped_lock lock(mutex); + Vtot += V; + qM += qV; // qM = qM + qV + }); } qM /= Vtot; @@ -371,25 +374,28 @@ void Solver::buildK(Eigen::SparseMatrix<double, Eigen::RowMajor> &K2, Eigen::Map { if (verbose > 1) std::cout << "\tprocessing " << *mat << '\n'; - tbb::parallel_for_each(mat->tag->elems.begin(), mat->tag->elems.end(), [&](Element *e) - { - if (e->type() != ElType::TRI3) - return; - //std::cout << "processing element #" << e->no << "\n"; + tbb::parallel_for_each( + mat->tag->elems.begin(), mat->tag->elems.end(), + [&](Element *e) + { + if (e->type() != ElType::TRI3) + return; + // std::cout << "processing element #" << e->no << "\n"; - Eigen::MatrixXd Ke = HeatTerm::build(*e, T1, *mat->k, false); + Eigen::MatrixXd Ke = HeatTerm::build(*e, T1, *mat->k, false); - // assembly - tbb::spin_mutex::scoped_lock lock(mutex); - for (size_t ii = 0; ii < e->nodes.size(); ++ii) - { - Node *nodi = e->nodes[ii]; - for (size_t jj = 0; jj < e->nodes.size(); ++jj) + // assembly + tbb::spin_mutex::scoped_lock lock(mutex); + for (size_t ii = 0; ii < e->nodes.size(); ++ii) { - Node *nodj = e->nodes[jj]; - T.push_back(Eigen::Triplet<double>(rows[nodi->row], nodj->row, Ke(ii, jj))); + Node *nodi = e->nodes[ii]; + for (size_t jj = 0; jj < e->nodes.size(); ++jj) + { + Node *nodj = e->nodes[jj]; + T.push_back(Eigen::Triplet<double>(rows[nodi->row], nodj->row, Ke(ii, jj))); + } } - } }); + }); } } else @@ -522,25 +528,28 @@ void Solver::buildK(Eigen::SparseMatrix<double, Eigen::RowMajor> &K2, Eigen::Map for (auto mat : pbl->media) { // std::cout << "\tprocessing " << *mat << '\n'; - tbb::parallel_for_each(mat->tag->elems.begin(), mat->tag->elems.end(), [&](Element *e) - { - if (e->type() != ElType::TRI3) - return; - //std::cout << "processing element #" << e->no << "\n"; + tbb::parallel_for_each( + mat->tag->elems.begin(), mat->tag->elems.end(), + [&](Element *e) + { + if (e->type() != ElType::TRI3) + return; + // std::cout << "processing element #" << e->no << "\n"; - // ** Ce matrix => K matrix - Eigen::VectorXd Ce = HeatTerm::build(*e, T1, Fct0C(1.0)); + // ** Ce matrix => K matrix + Eigen::VectorXd Ce = HeatTerm::build(*e, T1, Fct0C(1.0)); - // assembly - tbb::spin_mutex::scoped_lock lock(mutex); - for (size_t jj = 0; jj < e->nodes.size(); ++jj) - { - Node *nodj = e->nodes[jj]; - K2.coeffRef(n1->row, nodj->row) += (mat->rhoc) * Ce(jj); + // assembly + tbb::spin_mutex::scoped_lock lock(mutex); + for (size_t jj = 0; jj < e->nodes.size(); ++jj) + { + Node *nodj = e->nodes[jj]; + K2.coeffRef(n1->row, nodj->row) += (mat->rhoc) * Ce(jj); - Vtot += Ce(jj); - rhocM_Vtot += (mat->rhoc) * Ce(jj); - } }); + Vtot += Ce(jj); + rhocM_Vtot += (mat->rhoc) * Ce(jj); + } + }); } rhs(n1->row) = rhocM_Vtot * TM; if (verbose > 1) @@ -593,21 +602,24 @@ void Solver::buildqint(Eigen::VectorXd &qint) { if (verbose > 1) std::cout << "\tprocessing " << *mat << '\n'; - tbb::parallel_for_each(mat->tag->elems.begin(), mat->tag->elems.end(), [&](Element *e) - { - if (e->type() != ElType::TRI3) - return; - //std::cout << "processing element #" << e->no << "\n"; + tbb::parallel_for_each( + mat->tag->elems.begin(), mat->tag->elems.end(), + [&](Element *e) + { + if (e->type() != ElType::TRI3) + return; + // std::cout << "processing element #" << e->no << "\n"; - Eigen::VectorXd qe = HeatTerm::build2(*e, T1, *mat->k); + Eigen::VectorXd qe = HeatTerm::build2(*e, T1, *mat->k); - // assembly - tbb::spin_mutex::scoped_lock lock(mutex); - for (size_t ii = 0; ii < e->nodes.size(); ++ii) - { - Node *nodi = e->nodes[ii]; - qint(nodi->row) += qe(ii); - } }); + // assembly + tbb::spin_mutex::scoped_lock lock(mutex); + for (size_t ii = 0; ii < e->nodes.size(); ++ii) + { + Node *nodi = e->nodes[ii]; + qint(nodi->row) += qe(ii); + } + }); } if (!pbl->dBCs.empty()) @@ -642,23 +654,26 @@ void Solver::builds(Eigen::Map<Eigen::VectorXd> &s) for (auto src : pbl->srcs) { // std::cout << "\tprocessing " << *src << '\n'; - tbb::parallel_for_each(src->tag->elems.begin(), src->tag->elems.end(), [&](Element *e) - { - if (e->type() != ElType::TRI3 && e->type() != ElType::LINE2) - return; - //std::cout << "processing element #" << e->no << "\n"; + tbb::parallel_for_each( + src->tag->elems.begin(), src->tag->elems.end(), + [&](Element *e) + { + if (e->type() != ElType::TRI3 && e->type() != ElType::LINE2) + return; + // std::cout << "processing element #" << e->no << "\n"; - // ** se vector => s vector - Eigen::VectorXd se = HeatTerm::build(*e, T1, *src->f); + // ** se vector => s vector + Eigen::VectorXd se = HeatTerm::build(*e, T1, *src->f); - // assembly - tbb::spin_mutex::scoped_lock lock(mutex); + // assembly + tbb::spin_mutex::scoped_lock lock(mutex); - for (size_t ii = 0; ii < e->nodes.size(); ++ii) - { - Node *nodi = e->nodes[ii]; - s(nodi->row) += se(ii); - } }); + for (size_t ii = 0; ii < e->nodes.size(); ++ii) + { + Node *nodi = e->nodes[ii]; + s(nodi->row) += se(ii); + } + }); } if (verbose > 1) @@ -681,23 +696,26 @@ void Solver::buildq(Eigen::Map<Eigen::VectorXd> &q) for (auto bnd : pbl->bnds) { // std::cout << "\tprocessing " << *src << '\n'; - tbb::parallel_for_each(bnd->tag->elems.begin(), bnd->tag->elems.end(), [&](Element *e) - { - if (e->type() != ElType::LINE2) - return; - //std::cout << "processing element #" << e->no << "\n"; + tbb::parallel_for_each( + bnd->tag->elems.begin(), bnd->tag->elems.end(), + [&](Element *e) + { + if (e->type() != ElType::LINE2) + return; + // std::cout << "processing element #" << e->no << "\n"; - // ** qe vector => q vector - Eigen::VectorXd qe = HeatTerm::build(*e, T1, *bnd->f); + // ** qe vector => q vector + Eigen::VectorXd qe = HeatTerm::build(*e, T1, *bnd->f); - // assembly - tbb::spin_mutex::scoped_lock lock(mutex); + // assembly + tbb::spin_mutex::scoped_lock lock(mutex); - for (size_t ii = 0; ii < e->nodes.size(); ++ii) - { - Node *nodi = e->nodes[ii]; - q(nodi->row) += qe(ii); - } }); + for (size_t ii = 0; ii < e->nodes.size(); ++ii) + { + Node *nodi = e->nodes[ii]; + q(nodi->row) += qe(ii); + } + }); } if (verbose > 1) diff --git a/waves/src/wTimeIntegration.cpp b/waves/src/wTimeIntegration.cpp index 074f7bd9a440a38dc2791504263cdcc373f801af..83f5aa86c67e056b60583ad9c4e60cfebeacfd87 100644 --- a/waves/src/wTimeIntegration.cpp +++ b/waves/src/wTimeIntegration.cpp @@ -102,27 +102,30 @@ void TimeIntegration::buildS(Eigen::SparseMatrix<double, Eigen::RowMajor> &S2) { std::cout << "\tprocessing " << *bnd << '\n'; std::cout << "normal=" << static_cast<Quad4 *>(bnd->tag->elems[0])->getNormal() << '\n'; - tbb::parallel_for_each(bnd->tag->elems.begin(), bnd->tag->elems.end(), [&](Element *e) - { - if (e->type() != ElType::QUAD4) - return; - //std::cout << "processing element #" << e->no << "\n"; + tbb::parallel_for_each( + bnd->tag->elems.begin(), bnd->tag->elems.end(), + [&](Element *e) + { + if (e->type() != ElType::QUAD4) + return; + // std::cout << "processing element #" << e->no << "\n"; - // ** Se matrix => S vector - Eigen::MatrixXd Se = WaveTerm::buildM(*e); + // ** Se matrix => S vector + Eigen::MatrixXd Se = WaveTerm::buildM(*e); - // assembly - tbb::spin_mutex::scoped_lock lock(mutex); + // assembly + tbb::spin_mutex::scoped_lock lock(mutex); - for (size_t ii = 0; ii < e->nodes.size(); ++ii) - { - Node *nodi = e->nodes[ii]; - for (size_t jj = 0; jj < e->nodes.size(); ++jj) + for (size_t ii = 0; ii < e->nodes.size(); ++ii) { - Node *nodj = e->nodes[jj]; - T.push_back(Eigen::Triplet<double>(nodi->row, nodj->row, bnd->c * Se(ii, jj))); + Node *nodi = e->nodes[ii]; + for (size_t jj = 0; jj < e->nodes.size(); ++jj) + { + Node *nodj = e->nodes[jj]; + T.push_back(Eigen::Triplet<double>(nodi->row, nodj->row, bnd->c * Se(ii, jj))); + } } - } }); + }); } // Build, clean and turn to compressed row format S2.setFromTriplets(T.begin(), T.end()); @@ -158,31 +161,34 @@ void TimeIntegration::buildKM_tbb_lambda(Eigen::SparseMatrix<double, Eigen::RowM for (auto mat : pbl->media) { std::cout << "\tprocessing " << *mat << '\n'; - tbb::parallel_for_each(mat->tag->elems.begin(), mat->tag->elems.end(), [&](Element *e) - { - if (e->type() != ElType::HEX8) - return; - //std::cout << "processing element #" << e->no << "\n"; + tbb::parallel_for_each( + mat->tag->elems.begin(), mat->tag->elems.end(), + [&](Element *e) + { + if (e->type() != ElType::HEX8) + return; + // std::cout << "processing element #" << e->no << "\n"; - // ** Me matrix => Md vector - Eigen::MatrixXd Me = WaveTerm::buildM(*e); + // ** Me matrix => Md vector + Eigen::MatrixXd Me = WaveTerm::buildM(*e); - // ** Ke matrix => K matrix - Eigen::MatrixXd Ke = WaveTerm::buildK(*e, u); + // ** Ke matrix => K matrix + Eigen::MatrixXd Ke = WaveTerm::buildK(*e, u); - // assembly - tbb::spin_mutex::scoped_lock lock(mutex); + // assembly + tbb::spin_mutex::scoped_lock lock(mutex); - for (size_t ii = 0; ii < e->nodes.size(); ++ii) - { - Node *nodi = e->nodes[ii]; - for (size_t jj = 0; jj < e->nodes.size(); ++jj) + for (size_t ii = 0; ii < e->nodes.size(); ++ii) { - Node *nodj = e->nodes[jj]; - T.push_back(Eigen::Triplet<double>(nodi->row, nodj->row, (mat->c * mat->c) * Ke(ii, jj))); - Md[nodi->row] += Me(ii, jj); + Node *nodi = e->nodes[ii]; + for (size_t jj = 0; jj < e->nodes.size(); ++jj) + { + Node *nodj = e->nodes[jj]; + T.push_back(Eigen::Triplet<double>(nodi->row, nodj->row, (mat->c * mat->c) * Ke(ii, jj))); + Md[nodi->row] += Me(ii, jj); + } } - } }); + }); } // Build, clean and turn to compressed row format K2.setFromTriplets(T.begin(), T.end()); @@ -194,7 +200,8 @@ void TimeIntegration::buildKM_tbb_lambda(Eigen::SparseMatrix<double, Eigen::RowM std::cout << "[cpu] " << chrono1 << '\n'; } -/*void TimeIntegration::build(MATTYPE type, Eigen::SparseMatrix<double, Eigen::RowMajor> &A2) +/* +void TimeIntegration::build(MATTYPE type, Eigen::SparseMatrix<double, Eigen::RowMajor> &A2) { tbb::spin_mutex mutex; tbb::global_control control(tbb::global_control::max_allowed_parallelism, nthreads); // TODO mettre ça ailleurs... @@ -207,24 +214,26 @@ void TimeIntegration::buildKM_tbb_lambda(Eigen::SparseMatrix<double, Eigen::RowM for (auto mat : pbl->media) { std::cout << "\tprocessing " << *mat << '\n'; - tbb::parallel_for_each(mat->tag->elems.begin(), mat->tag->elems.end(), - [&](Element *e) { - if (e->type() != ElType::HEX8) - return; - Eigen::MatrixXd Ae = e->build(type); - - // assembly - tbb::spin_mutex::scoped_lock lock(mutex); - for (size_t ii = 0; ii < e->nodes.size(); ++ii) - { - Node *nodi = e->nodes[ii]; - for (size_t jj = 0; jj < e->nodes.size(); ++jj) - { - Node *nodj = e->nodes[jj]; - T.push_back(Eigen::Triplet<double>(nodi->row, nodj->row, Ae(ii, jj))); - } - } - }); + tbb::parallel_for_each( + mat->tag->elems.begin(), mat->tag->elems.end(), + [&](Element *e) + { + if (e->type() != ElType::HEX8) + return; + Eigen::MatrixXd Ae = e->build(type); + + // assembly + tbb::spin_mutex::scoped_lock lock(mutex); + for (size_t ii = 0; ii < e->nodes.size(); ++ii) + { + Node *nodi = e->nodes[ii]; + for (size_t jj = 0; jj < e->nodes.size(); ++jj) + { + Node *nodj = e->nodes[jj]; + T.push_back(Eigen::Triplet<double>(nodi->row, nodj->row, Ae(ii, jj))); + } + } + }); } // Build, clean and turn to compressed row format A2.setFromTriplets(T.begin(), T.end()); @@ -234,7 +243,8 @@ void TimeIntegration::buildKM_tbb_lambda(Eigen::SparseMatrix<double, Eigen::RowM std::cout << "S (" << A2.rows() << "," << A2.cols() << ") nnz=" << A2.nonZeros() << "\n"; chrono1.read(); std::cout << "[cpu] " << chrono1 << '\n'; -}*/ +} +*/ void TimeIntegration::write(std::ostream &out) const {