Computational Engineering 101 – Part 1: Course Introduction
Introduction to Computational Engineering
The goal of this series of posts will be to provide an Introduction to Computational Engineering as well as a basic, succinct resource for computational education and training for engineers of the built environment. Most people take education and training as as being one in the same – they are not. The difference was best summarised in a great book that all engineers should read by Richard Hammering:
“Education is what, when, and why to do things, Training is how to do it”
-Richard Hammering,
The Art of Doing Science and Engineering, 1997
So this series isn’t just going to be a series of tutorials aimed to tell you how to learn Grasshopper, Dynamo, or some other common programming language for Engineers. There are already plenty of resources out there which will help you learn those languages. To be honest, when people ask me “How do I learn Grasshopper?”, I still point them to the same video series on YouTube that I learned from back in 2011. The basics are still the basics and you’ll need to at some point learn them by watching some tutorials and doing some hacking. Whilst there is a plethora of these types of resources, there is a tendency of these resources to come from a very architectural point of view, focusing mainly on geometrical issues as well as software-specific issues. These are great skills for engineers to have, don’t get me wrong. But these skills are just a subset of the skills that define a Computational Engineer. What we are lacking is a resource to help them understand the Computational Engineering approach to problem solving. This series will aim to fill that gap.
In this series, we are first going to explore the underlying computer science first-principles that lie behind both those and other programming languages. Equipped with this knowledge, we can then learn the mentality of a Computational Engineer’s approach to problem solving and the techniques you can use to structure your thinking in this way. Finally, we can then focus on applying that knowledge via simple examples where we will apply this problem solving technique and execute it via a bit of coding.
Who can be a Computational Engineer?
My background is Structural Engineering and I’ve spent my career in the design of the built environment. Engineers of the built environment include, but are not limited to:
- Structural Engineers
- MEP Engineers
- Facade Engineers
- Civil Engineers
- Industrial Engineers
- Fire Engineers
- Manufacturing Engineers
- CAD/BIM Technicians
I have a strong feeling that all of the aforementioned engineers will stand to benefit greatly from this series, but also, I believe the skills presented in this series will be useful to any person making a career in bringing physical objects into the world, such as Architects, Contractors, or even people who design artwork or products such as cars or toys.
Before we get started, it is important to stress that it is assumed that you are already a qualified, well-trained, and responsible engineer who understands the first-principles (science and mathematics) or their trade. If you do not understand fully the first-principles of your craft, you should first work on that before working on your computational skills. Our friend Richard Hammering has another great quote on this subject:
“In engineering if you do not know what you are doing you should not be doing it”
-Richard Hammering,
The Art of Doing Science and Engineering, 1997
If you are an engineer designing without first-engineering principles, you are acting dangerously, carelessly, wastefully, and unethically. Computation will only exacerbate these issues. You have been warned.
We shall start by providing some initial education on first-principles of both computation and engineering, as it relates to the built environment. We will then combine the two, showing the underlying approach of a Computational Engineering. This will have nothing to do with coding or specific software, just principles that can be applied using any programming language or software (commercially purchased or otherwise). At this stage, it is critical that we avoid getting bogged down in the weeds of software because, as Mario Carpo put so well:
“All tools feed back onto the actions of their users, and digital tools are no exception. All design software tends to favor some solutions to the detriment of others…”
-Mario Carpo
The Alphabet and the Algorithm, 2011
We are not here to give a tutorial in any one given piece of software as the software may subliminally bias our thinking and distract us from first-principles. Software is solely a tool and acts as an extension of our engineering minds. A Computational Engineer understand this and knows how to use the right tools at the right time, sometimes coding his/her own tools if existing tools don’t suffice. But more than anything else, a Computational Engineer can solve the problems from first-principles of engineering and computer science on paper first and then translate that solution into code or software.
With the education at hand, we will then move onto some specific examples aimed at providing you training materials to understand how to begin implementing the Computational Engineering mindset on your projects. In this step, we will gradually move toward using specific software and coding languages to show how Computational Engineering is practically carried out.
How to be a Computational Engineer?
Keep in mind that these concepts are only an introduction, and the learning curve for a Computational Engineer is on the order of magnitude of months and years, not hours and days. Your success in Computational Engineering will largely be based on how much you are willing to try and how well you know both engineering and computational first-principles. It is not a spectator sport – you will learn by doing, spending hours Googling ‘how to do ______’ and hacking around is a prerequisite to being a Computational Engineer. Therefore, the real purpose of this series will be to introduce to you some fundamentals to keep in mind during this long learning curve of hacking, coding, and Googling that you are about to embark upon which will not only expedite your learning curve, but assure that you are continually solving the right solutions to the right problems. This is really important. One of the most valuable things I was taught as part of my engineering education was summed up in this (paraphrased) quote:
“The machine will always give you a solution, but it doesn’t mean it’s the correct solution”.
-Dr. Atef Saleeb, circa 2011
At its core, Computational Engineering is about having a computer facilitate you to solve problems. This is a very powerful concept. But with great power comes great responsibility – a computer will always give an output. This output is a result of the input and the function accepting the input. Regarding the former, you may have heard the famous saying in computing “garbage in, garbage out”. You can have a perfectly designed sports car, but if you fill the gas tank with milk, you’ll never be cruising down the freeway. Equally, you as a Computational Engineer will now be responsible for designing the functions/algorithms which drive our designs. This increases the chance for issues and precludes the need for our caution. Our computer’s results are only as good as how good we are as engineers and how much we are in control of our designs.
So if you’ve read this far, you must be a properly trained engineer who’s ready to learn some new skills. Let’s get started in Part 2.