KratosMultiphysics
KRATOS Multiphysics (Kratos) is a framework for building parallel, multi-disciplinary simulation software, aiming at modularity, extensibility, and high performance. Kratos is written in C++, and counts with an extensive Python interface.
mechanical_explicit_strategy.hpp
Go to the documentation of this file.
1 // KRATOS ___| | | |
2 // \___ \ __| __| | | __| __| | | __| _` | |
3 // | | | | | ( | | | | ( | |
4 // _____/ \__|_| \__,_|\___|\__|\__,_|_| \__,_|_| MECHANICS
5 //
6 // License: BSD License
7 // license: StructuralMechanicsApplication/license.txt
8 //
9 // Main authors: Klaus B Sautter (based on the work of JMCarbonel)
10 //
11 //
12 
13 #pragma once
14 
15 // System includes
16 
17 // External includes
18 
19 // Project includes
26 #include "includes/variables.h"
27 
28 namespace Kratos {
43 
49 template <class TSparseSpace,
50  class TDenseSpace, // = DenseSpace<double>,
51  class TLinearSolver //= LinearSolver<TSparseSpace,TDenseSpace>
52  >
54  : public ImplicitSolvingStrategy<TSparseSpace, TDenseSpace, TLinearSolver> {
55 public:
58 
59  // Base class definition
61 
73 
75  typedef typename Node::DofType DofType;
76  typedef typename DofType::Pointer DofPointerType;
77 
80 
84 
94  ModelPart& rModelPart,
95  typename TSchemeType::Pointer pScheme,
96  bool CalculateReactions = false,
97  bool ReformDofSetAtEachStep = false,
98  bool MoveMeshFlag = true)
99  : ImplicitSolvingStrategy<TSparseSpace, TDenseSpace, TLinearSolver>(rModelPart, MoveMeshFlag),
100  mpScheme(pScheme),
101  mReformDofSetAtEachStep(ReformDofSetAtEachStep),
102  mCalculateReactionsFlag(CalculateReactions)
103  {
104  KRATOS_TRY
105 
106  // Set EchoLevel to the default value (only time is displayed)
108 
109  // Set RebuildLevel to the default value
111 
112  KRATOS_CATCH("")
113  }
114 
118  {
119  Clear();
120  }
121 
125 
129 
134  void SetScheme(typename TSchemeType::Pointer pScheme)
135  {
136  mpScheme = pScheme;
137  };
138 
143  typename TSchemeType::Pointer GetScheme()
144  {
145  return mpScheme;
146  };
147 
148  // Set and Get Flags
149 
154  void SetInitializePerformedFlag(bool InitializePerformedFlag = true)
155  {
156  mInitializeWasPerformed = InitializePerformedFlag;
157  }
158 
164  {
166  }
167 
172  void SetCalculateReactionsFlag(bool CalculateReactionsFlag)
173  {
174  mCalculateReactionsFlag = CalculateReactionsFlag;
175  }
176 
182  {
184  }
185 
191  {
193  }
194 
200  {
202  }
203 //
207  void Initialize() override
208  {
209  KRATOS_TRY
210 
211  if (!this->mInitializeWasPerformed){
212  // Pointers needed in the solution
213  typename TSchemeType::Pointer pScheme = GetScheme();
214  ModelPart& r_model_part = BaseType::GetModelPart();
215 
216  TSystemMatrixType matrix_a_dummy = TSystemMatrixType();
217 
218  // Initialize The Scheme - OPERATIONS TO BE DONE ONCE
219  if (!pScheme->SchemeIsInitialized())pScheme->Initialize(r_model_part);
220 
221  // Initialize The Elements - OPERATIONS TO BE DONE ONCE
222  if (!pScheme->ElementsAreInitialized())pScheme->InitializeElements(r_model_part);
223 
224  // Initialize The Conditions- OPERATIONS TO BE DONE ONCE
225  if (!pScheme->ConditionsAreInitialized())pScheme->InitializeConditions(r_model_part);
226 
227  // Set Nodal Mass and Damping to zero
228  NodesArrayType& r_nodes = r_model_part.Nodes();
229  VariableUtils().SetNonHistoricalVariable(NODAL_MASS, 0.0, r_nodes);
230  VariableUtils().SetNonHistoricalVariable(NODAL_DISPLACEMENT_DAMPING, 0.0, r_nodes);
231 
232  // Iterate over the elements
233  ElementsArrayType& r_elements = r_model_part.Elements();
234  ProcessInfo& r_current_process_info = r_model_part.GetProcessInfo();
235 
236  Vector dummy_vector;
237  // If we consider the rotation DoF
238  const bool has_dof_for_rot_z = !r_nodes.empty() && r_nodes.begin()->HasDofFor(ROTATION_Z);
239  if (has_dof_for_rot_z) {
240  const array_1d<double, 3> zero_array = ZeroVector(3);
241  VariableUtils().SetNonHistoricalVariable(NODAL_INERTIA, zero_array, r_nodes);
242  VariableUtils().SetNonHistoricalVariable(NODAL_ROTATION_DAMPING, zero_array, r_nodes);
243 
244  block_for_each(r_elements, dummy_vector, [&r_current_process_info](Element& r_element, Vector& r_dummy_vector){
245  // Getting nodal mass and inertia from element
246  // this function needs to be implemented in the respective
247  // element to provide inertias and nodal masses
248  r_element.AddExplicitContribution(r_dummy_vector, RESIDUAL_VECTOR, NODAL_INERTIA, r_current_process_info);
249  });
250  } else { // Only NODAL_MASS is needed
251  block_for_each(r_elements, dummy_vector, [&r_current_process_info](Element& r_element, Vector& r_dummy_vector){
252  // Getting nodal mass and inertia from element
253  // this function needs to be implemented in the respective
254  // element to provide inertias and nodal masses
255  r_element.AddExplicitContribution(r_dummy_vector, RESIDUAL_VECTOR, NODAL_MASS, r_current_process_info);
256  });
257  }
258 
259  // Precompute for masses and inertias
260  if(r_model_part.MasterSlaveConstraints().size() > 0) {
262  }
263 
264  this->mInitializeWasPerformed = true;
265  }
266 
267  KRATOS_CATCH("")
268  }
269 
274  void InitializeSolutionStep() override {
275  KRATOS_TRY
276 
277  typename TSchemeType::Pointer pScheme = GetScheme();
278  ModelPart& r_model_part = BaseType::GetModelPart();
279 
280  TSystemMatrixType matrix_a_dummy = TSystemMatrixType();
283 
284  // Initial operations ... things that are constant over the Solution Step
285  pScheme->InitializeSolutionStep(r_model_part, matrix_a_dummy, rDx, rb);
286 
287  if (BaseType::mRebuildLevel > 0) { // TODO: Right now is computed in the Initialize() because is always zero, the option to set the RebuildLevel should be added in the constructor or in some place
288  ProcessInfo& r_current_process_info = r_model_part.GetProcessInfo();
289  ElementsArrayType& r_elements = r_model_part.Elements();
290 
291  // Set Nodal Mass and Damping to zero
292  NodesArrayType& r_nodes = r_model_part.Nodes();
293  VariableUtils().SetNonHistoricalVariable(NODAL_MASS, 0.0, r_nodes);
294  VariableUtils().SetNonHistoricalVariable(NODAL_DISPLACEMENT_DAMPING, 0.0, r_nodes);
295 
296  Vector dummy_vector;
297  // If we consider the rotation DoF
298  const bool has_dof_for_rot_z = r_model_part.Nodes().begin()->HasDofFor(ROTATION_Z);
299  if (has_dof_for_rot_z) {
300  const array_1d<double, 3> zero_array = ZeroVector(3);
301  VariableUtils().SetNonHistoricalVariable(NODAL_INERTIA, zero_array, r_nodes);
302  VariableUtils().SetNonHistoricalVariable(NODAL_ROTATION_DAMPING, zero_array, r_nodes);
303 
304  block_for_each(r_elements, dummy_vector, [&r_current_process_info](Element& r_element, Vector& r_dummy_vector){
305  // Getting nodal mass and inertia from element
306  // this function needs to be implemented in the respective
307  // element to provide inertias and nodal masses
308  r_element.AddExplicitContribution(r_dummy_vector, RESIDUAL_VECTOR, NODAL_INERTIA, r_current_process_info);
309  });
310  } else { // Only NODAL_MASS and NODAL_DISPLACEMENT_DAMPING are needed
311  block_for_each(r_elements, dummy_vector, [&r_current_process_info](Element& r_element, Vector& r_dummy_vector){
312  // Getting nodal mass and inertia from element
313  // this function needs to be implemented in the respective
314  // element to provide inertias and nodal masses
315  r_element.AddExplicitContribution(r_dummy_vector, RESIDUAL_VECTOR, NODAL_MASS, r_current_process_info);
316  });
317  }
318 
319  // Precompute for masses and inertias
320  if(r_model_part.MasterSlaveConstraints().size() > 0) {
322  }
323  }
324 
325  KRATOS_CATCH("")
326  }
327 
331  bool SolveSolutionStep() override
332  {
333  typename TSchemeType::Pointer pScheme = GetScheme();
334  ModelPart& r_model_part = BaseType::GetModelPart();
335 
336  // Some dummy sets and matrices
337  DofsArrayType dof_set_dummy;
341 
342  // Initialize the non linear iteration
343  pScheme->InitializeNonLinIteration(BaseType::GetModelPart(), rA, rDx, rb);
344 
345  pScheme->Predict(r_model_part, dof_set_dummy, rA, rDx, rb);
346 
347  // Pre-compute MPC contributions
348  if(r_model_part.MasterSlaveConstraints().size() > 0) {
349  std::vector<std::string> dof_variable_names(2);
350  dof_variable_names[0] = "DISPLACEMENT";
351  dof_variable_names[1] = "ROTATION";
352  std::vector<std::string> residual_variable_names(2);
353  residual_variable_names[0] = "FORCE_RESIDUAL";
354  residual_variable_names[1] = "MOMENT_RESIDUAL";
355  ConstraintUtilities::PreComputeExplicitConstraintConstribution(r_model_part, dof_variable_names, residual_variable_names);
356  }
357 
358  // Explicitly integrates the equation of motion.
359  pScheme->Update(r_model_part, dof_set_dummy, rA, rDx, rb);
360 
361  // Finalize the non linear iteration
362  pScheme->FinalizeNonLinIteration(BaseType::GetModelPart(), rA, rDx, rb);
363 
364  // We compute the MPC contributions
365  if(r_model_part.MasterSlaveConstraints().size() > 0) {
366  ComputeExplicitConstraintConstribution(pScheme, r_model_part);
367  }
368 
369  // Calculate reactions if required
371  CalculateReactions(pScheme, r_model_part, rA, rDx, rb);
372  }
373 
374  return true;
375  }
376 
381  void FinalizeSolutionStep() override
382  {
383  typename TSchemeType::Pointer pScheme = GetScheme();
384  ModelPart& r_model_part = BaseType::GetModelPart();
388  // Finalisation of the solution step,
389  // operations to be done after achieving convergence, for example the
390  // Final Residual Vector (rb) has to be saved in there
391  // to avoid error accumulation
392  pScheme->FinalizeSolutionStep(r_model_part, rA, rDx, rb);
393 
394  // Move the mesh if needed
397 
398  // Cleaning memory after the solution
399  pScheme->Clean();
400  }
401 
405  void Clear() override
406  {
407  KRATOS_TRY
408 
409  KRATOS_INFO("MechanicalExplicitStrategy") << "Clear function used" << std::endl;
410 
411  GetScheme()->Clear();
412  mInitializeWasPerformed = false;
413 
414  KRATOS_CATCH("")
415  }
416 
425  int Check() override
426  {
427  KRATOS_TRY
428 
429  BaseType::Check();
430 
431  GetScheme()->Check(BaseType::GetModelPart());
432 
433  return 0;
434 
435  KRATOS_CATCH("")
436  }
437 
441 
445 
449 
453 private:
459 
463 
467 
473  void ComputeExplicitConstraintConstribution(
474  typename TSchemeType::Pointer pScheme,
475  ModelPart& rModelPart
476  )
477  {
478  // First we reset the slave dofs
480 
481  // Now we apply the constraints
483  }
484 
493  void CalculateReactions(
494  typename TSchemeType::Pointer pScheme,
495  ModelPart& rModelPart,
496  TSystemMatrixType& rA,
497  TSystemVectorType& rDx,
499  )
500  {
501  // We iterate over the nodes
502  auto& r_nodes = rModelPart.Nodes();
503 
504  if (!r_nodes.empty()) {
505  // If we consider rotation dofs
506  const bool has_dof_for_rot_z = (r_nodes.begin())->HasDofFor(ROTATION_Z);
507 
508  // Auxiliary values
509  const array_1d<double,3> zero_array = ZeroVector(3);
510 
511  // Getting
512  const auto it_node_begin = r_nodes.begin();
513  const IndexType disppos = it_node_begin->GetDofPosition(DISPLACEMENT_X);
514  const IndexType rotppos = it_node_begin->GetDofPosition(ROTATION_X);
515 
516  // Construct loop lambda depending on whether nodes have rot_z
517  std::function<void(Node&)> loop_base, loop;
518 
519  loop_base = [&disppos](Node& rNode){
520  const auto force_residual = rNode.FastGetSolutionStepValue(FORCE_RESIDUAL);
521 
522  if (rNode.GetDof(DISPLACEMENT_X, disppos).IsFixed()) {
523  double& r_reaction = rNode.FastGetSolutionStepValue(REACTION_X);
524  r_reaction = force_residual[0];
525  }
526  if (rNode.GetDof(DISPLACEMENT_Y, disppos + 1).IsFixed()) {
527  double& r_reaction = rNode.FastGetSolutionStepValue(REACTION_Y);
528  r_reaction = force_residual[1];
529  }
530  if (rNode.GetDof(DISPLACEMENT_Z, disppos + 2).IsFixed()) {
531  double& r_reaction = rNode.FastGetSolutionStepValue(REACTION_Z);
532  r_reaction = force_residual[2];
533  }
534  };
535 
536  if (has_dof_for_rot_z) {
537  loop = [&rotppos, &loop_base](Node& rNode){
538  loop_base(rNode);
539  const auto moment_residual = rNode.FastGetSolutionStepValue(MOMENT_RESIDUAL);
540  if (rNode.GetDof(ROTATION_X, rotppos).IsFixed()) {
541  double& r_reaction = rNode.FastGetSolutionStepValue(REACTION_MOMENT_X);
542  r_reaction = moment_residual[0];
543  }
544  if (rNode.GetDof(ROTATION_Y, rotppos + 1).IsFixed()) {
545  double& r_reaction = rNode.FastGetSolutionStepValue(REACTION_MOMENT_Y);
546  r_reaction = moment_residual[1];
547  }
548  if (rNode.GetDof(ROTATION_Z, rotppos + 2).IsFixed()) {
549  double& r_reaction = rNode.FastGetSolutionStepValue(REACTION_MOMENT_Z);
550  r_reaction = moment_residual[2];
551  }
552  };
553  } else {
554  loop = loop_base;
555  }
556 
557  // Compute on nodes
558  block_for_each(r_nodes, loop);
559  } // if not nodes.empty()
560  }
561 
566 
570 
573 
578 
579 protected:
582 
586 
587  typename TSchemeType::Pointer mpScheme;
588 
597 
603 
609 
613 
617 
621 
625 
629 
633 
635 
636 }; /* Class MechanicalExplicitStrategy */
637 
639 
640 } /* namespace Kratos.*/
Dof represents a degree of freedom (DoF).
Definition: dof.h:86
Base class for all Elements.
Definition: element.h:60
virtual void AddExplicitContribution(const ProcessInfo &rCurrentProcessInfo)
Definition: element.h:622
Implicit solving strategy base class This is the base class from which we will derive all the implici...
Definition: implicit_solving_strategy.h:61
BaseType::TSystemVectorType TSystemVectorType
Definition: implicit_solving_strategy.h:72
Scheme< TSparseSpace, TDenseSpace > TSchemeType
Definition: implicit_solving_strategy.h:82
void SetRebuildLevel(int Level) override
This sets the build level.
Definition: implicit_solving_strategy.h:207
BaseType::NodesArrayType NodesArrayType
Definition: implicit_solving_strategy.h:92
int mRebuildLevel
Definition: implicit_solving_strategy.h:263
BaseType::TSystemMatrixType TSystemMatrixType
Definition: implicit_solving_strategy.h:70
BaseType::ElementsArrayType ElementsArrayType
Definition: implicit_solving_strategy.h:94
iterator begin()
Definition: amatrix_interface.h:241
This strategy is used for the explicit time integration.
Definition: mechanical_explicit_strategy.hpp:54
TSchemeType::Pointer mpScheme
Definition: mechanical_explicit_strategy.hpp:587
BaseType::ConditionsArrayType ConditionsArrayType
Definition: mechanical_explicit_strategy.hpp:71
void SetCalculateReactionsFlag(bool CalculateReactionsFlag)
This method sets the flag mCalculateReactionsFlag.
Definition: mechanical_explicit_strategy.hpp:172
TSchemeType::Pointer GetScheme()
Get method for the time scheme.
Definition: mechanical_explicit_strategy.hpp:143
DofType::Pointer DofPointerType
Definition: mechanical_explicit_strategy.hpp:76
bool SolveSolutionStep() override
Solves the current step. This function returns true if a solution has been found, false otherwise.
Definition: mechanical_explicit_strategy.hpp:331
void SetScheme(typename TSchemeType::Pointer pScheme)
Set method for the time scheme.
Definition: mechanical_explicit_strategy.hpp:134
KRATOS_CLASS_POINTER_DEFINITION(MechanicalExplicitStrategy)
Counted pointer of MechanicalExplicitStrategy.
void SetInitializePerformedFlag(bool InitializePerformedFlag=true)
This method sets the flag mInitializeWasPerformed.
Definition: mechanical_explicit_strategy.hpp:154
BaseType::ElementsArrayType ElementsArrayType
Definition: mechanical_explicit_strategy.hpp:70
BaseType::DofsArrayType DofsArrayType
Definition: mechanical_explicit_strategy.hpp:64
bool GetCalculateReactionsFlag()
This method returns the flag mCalculateReactionsFlag.
Definition: mechanical_explicit_strategy.hpp:181
BaseType::TSystemVectorPointerType TSystemVectorPointerType
Definition: mechanical_explicit_strategy.hpp:68
bool GetInitializePerformedFlag()
This method gets the flag mInitializeWasPerformed.
Definition: mechanical_explicit_strategy.hpp:163
void FinalizeSolutionStep() override
Performs all the required operations that should be done (for each step) after solving the solution s...
Definition: mechanical_explicit_strategy.hpp:381
BaseType::TSystemMatrixPointerType TSystemMatrixPointerType
Definition: mechanical_explicit_strategy.hpp:67
MechanicalExplicitStrategy(ModelPart &rModelPart, typename TSchemeType::Pointer pScheme, bool CalculateReactions=false, bool ReformDofSetAtEachStep=false, bool MoveMeshFlag=true)
Default constructor.
Definition: mechanical_explicit_strategy.hpp:93
void SetReformDofSetAtEachStepFlag(bool Flag)
This method sets the flag mReformDofSetAtEachStep.
Definition: mechanical_explicit_strategy.hpp:190
bool mInitializeWasPerformed
Flag telling if the initialize was performed.
Definition: mechanical_explicit_strategy.hpp:608
void Clear() override
Clears the internal storage.
Definition: mechanical_explicit_strategy.hpp:405
bool mCalculateReactionsFlag
Flag telling if it is needed or not to compute the reactions.
Definition: mechanical_explicit_strategy.hpp:602
MechanicalExplicitStrategy(const MechanicalExplicitStrategy &Other)
Definition: mechanical_explicit_strategy.hpp:632
void Initialize() override
Initialization of member variables and prior operations.
Definition: mechanical_explicit_strategy.hpp:207
ImplicitSolvingStrategy< TSparseSpace, TDenseSpace, TLinearSolver > BaseType
Definition: mechanical_explicit_strategy.hpp:60
bool GetReformDofSetAtEachStepFlag()
This method returns the flag mReformDofSetAtEachStep.
Definition: mechanical_explicit_strategy.hpp:199
BaseType::LocalSystemVectorType LocalSystemVectorType
Definition: mechanical_explicit_strategy.hpp:72
BaseType::NodesArrayType NodesArrayType
Definition: mechanical_explicit_strategy.hpp:69
Node::DofType DofType
DoF types definition.
Definition: mechanical_explicit_strategy.hpp:75
bool mReformDofSetAtEachStep
The pointer to the integration scheme.
Definition: mechanical_explicit_strategy.hpp:596
int Check() override
This function is designed to be called once to perform all the checks needed on the input provided.
Definition: mechanical_explicit_strategy.hpp:425
BaseType::TSchemeType TSchemeType
Some definitions from the base class.
Definition: mechanical_explicit_strategy.hpp:63
virtual ~MechanicalExplicitStrategy()
Definition: mechanical_explicit_strategy.hpp:117
void InitializeSolutionStep() override
Performs all the required operations that should be done (for each step) before solving the solution ...
Definition: mechanical_explicit_strategy.hpp:274
BaseType::TSystemVectorType TSystemVectorType
Definition: mechanical_explicit_strategy.hpp:66
BaseType::TSystemMatrixType TSystemMatrixType
Definition: mechanical_explicit_strategy.hpp:65
This class aims to manage meshes for multi-physics simulations.
Definition: model_part.h:77
MasterSlaveConstraintContainerType & MasterSlaveConstraints(IndexType ThisIndex=0)
Definition: model_part.h:654
ProcessInfo & GetProcessInfo()
Definition: model_part.h:1746
ElementsContainerType & Elements(IndexType ThisIndex=0)
Definition: model_part.h:1189
NodesContainerType & Nodes(IndexType ThisIndex=0)
Definition: model_part.h:507
A sorted associative container similar to an STL set, but uses a vector to store pointers to its data...
Definition: pointer_vector_set.h:72
ProcessInfo holds the current value of different solution parameters.
Definition: process_info.h:59
TSparseSpace::VectorPointerType TSystemVectorPointerType
Definition: solving_strategy.h:77
ModelPart::NodesContainerType NodesArrayType
Definition: solving_strategy.h:89
virtual void SetEchoLevel(const int Level)
This sets the level of echo for the solving strategy.
Definition: solving_strategy.h:255
ModelPart & GetModelPart()
Operations to get the pointer to the model.
Definition: solving_strategy.h:350
ModelPart::ElementsContainerType ElementsArrayType
Definition: solving_strategy.h:91
TSparseSpace::MatrixType TSystemMatrixType
Definition: solving_strategy.h:71
virtual int Check()
Function to perform expensive checks.
Definition: solving_strategy.h:377
TSparseSpace::MatrixPointerType TSystemMatrixPointerType
Definition: solving_strategy.h:75
ModelPart::ConditionsContainerType ConditionsArrayType
Definition: solving_strategy.h:93
bool MoveMeshFlag()
This function returns the flag that says if the mesh is moved.
Definition: solving_strategy.h:290
TSparseSpace::VectorType TSystemVectorType
Definition: solving_strategy.h:73
virtual void MoveMesh()
This function is designed to move the mesh.
Definition: solving_strategy.h:330
TDenseSpace::VectorType LocalSystemVectorType
Definition: solving_strategy.h:81
This class implements a set of auxiliar, already parallelized, methods to perform some common tasks r...
Definition: variable_utils.h:63
void SetNonHistoricalVariable(const TVarType &rVariable, const TType &Value, TContainerType &rContainer)
Sets the container value of any type of non historical variable.
Definition: variable_utils.h:790
#define KRATOS_CATCH(MoreInfo)
Definition: define.h:110
#define KRATOS_TRY
Definition: define.h:109
std::size_t IndexType
The definition of the index type.
Definition: key_hash.h:35
#define KRATOS_INFO(label)
Definition: logger.h:250
void PreComputeExplicitConstraintMassAndInertia(ModelPart &rModelPart, const std::string &DofDisplacementVariableName, const std::string &MassVariableName, const std::string &DofRotationVariableName, const std::string &InertiaVariableName)
This method precomputes the contribution of the explicit MPC over nodal masses and inertias.
Definition: constraint_utilities.cpp:296
void ApplyConstraints(ModelPart &rModelPart)
This method resets the values of the slave dofs.
Definition: constraint_utilities.cpp:159
void PreComputeExplicitConstraintConstribution(ModelPart &rModelPart, const std::vector< std::string > &rDofVariableNames, const std::vector< std::string > &rResidualDofVariableNames)
This method precomputes the contribution of the explicit MPC over nodal residual forces.
Definition: constraint_utilities.cpp:182
void ResetSlaveDofs(ModelPart &rModelPart)
This method resets the values of the slave dofs.
Definition: constraint_utilities.cpp:136
REF: G. R. Cowper, GAUSSIAN QUADRATURE FORMULAS FOR TRIANGLES.
Definition: mesh_condition.cpp:21
KratosZeroVector< double > ZeroVector
Definition: amatrix_interface.h:561
void block_for_each(TIterator itBegin, TIterator itEnd, TFunction &&rFunction)
Execute a functor on all items of a range in parallel.
Definition: parallel_utilities.h:299