Actuator Disc Model (ADM) turbine forcing (iturbine = 2).
Each turbine is a disc that applies a thrust force computed from a thrust coefficient and the disc-averaged inflow velocity. The force is regularised and projected onto the Eulerian grid with a per-disc kernel , built once at init and normalised to sum to one. This operation is also commonly called force spreading or smearing.
The kernels of all discs share two fields, so device memory does not grow
with the number of discs: gamma holds the kernel values and disc_id
labels each grid point with the disc whose kernel is largest there (zero
where every kernel vanishes). Kernels of separate discs must therefore
not overlap; init stops if a significant part of any kernel lies where
another disc's kernel is larger. The disc-averaged velocities of all
discs come from one labelled weighted sum and one MPI reduction, and the
projected forces of all discs are added to the momentum RHS in one
labelled axpy.
For yaw angle and tilt angle , the rotor-normal vector used by the model is For a grid point and disc centre , the normal and radial distances are The unnormalised anisotropic regularisation kernel is Gaussian in the disc-normal direction and eighth-order super-Gaussian in the radial direction: where The discrete kernel is normalised globally over all MPI ranks: Consequently, the instantaneous disc-normal velocity is the weighted global average an optional first-order low-pass filter is applied: On the first update, or when , . The local thrust coefficient, thrust, and power are Finally, the acceleration added to the momentum right-hand side at grid point is
| Type | Visibility | Attributes | Name | Initial | |||
|---|---|---|---|---|---|---|---|
| real(kind=dp), | public | :: | coords(3) |
disc centre |
|||
| real(kind=dp), | public | :: | yaw |
rotor yaw/tilt angles [rad] |
|||
| real(kind=dp), | public | :: | tilt |
rotor yaw/tilt angles [rad] |
|||
| real(kind=dp), | public | :: | D |
diameter and swept area |
|||
| real(kind=dp), | public | :: | area |
diameter and swept area |
|||
| real(kind=dp), | public | :: | thick |
kernel thickness h along rot_N |
|||
| real(kind=dp), | public | :: | C_T |
thrust and induction coefficients |
|||
| real(kind=dp), | public | :: | alpha |
thrust and induction coefficients |
|||
| real(kind=dp), | public | :: | rot_N(3) |
unit rotor-axis vector |
|||
| real(kind=dp), | public | :: | U_disc | = | 0._dp |
instantaneous disc-averaged speed |
|
| real(kind=dp), | public | :: | U_disc_filt | = | 0._dp |
filtered disc-averaged speed |
|
| real(kind=dp), | public | :: | thrust | = | 0._dp |
instantaneous thrust |
|
| real(kind=dp), | public | :: | power | = | 0._dp |
instantaneous power |
|
| real(kind=dp), | public | :: | U_disc_mean | = | 0._dp | ||
| real(kind=dp), | public | :: | thrust_mean | = | 0._dp | ||
| real(kind=dp), | public | :: | power_mean | = | 0._dp |
| Type | Visibility | Attributes | Name | Initial | |||
|---|---|---|---|---|---|---|---|
| integer, | public | :: | n_turb | = | 0 | ||
| real(kind=dp), | public | :: | rho_air | = | 1._dp | ||
| real(kind=dp), | public | :: | T_relax | = | -1._dp | ||
| real(kind=dp), | public | :: | cell_vol | ||||
| real(kind=dp), | public | :: | dt | ||||
| real(kind=dp), | public | :: | last_update_time | = | -huge(1._dp) | ||
| integer, | public | :: | current_iter | = | 0 | ||
| integer, | public | :: | stats_start | = | 1 | ||
| integer, | public | :: | stats_freq | = | 1 | ||
| integer, | public | :: | sample_count | = | 0 | ||
| logical, | public | :: | filter_initialized | = | .false. | ||
| logical, | public | :: | recompute_forces | = | .true. | ||
| character(len=256), | public | :: | coords_file | = | '' | ||
| type(actuator_disc_t), | public, | allocatable | :: | disc(:) | |||
| class(field_t), | public, | pointer | :: | gamma | => | null() |
smearing kernels (DIR_X) |
| class(field_t), | public, | pointer | :: | disc_id | => | null() |
disc label (DIR_X) |
| type(scalar_series_t), | public, | allocatable | :: | output(:) | |||
| class(base_backend_t), | public, | pointer | :: | backend | => | null() | |
| type(mesh_t), | public, | pointer | :: | mesh | => | null() | |
| type(allocator_t), | public, | pointer | :: | host_allocator | => | null() |
| procedure, public :: init => init_adm | |
| procedure, public :: update => update_adm | |
| procedure, public :: project_forces => project_forces_adm | |
| procedure, public :: write_output => write_output_adm | |
| procedure, public :: setup_output => setup_output_adm | |
| procedure, public :: write_checkpoint => write_checkpoint_adm | |
| procedure, public :: read_checkpoint => read_checkpoint_adm | |
| procedure, public :: finalise => finalise_adm |
Unnormalised smearing kernel of disc at coords: Gaussian in the
rotor-normal direction (delta_N), super-Gaussian (^8) in the radial
direction (delta_R) to give a flat-topped disc.
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| type(actuator_disc_t), | intent(in) | :: | disc | |||
| real(kind=dp), | intent(in) | :: | coords(3) |
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| class(adm_t), | intent(inout) | :: | self | |||
| class(base_backend_t), | intent(in), | target | :: | backend | ||
| type(mesh_t), | intent(in), | target | :: | mesh | ||
| type(allocator_t), | intent(in), | target | :: | host_allocator | ||
| real(kind=dp), | intent(in) | :: | dt |
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| class(adm_t), | intent(inout) | :: | self | |||
| real(kind=dp), | intent(in) | :: | t | |||
| real(kind=dp), | intent(in) | :: | dt |
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| class(adm_t), | intent(inout) | :: | self | |||
| integer, | intent(in) | :: | iter | |||
| logical, | intent(in) | :: | is_root |
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| class(adm_t), | intent(inout) | :: | self | |||
| logical, | intent(in) | :: | is_root | |||
| logical, | intent(in) | :: | append |
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| class(adm_t), | intent(inout) | :: | self | |||
| type(writer_session_t), | intent(inout) | :: | writer |
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| class(adm_t), | intent(inout) | :: | self | |||
| type(reader_session_t), | intent(inout) | :: | reader |
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| class(adm_t), | intent(inout) | :: | self |
Read turbine disc parameters from a .ad file. Format: one header line
followed by one row per disc of
CoR(x) CoR(y) CoR(z) Yaw[deg] Tilt[deg] RotorDiam C_T alpha
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| character(len=*), | intent(in) | :: | filename | |||
| real(kind=dp), | intent(out), | allocatable | :: | disc_params(:,:) |