We'll kick off this blog by presenting one of our product that we're quite proud of - Shell6.
What is it?
Shell6 is a solver for 3D shell and beam elements using finite element method (FEM) bundled with a 3D modeling app. It sounds like a mouthful so let me explain it in more details one step at a time.
The application was developed together with kind people from Faculty of Civil Engineering, Architecture & Geodesy of University of Split, mainly prof. Blaž Gotovac and prof. Vedrana Kozulić. Its main purpose is modeling civil engineering structures and running statics calculations for various scenarios. Core functionalities include 3D modeling, defining structure characteristics, statics computation and displaying results.
Here's a quick screenshot from the tool- just to give you the sense of how it looks like before we continue.
Every construction that is to be analyzed with SHELL6 must be modeled with a grid of finite elements (FE). We get to the FE by defining quadrangular macroelements, using modeling tools described below, which are then divided into MxN 8-node quadratic serendipity finite elements. Another type of elements that a structure can have are beams. Beams are defined as 2-node rectilinear elements with a prismatic cross-section.
In the picture above, the beam elements would be the "legs" of structure and the "roof" would be a shell element. Modeling tools in SHELL6 include:
- Four perspective view of the 3D scene with a grid and a ruler,
- Basic tools for shell and beam modeling: line, polyline, rectangle, circle and parabolic arc,
- Extrude - tool for extruding 2D objects into 3D space,
- Command line - all the tools can be used from the command line for high precision modeling,
- Loading custom geometries from files,
- Material editor - defining your own type of materials by modifying various material parameters.
After we model a structure in editor, we can set up scenarios before running a statics computation. Scenarios include setting various parameters for the structure, such as setting shell thickness, number of layers per shell element, materials, setting fixed nodes and setting construction load.
Shell thickness and number of layers
We can assign thickness and number of layers for each FE in the shell. Furthermore, shell thickness can be more precisely defined for every node in the FE.
Materials are assigned for every layer on FE and are modeled as linearly elastic and can be anisotropic. Materials are defined in the material editor and there are 2 different types of materials:
- Shell materials - defined by elasticity modulus, Poisson's ratio, coefficient of thermal expansions, density
- Beam materials - defined by elasticity modulus, shear modulus and density
Each construction can be supported by assigning fixed points. Fixed points arbitrarily restrict shifts and rotations in X,Y and Z directions (6 DOF).
Various types of loads can be assigned for construction, which can be taken into account during statics computation. Those are:
- Gravitational load - models the weight of the structure.
- Concentrated load - arbitrary load assigned as a vector in FE nodes.
- Continuous load - uniform and non-uniform load on FE surface. It is applied perpendicular to the upper or lower surface of the FE.
- Temperature load - Assigned as a temperature value in FE nodes.
Statics computation and results
Previously described model serves as input for statics computation which uses a Gaussian numerical integration over the surface of a shell element and an analytical integration over the element's thickness. Statics computation yields several types of results, which are visualized on the 3D model, or one could select a specific part of the model (like a FE node) and ask for the numerical value of the result.
Before we explain different types of results, let's take a look at an example from the real world where SHELL6 was used. This is the church of St. Liberan in Split, and this is the roof of the same building modeled in SHELL6:
Here we can see the mesh of FEs which are used to model the roof. The light green lines represent beam elements that are used to support the structure, and red triangles represent fixed FE nodes. In this particular scenario, only the structure's own weight was taken into account, that is, no additional loads were added besides gravitational load.
Shifts, rotations and reactions
Shift results represent how much has the structure has moved in X,Y, and Z direction (to be more precise, FE nodes). This type of result can be displayed as a separate offset model or via color maps of shifts in X,Y or Z. First picture represents the shifted structure model and the second one uses colormaps in Y direction. Displacement scale has been increased in this case, so that the result becomes obvious.
Here we can see that the side window affects the roof structure so that it dents in the middle under its own weight.
In this picture we can see the top down perspective view of the structure with colormap in direction Z for shifts. The red and blue spaces represent the areas with largest shifts in Z direction (red being a positive, and blue a negative shift).
Besides shifts, we can get rotation values for every FE node on the structure, as well as reaction forces in nodes that are fixed. There is no visual representation of this type of results, only numerical values.
Strain in Gaussian points on FEs
Gaussian integration points are defined for every FE, and their number depends on the type of Gaussian integration used: normal - 3x3 points, reduced - 2x2 points and selective - combination of the previous two. We can display main strains and stresses in Gaussian points for every layer of shell.
Other types of results
There are other types of results produced by the statics engine which are not yet fully supported in the application, which include: internal forces in shell elements, forces on the edges of beam elements and deformations. We plan to implement them in the near future.
A little bit from a technical point of view
As I mentioned earlier, we developed SHELL6 with experts in the field, who developed the core statics engine. The code was originally written in FORTRAN77 and was later translated to FORTRAN95. As you probably figured out, the code is old. Actually, it's older than any of us working here at Kodbiro :) . The core module worked as a command line tool which took inputs and produced results in the form of very big files which were of limited use. Our job was to build a 3D modeling tool which supported all of the functionality of the core engine. So we did- of course, in FORTRAN95. The chosen language wasn't a "good developer's" decision, but rather a more situationally conditioned one, especially when we had very little to no experience in Fortran. It turned out to be quite exciting and rewarding to work with what is now considered an old programming language. Also, it was an honor to have the opportunity to work with an old-school engineering style of complex and differential equation solving code. Not to digress any further, we'll write another blog post about all the benefits and some downsides of developing software with Fortran.
As for the user interface, we used Winteracter, a toolset for GUI development in Fortran. For all the 3D stuff we used OpenGl wrapper for Fortran f90gl which came bundled with Winteracter. Other than that, we used only our own ingenuity because, frankly, we didn't have anything else. Even though Fortran has some cool features of its own, it lacks in features that we take for granted in modern languages, like dynamic memory allocation or events which we had to implement on our own. But more on that in next posts.
If you want to try out SHELL6 for yourself, or you simply have some questions, feel free to contact us. There is an automatic contact form on Kodbiro homepage and contact info in the About section of the blog. There's a lot more going on under the hood than it can fit in one blog post.