DUST User Manual
DUST User Manual
Davide Montagnani
Matteo Tugnoli
Federico Fonte
Alberto Savino
Alessandro Cocco
Andrea Colli
Disclaimer
The present document refers to the state of the code developed by Politecnico di Milano for the collaboration
with A3 Airbus at the present date. All the specifications herein contained are subject to partial, substantial
or complete modifications in the near future. The aim of the present document is to provide an early reference
for the code usage and testing during the development phase and should not be considered in any form an
official document provided by Politecnico di Milano.
ii
Contents
Acronyms 1
1 Introduction 2
1.1 Workflow . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.2 Input Files format . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.3 Internal Binary Files format . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.4 Output Files format . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
2 Building DUST 5
3 DUST Preprocessor 6
3.1 Input file . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
3.2 Geometry file . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
3.2.1 Basic Mesh . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
3.3 Parametric mesh generation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
3.3.1 Surface panels and vortex lattices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
3.3.2 Airfoils sections geometry . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
3.3.3 Lifting lines . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
3.3.4 Hinged Surfaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
3.4 Pointwise mesh generation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
3.4.1 Hermitian splines . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
3.4.2 Limitations and errors in the pointwise definition of a component . . . . . . . . . . . . . 33
3.4.3 Bodies of Revolution . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
3.5 Trailing Edge . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
3.6 Actuator Disks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
5 DUST solver 45
5.1 Input file . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
5.2 Time Stepping . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
5.3 Models Parameters Choice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
5.4 Reference frames . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
5.5 Moving reference frames . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
5.6 Multiple reference frames . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
5.7 Dimensional Units . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
5.8 Debug Levels . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
5.9 Output Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
6 DUST Post-processor 69
6.1 Input file . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
6.2 Visualizations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
6.3 Integral loads . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
6.3.1 Output .dat file . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
6.4 Hinge Loads . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
6.4.1 Output .dat file . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
6.5 Probes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
6.5.1 Output .dat file . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
6.6 Flow Field . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
6.7 Sectional loads . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
6.7.1 Output .dat file . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
6.8 Chordwise Loads . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
6.8.1 Output .dat file . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
6.9 Aeroacoustics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
6.9.1 Output .dat file . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
1
Acronyms
VP Vortex Particle
VPM Vortex Particle Method
2
Chapter 1
Introduction
Dust is a flexible solution to simulate the aerodynamics of complex, non-conventional aircraft configuration.
It consists of three executables which are meant to perform preprocessing of the geometry, run the simulation
in the desired condition and then post-process the results obtained to gather the required meaningful data.
1.1 Workflow
The most typical workflow with DUST is illustrated in figure 1.1. The geometry of the solid bodies, in form
of CGNS mesh or parametric directive, must be provided to the preprocessor, which performs preliminary
operations and generates a binary geometry file.
Such file is provided, alongside the parameters for the simulation and the reference frames, to the solver, which
executes the simulation and produces the complete results inside binary files.
The produced results contain the complete solution obtained during the simulation, in terms of distribution
of singularities on body surfaces and wake. However it is difficult to obtain condensed, meaningful data from
such results.
For this reason it is possible to specify a variety of different analyses to be performed by the post-processor,
which employs the global results to generate a series of different meaningful results, from visualization and
flow fields to loads and loads distribution, in different formats.
All the input files, which are used to define parameters to the DUST executables, share the same flexible, free
format text files structure.
The files are simple text files, without any requirement on the extension, however the extension *.in is
recommended to distinguish the input
files inside the case folders. The different executables automatically look for the input file exe_name.in where
they are invoked.
An example of text input file is presented in file 1.1. input files employ loosely a Fortran syntax, and comprise
of a series of keyword assignments. The required keyword can generally be inserted in any order inside the
input file, and should be written according to the following rules:
Components
DUST Geometry Reference Frames
Mesh
preprocessor
DUST solver
Visualizations
DUST
DUST results
postprocessor
Processed data
value.
• Extra spaces and blank lines are ignored
• Comments are introduced with an exclamation mark "!", and can be introduced at the beginning of a
line, or after a valid keyword assignment.
• Strings are introduced as they are, without quotes, and will be automatically stripped of leading and
trailing spaces
• Integer and real numbers are introduced as usual, also with exponential notation
• Logical are introduced as "T" for true and "F" for false
• Arrays can be introduced with the Fortran notation: contained between brackets and slashes and with
elements separated by comas.
• Some keywords might be required to be contained inside a grouping keyword. It is a keyword which
contains another set of keywords inside curly brackets.
example_multiple = 1.3
example_multiple = 7.2 !some keywords can have multiple values
Regarding the number, position and compulsoriness of the keywords, depending on the keyword:
• Some keyword can be required and compulsory, some can be optional, in the sense that a default value is
employed if the keyword is not defined, and also can be required only in specific cases, according choices
made in other parameters (e.g. if the user requires a simulation to be restarted from file, should provide
the file name, otherwise the file name keyword can be neglected)
• Some keyword can be multiple: if the user should provide a list of a series of entities a keyword can be
repeated several times
• Some keyword, contrary to all the other, must be placed in precise relative position (before/after) another
keyword, due to the strong correlation of the parameters.
All the details on the parameters of the single files will be provided in the description of each input file in the
following chapters.
All the files that contain data, input geometry and results, which are not meant to be interpreted by the user
but are only for internal use, are written in binary hdf5 format.
The hdf5 format is a common open-source binary format which allows to store efficiently both in terms of size
and I/O speed a variety of data in a single file.
The standard extension for hdf5 files is .h5 and, even if it is not compulsory, should be added to the binary
filenames in the parameter when specified.
As previously discussed in section 1.1 the binary files results are not meant to be interpreted by the user (even
if the use of applications as hdfView can give a brief insight on some results). The post-processor can interpret
those results and output processed data readily employable by the user.
Most of the post-processed results can be obtained in Tecplot binary () format, which is compact and conve-
nient. However Tecplot is a proprietary software available only under license. For this reason all the results can
also be produced in the standard vtk format for visualizations (that can be opened by a variety of programs,
e.g. Paraview or visit) and formatted ascii files for line plots.
Ascii files are also employed for analyses which output a single set of values (which are not meant to be plotted)
and are convenient to be read inside automated execution loops.
5
Chapter 2
Building DUST
The building mechanism for DUST is currently under evolution in order to become more automated and
reliable, however it is not in final configuration.
For the current configuration refer to the file INSTALL in the root directory of the latest version of DUST.
6
Chapter 3
DUST Preprocessor
The DUST preprocessor is used to generate the geometrical components required to model the surfaces of the
analyzed body. It gathers the meshes of all the components required for the complete model, process them
when necessary and generates all the parametrically specified components.
The preprocessor is executed simply invoking the executable dust_pre in the desired folder. The input file
containing all the required information for the execution of the preprocessor must be passed as argument to
the command call. If not provided explicitly the preprocessor automatically tries to read the default input file
dust_pre.in.
dust_pre input_file_name.in
Command 3.1: Preprocessor command looking for input file input_file_name.in
dust_pre
Command 3.2: Preprocessor command looking for default input file dust_pre.in
The input file of the preprocessor specifies the geometrical components required for the model, their name and
the reference system to which they will be attached.
The format is the same as all the other input files, as already specified in section1.2.
comp_name = wing
geo_file = wing.in
ref_tag = Root01
tol_se_wing = 0.001
inner_product_te = -0.5
file_name = ./geo_input.h5
An example of the preprocessor input file is presented in file 3.1, while the detailed parameters are:
Chapter 3: DUST Preprocessor 7
• geo_file: required: at least one. multiple: yes. position: must be after comp_name. type: string.
Indicates the auxiliary input file which must be provided with the details on the mesh of the component.
It is a string with the path to the location of the file. In case of relative path the path is relative to the
location in which the preprocessor was called.
• ref_tag: required: at least one. multiple: yes. position: must be after geo_file. type: string
Provides a string tag which indicates the reference frame to which the geometrical component is attached.
Must correspond to one of the reference frames that will be provided to the solver.
• tol_se_wing: required: no. multiple: no. default: 0.001 type: real.
Define the global tolerance at which the mesh node are merged to identify the open trailing edges. More
details in section 3.5.
• inner_product_te: required: no. multiple: no. default: -0.5 type: real.
Define the global tolerance for the identification of trailing edges using the inner product of the normals.
• file_name: required: yes. multiple: no. type: string.
Define the name of the binary file which contains the geometry, to be used by the solver.
As discussed in section 1.3 the file, being a DUST internal file is in binary hdf5 format. The use of the .h5
extension is not compulsory in a unix environment, but is recommended to distinguish internal binary files
from input/output files in different formats.
The geometry file defines the parameters required to generate the geometry mesh of a component. Different
components, with different component names and attached to different reference frames, can have the same
geometry and hence use the same geometry file. A geometry file can be also use to define a parametric
geometry, but details on that case will be described in section 3.3. file 3.2 is an example of a geometry file for
a non parametric geometry.
mesh_symmetry = F
symmetry_point = (/0.0, 0.0, 0.0/)
symmetry_normal = (/0.0, 1.0, 0.0/)
mesh_mirror = F
mirror_point = (/0.0, 0.0, 0.0/)
mirror_normal = (/1.0, 0.0, 0.0/)
tol_se_wing = 0.001
inner_product_te = -0.5
proj_te = T
proj_te_dir = parallel
proj_te_vector = (/1.0, 0.0, 0.0/)
Chapter 3: DUST Preprocessor 8
suppress_te = F
section_name = cgns_comp_1
section_name = cgns_comp_2
• mesh_file: required: yes (if not parametric). multiple: no. type: string.
name of the file containing the mesh.
• mesh_file_type: required: yes. multiple: no. type: string
type of the mesh. Valid options at the moment are cgns for CGNS, parametric for parametrically
generated meshes and basic for ascii input meshes. The last is only for development purposes.
• el_type: required: yes. multiple: no. type: character.
type of the elements of the mesh. p stands for surface panels to model solid bodies, v stands for vortex
lattice elements used to model flat surfaces, l stands for lifting lines used to produce a 1D model of a
lifting surface (only for parametric input) and finally a stands for actuator disk, to produce a simple
model of a rotor (only for parametric input).
• mesh_symmetry required: no. multiple: no. default: false. type: logical.
Choose to reflect the mesh around a point and a direction. Useful to produce full meshes out of sym-
metrical half models. Keeps both the original and the symmetrical part.
• symmetry_point: required: only if mesh_symmetry is true. multiple: no. default: (0.0, 0.0, 0.0). type:
real array, length 3.
point around which to reflect the mesh.
• symmetry_normal: required: only if mesh_symmetry is true. multiple: no. default: (0.0, 1.0, 0.0). type:
real array, length 3.
Direction in which to reflect the mesh.
• mesh_mirror required: no. multiple: no. default: false. type: logical.
Choose to mirror the mesh around a point and a direction. Same as mesh_symmetry but does not keep
both the original, i.e. the mesh is not doubled.
• mirror_point: required: only if mesh_mirror is true. multiple: no. default: (0.0, 0.0, 0.0). type: real
array, length 3.
point around which to mirror the mesh.
• mirror_normal: required: only if mesh_mirror is true. multiple: no. default: (0.0, 1.0, 0.0). type: real
array, length 3.
Direction in which to mirror the mesh.
• tol_se_wing: required: no. multiple: no. default: 0.001 type: real.
Tolerance in trailing edge merging of nodes. Override for the single component the value defined (or the
default value) in the main input file to the preprocessor. Warning: the default value is not employed if
the same parameter is defined (and not left default) in file 3.1.
• inner_product_te: required: no. multiple: no. default: -0.5 type: real Tolerance for the identification
of trailing edges using the inner product of the normals. Override for the single component the value
defined (or the default value) in the main input file to the preprocessor. Warning: the default value is
not employed if the same parameter is defined (and not left default) in file 3.1.
Chapter 3: DUST Preprocessor 9
r = Scaling(rloaded + of f set)
The basic mesh input is an extremely simplified way to provide a surface mesh providing just the the position
of points and point-element connectivity.
When employing the basic way of input, the preprocessor expects two ascii files containing the points location
and connectivity. If the parameter mesh_file was set to /path/to/mesh/ the preprocessor expects the point
locations to be in /path/to/mesh/rr.dat and the connectivity in /path/to/mesh/ee.dat 1
The points coordinates must be provided in the rr.dat file as three floating point numbers each row, for a
total of np rows, where np is the number of points in the mesh. The three numbers represent the x, y and z
coordinates of each point (in the local reference frame).
The connectivity must be provided in the ee.dat file as four integer numbers each row, for a total of ne rows,
where ne is the total number of elements. Each row represents an element and the integers are the indices of
the points forming the element, starting from one, in the order in which they were provided in the rr.dat file.
Elements can be both quadrangular or triangular, in case of triangular elements use a 0 as the fourth index.
The order in which the points are listed in each element defines it normal, according to the right-handed
screw rule. Neighboring elements must not have opposing normals, and in three dimensional surface panels
the normals direction should be outward from the body.
1 Note that the preprocessor just add the suffix ee.dat and rr.dat to the basename, one can have different basic mesh
files in a folder by giving them different prefixes and providing the path with the prefix to the input file, e.g mesh_file =
/path/to/mesh/file_name_ will look for /path/to/mesh/file_name_rr.dat and /path/to/mesh/file_name_ee.dat
Chapter 3: DUST Preprocessor 10
Two examples of basic mesh generation via scripting. The MATLAB/OCTAVE scripts to generate
the rectangular wing and the cylindrical ellipsoidal tank shown in figure 3.1 are shown in this paragraph as an
example of basic mesh generation along with the rr.dat, ee.dat files generated by the scripts to be read by
DUST as input files.
3 5
2
3
2
1
0 0
z
-1
-1
-2
-3
-2
6 -4 5
4
-3 5 -5 3
-3 -6 2
4
-2 1
-4
-1 3 0
-2
0 -1
2 0
1 -2
2 2 -3
1
3 y 4 -4
x
4 0 6 -5
Figure 3.1: Components defined by means of basic mesh generations in the examples: wing and tank.
The following script 3.3 relies on the function setAirfoil4() to define the two-dimensional airfoils and builds
the basic input files for DUST of a rectangular wing with open tips.
%> the tot. number of elems for a 3d panel component (’p’ in dust) is
n_elems = (n_span_el)*(2*n_chord_el) ;
%> the tot. number of points for a 3d panel component (’p’ in dust) is
n_points_per_sec = 2*n_chord_el+1 ;
Chapter 3: DUST Preprocessor 11
%> vector of spanwise coord.s of the airfoil sections: uniform spacing, here
y_sec = linspace(0,span,(n_span_el+1)) ;
ie = ie + 1 ;
ee(ie,:) = [ i_sec *n_points_per_sec+i_p , ...
i_sec *n_points_per_sec+i_p+1 , ...
(i_sec-1)*n_points_per_sec+i_p+1 , ...
(i_sec-1)*n_points_per_sec+i_p ] ;
end
end
% === check the connectivity with the Patch plot routine ===
% patch has rr,ee arrays as inputs --> easy way to check the rr,ee arrays
figure ; grid on ; axis equal
patch(’Vertices’,rr,’Faces’,ee,’FaceColor’,’none’)
The files 3.4 and 3.5 are respectively the rr.dat and ee.dat files produced by the wing.m script.
Chapter 3: DUST Preprocessor 12
input file 3.4: rr.dat created by wing.m input file 3.5: ee.dat file created by wing.m
1.0000 0 -0.0013 12 13 2 1
0.9045 0 -0.0139 13 14 3 2
0.6545 0 -0.0409 14 15 4 3
0.3455 0 -0.0596 15 16 5 4
0.0955 0 -0.0460 16 17 6 5
0 0 0 17 18 7 6
0.0955 0 0.0460 18 19 8 7
0.3455 0 0.0596 19 20 9 8
0.6545 0 0.0409 20 21 10 9
0.9045 0 0.0139 21 22 11 10
1.0000 0 0.0013 23 24 13 12
1.0000 1.0000 -0.0013 24 25 14 13
0.9045 1.0000 -0.0139 25 26 15 14
0.6545 1.0000 -0.0409 26 27 16 15
0.3455 1.0000 -0.0596 27 28 17 16
0.0955 1.0000 -0.0460 28 29 18 17
0 1.0000 0 29 30 19 18
0.0955 1.0000 0.0460 30 31 20 19
0.3455 1.0000 0.0596 31 32 21 20
0.6545 1.0000 0.0409 32 33 22 21
0.9045 1.0000 0.0139 34 35 24 23
1.0000 1.0000 0.0013 35 36 25 24
1.0000 2.0000 -0.0013 36 37 26 25
0.9045 2.0000 -0.0139 37 38 27 26
0.6545 2.0000 -0.0409 38 39 28 27
0.3455 2.0000 -0.0596 39 40 29 28
0.0955 2.0000 -0.0460 40 41 30 29
0 2.0000 0 41 42 31 30
0.0955 2.0000 0.0460 42 43 32 31
0.3455 2.0000 0.0596 ...
0.6545 2.0000 0.0409 69 70 59 58
0.9045 2.0000 0.0139 70 71 60 59
1.0000 2.0000 0.0013 71 72 61 60
1.0000 3.0000 -0.0013 72 73 62 61
0.9045 3.0000 -0.0139 73 74 63 62
... 74 75 64 63
0.9045 6.0000 0.0139 75 76 65 64
1.0000 6.0000 0.0013 76 77 66 65
The following script 3.6 builds the basic input files for DUST of a ellipsoidal tank with cylindrical sections.
% sec.1 .2 .3 .4
% =========================================================================== %
clear all ; clc ; close all
%> the tot. number of elems for a 3d panel component (’p’ in dust) is
n_elems = n_radial_el * (n_axial_sec+1) ;
%> the tot. number of points for a 3d panel component (’p’ in dust) is
n_points_per_sec = n_radial_el ;
n_points = ...
n_points_per_sec*n_axial_sec + 2 ; % + 2: for the extreme points
%> update counter and find the th angle describing the polar coord
ir = ir + 1 ;
th = 2*pi*(i_p-1) / n_points_per_sec ;
end
end
%> update rr with the first and last point
rr = [ [ 0.0, -a, 0.0 ] ; rr(1:ir,:) ; [ 0.0, a, 0.0 ] ] ;
ie = ie + 1 ;
ee(ie,1:3) = [ 1 , 1+i_p , 1+mod(i_p,n_points_per_sec)+1 ] ;
end
ie = ie + 1 ;
ee(ie,:) = int32([ 1+(i_sec-1)*n_points_per_sec+ i_p , ...
1+ i_sec *n_points_per_sec+ i_p , ...
1+ i_sec *n_points_per_sec+ mod(i_p,n_points_per_sec)+1 , ...
1+(i_sec-1)*n_points_per_sec+ mod(i_p,n_points_per_sec)+1 ]);
end
end
ie = ie + 1 ;
ee(ie,1:3) = int32([1+(n_axial_sec-1)*n_points_per_sec+i_p , ...
n_points , ...
1+(n_axial_sec-1)*n_points_per_sec+mod(i_p,n_points_per_sec)+1]);
end
% === check the connectivity with the Patch plot routine ===
% patch has rr,ee arrays as inputs --> easy way to check the rr,ee arrays
%> patch does not allow 0 indices in ee -> substitute 4th zero el with 3rd el
for ie = 1 : n_elems
if ( ee(ie,4) == 0 ) ; ee(ie,4) = ee(ie,3) ; end
end
The files 3.7 and 3.8 are respectively the rr.dat and ee.dat files of the ellipsoidal tank, generated by the
tank.m script 3.6.
Chapter 3: DUST Preprocessor 15
input file 3.7: rr.dat file created by tank.m input file 3.8: ee.dat file created by tank.m
0 -5.0000 0 1 2 3 0
0.4339 -4.5048 0 1 3 4 0
0.3068 -4.5048 0.3068 1 4 5 0
0.0000 -4.5048 0.4339 1 5 6 0
-0.3068 -4.5048 0.3068 1 6 7 0
-0.4339 -4.5048 0.0000 1 7 8 0
-0.3068 -4.5048 -0.3068 1 8 9 0
-0.0000 -4.5048 -0.4339 1 9 2 0
0.3068 -4.5048 -0.3068 2 10 11 3
0.8467 -2.6602 0 3 11 12 4
0.5987 -2.6602 0.5987 4 12 13 5
0.0000 -2.6602 0.8467 5 13 14 6
-0.5987 -2.6602 0.5987 6 14 15 7
-0.8467 -2.6602 0.0000 7 15 16 8
-0.5987 -2.6602 -0.5987 8 16 17 9
-0.0000 -2.6602 -0.8467 9 17 10 2
0.5987 -2.6602 -0.5987 10 18 19 11
1.0000 0.0000 0 11 19 20 12
0.7071 0.0000 0.7071 12 20 21 13
0.0000 0.0000 1.0000 13 21 22 14
-0.7071 0.0000 0.7071 14 22 23 15
-1.0000 0.0000 0.0000 15 23 24 16
-0.7071 0.0000 -0.7071 16 24 25 17
-0.0000 0.0000 -1.0000 17 25 18 10
0.7071 0.0000 -0.7071 18 26 27 19
0.8467 2.6602 0 19 27 28 20
0.5987 2.6602 0.5987 20 28 29 21
0.0000 2.6602 0.8467 21 29 30 22
-0.5987 2.6602 0.5987 22 30 31 23
-0.8467 2.6602 0.0000 23 31 32 24
-0.5987 2.6602 -0.5987 24 32 33 25
-0.0000 2.6602 -0.8467 25 33 26 18
0.5987 2.6602 -0.5987 26 34 35 27
0.4339 4.5048 0 27 35 36 28
0.3068 4.5048 0.3068 28 36 37 29
0.0000 4.5048 0.4339 29 37 38 30
-0.3068 4.5048 0.3068 30 38 39 31
-0.4339 4.5048 0.0000 31 39 40 32
-0.3068 4.5048 -0.3068 32 40 41 33
-0.0000 4.5048 -0.4339 33 41 34 26
0.3068 4.5048 -0.3068 34 42 35 0
0 5.0000 0 35 42 36 0
36 42 37 0
37 42 38 0
38 42 39 0
39 42 40 0
40 42 41 0
41 42 34 0
Chapter 3: DUST Preprocessor 16
The parametric mesh generation has the aim of allowing the generation of slender bodies, mainly wings, to
be generated parametrically in the preprocessor with few directives, without resorting to an external mesh
generator.
To generate the parametric geometry a geometry input file to be referenced in the preprocessor input file 3.1
is employed. The input file is similar to the geometry files for standard meshes described in file 3.2
scaling_factor = 1.0
offset = (/0.0, 0.0, 0.0/)
airfoil_table_correction = T
mesh_symmetry = F
symmetry_point = (/0.0, 0.0, 0.0/)
symmetry_normal = (/0.0, 1.0, 0.0/)
mesh_mirror = F
mirror_point = (/0.0, 0.0, 0.0/)
mirror_normal = (/1.0, 0.0, 0.0/)
twist_linear_interpolation = F
starting_point = (/0.0,0.0865,0.0/)
reference_chord_fraction = 0.0
!mesh_flat = T
nelem_chord = 10
type_chord = cosineLE
! First section
chord = 1.0
twist = -1.0
airfoil_table = ./airfoils/naca0012.c81
airfoil = NACA0012
! First region
span = 0.5
sweep = 0.0
dihed = 0.0
nelem_span = 3
type_span = uniform
! Second section
chord = 1.0
twist = 0.0
airfoil = interp
Chapter 3: DUST Preprocessor 17
! Second region
span = 4.0
sweep = 10.0
dihed = 5.0
nelem_span = 10
type_span = uniform
! Third section
chord = 0.5
twist = 0.0
airfoil_table = ./airfoils/naca0012.c81
airfoil = NACA0012
The parametric geometry is obtained by connecting with a surface different planar sections. With the planar
sections the user defines the shape of the section, the chord and the twist of the section. Then sections are
connected by regions, with which the number of span panels, span, dihedral and sweep are defined. The
user can define an arbitrary number ns of sections, which must then be connected with ns − 1 regions. A
representation of sections and regions employed for the generation of a wing is presented in Fig. 3.2. The body
is generated from the first section, starting from the specified starting point, and it is extruded along the y
axis, with the x axis pointing from the leading edge towards the trailing edge and the z axis normal to the
x-y plane. The type of geometry generated depends on the type of elements required. If surface panels are
required the full three dimensional geometry will be generated, if vortex lattice elements are required only the
flat, mean line surface will be generated and finally if lifting line elements are required only a one dimensional
line will be generated. Finally the mirroring of the geometry introduced for user generated meshes is available
also for parametric geometries.
All the detailed parameters of the geometry input file for parametric geometry are:
r = Scaling(rloaded + of f set)
• symmetry_point: required: only if mesh_reflection is true. multiple: no. default: (0.0, 0.0, 0.0). type:
real array, length 3.
point around which to reflect the mesh.
• symmetry_normal: required: only if mesh_reflection is true. multiple: no. default: (0.0, 1.0, 0.0).
type: real array, length 3.
Direction in which to reflect the mesh.
• mesh_mirror required: no. multiple: no. default: false. type: logical.
Choose to mirror the mesh around a point and a direction. Same as mesh_symmetry, but does not keep
both the original, i.e. the mesh is not doubled.
• mirror_point: required: only if mesh_reflection is true. multiple: no. default: (0.0, 0.0, 0.0). type:
real array, length 3.
point around which to mirror the mesh.
• mirror_normal: required: only if mesh_reflection is true. multiple: no. default: (0.0, 1.0, 0.0). type:
real array, length 3.
Direction in which to mirror the mesh.
• twist_linear_interpolation required: no. multiple: no. default: false. type: logical.
Choose to apply linear interpolation to the twist angle, instead of interpolating the point coordinates
between two neighboring sections defined in the input file.
• starting_point required: no. multiple: no. default: (/ 0.0, 0.0, 0.0 /) type: real array, length 3.
point in the local reference frame in which to start extruding the parametric geometry.
• span required: at least one, in same number as chord-1 multiple: yes. type: real.
Define the span length of the region between two sections.
• sweep required: in same number as span multiple: yes. type: real.
Angle of sweep of the region, positive if swept backwards (towards positive x).
The concept of sections and regions is illustrated in figure 3.2. Furthermore an example to understand the
geometrical role of the parameters in the input file is presented in file 3.10 and figure 3.3.
When generating the parametric geometry, the slender body is generated starting from the starting_point
and then develops in the y direction (in the local reference frame of the component), with deviations induced
by the various angles used as input.
From the starting_point a segmented reference line is created, in blue in figure 3.3. Each segment, which
creates a region as in figure 3.2, is created from the previous node, is long span and is angled from the local
component y direction of dihed dihedral angle with respect to the horizontal plane (rotating around the local
x axis, positive upward, red in the figure) and of sweep angle with respect to the vertical plane (rotating
around the local z axis, positive backward towards x, green in figure).
Then on each node the airfoil section is applied, 2 dimensional for surface panels (as in figure) mono dimensional
for vortex lattices (lifting lines will be discussed afterwards). The section is collocated so that the reference
line passes through a certain reference_chord_fraction of the airfoil chord. Then the section is rotated
around such point of a twist angle (around the component local y axis, positive when creating a positive pitch
to the airfoils, in magenta in the figure).
Finally all the sections are connected with the appropriate number of elements, as shown in figure 3.2.
ction
rd e
3 S
ion
nd Reg
2
gion
st e
1 R
Mirror
z
tion y x
nd Sec
2 n
tio
1
st Sec
el_type = p
nelem_chord = 10
type_chord = uniform ! uniform cosineLE cosineTE
scaling_factor = 1.0
offset = (/0.0, 0.0, 0.0/)
starting_point = (/0.0,0.0,0.0/)
reference_chord_fraction = 0.25
! section 1
chord = 2.0
twist = 20.00
airfoil = NACA0012
! region 1
span = 1.5
sweep = 0.0
dihed = 0.0
nelem_span = 15
type_span = uniform
! section 2
chord = 1.5
twist = 15.0
airfoil = NACA0012
! region 2
span = 5.0
sweep = 0.0
dihed = 5.0
nelem_span = 50
type_span = uniform
Chapter 3: DUST Preprocessor 21
Sweep
Dihedral
Twist
z y
Figure 3.3: Generation logic of the geometry of parametric elements, generated from input file 3.10
! section 3
chord = 1.5
twist = 0.0
airfoil = NACA0012
! region 3
span = 2.0
sweep = 15.0
dihed = 0.0
nelem_span = 20
type_span = uniform
! section 4
chord = 1.0
twist = -5
airfoil = NACA0012
The airfoils sections, introduced with the keyword airfoil, as previously discussed, can be introduced either
by specifying a NACA airfoil shape, or by providing a two dimensional geometry using an ascii file. In both
cases the resulting number of points in the section is the one defined in nelem_chord, with the distribution
specified in type_chord.
In case of NACA airfoils, only 4 digits NACA airfoils and some 5 digits ones are implemented. When surface
panels are employed the full shape is discretized, while when employing vortex lattices only the camber line is
used to discretize the surface.
In case of user provided geometry, the geometry must be provided as an ascii file with the coordinates used
to describe the shape to be discretized. To mark the use of the user-defined shape the file name must have
the extension .dat. The first line of the file must contain a single integer, which represents the number of
points used to describe the shape, and thus the number of following lines. The next lines must contain two
Chapter 3: DUST Preprocessor 22
real numbers on each line, representing the x and y coordinates of each point. The horizontal, streamwise x
axis points towards the trailing edge, and the vertical y axis points upwards.
The order in which the points are provided defines the direction of the curve that defines the shape of the
airfoil. The curve must start at the trailing edge, pass from the lower side of the airfoil, the leading edge, the
upper side and end again at the trailing edge. The first and last point can be not coinciding, to generate an
open trailing edge. In case of vortex lattices, the mean line is automatically computed.
The input is assumed to be normalized to have an unit chord, the final chord of the geometry will be generated
by multiplying by the chord parameter the coordinates (thus if the geometry provided is not normalized to
have a unit chord, the actual chord obtained will be different from the value specified in chord).
An example of user prescribed airfoil shape is provided in file 3.11.
input file 3.11: Example of user specified airfoil shape (the middle lines have been suppressed for brevity)
72
1.0 0.0
0.996103 -1.3540067E-4
0.984179 -3.5814368E-4
0.964464 -1.693276E-4
0.937582 -5.391884E-4
0.904605 -0.0017722012
0.866738 -0.0038649566
...
...
...
0.948453 0.013156898
0.96962 0.0077201095
0.985778 0.00345874
0.996349 8.9363643E-4
1.0 0.0
The geometrical logic for the generation of lifting lines is similar to the one for surface panels or vortex lattices,
and differs in only few details. An example of the same geometry defined in file 3.10 and depicted in Fig. 3.3 but
generated as lifting lines is presented in Fig. 3.4. When employing lifting lines the reference line is generated
starting from the starting_point exactly in the same way as in the other cases, however in this case this
line is the one that will become the lifting line. From the lifting line a single panel is generated to represent
the object surface, and implicitly the first wake panel. The panel is long 75% of the indicated chord, and
it is angled according to the twist angle set in the input. Therefore note that in case of lifting lines the
lifting line is essentially always placed at 25% of the ideal airfoil it should represent, and that the parameter
reference_chord_fraction is ignored.
Finally it is important to stress that the reference frames introduced in the present section concerning the
generation of parametric components are local to those component, and are required only to assign coordinates
to the points generated parametrically, just as a mesh generated from CAD files and an external meshing tool
will generate points in a certain reference frame. The actual position of the component in space during the
simulation depends on the reference frame in which the component will be introduced. Reference frames
employed during the simulation are discussed in section 5.4.
The .c81 file format is a format for storing aerodynamic coefficients of 2D airfoils as a function of Mach
number, Angle of Attack and Reynolds number. An example of such a file is provided in file 3.12.
Chapter 3: DUST Preprocessor 23
Sweep
Lifting Line
Dihedral
Starting Point
Twist
75% Chord
z y
4. DUMMY LINE
Following lines contain the tables of the aerodynamic coefficients for each Reynolds number:
2. DUMMY <white spaces> "%30s%2d%2d%2d%2d%2d%2d" where the first 30 chars are a title string (ig-
nored), followed by 6 consecutive two-digit integers that indicate:
• the number ML of Mach points for Cl (here 06);
• the number NL of angle of attack points for Cl (here 61);
• the number MD of Mach points for Cd (here 06);
• the number ND of angle of attack points for Cd (here 61);
• the number MM of Mach points for Cm (here 06);
• the number NM of angle of attack points for Cm (here 61).
3. tables of aerodynamic coefficients of the 2D aerodynamic airfoil as functions of Mach numbers (cols) and
Angle of Attack (rows) (from −180◦ to 180◦ ):
(a) first table: CL
(b) second table: CD
(c) third table: CM
4. DUMMY LINE
5. 2nd Reynolds number (here 5000000), DUMMY
6. Follows the same structure as the first Reynolds number
Remark: each element of the aerodynamic table is separated by a white space in free format in a single. In
MBDyn, the format of each following line is up to 10 fields of 7 chars each; records longer than 10 fields are
broken on multiple lines, with the first field filled with blanks.
It is possible to introduce one or more movable surfaces in the parametric definition of a wing. As outlined
by the scheme in Fig. 3.5 left, in a two-dimensional problem the control surface can be defined in the local
reference frame of the component, by means of the hinge axis position H, the chordwise direction ξ and a
blending region [−u, u] (defined by hinge_offset parameter)introduced to avoid irregular behavior of the
mesh along with the rotation angle θ. Three regions are defined using the coordinates defined through this
reference frame:
h
B
ydust
xdust
mesh_symmetry = T
symmetry_point = (/0.0 , 0.0, 0.0/)
symmetry_normal = (/0.0 , 1.0, 0.0/)
nelem_chord = 15
type_chord = cosineLE ! uniform cosineLE cosineTE
starting_point = (/0.0,0.0,0.0/)
reference_chord_fraction = 0.25
n_hinges = 2
hinge = {
hinge_tag = aileron_right
hinge_nodes_input = parametric ! or from_file
node_1 = (/ 1.4178, 1.4557, 0.3473/) ! In the local ref.frame
node_2 = (/ 2.4026 , 3.1615 , 0.6946/)
n_nodes = 2
! }
! hinge_nodes_input_from_file = {
! node_file = hinge_node.dat
! }
hinge_ref_dir = (/ 1.0, 0.0 , 0.0 /)
hinge_offset = 0.1
hinge_spanwise_blending = 0.01
hinge_rotation_input = function:sin
hinge_rotation_function = {
amplitude = 30.0 ! deg
omega = 12.5 ! rad/sec
phase = 0.0 ! deg
}
hinge = {
hinge_tag = aileron_left
hinge_nodes_input = parametric
node_2 = (/ 1.4178, -1.4557, 0.3473/)
node_1 = (/ 2.4026 , -3.1615 , 0.6946/)
n_nodes = 2
! }
! hinge_nodes_input_from_file = {
! node_file = hinge_node.dat
! }
hinge_ref_dir = (/ 1.0, 0.0 , 0.0 /)
Chapter 3: DUST Preprocessor 27
hinge_offset = 0.1
hinge_adaptive_mesh = T
hinge_merge_tol = 0.01
hinge_spanwise_blending = 0.01
hinge_rotation_input = function:sin
hinge_rotation_function = {
amplitude = -30.0 ! deg
omega = 12.5 ! rad/sec
phase = 0.0 ! deg
}
! First section
chord = 2
twist = 0.0
airfoil = NACA0012
! First region
span = 5.0
sweep = 30.0
dihed = 10.0
nelem_span = 20
type_span = uniform
! Second section
chord = 2
twist = 0.0
airfoil = NACA0012
All the detailed parameters of the Hinged surfaces input file are:
The pointwise mesh definition extends the capabilities of the parametric input. First, the reference line of
the component is defined as a list of points connected with straight lines or Hermitian splines. The sections
of a component are defined at each input points by means of their plane coordinates, their dimensions and
rotation around an axis perpendicular to their own plane. The input file is mainly composed of three sections:
a generic section for the types of the aerodynamic elements and the symmetry and mirroring options, a section
for the point list and a section for the Line. The parameters of the first section are very similar to the ones
used in the parametric description, except for the starting_point, that is not needed here, since the point
with Id= 1 is meant to be the first point of the reference line.
An example of input file for pointwise-defined component is provided in file 3.14. The description of this file
and all the parameters follows.
Chapter 3: DUST Preprocessor 29
mesh_symmetry = T
symmetry_point = (/0.0,0.0,0.0/)
symmetry_normal = (/0.0,1.0,0.0/)
mesh_mirror = F
mirror_point = (/0.0,0.0,0.0/)
mirror_normal = (/0.0,1.0,0.0/)
reference_chord_fraction = 0.0
mesh_flat = F
nelem_chord = 20
type_chord = cosineLE
chord = 0.4
twist = 0.0
section_normal = y_axis_neg
flip_section = T
}
point = {
id = 6
coordinates = (/ 3.5 , 0.0 , 1.5 /)
airfoil = NACA2412
chord = 1.0
twist = 5.0
section_normal = y_axis_neg
flip_section = T
}
Line(2)%TangentVec2
(optional)
5 6
Line(3): Straight
Line(2): Spline 4
3
Line(2)%TangentVec1
(optional)
2
z Line(1): Straight
y x
Figure 3.7: Pointwise definition of a component: reference line by points and Lines connecting them.
NormalVector = yAxisNeg
FlipSection = T (default:F)
NormalVector = referenceLine
xsection
(default)
Line%Nelems = 5 xsection
Point%NormalVector = 5 6
= referenceLine (default) ysection
4
ysection
3 Points% NormalVector = yAxisNeg
ysection
NormalVector = yAxis
Twist = [deg]
2 ysection xsection
y x
Figure 3.8: Pointwise definition of a component: section parameters (airfoil, chord, twist, section_-
normal) at points of the reference line and the number nelems of elements along the reference line for each
line. The parameter flip_section can be set to .true. in order to flip the y-coordinate of the airfoil, in the
section reference frame: the comparison between the geometry with flip_section equal to F or T at point
with id = 5, 6 is shown in the picture for a non-symmetrical airfoil.
type of the elements of the mesh. p stands for surface panels to model solid bodies, v stands for vortex
lattice elements used to model flat surfaces, l stands for lifting lines used to produce a 1D model of a
lifting surface.
• mesh_symmetry required: no. multiple: no. default: false. type: logical.
Choose to reflect the mesh around a point and a direction. Useful to produce full meshes out of sym-
metrical half models. Keeps both the original and the symmetrical part.
• symmetry_point: required: only if mesh_reflection is true. multiple: no. default: (0.0, 0.0, 0.0). type:
real array, length 3.
point around which to reflect the mesh.
• symmetry_normal: required: only if mesh_reflection is true. multiple: no. default: (0.0, 1.0, 0.0).
type: real array, length 3.
Direction in which to reflect the mesh.
• mesh_mirror required: no. multiple: no. default: false. type: logical.
Choose to mirror the mesh around a point and a direction. Same as mesh_symmetry, but does not keep
both the original, i.e. the mesh is not doubled.
• mirror_point: required: only if mesh_reflection is true. multiple: no. default: (0.0, 0.0, 0.0). type:
real array, length 3.
point around which to mirror the mesh.
• mirror_normal: required: only if mesh_reflection is true. multiple: no. default: (0.0, 1.0, 0.0). type:
real array, length 3.
Direction in which to mirror the mesh.
Chapter 3: DUST Preprocessor 32
A list of point groups follows. These points are used to describe the reference line of the component. The
parameters of a point element are:
A list of line groups follows. These lines are used to build the reference line of the component connecting the
points defined above. The parameters of a line element are:
Chapter 3: DUST Preprocessor 33
where hi (t), i = 0 : 3 are the Hermitian functions, the points ri are the points to be interpolated, di the
approximation of the derivatives at the interpolation points. For the interior points of a spline,
The bias parameter is a weight on the finite difference computed using forward and backward differences,
while tension acts like a tensile action on the spline, see figure 3.9.
• if mesh_symmetry = T, the last section of the component can be joined only if the first section is joined.
A workaround is to flip the order of the points and reverse the direction of the reference line, in order
to have the first section corresponding to the previously defined last section and viceversa, so that the
desired sections are joined. No limitation exists if both the first and last sections belong to the symmetry
plane and are joined.
Chapter 3: DUST Preprocessor 34
Figure 3.9: Influence of the tension parameter on the shape of the spline interpolating points (0, 0), (1.5, 1.5)
(0, 3), with prescribed horizontal derivatives at the end points.
• it is not possible to join two consecutive splines lines. So far, splines are meant to join straight lines
or to be the first or last line. However a single spline can be used to join an arbitrary number of points.
• it is not possible to define the first or last line as a spline, without providing the tangent vector at
the free end, i.e. the tangent_vec1 must be provided to the first line, tangent_vec2 to the last line.
spline routines have the capability to treat free ends, with second derivative equal to zero, but some
modifications in the pointwise definition of a component are still needed to allow for free ends.
A simple parametric mesh generation to create bodies of revolution is available. With this type of input is
possible to generate bodies by revolving an user provided profile or cylindrical bodies with smooth tapered
ends only with parametric inputs. An example of input file for this kind of parametric input is available in file
mesh_symmetry = T
symmetry_point = (/0.0,0.0,0.0/)
symmetry_normal = (/0.0,1.0,0.0/)
mesh_mirror = F
mirror_point = (/0.0,0.0,0.0/)
mirror_normal = (/0.0,1.0,0.0/)
!mesh_file = rev_profile.dat
rev_length = 5.0
rev_nose_radius = 1.0
rev_radius = 0.7
rev_nelem_long = 30
rev_nelem_rev = 10
Chapter 3: DUST Preprocessor 35
• symmetry_point: required: only if mesh_reflection is true. multiple: no. default: (0.0, 0.0, 0.0). type:
real array, length 3.
point around which to reflect the mesh.
• symmetry_normal: required: only if mesh_reflection is true. multiple: no. default: (0.0, 1.0, 0.0).
type: real array, length 3.
Direction in which to reflect the mesh.
• mesh_mirror required: no. multiple: no. default: false. type: logical.
Choose to mirror the mesh around a point and a direction. Same as mesh_symmetry but does not keep
both the original, i.e. the mesh is not doubled.
• mirror_point: required: only if mesh_reflection is true. multiple: no. default: (0.0, 0.0, 0.0). type:
real array, length 3.
point around which to mirror the mesh.
• mirror_normal: required: only if mesh_reflection is true. multiple: no. default: (0.0, 1.0, 0.0). type:
real array, length 3.
Direction in which to mirror the mesh.
• mesh_file: required: no. multiple: no. type: string.
name of an ascii file containing the point list describing the curve or profile to revolve, which will be
revolved around the local x axis. If the input is present, the rest of the inputs are neglected and the
body is built revolving the provided profile, otherwise if mesh_file is not present, the parametric input
is employed
• rev_length: required: yes if mesh_file is not present. multiple: no. type: real.
Length of the parametric body of revolution, from tip to tip.
• rev_nose_radius: required: yes if mesh_file is not present. multiple: no. type: real.
radius of the smooth circular tapering at the ends of the cylindrical body of revolution
• rev_radius: required: yes if mesh_file is not present. multiple: no. type: real.
radius of the central cylindrical section of the body of revolution
• rev_nelem_long: required: yes if mesh_file is not present. multiple: no. type: integer.
Number of elements in the longitudinal direction of the body of revolution
• rev_nelem_rev: required: yes. multiple: no. type: integer.
Number of elements in the revolution direction.
Chapter 3: DUST Preprocessor 36
The trailing edge is the line from which the wake is shed from the geometry elements. It is meant to represent
the location where the thin vortical layer leaves a lifting body when the boundary layer is still attached. In
the DUST preprocessor the trailing edge is identified geometrically, possibly according to a set of parameters.
In case of parametrically generated elements, which represent extruded airfoils, the trailing edge is simply gen-
erated connecting all the trailing edge of the two (or mono) dimensional sections that compose the parametric
geometry.
In case of unstructured surface meshes, the preprocessor proceeds by trying to geometrically identify the
trailing edge in sharp corners between elements.
Considering the (rather common) possibility that the trailing edges are left open, i.e. with element edges
not geometrically connected and/or not logically connected in the connectivity, first the DUSTpreprocessor
merges the close nodes and generates an alternative connectivity taking into account the new connections. This
merging is just functional to the definition of the trailing edge, and will be discarded after the trailing edge had
been identified. To control the merging, the parameter tol_se_wing can be declared in the preprocessor input
file, to be applied globally, or in each (or some) single geometry input file to be applied to a single component.
Each pair of nodes separated by a distance lower than tol_se_wing will be merged in this phase.
After merging the mesh the new connectivity will be employed to identify the edges belonging to the trailing
edge. The edges between two elements whose normal vectors are sufficiently opposed are marked as trailing
edge. In particular, the edge connecting the elements i and j is a trailing edge if
Actuator disks are built employing a parametric input file just as file 3.9 but with different parameters, shown
in file 3.16
radius = 2.5
nstep = 20
axis = 3
traction = 10.0
All the detailed parameters of the geometry input file for parametric actuator disks are:
Chapter 3: DUST Preprocessor 37
Chapter 4
4.1 Introduction
The communication between DUST and MBDyn is managed by preCICE (Precise Code Interaction Coupling
Environment), a coupling library for partitioned multi-physics simulations, originally developed for fluid-
structure interaction and conjugate heat transfer simulations. preCICE offers methods for transient equation
coupling, communication means, and data mapping schemes. It is written in C++ and offers additional
bindings for C, Fortran, Matlab, and Python. preCICE (https://github.com/precice/) is an open-source
software released under the LGPL3 license.
4.1.1 DUST
preCICE needs to be configured at runtime via an xml file, typically named precice-config.xml. Here, you
specify which solvers participate in the coupled simulation, which coupling data values they exchange, which
fixed-point acceleration and many other things.
First of all, the fields exposed to communication between the two solvers are declared.
<?xml version="1.0"?>
<precice-configuration>
<solver-interface dimensions="3">
Here follows the definition of the two meshes, for each of which it is declared which data among the declared
before are used. In this case, both DUST and MBDyn use all the exposed fields.
<!-- === Mesh =========================================== -->
<mesh name="MBDynNodes">
<use-data name="Position" />
<use-data name="rotation" />
<use-data name="Velocity" />
<use-data name="AngularVelocity" />
<use-data name="Force" />
<use-data name="Moment" />
</mesh>
<mesh name="dust_mesh">
<use-data name="Position" />
<use-data name="rotation" />
<use-data name="Velocity" />
<use-data name="AngularVelocity" />
<use-data name="Force" />
<use-data name="Moment" />
</mesh>
In this part are declared the two participants, MBDyn and DUST. For each participant it is indicated which
field is received (read-data) and which is sent (write-data). Considering DUST, this receives the kinematic
variables and sends the loads.
<!-- === Participants =================================== -->
<participant name="MBDyn">
<use-mesh name="MBDynNodes" provide="yes"/>
Chapter 4: Coupling with a structural software through preCICE 40
<participant name="dust">
<use-mesh name="dust_mesh" provide="yes" />
<use-mesh name="MBDynNodes" from="MBDyn" />
<write-data name="Force" mesh="dust_mesh" />
<write-data name="Moment" mesh="dust_mesh" />
<read-data name="Position" mesh="dust_mesh" />
<read-data name="rotation" mesh="dust_mesh" />
<read-data name="Velocity" mesh="dust_mesh" />
<read-data name="AngularVelocity" mesh="dust_mesh" />
<mapping:nearest-neighbor direction="read" from="MBDynNodes" to="dust_mesh"
constraint="consistent" />
<mapping:nearest-neighbor direction="write" from="dust_mesh" to="MBDynNodes"
constraint="conservative" />
</participant>
For each two participants that should exchange data, you have to define an m2n communication. This es-
tablishes an m2n (i.e. parallel, from the M processes of the one participant to the N processes of the other)
communication channel based on TCP/IP sockets between MBDyn and DUST.
<!-- === Communication ================================== -->
<m2n:sockets exchange-directory="./../" from="MBDyn" to="dust"/>
A coupling scheme can be either serial or parallel and either explicit or implicit. Serial refers to the staggered
execution of one participant after the other where the first participant is computed before the second one.
With an explicit scheme, both participants are only executed once per time window. With an implicit scheme,
the participants are executed multiple times until convergence.
The max-time value field indicates the maximum time (end time) for the coupled simulation (NOTE: actually
the final time is the shorter between this and the final time set in DUST and in the MBDyn input).
With time-window-size value, you can define the coupling time window (=coupling time step) size. If a
participant uses a smaller one, it will sub-cycle until this window size is reached. Setting it equal to -1, it is
set according to a specific method, here taking the value form the first participant MBDyn.
To control the number of sub-iterations within an implicit coupling loop, you can specify the maximum number
of iterations, max-iterations and you can specify one or several convergence measures:
Mathematically, implicit coupling schemes lead to fixed-point equations at the coupling interface. A pure
implicit coupling without acceleration corresponds to a simple fixed-point iteration, which still has the same
stability issues as an explicit coupling. We need acceleration techniques to stabilize and accelerate the fixed-
point iteration. In preCICE, three different types of acceleration can be configured: constant (constant under-
relaxation), aitken (adaptive under-relaxation), and various quasi-Newton variants (IQN-ILS aka. Anderson
acceleration, IQN-IMVJ aka. generalized Broyden).
<acceleration:aitken>
<data name="Force" mesh="MBDynNodes"/>
<initial-relaxation value="0.1"/>
</acceleration:aitken>
</coupling-scheme:serial-implicit>
</solver-interface>
</precice-configuration>
The aerodynamic loads computed by DUST are introduced in the MBDyn model as an external structural
force acting on some nodes1 .
force: 9, external structural,
socket,
create, yes,
path, "$MBSOCK",
no signal,
coupling, tight,
sorted, yes,
orientation, orientation vector,
accelerations, yes,
13,
# Wing central node
GROUND + RIGHT,
# Wing right nodes
GROUND + RIGHT + 1,
GROUND + RIGHT + 2,
GROUND + RIGHT + 3,
GROUND + RIGHT + 4,
# Wing left nodes
GROUND + LEFT + 1,
1 All the examples are taken form the coupled_wing example
Chapter 4: Coupling with a structural software through preCICE 42
GROUND + LEFT + 2,
GROUND + LEFT + 3,
GROUND + LEFT + 4,
# Wing right control surfaces node (in the same ref. sys. of wing right)
FLAP_RIGHT + 1,
FLAP_RIGHT + 2,
# Wing left control surfaces node (in the same ref. sys. of wing left)
FLAP_LEFT + 1,
FLAP_LEFT + 2;
• The X axis moves along the beam elastic axis and goes from beam root to tip, and it is rotated the
structural sweep λ and dihedral δ angles.
• The Y axis goes from trailing edge to leading edge, and it rotated by the structural twist angle θ.
• The Z axis is determined by the right and rule.
In order to pass from local MBDyn beam reference frame to the DUST wind axis reference frame, the following
rotation matrices are used:
• Rotation matrix from the DUST reference frame to the MBDyn reference frame:
0 1 0
Rb = −1 0 0 (4.1)
0 0 1
• Sweep rotation of the MBDyn node. The sweep is taken positive for a rotation about −z.
cos (λ) − sin (λ) 0
Rλ = sin (λ) cos (λ) 0 (4.3)
0 0 1
build the structural beam. Then, the twist of each region will be zero, since it will be taken from the MBDyn node orientation
Chapter 4: Coupling with a structural software through preCICE 43
Rright = Rb Rθ Rλ Rδ =
sin (λ) cos (δ) cos (λ) cos (λ) sin (δ)
= − cos (λ) cos (θ) sin (δ) sin (θ) + cos (δ) cos (θ) sin (λ) sin (δ) cos (θ) sin (λ) − cos (δ) sin (θ)
− cos (λ) sin (θ) cos (δ) sin (λ) sin (θ) − sin (δ) cos (θ) cos (δ) cos (θ) + sin (δ) sin (λ) sin (θ)
All these rotations are intended to rotate back the structural component in the DUST component reference
frame. When this procedure is performed, then the aerodynamic mesh can be constructed as a normal DUST
parametric mesh.
These rotation matrix can be used also to transfer the hinge nodes coordinate from the MBDyn reference
frame to the DUST one: to correctly define a coupled hinge, the MBDyn nodes must be in the same reference
system of the wing-beam axis, with a certain offset in chord-wise direction, then, those nodal coordinates must
be transfer in the DUST component reference system. In order to map the DUST component with the MBDyn
nodes two coordinates files must be written:
• RefConfigNodes.dat: this file contains the list of coordinates of all MBDyn nodes than are contained
in the external force card and that are intended to be coupled with a DUST component. If the node
belongs to a beam element the coordinates must be given in the local reference frame of the beam (the
feathering axis in the case of a rotor blade).
In case of multiple blades, to differentiate from one blade to the other an offset can be added conveniently
in the z coordinates, whereas the x coordinates will be the same for all blades.
# Wing central node
0.0 0.0 0.0
# Wing right nodes
1.137158042603258 0.0 0.0
2.274316085206515 0.0 0.0
3.411474127809773 0.0 0.0
4.548632170413031 0.0 0.0
# Wing left nodes
-1.137158042603258 0.0 0.0
-2.274316085206515 0.0 0.0
-3.411474127809773 0.0 0.0
-4.548632170413031 0.0 0.0
# Wing right control surfaces node (in the same ref. sys. of wing right)
2.0 -0.555 0.0
3.5 -0.555 0.0
# Wing left control surfaces node (in the same ref. sys. of wing left)
-2.0 -0.555 0.0
-3.5 -0.555 0.0
• CouplingNodeFile.in: this file contains the list of coordinates of MBDyn nodes that are coupled for a
single component. A best practice is to write this file as simply a copy of the RefConfigNodes.dat file
for what concerns the coordinates related to the components, if the z offset is present, then this will be
added to the starting_point coordinates.
For example, in case of the right wing components this file is:
Chapter 4: Coupling with a structural software through preCICE 44
Then, since the angle of sweep, dihededral, and twist are respetively: 30◦ , 15◦ and 10◦ , by applying the
rotation matrix, the coupling_node_orientation is:
coupling_node_orientation =
(/0.5, 0.836516303737808, 0.224143868042013,
-0.852868531952443, 0.430682165754551, 0.295174760618610,
0.150383733180435, -0.338752631992439, 0.928779514800424/)
Then, the origin of the wing must be moved from the elastic axis (located at the 33% of the chord), to
the aerodynamic center, defined by reference_chord_fraction, and a y offset is applied in order to
place in the middle the fuselage.
starting_point = (/0.222655776165707,0.595417457320121 ,0.181114485501542/)
The hinge node must be also moved in the DUST component reference system, by applying the rotation
matrix to the last two coordinates of the CouplingNodeFile.in we obtain:
node_1 = (/ 1.473342035233606, 1.434004005481840, 0.284465743940698 /)
node_2 = (/ 2.223342035233606 , 2.688778461088552 , 0.620681546003718/)
That are the coordinate of the right flap in the DUST reference frame.
45
Chapter 5
DUST solver
The DUST solver is the main executable of DUST, and its aim is to run the actual simulation and obtain the
required full solution to the problem.
As the other executable it is run by simply invoking the executable dust with the correct input file as command
argument.
dust input_file_name.in
Command 5.3: Solver command looking for input file input_file_name.in
If no command argument is provided the solver looks for a default input file, dust.in.
dust
Command 5.4: Solver command looking for default input file dust.in
The solver requires, among other inputs, the geometry file result of the preprocessor. If such file is not found
the solver attempts to run the preprocessor by executing the preprocessor with default input file (command
3.2).
The input file which should be provided to the solver is used to set all t he parameters required for the execution
of the simulation, from execution options, time parameters to the wake and model settings.
An example of input file for the solver is presented in file 5.1
dt_debug_out = 1.0
output_start = F
output_detailed_geo = T
fmm_panels = F
viscosity_effects = F
particles_redistribution = F
particles_redistribution_ratio = 3.0
octree_level_solid = 4
turbulent_viscosity = F
HCAS = F
HCAS_time = 4.0
HCAS_velocity = (/2.0, 0.0, 0.0/)
• timesteps: required: yes if dt not set, forbidden if set. multiple: no. type: integer.
The number of timesteps for the simulation. Note that during the simulation a number of timesteps
equal to timesteps+1 will be displayed, because the starting step is counted too.
• dt: required: yes if timesteps not set, forbidden if set. multiple: no. type: real.
The time step length.
• dt_out: required: yes. multiple: no. type: real.
Time interval of solution output.
• dt_debug_out: required: no. multiple: no. default: dt_out. type: real.
Time interval of debug output, if debug_level is set high enough to write debug files.
• output_start: required: no. multiple: no. default False. type: logical.
Output the first iteration. Since it is an implicit solver, the first calculation happens at t0 before any
time interval has passed, if set to True output the first result.
πs
Udes
U =U+ 1 − cos (5.2)
2 H
x: Position of the point whose airstream velocity is being computed.
– gust_origin: required: yes. multiple: no. type: real array of length 3.
O: Position of the origin point of the gust.
– gust_front_direction: required: yes. multiple: no. type: real array of length 3.
v: Unit vector that defines the direction of propagation of the front.
– gust_front_speed: required: yes. multiple: no. type: real.
Velocity of propagation of the front in direction gust_front_direction
– gust_u_des: required: yes. multiple: no. type: real.
Udes : gust amplitude.
– gust_perturbation_direction: required: no. multiple: no. default: (/0.0, 0.0, 1.0/) type: real
array of length 3.
Unit vector that defines the direction of the velocity perturbation
– gust_gradient: required: no. multiple: yes. type: real.
H: gust wave length.
– gust_start_time: required: no. multiple: no. default: 0.0 type: real.
τ : Time at which the gust starts.
• vl_tol: required: no. multiple: no. default: 1.0e-4 type: real. Tolerance for the absolute error on lift
coefficient in fixed point iteration for corrected vortex lattice.
• vl_relax: required: no. multiple: no. default: 0.3 type: real. Constant relaxation factor for rhs update
• aitken_relaxation: required: no. multiple: no. default: T type: logical. Activate the Aitken accel-
eration and stabilization method involved during the vortex lattice fixed point iteration. The initial
relaxation is the one specified in vl_relax.
• vl_maxiter: required: no. multiple: no. default: 100 type: integer. Max number of iteration for
correction of vortex lattice
• vl_start_step: required: no. multiple: no. default: 1 type: integer. Time step to start correcting the
vortex lattice element
• vl_dynstall: required: no. multiple: no. default: F type: logical. Activate Boeing1 dynamic stall on
the corrected v element. (Still experimental)
• vl_average: required: no. multiple: no. default: F type: logical. Average the solution between the
iteration: this may further stabilize the solution in stalled conditions
• vl_average_iter: required: no. multiple: no. default: 10 type: integer. Number of iteration on which
the average is computed.
• kutta_correction: required: no. multiple: no. default: ’F’ type: logical Employ kutta condition for
surface panel with trailing edge.
• kutta_beta: required: no. multiple: no. default: 0.01 type: real Perturbation factor for kutta condition
to compute jacobian matrix
• kutta_tol: required: no. multiple: no. default: 1.0e-6 type: real Tolerance in Newton scheme for Kutta
condition correction
• kutta_maxiter: required: no. multiple: no. default: 100 type: integer Maximum number of iterations
Newton scheme for Kutta condition correction
• kutta_start_step: required: no. multiple: no. default: 1 type: integer Time step to start correcting
the Kutta condition
• kutta_update_jacobian: required: no. multiple: no. default: 1 type: integer Step frequency in which
the jacobian matrix is updated in the Newton scheme for Kutta condition correction. When preCICE is
called, the jacobian is updated only at the first preCICE iteration.
The simulation is started from parameter tstart (unless restarting from a previous solution and not resetting
time) and ends at tend after a certain number of time steps. The user must provide the parameters tstart,
tend and alternatively the number of time steps (timesteps) between them or the size of the time steps (dt).
The non specified parameter is computed during the execution.
When specifying the number of time steps, the interval between the starting time (or re-starting time) and
the end time is divided in a number timesteps of equal intervals, and then timesteps+1 steps are executed,
counting also the starting one.
When specifying the time step length dt, the smallest number of steps to get to tend is executed. If the time
interval cannot be divided into an integer number of time steps, all the time steps will be executed anyway with
a time step length of dt, and the last time step will be shorter to arrive precisely at tend. It must however be
noted that DUST is not designed at the moment to handle variable time step lengths, for this reason in few
1 https://apps.dtic.mil/sti/pdfs/AD0767240.pdf
Chapter 5: DUST solver 56
z BoxLength
OctreeOrigin
x
Figure 5.1: System of cube boxes to compose the first level of the octree. In green is highlighted the origin of
the octree, from which two rows of boxes in x, three in y and one in z starts, corresponding to n_box = (/2,
3, 1/). In red is highlighted the length of each cube side, box_length
particular unsteady configurations, this shorter time step could lead to small fluctuations of the loads just in
the last time step. To avoid this issue use a dt which lead to a precise number of time steps or prescribe the
number of time steps instead of the time step length (or discard the results of the last step).
In the previous section 5.1 all the available parameters for the DUST solver have been listed. While the brief
description in most of the cases is enough to describe the simple functioning of the parameters, for some model
parameters is necessary a more comprehensive discussion.
Vortex Models Parameters In DUST all the description of both the surface elements and the wake relies
(also) on vortex models. The vortex particles represent a small vortex unit, lifting lines are represented by a
single vortex, panel wakes, vortex lattices and surface panels all have a uniform distribution of doublets, which
is equivalent to a vortex ring along the sides of such panels.
The velocity induced by vortexes decreases with a certain power of the distance from the vortex (1/r in two
dimensions, 1/r2 in three), which means that while at higher distances the induced velocity becomes small, for
distances approaching zero the velocity becomes very high and eventually singular. This model is completely
irrotational, with all the vorticity confined in a point/line, but is clearly not physical, and for this reason it is
necessary to regularize the induced velocity in the proximity of the vortex. If in the case of the panels this can
be seen merely as a regularization, in the case of the vortex particles the use of a regularized core is necessary
to have a rotational volume for each particle which is able to represent the vorticity field generated by the
wake.
Starting precisely from this consideration, it is advisable to set the parameter vortex_rad, which is the radius
of the Rosenhead regularized core employed for the vortex particles, to a value which allow the generated
particles to represent the whole generated vorticity field, by slightly overlapping one another. This can be
done for example by setting VotexRad equal to the (average) length of the trailing edge element sides, where
the particles are first generated and spaced.
Since the generation of the particles from the trailing edges sets somehow the spacing, and the resolution, of
the vortical phenomena, the radius of the vortex model of the panels, rankine_rad should be chosen at least
in the same order of magnitude of vortex_rad. The vortex regularization performed on the panels is the
classical Rankine one. Since it is expected that the vortical phenomena on surfaces are more confined than
in the wake the user might want to take a little smaller radius for the surface panels than the particles one,
Chapter 5: DUST solver 57
however remaining in the same order of magnitude. Too small radii might lead to not physical, too strong
interactions with close particles or panels.
Eventually for the panels the parameter cutoff_rad sets a radius underneath which the interaction is set to
zero, to avoid any kind of modelling when a point is essentially coinciding with the vortex. This parameter
should be set much smaller than rankine_rad.
The reference frames are the basis for both the placement of the geometry components in the space and for the
definition of their movement. Reference frames are handled by the solver, which reads them from a separate
input file, indicated in the solver input file, file 5.1. Before detailing the inputs for the reference frames file it
is important to understand how reference frames work inside DUST.
Reference frames are defined hierarchically from a base reference frame. The base reference frame is called
"0" and cannot be defined, is a standard right-handed Cartesian reference frame and is defined inside DUST.
Starting from the base reference frame all the necessary reference frames can be defined.
It is important to stress that the base reference frame it is not defined upon any other implied reference frame
and thus has no implied orientation with respect to anything else. Instead it is just the definition of the three
axis x-y-z upon which all the other reference frames, geometrical components, parameters are defined. The
user can give any meaning to the three axis, e.g. x horizontal towards rear, y horizontal towards right and z
vertical upward, but also x front, y up and z right. The user must be then consistent with the inputs, both
in terms of geometry and for example free stream velocity, but there is no implied orientation in the base
reference.
All the following reference frames are defined upon another reference frame, called "parent" reference frames.
Obviously the parent reference frame must always be defined, so that all the branches of the tree defined by
the multiple reference frame can be traversed back to the base reference frame. The relative positioning of two
reference frames with respect to the base one is depicted in figure 5.2. The use of multiple reference frames
allows to position a geometrical entity, with its own local coordinates, in any position of the domain, and in
any relative position with respect to the other components, in a logical way. An example of references file, for
static references is presented in file 5.2.
input file 5.2: references_static.in
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
reference_tag = root
parent_tag = 0
origin = (/0.0, 0.0, 0.0/)
orientation = (/1.0,0.0,0.0, 0.0,1.0,0.0, 0.0,0.0,1.0/)
multiple = F
moving = F
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
reference_tag = first
parent_tag = Root
origin = (/10.0, 2.0, 4.0/)
orientation = (/0.0,1.0,0.0, 0.0,0.0,1.0, 1.0,0.0,0.0/)
multiple = F
moving = F
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
reference_tag = second
parent_tag = Root
origin = (/0.0, 0.0, 0.0/)
orientation = (/0.999941,0.0,-0.010859, 0.0,1.0,0.0, +0.010859,0.0,0.999941/)
multiple = F
Chapter 5: DUST solver 58
moving = F
• parent_tag: required: yes, in same number as reference_tag. multiple: yes. type: string.
Declares the reference frame upon which the current reference frame is defined. The valid values are all
the other reference frames defined in the input file (also later in the file) and "0".
• origin: required: yes, in same number as reference_tag. multiple: yes. type: real array of length 3.
origin of the current reference frame, in coordinates of the parent reference frame (not the global ones).
• orientation: required: yes, in same number as reference_tag. multiple: yes. position: must follow
origin type: real array of length 9.
orientation of the current reference frame with respect to the previous one. Considering a Fortran filling
order (fastest cycling index is the row one), the 9 component vector forms a matrix with the vectors
of the current base in the components of the parent base, by columns. In other words the first three
coefficients represent the components of the x axis of the current frame in the parent frame, and so on
for y and z axis.
• multiple: required: yes, in same number as reference_tag. multiple: yes. type: logical. Is the reference
frame multiple?
• moving: required: yes, in same number as reference_tag. multiple: yes. type: logical. Is the reference
frame moving with respect to the parent?
Chapter 5: DUST solver 59
Special input is required when a reference frame is moving or is multiple, in which case a special grouping
keyword is required. As shown in file 5.3 if the parameter moving is set to true, it must be followed by the
grouping parameter motion in which the definition of the motion is provided.
All the motions in DUST are provided as a translation of a pole and a rotation around an axis passing from
the pole, as depicted in figure 5.3. The motion of the pole can be defined in terms of position or velocity. Both
can be described with some simple functions or from a time history from a data file. In the same way the
rotation around an axis can be defined in terms of angle or rotation rate, and with simple functions or data
input.
The simple functions are either a constant value, or a sinusoidal function of time defined as
rotation = {
input = position
input_type = simple_function
!file = ...
function = 1
Axis = (/ 0.0 , 1.0 , 0.0 /)
amplitude = 0.1
omega = 1.2566
phase = 0.0
offset = 0.0
psi_0 = 0.0
}
}
– input: required: yes. multiple: not inside each pole group. type: string.
In which way motion is imposed, can be position or velocity
– input_type: required: yes. multiple: not inside each pole group. type: string.
type of input, can be simple_function or from_file
– function: required: yes if input_type is simple_function. multiple: not inside each pole group.
type: integer array of length 3.
type of function to be imposed, at the moment 0 is for a constant function and 1 is for a sinusoidal
function. An array of three components is expected, one for each direction of the pole motion.
– file: required: yes if input_type is from_file. multiple: not inside each pole group. type: string.
name of the file where the time history is of the motion (position or velocity) is stored. The file is
supposed to have 4 columns, the first containing a series of time values adequate for the simulation
time, and the following three the three components of the pole motion.
– amplitude: required: no, used only if input_type is simple_function. multiple: not inside each
pole group. default: 1.0 type: real.
Collective amplitude of the motion, applied to all the three components of the motion
– vector: required: no, used only if input_type is simple_function. multiple: not inside each pole
group. default: (/1.0, 1.0, 1.0/) type: real array of length 3.
Relative amplitude of the motion for each component
– omega: required: no, used only if input_type is simple_function. multiple: not inside each pole
group. default: (/1.0, 1.0, 1.0/) type: real array of length 3
Pulsation of each sinusoidal motion. Considered only if input is simple_function and only for the
components with sinusoidal functions.
– phase: required: no, used only if input_type is simple_function. multiple: not inside each pole
group. default: (/0.0, 0.0, 0.0/) type: real array of length 3.
phase of each sinusoidal motion. Considered only if input is simple_function and only for the
components with sinusoidal functions.
– offset: required: no, used only if input_type is simple_function. multiple: not inside each pole
group. default: (/0.0, 0.0, 0.0/) type: real array of length 3.
Constant offset (position/velocity) for each component of the pole motion
– Position_0: required: no, used only if input_type is simple_function. multiple: not inside each
pole group. default: (/0.0, 0.0, 0.0/) type: real array of length 3
Starting position of the pole in the three component, considered only if input is velocity
Chapter 5: DUST solver 61
– input: required: yes. multiple: not inside each rotation group. type: string.
In which way the rotation is imposed, can be position for imposing an angle or velocity for
imposing a rotation rate
– input_type: required: yes. multiple: not inside each rotation group. type: string.
type of input, can be simple_function or from_file
– function: required: yes if input_type is simple_function. multiple: not inside each rotation
group. type: integer.
type of function to be imposed, at the moment 0 is for a constant function and 1 is for a sinusoidal
function.
– file: required: yes if input_type is from_file. multiple: not inside each rotation group. type:
string.
name of the file where the time history is of the rotation (angle or rotation rate) is stored. The file is
supposed to have 2 columns, the first containing a series of time values adequate for the simulation
time, and the following the rotation around the axis.
– Axis: required: yes. multiple: not inside each rotation group. type: real array of length 3.
orientation of the rotation axis, in the parent reference frame. The rotation axis keeps a constant
orientation in the parent reference frame and always passes through the pole during its motion
– amplitude: required: no, used only if input_type is simple_function. multiple: not inside each
rotation group. default: 1.0 type: real.
Collective amplitude of the rotation
– omega: required: no, used only if input_type is simple_function. multiple: not inside each
rotation group. default: 1.0 type: real.
Pulsation of the sinusoidal motion. Considered only if input is simple_function and input_type
is a sinusoidal function.
– phase: required: no, used only if input_type is simple_function. multiple: not inside each
rotation group. default: 0.0 type: real.
phase of the sinusoidal motion. Considered only if input is simple_function and input_type is
a sinusoidal function.
– offset: required: no, used only if input_type is simple_function. multiple: not inside each
rotation group. default: 0.0 type: real.
Constant offset of rotation or rotation rate
– Psi_0: required: no, used only if input_type is simple_function. multiple: not inside each
rotation group. default: 0.0 type: real.
Starting angle of the rotation, considered only if input is velocity
To ease the setup of rotors in terms of reference frames and motions, a special set of instructions have been
developed for the reference frames. Declaring a reference frame multiple, a single component is replicated
n times in a special set of multiple, automatically generated reference frames. While there is possibility to
expansion towards different types of multiple reference frames, at the moment multiplicity is employed only
for rotors: an example input file with a reference frame for a rotor is given in file 5.4.
n_dofs = 3
dof = {
hinge_type = Flap
hinge_offset = (/ 0.0 , 0.032432 , 0.0 /)
collective = 3.0 ! deg
cyclic_ampl = 0.0 ! deg
cyclic_phas = 0.0 ! deg
}
dof = {
hinge_type = Lag
hinge_offset = (/ 0.0 , 0.021622 , 0.0 /)
collective = -10.0
cyclic_ampl = 0.0
cyclic_phas = 0.0
}
dof = {
hinge_type = Pitch
hinge_offset = (/ 0.0 , 0.086486 , 0.0 /)
collective = 12.0
cyclic_ampl = 0.0
cyclic_phas = 0.0
}
Note that the rotor reference frame in file 5.4 is set as not moving. This means that the starting reference
frame is stationary (with respect to its parent) however all the other reference frames that are automatically
generated move in order to represent the different movements of a rotor.
If in the reference frame specification the parameter multiple is set to true, it must be followed by a grouping
keyword, multiplicity, which must contain the details of the multiplicity. The detailed parameters required
in the multiplicity are:
• mult_type: required: yes. multiple: not inside each multiplicity group. type: string.
type of multiplicity. At the moment only rotor is enabled.
• N_Blades: required: yes if mult_type is rotor. multiple: not inside each multiplicity group. type:
integer.
Number of blades of the rotor. It is also the number of time the geometrical component associated with
the reference frame will be multiplied in the domain.
• Rot_Axis: required: yes if mult_type is rotor. multiple: not inside each multiplicity group. type:
real array of length 3.
Axis of rotation of the rotor, with respect to the current reference frame
Chapter 5: DUST solver 63
• Rot_Rate: required: yes if mult_type is rotor. multiple: not inside each multiplicity group. type:
real.
rotation rate of the blades around the rotation axis. The rotation of the rotor is kept constant.
• Psi_0: required: yes if mult_type is rotor. multiple: not inside each multiplicity group. type: real.
Starting angle of the rotor at the beginning of the simulation
• Hub_Offset: required: yes if mult_type is rotor. multiple: not inside each multiplicity group. type:
real.
offset from the rotation pole (the origin of the multiple reference frame) of the beginning of the chain of
reference frames for each blade. It is constant and does not imply any secondary motion, can be used to
represent the central part of the rotor axis assembly.
• harmonic_input: required: no, type: logical.
Enable the possibility to prescribe the hinge motion through the multiblade degrees of freedom. This
possibility is shown in 5.4.
• n_harmonics: required: yes if harmonic_input is true. multiple: not inside each multiplicity group.
type: integer.
Number of expected harmonics: currently each dof must have the same number of harmonic for each
rotor.
• delta_3: required: no. multiple: not inside each multiplicity group. type: real.
Pitch-flap coupling angle δ3 .
• delta_2: required: no. multiple: not inside each multiplicity group. type: real.
Pitch-lag coupling angle δ2 .
• psi_sw: required: no. multiple: not inside each multiplicity group. type: real.
Swashplate mixing angle ψsw .
• N_dofs: required: yes if mult_type is rotor. multiple: not inside each multiplicity group. type:
integer.
Number of additional degrees of freedom of each blade, generally representing a movement around one
of the blades hinges
• dof: required: yes if N_dofs is greater than zero. multiple: yes, in the number defined by N_dofs.
Grouping keyword containing the details about geometry and movement of one additional degree of
freedom. The degrees of freedom are connected in a chain according to the order in which are defined.
A representation of the chain of degrees of freedom is presented in figure 5.4.
– hinge_type: required: yes. multiple: not inside each dof group. type: string.
type of hinge considered, affecting the axis of rotation of the hinge movement with respect to the
rotor axis, can be Flap,Lag, or Pitch.
– hinge_offset: required: yes. multiple: not inside each dof group. type: real array of length 3.
offset of the hinge rotation axis with respect to the previous hinge or the rotor hub (axis + hub
offset).
– collective: required: yes. multiple: not inside each dof group. type: real.
Collective (constant during rotation) angle of rotation (in degrees) of the degree of freedom. If
harmonic_input is true, then this is equivalent to the β0 harmonic.
– cyclic_ampl: required: yes if harmonic_input is false. multiple: not inside each dof group. type:
real.
Cyclic (sinusoidal during rotation) angle of rotation (in degrees) of the degree of freedom.
Chapter 5: DUST solver 64
– cyclic_phas: required: yes if harmonic_input is false. multiple: not inside each dof group. type:
real.
phase of the cyclic movement, in degrees, with respect to the rotor rotation.
– collective_dot: required: yes harmonic_input is true. multiple: not inside each dof group. type:
real.
Velocity of the collective component: u̇0 .
– cosine: required: yes harmonic_input is true. multiple: not inside each dof group. type: real.
Vector containing all the harmonics for the cosine cyclic component: unc .
– cosine_dot: required: yes harmonic_input is true. multiple: not inside each dof group. type:
real.
Vector containing all the harmonics for the cosine cyclic velocity component: u̇nc .
– sine: required: yes harmonic_input is true. multiple: not inside each dof group. type: real.
Vector containing all the harmonics for the sine cyclic component: uns .
– sine_dot: required: yes harmonic_input is true. multiple: not inside each dof group. type: real.
Vector containing all the harmonics for the sine cyclic velocity component: u̇ns .
– reactionless: required: yes harmonic_input is true. multiple: not inside each dof group. type:
real.
Vector containing all the harmonics for the reactionless cyclic component: uN/2 .
– reactionless_dot: required: yes harmonic_input is true. multiple: not inside each dof group.
type: real.
Vector containing all the harmonics for the reactionless cyclic velocity component: u̇N/2 .
If the harmonic_input is true, then, for the flap β and lag ξ degrees of freedom, the motion will be:
nX
harm h i
β m = β0 + βnc cos (nψm ) + βns sin (nψm ) + βN/2 (−1)m (5.4)
n=1
nX
harm h i
ξ m = ξ0 + ξnc cos (nψm ) + ξns sin (nψm ) + ξN/2 (−1)m (5.5)
n=1
For the pitch degree of freedom, the motion will take into consideration the control mixing and the flap, and
lag components. The input of this degree of freedom are intended to be the actual swashplate input, rather
than the actual pitch rotation.
The pitch root rotation will be then:
θm = θ0 + θ1c cos (ψm + ψsw ) + θ1s sin (ψm + ψsw ) − tan (δ3 ) β m − tan (δ2 ) ξ m (5.9)
θ̇m = −θ1c Ω sin (ψm + ψsw ) + θ1s Ω cos (ψm + ψsw ) (5.10)
Chapter 5: DUST solver 65
In the present section the dimensional units, normalization (or the lack of it) in DUST will be discussed.
All the equations, models, inputs, outputs etc. in the code are dimensional. This does not mean that they are
required to be in a specific dimensional unit, but only that no sort of adimensionalization is performed
in the code. The user is fully responsible for the scaling (or not) of his inputs, and as a consequence of the
outputs.
More in detail the core of DUST solves the potential equations, which are a simplified version of the incom-
pressible Euler equations. Such equations do not depend on a scaling parameter (such as Mach or Reynolds for
compressible Navier-Stokes) so their (scaled) results are independent on the scaling employed. Three possible
approaches at the scaling of the variables and results are given in examples 1,2 and 3.
Example 1 (Potential case, fully dimensional)
Consider a isolated wing with span b = 20m and chord c = 2m flying at U = 60m/s in air with density
ρ = 1.225kg/m3 .
The user can take a completely dimensional approach and insert (or build) the geometry in the correct size
in meters, and impose a free stream velocity and density corresponding to the real flight conditions. In this
Chapter 5: DUST solver 66
case the results, for example in terms of loads, will be in the same units set employed in the inputs, L[N ]. To
obtain the loads coefficient then the user must adimensionalize the results employing the appropriate reference
quantities used in the computations:
L L
CL = =
1/2ρU 2 bc 1/2 · 1.225 · 602 · 20 · 2
Example 2 (Potential case, fully scaled)
Starting from the conditions of example 1, a user might want to re-scale all the quantities with respect to
scaling units. For example, the geometry might be scaled by the span, giving b′ = b/b = 1, c′ = c/b = 0.1 and
introduced scaled from the mesh generator, scaled in the pre-processor or built parametrically already scaled.
The velocity might be scaled on the free stream one, specifying directly U ′ = U/U = 1, as well as the density
ρ′ = ρ/ρ = 1.
With these parameters as input, the output would be scaled accordingly, leading for example to the scaled loads
L′ . These outputs, being scaled, are not numerically equal to the ones obtained in example 1, however they
can be on the one hand scaled back to the real ones employing the inverse scaling used for the inputs, or on
the other hand if only the adimensional coefficients are sought they can be obtained using the scaled reference
quantities:
L′ L′
CL = =
1/2ρ′ U ′2 b′ c′ 1/2 · 1 · 12 · 1 · 0.1
When adimensionalized on the appropriate reference quantities the adimensional coefficients have always the
same values.
Example 3 (Potential case, partially scaled)
While in example 2 all the quantities have been scaled with respect to some scaling quantity, the user can
choose to use different quantities, or to scale only some of the quantities. For example, the user might want to
keep the geometry from the CAD in meters, b = 20m, c = 2m and scale the flight conditions for ease of use,
U ′ = U/U = 1, ρ′ = ρ/ρ = 1.
Chapter 5: DUST solver 67
The results L′′ are going to be again scaled, in a different way than in example 2, and the non-dimensional
coefficient can be retrieved using the reference quantities employed in the computation:
L′′ L′′
CL = =
1/2ρ′ U ′2 bc 1/2 · 1 · 12 · 20 · 2
It must however be stressed that when talking about scaling of the inputs and adimensionalization of the results,
these operations are left to the user to be carried out independently before and after the execution of DUST.
To maintain complete usage flexibility, it is not possible to introduce any explicit scaling or adimensionalizing
unit. When using certain features of the code (lifting lines, vorticity diffusion, separations etc.) the effects of
viscosity and compressibility are simulated in different manners. To account for the right flow conditions it is
necessary to specify the parameters governing the viscous and compressibility phenomena, i.e. the dynamic
viscosity µ and the speed of sound c in the input file. In continuity with the rest of the code, the dimensional
physical properties of the flow must be provided, rather than the non dimensional numbers Reynolds and
Mach. It is responsibility of the user to insert them correctly and eventually scale them to obtain similarity
of Reynolds and Mach with respect to the target conditions. Examples on how to achieve that in different
conditions are presented in example 4.
Example 4 (Ways to determine physical properties)
Depending on the cases, the physical properties of the fluid to be given as input might be:
• Already known and inserted as they are, if all the other reference quantities have not be scaled
• Obtained from the original ones, keeping Reynolds and Mach number equal, if some of the reference
quantities were scaled:
ρU L ρ′ U ′ L′ ρ′ U ′ L ′
= ′ → µ′ = µ
µ µ ρU L
U U′ U′
= ′ → c′ = c
c c U
• Obtained from the non-dimensional parameters, if those are known rather than the properties of the fluid:
ρ′ U ′ L′ ρ′ U ′ L′
Re = → µ′ =
µ′ Re
U′ U′
Ma = → c′ =
c′ M
Finally, the reference pressure given as input is used as reference, free stream pressure, and does not affect the
results except for a constant offset in the pressure field output. Loads are computed integrating on a closed
surface and so are not affected by a constant offset on pressure. Knowing the reference pressure used as input,
it is possible to retrieve the local coefficient of pressure:
P (x) − Pref
Cp (x) =
1/2ρU 2
where P (x) is the local pressure from the results, P (x) is the reference pressure given as input and ρ, U are
the reference quantities employed during the simulation.
As discussed in section 5.1 in the solver input file it is possible to set the parameter debug_level which selects
the verbosity of the output of the code. The level is selected choosing an integer number, and it is cumulative:
selecting a certain value the user gets the additional output given at that value and all the outputs at the lower
levels. As a rule of thumb the debug levels up to 10 generate increasing levels of verbosity in the screen outputs,
while increasing levels over 10 generate additional outputs saved in files, in the appropriate basename_debug
path. The current effects of the debug level are presented in table 5.1. Be aware that the debug file output is
mainly targeted for development work, and its content is susceptible to sudden and undocumented changes.
Chapter 5: DUST solver 68
When running the solver, a certain number of hdf5 binary files are generated, in the location specified by
basename. Two main type of files are generated:
• basename_geo.h5: a file containing the geometry of the simulation, which is similar to the input given
to the solver, with some additions related to the single simulation.
• basename_res_XXXX.h5: a number of result files obtained during the simulation, printed at the fre-
quency specified in the input file.
69
Chapter 6
DUST Post-processor
The DUST post-processor is used to generate meaningful data from the binary results generated during the
execution of the solver. While as discussed in 1.4 it is possible to look at the content of the hdf5 results, these
being based on the singularities intensities on the surface provide little insight on the solution of the solver.
The post-processor takes the specified results and use them to obtain a variety of different processed data,
from visualizations to loads.
The preprocessor is executed simply invoking the executable dust_post in the desired folder. The input file
containing all the required information for the execution of the post-processor must be passed as argument to
the command call. If not provided explicitly the preprocessor automatically tries to read the default input file
dust_post.in.
dust_post input_file_name.in
Command 6.5: Postprocessor command looking for input file input_file_name.in
dust_post
Command 6.6: Postprocessor command looking for default input file dust_post.in
The different possible analysis that can be performed on the results are:
• Integral loads: history of loads acting on the geometry or parts of the geometry
• Visualizations: visualization of the surface solution on the geometry and of the wake
• Probes: Time history of certain variables probed in a set of specified points
• Flow fields: Visualization of the flow field in a structured block domain
• Sectional loads: distribution of the loads along a direction on long aspect ratio components (i.e. wings
or blades)
The input file of the post-processor contains first all the information required for retrieving the correct results
and to process the data (model parameters etc.) and then in separate sections all the analyses that are
requested. An arbitrary number of analyses can be requested in a single input file, however it is also possible
to group the analyses in different input files then invoked multiple times as different inputs for the post-
processor.
The format is the same as all the other input files, as already specified in section1.2.
A generic input file describing the main input is:
Chapter 6: DUST Post-processor 70
analysis = {
type = viz
name = vis01
start_res = 1
end_res = 100
step_res = 1
format = vtk
wake = T
variable = vorticity
}
analysis = {
type = integral_loads
name = load01
start_res = 1
end_res = 100
step_res = 1
format = dat
average = F
component = all
reference_tag = RotorHub
}
The grouping keyword analysis specifies a single analysis, and the parameters contained in the group depend
on the type of the analysis. A series of analysis groups can be contained in a single input file.
6.2 Visualizations
Visualizations are the main form of assessment of the results, they allow to see the movement of geometry and
wake and the intensity of the solution on the surfaces and on the wake.
An example analysis group for a visualization is:
analysis = {
type = viz
name = vis01
start_res = 1
end_res = 100
step_res = 1
format = vtk
wake = T
average = F
variable = vorticity
component = all
Integral loads allow to obtain the time history of the loads acting on one or more components, in one of the
reference frames defined in section 5.4.
An example analysis group for integral loads is:
analysis = {
type = integral_loads
name = load01
start_res = 1
end_res = 100
step_res = 1
format = dat
average = F
component = all
reference_tag = RotorHub
The output file containing integral loads measurements in .dat format has the following structure. The first
4 lines of the file constitute the header of the file. The first three lines contains the number of the geometrical
components n_comp whose loads are integrated, the tag of reference system in which the components of the
integral loads are expressed, the tags of the n_comp components analyzed. As an example,
1: # Integral loads: N.components: 2
2: # Ref.sys : Wing1_Reference
3: # Components : Wing1 , Wing2
The fourth line is the header of the following lines, containing the time, the three components of force and
moment loads, the 9 elements of the (unrolled) rotation matrix and the 3 global coordinates of the origin of
the local reference system, required to compute the components of the loads in the global reference frame,
given those in the local reference frame.
4: # t , Fx , Fy , Fz , Mx , My , Mz , ref_mat(9) , ref_off(3)
The last lines of the file contain the actual data. As an example, for a 100-time step analysis with the local
reference frame Wing1_Reference aligned with the global reference frame (the rotation matrix is equal to the
identity) and the origin in (0.0, −1.0, 0.0), these lines read
5: 0.000000E+000 0.260753E+001 0.000000E+000 0.115993E+003
0.150792E+003 -0.434173E+001 -0.338980E+001 0.100000E+001
0.000000E+000 0.000000E+000 0.000000E+000 0.100000E+001
0.000000E+000 0.000000E+000 0.000000E+000 0.100000E+001
0.000000E+000 -0.100000E+001 0.000000E+000
...:
104: 0.858240E-002 0.545038E+001 0.000000E+000 0.830829E+002
0.108007E+003 -0.312156E+001 -0.708549E+001 0.100000E+001
0.000000E+000 0.000000E+000 0.000000E+000 0.100000E+001
0.000000E+000 0.000000E+000 0.000000E+000 0.100000E+001
0.000000E+000 -0.100000E+001 0.000000E+000
Hinge loads allows to obtain the time history of the load acting to one control surface along the hinge axis
reference frame as defined in figure 3.6.
An example analysis group for hinge loads is:
analysis = {
type = hinge_loads
name = hm
start_res = 1
end_res = 20
step_res = 1
format = dat
average = F
component = Wing
hinge_tag = Aileron
}
Chapter 6: DUST Post-processor 75
The output file containing hinge loads measurements in .dat format has the following structure. The first 4
lines of the file constitute the header of the file. The first three lines contains the number of the geometrical
components n_comp whose loads are integrated, the tag of reference system in which the components of the
integral loads are expressed, the tags of the n_comp components analyzed. As an example,
1: # hinge Moment:
2: # Components : Wing
3: # hinge : Aileron
The fourth line is the header of the following lines, containing the time, the three components of force and
moment loads, the 9 elements of the (unrolled) rotation matrix and the 3 global coordinates of the origin of
the hinge reference system, required to compute the components of the loads in the global reference frame,
given those in the hinge axis reference frame. The hinge moment is located always under the column Mh.
4: # t , Fv , Fh , Fn , Mv , Mh , Mn , axis_mat(9) , node_hinge(3)
The last lines of the file contain the actual data. As an example, for a 20-time step analysis with the hinge
reference frame Wing1_Aileron aligned with the global reference frame (the rotation matrix is equal to the
identity) and the origin of the hinge is (0.25, −0.1, 0.0), these lines read
5: 0.000000E+000 0.212095E+004 -0.34102E-015 0.11784E+005
0.295794E+006 -0.28342E+004 -0.53235E+005 0.10000E+001
0.000000E+000 0.000000E+000 0.000000E+000 0.10000E+001
0.000000E+000 0.000000E+000 0.000000E+000 0.10000E+001
0.250000E+000 -0.10000E+000 0.000000E+000
Chapter 6: DUST Post-processor 76
...:
25: 0.190000E+000 0.121453E+003 -0.75517E-017 0.643457E+003
0.161506E+005 -0.81645E+002 -0.30484E+004 0.100000E+001
0.000000E+000 0.000000E+000 0.00000E+000 0.100000E+001
0.000000E+000 0.000000E+000 0.00000E+000 0.100000E+001
0.25000E+000 -0.10000E+000 0.00000E+000
6.5 Probes
Probes allow to obtain a time history of some variables in some points by sampling the solution at such points.
An example analysis group for probes is:
analysis = {
type = probes
name = prb01
start_res = 1
end_res = 100
step_res = 1
format = dat
variable = Velocity
input_type = point_list
point = (/0.0, 1.0, 2.0/)
point = (/1.0, 0.0, -2.0/)
!input_type = from_file
!file = point_list.dat
The output file containing point probe measurements in .dat format has the following structure. The first
line is a header containing the number of probes
1: # N. of point probes: 2
and the following 3 lines contains the 3 global coordinates of the point probes. As an example, if the n_probes
= 2 probes have global cartesian coordinates (0.0, 1.0, 2.0) and (1.0, 0.0, −2.0), these lines read
2: 0.000000E+000 0.100000E+001
3: 0.100000E+001 0.000000E+000
4: 0.200000E+001 -0.200000E+001
The fifth line is a header line, containing the description of the next lines. The first field is the time,
5: # t 2( ux uy uz )
while n_probes × 3 columns follow, containing the global components of the velocity vectors, measured by
the point probes. The following lines contains the fields described for each time step required for the analysis.
As an example, for a 100-time step analysis these lines read
6: 0.000000E+000 0.465000E+002 -0.899269E-004 -0.469068E-004 0.465000E+002
0.633261E-004 -0.980265E-004
...:
105: 0.858240E-002 0.465003E+002 -0.238562E-002 -0.119496E-002 0.465023E+002
0.216758E-002 -0.357483E-002
Flow fields allow to probe systematically the domain obtaining the solution probed in a structured series of
points in 1-2 or 3 dimensions, allowing the visualization of the flow field induced by the solution of the singular
elements.
An example analysis group for flow fields is:
Chapter 6: DUST Post-processor 78
analysis = {
type = flow_field
name = ff01
start_res = 1
end_res = 100
step_res = 1
format = vtk
average = F
variable = Velocity
Sectional loads allow to obtain the distribution of the forces along one direction of a slender body, e.g. a wing
or a blade.
The way the sectional loads are retrieved is different when employing a parametrically generated element or a
generic element (i.e. an unstructured mesh generated from a mesh generator).
In the first case is sufficient to provide the reference line for the moments calculation, and the subdivision is
already implied in the structure of the parametric element.
An example analysis group for sectional loads on parametric components:
analysis = {
type = sectional_loads
name = sl01
start_res = 1
end_res = 100
step_res = 1
format = dat
average = F
component = wing
lifting_line_data = F
vortex_lattice_data = F
}
On generic components it is necessary to define an ordered slender box with orientation to prescribe the
interpolation along a series of sections of the surface data of the components to obtain the distribution of loads
along the prescribed direction.
An example analysis group for sectional loads on generic components:
analysis = {
type = sectional_loads
name = sl01
start_res = 1
end_res = 100
step_res = 1
format = dat
average = F
component = wing
box_sect = {
ref_node = (/ -0.5 ,-0.5 , -0.3 /)
face_vec = (/ 1.0 , 0.0 , 0.0 /)
face_bas = (/ 2.0 , 1.0 /)
face_hei = (/ 1.0 , 1.0 /)
span_vec = (/ 0.0 , 1.0 , 0.0 /)
span_len = 3.0
num_sect = 10
reshape_box = T
}
}
Chapter 6: DUST Post-processor 81
The output file containing sectional loads in .dat format has the following structure. The first line is a header
specifying the structural component analyzed and the force/moment component collected in the file. As an
example,
1: # Sectional load Fz of component: Wing1
The second line contains the number of sections n_sec in which the structural component is divided and the
number of time steps n_time of the analysis. As an example, the output file for a 10-section blade reads
2: # n_sec : 10 ; n_time : 100. Next lines: y_cen , y_span, chord
The second line also introduce the content of lines 3, 4 and 5. Line 3 contains the spanwise coordinate y_cen
of the centre of the sections, line 4 contains the spanwise dimension y_span of the section, and line 5 contains
the chord dimension chord of the section. As an example, if the the blade length is 0.6 and it is divided in 10
uniform sections with chord 0.05, the output file reads
3: 0.30000E-001 0.90000E-001 0.15000E+000 0.21000E+000 ...
4: 0.60000E-001 0.60000E-001 0.60000E-001 0.60000E-001 ...
5: 0.50000E-001 0.50000E-001 0.50000E-001 0.50000E-001 ...
The sixth line is another header file containing the fields and their dimension collected in the next n_time
lines.
6: # t , sec(n_sec) , ref_mat(9) , ref_off(3)
The first field is the time. The sectional loads of the n_sec sections follow. The last 12 lines contains the
(first-column) unrolled 3x3 rotation matrix the global components of the origin of the local reference frame,
required to obtain the components of the loads in the global reference frame from those expressed in the local
reference frame,
fG = R fL (6.1)
As an example, the lines collecting the fields described above of the first and the last of the 100 time steps of
the analysis reads
7: 0.000000E+000 0.966615E+002 0.966615E+002 0.966615E+002 0.966615E+002
0.966615E+002 0.966615E+002 0.966615E+002 0.966615E+002 0.966615E+002
0.966615E+002 0.100000E+001 0.000000E+000 0.000000E+000 0.000000E+000
0.100000E+001 0.000000E+000 0.000000E+000 0.000000E+000 0.100000E+001
0.000000E+000 -0.100000E+001 0.000000E+000
...:
105: 0.858240E-002 0.571236E+002 0.701379E+002 0.755018E+002 0.780314E+002
0.790800E+002 0.790800E+002 0.780314E+002 0.755017E+002 0.701378E+002
0.571235E+002 0.100000E+001 0.000000E+000 0.000000E+000 0.000000E+000
0.100000E+001 0.000000E+000 0.000000E+000 0.000000E+000 0.100000E+001
0.000000E+000 -0.100000E+001 0.000000E+000
The geometrical component of the example is attached to a steady reference frame, whose origin has global
components (0.0, −1.0, 0.0) and whose axes are aligned with those of the global reference frame, so that the
rotation matrix R is equal to the identity matrix.
Chapter 6: DUST Post-processor 83
The extra files produced if lifting_line_data or if vortex_lattice_data are set to T do not contain the
12 columns of the rotation matrix and the global components of the origin of the local reference frame.
The files generated by sectional loads contain, as sectional quantity:
• Fx: force acting on the section, x direction of the component local reference frame
• Fy: force acting on the section, y direction of the component local reference frame
• Fz: force acting on the section, z direction of the component local reference frame
• Mo: moment acting on the section, with respect to the axis specified in the definition of the sectional
load with axis_nod and axis_dir
additionally, when lifting_line_data or vortex_lattice_data are set to T the following quantities are
printed:
• Cl: two dimensional lift coefficient of the section, as retrieved from the lookup tables
• Cd: two dimensional drag coefficient of the section, as retrieved from the lookup tables
• Cm: two dimensional moment coefficient of the section, as retrieved from the lookup tables
• vel_2d: magnitude of the projection of the relative velocity (as the sum of the free stream velocity,
the opposite of the body velocity and the influence of all the singularities, vrel = v∞ − vb + vind =
vrel,f ree + vind ) in the plane identified by the normal and tangential unit vectors n̂, t̂, as represented in
figure 6.1, v2d = |vrel · b̂|.
• up_x: x-component of vel_2d
• up_y: y-component of vel_2d
Chordwise loads allow to obtain the distribution of the forces, pressure and the geometrical quantities along
the chord at a specific spanwise section of a parametric component.
Warning: at the moment, the chordwise load card is implemented only for parametric components.
An example analysis group for chordwise loads on parametric components:
Chapter 6: DUST Post-processor 84
analysis = {
type = chordwise_loads
name = cl01
start_res = 1
end_res = 100
step_res = 1
format = dat
average = F
component = wing
n_station = 2
span_station = (/1., 1.5/)
axis_nod = (/ 0.0, 0.0, 0.0 /)
axis_dir = (/ 0.0, 0.1, 0.0 /)
The output file containing chordwise loads in .dat format has the following structure. The first line is a header
specifying the structural component. As an example,
1: # Chordwise load of component: wing
The second line contains the spanwise location and the chord length evaluated at the first requested time step
start_res.
2: # spanwise_location: 1.00; chord_length: 0.40
The third line contains the number of chordwise section n_chord in which the structural component is divided
and the number of time steps n_time of the analysis. As an example, the output file for a 10-section blade
reads
3: # n_sec : 10 ; n_time : 100. Next lines: x_chord , z_chord
The third line also introduce the content of lines 4 and 5. Line 4 contains the chordwise coordinate x_chord
of the centre of the panels, line 4 contains the thickness dimension z_chord of the profile, taken at start_res.
As an example, if the the chord length is 0.4 and it is divided in 10 uniform sections with chord 0.05, the
output file reads
3: 0.130E+000 0.900E-001 0.500E-001 ...
4: -0.257E-002 -0.711E-002 -0.103E-001 ...
The fifth line is another header file containing the fields and their dimension collected in the next n_time
lines.
Chapter 6: DUST Post-processor 86
6: # t, n_chord
The first field is the time. The chordwise loads of the n_chord sections follow.
The files generated by sectional loads contain, as sectional quantity:
• Pres: Panel pressure for 3D panels, or delta pressure for vortex lattice or lifting line.
• Cp: Panel pressure coefficient for 3D panels, or delta pressure coefficient for vortex lattice or lifting line.
The implemented formulation is
P − P∞
Cp = (6.2)
1 2
ρ∞ U∞
2
Where P∞ is equal to P_inf, ρ∞ is equal to rho_inf and and U∞ is equal to the norm of u_inf or
u_ref if u_inf is zero.
• dFx: Panel force per unit length in chordwise direction
• dFz: Panel force per unit length in flapwise direction
• dNx: Panel local normal in chordwise direction
• dNz: Panel local normal in flapwise direction
• dTx: Panel local tangent in chordwise direction
• dTz: Panel local tangent in flapwise direction
• x_cen: Panel center chordwise coordinate
• z_cen: Panel center flapwise coordinate
6.9 Aeroacoustics
The aeroacoustics postprocessing is a specific analysis used to extract from results all the various data required
to perform an aeroacoustics analysis (with an external software) on the analyzed results. It is available only
in .dat ascii format and it is intended rather than to be directly plotted/visualized to act as input for another
software.
analysis = {
type = aeroacoustics
name = aer01
start_res = 1
end_res = 100
step_res = 1
format = dat
component = wing
component = tail
}
Chapter 6: DUST Post-processor 87
The output file containing aeroacustics data in .dat format has the following structure. The first line is a
header specifying the analysis.
1: # Aeroacoustic Data
The second and third lines contain the current simulation time and parameters; Element indicates the total
number of elements considered, that is the number of the following lines.
2: # Time, free stream: Element, Pressure, density, sound speed,
dynamic viscosity, flow velocity
3: 10 0.000000000000000E+000 ... -0.280000000000000E+002
The fourth line is a header file containing the fields collected in the next lines.
4: # cx, cy, cz, nx, ny, nz, area, rho, pressure, rhoux, rhouy, rhouz, svx, svy, svz
• svx, svy and svz represents the velocity of the centers of each element.