Introduction: Internal Wave Generator Demo

About: Student projects from Brown University's School of Engineering. Courses include Advanced Fluid Mechanics and Mechanical Vibrations. Course instructor: Prof. Daniel Harris.

You’ve seen waves crashing on the shore, engulfing swimmers and boogie boarders alike as they wash foam onto the sand. Now imagine those waves, only hundreds of feet higher, approaching the beach on a timescale of hours instead of seconds! Does this sound surreal? Meet internal waves: the ocean’s even bigger waves. Luckily for the ships that sail the seven seas, these waves go unnoticed by most passersby as they form well below the ocean’s surface– secretly perturbing heat, salt, and other nutrients around the ocean.

The purpose of this instructable is to create a tabletop scale internal wave generator–a simplified model of the unseen ocean and its various undersea topography. Through constructing an apparatus that allows students to visualize internal waves, we can yield important insights into features of ocean mixing and energy exchange currently unaccounted for in climate models.

You can learn more about internal waves and the design process for this demo at:

Step 1: Gather the Components

The BOM lists all the parts we used to construct our internal wave tank. We’ve tried to make the construction as accessible as possible, so we’ve linked the cheapest materials and list substitutes for parts when available.


  • Clear ¼” Extruded Acrylic (4 12” X 24” Sheets)
  • Weld-On 4 Acrylic Adhesive (4 Oz.)
  • Brass Valve (Up to ¾” Diameter) Note: Valve allows for easy emptying of tank, but isn’t required
  • Sculpey Modeling Clay
  • Clear-Drying Silicone Sealant
  • Gloves
  • Sheet Metal (for Topographies- other waterproof material on hand can substitute)
  • Velcro
  • Industrial Strength Tape (18”)
  • Micro servo
  • Arduino Uno R3
  • 9V 1A Arduino Power Supply Adapter 110V AC USB 2.0 Cable (A-Male to B-Male 6ft)
  • Food Grade Mineral Oil (1 Gal)
  • Water
  • Food dye


  • 3D-printer Laser cutter (Device is used for fine cuts of acrylic, but a mechanical or manual saw may be used)
  • Hot-glue gun
  • Meter stick
  • Laptop with Arduino software
  • High speed camera (480 fps or above, if unattainable, a smart phone with slow-motion video can suffice)

To cut the acrylic pieces, we have included an illustrator file for vector cutting that will create a tank with the dimensions shown in the attached image.

Step 2: Assemble the Tank

If you already have access to a tank or bin feel free to skip this step. Otherwise, line the edges of the tank with the acrylic adhesive. To assemble the tank, refer to the image above as a guidance. The tank is composed of 5 pieces: two longer sides (labeled as A and B), two shorter sides (labeled as D and E), and the bottom (labeled as C). The sixth piece (labeled as F) is later used as the pusher wall, which will agitate the water within the tank. The above image is color-coded to illustrate which edges should be connected. The finished product should look like the first attached image.

To install the valve, gently insert the thread into the opening on the acrylic. Screw in (gently!) until it is tight. Align the valve so it is facing upward. Once aligned, apply hot glue or acrylic glue to keep it in place. After the adhesive dries, apply silicone sealant to prevent leaking.

The acrylic adhesive takes 24-72 hours to dry. Make sure to give your tank that time without any water on it! Once the tank is dry, we recommend lining the conjoined edges with sealant or caulk to prevent leakage.

Step 3: Install the Servo Motor

If you’ve never used a microcontroller or worked with electronics, have no fear; arduinos are super simple and we’ve outlined everything you need for this device to work properly, including the code required for the motor to run. This code is also customizable, with specific instructions for customization within the comments of the code.

First, download the Arduino software onto your computer. Create a new script and paste or open the attached Arduino code for the servo motor. Using the A-male to B-male USB cable, connect the Arduino Uno to your computer. Connect the servo motor to the Arduino according to diagram below.

The red wire connects to the 5V input, the black wire connects to ground, and the yellow wire connects to pin 9. Once the device is connected, Verify and Upload the code to the Arduino. Once uploaded, the servo motor should rotate between two positions until the code is manually terminated. If the positioning of the servo works for your tank, the Arduino can be disconnected from the computer and powered using the 9V Power Supply Adapter.

Step 4: 3D-Print Components

Use the attached CAD files to 3D-print the components for the crank arm and assemble them as shown below. This should take approximately one hour depending on the printer. The two arms are connected simply using a pin joint, and one arm it attached to a ball joint.

Arm 1 (attach to Servo)
Arm 2 and Wall Connection

(.stl files attached for download as well)

If you do not have access to a 3D-printer, the crank arm can be constructed using any solid shafts; in our prototype, we hot-glued two popsicle sticks to some spare parts to connect them as a pin joint.

Next, attach the the crank arm to the servo motor and the pusher wall. The crank arm with the free end should be hot-glued to the rotor on the servo motor. The ball joint on the second crank arm should be attached to the center of the pusher wall. This can be done using velcro or hot glue.

Step 5: Mold and Bake Clay Rail for Pusher Wall

Using the Sculpey modeling clay, form the clay to approximately match the desired path of the pusher wall. The exact dimensions may vary depending on the width of the tank and the extension of the pusher wall.

Once the clay has been formed into the desired shape, bake it in the oven for 20 minutes at 200°F. Remove it from the oven using oven mitts or other protective wear and let it cool for up to one hour.

Step 6: Design Topographies

For this demonstration, we wanted to ensure that more than one topography could be utilized so that visualizations could be matched to different simulations. We made the topographies out of acrylic and sheet metal, but in reconstructing this project many materials could substitute.

Step 7: Position Wall and Servo in Tank

Attach a piece of velcro to the top of the tank, as shown in the first image. Attach the corresponding piece of velcro to the servo.

Position the clay rail on the bottom of the tank, approximately 3“ away from the side as shown in the second image.

Hot glue the clay rail to the bottom of the tank. Hot glue the flat piece of the crank arm to the top center of the pusher wall.
Connect the crank arm to the servo’s arm with tape or hold it in place for now. It may take some trial and error for you to appropriately set the wall and servo correctly.

Test the arduino code now to ensure everything runs smoothly. You can alter the position or delay to allow for stronger, faster waves or slower, cleaner waves.

Step 8: Velcro the Tank

Attach one side of velcro to the bottom of the tank. The other side will be attached to the removable topographies.

Insert a topography--note that we chose to create a rectangular prism, a triangular shelf, and a sloping ramp that are simplifications of seamounts, undersea ridges, and shorelines respectively. Topographies can be made out of any waterproof, moldable material to replicate many undersea land masses, and we encourage creativity in constructing them.

Step 9: Fill the Tank

Fill tank with dyed water (first) and mineral oil (second). Ensure that the oil-water boundary reaches the top of the topography you want to use in the demonstration, as shown in the image.

To add the fluids to a smaller tank or if splashing is a concern, a hose and vacuum could be used to fill the tank through the nozzle.

Step 10: Make Waves!

Activate the servo motor and watch internal waves in action. To empty the tank, simply drain the water using the valve. If needed, the mineral oil can be saved for future experiments.