Toroidal Propeller Workflow
Toroidal propellers — also known as looped-blade or ring propellers — feature blades that sweep forward and reconnect at the tip to form a continuous closed loop. Unlike conventional open-screw designs, this geometry eliminates the free blade tip and the tip vortex it generates: the primary driver of cavitation and underwater radiated noise in traditional propellers. The result is a significantly quieter, lower-vibration propulsor that has gained traction in autonomous underwater vehicles (AUVs), unmanned surface vessels (USVs), small craft, and aerial drones where acoustics and efficiency are critical.
Designing a toroidal propeller parametrically requires two interlocking center surfaces whose pitch, rake, skew, and chord distributions must be coordinated so that the blade tips connect cleanly. In this tutorial, you will build a fully-parametric toroidal propeller from scratch using the dedicated Toroidal Propeller Workflow in CAESES.

This project starts from scratch and utilizes the propeller workflow, which enhances propeller design in CAESES. It empowers users to boost their productivity by providing a structured workflow, making it easy to parameterize the propeller model, as demonstrated in this tutorial. Additionally, a key goal of this tutorial is to familiarize you with the propeller workflow so that you feel comfortable experimenting with and adjusting its settings.
Before proceeding, it is recommended to review the General Overview of the Propeller Workflow. It may also be helpful to check out the Advanced Propeller Workflow Tutorial, as although there are some differences between the two tutorials, many design strategies are similar.
To start, navigate to the Model workspace > Propeller tab > Workflows category > *Propeller > Toroidal Propeller Workflow in the Propeller tab of CAESES.

Once clicked, you should see the layout below, providing an overview of the project structure and this tutorial. Simply follow the step-by-step process by clicking the green plus buttons as you go.

Before starting this tutorial, set the Project Units to millimeters.

Animations in this Tutorial
Throughout this tutorial, various animations illustrate the impact of different Design Variables on the final propeller geometry. If some visualizations appear more advanced than the current step, don’t worry, you’ll be guided to that point soon!
Two Center Surfaces
The Center Surface is a critical component in Propeller Workflows, as it incorporates essential radial distributions typical in propeller design. To generate the toroidal blade shape, two Center Surfaces are required. These surfaces are positioned opposite each other to form the toroidal model shape, with distributions defined to align at matching endpoints, as illustrated in the figure below. Each of the four radial distributions (Pitch, Rake, Skew and Chord) includes a pair of functions for the two Center Surfaces: continuous lines represent Center Surface 1, while dotted lines represent Center Surface 2.

Defining two Center Surfaces is the first step in this workflow. Click the two plus buttons in the propeller Component GUI to create the surfaces. Adjust the radiusHub parameter from 0.2 to 0.167. For each distribution, navigate to the Center Surfaces Component GUI, click the plus button to create a 3rd-degree B-Spline Curve and select the required number of control points.
The scope structure for radial distributions follows the naming convention 0x_functionName for Center Surface 1 and 0x_functionName_01 for Center Surface 2. Design variables impacting each distribution are organized within their respective scopes.
Any design variables not covered in the tutorial and autogenerated by the workflow can be deleted as needed.
Pitch Functions with 3 Points
The Pitch functions are normalized to the diameter (P/D). For the two functions, four Design Variables are used to adjust pitch either globally or locally at the hub and/ or tip regions.
| Parameter | Functionality | Range (Default Value) | Effect |
|---|---|---|---|
| pitchDeltaHub1 | Modifies pitch at hub | [0.15, 0.25] (0.20) | Center Surf. 1 |
| pitchDeltaHub2 | Modifies pitch at hub | [0.15, 0.25] (0.25) | Center Surf. 2 |
| pitchDeltaTip | Modifies pitch at tip | [0.05, 0.15] (0.10) | Center Surf. 1 & 2 |
| pitchMax | Translates pitch | [1.00, 1.60] (1.30) | Center Surf. 1 & 2 |
In the tables below, you can see how the control points of these two B-Spline curves are defined.
Pitch Function for Center Surface 1
| Coordinates | p00 | p01 | p02 |
|---|---|---|---|
| X | |propeller|centerSurf1.getRadiusHub() | 0.7 | |propeller|centerSurf1.getRadiusMax() |
| Y | pitchMax - pitchDeltaHub1 | pitchMax | pitchMax - pitchDeltaTip |
Pitch Function for Center Surface 2
| Coordinates | p00 | p01 | p02 |
|---|---|---|---|
| X | |propeller|centerSurf2.getRadiusHub() | 0.7 | |propeller|centerSurf2.getRadiusMax() |
| Y | |propeller|00_functions|01_pitch|pitchMax - pitchDeltaHub2 | |propeller|00_functions|01_pitch|pitchMax | |propeller|00_functions|01_pitch|pitchMax - |propeller|00_functions|01_pitch|pitchDeltaTip |
Visualization of pitchDeltaHub Parameters

Visualization of pitchDeltaTip Parameter

Visualization of pitchMax Parameter

Rake Functions with 5 Points
The Rake functions are controlled by two Design Variables that shift the rake angle (forward or backward) and adjust the rake magnitude.
| Parameter | Functionality | Range (Default Value) | Effect |
|---|---|---|---|
| rakeDelta | Shifts rake angle | [-0.1, 0.1] (0.0) | Center Surf. 1 & 2 |
| rakeMax | Modifies rake magnitude | [ 0.1, 0.3] (0.2) | Center Surf. 1 & 2 |
In the tables below, you can see how the control points of these two B-Spline curves are defined.
Rake Function 1
| Coordinates | p00 | p01 | p02 | p03 | p04 |
|---|---|---|---|---|---|
| X | |propeller|centerSurf1.getRadiusHub() | 0.35 | 0.9 | p04:X | |propeller|centerSurf1.getRadiusMax() |
| Y | 0 | p04:Y / 4 | -rakeMax + p04:Y | -rakeMax / 4 + p04:Y | rakeDelta |
Rake Function 2
| Coordinates | p00 | p01 | p02 | p03 | p04 |
|---|---|---|---|---|---|
| X | |propeller|centerSurf2.getRadiusHub() | 0.35 | 0.9 | p04:X | |propeller|centerSurf2.getRadiusMax() |
| Y | 0 | p04:Y / 4 | |propeller|00_functions|02_rake|rakeMax + p04:Y: | |propeller|00_functions|02_rake|rakeMax / 4 + p04:Y | |propeller|00_functions|02_rake|rakeDelta |
In the animation below, you can see the effect of the rakeMax parameter on the propeller model.

The animation below, shows the effect of the rakeDelta parameter on the propeller model.

Skew Functions with 4 Points
The Skew functions are controlled by two Design Variables that shift the skew angle and adjust the skew magnitude.
| Parameter | Functionality | Range / Default Value | Effect |
|---|---|---|---|
| skewDelta | Shifts skew angle | [-0.100, 0.100] (0.000) | Center Surf. 1 & 2 |
| skewMax | Modifies skew magnitude | [ 0.175, 0.225] (0.200) | Center Surf. 1 & 2 |
In the tables below, you can see how the control points of these two B-Spline curves are defined.
Skew Function 1
| Coordinates | p00 | p01 | p02 | p03 |
|---|---|---|---|---|
| X | |propeller|centerSurf1.getRadiusHub() | 0.8 | 0.9 | |propeller|centerSurf1.getRadiusMax() |
| Y | -skewMax * 0.75 | -skewMax + skewDelta / 1.5 | p03:Y | skewDelta |
Skew Function 2
| Coordinates | p00 | p01 | p02 | p03 |
|---|---|---|---|---|
| X | |propeller|centerSurf2.getRadiusHub() | 0.8 | 0.9 | |propeller|centerSurf2.getRadiusMax() |
| Y | |propeller|00_functions|03_skew|skewMax * 0.75 | |propeller|00_functions|03_skew|skewMax + |propeller|00_functions|03_skew|skewDelta / 1.5 | p03:Y | |propeller|00_functions|03_skew|skewDelta |
Visualization of skewDelta Parameter

Visualization of skewMax Parameter

Chord Functions with 5 Points
The Chord functions are controlled by four Design Variables that adjust chord either globally or locally at the hub and/ or tip regions.
| Parameter | Functionality | Range (Default Value) | Effect |
|---|---|---|---|
| chordDeltaHub1 | Modifies chord at hub | [-0.050, 0.000] ( 0.000) | Center Surf. 1 |
| chordDeltaHub2 | Modifies chord at hub | [-0.050, 0.000] (-0.050) | Center Surf. 2 |
| chordDeltaTip | Modifies chord at tip | [-0.050, 0.050] ( 0.000) | Center Surf. 1 & 2 |
| chordMax | Translates chord | [ 0.375, 0.425] ( 0.400) | Center Surf. 1 & 2 |
Chord Function 1
| Coordinates | p00 | p01 | p02 | p03 | p04 |
|---|---|---|---|---|---|
| X | |propeller|centerSurf1.getRadiusHub() | 0.3 | 0.6 | 0.85 | |propeller|centerSurf1.getRadiusMax() |
| Y | chordMax - 0.2 + chordDeltaHub1 | p00:Y + 0.05 | chordMax | p04:Y | chordMax - 0.15 + chordDeltaTip |
Chord Function 2
| Coordinates | p00 | p01 | p02 | p03 | p04 |
|---|---|---|---|---|---|
| X | |propeller|centerSurf2.getRadiusHub() | 0.3 | 0.6 | 0.85 | |propeller|centerSurf2.getRadiusMax() |
| Y | |propeller|00_functions|04_chord|chordMax - 0.2 + chordDeltaHub2 | p00:Y + 0.05 | |propeller|00_functions|04_chord|chordMax | p04:Y | |propeller|00_functions|04_chord|chordMax - 0.15 + |propeller|00_functions|04_chord|chordDeltaTip |
Visualization of chordDeltaHub Parameter

Visualization of chordDeltaTip Parameter

Visualization of chordMax Parameter

Profile Configurator
For this tutorial, a NACA 4-Digit airfoil is used, specifically designed for marine propeller applications.
-
Camberline: The NACA 4-digit camberline is a well-known choice for profile sections, commonly used in aviation and highly suitable for toroidal propellers. This design reduces cavitation and noise, enhancing overall propeller performance.
-
Thickness Distribution: This version includes a thickened edge in the NACA 4-digit section, adjusting the thickness curve to withstand higher mechanical stress. The original thin edges of the NACA 4-digit section were prone to damage in marine environments, making this modification particularly advantageous.
To apply this, click the plus button in the propeller component GUI for the Profile Configurator and select Profile Configurator via Camberline and Thickness.
- For the Camberline, click the plus button and choose NACA 4 Digits.
- For the Thickness Curve, select NACA 4 Digit Modified.
You can also modify the trailing edge (TE) and leading edge (LE) shape by adjusting the parameters XTrim LE and TE Mod Start on the thickMod Curve, as illustrated in the figure below.

With the camberline and thickness settings, you can generate a Profile Curve and, by clicking the play button, create a Profile Definition.
Two Blade Surfaces
In the propeller Component GUI, continue by clicking the plus button for both Blade Component 1 and Blade Component 2. Then, click Blade Surface in each component. This will create three objects in each blade component:
- blade (
FPropellerBlade) - tipGap (
FParameter) - bladePrepared (
FImageSurface)
For each Profile Parameter parameter, you can add distributions for the following functions in the section. For each function, choose Distribution via B-Spline Curve.
- Design Variables should be placed within each function folder, as they influence the corresponding functions.
- Both blade Surfaces share the same Profile Parameters, located in the blade1|functions scope.
- The Profile Parameters, specifically camberPos and maxThicknessPos, remain unchanged and constant at
0.35, while angleOfAttack is set to0, with no additional twist at the tip.
All Radial Distributions
Below is a figure showing all 2D radial distributions, including those from the Center Surface and Profile Parameters.

Camber
The Camber distribution defines the maximum camber of each profile in the chordwise direction. This function is controlled by a single design variable named camber, ranging from 0.02 to 0.1 with a default value of 0.06. It is designed to achieve the greatest camber in the spanwise direction at the root of the blade, gradually decreasing towards the tip until reaching zero at the tip. The control points below are defined to achieve this functionality.
| Coordinates | p00 | p01 | p02 |
|---|---|---|---|
| X | |propeller|00_functions|radiusHub | (p02:X - p00:X) * 0.5 | |propeller|00_functions|radiusMax |
| Y | camber | camber | 0 |
Visualization of camber Parameter

Max. Thickness
The Max. Thickness distribution describes the maximum thickness of each profile in the chordwise direction. This function is controlled by a design variable named maxThickness, ranging from 0.15 to 0.25 with a default value of 0.2. It is designed for maximum thickness in the spanwise direction at the root of the blade, decreasing towards the tip. The control points below are defined to achieve this functionality.
| Coordinates | p00 | p01 | p02 |
|---|---|---|---|
| X | |propeller|00_functions|radiusHub | (p02:X - p00:X) * 0.5 | |propeller|00_functions|radiusMax |
| Y | maxThickness | maxThickness * 0.25 | maxThickness * 0.25 |
Visualization of maxThickness Parameter

TE Thickness
For the Trailing Edge (TE) Thickness distribution, a constant distribution will be used, so there is no need to click the plus button. Instead, create a new scope named teThickness_distribution under the functions scope, where the other profile distributions are located. This distribution can be controlled by a single design variable, teThickness_distribution|teThickness, with a range of 0.005 to 0.01.
| Coordinates | p00 | p01 | p02 |
|---|---|---|---|
| X | |propeller|centerSurf.getRadiusHub() | (p02:X - p00:X) * 0.75 | |propeller|centerSurf.getRadiusMax() |
| Y | teThickness | teThickness * 0.25 | teThickness * 0.25 |
Visualization of teThickness Parameter

Propeller Solid
To proceed, click the plus button in the propeller GUI Component. This will generate a bladeSolid Component along with two Design Variables: absPropellerRadius and NOB, which correspond to the propeller radius and number of blades, with ranges of 100 to 500 millimeters and 2 to 5, respectively.
Next, create a parameter under the bladeSolid Component named D, which corresponds to the Diameter with the following expression: D = absPropellerRadius * 2
Visualization of NOB Parameter

Steps for Propeller Solid Creation
The steps for completing these tasks are shown below:

Hub
By clicking the corresponding plus button in the bladeSolid GUI, you can create a hub BRep that scales with the propeller’s radius. For this tutorial, the auto-configured hub from the workflow is sufficient. However, if you wish to make modifications, you can easily adjust the axial length and/ or radius of the hub using the following parameters, both scaled by the factor 1.5:
axialLength = ||propeller|bladeSolid.getBladeRadius() * 1.5
hubRadius = propeller|bladeSolid.getBladeRadius() * |propeller|bladeSolid.getNormHubRadius() * 1.5
Full Bladed Solid
Next, click the plus button in the bladeSolid GUI for the Full Bladed Solid, which automatically creates three sub-scopes:
- 02_closedBlade
- 03_fillet
- 04_solid
Closed Blade
The two blades are scaled to absPropellerRadius and connected at the tip with a tipFillet Surface. You can use these surfaces as sources in a BRep operation. The blade is closed at the hub through a solid from intersections operation, using a scaled version of the blade & tip surface to the propeller radius, combined with a 99% scaled-down version of the hub geometry, named hubSmall.
Variable Fillet
With BReps for the blade and hub established, proceed to create the Variable Fillet. A general rule is to set the fillet radius on the Pressure Side to 2/3 of the maximum profile thickness at the root and 1/3 on the Suction Side. The fillet should also match the thickness at the trailing edge (TE) and leading edge (LE). The following parameters are defined based on these guidelines:
filletScalefactor = 40radiusLE = thicknessRoot / 10radiusSide1 = thicknessRoot / 3radiusSide2 = thicknessRoot * 2 / 3radiusTE = thicknessTE / filletScalefactorthicknessRoot = |propeller|blade|functions|maxThickness_distribution|maxThickness * |propeller|bladeSolid|DthicknessΤΕ = |propeller|blade|functions|teThickness_distribution|teThickness * |propeller|bladeSolid|D
Pressure Side
| Coordinate | X | Y |
|---|---|---|
| pS1_1 | 0 | |propeller|bladeSolid|03_fillet|radiusLe / |propeller|bladeSolid|03_fillet|filletScalefactor |
| pS1_2 | 0.05 | pS1_1:Y |
| pS1_3 | 0.5 | |propeller|bladeSolid|03_fillet|radiusSide1 / |propeller|bladeSolid|03_fillet|filletScalefactor |
| pS1_4 | 0.95 | pS1_5:Y |
| pS1_5 | 1 | |propeller|bladeSolid|03_fillet|radiusTe / |propeller|bladeSolid|03_fillet|filletScalefactor |
Suction Side
| Coordinate | X | Y |
|---|---|---|
| pS2_1 | 0 | |propeller|bladeSolid|03_fillet|radiusLe / |propeller|bladeSolid|03_fillet|filletScalefactor |
| pS2_2 | 0.05 | pS2_1:Y |
| pS2_3 | 0.5 | |propeller|bladeSolid|03_fillet|radiusSide2 / |propeller|bladeSolid|03_fillet|filletScalefactor |
| pS2_4 | 0.95 | pS2_5:Y |
| pS2_5 | 1 | |propeller|bladeSolid|03_fillet|radiusTe / |propeller|bladeSolid|03_fillet|filletScalefactor |

GUI Variable Fillet
Since Chord functions at the hub can differ between blade1 and blade2, bladeFillet1 and bladeFillet2 require adjustment to the Radius Scaling Factor:
bladeFillet1|Radius Scaling Factor = filletScalefactor * |propeller|00_functions|04_chord|p00:YbladeFillet2|Radius Scaling Factor = filletScalefactor * |propeller|00_functions|04_chord01|p00:Y

Full Bladed
This completes the Propeller Solid, automatically generating the full propeller geometry with all blades smoothly connected to the hub as a single BRep.
This concludes the propeller modeling. The next step, if desired, is to connect this model to a CFD RANS solver and automatically create an appropriate Flow Domain.
Flow Domain
For the propeller's Flow Domain, click the plus button in the propeller Component GUI, then do the same in the pop-up flowDom Component. After unfolding flowDom, locate the flowDom|domain object, which includes the following parameters:
domRadius = |propeller|flowDom.getBladeRadius() * 4zEnd = |propeller|flowDom.getBladeRadius() * 10zStart = -|propeller|flowDom.getBladeRadius() * 5
You can adjust these parameters to your preference, but it is recommended to keep them relative to |propeller|flowDom.getBladeRadius(). Additionally, select the Periodic Cut checkbox to limit the domain to a single blade, making the problem easier to solve. If symmetry is not assumed in your solution, leave the Periodic Cut checkbox unchecked. You may also check the Extend in -Z Axis option if it better suits your setup.

In the Toroidal Propeller Workflow, the Flow Domain GUI shows the flag for toroidal propellers is enabled, which is necessary to automatically generate an appropriate periodic flow domain due to the unique shape of toroidal propellers.
Conclusion
This tutorial aims to help you become more familiar with the Toroidal Propeller Workflow and demonstrates how straightforward it is to create a complex shape like a toroidal propeller in CAESES, as well as how to modify default settings. This approach allows you to see firsthand how easily adjustments can be made. You can also customize your own workflow to align with CAESES. Additionally, a parametric model with a minimal set of parameters is introduced here, maintaining a compact design space that enables meaningful designs while also providing the flexibility, freedom and variety needed for toroidal propeller designs. These geometries show great promise in terms of cavitation reduction, noise minimization and efficiency.
CAESES Project File
If you want to take a look at the finalized parametric toroidal propeller model to gain a clearer understanding of the concepts presented, you can find the resulting CAESES project file toroidal-propeller-workflow.cdb here: