From 615d339f1cef7ea3f6d7cc9e62b5735afba432ea Mon Sep 17 00:00:00 2001 From: acrovato <a.crovato@uliege.be> Date: Fri, 9 Jul 2021 12:08:24 +0200 Subject: [PATCH] format --- heat/src/wSolver.cpp | 297 ++++++++++++++++----------------- mirrors/src/wSolver.cpp | 51 +++--- tbox/src/wMshDeform.cpp | 4 +- waves/src/wTimeIntegration.cpp | 94 +++++------ 4 files changed, 216 insertions(+), 230 deletions(-) diff --git a/heat/src/wSolver.cpp b/heat/src/wSolver.cpp index a1890470..22a68553 100644 --- a/heat/src/wSolver.cpp +++ b/heat/src/wSolver.cpp @@ -256,48 +256,47 @@ 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"; - - // (flux moyen . volume) sur l'element - Eigen::VectorXd qV = HeatTerm::computeFlux(*e, T1, *mat->k); - - 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'; - } - - tbb::spin_mutex::scoped_lock lock(mutex); - Vtot += V; - qM += qV; // qM = qM + qV - }); + 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); + + 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'; + } + + tbb::spin_mutex::scoped_lock lock(mutex); + Vtot += V; + qM += qV; // qM = qM + qV + }); } qM /= Vtot; @@ -372,26 +371,25 @@ 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"; - - 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) - { - Node *nodj = e->nodes[jj]; - T.push_back(Eigen::Triplet<double>(rows[nodi->row], nodj->row, Ke(ii, jj))); - } - } - }); + 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); + + // 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>(rows[nodi->row], nodj->row, Ke(ii, jj))); + } + } + }); } } else @@ -432,24 +430,23 @@ void Solver::buildK(Eigen::SparseMatrix<double, Eigen::RowMajor> &K2, Eigen::Map if (verbose > 1) std::cout << "\tprocessing " << *mat << '\n'; - std::for_each(mat->tag->elems.begin(), mat->tag->elems.end(), // devrait pouvoir etre fait en TBB... - [&](Element *e) { - if (e->type() != ELTYPE::TRI3) - return; - 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) - { - Node *nodj = e->nodes[jj]; - T.push_back(Eigen::Triplet<double>(rows[nodi->row], nodj->row, Ke(ii, jj))); - } - } - }); + std::for_each(mat->tag->elems.begin(), mat->tag->elems.end(), [&](Element *e) { // devrait pouvoir etre fait en TBB... + if (e->type() != ELTYPE::TRI3) + return; + 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) + { + Node *nodj = e->nodes[jj]; + T.push_back(Eigen::Triplet<double>(rows[nodi->row], nodj->row, Ke(ii, jj))); + } + } + }); } if (verbose > 1) std::cout << "assembly done.\n"; @@ -524,26 +521,25 @@ 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"; - - // ** 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); - - Vtot += Ce(jj); - rhocM_Vtot += (mat->rhoc) * Ce(jj); - } - }); + 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)); + + // 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); + } + }); } rhs(n1->row) = rhocM_Vtot * TM; if (verbose > 1) @@ -596,22 +592,21 @@ 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"; - - 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); - } - }); + 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); + + // 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()) @@ -646,24 +641,23 @@ 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"; - - // ** se vector => s vector - Eigen::VectorXd se = HeatTerm::build(*e, T1, *src->f); - - // 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); - } - }); + 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); + + // 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); + } + }); } if (verbose > 1) @@ -686,24 +680,23 @@ 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"; - - // ** qe vector => q vector - Eigen::VectorXd qe = HeatTerm::build(*e, T1, *bnd->f); - - // 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); - } - }); + 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); + + // 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); + } + }); } if (verbose > 1) diff --git a/mirrors/src/wSolver.cpp b/mirrors/src/wSolver.cpp index 55f06b66..24ee49ed 100644 --- a/mirrors/src/wSolver.cpp +++ b/mirrors/src/wSolver.cpp @@ -163,33 +163,30 @@ void Solver::start(MshExport *mshWriter) // K matrix //=============================tbb================================== - tbb::parallel_for_each(current_tag.elems.begin(), current_tag.elems.end(), [&](Element *e) - //tbb::parallel_for_each(size_t(0), size_t(current_tag.elems.size()), [&](size_t index) - //tbb::parallel_for_each(current_tag.elems.begin(), current_tag.elems.end(),[&](Element *e) - { - // Element *e = current_tag.elems[index]; - - if (e->type() != ELTYPE::HEX8 && e->type() != ELTYPE::TETRA4) - return; //if the element is not a tetrahedron or a hexahedron, it is not treated - - Eigen::MatrixXd K_e = ThermoMecaTerm::buildK(*e, H); - - 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]; - //=====================================// - tbb::spin_mutex::scoped_lock lock(mutex); - //=====================================// - for (auto iii = 0; iii < 3; ++iii) - for (auto jjj = 0; jjj < 3; ++jjj) - if (K_e(3 * ii + iii, 3 * jj + jjj) != 0) - Trip.push_back(Eigen::Triplet<double>(3 * (nodi->row) + iii, 3 * (nodj->row) + jjj, K_e(3 * ii + iii, 3 * jj + jjj))); - } - } - }); + tbb::parallel_for_each(current_tag.elems.begin(), current_tag.elems.end(), [&](Element *e) { + // Element *e = current_tag.elems[index]; + + if (e->type() != ELTYPE::HEX8 && e->type() != ELTYPE::TETRA4) + return; //if the element is not a tetrahedron or a hexahedron, it is not treated + + Eigen::MatrixXd K_e = ThermoMecaTerm::buildK(*e, H); + + 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]; + //=====================================// + tbb::spin_mutex::scoped_lock lock(mutex); + //=====================================// + for (auto iii = 0; iii < 3; ++iii) + for (auto jjj = 0; jjj < 3; ++jjj) + if (K_e(3 * ii + iii, 3 * jj + jjj) != 0) + Trip.push_back(Eigen::Triplet<double>(3 * (nodi->row) + iii, 3 * (nodj->row) + jjj, K_e(3 * ii + iii, 3 * jj + jjj))); + } + } + }); //=============================tbb================================== } diff --git a/tbox/src/wMshDeform.cpp b/tbox/src/wMshDeform.cpp index f10b2ccb..22463cc4 100644 --- a/tbox/src/wMshDeform.cpp +++ b/tbox/src/wMshDeform.cpp @@ -302,7 +302,7 @@ void MshDeform::build(Eigen::SparseMatrix<double, Eigen::RowMajor> &K) std::deque<Eigen::Triplet<double>> T; // Build stiffness matrix - tbb::parallel_for_each(fldElems.begin(), fldElems.end(), [&](Element* e) { + tbb::parallel_for_each(fldElems.begin(), fldElems.end(), [&](Element *e) { // Hooke tensor Eigen::MatrixXd H; if (nDim == 2) @@ -336,10 +336,8 @@ void MshDeform::build(Eigen::SparseMatrix<double, Eigen::RowMajor> &K) H(2, 1) = H(1, 2); H *= E / ((1 + nu) * (1 - 2 * nu)); } - // Elementary stiffness matrix Eigen::MatrixXd Ke = this->buildK(*e, H); - // Assembly tbb::spin_mutex::scoped_lock lock(mutex); for (size_t i = 0; i < e->nodes.size(); ++i) diff --git a/waves/src/wTimeIntegration.cpp b/waves/src/wTimeIntegration.cpp index f96c7a3b..d5847512 100644 --- a/waves/src/wTimeIntegration.cpp +++ b/waves/src/wTimeIntegration.cpp @@ -102,28 +102,27 @@ 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"; - - // ** Se matrix => S vector - Eigen::MatrixXd Se = WaveTerm::buildM(*e); - - // 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, bnd->c * Se(ii, jj))); - } - } - }); + 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); + + // 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, bnd->c * Se(ii, jj))); + } + } + }); } // Build, clean and turn to compressed row format S2.setFromTriplets(T.begin(), T.end()); @@ -159,32 +158,31 @@ 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"; - - // ** Me matrix => Md vector - Eigen::MatrixXd Me = WaveTerm::buildM(*e); - - // ** Ke matrix => K matrix - Eigen::MatrixXd Ke = WaveTerm::buildK(*e, u); - - // 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, (mat->c * mat->c) * Ke(ii, jj))); - Md[nodi->row] += Me(ii, jj); - } - } - }); + 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); + + // ** Ke matrix => K matrix + Eigen::MatrixXd Ke = WaveTerm::buildK(*e, u); + + // 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, (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()); -- GitLab