|
380 | 380 | "cell_type": "markdown",
|
381 | 381 | "id": "25f9c86c",
|
382 | 382 | "metadata": {},
|
| 383 | + "source": [ |
| 384 | + "### Peak shaving model\n", |
| 385 | + "\n", |
| 386 | + "User-level name: `\"peak-shaving\"`\n", |
| 387 | + "\n", |
| 388 | + "Underlying class: `PeakShavingTurbine`\n", |
| 389 | + "\n", |
| 390 | + "Required data on `power_thrust_table`:\n", |
| 391 | + "- `ref_air_density` (scalar)\n", |
| 392 | + "- `ref_tilt` (scalar)\n", |
| 393 | + "- `wind_speed` (list)\n", |
| 394 | + "- `power` (list)\n", |
| 395 | + "- `thrust_coefficient` (list)\n", |
| 396 | + "- `peak_shaving_fraction` (scalar)\n", |
| 397 | + "- `peak_shaving_TI_threshold` (scalar)\n", |
| 398 | + "\n", |
| 399 | + "The `\"peak-shaving\"` operation model allows users to implement peak shaving, where the thrust\n", |
| 400 | + "of the wind turbine is reduced from the nominal curve near rated to reduce unwanted structural\n", |
| 401 | + "loading. Peak shaving here is implemented here by reducing the thrust by a fixed fraction from\n", |
| 402 | + "the peak thrust on the nominal thrust curve, as specified by `peak_shaving_fraction`.This only\n", |
| 403 | + "affects wind speeds near the peak in the thrust\n", |
| 404 | + "curve (usually near rated wind speed), as thrust values away from the peak will be below the\n", |
| 405 | + "fraction regardless. Further, peak shaving is only applied if the turbulence intensity experienced\n", |
| 406 | + "by the turbine meets the `peak_shaving_TI_threshold`. To apply peak shaving in all wind conditions,\n", |
| 407 | + "`peak_shaving_TI_threshold` may be set to zero.\n", |
| 408 | + "\n", |
| 409 | + "When the turbine is peak shaving to reduce thrust, the power output is updated accordingly. Letting\n", |
| 410 | + "$C_{T}$ represent the thrust coefficient when peak shaving (at given wind speed), and $C_{T}'$\n", |
| 411 | + "represent the thrust coefficient that the turbine would be operating at under nominal control, then\n", |
| 412 | + "the power $P$ due to peak shaving (compared to the power $P'$ available under nominal control) is \n", |
| 413 | + "computed (based on actuator disk theory) as\n", |
| 414 | + "\n", |
| 415 | + "$$ P = \\frac{C_T (1 - a)}{C_T' (1 - a')} P'$$\n", |
| 416 | + "\n", |
| 417 | + "where $a$ (respectively, $a'$) is the axial induction factor corresponding to $C_T$\n", |
| 418 | + "(respectively, $C_T'$), computed using the usual relationship from actuator disk theory,\n", |
| 419 | + "i.e. the lesser solution to $C_T=4a(1-a)$.\n" |
| 420 | + ] |
| 421 | + }, |
| 422 | + { |
| 423 | + "cell_type": "code", |
| 424 | + "execution_count": null, |
| 425 | + "id": "1eff05f3", |
| 426 | + "metadata": {}, |
| 427 | + "outputs": [], |
| 428 | + "source": [ |
| 429 | + "# Set up the FlorisModel\n", |
| 430 | + "fmodel = FlorisModel(\"../examples/inputs/gch.yaml\")\n", |
| 431 | + "fmodel.set(\n", |
| 432 | + " layout_x=[0.0], layout_y=[0.0],\n", |
| 433 | + " wind_data=TimeSeries(\n", |
| 434 | + " wind_speeds=wind_speeds,\n", |
| 435 | + " wind_directions=np.ones(100) * 270.0,\n", |
| 436 | + " turbulence_intensities=0.2 # Higher than threshold value of 0.1\n", |
| 437 | + " )\n", |
| 438 | + ")\n", |
| 439 | + "fmodel.reset_operation()\n", |
| 440 | + "fmodel.set_operation_model(\"simple\")\n", |
| 441 | + "fmodel.run()\n", |
| 442 | + "powers_base = fmodel.get_turbine_powers()/1000\n", |
| 443 | + "thrust_coefficients_base = fmodel.get_turbine_thrust_coefficients()\n", |
| 444 | + "fmodel.set_operation_model(\"peak-shaving\")\n", |
| 445 | + "fmodel.run()\n", |
| 446 | + "powers_peak_shaving = fmodel.get_turbine_powers()/1000\n", |
| 447 | + "thrust_coefficients_peak_shaving = fmodel.get_turbine_thrust_coefficients()\n", |
| 448 | + "\n", |
| 449 | + "fig, ax = plt.subplots(2,1,sharex=True)\n", |
| 450 | + "ax[0].plot(wind_speeds, thrust_coefficients_base, label=\"Without peak shaving\", color=\"black\")\n", |
| 451 | + "ax[0].plot(wind_speeds, thrust_coefficients_peak_shaving, label=\"With peak shaving\", color=\"C0\")\n", |
| 452 | + "ax[1].plot(wind_speeds, powers_base, label=\"Without peak shaving\", color=\"black\")\n", |
| 453 | + "ax[1].plot(wind_speeds, powers_peak_shaving, label=\"With peak shaving\", color=\"C0\")\n", |
| 454 | + "\n", |
| 455 | + "ax[1].grid()\n", |
| 456 | + "ax[0].grid()\n", |
| 457 | + "ax[0].legend()\n", |
| 458 | + "ax[0].set_ylabel(\"Thrust coefficient [-]\")\n", |
| 459 | + "ax[1].set_xlabel(\"Wind speed [m/s]\")\n", |
| 460 | + "ax[1].set_ylabel(\"Power [kW]\")" |
| 461 | + ] |
| 462 | + }, |
| 463 | + { |
| 464 | + "cell_type": "code", |
| 465 | + "execution_count": null, |
| 466 | + "id": "92912bf7", |
| 467 | + "metadata": {}, |
| 468 | + "outputs": [], |
383 | 469 | "source": []
|
384 | 470 | }
|
385 | 471 | ],
|
|
0 commit comments