Table of Contents

Assemble a turbine in JSON

Summary

Learn how to build a turbine in the new Bladed Next Gen JSON input data model using it's assembly feature.

Prerequisites

  1. Latest version of Bladed Next Gen and Samples installed including the Bladed Python packages.
  2. Licence for Bladed Next Gen (request a licence).
  3. A text editor with JSON support.

Subjects Covered

By the end of this tutorial you should have:

  1. Understand what is the turbine assembly tree property.
  2. Produce a turbine assembly template.
  3. Add components to a turbine assembly.
  4. Model a rotor.
  5. Model a generic turbine.

Assemble_a_turbine.json

We would recommend opening the samples folder in VS Code to follow along with these tutorials. In this section of the tutorial we will use an incomplete IEA 15MW NREL steady operational loads JSON input file assemble_15MW_SteadyOP.json.

If you do not yet know how to run a simulation, please follow the instructions and checks in the Get started and Run a simulation tutorials before continuing.




The assembly structure

Open the assemble_15MW_SteadyOP.json input file and observe in line 50 that the Assembly property of the Turbine is missing. If you hoover your mouse over the Turbine you will see the following error message:

turbine_assembly_missing.jpg

Figure 1: IEA 15MW missing the Assembly property.

Under the commented line 50 "_ADD_ASSEMBLY": "Add an assembly object in this location to build your turbine model using the pre-defined components in the ComponentDefinitions object" type "Assembly": and notice how it offers you to autocomplete the assembly with a pre-prepared template:

rotor_assembly_template.jpg

Figure 2: Assembly property rotor template auto-complete.

If you accept this template auto-complete it will automatically write the following data:

{
  ...
  "Turbine":{
    ...
+   "Assembly":{
+     "_Template": "Rotor hub and blades",
+     "Hub": {
+       "_comment": "This is the single root node, for a hub component, under which 3 'child' nodes have been defined, modelling the pitch system and blades.",
+       "ComponentReference": "#/ComponentDefinitions/<component-name>",
+       "PitchSystem1": {
+         "_comment": "Each child node itself, references it's component, and can have an unbounded number of 'child' nodes.",
+         "ComponentReference": "#/ComponentDefinitions/<component-name>",
+         "Blade": {
+           "ComponentReference": "#/ComponentDefinitions/<component-name>"
+         }
+       },
+       "PitchSystem2": {
+         "ComponentReference": "#/ComponentDefinitions/<component-name>",
+         "Blade": {
+           "ComponentReference": "#/ComponentDefinitions/<component-name>"
+         }
+       },
+       "PitchSystem3": {
+         "ComponentReference": "#/ComponentDefinitions/<component-name>",
+         "Blade": {
+           "ComponentReference": "#/ComponentDefinitions/<component-name>"
+         }
+       }
+     }
+   }
  }
}

This is the basic structure of a rotor only model, typically used in Aero Information and Performance Coefficient simulations.

rotor-assembly

The names of each component in the assembly tree are user-defined and do not hold any significance to the data model itself. As long as the connection nodes of different components are compatible with each other, the user can build a structure however they like. The name Blade could be renamed something else and the assembly would still have the same structure.

Model the IEA 15MW rotor

Now that you have a template set on your input file it is time to build a rotor using the existing component in your input file.

Locate the ComponentDefinitions property in your input file. Your editor might allow you to collapse the nodes on the input file so that you see only a list of the components available.

You should be able to see the following components:

{
...
  "ComponentDefinitions": {
    "IEA15Blade": {
      "ComponentType": "Blade",
      ...
    },
    "IEA15DrivetrainAndNacelle": {
      "ComponentType": "DrivetrainAndNacelle",
      ...
    },
    "IEA15Hub": {
      "ComponentType": "IndependentPitchHub",
      ...
    },
    "IEA15PitchSystem": {
      "ComponentType": "PitchSystem",
      "NumberOfBlades": 3,
      ...
    },
    "IEA15Tower": {
      "ComponentType": "Tower",
      ...
    },
    "IEA15Generator": {
      "ComponentType": "VariableSpeedGenerator",
      ...
    }
  }
}

Observe that the name of the component does not define what type the component is, or what properties it holds inside. The name of the component is arbitrary and user-defined, it is the ComponentType property that assure we are using a Blade, or a Tower, or any other component. So always check the component type before using a component to build your assembly.

To build a rotor all we need are an IndependentPitchHub, a PitchSystem and a Blade.

On the predefined template replace the <component-name> in each of the component references with the corresponding names of the components as they are named in the ComponentDefinitions:

{
  ...
  "Turbine":{
    ...
    "Assembly":{
      "_Template": "Rotor hub and blades",
      "Hub": {
        "_comment": "This is the single root node, for a hub component, under which 3 'child' nodes have been defined, modelling the pitch system and blades.",
-       "ComponentReference": "#/ComponentDefinitions/<component-name>",
+       "ComponentReference": "#/ComponentDefinitions/IEA15Hub",
        "PitchSystem1": {
          "_comment": "Each child node itself, references it's component, and can have an unbounded number of 'child' nodes.",
-         "ComponentReference": "#/ComponentDefinitions/<component-name>",
+         "ComponentReference": "#/ComponentDefinitions/IEA15PitchSystem",
          "Blade": {
-           "ComponentReference": "#/ComponentDefinitions/<component-name>"
+           "ComponentReference": "#/ComponentDefinitions/IEA15Blade"
          }
        },
        "PitchSystem2": {
-         "ComponentReference": "#/ComponentDefinitions/<component-name>",
+         "ComponentReference": "#/ComponentDefinitions/IEA15PitchSystem",
          "Blade": {
-           "ComponentReference": "#/ComponentDefinitions/<component-name>"
+           "ComponentReference": "#/ComponentDefinitions/IEA15Blade"
          }
        },
        "PitchSystem3": {
-         "ComponentReference": "#/ComponentDefinitions/<component-name>",
+         "ComponentReference": "#/ComponentDefinitions/IEA15PitchSystem",
          "Blade": {
-           "ComponentReference": "#/ComponentDefinitions/<component-name>"
+           "ComponentReference": "#/ComponentDefinitions/IEA15Blade"
          }
        }
      }
    }
  }
}

You will notice that you need to assign several times the same PitchSystem and the same Blade to the 3 IndependentPitchHub blade nodes. To check how to increase this number to 4 blades and to model different blades in the same rotor check the Modelling blades in JSON tutorial.

You now have a rotor that you should be able to run in Aero Information and Performance Coefficient simulations. Check the Setting up a Bladed simulation in JSON tutorial if you want to try running the rotor Performance Coefficients with the present assembly.

Model the IEA 15MW turbine

To model a basic turbine we will have to complete the assembly tree and add some extra components to it, namely a DrivetrainAndNacelle, a Tower and a VariableSpeedGenerator to the assembly tree. We will again reuse the components that are already available in the input file.

We will nest the already existing IEA15Hub assembly on the IEA15DrivetrainAndNacelle, and in turn the IEA15DrivetrainAndNacelle will be nested on the IEA15Tower.

The IEA15DrivetrainAndNacelle allows for two types of assembly nodes:

  • an IndependentPitchHub to be attached to the low speed shaft
  • a VariableSpeedGenerator to be attached the high speed shaft
    "Assembly": {
+     "Tower": {
+       "ComponentReference": "#/ComponentDefinitions/IEA15Tower",
+       "DrivetrainAndNacelle": {
+         "ComponentReference": "#/ComponentDefinitions/IEA15DrivetrainAndNacelle",
+         "Generator": {
+           "ComponentReference": "#/ComponentDefinitions/IEA15Generator"
+         },
          "Hub": {
            "ComponentReference": "#/ComponentDefinitions/IEA15Hub",
            "PitchSystem1": {
              "ComponentReference": "#/ComponentDefinitions/IEA15PitchSystem",
              "Blade1": {
                "ComponentReference": "#/ComponentDefinitions/IEA15Blade"
              }
            },
            "PitchSystem2": {
              "ComponentReference": "#/ComponentDefinitions/IEA15PitchSystem",
              "Blade2": {
                "ComponentReference": "#/ComponentDefinitions/IEA15Blade"
              }
            },
            "PitchSystem3": {
              "ComponentReference": "#/ComponentDefinitions/IEA15PitchSystem",
              "Blade3": {
                "ComponentReference": "#/ComponentDefinitions/IEA15Blade"
              }
            }
          }
        }
+     }
    }

turbine-assembly-diagram

You have now conclude the modelling of the IEA 15MW turbine. The file that you have produced should be identical to the NG_IEA_15_Onshore_SteadyOP.json file in the samples deck, but you might need to revert it back to a Steady Operational Loads simulation if you have attempted to run the rotor only case. Check the Setting up a Bladed simulation in JSON tutorial if need help running a Steady Operational Loads simulation.

Allow assembly connections between components

The assembly tree is very versatile but it still has constrains. Not all components can be attached together. For a comprehensive list of what components can be connected to each other please refer to the assembly allowed node connections modelling documentation article.

Try out different configurations and component names

You have now completed the tutorial and should be able to build a generic turbine of your own.

You might also want to try out some of the following:

  1. Experiment changing names of components in the ComponentDefinitions and interchanging different user defined components in the Assembly tree.

  2. Bladed Next Gen aims to be a much more versatile tool than the previous Bladed version, allowing for custom made turbine assembly structures. This is a work in progress, but you can check in the modelling documentation what are the allowed node connections between the supported components and build your own unique turbine.

  3. Another option is to try and model imbalances and yaw flow misalignment by defining blades with different properties for the same rotor (as seen in the Modelling blades in JSON tutorial), or using the generic translation and rotation components (as seen in the Model component displacements tutorial).

Conclusion

Concluding this tutorial you will now have enough knowledge to model a wind turbine in Bladed Next Gen. You will have understood what is the Assembly and how to build the assembly tree to model a turbine of your own. You will have understood how to place and interchange components and build bespoke turbine models.