serif::utils::parallel serif::utils::parallel::detail int int serif::utils::parallel::worker_count () noexcept worker_count serif::utils::parallel::worker_count Workers an element loop may use: OpenMP's thread limit (OMP_NUM_THREADS), or 1 without OpenMP or inside an enclosing parallel region. typename BodyT void void serif::utils::parallel::for_each_index (const int count, BodyT &&body) for_each_index serif::utils::parallel::for_each_index const int count BodyT && body Call body(index, worker) once for every index in [0, count), possibly concurrently. Results do not depend on the thread count when each call writes only index-owned results and scratch owned by its worker (0 <= worker < worker_count()). Every index runs; the exception of the lowest throwing index is then rethrown, which is the one a serial loop would have raised. void void serif::utils::parallel::element_transformation (const ::mfem::Mesh &mesh, int element, ::mfem::IsoparametricTransformation &transformation) element_transformation serif::utils::parallel::element_transformation const ::mfem::Mesh & mesh int element ::mfem::IsoparametricTransformation & transformation Mesh::GetElementTransformation(element, transformation), safe in concurrent element loops. MFEM's version gathers curved-mesh nodes through FiniteElementSpace::GetElementVDofs(int, Array&), which writes the space's shared mutable DofTransformation. This copy performs the same steps with a local DofTransformation, so the transformation and every value derived from it are identical.