SlideShare a Scribd company logo
Numerical Simulation of Nonlinear
Mechanical Problems using Metafor
Romain BOMAN
Senior Assistant
University of Liège
Department of Aerospace and
Mechanical Engineering
CECI Meeting - 16th May 2014
Outline
2
1. Our in-house FE code : Metafor
2. Libraries and tools
3. Numerical examples
4. Future works
Outline
3
1. Our in-house FE code : Metafor
2. Libraries and tools
3. Numerical examples
4. Future works
Metafor
4
Implicit Finite Element code for the simulation of solids
submitted to large deformations
Metal Forming Applications
Biomechanics
Crash / Impact
•ALE formalism, remeshing,
•thermomechanical time integration schemes
•fracture modelling,
•crack propagation,
•contact algorithms
•Nonlinear constitutive laws,
•Mesh generation from medical images
•Enhanced finite elements
Fluid Structure
Interaction
•Fluid elements
•Monolothic scheme
Metafor
5
Version history
• 1992 : Version 1 (Fortran):
J.-P. Ponthot’s PhD thesis
• 1999 : As many versions as researchers
• 2000 : Rewritten as an Oofelie solver (C++)
• Today : Still one single version for 11 developers
How big is it?
• ~1500 C++ classes
• ~300k lines of code
• 52 libraries (.dll/.so)
• ~2200 FE models in the test suite
Operating Systems
Windows, Linux, MacOS
Users
• Researchers (PhD, FYP), students (FE course)
• Companies (ArcelorMittal, Techspace Aero, GDTech, …)
Outline
6
1. Our in-house FE code : Metafor
2. Libraries and tools
3. Numerical examples
4. Future works
Libraries and tools
7
Version management Makefiles/project
generator
3D display of meshes
Widgets, threads (GUI)
Interpreter &
user subroutines
Python interface
generator
Compiler, BLAS Parallelism (shared memory)
Threading
Building
Blocks
Parallel linear solver
PARDISO
Libraries and tools
8
Version management Makefiles/project
generator
3D display of meshes
Widgets, threads (GUI)
Interpreter &
user subroutines
Python interface
generator
Compiler, BLAS Parallelism (shared memory)
Threading
Building
Blocks
Parallel linear solver
PARDISO
Why TBB?
9
Shared Memory Parallel Programming with OpenMP
class Element; // a Finite Element
std::vector<Element*> els; // a set of Finite Elements
std::for_each(els.begin(), els.end(),
[&](Element *e)
{
e->getForces();
});
int nbelm = els.size();
#pragma omp parallel for
for(int i=0; i<nbelm; ++i)
{
Element *e = els[i];
e->getForces();
}
• C++ iterators are forbidden
• size_t cannot be used as a loop counter
• Calling a function in a for statement is not allowed
• Possibly bad load balancing
• Nested parallelism difficult to handle. Back to 1992!
Example of a loop over the set of Finite Elements…
ORIGINAL C++ LOOP OPENMP LOOP
Why TBB?
10
Intel Threading Building Blocks
• High Level Parallel programming library (SMP)
• Open Source!
• Highly portable (msvc, gcc, even old versions)
• Object oriented – similar to STL – tbb namespace )
• Task-oriented (instead of threads)
• Thread-safe C++ containers
• Efficient overloaded memory allocators (new, delete)
• Takes into account OpenMP libraries (Pardiso solver)
std::for_each(els.begin(), els.end(),
[&](Element *e)
{
e->getForces();
});
tbb::parallel_do(els.begin(), els.end(),
[&](Element *e)
{
e->getForces();
});
ORIGINAL C++ LOOP TBB LOOP
Same syntax as modern C++
Why TBB?
11
… and it is more efficient and reliable than OpenMP
Example: Matrix-vector product : a = B c (size = n)
• n=10000
 size(B)=763 Mb
• multiplication
performed 100x
Windows
Intel Core i7 960 3.2GHz (4 cores)
Hyper threading
Libraries and tools
12
Version management Makefiles/project
generator
3D display of meshes
Widgets, threads (GUI)
Interpreter &
user subroutines
Python interface
generator
Compiler, BLAS Parallelism (shared memory)
Threading
Building
Blocks
Parallel linear solver
PARDISO
Python interface
13
The main objects of Metafor are available through a python
interface for 2 main reasons
• Input files are written in python
• Less code: no complicated home-made parser required
• Full language: use of loops, conditional statements, objects in input
files
• Extensibility: calls to external libraries (Qt, wxWidgets, numpy, …)
• Glue language: calls to external codes (gmsh, SAMCEF, Abaqus,
matlab, etc.)
• Safety: errors are correctly handled (even C++ exceptions!)
• Extension of the code (“user subroutines”)
• A lot of C++ classes (boundary conditions, postprocessing commands,
geometrical entities, materials, meshers, etc.) can be derived by the
user in Python in the input file.
Python interface
14
Python scripts as input files
One Python class is automatically created by
SWIG for each C++ class
materials.i
%module materials
%{
%include "ElasticMat.h"
%}
#include "ElasticMat.h" materials.py
materials.pyd
from materials import *
mat = ElasticMat(E, nu)
model.setMaterial(mat)
model.run()
INPUT SCRIPT
(Compiled Python module)
(Shadow classes)
Adding one new material class requires
to add only two lines in the input file of
SWIG (material.i) to make it available
in Python!
Python interface
15
Python inheritance of C++ classes : “user subroutines”
SWIG can generate the (huge and complex) code required to derive
a C++ class in Python!
class ElasticMat
{
public:
virtual
T computeStress(T &strain);
};
C++ ELASTIC MATERIAL
from materials import *
class ElasticPlasticMat(ElasticMat):
def computeStress(self, strain):
# compute the stresses
# from the strains
# using python cmds here…
return stress
PYTHON ELASTICPLASTIC MATERIAL
This python code will be called
from the compiled C++ code!
Very useful for students (Final Year Projects)
A new material law is available
without any compiler!
Outline
16
1. Our in-house FE code : Metafor
2. Libraries and tools
3. Numerical examples
4. Future works
Fan Blade containment test
17
• Numerical simulation of an engine
validation test (FBO : Fan Blade Out)
• Implicit algorithm (Chung Hulbert)
• Fixed bearing & moving shaft
connected by springs
• Frictional contact interactions
between blades and casing
Buckling of a blade in LP compressor
18
• Thermo elasto visco plastic model
with damage / EAS finite elements
• We expect a lower buckling force
compared to a purely elastic model
 the total weight of the engine can
be safely decreased.
CPU time :
• 1 day 16 hours (1 core)
• 5h35’ (12 cores)
Roll forming simulation
19
Sheet Metal Forming : Simulation of a 15-stand forming mill
Outline
20
1. Our in-house FE code : Metafor
2. Libraries and tools
3. Numerical examples
4. Future works
Future?
21
Shared Memory Processing (TBB)
Go on with TBB parallelisation of loops…
• The contact algorithms are still sequential.
• Some materials are not thread safe.
Distributed Memory Processing (MPI?)
Nothing done until today…
• Domain decomposition should be implemented.
• How to manage contact efficiently?
22

More Related Content

PPTX
Effective development of a finite-element solver at the University
Romain Boman
 
PPTX
Mixed-language Python/C++ debugging with Python Tools for Visual Studio- Pave...
PyData
 
PDF
Overview of FreeBSD PMC Tools
ACMBangalore
 
PPTX
SWIG Hello World
e8xu
 
PPTX
The Onward Journey: Porting Twisted to Python 3
Craig Rodrigues
 
PPTX
Python 101 for the .NET Developer
Sarah Dutkiewicz
 
PDF
Python: the Project, the Language and the Style
Juan-Manuel Gimeno
 
PPTX
Why Python?
Adam Pah
 
Effective development of a finite-element solver at the University
Romain Boman
 
Mixed-language Python/C++ debugging with Python Tools for Visual Studio- Pave...
PyData
 
Overview of FreeBSD PMC Tools
ACMBangalore
 
SWIG Hello World
e8xu
 
The Onward Journey: Porting Twisted to Python 3
Craig Rodrigues
 
Python 101 for the .NET Developer
Sarah Dutkiewicz
 
Python: the Project, the Language and the Style
Juan-Manuel Gimeno
 
Why Python?
Adam Pah
 

What's hot (20)

PDF
Tensorflow 2.0 and Coral Edge TPU
Andrés Leonardo Martinez Ortiz
 
PPTX
Taming Snakemake
Jeremy Leipzig
 
PDF
型ヒントについて考えよう!
Yusuke Miyazaki
 
PDF
Test Driven Development of A Static Code Analyzer
Terry Yin
 
PDF
PYTHON CURRENT TREND APPLICATIONS- AN OVERVIEW
EditorIJAERD
 
PPT
Py Con 2009 Pumping Iron Into Python
Sarah Dutkiewicz
 
PPTX
How to be a bioinformatician
Christian Frech
 
PDF
Python lecture 01
Tanwir Zaman
 
PDF
Python 3.5: An agile, general-purpose development language.
Carlos Miguel Ferreira
 
PPTX
Introduction python
Jumbo Techno e_Learning
 
KEY
Programming with Python: Week 1
Ahmet Bulut
 
PDF
A peek into Python's Metaclass and Bytecode from a Smalltalk User
Koan-Sin Tan
 
PDF
Python quick guide1
Kanchilug
 
PDF
introduction of python in data science
bhavesh lande
 
PDF
A Sneak Peek of MLIR in TensorFlow
Koan-Sin Tan
 
PPTX
Python Introduction | JNTUA | R19 | UNIT 1
FabMinds
 
PDF
Python for All
Pragya Goyal
 
PDF
A Peek into TFRT
Koan-Sin Tan
 
PDF
Introduction to python
Mohammed Rafi
 
PDF
Why learn python in 2017?
Karolis Ramanauskas
 
Tensorflow 2.0 and Coral Edge TPU
Andrés Leonardo Martinez Ortiz
 
Taming Snakemake
Jeremy Leipzig
 
型ヒントについて考えよう!
Yusuke Miyazaki
 
Test Driven Development of A Static Code Analyzer
Terry Yin
 
PYTHON CURRENT TREND APPLICATIONS- AN OVERVIEW
EditorIJAERD
 
Py Con 2009 Pumping Iron Into Python
Sarah Dutkiewicz
 
How to be a bioinformatician
Christian Frech
 
Python lecture 01
Tanwir Zaman
 
Python 3.5: An agile, general-purpose development language.
Carlos Miguel Ferreira
 
Introduction python
Jumbo Techno e_Learning
 
Programming with Python: Week 1
Ahmet Bulut
 
A peek into Python's Metaclass and Bytecode from a Smalltalk User
Koan-Sin Tan
 
Python quick guide1
Kanchilug
 
introduction of python in data science
bhavesh lande
 
A Sneak Peek of MLIR in TensorFlow
Koan-Sin Tan
 
Python Introduction | JNTUA | R19 | UNIT 1
FabMinds
 
Python for All
Pragya Goyal
 
A Peek into TFRT
Koan-Sin Tan
 
Introduction to python
Mohammed Rafi
 
Why learn python in 2017?
Karolis Ramanauskas
 
Ad

Similar to Numerical Simulation of Nonlinear Mechanical Problems using Metafor (20)

PDF
NVIDIA HPC ソフトウエア斜め読み
NVIDIA Japan
 
PDF
Feel++ webinar 9 27 2012
Université de Strasbourg
 
PDF
Automatic Task-based Code Generation for High Performance DSEL
Joel Falcou
 
PPTX
Abstractions and Directives for Adapting Wavefront Algorithms to Future Archi...
inside-BigData.com
 
PDF
Data Analytics and Simulation in Parallel with MATLAB*
Intel® Software
 
PDF
On the necessity and inapplicability of python
Yung-Yu Chen
 
PDF
On the Necessity and Inapplicability of Python
Takeshi Akutsu
 
PDF
Software Abstractions for Parallel Hardware
Joel Falcou
 
PDF
Optimizing NN inference performance on Arm NEON and Vulkan
ax inc.
 
PPTX
Leverage the Speed of OpenCL™ with AMD Math Libraries
AMD Developer Central
 
PPT
CS4961-L9.ppt
MarlonMagtibay2
 
PDF
Comparing On-The-Fly Accelerating Packages: Numba, TensorFlow, Dask, etc
Yukio Okuda
 
PDF
Yacf
Juan Fumero
 
PDF
HDR Defence - Software Abstractions for Parallel Architectures
Joel Falcou
 
PDF
Options and trade offs for parallelism and concurrency in Modern C++
Satalia
 
PDF
A High Dimensional Array Assignment Method For Parallel Computing Systems
Sabrina Green
 
PDF
The Actor Model applied to the Raspberry Pi and the Embedded Domain
Omer Kilic
 
PDF
Ehsan parallel accelerator-dec2015
Christian Peel
 
PDF
OpenSees: Future Directions
openseesdays
 
PDF
Designing Architecture-aware Library using Boost.Proto
Joel Falcou
 
NVIDIA HPC ソフトウエア斜め読み
NVIDIA Japan
 
Feel++ webinar 9 27 2012
Université de Strasbourg
 
Automatic Task-based Code Generation for High Performance DSEL
Joel Falcou
 
Abstractions and Directives for Adapting Wavefront Algorithms to Future Archi...
inside-BigData.com
 
Data Analytics and Simulation in Parallel with MATLAB*
Intel® Software
 
On the necessity and inapplicability of python
Yung-Yu Chen
 
On the Necessity and Inapplicability of Python
Takeshi Akutsu
 
Software Abstractions for Parallel Hardware
Joel Falcou
 
Optimizing NN inference performance on Arm NEON and Vulkan
ax inc.
 
Leverage the Speed of OpenCL™ with AMD Math Libraries
AMD Developer Central
 
CS4961-L9.ppt
MarlonMagtibay2
 
Comparing On-The-Fly Accelerating Packages: Numba, TensorFlow, Dask, etc
Yukio Okuda
 
HDR Defence - Software Abstractions for Parallel Architectures
Joel Falcou
 
Options and trade offs for parallelism and concurrency in Modern C++
Satalia
 
A High Dimensional Array Assignment Method For Parallel Computing Systems
Sabrina Green
 
The Actor Model applied to the Raspberry Pi and the Embedded Domain
Omer Kilic
 
Ehsan parallel accelerator-dec2015
Christian Peel
 
OpenSees: Future Directions
openseesdays
 
Designing Architecture-aware Library using Boost.Proto
Joel Falcou
 
Ad

Recently uploaded (20)

PPTX
Chapter_Seven_Construction_Reliability_Elective_III_Msc CM
SubashKumarBhattarai
 
PDF
20ME702-Mechatronics-UNIT-1,UNIT-2,UNIT-3,UNIT-4,UNIT-5, 2025-2026
Mohanumar S
 
PDF
2010_Book_EnvironmentalBioengineering (1).pdf
EmilianoRodriguezTll
 
PDF
July 2025: Top 10 Read Articles Advanced Information Technology
ijait
 
PDF
flutter Launcher Icons, Splash Screens & Fonts
Ahmed Mohamed
 
PPTX
Tunnel Ventilation System in Kanpur Metro
220105053
 
PPTX
FUNDAMENTALS OF ELECTRIC VEHICLES UNIT-1
MikkiliSuresh
 
PPTX
Victory Precisions_Supplier Profile.pptx
victoryprecisions199
 
PDF
Biodegradable Plastics: Innovations and Market Potential (www.kiu.ac.ug)
publication11
 
PDF
Introduction to Ship Engine Room Systems.pdf
Mahmoud Moghtaderi
 
PPTX
Information Retrieval and Extraction - Module 7
premSankar19
 
PDF
Chad Ayach - A Versatile Aerospace Professional
Chad Ayach
 
PPTX
Module2 Data Base Design- ER and NF.pptx
gomathisankariv2
 
PPTX
22PCOAM21 Session 2 Understanding Data Source.pptx
Guru Nanak Technical Institutions
 
PPTX
IoT_Smart_Agriculture_Presentations.pptx
poojakumari696707
 
PDF
The Effect of Artifact Removal from EEG Signals on the Detection of Epileptic...
Partho Prosad
 
PDF
67243-Cooling and Heating & Calculation.pdf
DHAKA POLYTECHNIC
 
PDF
settlement FOR FOUNDATION ENGINEERS.pdf
Endalkazene
 
PPT
SCOPE_~1- technology of green house and poyhouse
bala464780
 
PDF
Zero carbon Building Design Guidelines V4
BassemOsman1
 
Chapter_Seven_Construction_Reliability_Elective_III_Msc CM
SubashKumarBhattarai
 
20ME702-Mechatronics-UNIT-1,UNIT-2,UNIT-3,UNIT-4,UNIT-5, 2025-2026
Mohanumar S
 
2010_Book_EnvironmentalBioengineering (1).pdf
EmilianoRodriguezTll
 
July 2025: Top 10 Read Articles Advanced Information Technology
ijait
 
flutter Launcher Icons, Splash Screens & Fonts
Ahmed Mohamed
 
Tunnel Ventilation System in Kanpur Metro
220105053
 
FUNDAMENTALS OF ELECTRIC VEHICLES UNIT-1
MikkiliSuresh
 
Victory Precisions_Supplier Profile.pptx
victoryprecisions199
 
Biodegradable Plastics: Innovations and Market Potential (www.kiu.ac.ug)
publication11
 
Introduction to Ship Engine Room Systems.pdf
Mahmoud Moghtaderi
 
Information Retrieval and Extraction - Module 7
premSankar19
 
Chad Ayach - A Versatile Aerospace Professional
Chad Ayach
 
Module2 Data Base Design- ER and NF.pptx
gomathisankariv2
 
22PCOAM21 Session 2 Understanding Data Source.pptx
Guru Nanak Technical Institutions
 
IoT_Smart_Agriculture_Presentations.pptx
poojakumari696707
 
The Effect of Artifact Removal from EEG Signals on the Detection of Epileptic...
Partho Prosad
 
67243-Cooling and Heating & Calculation.pdf
DHAKA POLYTECHNIC
 
settlement FOR FOUNDATION ENGINEERS.pdf
Endalkazene
 
SCOPE_~1- technology of green house and poyhouse
bala464780
 
Zero carbon Building Design Guidelines V4
BassemOsman1
 

Numerical Simulation of Nonlinear Mechanical Problems using Metafor

  • 1. Numerical Simulation of Nonlinear Mechanical Problems using Metafor Romain BOMAN Senior Assistant University of Liège Department of Aerospace and Mechanical Engineering CECI Meeting - 16th May 2014
  • 2. Outline 2 1. Our in-house FE code : Metafor 2. Libraries and tools 3. Numerical examples 4. Future works
  • 3. Outline 3 1. Our in-house FE code : Metafor 2. Libraries and tools 3. Numerical examples 4. Future works
  • 4. Metafor 4 Implicit Finite Element code for the simulation of solids submitted to large deformations Metal Forming Applications Biomechanics Crash / Impact •ALE formalism, remeshing, •thermomechanical time integration schemes •fracture modelling, •crack propagation, •contact algorithms •Nonlinear constitutive laws, •Mesh generation from medical images •Enhanced finite elements Fluid Structure Interaction •Fluid elements •Monolothic scheme
  • 5. Metafor 5 Version history • 1992 : Version 1 (Fortran): J.-P. Ponthot’s PhD thesis • 1999 : As many versions as researchers • 2000 : Rewritten as an Oofelie solver (C++) • Today : Still one single version for 11 developers How big is it? • ~1500 C++ classes • ~300k lines of code • 52 libraries (.dll/.so) • ~2200 FE models in the test suite Operating Systems Windows, Linux, MacOS Users • Researchers (PhD, FYP), students (FE course) • Companies (ArcelorMittal, Techspace Aero, GDTech, …)
  • 6. Outline 6 1. Our in-house FE code : Metafor 2. Libraries and tools 3. Numerical examples 4. Future works
  • 7. Libraries and tools 7 Version management Makefiles/project generator 3D display of meshes Widgets, threads (GUI) Interpreter & user subroutines Python interface generator Compiler, BLAS Parallelism (shared memory) Threading Building Blocks Parallel linear solver PARDISO
  • 8. Libraries and tools 8 Version management Makefiles/project generator 3D display of meshes Widgets, threads (GUI) Interpreter & user subroutines Python interface generator Compiler, BLAS Parallelism (shared memory) Threading Building Blocks Parallel linear solver PARDISO
  • 9. Why TBB? 9 Shared Memory Parallel Programming with OpenMP class Element; // a Finite Element std::vector<Element*> els; // a set of Finite Elements std::for_each(els.begin(), els.end(), [&](Element *e) { e->getForces(); }); int nbelm = els.size(); #pragma omp parallel for for(int i=0; i<nbelm; ++i) { Element *e = els[i]; e->getForces(); } • C++ iterators are forbidden • size_t cannot be used as a loop counter • Calling a function in a for statement is not allowed • Possibly bad load balancing • Nested parallelism difficult to handle. Back to 1992! Example of a loop over the set of Finite Elements… ORIGINAL C++ LOOP OPENMP LOOP
  • 10. Why TBB? 10 Intel Threading Building Blocks • High Level Parallel programming library (SMP) • Open Source! • Highly portable (msvc, gcc, even old versions) • Object oriented – similar to STL – tbb namespace ) • Task-oriented (instead of threads) • Thread-safe C++ containers • Efficient overloaded memory allocators (new, delete) • Takes into account OpenMP libraries (Pardiso solver) std::for_each(els.begin(), els.end(), [&](Element *e) { e->getForces(); }); tbb::parallel_do(els.begin(), els.end(), [&](Element *e) { e->getForces(); }); ORIGINAL C++ LOOP TBB LOOP Same syntax as modern C++
  • 11. Why TBB? 11 … and it is more efficient and reliable than OpenMP Example: Matrix-vector product : a = B c (size = n) • n=10000  size(B)=763 Mb • multiplication performed 100x Windows Intel Core i7 960 3.2GHz (4 cores) Hyper threading
  • 12. Libraries and tools 12 Version management Makefiles/project generator 3D display of meshes Widgets, threads (GUI) Interpreter & user subroutines Python interface generator Compiler, BLAS Parallelism (shared memory) Threading Building Blocks Parallel linear solver PARDISO
  • 13. Python interface 13 The main objects of Metafor are available through a python interface for 2 main reasons • Input files are written in python • Less code: no complicated home-made parser required • Full language: use of loops, conditional statements, objects in input files • Extensibility: calls to external libraries (Qt, wxWidgets, numpy, …) • Glue language: calls to external codes (gmsh, SAMCEF, Abaqus, matlab, etc.) • Safety: errors are correctly handled (even C++ exceptions!) • Extension of the code (“user subroutines”) • A lot of C++ classes (boundary conditions, postprocessing commands, geometrical entities, materials, meshers, etc.) can be derived by the user in Python in the input file.
  • 14. Python interface 14 Python scripts as input files One Python class is automatically created by SWIG for each C++ class materials.i %module materials %{ %include "ElasticMat.h" %} #include "ElasticMat.h" materials.py materials.pyd from materials import * mat = ElasticMat(E, nu) model.setMaterial(mat) model.run() INPUT SCRIPT (Compiled Python module) (Shadow classes) Adding one new material class requires to add only two lines in the input file of SWIG (material.i) to make it available in Python!
  • 15. Python interface 15 Python inheritance of C++ classes : “user subroutines” SWIG can generate the (huge and complex) code required to derive a C++ class in Python! class ElasticMat { public: virtual T computeStress(T &strain); }; C++ ELASTIC MATERIAL from materials import * class ElasticPlasticMat(ElasticMat): def computeStress(self, strain): # compute the stresses # from the strains # using python cmds here… return stress PYTHON ELASTICPLASTIC MATERIAL This python code will be called from the compiled C++ code! Very useful for students (Final Year Projects) A new material law is available without any compiler!
  • 16. Outline 16 1. Our in-house FE code : Metafor 2. Libraries and tools 3. Numerical examples 4. Future works
  • 17. Fan Blade containment test 17 • Numerical simulation of an engine validation test (FBO : Fan Blade Out) • Implicit algorithm (Chung Hulbert) • Fixed bearing & moving shaft connected by springs • Frictional contact interactions between blades and casing
  • 18. Buckling of a blade in LP compressor 18 • Thermo elasto visco plastic model with damage / EAS finite elements • We expect a lower buckling force compared to a purely elastic model  the total weight of the engine can be safely decreased. CPU time : • 1 day 16 hours (1 core) • 5h35’ (12 cores)
  • 19. Roll forming simulation 19 Sheet Metal Forming : Simulation of a 15-stand forming mill
  • 20. Outline 20 1. Our in-house FE code : Metafor 2. Libraries and tools 3. Numerical examples 4. Future works
  • 21. Future? 21 Shared Memory Processing (TBB) Go on with TBB parallelisation of loops… • The contact algorithms are still sequential. • Some materials are not thread safe. Distributed Memory Processing (MPI?) Nothing done until today… • Domain decomposition should be implemented. • How to manage contact efficiently?
  • 22. 22