Folders and files
| Name | Name | Last commit date | ||
|---|---|---|---|---|
Repository files navigation
#+TITLE: Elastica #+DATE:<2019-09-06 Fri> [[https://github.com/mattialab/elastica/blob/master/LICENSE.txt][https://img.shields.io/badge/license-MIT-blue.svg]] [[https://en.wikipedia.org/wiki/C%2B%2B#Standardization][https://img.shields.io/badge/c%2B%2B-11-blue.svg]] Elastica is a software to simulate the dynamics of filaments that, at every cross-section, can undergo all six possible modes of deformation, allowing the filament to bend, twist, stretch and shear, while interacting with complex environments via muscular activity, surface contact, friction and hydrodynamics. This repository provides a prototyping, non-parallel (single threaded, single node) code in ~C++~ that supplements the paper "Modeling and simulation of complex dynamic musculoskeletal architectures, Nature Communications, 2019." The code provided here is meant to be a tutorial into assembling and simulating active architectures similar to the ones in the above paper: 1. It presents a single Cosserat rod implementation according to the above paper and "Forward and inverse problems in the mechanics of soft filaments. Royal Society Open Science, 2018." 2. It illustrates the use of a single rod in the case of slithering snakes, and a comparison with the Timoshenko beam deflection to highlight the effect of shear. 3. It extends the use of single Cosserat rods to simple assemblies of rods, and presents three toy problems implementing the main joint connections employed in "Modeling and simulation of complex dynamic musculoskeletal architectures, Nat Comm, 2019." 4. It illustrates the assembly and simulation of dynamic musculoskeletal structures similar to those in the Nat Comm, 2019 (although not identical due to the use of a legacy code). An HPC version of Elastica will eventually replace this repository. The code has been tested with ~C++-11~-compliant ~gcc~ compilers from versions ~4.9.4~ and above on ~Linux~ and ~MacOS~. This version of the code is not optimized and non-parallel, so some examples are *slow* to run, we indicate this in the scripts provided. The code itself is distributed with a MIT License, but the authors retain copyright for the examples shown in this repository. * Quick-Use Guide To understand the code, starting from the fundamental rod model used, boundary conditions, connections between rods, we suggest taking the route below in running and understanding cases (for a complete explanation, see the /Commands/ section below). ** Basic tests to check the integrity of the Cosserat rod's core (individual rod) 1) timoshenkobeam in =QuasiStaticTimoshenkoBeam.cpp= 2) localized helical buckling in =InstabilityHelical.cpp= 3) snake in =Snake.cpp= ** Basic examples of rods' assembly (multiple rods) 1) sphericaljoint in =SphericalJoint.cpp= 2) hingejoint in =HingeJoint.cpp= 3) fixedjoint in =FixedJoint.cpp= 4) pullingmuscle in =PullingMuscle.cpp= When you reach this point, you should be able to assemble your own complex structures. The examples below rely on the same concepts as the first six. ** More complex architectures similar to the ones in the Nat Comm, 2019 paper 1) flagella in =Flagella.cpp= 2) muscularsnake in =MuscularSnake.cpp= 3) walker in =Walker.cpp= 4) elbow in =Elbow.cpp= 5) wing in =Wing.cpp= For processing and plotting results from these cases, use the ~plot_results.py~ script found in the ~scripts~ folder (see *Visualizing Results* section below and the ~README.org~ in the ~scripts~ folder for more information. * Usage While the repo contains code to simulate individual rods by themselves, we organized it to run several examples off-the-shelf. ** Prerequisites Our prerequisites are ~GNU Make~ and a ~C++-11~ compliant ~gcc~ compiler for running the code (there are known bugs with other compilers, see the section on /Bugs/ below). For visualizing the date, we use ~Python3~ (any version should be fine) using ~numpy,scipy~ and ~matplotlib~ as packages (see ~README.org~ file in the ~scripts~ folder for more details). ** Installation The Makefile provided can be used to compile one of many executables running a specific case, like so: #+begin_src sh cd makefiles make clean make -j8 # default target is elbow ./<name_of_executable> #+end_src For ease of use however, we provide a handy bash script that makes and runs the provided examples: #+begin_src sh cd makefiles ./run.sh <name_of_example> #+end_src The next section provides more details on using this script. ** Commands Upon running the ~run.sh~ with no arguments, it prints the following descriptive help message: #+begin_src sh usage ----- ./run.sh <case_name> case_names and explanations --------------------------- help : Print this help message timoshenkobeam : Runs a cantilevered slender beam (clamped at the wall at one end, free at another) bending under the influence of a downward point force. We compare against analytical results using Timoshenko Beam theory. helicalbuckling : Runs the localized helical buckling benchmark which tests the mixed bending modes (two bending modes + twist mode). When an unstretchable rod is twisted at two ends, a characteristic instability arises which forms a localized helical shape at the center of the beam. There is an analytical solution (see Gazzola et. al, RSOS, 2018), which we compare against. snake : Runs an example of an snake, actuated by a continuum analytical bend- ing torque profile slithering on a plane-ground with anisotropic friction. This snake has been optimized for maximal forward speed. sphericaljoint : Runs an example of two rods connected by a spherical joint that allows for arbitrary rotations (see SphericalJoint.cpp) hingejoint : Runs an example of two rods connected by a hinge joint that allows for motion only along a constrained plane (see HingeJoint.cpp) fixedjoint : Runs an example of two rods connected by a fixed joint that does not allow any motion between the rods (see FixedJoint.cpp) pullingmuscle : Runs an example of two hanging vertical rods (connected to ground by a hinge) connected to each another's centers by a horizontal muscle. This muscle is actuated and pulls the rods together. (see PullingMuscle.cpp) elbow : Runs the injured elbow (50% Strength) with artificial muscles, as seen in Fig.7 in Supplementary Material. flagella : Runs the original biohybrid flagella design seen in Fig.2(a,b). walker : Runs the original biohybrid walker design at a frequency of 2 Hz, as seen in Fig.2(e,f). SLOW without parallelization. muscularsnake : Runs the muscular snake seen in Fig.3. SLOW without parallelization. wing : Runs the wing seen in Fig.4. EXTREMELY SLOW without parallelization. case_names ---------- timoshenkobeam, helicalbuckling, sphericaljoint, hingejoint, fixedjoint, pullingmuscle, snake flagella, muscularsnake, walker, elbow, wing All results are stored in folder 'run_<case_name>' in the main directory #+end_src To run a specific example then (e.g. walker) type =./run.sh walker=. ** Visualizing Results To process the results using ~plot_results.py~, run #+begin_src sh ./plot_results.py -c <case_name> #+end_src where the ~case_name~ is the same as before. This script visualizes the data and saves the files automatically. More details in the ~README.org~ file in the ~scripts~ folder. ** Known bugs The code, at the moment, only works with ~gcc~ compiler family (Apple ~clang~, source ~clang~, ~icc~ do not work). This will be corrected in the near future. All examples in the paper are run with ~g++ 8.2.0~ with ~-O3~ optimization and user warnings. ** Troubleshooting Because of the above bugs, we hard-coded ~g++~ in line 5 of our ~Makefile~. In case ~make~ throws an error during compile-time, the user is encouraged to change the path of the ~CC~ executable in the ~Makefile~.