Left: Photo by Paul Gipe. All rights reserved. Upper right: Courtesy of Vestas Wind Systems A/S. Lower right: From Murray and Barone (2011).
Closely spaced VAWTs may achieve higher power output per unit land area compared to HAWTs. Note the rotors shown here are also high solidity.
From flowe.caltech.edu.
Assume kinematics and dynamics act on blade section at one point.
import warnings
warnings.filterwarnings("ignore")
os.chdir(os.path.join(os.path.expanduser("~"), "Google Drive", "Research", "CFT-vectors"))
import cft_vectors
fig, ax = plt.subplots(figsize=(15, 15))
fontsize = plt.rcParams["font.size"]
with plt.rc_context({"font.size": 1.5*fontsize}):
cft_vectors.plot_diagram(fig, ax, theta_deg=52, axis="off", label=True)
os.chdir(talk_dir)
Reduced frequency:
k=ωc2U∞=λc2Rλ=ωRU∞Unsteady effects significant for k>0.05, dominant for k≥0.2 [1].
Rotor | c/R | λ | k |
---|---|---|---|
Sandia 34 m Darrieus | 0.05 | 6 | 0.16 |
Hypothetical MHK | 0.25 | 2 | 0.25 |
MHK rotor blades see approximately one order of magnitude higher torque vs. wind.
[1] Leishman (2006) "Principles of Helicopter Aerodynamics", Cambridge.
Bachant, P., and Wosnik, M. (2015) "Characterising the near-wake of a cross-flow turbine", Journal of Turbulence, 16, 392–410.
Bachant, P., and Wosnik, M. (2014) "UNH-RVAT baseline performance and near-wake measurements: Reduced dataset and processing code", Figshare, DOI: 10.6084/m9.figshare.1080781.
# Generate figures from the experiments by their own methods
os.chdir("C:/Users/Pete/Research/Experiments/RVAT baseline")
import pyrvatbl.plotting as rvat_baseline
fig, (ax1, ax2) = plt.subplots(figsize=(15, 6), nrows=1, ncols=2)
rvat_baseline.plot_cp(ax1)
rvat_baseline.plot_cd(ax2, color=sns.color_palette()[2])
fig.tight_layout()
os.chdir(talk_dir)
Note: Overall rotor drag (sometimes called thrust) coefficient CD is different from blade element drag coefficient Cd.
Unique mean "doublet" flow created by blade tip vortices inducing vertical velocity towards x–y center plane.
Rearrange RANS to isolate streamwise partial derivative:
∂U∂x=1U[−V∂U∂y−W∂U∂z−1ρ∂P∂x−∂∂x¯u′u′−∂∂y¯u′v′−∂∂z¯u′w′+ν(∂2U∂x2+∂2U∂y2+∂2U∂z2)]Weighted averages at x/D=1:
os.chdir("C:/Users/Pete/Research/Experiments/RVAT baseline")
import pyrvatbl.plotting as rvat_baseline
rvat_baseline.plotwake("mombargraph", scale=1.8, barcolor=None)
plt.grid(True)
Mean advection in AFT wake due to axisymmetric swirl would cancel itself out.
Are our results relevant to full scale?
Rel=UlνHow inexpensive (small, slow) can experiments get?
Bachant, P., and Wosnik, M. (2016) "Effects of Reynolds Number on the Energy Conversion and Near-Wake Dynamics of a High Solidity Vertical-Axis Cross-Flow Turbine", Energies, 9.
Bachant, P., and Wosnik, M. (2016) "UNH-RVAT Reynolds number dependence experiment: Reduced dataset and processing code", Figshare, DOI: 10.6084/m9.figshare.1286960.
os.chdir(rvat_re_dep_dir)
import pyrvatrd.plotting as rvat_re_dep
fig, (ax1, ax2) = plt.subplots(figsize=(16, 6.5), nrows=1, ncols=2)
rvat_re_dep.plot_perf_curves(ax1, ax2)
fig.tight_layout()
os.chdir(talk_dir)
Note effects of stall delay at lower λ, where angle of attack amplitude is greater.
os.chdir(rvat_re_dep_dir)
import pyrvatrd.plotting as rvat_re_dep
fontsize = plt.rcParams["font.size"]
with plt.rc_context({"axes.formatter.use_mathtext": True, "font.size": fontsize*1.65/1.5}):
fig, (ax1, ax2) = plt.subplots(figsize=(14, 6), nrows=1, ncols=2)
rvat_re_dep.plot_perf_re_dep(ax1, ax2, errorbars=True, label_subplots=False)
fig.tight_layout()
os.chdir(talk_dir)
Threshold corresponds to blade boundary layer transition to turbulence, which delays separation to higher angles of attack.
Fr=U∞√ghtip=0.1 to 0.5os.chdir(rvat_re_dep_dir)
import pyrvatrd.plotting as rvat_re_dep
fig, ax = plt.subplots()
with plt.rc_context({"axes.formatter.use_mathtext": True}):
rvat_re_dep.plot_wake_trans_totals(ax)
fig.tight_layout()
Similar threshold Re as for CP → Low Re physical model array studies may overpredict power of downstream turbines
DOE Reference Models: Open designs for standardized development and validation
Measured performance, Re-dependence, near-wake, strut drag, with 1:6 scale tapered-H rotor: NACA 0021 profiles, c/R=0.07–0.12
Unique geometry for testing predictive robustness
Bachant, P., Gunawan, B., Wosnik, M., and Neary, V.S. (2016) "UNH RM2 tow tank experiment: Reduced dataset and processing code", Figshare, DOI: 10.6084/m9.figshare.1373899.
Spalart–Allmaras model showed more well-behaved grid convergence. Relative minimum chosen for SST Δt. Nx=70 chosen for both models.
Inflow velocity from Navier–Stokes solver rather than via simple momentum, potential flow (vortex method).
Fl=12ρApCl|Urel|2Fd=12ρApCd|Urel|2import warnings
warnings.filterwarnings("ignore")
os.chdir(os.path.join(os.path.expanduser("~"), "Google Drive", "Research", "CFT-vectors"))
import cft_vectors
fig, ax = plt.subplots(figsize=(13, 13))
fontsize = plt.rcParams["font.size"]
with plt.rc_context({"font.size": 1.4*fontsize}):
cft_vectors.plot_diagram(fig, ax, theta_deg=52, axis="off", label=True)
os.chdir(talk_dir)
From Leishman and Beddoes (1989)
Leishman–Beddoes semi-empirical dynamic stall model based on lags to angle of attack, separation point, vortex lift, replicating "hysteresis loop."
AL force added to Navier–Stokes as body force source term:
∂→u∂t+→u⋅∇→u=−1ρ∇p+∇2→u+→fForce is smoothed outwards with a spherical Gaussian function:
Gaussian width mainly determined by local mesh size: ≈2Δx (Troldborg, 2008) ≈2×23√Vcell
OpenFOAM extension library using fvOptions
generic mechanism for adding sources at run time:
// Solve the Momentum equation
tmp<fvVectorMatrix> UEqn
(
fvm::ddt(U)
+ fvm::div(phi, U)
+ turbulence->divDevReff(U)
==
fvOptions(U)
);
Leverage existing solvers, parallelization, turbulence models. No wheel reinvention.
Developed openly on GitHub: https://github.com/turbinesFoam/turbinesFoam
Similar domain and BCs as 3-D blade-resolved case
∼104 lower computational effort with 3-D RANS compared to blade-resolved → Easily run on laptop
Common streamwise force parameterization based on CD
Small negative advection in all directions, very low turbulence, positive pressure gradient effect → ALM generates better IBCs for wake evolution
Default Smagorinsky sub-grid scale model
Computational expense up by ∼102, still ∼102 lower than BR RANS
Developed new open-source ALM library for OpenFOAM
import pandas as pd
data = pd.Series()
data["ALM (3-D LES)"] = 10.0
data["ALM (3-D RANS)"] = 0.1
data["BR CFD (3-D)"] = 10**3
data["BR CFD (2-D)"] = 0.1
with sns.plotting_context(font_scale=3) \
and plt.rc_context({"axes.formatter.limits": (-1, 1),
"axes.formatter.use_mathtext": True}):
fig, ax = plt.subplots(figsize=(11, 2.5))
data.plot(ax=ax, kind="barh", logy=False, rot=0)
ax.set_xlabel("CPU hours per simulated second (approx.)")
plt.show()